From ffc8068a74cca75a66296e8bec06d1ef47d7c830 Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Thu, 19 Dec 2024 08:44:53 +0000 Subject: Introduce and implement vec_t A vec_t is a dynamic array, separate to a buffer. Should make it easier to distinguish purposes using these two data types. --- lib.c | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) (limited to 'lib.c') diff --git a/lib.c b/lib.c index 4ef6506..0c32c3b 100644 --- a/lib.c +++ b/lib.c @@ -8,6 +8,12 @@ #include "./lib.h" +bool usable_character(char c) +{ + return c == '>' || c == '<' || c == '+' || c == '-' || c == '-' || c == '.' || + c == ',' || c == '[' || c == ']'; +} + buffer_t *buffer_init_str(const char *name, const char *str, size_t str_size) { buffer_t *buf = malloc(sizeof(*buf) + str_size + 1); @@ -61,8 +67,34 @@ char *fread_all(FILE *fp) return buffer.data; } -bool usable_character(char c) +void vec_append(vec_t *vec, void *ptr, u64 size) { - return c == '>' || c == '<' || c == '+' || c == '-' || c == '-' || c == '.' || - c == ',' || c == '[' || c == ']'; + vec_ensure_free(vec, size); + memcpy(vec->data + vec->size, ptr, size); + vec->size += size; +} + +void vec_ensure(vec_t *vec, u64 abs_size) +{ + if (vec->capacity < abs_size) + { + vec->capacity = MAX(vec->capacity * 2, abs_size); + vec->data = realloc(vec->data, vec->capacity); + } + else if (!vec->data) + { + vec->data = calloc(1, vec->capacity); + } +} + +void vec_ensure_free(vec_t *vec, u64 rel_size) +{ + vec_ensure(vec, vec->size + rel_size); +} + +void vec_free(vec_t *vec) +{ + if (vec->data) + free(vec->data); + memset(vec, 0, sizeof(*vec)); } -- cgit v1.2.3-13-gbd6f