00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #define ARRAYINLINE
00031
00032 #include <types.h>
00033 #include <kern/errno.h>
00034 #include <lib.h>
00035 #include <array.h>
00036
00037 struct array *
00038 array_create(void)
00039 {
00040 struct array *a;
00041
00042 a = kmalloc(sizeof(*a));
00043 if (a != NULL) {
00044 array_init(a);
00045 }
00046 return a;
00047 }
00048
00049 void
00050 array_destroy(struct array *a)
00051 {
00052 array_cleanup(a);
00053 kfree(a);
00054 }
00055
00056 void
00057 array_init(struct array *a)
00058 {
00059 a->num = a->max = 0;
00060 a->v = NULL;
00061 }
00062
00063 void
00064 array_cleanup(struct array *a)
00065 {
00066
00067
00068
00069
00070
00071 ARRAYASSERT(a->num == 0);
00072 kfree(a->v);
00073 #ifdef ARRAYS_CHECKED
00074 a->v = NULL;
00075 #endif
00076 }
00077
00078 int
00079 array_setsize(struct array *a, unsigned num)
00080 {
00081 void **newptr;
00082 unsigned newmax;
00083
00084 if (num > a->max) {
00085
00086 newmax = a->max;
00087 while (num > newmax) {
00088 newmax = newmax ? newmax*2 : 4;
00089 }
00090
00091
00092
00093
00094
00095
00096
00097
00098 newptr = kmalloc(newmax*sizeof(*a->v));
00099 if (newptr == NULL) {
00100 return ENOMEM;
00101 }
00102 memcpy(newptr, a->v, a->num*sizeof(*a->v));
00103 kfree(a->v);
00104 a->v = newptr;
00105 a->max = newmax;
00106 }
00107 a->num = num;
00108
00109 return 0;
00110 }
00111
00112 void
00113 array_remove(struct array *a, unsigned index)
00114 {
00115 unsigned num_to_move;
00116
00117 ARRAYASSERT(a->num <= a->max);
00118 ARRAYASSERT(index < a->num);
00119
00120 num_to_move = a->num - (index + 1);
00121 memmove(a->v + index, a->v + index+1, num_to_move*sizeof(void *));
00122 a->num--;
00123 }