#ifndef UCX_BUFFER_H
#define UCX_BUFFER_H
#include "common.h"
#include "allocator.h"
#include "string.h"
#ifdef __cplusplus
extern "C" {
#endif
#define CX_BUFFER_DEFAULT 0x00
#define CX_BUFFER_FREE_CONTENTS 0x01
#define CX_BUFFER_AUTO_EXTEND 0x02
#define CX_BUFFER_COPY_ON_WRITE 0x04
#define CX_BUFFER_COPY_ON_EXTEND 0x08
#define CX_BUFFER_DO_NOT_FREE 0x10
#define cxBufferWriteFunc ((cx_write_func) cxBufferWrite)
#define cxBufferReadFunc ((cx_read_func) cxBufferRead)
struct cx_buffer_s {
union {
char *space;
unsigned char *bytes;
};
const CxAllocator *allocator;
size_t pos;
size_t capacity;
size_t max_capacity;
size_t size;
int flags;
};
typedef struct cx_buffer_s CxBuffer;
cx_attr_nonnull_arg(
1)
CX_EXPORT int cxBufferInit(CxBuffer *buffer,
void *space,
size_t capacity,
const CxAllocator *allocator,
int flags);
cx_attr_nonnull
CX_EXPORT void cxBufferDestroy(CxBuffer *buffer);
CX_EXPORT void cxBufferFree(CxBuffer *buffer);
cx_attr_malloc cx_attr_dealloc(cxBufferFree,
1) cx_attr_nodiscard
CX_EXPORT CxBuffer *cxBufferCreate(
void *space,
size_t capacity,
const CxAllocator *allocator,
int flags);
cx_attr_nonnull
CX_EXPORT int cxBufferShift(CxBuffer *buffer,
off_t shift);
cx_attr_nonnull
CX_EXPORT int cxBufferShiftRight(CxBuffer *buffer,
size_t shift);
cx_attr_nonnull
CX_EXPORT int cxBufferShiftLeft(CxBuffer *buffer,
size_t shift);
cx_attr_nonnull
CX_EXPORT int cxBufferSeek(CxBuffer *buffer,
off_t offset,
int whence);
cx_attr_nonnull
CX_EXPORT size_t cxBufferPop(CxBuffer *buffer,
size_t size,
size_t nitems);
cx_attr_nonnull
CX_EXPORT void cxBufferClear(CxBuffer *buffer);
cx_attr_nonnull
CX_EXPORT void cxBufferReset(CxBuffer *buffer);
cx_attr_nonnull cx_attr_nodiscard
CX_EXPORT bool cxBufferEof(
const CxBuffer *buffer);
cx_attr_nonnull
CX_EXPORT int cxBufferReserve(CxBuffer *buffer,
size_t capacity);
cx_attr_nonnull
CX_EXPORT int cxBufferMaximumCapacity(CxBuffer *buffer,
size_t capacity);
cx_attr_nonnull
CX_EXPORT int cxBufferMinimumCapacity(CxBuffer *buffer,
size_t capacity);
cx_attr_nonnull
CX_EXPORT void cxBufferShrink(CxBuffer *buffer,
size_t reserve);
cx_attr_nonnull
CX_EXPORT size_t cxBufferWrite(
const void *ptr,
size_t size,
size_t nitems, CxBuffer *buffer);
cx_attr_nonnull
CX_EXPORT size_t cxBufferAppend(
const void *ptr,
size_t size,
size_t nitems, CxBuffer *buffer);
cx_attr_nonnull
CX_EXPORT size_t cxBufferRead(
void *ptr,
size_t size,
size_t nitems, CxBuffer *buffer);
cx_attr_nonnull
CX_EXPORT int cxBufferPut(CxBuffer *buffer,
int c);
cx_attr_nonnull
CX_EXPORT int cxBufferTerminate(CxBuffer *buffer);
cx_attr_nonnull
CX_EXPORT size_t cx_buffer_put_string(CxBuffer *buffer, cxstring str);
#define cxBufferPutString(buffer, str) cx_buffer_put_string(buffer, cx_strcast(str))
cx_attr_nonnull
CX_EXPORT size_t cx_buffer_append_string(CxBuffer *buffer, cxstring str);
#define cxBufferAppendString(buffer, str) cx_buffer_append_string(buffer, cx_strcast(str))
cx_attr_nonnull
CX_EXPORT int cxBufferGet(CxBuffer *buffer);
#ifdef __cplusplus
}
#endif
#endif