87 lines
1.5 KiB
C
87 lines
1.5 KiB
C
#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;
|
|
}
|