summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevin Torres <devin@devintorr.es>2014-05-13 09:33:44 -0500
committerDevin Torres <devin@devintorr.es>2014-05-13 09:33:44 -0500
commitcfea09a7f08ab6b2d4749ce43c20657c15e29111 (patch)
treee8b16494083d428d6b9df0e8d40c3ba11e2c0204
parentaf11a53df48eba936f0f24593fa1fa6aac0ef4d7 (diff)
parentc4394a70a01c0724edb8eecacca565bef73b3f7e (diff)
downloadrust-hoedown-cfea09a7f08ab6b2d4749ce43c20657c15e29111.tar.gz
Merge pull request #76 from jmendeth/memory-allocation
Add custom memory functions
-rw-r--r--src/buffer.c40
-rw-r--r--src/buffer.h16
2 files changed, 44 insertions, 12 deletions
diff --git a/src/buffer.c b/src/buffer.c
index dc16220..1ab9eac 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -5,18 +5,32 @@
#include <string.h>
#include <assert.h>
+/* hoedown_buffer_init: initialize a buffer with custom allocators */
+void
+hoedown_buffer_init(
+ hoedown_buffer *buf,
+ size_t unit,
+ hoedown_realloc_callback data_realloc,
+ hoedown_free_callback data_free,
+ hoedown_free_callback buffer_free)
+{
+ if (!buf)
+ return;
+
+ buf->data = NULL;
+ buf->size = buf->asize = 0;
+ buf->unit = unit;
+ buf->data_realloc = data_realloc;
+ buf->data_free = data_free;
+ buf->buffer_free = buffer_free;
+}
+
/* hoedown_buffer_new: allocation of a new buffer */
hoedown_buffer *
hoedown_buffer_new(size_t unit)
{
- hoedown_buffer *ret;
- ret = malloc(sizeof (hoedown_buffer));
-
- if (ret) {
- ret->data = 0;
- ret->size = ret->asize = 0;
- ret->unit = unit;
- }
+ hoedown_buffer *ret = malloc(sizeof (hoedown_buffer));
+ hoedown_buffer_init(ret, unit, realloc, free, free);
return ret;
}
@@ -27,8 +41,10 @@ hoedown_buffer_free(hoedown_buffer *buf)
if (!buf)
return;
- free(buf->data);
- free(buf);
+ buf->data_free(buf->data);
+
+ if (buf->buffer_free)
+ buf->buffer_free(buf);
}
/* hoedown_buffer_reset: frees internal data of the buffer */
@@ -38,7 +54,7 @@ hoedown_buffer_reset(hoedown_buffer *buf)
if (!buf)
return;
- free(buf->data);
+ buf->data_free(buf->data);
buf->data = NULL;
buf->size = buf->asize = 0;
}
@@ -59,7 +75,7 @@ hoedown_buffer_grow(hoedown_buffer *buf, size_t neosz)
while (neoasz < neosz)
neoasz += buf->unit;
- neodata = realloc(buf->data, neoasz);
+ neodata = buf->data_realloc(buf->data, neoasz);
if (!neodata)
return HOEDOWN_BUF_ENOMEM;
diff --git a/src/buffer.h b/src/buffer.h
index b17c7f0..8ba3683 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -21,12 +21,19 @@ typedef enum {
HOEDOWN_BUF_ENOMEM = -1
} hoedown_buferror_t;
+typedef void *(*hoedown_realloc_callback)(void *, size_t);
+typedef void (*hoedown_free_callback)(void *);
+
/* hoedown_buffer: character array buffer */
struct hoedown_buffer {
uint8_t *data; /* actual character data */
size_t size; /* size of the string */
size_t asize; /* allocated size (0 = volatile buffer) */
size_t unit; /* reallocation unit size (0 = read-only buffer) */
+
+ hoedown_realloc_callback data_realloc;
+ hoedown_free_callback data_free;
+ hoedown_free_callback buffer_free;
};
typedef struct hoedown_buffer hoedown_buffer;
@@ -35,6 +42,15 @@ typedef struct hoedown_buffer hoedown_buffer;
#define HOEDOWN_BUFPUTSL(output, literal) \
hoedown_buffer_put(output, literal, sizeof(literal) - 1)
+/* hoedown_buffer_init: initialize a buffer with custom allocators */
+void hoedown_buffer_init(
+ hoedown_buffer *buffer,
+ size_t unit,
+ hoedown_realloc_callback data_realloc,
+ hoedown_free_callback data_free,
+ hoedown_free_callback buffer_free
+);
+
/* hoedown_buffer_new: allocation of a new buffer */
hoedown_buffer *hoedown_buffer_new(size_t unit) __attribute__ ((malloc));