universe@60: #ifndef BUFFER_H universe@60: #define BUFFER_H universe@56: universe@62: #include universe@56: #include universe@56: universe@56: #ifdef __cplusplus universe@56: extern "C" { universe@56: #endif universe@56: universe@61: #define UCX_BUFFER_DEFAULT 0x00 universe@61: #define UCX_BUFFER_AUTOFREE 0x01 universe@64: /* the buffer may automatically double its size on write operations */ universe@63: #define UCX_BUFFER_AUTOEXTEND 0x02 universe@56: universe@64: /* the user shall not modify values, but may get the latest pointer */ universe@63: typedef struct { universe@63: void *space; universe@63: size_t pos; universe@63: size_t size; universe@63: int flags; universe@63: } UcxBuffer; universe@56: universe@61: /* if space is NULL, new space is allocated and the autofree flag is enforced */ universe@61: UcxBuffer *ucx_buffer_new(void *space, size_t length, int flags); universe@60: void ucx_buffer_free(UcxBuffer* buffer); universe@56: universe@56: /* universe@62: * the autofree flag is enforced for the new buffer universe@62: * if length is zero, the whole remaining buffer shall be extracted universe@62: * the position of the new buffer is set to zero universe@62: */ universe@67: UcxBuffer *restrict ucx_buffer_extract(UcxBuffer *restrict src, universe@62: size_t start, size_t length, int flags); universe@62: #define ucx_buffer_clone(src,flags) \ universe@62: ucx_buffer_extract(src, 0, 0, flags) universe@62: universe@62: /* universe@60: * Moves the position of the buffer to a new position relative to whence. universe@56: * universe@56: * SEEK_SET marks the start of the buffer universe@56: * SEEK_CUR marks the current position universe@56: * SEEK_END marks the first 0-byte in the buffer universe@56: * universe@56: * ucx_memseek returns 0 on success and -1 if the new position is beyond the universe@60: * bounds of the allocated buffer. In that case the position of the buffer universe@56: * remains unchanged. universe@56: * universe@56: */ universe@60: int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence); universe@56: universe@56: /* universe@60: * returns non-zero, iff the current buffer position has exceeded the last universe@56: * available byte of the underlying buffer universe@56: * universe@56: */ universe@60: int ucx_buffer_eof(UcxBuffer *buffer); universe@56: universe@60: size_t ucx_bufio(void *d, size_t s, size_t n, UcxBuffer* b, _Bool read); universe@64: /* when autoextend is enabled, ensure you get the latest pointer to the data */ universe@60: #define ucx_buffer_write(data, itemsize, nitems, buffer) \ universe@60: ucx_bufio(data, itemsize, nitems, buffer, 0) universe@60: #define ucx_buffer_read(data, itemsize, nitems, buffer) \ universe@60: ucx_bufio(data, itemsize, nitems, buffer, 1) universe@60: int ucx_buffer_putc(UcxBuffer *b, int c); universe@60: int ucx_buffer_getc(UcxBuffer *b); universe@56: universe@56: #ifdef __cplusplus universe@56: } universe@56: #endif universe@56: universe@60: #endif /* BUFFER_H */ universe@56: