30 #define UTARRAY_VERSION 1.9.6 33 #define _UNUSED_ __attribute__ ((__unused__)) 43 #define oom() system_exit(-1) 45 typedef void (
ctor_f)(
void *dst,
const void *src);
61 #define utarray_init(a,_icd) do { \ 62 memset(a,0,sizeof(UT_array)); \ 66 #define utarray_done(a) do { \ 68 if ((a)->icd.dtor) { \ 70 for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \ 71 (a)->icd.dtor(utarray_eltptr(a,_ut_i)); \ 79 #define utarray_new(a,_icd) do { \ 80 a=(UT_array*)malloc(sizeof(UT_array)); \ 81 utarray_init(a,_icd); \ 84 #define utarray_free(a) do { \ 89 #define utarray_reserve(a,by) do { \ 90 if (((a)->i+by) > ((a)->n)) { \ 91 while(((a)->i+by) > ((a)->n)) { (a)->n = ((a)->n ? (2*(a)->n) : 8); } \ 92 if ( ((a)->d=(char*)realloc((a)->d, (a)->n*(a)->icd.sz)) == NULL) oom(); \ 96 #define utarray_push_back(a,p) do { \ 97 utarray_reserve(a,1); \ 98 if ((a)->icd.copy) { (a)->icd.copy( _utarray_eltptr(a,(a)->i++), p); } \ 99 else { memcpy(_utarray_eltptr(a,(a)->i++), p, (a)->icd.sz); }; \ 102 #define utarray_pop_back(a) do { \ 103 if ((a)->icd.dtor) { (a)->icd.dtor( _utarray_eltptr(a,--((a)->i))); } \ 107 #define utarray_extend_back(a) do { \ 108 utarray_reserve(a,1); \ 109 if ((a)->icd.init) { (a)->icd.init(_utarray_eltptr(a,(a)->i)); } \ 110 else { memset(_utarray_eltptr(a,(a)->i),0,(a)->icd.sz); } \ 114 #define utarray_len(a) ((a)->i) 116 #define utarray_eltptr(a,j) (((j) < (a)->i) ? _utarray_eltptr(a,j) : NULL) 117 #define _utarray_eltptr(a,j) ((char*)((a)->d + ((a)->icd.sz*(j) ))) 119 #define utarray_insert(a,p,j) do { \ 120 utarray_reserve(a,1); \ 121 if (j > (a)->i) break; \ 122 if ((j) < (a)->i) { \ 123 memmove( _utarray_eltptr(a,(j)+1), _utarray_eltptr(a,j), \ 124 ((a)->i - (j))*((a)->icd.sz)); \ 126 if ((a)->icd.copy) { (a)->icd.copy( _utarray_eltptr(a,j), p); } \ 127 else { memcpy(_utarray_eltptr(a,j), p, (a)->icd.sz); }; \ 131 #define utarray_inserta(a,w,j) do { \ 132 if (utarray_len(w) == 0) break; \ 133 if (j > (a)->i) break; \ 134 utarray_reserve(a,utarray_len(w)); \ 135 if ((j) < (a)->i) { \ 136 memmove(_utarray_eltptr(a,(j)+utarray_len(w)), \ 137 _utarray_eltptr(a,j), \ 138 ((a)->i - (j))*((a)->icd.sz)); \ 140 if ((a)->icd.copy) { \ 142 for(_ut_i=0;_ut_i<(w)->i;_ut_i++) { \ 143 (a)->icd.copy(_utarray_eltptr(a,j+_ut_i), _utarray_eltptr(w,_ut_i)); \ 146 memcpy(_utarray_eltptr(a,j), _utarray_eltptr(w,0), \ 147 utarray_len(w)*((a)->icd.sz)); \ 149 (a)->i += utarray_len(w); \ 152 #define utarray_resize(dst,num) do { \ 154 if (dst->i > (size_t)(num)) { \ 155 if ((dst)->icd.dtor) { \ 156 for(_ut_i=num; _ut_i < dst->i; _ut_i++) { \ 157 (dst)->icd.dtor(utarray_eltptr(dst,_ut_i)); \ 160 } else if (dst->i < (size_t)(num)) { \ 161 utarray_reserve(dst,num-dst->i); \ 162 if ((dst)->icd.init) { \ 163 for(_ut_i=dst->i; _ut_i < num; _ut_i++) { \ 164 (dst)->icd.init(utarray_eltptr(dst,_ut_i)); \ 167 memset(_utarray_eltptr(dst,dst->i),0,(dst)->icd.sz*(num-dst->i)); \ 173 #define utarray_concat(dst,src) do { \ 174 utarray_inserta((dst),(src),utarray_len(dst)); \ 177 #define utarray_erase(a,pos,len) do { \ 178 if ((a)->icd.dtor) { \ 180 for(_ut_i=0; _ut_i < len; _ut_i++) { \ 181 (a)->icd.dtor(utarray_eltptr((a),pos+_ut_i)); \ 184 if ((a)->i > (pos+len)) { \ 185 memmove( _utarray_eltptr((a),pos), _utarray_eltptr((a),pos+len), \ 186 (((a)->i)-(pos+len))*((a)->icd.sz)); \ 191 #define utarray_renew(a,u) do { \ 192 if (a) utarray_clear(a); \ 193 else utarray_new((a),(u)); \ 196 #define utarray_clear(a) do { \ 198 if ((a)->icd.dtor) { \ 200 for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \ 201 (a)->icd.dtor(utarray_eltptr(a,_ut_i)); \ 208 #define utarray_sort(a,cmp) do { \ 209 qsort((a)->d, (a)->i, (a)->icd.sz, cmp); \ 212 #define utarray_find(a,v,cmp) bsearch((v),(a)->d,(a)->i,(a)->icd.sz,cmp) 214 #define utarray_front(a) (((a)->i) ? (_utarray_eltptr(a,0)) : NULL) 215 #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)) 216 #define utarray_prev(a,e) (((e)==NULL) ? utarray_back(a) : ((utarray_eltidx(a,e) > 0) ? _utarray_eltptr(a,utarray_eltidx(a,e)-1) : NULL)) 217 #define utarray_back(a) (((a)->i) ? (_utarray_eltptr(a,(a)->i-1)) : NULL) 218 #define utarray_eltidx(a,e) (((char*)(e) >= (char*)((a)->d)) ? (((char*)(e) - (char*)((a)->d))/(a)->icd.sz) : -1) 222 char **_src = (
char**)src, **_dst = (
char**)dst;
223 *_dst = (*_src == NULL) ? NULL : strdup(*_src);
226 char **eltc = (
char**)elt;
227 if (*eltc) free(*eltc);
230 static const UT_icd ut_int_icd
_UNUSED_ = {
sizeof(int),NULL,NULL,NULL};
231 static const UT_icd ut_ptr_icd
_UNUSED_ = {
sizeof(
void*),NULL,NULL,NULL};
static void utarray_str_dtor(void *elt)
void() ctor_f(void *dst, const void *src)
static void utarray_str_cpy(void *dst, const void *src)