From 9244eacb5ab0b9a11480d1ad40d4720575676877 Mon Sep 17 00:00:00 2001 From: Bobby Bingham Date: Tue, 17 Jan 2017 20:14:45 -0600 Subject: nqasm: parse labels --- vector.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 vector.c (limited to 'vector.c') diff --git a/vector.c b/vector.c new file mode 100644 index 0000000..57f62d7 --- /dev/null +++ b/vector.c @@ -0,0 +1,37 @@ +#include +#include +#include + +#include "vector.h" + +#define VECTOR_TOOBIG(alloc,elemsize,arrayoff) ((SIZE_MAX - (arrayoff)) / (alloc) < (elemsize)) +#define VECTOR_ALLOCSIZE(alloc,elemsize,arrayoff) ((arrayoff) + (alloc) * (elemsize)) + +void *vector_init(size_t alloc, size_t elemsize, size_t arrayoff) +{ + if (VECTOR_TOOBIG(alloc, elemsize, arrayoff)) return NULL; + struct vector *v = malloc(VECTOR_ALLOCSIZE(alloc, elemsize, arrayoff)); + if (!v) return NULL; + + *v = (struct vector) { + .alloc = alloc, + .elemsize = elemsize, + .arrayoff = arrayoff, + }; + return v; +} + +void *vector_append(struct vector **vp) +{ + struct vector *v = *vp; + if (v->count >= v->alloc) { + size_t alloc = 2 * v->alloc; + if (VECTOR_TOOBIG(alloc, v->elemsize, v->arrayoff)) return NULL; + v = realloc(v, VECTOR_ALLOCSIZE(alloc, v->elemsize, v->arrayoff)); + if (!v) return NULL; + v->alloc = alloc; + *vp = v; + } + return (char*)v + v->arrayoff + v->count++ * v->elemsize; +} + -- cgit v1.2.3