From b8456fa2615480fa242c6992ca89481a8370fe5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Thu, 18 Dec 2014 13:50:19 +0100 Subject: Macro support At some point this should be optimized further at the moment there is some 20 byte overhead for each entered key. --- buffer.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 buffer.c (limited to 'buffer.c') diff --git a/buffer.c b/buffer.c new file mode 100644 index 0000000..9722101 --- /dev/null +++ b/buffer.c @@ -0,0 +1,54 @@ +#include +#include + +#include "buffer.h" +#include "util.h" + +#define BUF_SIZE 1024 + +bool buffer_alloc(Buffer *buf, size_t size) { + if (size < BUF_SIZE) + size = BUF_SIZE; + if (buf->size < size) { + if (buf->size > 0) + size *= 2; + buf->data = realloc(buf->data, size); + if (!buf->data) { + buf->size = 0; + buf->len = 0; + return false; + } + buf->size = size; + } + return true; +} + +void buffer_truncate(Buffer *buf) { + buf->len = 0; +} + +void buffer_free(Buffer *buf) { + if (!buf) + return; + free(buf->data); + buf->data = NULL; + buf->len = 0; + buf->size = 0; +} + +bool buffer_put(Buffer *buf, void *data, size_t len) { + if (!buffer_alloc(buf, len)) + return false; + memcpy(buf->data, data, len); + buf->len = len; + return true; +} + +bool buffer_append(Buffer *buf, void *data, size_t len) { + size_t rem = buf->size - buf->len; + if (len > rem && !buffer_alloc(buf, buf->size + len - rem)) + return false; + memcpy(buf->data + buf->len, data, len); + buf->len += len; + return true; +} -- cgit v1.2.3