diff options
author | dec05eba <dec05eba@protonmail.com> | 2019-02-24 02:10:58 +0100 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2020-07-25 14:36:40 +0200 |
commit | 11dc4b81935e3dfee997c421d8d6fa166edd7a05 (patch) | |
tree | ccb08be54209a4900c740c9ed58e8f9c2910811d /src/buffer.c |
Initial commit, Function declaration work somewhat
Diffstat (limited to 'src/buffer.c')
-rw-r--r-- | src/buffer.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/buffer.c b/src/buffer.c new file mode 100644 index 0000000..4bd3b68 --- /dev/null +++ b/src/buffer.c @@ -0,0 +1,56 @@ +#include "../include/buffer.h" +#include "../include/alloc.h" +#include "../include/mem.h" +#include <assert.h> + +void buffer_init(Buffer *self) { + self->data = NULL; + self->size = 0; + self->capacity = 0; +} + +void buffer_deinit(Buffer *self) { + am_free(self->data); + self->data = NULL; + self->size = 0; + self->capacity = 0; +} + +static WARN_UNUSED_RESULT int buffer_ensure_capacity(Buffer *self, usize new_capacity) { + usize capacity; + void *new_mem; + int alloc_result; + + if(self->capacity >= new_capacity) + return BUFFER_OK; + + capacity = self->capacity; + if(capacity == 0) { + capacity = new_capacity; + } else { + while(capacity < new_capacity) { + capacity *= 1.5; + } + } + + alloc_result = am_realloc(self->data, capacity, &new_mem); + if(alloc_result != ALLOC_OK) + return BUFFER_ALLOC_FAIL; + + self->data = new_mem; + self->capacity = capacity; + return BUFFER_OK; +} + +int buffer_append(Buffer *self, void *data, usize size) { + return_if_error(buffer_ensure_capacity(self, self->size + size)); + am_memcpy(self->data + self->size, data, size); + return BUFFER_OK; +} + +void* buffer_get(Buffer *self, usize index, usize type_size) { + usize real_index; + real_index = index * type_size; + assert(real_index < self->size); + return &self->data[real_index]; +}
\ No newline at end of file |