diff options
author | Felipe Contreras <felipe.contreras@gmail.com> | 2010-06-13 21:22:59 +0300 |
---|---|---|
committer | Felipe Contreras <felipe.contreras@gmail.com> | 2010-06-14 03:33:28 +0300 |
commit | c7c839eb89e3c4f288a79ed1812128fd2e4ed0af (patch) | |
tree | c3b43861c2692bdc404e3a8986df7b8ae96a3616 | |
parent | c030eccc7f613e736852ac2d8c9d1120fca67862 (diff) |
Add pn_buffer
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | pn_buffer.c | 70 | ||||
-rw-r--r-- | pn_buffer.h | 21 |
3 files changed, 92 insertions, 1 deletions
@@ -19,7 +19,7 @@ endif test: test.o pn_core.o pn_session.o pn_node.o \ pn_trans.o pn_cmd_node.o pn_ns.o \ - pn_log.o pn_printf.o + pn_log.o pn_printf.o pn_buffer.o test: override CFLAGS += $(GIO_CFLAGS) test: override LIBS += $(GIO_LIBS) diff --git a/pn_buffer.c b/pn_buffer.c new file mode 100644 index 0000000..7b3310f --- /dev/null +++ b/pn_buffer.c @@ -0,0 +1,70 @@ +#include "pn_buffer.h" + +#include <glib.h> + +#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; + return buffer; +} + +struct pn_buffer * +pn_buffer_new_memdup(const void *data, + size_t size) +{ + struct pn_buffer *buffer; + + buffer = g_malloc(sizeof(*buffer)); + buffer->size = buffer->len = size; + buffer->data = buffer->alloc_data = g_memdup(data, size); + + return buffer; +} + +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); +} diff --git a/pn_buffer.h b/pn_buffer.h new file mode 100644 index 0000000..f900e7f --- /dev/null +++ b/pn_buffer.h @@ -0,0 +1,21 @@ +#ifndef PN_BUFFER_H +#define PN_BUFFER_H + +#include <stddef.h> + +struct pn_buffer { + void *data; + void *alloc_data; + size_t size; + size_t len; +}; + +struct pn_buffer *pn_buffer_new(void); +struct pn_buffer *pn_buffer_new_and_alloc(size_t size); +struct pn_buffer *pn_buffer_new_memdup(const void *data, size_t size); +void pn_buffer_free(struct pn_buffer *buffer); +void pn_buffer_resize(struct pn_buffer *buffer, size_t new_size); +char *pn_buffer_to_string(struct pn_buffer *buffer); +void pn_buffer_prepare(struct pn_buffer *buffer, size_t extra_size); + +#endif /* PN_BUFFER_H */ |