toys/simple-http-server-c/source/dynamic_buffer.h

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