From 958a95b37891098133369e835a2ab687e0dfa9dc Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Tue, 9 Nov 2010 19:57:18 +0100 Subject: Add vector utility functions Signed-off-by: Lars Hjemli --- Makefile | 1 + vector.c | 38 ++++++++++++++++++++++++++++++++++++++ vector.h | 17 +++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 vector.c create mode 100644 vector.h diff --git a/Makefile b/Makefile index be1d796..31d88ef 100644 --- a/Makefile +++ b/Makefile @@ -103,6 +103,7 @@ OBJECTS += ui-stats.o OBJECTS += ui-summary.o OBJECTS += ui-tag.o OBJECTS += ui-tree.o +OBJECTS += vector.o ifdef NEEDS_LIBICONV EXTLIBS += -liconv diff --git a/vector.c b/vector.c new file mode 100644 index 0000000..0863908 --- /dev/null +++ b/vector.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include "vector.h" + +static int grow(struct vector *vec, int gently) +{ + size_t new_alloc; + void *new_data; + + new_alloc = vec->alloc * 3 / 2; + if (!new_alloc) + new_alloc = 8; + new_data = realloc(vec->data, new_alloc * vec->size); + if (!new_data) { + if (gently) + return ENOMEM; + perror("vector.c:grow()"); + exit(1); + } + vec->data = new_data; + vec->alloc = new_alloc; + return 0; +} + +int vector_push(struct vector *vec, const void *data, int gently) +{ + int rc; + + if (vec->count == vec->alloc && (rc = grow(vec, gently))) + return rc; + if (data) + memmove(vec->data + vec->count * vec->size, data, vec->size); + else + memset(vec->data + vec->count * vec->size, 0, vec->size); + vec->count++; + return 0; +} diff --git a/vector.h b/vector.h new file mode 100644 index 0000000..c64eb1f --- /dev/null +++ b/vector.h @@ -0,0 +1,17 @@ +#ifndef CGIT_VECTOR_H +#define CGIT_VECTOR_H + +#include + +struct vector { + size_t size; + size_t count; + size_t alloc; + void *data; +}; + +#define VECTOR_INIT(type) {sizeof(type), 0, 0, NULL} + +int vector_push(struct vector *vec, const void *data, int gently); + +#endif /* CGIT_VECTOR_H */ -- cgit v1.2.3-59-g8ed1b