# HG changeset patch # User David Demelier # Date 1317999538 -7200 # Node ID 2901c594eaeffd0e9c2a88a2086fa63be82224d5 # Parent c7c6e601b1540dc5a0a356df28ba3eea1266d18e And last commit applied to parray too diff -r c7c6e601b154 -r 2901c594eaef parray.c --- a/parray.c Fri Oct 07 16:47:55 2011 +0200 +++ b/parray.c Fri Oct 07 16:58:58 2011 +0200 @@ -27,7 +27,7 @@ static int parray_grow(struct parray *); struct parray * -parray_new(void *data, int bsize, int type) +parray_new(enum parray_type type, int length) { struct parray *arr; @@ -37,7 +37,7 @@ memset(arr, 0, sizeof (struct parray)); arr->type = type; - arr->bsize = (bsize == 0) ? PARRAY_DEFAULT_BSIZE : bsize; + arr->bsize = (length == 0) ? PARRAY_DEFAULT_BSIZE : length; arr->size = LENGTH(arr->bsize); if ((arr->datas = calloc(arr->bsize, sizeof (void *))) == NULL) { @@ -45,9 +45,6 @@ return NULL; } - if (data) - arr->datas[0] = data; - return arr; } diff -r c7c6e601b154 -r 2901c594eaef parray.h --- a/parray.h Fri Oct 07 16:47:55 2011 +0200 +++ b/parray.h Fri Oct 07 16:58:58 2011 +0200 @@ -21,53 +21,62 @@ #define PARRAY_DEFAULT_BSIZE 128 -#define PARRAY_FIXED 0x00 -#define PARRAY_AUTO 0x01 +enum parray_type { + PARRAY_FIXED = 0, + PARRAY_AUTO = 1 +}; struct parray { - void **datas; /* array of data */ - int length; /* number of element inside */ - int type; /* array's flags (default FIXED) */ - size_t size; /* current buffer size (allocated memory) */ - int bsize; /* block size (used when growing array) */ - - /* Private, do not modify */ - int _i; /* only for PARRAY_FOREACH(_R) */ + enum parray_type type; /* array type (default FIXED) */ + void **datas; /* array of data */ + int length; /* number of element inside */ + size_t size; /* current buffer size (allocated memory) */ + int bsize; /* block size (used when growing array) */ + int i; /* only for PARRAY_FOREACH(_R) */ }; -struct parray *parray_new(void *, int, int); -#define parray_new_auto() parray_new(NULL, 0, PARRAY_AUTO) -#define parray_new_fixed(max) parray_new(NULL, max, PARRAY_FIXED) +typedef void (*parray_map_fn)(void *, void *); +typedef int (*parray_cmp_fn)(void *, void *); -int parray_push(struct parray *, void *); -int parray_insert(struct parray *, void *, int); -int parray_append(struct parray *, void *); -void parray_pop(struct parray *); -void parray_unqueue(struct parray *); -void parray_remove(struct parray *, int); -void parray_unref(struct parray *, const void *); -int parray_iswap(struct parray *, int, int); -int parray_pswap(struct parray *, const void *, const void *); -void parray_map(const struct parray *, void (*fn)(void *, void *), void *); -void *parray_find(const struct parray *, int (*fn)(void *, void *), int *, void *); -void parray_clear(struct parray *); -void parray_free(struct parray *); +struct parray *parray_new(enum parray_type, int); +int parray_push(struct parray *, void *); +int parray_insert(struct parray *, void *, int); +int parray_append(struct parray *, void *); +void parray_pop(struct parray *); +void parray_unqueue(struct parray *); +void parray_remove(struct parray *, int); +void parray_unref(struct parray *, const void *); +int parray_iswap(struct parray *, int, int); +int parray_pswap(struct parray *, const void *, const void *); +void parray_map(const struct parray *, parray_map_fn, void *); +void *parray_find(const struct parray *, parray_cmp_fn, int *, void *); +void parray_clear(struct parray *); +void parray_free(struct parray *); #define PARRAY_HEAD(a) \ a->datas[0] #define PARRAY_TAIL(a) \ - a->datas[a->length - 1] + a->datas[(a->length == 0) ? 0 : a->length - 1] + +#if 0 #define PARRAY_INDEX(a, i) \ - a->datas[(i < 0 || a->length == 0) ? 0 : \ - (i >= a->length) ? a->length - 1 : i] + a->datas[(i < 0 || a->length == 0) ? 0 /* < 0 head */ \ + : (i >= a->length) ? a->length - 1 /* > l tail */ \ + : i] /* correct */ +#endif + +#define PARRAY_INDEX(a, i) \ + ((i < 0 || a->length == 0) ? PARRAY_HEAD(a) /* < 0 head */ \ + : (i >= a->length) ? PARRAY_TAIL(a) /* > l tail */ \ + : a->datas[i]) /* correct */ #define PARRAY_FOREACH_R(a, var) \ - for ((a)->_i = (a)->length - 1, var = PARRAY_INDEX((a), (a)->_i); \ - (a)->_i >= 0; --(a)->_i, var = PARRAY_INDEX((a), (a)->_i)) + for ((a)->i = (a)->length - 1, var = PARRAY_INDEX((a), (a)->i); \ + (a)->i >= 0; --(a)->i, var = PARRAY_INDEX((a), (a)->i)) #define PARRAY_FOREACH(a, var) \ - for ((a)->_i = 0, var = PARRAY_INDEX((a), (a)->_i); \ - (a)->_i < (a)->length; ++(a)->_i, var = PARRAY_INDEX((a), (a)->_i)) + for ((a)->i = 0, var = PARRAY_INDEX((a), (a)->i); \ + (a)->i < (a)->length; ++(a)->i, var = PARRAY_INDEX((a), (a)->i)) #define PARRAY_FLUSH(a) \ do { \