29 #define UTARRAY_VERSION 1.9.9
32 #define _UNUSED_ __attribute__ ((__unused__))
41 #define oom() exit(-1)
43 typedef void (
ctor_f)(
void *dst,
const void *src);
59 #define utarray_init(a,_icd) do { \
60 memset(a,0,sizeof(UT_array)); \
64 #define utarray_done(a) do { \
66 if ((a)->icd.dtor) { \
68 for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \
69 (a)->icd.dtor(utarray_eltptr(a,_ut_i)); \
77 #define utarray_new(a,_icd) do { \
78 a=(UT_array*)malloc(sizeof(UT_array)); \
79 utarray_init(a,_icd); \
82 #define utarray_free(a) do { \
87 #define utarray_reserve(a,by) do { \
88 if (((a)->i+by) > ((a)->n)) { \
89 while(((a)->i+by) > ((a)->n)) { (a)->n = ((a)->n ? (2*(a)->n) : 8); } \
90 if ( ((a)->d=(char*)realloc((a)->d, (a)->n*(a)->icd.sz)) == NULL) oom(); \
94 #define utarray_push_back(a,p) do { \
95 utarray_reserve(a,1); \
96 if ((a)->icd.copy) { (a)->icd.copy( _utarray_eltptr(a,(a)->i++), p); } \
97 else { memcpy(_utarray_eltptr(a,(a)->i++), p, (a)->icd.sz); }; \
100 #define utarray_pop_back(a) do { \
101 if ((a)->icd.dtor) { (a)->icd.dtor( _utarray_eltptr(a,--((a)->i))); } \
105 #define utarray_extend_back(a) do { \
106 utarray_reserve(a,1); \
107 if ((a)->icd.init) { (a)->icd.init(_utarray_eltptr(a,(a)->i)); } \
108 else { memset(_utarray_eltptr(a,(a)->i),0,(a)->icd.sz); } \
112 #define utarray_len(a) ((a)->i)
114 #define utarray_eltptr(a,j) (((j) < (a)->i) ? _utarray_eltptr(a,j) : NULL)
115 #define _utarray_eltptr(a,j) ((char*)((a)->d + ((a)->icd.sz*(j) )))
117 #define utarray_insert(a,p,j) do { \
118 if (j > (a)->i) utarray_resize(a,j); \
119 utarray_reserve(a,1); \
120 if ((j) < (a)->i) { \
121 memmove( _utarray_eltptr(a,(j)+1), _utarray_eltptr(a,j), \
122 ((a)->i - (j))*((a)->icd.sz)); \
124 if ((a)->icd.copy) { (a)->icd.copy( _utarray_eltptr(a,j), p); } \
125 else { memcpy(_utarray_eltptr(a,j), p, (a)->icd.sz); }; \
129 #define utarray_inserta(a,w,j) do { \
130 if (utarray_len(w) == 0) break; \
131 if (j > (a)->i) utarray_resize(a,j); \
132 utarray_reserve(a,utarray_len(w)); \
133 if ((j) < (a)->i) { \
134 memmove(_utarray_eltptr(a,(j)+utarray_len(w)), \
135 _utarray_eltptr(a,j), \
136 ((a)->i - (j))*((a)->icd.sz)); \
138 if ((a)->icd.copy) { \
140 for(_ut_i=0;_ut_i<(w)->i;_ut_i++) { \
141 (a)->icd.copy(_utarray_eltptr(a,j+_ut_i), _utarray_eltptr(w,_ut_i)); \
144 memcpy(_utarray_eltptr(a,j), _utarray_eltptr(w,0), \
145 utarray_len(w)*((a)->icd.sz)); \
147 (a)->i += utarray_len(w); \
150 #define utarray_resize(dst,num) do { \
152 if (dst->i > (size_t)(num)) { \
153 if ((dst)->icd.dtor) { \
154 for(_ut_i=num; _ut_i < dst->i; _ut_i++) { \
155 (dst)->icd.dtor(utarray_eltptr(dst,_ut_i)); \
158 } else if (dst->i < (size_t)(num)) { \
159 utarray_reserve(dst,num-dst->i); \
160 if ((dst)->icd.init) { \
161 for(_ut_i=dst->i; _ut_i < num; _ut_i++) { \
162 (dst)->icd.init(utarray_eltptr(dst,_ut_i)); \
165 memset(_utarray_eltptr(dst,dst->i),0,(dst)->icd.sz*(num-dst->i)); \
171 #define utarray_concat(dst,src) do { \
172 utarray_inserta((dst),(src),utarray_len(dst)); \
175 #define utarray_erase(a,pos,len) do { \
176 if ((a)->icd.dtor) { \
178 for(_ut_i=0; _ut_i < len; _ut_i++) { \
179 (a)->icd.dtor(utarray_eltptr((a),pos+_ut_i)); \
182 if ((a)->i > (pos+len)) { \
183 memmove( _utarray_eltptr((a),pos), _utarray_eltptr((a),pos+len), \
184 (((a)->i)-(pos+len))*((a)->icd.sz)); \
189 #define utarray_renew(a,u) do { \
190 if (a) utarray_clear(a); \
191 else utarray_new((a),(u)); \
194 #define utarray_clear(a) do { \
196 if ((a)->icd.dtor) { \
198 for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \
199 (a)->icd.dtor(utarray_eltptr(a,_ut_i)); \
206 #define utarray_sort(a,cmp) do { \
207 qsort((a)->d, (a)->i, (a)->icd.sz, cmp); \
210 #define utarray_find(a,v,cmp) bsearch((v),(a)->d,(a)->i,(a)->icd.sz,cmp)
212 #define utarray_front(a) (((a)->i) ? (_utarray_eltptr(a,0)) : NULL)
213 #define utarray_next(a,e) (((e)==NULL) ? utarray_front(a) : ((((a)->i) > (utarray_eltidx(a,e)+1)) ? _utarray_eltptr(a,utarray_eltidx(a,e)+1) : NULL))
214 #define utarray_prev(a,e) (((e)==NULL) ? utarray_back(a) : ((utarray_eltidx(a,e) > 0) ? _utarray_eltptr(a,utarray_eltidx(a,e)-1) : NULL))
215 #define utarray_back(a) (((a)->i) ? (_utarray_eltptr(a,(a)->i-1)) : NULL)
216 #define utarray_eltidx(a,e) (((char*)(e) >= (char*)((a)->d)) ? (((char*)(e) - (char*)((a)->d))/(size_t)(a)->icd.sz) : -1)
220 char **_src = (
char**)src, **_dst = (
char**)dst;
224 char **eltc = (
char**)elt;
225 if (*eltc) free(*eltc);
static void utarray_str_dtor(void *elt)
char * strdup(const char *str)
static const UT_icd ut_str_icd
void( ctor_f)(void *dst, const void *src)
static const UT_icd ut_int_icd
static void utarray_str_cpy(void *dst, const void *src)
static const UT_icd ut_ptr_icd