|
- #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;
- }
|