X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Farray.c;h=af66edd9305580aea5b53471a00a1300bfe0aaac;hp=bc28d042fdd4e65d8aba29b5e1760a2f31137bbc;hb=b35f8916a5252182070d0e4502a540e81a3ced90;hpb=4c6c6ecf0edcda29329f440eaa8dbb669b16c58a diff --git a/src/ngircd/array.c b/src/ngircd/array.c index bc28d042..af66edd9 100644 --- a/src/ngircd/array.c +++ b/src/ngircd/array.c @@ -5,32 +5,30 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * functions to dynamically allocate arrays. + * libarray - dynamically allocate arrays. * Copyright (c) 2005 Florian Westphal (westphal@foo.fh-furtwangen.de) - * */ -#include "array.h" +/** + * @file + * Functions to dynamically allocate arrays. + */ -static char UNUSED id[] = "$Id: array.c,v 1.12 2006/09/30 21:49:46 fw Exp $"; +#include "array.h" #include - #include #include +#include -#include "log.h" +#ifdef DEBUG_ARRAY +# include "log.h" +#endif /* Enable more Debug messages in alloc / append / memmove code. */ /* #define DEBUG_ARRAY */ - - -#define array_UNUSABLE(x) ( !(x)->mem || (0 == (x)->allocated) ) - -#define ALIGN_32U(x) (((x)+31U ) & ~(31U)) -#define ALIGN_1024U(x) (((x)+1023U) & ~(1023U)) -#define ALIGN_4096U(x) (((x)+4095U) & ~(4095U)) +#define array_UNUSABLE(x) ( !(x)->mem ) static bool @@ -61,7 +59,6 @@ void * array_alloc(array * a, size_t size, size_t pos) { size_t alloc, pos_plus1 = pos + 1; - size_t aligned = 0; char *tmp; assert(size > 0); @@ -70,43 +67,22 @@ array_alloc(array * a, size_t size, size_t pos) return NULL; if (a->allocated < alloc) { - if (alloc < 128) { - aligned = ALIGN_32U(alloc); - } else { - if (alloc < 4096) { - aligned = ALIGN_1024U(alloc); - } else { - aligned = ALIGN_4096U(alloc); - } - } -#ifdef DEBUG_ARRAY - Log(LOG_DEBUG, "array_alloc(): rounded %u to %u bytes.", alloc, aligned); -#endif - - assert(aligned >= alloc); - - if (aligned < alloc) /* rounding overflow */ - return NULL; - - alloc = aligned; #ifdef DEBUG_ARRAY Log(LOG_DEBUG, "array_alloc(): changing size from %u to %u bytes.", - a->allocated, aligned); + a->allocated, alloc); #endif - tmp = realloc(a->mem, alloc); if (!tmp) return NULL; a->mem = tmp; a->allocated = alloc; - - assert(a->allocated > a->used); - memset(a->mem + a->used, 0, a->allocated - a->used); - a->used = alloc; } + + assert(a->allocated >= a->used); + return a->mem + (pos * size); } @@ -121,6 +97,7 @@ array_length(const array * const a, size_t membersize) if (array_UNUSABLE(a)) return 0; + assert(a->allocated); return membersize ? a->used / membersize : 0; } @@ -132,6 +109,7 @@ array_copy(array * dest, const array * const src) if (array_UNUSABLE(src)) return false; + assert(src->allocated); return array_copyb(dest, src->mem, src->used); } @@ -247,19 +225,21 @@ void * array_get(array * a, size_t membersize, size_t pos) { size_t totalsize; + size_t posplus1 = pos + 1; assert(membersize > 0); assert(a != NULL); - if (array_UNUSABLE(a)) + if (!posplus1 || array_UNUSABLE(a)) return NULL; - if (!safemult_sizet(pos, membersize, &totalsize)) + if (!safemult_sizet(posplus1, membersize, &totalsize)) return NULL; if (a->allocated < totalsize) return NULL; + totalsize = pos * membersize; return a->mem + totalsize; } @@ -268,7 +248,7 @@ void array_free(array * a) { assert(a != NULL); -#ifdef DEBUG +#ifdef DEBUG_ARRAY Log(LOG_DEBUG, "array_free(): %u bytes free'd (%u bytes still used at time of free()).", a->allocated, a->used); @@ -279,6 +259,14 @@ array_free(array * a) a->used = 0; } +void +array_free_wipe(array *a) +{ + size_t bytes = a->allocated; + if (bytes) + memset(a->mem, 0, bytes); + array_free(a); +} void * array_start(const array * const a)