Mercurial > code
changeset 48:cdae3689f1b6
Update of array and cosmetic in ARRAY_ macros
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 07 Oct 2011 16:46:31 +0200 |
parents | fea13579acbe |
children | c7c6e601b154 |
files | array.c array.h |
diffstat | 2 files changed, 40 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/array.c Fri Oct 07 16:10:33 2011 +0200 +++ b/array.c Fri Oct 07 16:46:31 2011 +0200 @@ -27,7 +27,7 @@ static int array_grow(struct array *); struct array * -array_new(const void *data, size_t unit, int bsize, int type) +array_new(enum array_type type, size_t unit, int length) { struct array *arr; @@ -35,9 +35,8 @@ return NULL; memset(arr, 0, sizeof (struct array)); - arr->type = type; - arr->bsize = (bsize == 0) ? ARRAY_DEFAULT_BSIZE : bsize; + arr->bsize = (length == 0) ? ARRAY_DEFAULT_BSIZE : length; arr->unit = unit; arr->size = OFFSET(arr->bsize); @@ -46,9 +45,6 @@ return NULL; } - if (data) - memcpy(arr->data, data, arr->unit); - return arr; } @@ -171,6 +167,8 @@ int array_iswap(struct array *arr, int i1, int i2) { + void *tmp; + /* Out of bounds */ if (i1 >= arr->length || i1 < 0 || i2 >= arr->length || i2 < 0) return -1; @@ -180,19 +178,21 @@ * function. */ - if (arr->_tmp == NULL && (arr->_tmp = malloc(arr->unit)) == NULL) + if ((tmp = malloc(arr->unit)) == NULL) return -1; - memcpy((char *) arr->_tmp, (char *) arr->data + OFFSET(i1), arr->unit); + memcpy((char *) tmp, (char *) arr->data + OFFSET(i1), arr->unit); memcpy((char *) arr->data + OFFSET(i1), (char *) arr->data + OFFSET(i2), arr->unit); - memcpy((char *) arr->data + OFFSET(i2), (char *) arr->_tmp, arr->unit); + memcpy((char *) arr->data + OFFSET(i2), (char *) tmp, arr->unit); /* - * Clear bytes for safety. + * Clear bytes for safety you probably don't want a password or + * secure data to be left somewhere in the memory. */ - memset(arr->_tmp, 0, arr->unit); + memset(tmp, 0, arr->unit); + free(tmp); return 0; } @@ -285,8 +285,6 @@ if (arr->data) free(arr->data); - if (arr->_tmp) - free(arr->_tmp); free(arr); }
--- a/array.h Fri Oct 07 16:10:33 2011 +0200 +++ b/array.h Fri Oct 07 16:46:31 2011 +0200 @@ -21,8 +21,10 @@ #define ARRAY_DEFAULT_BSIZE 128 -#define ARRAY_FIXED 0x00 -#define ARRAY_AUTO 0x01 +enum array_type { + ARRAY_FIXED = 0, + ARRAY_AUTO = 1 +}; struct array { void *data; /* array of data */ @@ -31,44 +33,42 @@ size_t size; /* current buffer size (allocated memory) */ size_t unit; /* unit size (sizeof the object) */ int bsize; /* block size (used when growing array) */ - - /* Private, do not modify */ - void *_tmp; /* only used for array_swap() */ - int _i; /* only for ARRAY_FOREACH(_R) */ + int i; /* only for ARRAY_FOREACH(_R) */ }; -struct array *array_new(const void *, size_t, int, 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) +typedef void (*array_map_fn)(void *, void *); +typedef int (*array_cmp_fn)(void *, void *); -int array_push(struct array *, const void *); -int array_insert(struct array *, const void *, int); -int array_append(struct array *, const void *); -void array_pop(struct array *); -void array_unqueue(struct array *); -void array_remove(struct array *, int); -void array_unref(struct array *, const void *); -int array_iswap(struct array *, int, int); -int array_pswap(struct array *, const void *, const void *); -void array_map(const struct array *, void (*fn)(void *, void *), void *); -void *array_find(const struct array *, int (*fn)(void *, void *), int *, void *); -void array_clear(struct array *); -void array_free(struct array *); +struct array *array_new(enum array_type, size_t, int); +int array_push(struct array *, const void *); +int array_insert(struct array *, const void *, int); +int array_append(struct array *, const void *); +void array_pop(struct array *); +void array_unqueue(struct array *); +void array_remove(struct array *, int); +void array_unref(struct array *, const void *); +int array_iswap(struct array *, int, int); +int array_pswap(struct array *, const void *, const void *); +void array_map(const struct array *, array_map_fn, void *); +void *array_find(const struct array *, array_cmp_fn, int *, void *); +void array_clear(struct array *); +void array_free(struct array *); #define ARRAY_HEAD(a) \ a->data #define ARRAY_TAIL(a) \ - (void *) ((char *) a->data + (a->unit * (a->length - 1))) + (void *) ((char *) a->data + \ + (a->unit * ((a->length == 0) ? 0 : (a->length - 1)))) + #define ARRAY_INDEX(a, i) \ - (void *) ((char *) a->data + (a->unit * \ - ((i >= a->length) ? (a->length -1) : i))) + (void *) (i < 0 || a->length == 0) ? ARRAY_HEAD(a) /* < 0 head */ \ + : (i >= a->length) ? ARRAY_TAIL(a) /* > l tail */ \ + : ((char *) a->data + (a->unit * i)) /* correct */ #define ARRAY_FOREACH(a, var) \ - for (a->_i = 0, var = a->data; a->_i < a->length; ++a->_i, ++var) + for (a->i = 0, var = a->data; a->i < a->length; ++a->i, ++var) #define ARRAY_FOREACH_R(a, var) \ - for (a->_i = 0, \ - var = (void *) ((char *) a->data + a->unit * (a->length - 1)); \ - a->_i < a->length; ++a->_i, --var) + for (a->i = 0, var = ARRAY_TAIL(a); a->i < a->length; ++a->i, --var) #endif /* _ARRAY_H_ */