summaryrefslogtreecommitdiff
path: root/pn_buffer.c
diff options
context:
space:
mode:
authorFelipe Contreras <felipe.contreras@gmail.com>2010-06-13 21:22:59 +0300
committerFelipe Contreras <felipe.contreras@gmail.com>2010-06-14 03:33:28 +0300
commitc7c839eb89e3c4f288a79ed1812128fd2e4ed0af (patch)
treec3b43861c2692bdc404e3a8986df7b8ae96a3616 /pn_buffer.c
parentc030eccc7f613e736852ac2d8c9d1120fca67862 (diff)
Add pn_buffer
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Diffstat (limited to 'pn_buffer.c')
-rw-r--r--pn_buffer.c70
1 files changed, 70 insertions, 0 deletions
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);
+}