X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Farray.c;h=1e56b719cd4fabc74de4326959790d68805383ca;hb=c135d0dded909e2e5780697c4066ad44a3f488c8;hp=8b83c2c4ba767b52034f35bfb6be4d83ba8f15f4;hpb=ebbf92898e749da9341ebe3b7e71b96362161043;p=ngircd-alex.git diff --git a/src/ngircd/array.c b/src/ngircd/array.c index 8b83c2c4..1e56b719 100644 --- a/src/ngircd/array.c +++ b/src/ngircd/array.c @@ -12,7 +12,7 @@ #include "array.h" -static char UNUSED id[] = "$Id: array.c,v 1.1 2005/07/07 18:38:14 fw Exp $"; +static char UNUSED id[] = "$Id: array.c,v 1.15 2007/11/18 15:05:35 alex Exp $"; #include @@ -21,47 +21,52 @@ static char UNUSED id[] = "$Id: array.c,v 1.1 2005/07/07 18:38:14 fw Exp $"; #include "log.h" -#define array_UNUSABLE(x) ( ! x->mem || (0 == x->allocated) ) +/* Enable more Debug messages in alloc / append / memmove code. */ +/* #define DEBUG_ARRAY */ -#define ALIGN_32U(x) ((x | 0x1fU) +1) -#define ALIGN_1024U(x) ((x | 0x3ffU) +1) -#define ALIGN_4096U(x) ((x | 0xfffU) +1) -static int -safemult_uint(unsigned int a, unsigned int b, unsigned int *res) -{ - unsigned int tmp; +#define array_UNUSABLE(x) ( !(x)->mem || (0 == (x)->allocated) ) - if (!a || !b) { - *res = 0; - return 1; - } +#define ALIGN_32U(x) (((x)+(unsigned)31 ) & ~((unsigned)31)) +#define ALIGN_1024U(x) (((x)+(unsigned)1023) & ~((unsigned)1023)) +#define ALIGN_4096U(x) (((x)+(unsigned)4095) & ~((unsigned)4095)) - tmp = a * b; - if (tmp / b != a) - return 0; +static bool +safemult_sizet(size_t a, size_t b, size_t *res) +{ + size_t tmp = a * b; + + if (b && (tmp / b != a)) + return false; *res = tmp; - return 1; + return true; +} + + +void +array_init(array *a) +{ + assert(a != NULL); + a->mem = NULL; + a->allocated = 0; + a->used = 0; } /* if realloc() fails, array_alloc return NULL. otherwise return pointer to elem pos in array */ void * -array_alloc(array * a, unsigned int size, unsigned int pos) +array_alloc(array * a, size_t size, size_t pos) { - unsigned int alloc, pos_plus1 = pos + 1; - unsigned int aligned = 0; + size_t alloc, pos_plus1 = pos + 1; + size_t aligned = 0; char *tmp; - assert(size); - - if (pos_plus1 < pos) - return NULL; + assert(size > 0); - if (!safemult_uint(size, pos_plus1, &alloc)) + if (pos_plus1 == 0 || !safemult_sizet(size, pos_plus1, &alloc)) return NULL; if (a->allocated < alloc) { @@ -74,8 +79,8 @@ array_alloc(array * a, unsigned int size, unsigned int pos) aligned = ALIGN_4096U(alloc); } } -#ifdef DEBUG - Log(LOG_DEBUG, "Rounded %u to %u byte.", alloc, aligned); +#ifdef DEBUG_ARRAY + Log(LOG_DEBUG, "array_alloc(): rounded %u to %u bytes.", alloc, aligned); #endif assert(aligned >= alloc); @@ -84,8 +89,8 @@ array_alloc(array * a, unsigned int size, unsigned int pos) return NULL; alloc = aligned; -#ifdef DEBUG - Log(LOG_DEBUG, "array_alloc: changing size from %u to %u byte", +#ifdef DEBUG_ARRAY + Log(LOG_DEBUG, "array_alloc(): changing size from %u to %u bytes.", a->allocated, aligned); #endif @@ -107,11 +112,11 @@ array_alloc(array * a, unsigned int size, unsigned int pos) /*return number of initialized ELEMS in a. */ -unsigned int -array_length(const array * const a, unsigned int membersize) +size_t +array_length(const array * const a, size_t membersize) { - assert(a); - assert(membersize); + assert(a != NULL); + assert(membersize > 0); if (array_UNUSABLE(a)) return 0; @@ -131,27 +136,18 @@ array_copy(array * dest, const array * const src) } -/* return false if we could not append src (realloc failure, invalid src/dest array) */ +/* return false on failure (realloc failure, invalid src/dest array) */ bool -array_copyb(array * dest, const char *src, unsigned int len) +array_copyb(array * dest, const char *src, size_t len) { - assert(dest); - assert(src); - - if (!len || !src) - return true; + assert(dest != NULL); + assert(src != NULL ); - if (!array_alloc(dest, 1, len)) + if (!src || !dest) return false; - dest->used = len; - memcpy(dest->mem, src, len); -#ifdef DEBUG - Log(LOG_DEBUG, - "array_copyb: copied %u bytes to array (%u total bytes allocated)", - len, dest->allocated); -#endif - return true; + array_trunc(dest); + return array_catb(dest, src, len); } @@ -166,14 +162,14 @@ array_copys(array * dest, const char *src) /* append len bytes from src to the array dest. return false if we could not append all bytes (realloc failure, invalid src/dest array) */ bool -array_catb(array * dest, const char *src, unsigned int len) +array_catb(array * dest, const char *src, size_t len) { - unsigned int tmp; - unsigned int used; + size_t tmp; + size_t used; char *ptr; - assert(dest); - assert(src); + assert(dest != NULL); + assert(src != NULL); if (!len) return true; @@ -192,11 +188,11 @@ array_catb(array * dest, const char *src, unsigned int len) ptr = dest->mem; - assert(ptr); + assert(ptr != NULL); -#ifdef DEBUG +#ifdef DEBUG_ARRAY Log(LOG_DEBUG, - "array_catb: appending %u bytes to array (now %u total bytes in array)", + "array_catb(): appending %u bytes to array (now %u bytes in array).", len, tmp); #endif memcpy(ptr + used, src, len); @@ -221,6 +217,18 @@ array_cat0(array * a) } +/* append trailing NUL byte to array, but do not count it. */ +bool +array_cat0_temporary(array * a) +{ + char *endpos = array_alloc(a, 1, array_bytes(a)); + if (!endpos) + return false; + + *endpos = '\0'; + return true; +} + /* add contents of array src to array dest. */ bool array_cat(array * dest, const array * const src) @@ -236,33 +244,35 @@ array_cat(array * dest, const array * const src) return NULL if the array is unallocated, or if pos is larger than the number of elements stored int the array. */ void * -array_get(array * a, unsigned int membersize, unsigned int pos) +array_get(array * a, size_t membersize, size_t pos) { - unsigned int totalsize; + size_t totalsize; + size_t posplus1 = pos + 1; - assert(membersize); - assert(a); + assert(membersize > 0); + assert(a != NULL); - if (array_UNUSABLE(a)) + if (!posplus1 || array_UNUSABLE(a)) return NULL; - if (!safemult_uint(pos, membersize, &totalsize)) + if (!safemult_sizet(posplus1, membersize, &totalsize)) return NULL; if (a->allocated < totalsize) return NULL; - return a->mem + pos * membersize; + totalsize = pos * membersize; + return a->mem + totalsize; } void array_free(array * a) { - assert(a); -#ifdef DEBUG + assert(a != NULL); +#ifdef DEBUG_ARRAY Log(LOG_DEBUG, - "array_free: %u bytes free'd (%u bytes still used at time of free())", + "array_free(): %u bytes free'd (%u bytes still used at time of free()).", a->allocated, a->used); #endif free(a->mem); @@ -271,21 +281,19 @@ array_free(array * a) a->used = 0; } - void -array_free_wipe(array * a) +array_free_wipe(array *a) { - if (!array_UNUSABLE(a)) - memset(a->mem, 0, a->allocated); - + size_t bytes = a->allocated; + if (bytes) + memset(a->mem, 0, bytes); array_free(a); } - void * array_start(const array * const a) { - assert(a); + assert(a != NULL); return a->mem; } @@ -293,17 +301,17 @@ array_start(const array * const a) void array_trunc(array * a) { - assert(a); + assert(a != NULL); a->used = 0; } void -array_truncate(array * a, unsigned int membersize, unsigned int len) +array_truncate(array * a, size_t membersize, size_t len) { - unsigned int newlen; - assert(a); - if (!safemult_uint(membersize, len, &newlen)) + size_t newlen; + assert(a != NULL); + if (!safemult_sizet(membersize, len, &newlen)) return; if (newlen <= a->allocated) @@ -313,17 +321,14 @@ array_truncate(array * a, unsigned int membersize, unsigned int len) /* move elements starting at pos to beginning of array */ void -array_moveleft(array * a, unsigned int membersize, unsigned int pos) +array_moveleft(array * a, size_t membersize, size_t pos) { - unsigned int bytepos; + size_t bytepos; - assert(a); - assert(membersize); - - if (!pos) - return; + assert(a != NULL); + assert(membersize > 0); - if (!safemult_uint(membersize, pos, &bytepos)) { + if (!safemult_sizet(membersize, pos, &bytepos)) { a->used = 0; return; } @@ -331,9 +336,9 @@ array_moveleft(array * a, unsigned int membersize, unsigned int pos) if (!bytepos) return; /* nothing to do */ -#ifdef DEBUG +#ifdef DEBUG_ARRAY Log(LOG_DEBUG, - "array_moveleft: %u used bytes in array, move to beginning, starting at pos %u", + "array_moveleft(): %u bytes used in array, starting at position %u.", a->used, bytepos); #endif if (a->used <= bytepos) {