#pragma once #include #include #include #include #include #include #if defined (__cplusplus) extern "C" { #endif #if !defined(DEFAULT_CACHE_SIZE) #define DEFAULT_CACHE_SIZE (4 * 1024) #endif /* DEFAULT_CACHE_SIZE */ typedef struct DynamicBuffer { void* buffer; size_t size; size_t capacity; } DynamicBuffer; #define DynamicBuffer_Capacity(o) ((DynamicBuffer *)(o))->capacity #define DynamicBuffer_Size(o) ((DynamicBuffer *)(o))->size #define DynamicBuffer_AppendChar(o,c) DynamicBuffer_Append(o, &c, sizeof(c)) #define DynamicBuffer_AppendNull(o) DynamicBuffer_Append(o, "\0", 1) #define DynamicBuffer_AppendWNull(o) do { \ DynamicBuffer_Append(o, "\0", 1); \ DynamicBuffer_Append(o, "\0", 1); \ } while (0) #define DynamicBuffer_AppendNullWithoutSize(o) do { \ DynamicBuffer_Append(o, "\0", 1); \ DynamicBuffer_Resize(o, DynamicBuffer_Size(o) - 1); \ } while (0) #define DynamicBuffer_AppendWNullWithoutSize(o) do { \ DynamicBuffer_Append(o, "\0", 1); \ DynamicBuffer_Append(o, "\0", 1); \ DynamicBuffer_Resize(o, DynamicBuffer_Size(o) - 2); \ } while (0) #define DynamicBuffer_Buffer(o) (uint8_t *)(((DynamicBuffer *)(o))->buffer) #define DynamicBuffer_BufferAt(o,idx) ((uint8_t *)(((DynamicBuffer *)(o))->buffer) + idx) #define DynamicBuffer_BufferEnd(o) ((uint8_t *)(((DynamicBuffer *)(o))->buffer) + ((DynamicBuffer *)(o))->size) #define DynamicBuffer_Begin(o) (uint8_t *)(((DynamicBuffer *)(o))->buffer) #define DynamicBuffer_Back(o) ((((DynamicBuffer *)(o))->size > 0) ? ((uint8_t *)(((DynamicBuffer *)(o))->buffer) + ((DynamicBuffer *)(o))->size - 1) : NULL) #define DynamicBuffer_Clear(o) ((DynamicBuffer *)(o))->size = 0 #define DynamicBuffer_AvailableBuffer(o) (((uint8_t *)((DynamicBuffer *)(o))->buffer) + ((DynamicBuffer *)(o))->size) #define DynamicBuffer_AvailableCapacity(o) (((DynamicBuffer *)(o))->capacity - ((DynamicBuffer *)(o))->size) #define DynamicBuffer_AppendString(o,msg) DynamicBuffer_Append((DynamicBuffer *)(o),(const char *)(msg),strlen((const char *)(msg))); #define DynamicBuffer_Swap(o,buffer,size) do { \ free(((DynamicBuffer *)(o))->buffer); \ ((DynamicBuffer *)(o))->buffer = buffer; \ ((DynamicBuffer *)(o))->size = ((DynamicBuffer *)(o))->capacity = size; \ } while (0) #define DynamicBuffer_ConstructWithSize(o,size) do { \ memset(o, 0, sizeof(DynamicBuffer)); \ DynamicBuffer_Reserve(o, size); \ } while (0) #define DynamicBuffer_Construct(o) DynamicBuffer_ConstructWithSize(o, DEFAULT_CACHE_SIZE) #define DynamicBuffer_Destruct(o) do { \ free(((DynamicBuffer *)(o))->buffer); \ memset(o, 0, sizeof(DynamicBuffer)); \ } while (0) int DynamicBuffer_Reserve(DynamicBuffer* o, size_t new_capacity); int DynamicBuffer_ResetBuffer(DynamicBuffer* o, size_t position); int DynamicBuffer_Resize(DynamicBuffer* o, size_t new_size); void DynamicBuffer_Append(DynamicBuffer* o, const void* buffer, size_t size); #if defined (__cplusplus) } #endif