#include "buffer.h" #include #include #include #include void BufferCreate(struct Buffer* buffer) { memset(buffer, 0, sizeof(struct Buffer)); } void* BufferReserve(struct Buffer* buffer, size_t size) { size_t alloc = buffer->size + size; if (alloc > buffer->alloc) { void* data = realloc(buffer->data, alloc); if (!data) return NULL; buffer->data = data; buffer->alloc = alloc; } return (char*)buffer->data + buffer->size; } int BufferAppendFrom(struct Buffer* buffer, int fd) { int nbytes; if (ioctl(fd, FIONREAD, &nbytes) == -1) return -1; if (!nbytes) return 0; void* data = BufferReserve(buffer, (size_t)nbytes); if (!data) return -1; ssize_t result = read(fd, data, (size_t)nbytes); if (result > 0) buffer->size += (size_t)result; return (int)result; } void BufferDiscard(struct Buffer* buffer, size_t size) { size_t tail_size = buffer->size - size; if (tail_size) { const char* tail = (const char*)buffer->data + size; memmove(buffer->data, tail, tail_size); } buffer->size = tail_size; } void BufferDestroy(struct Buffer* buffer) { free(buffer->data); }