diff options
Diffstat (limited to 'src/buffer.c')
-rw-r--r-- | src/buffer.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/buffer.c b/src/buffer.c new file mode 100644 index 0000000..5768b3a --- /dev/null +++ b/src/buffer.c @@ -0,0 +1,58 @@ +#include "buffer.h" +#include "alloc.h" +#include <stdio.h> +#include <string.h> +#include <assert.h> + +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; +} + +size_t buffer_get_size(Buffer *self, size_t type_size) { + return self->size / type_size; +} |