#include "dynamic_buffer.h" int DynamicBuffer_Reserve(DynamicBuffer* o, size_t new_capacity) { int succ = 0; if (o->capacity < new_capacity) { void* tmp_buffer = realloc(o->buffer, new_capacity); if (tmp_buffer == NULL) { goto func_end; } o->capacity = new_capacity; o->buffer = tmp_buffer; } succ = 1; func_end: return succ; } int DynamicBuffer_ResetBuffer(DynamicBuffer* o, size_t position) { int succ = 0; /// position should never larger than buffer size! assert(position <= o->size); if (position > o->size) { printf("[E] Failed to reset buffer: position is larger than buffer size!"); goto func_end; } if (position != o->size) { memmove(o->buffer, (uint8_t *)o->buffer + position, o->size - position); } o->size -= position; succ = 1; func_end: return succ; } int DynamicBuffer_Resize(DynamicBuffer* o, size_t new_size) { if (o->size <= new_size) { o->size = new_size; return 1; } if (!DynamicBuffer_Reserve(o, new_size)) { return 0; } o->size = new_size; return 1; } /// FIXME(anjingyu): Assume never overflow! void DynamicBuffer_Append(DynamicBuffer* o, const void* buffer, size_t size) { size_t new_size = o->capacity; while (o->size + size > new_size) { new_size <<= 1; } DynamicBuffer_Reserve(o, new_size); memmove(o->buffer + o->size, buffer, size); o->size += size; }