X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Farray.c;h=4cc793f18c02b3f4bea6dd1f46ed2914441740a5;hp=cbfdcd85240b4853287f6d9058d2cdda35280372;hb=f547981188a28844068e864dc1ed955ff173d216;hpb=21ad5dcfffa492a949a832fa1631242f4bad7a7a diff --git a/src/ngircd/array.c b/src/ngircd/array.c index cbfdcd85..4cc793f1 100644 --- a/src/ngircd/array.c +++ b/src/ngircd/array.c @@ -5,42 +5,38 @@ * (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.6 2005/08/28 11:47:02 fw Exp $"; +/* Additionan debug messages related to array handling: 0=off / 1=on */ +#define DEBUG_ARRAY 0 -#include +#include "array.h" +#include #include #include +#include -#include "log.h" - -#define array_UNUSABLE(x) ( ! x->mem || (0 == x->allocated) ) +#if DEBUG_ARRAY +# include "log.h" +#endif -#define ALIGN_32U(x) ((x | 0x1fU) +1) -#define ALIGN_1024U(x) ((x | 0x3ffU) +1) -#define ALIGN_4096U(x) ((x | 0xfffU) +1) +#define array_UNUSABLE(x) ( !(x)->mem ) static bool -safemult_uint(unsigned int a, unsigned int b, unsigned int *res) +safemult_sizet(size_t a, size_t b, size_t *res) { - unsigned int tmp; - - if (!a || !b) { - *res = 0; - return true; - } - - tmp = a * b; + size_t tmp = a * b; - if (tmp / b != a) + if (b && (tmp / b != a)) return false; *res = tmp; @@ -51,74 +47,49 @@ safemult_uint(unsigned int a, unsigned int b, unsigned int *res) void array_init(array *a) { - assert(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; char *tmp; assert(size > 0); - if (pos_plus1 < pos) - return NULL; - - if (!safemult_uint(size, pos_plus1, &alloc)) + if (pos_plus1 == 0 || !safemult_sizet(size, pos_plus1, &alloc)) 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 - 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 +#if 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); } /*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 != NULL); assert(membersize > 0); @@ -126,6 +97,7 @@ array_length(const array * const a, unsigned int membersize) if (array_UNUSABLE(a)) return 0; + assert(a->allocated); return membersize ? a->used / membersize : 0; } @@ -137,31 +109,23 @@ 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); } -/* 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 != NULL); assert(src != NULL ); - if (!len || !src) - return true; - - 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 bytes allocated).", - len, dest->allocated); -#endif - return true; + array_trunc(dest); + return array_catb(dest, src, len); } @@ -176,10 +140,10 @@ 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 != NULL); @@ -204,7 +168,7 @@ array_catb(array * dest, const char *src, unsigned int len) assert(ptr != NULL); -#ifdef DEBUG +#if DEBUG_ARRAY Log(LOG_DEBUG, "array_catb(): appending %u bytes to array (now %u bytes in array).", len, tmp); @@ -235,7 +199,7 @@ array_cat0(array * a) bool array_cat0_temporary(array * a) { - char *endpos = array_alloc(a, 1, array_bytes(len)); + char *endpos = array_alloc(a, 1, array_bytes(a)); if (!endpos) return false; @@ -258,23 +222,25 @@ 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 > 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; } @@ -282,7 +248,7 @@ void array_free(array * a) { assert(a != NULL); -#ifdef DEBUG +#if DEBUG_ARRAY Log(LOG_DEBUG, "array_free(): %u bytes free'd (%u bytes still used at time of free()).", a->allocated, a->used); @@ -293,17 +259,15 @@ 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) { @@ -321,11 +285,11 @@ array_trunc(array * a) void -array_truncate(array * a, unsigned int membersize, unsigned int len) +array_truncate(array * a, size_t membersize, size_t len) { - unsigned int newlen; + size_t newlen; assert(a != NULL); - if (!safemult_uint(membersize, len, &newlen)) + if (!safemult_sizet(membersize, len, &newlen)) return; if (newlen <= a->allocated) @@ -335,17 +299,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 != NULL); assert(membersize > 0); - if (!pos) - return; - - if (!safemult_uint(membersize, pos, &bytepos)) { + if (!safemult_sizet(membersize, pos, &bytepos)) { a->used = 0; return; } @@ -353,7 +314,7 @@ array_moveleft(array * a, unsigned int membersize, unsigned int pos) if (!bytepos) return; /* nothing to do */ -#ifdef DEBUG +#if DEBUG_ARRAY Log(LOG_DEBUG, "array_moveleft(): %u bytes used in array, starting at position %u.", a->used, bytepos);