toys/simple-http-server-c/source/dynamic_buffer.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;
}