summaryrefslogtreecommitdiff
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
parentc030eccc7f613e736852ac2d8c9d1120fca67862 (diff)
Add pn_buffer
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
-rw-r--r--Makefile2
-rw-r--r--pn_buffer.c70
-rw-r--r--pn_buffer.h21
3 files changed, 92 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 4978e49..6decf93 100644
--- a/Makefile
+++ b/Makefile
@@ -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 */