78 lines
3.0 KiB
C
78 lines
3.0 KiB
C
#pragma once
|
|
|
|
#include <stdio.h>
|
|
#include <assert.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include <string.h>
|
|
|
|
#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
|