From dfad8a8016426d7fe198dc32973b01a1e075142e Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sun, 12 Jul 2020 21:32:44 +0200 Subject: Starting on conversion to c. Program exec, buffers.. --- buffer.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 buffer.c (limited to 'buffer.c') diff --git a/buffer.c b/buffer.c new file mode 100644 index 0000000..879a62b --- /dev/null +++ b/buffer.c @@ -0,0 +1,54 @@ +#include "buffer.h" +#include "alloc.h" +#include +#include +#include + +void buffer_init(Buffer *self) { + self->data = NULL; + self->size = 0; + self->capacity = 0; +} + +void buffer_deinit(Buffer *self) { + free(self->data); + self->size = 0; + self->capacity = 0; +} + +static void buffer_ensure_capacity(Buffer *self, size_t new_size) { + size_t new_capacity = self->capacity; + if(new_size <= self->capacity) + return; + + if(new_capacity == 0) + new_capacity = 8; + + while(new_capacity < new_size) { + /* new_capacity *= 1.5 */ + new_capacity += (new_capacity >> 1); + } + + self->data = realloc_or_crash(self->data, new_capacity); + self->capacity = new_capacity; +} + +void buffer_append(Buffer *self, const void *data, size_t size) { + buffer_ensure_capacity(self, self->size + size); + memcpy((char*)self->data + self->size, data, size); + self->size += size; +} + +void* buffer_pop(Buffer *self, size_t size) { + assert(self->size >= size); + self->size -= size; + return (char*)self->data + self->size; +} + +void* buffer_begin(Buffer *self) { + return self->data; +} + +void* buffer_end(Buffer *self) { + return (char*)self->data + self->size; +} -- cgit v1.2.3