# HG changeset patch # User David Demelier # Date 1315419160 -7200 # Node ID 127254037b30f4f20ff83b7cdb63d18b923dcc31 # Parent e8829146ebc7ca889c5c2427bc189ccdd4ffb08e Switch to a void * array instead of void ** diff -r e8829146ebc7 -r 127254037b30 array.c --- a/array.c Wed Sep 07 07:33:25 2011 +0200 +++ b/array.c Wed Sep 07 20:12:40 2011 +0200 @@ -11,7 +11,7 @@ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * WHSIZESOEVER RESULTING FROM LOSS OF USE, DSIZEA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ @@ -22,30 +22,31 @@ #include "array.h" -#define SIZE(x) (sizeof (void *) * (x)) +#define SIZE(x) (arr->unit * (x)) static int array_grow(struct array *); struct array * -array_new(const void *data, size_t bsize, int flags) +array_new(const void *data, size_t unit, size_t bsize, int flags) { struct array *arr; - if (!(arr = malloc(sizeof (struct array)))) + if (unit == 0 || !(arr = malloc(sizeof (struct array)))) return NULL; - memset(arr, 0, sizeof (struct array)); arr->bsize = (bsize == 0) ? ARRAY_DEFAULT_BSIZE : bsize; - arr->size = bsize + 1; arr->flags = flags; + arr->unit = unit; + arr->size = SIZE(bsize); + arr->length = 0; - if (!(arr->data = calloc(bsize + 1, sizeof (void *)))) { + if (!(arr->data = malloc(arr->size))) { free(arr); return NULL; } if (data) - arr->data[arr->length++] = (void *) data; + memcpy(&arr->data[0], data, arr->unit); return arr; } @@ -63,8 +64,8 @@ if (array_grow(arr) < 0) return -1; - memmove(arr->data + 1, arr->data, SIZE(arr->length++)); - arr->data[0] = (void *) data; + memmove(&arr->data[SIZE(1)], arr->data, SIZE(arr->length++)); + memcpy(&arr->data[0], data, arr->unit); return 0; } @@ -81,9 +82,9 @@ if (index > arr->length - 1 || index < 0 || array_grow(arr) < 0) return -1; - memmove(arr->data + index + 1, arr->data + index, + memmove(&arr->data[SIZE(index + 1)], &arr->data[SIZE(index)], SIZE(arr->length++ - index)); - arr->data[index] = (void *) data; + memcpy(&arr->data[SIZE(index)], data, arr->unit); return 0; } @@ -98,7 +99,7 @@ if (array_grow(arr) < 0) return -1; - arr->data[arr->length++] = (void *) data; + memcpy(&arr->data[SIZE(arr->length++)], data, arr->unit); return 0; } @@ -116,9 +117,9 @@ if (arr->length == 0) return NULL; - data = arr->data[0]; - memmove(arr->data, arr->data + 1, SIZE(arr->length)); - arr->data[--arr->length] = NULL; + data = &arr->data[0]; + memmove(&arr->data[0], &arr->data[SIZE(1)], SIZE(arr->length)); + memset(&arr->data[SIZE(--arr->length)], 0, arr->unit); return data; } @@ -136,8 +137,8 @@ if (arr->length == 0) return NULL; - data = arr->data[--arr->length]; - arr->data[arr->length] = NULL; + data = &arr->data[SIZE(--arr->length)]; + memset(&arr->data[SIZE(arr->length)], 0, arr->unit); return data; } @@ -155,10 +156,10 @@ if (arr->length == 0 || index < 0 || index > arr->length - 1) return NULL; - data = arr->data[index]; - memmove(arr->data + index, arr->data + index + 1, + data = &arr->data[index]; + memmove(&arr->data[index], &arr->data[index + 1], SIZE(arr->length - index)); - arr->data[--arr->length] = NULL; + memset(&arr->data[SIZE(--arr->length)], 0, arr->unit); return data; } @@ -171,10 +172,10 @@ void array_map(struct array *arr, void (*fn)(void *, void *), void *udata) { - size_t i; + int i; - for (i = 0; arr->data[i]; ++i) - fn(arr->data[i], udata); + for (i = 0; i < arr->length; ++i) + fn(&arr->data[i], udata); } /* @@ -187,15 +188,14 @@ void * array_find(struct array *arr, int (*fn)(void *, void *), void *udata, int *idx) { - size_t i; - int st; + int st, i; void *data; - for (i = st = 0; arr->data[i] && !st; ++i) - st = fn(arr->data[i], udata); + for (i = st = 0; i < arr->length && !st; ++i) + st = fn(&arr->data[i], udata); if (st) { - data = arr->data[--i]; + data = &arr->data[--i]; if (idx) *idx = i; } else @@ -210,16 +210,9 @@ */ void -array_clear(struct array *arr, int trashit) +array_clear(struct array *arr) { - if (trashit) { - size_t i; - - for (i = 0; arr->data[i]; ++i) - free(arr->data[i]); - } - - memset(arr->data, 0, SIZE(arr->size)); + memset(arr->data, 0, arr->size); arr->length = 0; } @@ -228,9 +221,9 @@ */ void -array_free(struct array *arr, int trashit) +array_free(struct array *arr) { - array_clear(arr, trashit); + array_clear(arr); free(arr->data); free(arr); @@ -245,18 +238,17 @@ static int array_grow(struct array *arr) { - if (arr->size - 1 > arr->length) + if (arr->size / arr->unit > arr->length) return 0; if (arr->flags & ARRAY_AUTO) { - if (!(arr->data = realloc(arr->data, SIZE(arr->size + arr->bsize)))) + if (!(arr->data = realloc(arr->data, arr->size + + SIZE(arr->bsize)))) return -1; arr->size += arr->bsize; } else - return (arr->size - 1 == arr->length) ? -1 : 0; - - memset(arr->data + arr->length, 0, SIZE(arr->size - arr->length)); + return ((arr->size / arr->unit) <= arr->length) ? -1 : 0; return 0; } diff -r e8829146ebc7 -r 127254037b30 array.h --- a/array.h Wed Sep 07 07:33:25 2011 +0200 +++ b/array.h Wed Sep 07 20:12:40 2011 +0200 @@ -22,8 +22,8 @@ #define ARRAY_DEFAULT_BSIZE 128 struct array { - void **data; /* array of data */ - size_t length; /* number of element in array */ + void *data; /* array of data */ + int length; /* number of element inside */ #define ARRAY_FIXED 0x00000000 #define ARRAY_AUTO 0x00000001 @@ -31,12 +31,13 @@ /* Private should not be modified by user */ size_t size; /* current buffer size */ - size_t bsize; /* block size */ + size_t bsize; /* block size (used when growing array) */ + size_t unit; /* unit size (sizeof the object) */ }; -struct array *array_new(const void *, size_t, int); -#define array_new_auto(size) array_new(NULL, size, ARRAY_AUTO) -#define array_new_fixed(max) array_new(NULL, max, ARRAY_FIXED) +struct array *array_new(const void *, size_t, size_t, int); +#define array_new_auto(size) array_new(NULL, size, 0, ARRAY_AUTO) +#define array_new_fixed(size, max) array_new(NULL, size, max, ARRAY_FIXED) int array_push(struct array *, const void *); int array_insert(struct array *, const void *, int); @@ -46,12 +47,12 @@ void *array_remove(struct array *, int); void array_map(struct array *, void (*fn)(void *, void *), void *); void *array_find(struct array *, int (*fn)(void *, void *), void *, int *); -void array_clear(struct array *, int); -void array_free(struct array *, int); +void array_clear(struct array *); +void array_free(struct array *); #define ARRAY_FOREACH(array, entry, tmp, type) \ for ((tmp) = (type **) (array)->data, entry = *tmp; \ (entry) != NULL; \ ++(tmp), (entry) = (*tmp)) -#endif /* _ARRAY_H */ +#endif /* _ARRAY_H_ */