|
- #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((uint8_t *)o->buffer + o->size, buffer, size);
- o->size += size;
- }
-
- void *AutoReleasePool_Alloc(AutoReleasePool *o, size_t size) {
- size_t new_size = o->capacity;
- void *r = NULL;
-
- while (o->size + size > new_size) {
- new_size <<= 1;
- }
-
- DynamicBuffer_Reserve(o, new_size);
-
- r = (uint8_t *)o->buffer + o->size;
- o->size += size;
-
- return r;
- }
|