#ifndef lint static char *RCSid() { return RCSid("$Id: dynarray.c,v 1.3.2.1 2000/05/03 21:26:11 joze Exp $"); } #endif /* GNUPLOT - dynarray.c */ /* HBB: new code fragment for an 'OO-style' resizeable-array * container. used in hidden3d, for now, but should be useful, * elsewhere (after extracting the header and removing the 'static' * declarations, that is */ #include "dynarray.h" #include "alloc.h" #include "graphics.h" /*********** Implementation ************/ void init_dynarray(array, entry_size, size, increment) dynarray *array; size_t entry_size; long size, increment; { array->v = 0; /* preset value, in case gp_alloc fails */ if (size) array->v = gp_alloc(entry_size * size, "init dynarray"); array->size = size; array->end = 0; array->increment = increment; array->entry_size = entry_size; } void free_dynarray(array) dynarray *array; { free(array->v); /* should work, even if gp_alloc failed */ array->v = 0; array->end = array->size = 0; } void resize_dynarray(array, newsize) dynarray *array; long newsize; { if (!array->v) graph_error("resize_dynarray: dynarray wasn't initialized!"); if (newsize == 0) free_dynarray(array); else { array->v = gp_realloc(array->v, array->entry_size * newsize, "extend dynarray"); array->size = newsize; } } void extend_dynarray(array, increment) dynarray *array; long increment; { resize_dynarray(array, array->size + increment); } GPHUGE void * nextfrom_dynarray(array) dynarray *array; { if (!array->v) graph_error("nextfrom_dynarray: dynarray wan't initialized!"); if (array->end >= array->size) extend_dynarray(array, array->increment); return (void *)((char *)(array->v) + array->entry_size * (array->end++)); } void droplast_dynarray(array) dynarray *array; { if (!array->v) graph_error("droplast_dynarray: dynarray wasn't initialized!"); if (array->end) array->end--; }