From 82eec8b529f2113f19b443446545bad66d3a1547 Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Tue, 3 Dec 2024 00:21:42 +0000 Subject: Implement buffer_t functions to make it stretchy --- lib.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- lib.h | 8 ++++++-- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/lib.c b/lib.c index 4f79345..0c3f4f9 100644 --- a/lib.c +++ b/lib.c @@ -13,11 +13,56 @@ buffer_t *buffer_init_str(const char *name, const char *str, size_t str_size) buffer_t *buf = malloc(sizeof(*buf) + str_size + 1); buf->name = name; buf->size = str_size; - memcpy(buf->data, str, str_size); - buf->data[str_size] = '\0'; + buf->capacity = str_size; + if (str) + { + memcpy(buf->data, str, str_size); + buf->data[str_size] = '\0'; + } return buf; } +bool buffer_ensure(buffer_t **buffer, u64 expected) +{ + if (!buffer) + return false; + else if (!*buffer) + { + *buffer = buffer_init_str(NULL, NULL, expected); + } + else if (buffer[0]->capacity <= expected) + { + buffer[0]->capacity = MAX(buffer[0]->capacity * 2, expected); + *buffer = realloc(*buffer, sizeof(**buffer) + buffer[0]->capacity); + } + return true; +} + +bool buffer_ensure_relative(buffer_t **buffer, u64 expected) +{ + return buffer_ensure(buffer, + buffer && *buffer ? buffer[0]->size + expected : 0); +} + +bool buffer_append(buffer_t **buffer, u8 datum) +{ + bool ret = buffer_ensure_relative(buffer, 1); + if (ret) + buffer[0]->data[buffer[0]->size++] = datum; + return ret; +} + +bool buffer_append_bytes(buffer_t **buffer, u8 *data, u64 size) +{ + bool ret = buffer_ensure_relative(buffer, size); + if (ret) + { + memcpy(buffer[0]->data + buffer[0]->size, data, size); + buffer[0]->size += size; + } + return ret; +} + void print_error(const char *handle, size_t row, size_t column, const char *reason) { diff --git a/lib.h b/lib.h index 8af0d13..dc844bb 100644 --- a/lib.h +++ b/lib.h @@ -28,9 +28,13 @@ void print_error(const char *handle, size_t row, size_t column, typedef struct Buffer { const char *name; - size_t size; - char data[]; + u64 size, capacity; + u8 data[]; } buffer_t; buffer_t *buffer_init_str(const char *name, const char *str, size_t str_size); +bool buffer_ensure(buffer_t **buffer, u64 expected); +bool buffer_ensure_relative(buffer_t **buffer, u64 expected); +bool buffer_append(buffer_t **buffer, u8 datum); +bool buffer_append_bytes(buffer_t **buffer, u8 *data, u64 size); #endif -- cgit v1.2.3-13-gbd6f