dos3d
annotate src/cvec.c @ 18:777be77b6432
foo
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Wed, 30 Nov 2011 00:06:28 +0200 |
parents | |
children |
rev | line source |
---|---|
nuclear@16 | 1 #include <stdlib.h> |
nuclear@16 | 2 #include <string.h> |
nuclear@16 | 3 #include <stddef.h> |
nuclear@16 | 4 #include "cvec.h" |
nuclear@16 | 5 |
nuclear@16 | 6 struct vector { |
nuclear@16 | 7 int elem_sz; |
nuclear@16 | 8 int size, used; |
nuclear@16 | 9 char data[1]; |
nuclear@16 | 10 }; |
nuclear@16 | 11 |
nuclear@16 | 12 #define HDRSZ offsetof(struct vector, data) |
nuclear@16 | 13 #define VECTOR(p) ((struct vector*)((char*)(p) - HDRSZ)) |
nuclear@16 | 14 |
nuclear@16 | 15 void *cvec_alloc(int cnt, int esz) |
nuclear@16 | 16 { |
nuclear@16 | 17 struct vector *vec; |
nuclear@16 | 18 |
nuclear@16 | 19 if(!(vec = malloc(HDRSZ + esz * cnt))) { |
nuclear@16 | 20 return 0; |
nuclear@16 | 21 } |
nuclear@16 | 22 vec->elem_sz = esz; |
nuclear@16 | 23 vec->size = cnt; |
nuclear@16 | 24 vec->used = cnt; |
nuclear@16 | 25 return vec->data; |
nuclear@16 | 26 } |
nuclear@16 | 27 |
nuclear@16 | 28 void cvec_free(void *cvec) |
nuclear@16 | 29 { |
nuclear@16 | 30 free(VECTOR(cvec)); |
nuclear@16 | 31 } |
nuclear@16 | 32 |
nuclear@16 | 33 void *cvec_resize(void *cvec, int newsz) |
nuclear@16 | 34 { |
nuclear@16 | 35 struct vector *newvec, *vec = VECTOR(cvec); |
nuclear@16 | 36 |
nuclear@16 | 37 if(!(newvec = realloc(vec, newsz * vec->elem_sz + HDRSZ))) { |
nuclear@16 | 38 return 0; |
nuclear@16 | 39 } |
nuclear@16 | 40 newvec->size = newvec->used = newsz; |
nuclear@16 | 41 return newvec->data; |
nuclear@16 | 42 } |
nuclear@16 | 43 |
nuclear@16 | 44 void *cvec_append(void *cvec, void *data) |
nuclear@16 | 45 { |
nuclear@16 | 46 struct vector *vec = VECTOR(cvec); |
nuclear@16 | 47 |
nuclear@16 | 48 if(vec->used >= vec->size) { |
nuclear@16 | 49 int used = vec->used; |
nuclear@16 | 50 void *tmp; |
nuclear@16 | 51 |
nuclear@16 | 52 if(!(tmp = cvec_resize(cvec, vec->size ? vec->size * 2 : 1))) { |
nuclear@16 | 53 return cvec; |
nuclear@16 | 54 } |
nuclear@16 | 55 cvec = tmp; |
nuclear@16 | 56 vec = VECTOR(tmp); |
nuclear@16 | 57 vec->used = used; |
nuclear@16 | 58 } |
nuclear@16 | 59 |
nuclear@16 | 60 memcpy(vec->data + vec->used * vec->elem_sz, data, vec->elem_sz); |
nuclear@16 | 61 vec->used++; |
nuclear@16 | 62 return cvec; |
nuclear@16 | 63 } |
nuclear@16 | 64 |
nuclear@16 | 65 int cvec_size(void *cvec) |
nuclear@16 | 66 { |
nuclear@16 | 67 return VECTOR(cvec)->used; |
nuclear@16 | 68 } |