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 #ifndef _ARRAY_H_
00031 #define _ARRAY_H_
00032
00033 #ifdef UW
00034 #include <lib.h>
00035 #endif
00036
00037 #define ARRAYS_CHECKED
00038
00039 #ifdef ARRAYS_CHECKED
00040 #define ARRAYASSERT KASSERT
00041 #else
00042 #define ARRAYASSERT(x) ((void)(x))
00043 #endif
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 struct array {
00066 void **v;
00067 unsigned num, max;
00068 };
00069
00070 struct array *array_create(void);
00071 void array_destroy(struct array *);
00072 void array_init(struct array *);
00073 void array_cleanup(struct array *);
00074 unsigned array_num(const struct array *);
00075 void *array_get(const struct array *, unsigned index);
00076 void array_set(const struct array *, unsigned index, void *val);
00077 int array_setsize(struct array *, unsigned num);
00078 int array_add(struct array *, void *val, unsigned *index_ret);
00079 void array_remove(struct array *, unsigned index);
00080
00081
00082
00083
00084
00085 #ifndef ARRAYINLINE
00086 #define ARRAYINLINE INLINE
00087 #endif
00088
00089 ARRAYINLINE unsigned
00090 array_num(const struct array *a)
00091 {
00092 return a->num;
00093 }
00094
00095 ARRAYINLINE void *
00096 array_get(const struct array *a, unsigned index)
00097 {
00098 ARRAYASSERT(index < a->num);
00099 return a->v[index];
00100 }
00101
00102 ARRAYINLINE void
00103 array_set(const struct array *a, unsigned index, void *val)
00104 {
00105 ARRAYASSERT(index < a->num);
00106 a->v[index] = val;
00107 }
00108
00109 ARRAYINLINE int
00110 array_add(struct array *a, void *val, unsigned *index_ret)
00111 {
00112 unsigned index;
00113 int ret;
00114
00115 index = a->num;
00116 ret = array_setsize(a, index+1);
00117 if (ret) {
00118 return ret;
00119 }
00120 a->v[index] = val;
00121 if (index_ret != NULL) {
00122 *index_ret = index;
00123 }
00124 return 0;
00125 }
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 #define DECLARRAY_BYTYPE(ARRAY, T) \
00167 struct ARRAY { \
00168 struct array arr; \
00169 }; \
00170 \
00171 struct ARRAY *ARRAY##_create(void); \
00172 void ARRAY##_destroy(struct ARRAY *a); \
00173 void ARRAY##_init(struct ARRAY *a); \
00174 void ARRAY##_cleanup(struct ARRAY *a); \
00175 unsigned ARRAY##_num(const struct ARRAY *a); \
00176 T *ARRAY##_get(const struct ARRAY *a, unsigned index); \
00177 void ARRAY##_set(struct ARRAY *a, unsigned index, T *val); \
00178 int ARRAY##_setsize(struct ARRAY *a, unsigned num); \
00179 int ARRAY##_add(struct ARRAY *a, T *val, unsigned *index_ret); \
00180 void ARRAY##_remove(struct ARRAY *a, unsigned index)
00181
00182 #define DEFARRAY_BYTYPE(ARRAY, T, INLINE) \
00183 INLINE struct ARRAY * \
00184 ARRAY##_create(void) \
00185 { \
00186 struct ARRAY *a = kmalloc(sizeof(*a)); \
00187 if (a == NULL) { \
00188 return NULL; \
00189 } \
00190 array_init(&a->arr); \
00191 return a; \
00192 } \
00193 \
00194 INLINE void \
00195 ARRAY##_destroy(struct ARRAY *a) \
00196 { \
00197 array_cleanup(&a->arr); \
00198 kfree(a); \
00199 } \
00200 \
00201 INLINE void \
00202 ARRAY##_init(struct ARRAY *a) \
00203 { \
00204 array_init(&a->arr); \
00205 } \
00206 \
00207 INLINE void \
00208 ARRAY##_cleanup(struct ARRAY *a) \
00209 { \
00210 array_cleanup(&a->arr); \
00211 } \
00212 \
00213 INLINE unsigned \
00214 ARRAY##_num(const struct ARRAY *a) \
00215 { \
00216 return array_num(&a->arr); \
00217 } \
00218 \
00219 INLINE T * \
00220 ARRAY##_get(const struct ARRAY *a, unsigned index) \
00221 { \
00222 return (T *)array_get(&a->arr, index); \
00223 } \
00224 \
00225 INLINE void \
00226 ARRAY##_set(struct ARRAY *a, unsigned index, T *val) \
00227 { \
00228 array_set(&a->arr, index, (void *)val); \
00229 } \
00230 \
00231 INLINE int \
00232 ARRAY##_setsize(struct ARRAY *a, unsigned num) \
00233 { \
00234 return array_setsize(&a->arr, num); \
00235 } \
00236 \
00237 INLINE int \
00238 ARRAY##_add(struct ARRAY *a, T *val, unsigned *index_ret) \
00239 { \
00240 return array_add(&a->arr, (void *)val, index_ret); \
00241 } \
00242 \
00243 INLINE void \
00244 ARRAY##_remove(struct ARRAY *a, unsigned index) \
00245 { \
00246 return array_remove(&a->arr, index); \
00247 }
00248
00249 #define DECLARRAY(T) DECLARRAY_BYTYPE(T##array, struct T)
00250 #define DEFARRAY(T, INLINE) DEFARRAY_BYTYPE(T##array, struct T, INLINE)
00251
00252
00253
00254
00255
00256 DECLARRAY_BYTYPE(stringarray, char);
00257 DEFARRAY_BYTYPE(stringarray, char, ARRAYINLINE);
00258
00259
00260 #endif