#include #define ACHUNK 1024 #include "allocv.h" struct allocv { int n; int nmax; int achunks; int esize; char **v; } ; ALLOCV *allocv_init(int sz) { ALLOCV *a; a = malloc(sizeof(ALLOCV)); a->n = 0; a->nmax = 0; a->achunks = 0; a->esize = sz; a->v = 0; return(a); } int allocv_new(ALLOCV *a) { int x; x = a->n ++; if (x >= a->nmax) { a->achunks ++; a->nmax = a->achunks * ACHUNK; a->v = realloc(a->v,a->achunks*sizeof(char *)); a->v[a->achunks-1] = malloc(ACHUNK*a->esize); } return(x); } void *allocv_el(ALLOCV *a, unsigned int x) { if (x >= a->n) abort(); return(a->v[x/ACHUNK]+((x%ACHUNK)*a->esize)); } int allocv_okx(ALLOCV *a, int x) { return((x >= 0) && (x < a->n)); } int allocv_n(ALLOCV *a) { return(a->n); }