#include "../../include/std/buffer.h" #include #include #include #include void tsl_buffer_init(TslBuffer *self) { self->data = NULL; self->size = 0; self->capacity = 0; } void tsl_buffer_deinit(TslBuffer *self) { free(self->data); self->data = NULL; self->size = 0; self->capacity = 0; } static int tsl_buffer_ensure_capacity(TslBuffer *self, size_t new_size) { void *new_ptr; size_t new_capacity = self->capacity; if(new_size <= self->capacity) return 1; if(new_capacity == 0) new_capacity = 8; while(new_capacity < new_size) { new_capacity += (new_capacity >> 1); } new_ptr = realloc(self->data, new_capacity); if(!new_ptr) { fprintf(stderr, "Error: buffer append failed. Reason: out of memory\n"); return 0; } self->data = new_ptr; self->capacity = new_capacity; return 1; } int tsl_buffer_append(TslBuffer *self, const void *data, size_t size) { if(!tsl_buffer_ensure_capacity(self, self->size + size)) return 0; memcpy((char*)self->data + self->size, data, size); self->size += size; return 1; } void* tsl_buffer_pop(TslBuffer *self, size_t size) { assert(self->size >= size); self->size -= size; return (char*)self->data + self->size; } void* tsl_buffer_begin(TslBuffer *self) { return self->data; } void* tsl_buffer_end(TslBuffer *self) { return (char*)self->data + self->size; } void tsl_buffer_move(TslBuffer *dst, TslBuffer *src) { dst->data = src->data; dst->size = src->size; dst->capacity = src->capacity; src->data = NULL; src->size = 0; src->capacity = 0; }