nuclear@16: #include nuclear@16: #include nuclear@16: #include nuclear@16: #include "cvec.h" nuclear@16: nuclear@16: struct vector { nuclear@16: int elem_sz; nuclear@16: int size, used; nuclear@16: char data[1]; nuclear@16: }; nuclear@16: nuclear@16: #define HDRSZ offsetof(struct vector, data) nuclear@16: #define VECTOR(p) ((struct vector*)((char*)(p) - HDRSZ)) nuclear@16: nuclear@16: void *cvec_alloc(int cnt, int esz) nuclear@16: { nuclear@16: struct vector *vec; nuclear@16: nuclear@16: if(!(vec = malloc(HDRSZ + esz * cnt))) { nuclear@16: return 0; nuclear@16: } nuclear@16: vec->elem_sz = esz; nuclear@16: vec->size = cnt; nuclear@16: vec->used = cnt; nuclear@16: return vec->data; nuclear@16: } nuclear@16: nuclear@16: void cvec_free(void *cvec) nuclear@16: { nuclear@16: free(VECTOR(cvec)); nuclear@16: } nuclear@16: nuclear@16: void *cvec_resize(void *cvec, int newsz) nuclear@16: { nuclear@16: struct vector *newvec, *vec = VECTOR(cvec); nuclear@16: nuclear@16: if(!(newvec = realloc(vec, newsz * vec->elem_sz + HDRSZ))) { nuclear@16: return 0; nuclear@16: } nuclear@16: newvec->size = newvec->used = newsz; nuclear@16: return newvec->data; nuclear@16: } nuclear@16: nuclear@16: void *cvec_append(void *cvec, void *data) nuclear@16: { nuclear@16: struct vector *vec = VECTOR(cvec); nuclear@16: nuclear@16: if(vec->used >= vec->size) { nuclear@16: int used = vec->used; nuclear@16: void *tmp; nuclear@16: nuclear@16: if(!(tmp = cvec_resize(cvec, vec->size ? vec->size * 2 : 1))) { nuclear@16: return cvec; nuclear@16: } nuclear@16: cvec = tmp; nuclear@16: vec = VECTOR(tmp); nuclear@16: vec->used = used; nuclear@16: } nuclear@16: nuclear@16: memcpy(vec->data + vec->used * vec->elem_sz, data, vec->elem_sz); nuclear@16: vec->used++; nuclear@16: return cvec; nuclear@16: } nuclear@16: nuclear@16: int cvec_size(void *cvec) nuclear@16: { nuclear@16: return VECTOR(cvec)->used; nuclear@16: }