#include "pn_buffer.h" #include #define BUFFER_SIZE 0x1000 struct pn_buffer * pn_buffer_new(void) { struct pn_buffer *buffer; buffer = g_malloc0(sizeof(*buffer)); return buffer; } struct pn_buffer * pn_buffer_new_and_alloc(size_t size) { struct pn_buffer *buffer; if (size <= 0) size = BUFFER_SIZE; buffer = g_malloc(sizeof(*buffer)); buffer->data = buffer->alloc_data = g_malloc(size); buffer->size = size; buffer->len = 0; buffer->offset = 0; return buffer; } struct pn_buffer * pn_buffer_new_use(void *data, size_t size) { struct pn_buffer *buffer; buffer = g_malloc(sizeof(*buffer)); buffer->size = buffer->len = size; buffer->data = buffer->alloc_data = data; buffer->offset = 0; return buffer; } struct pn_buffer * pn_buffer_new_memdup(const void *data, size_t size) { return pn_buffer_new_use(g_memdup(data, size), size); } void pn_buffer_free(struct pn_buffer *buffer) { if (!buffer) return; g_free(buffer->alloc_data); g_free(buffer); } void pn_buffer_resize(struct pn_buffer *buffer, size_t new_size) { new_size = ((new_size / BUFFER_SIZE) + 1) * BUFFER_SIZE; buffer->data = buffer->alloc_data = g_realloc(buffer->data, new_size); buffer->size = new_size; } void pn_buffer_prepare(struct pn_buffer *buffer, size_t extra_size) { if (extra_size <= buffer->size - buffer->len) return; pn_buffer_resize(buffer, buffer->len + extra_size); }