From ff0fb0e5a5ef0da28d74d423e2c8ca534e549a4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Sat, 16 May 2015 15:28:09 +0200 Subject: Cleanup general purpose buffer API Introduce buffer_init to initialize a stack allocated buffer. Rename buffer_{alloc,free} functions because they do something different than the usual convention. They operate on the underlying buffer data but do not allocate/free an actual Buffer struct. --- buffer.c | 16 +++++++++------- buffer.h | 19 +++++++++++++------ editor.c | 4 ++-- macro.h | 2 +- register.c | 8 ++++---- register.h | 2 +- 6 files changed, 30 insertions(+), 21 deletions(-) diff --git a/buffer.c b/buffer.c index 6763676..1a3c7db 100644 --- a/buffer.c +++ b/buffer.c @@ -6,7 +6,11 @@ #define BUF_SIZE 1024 -bool buffer_alloc(Buffer *buf, size_t size) { +void buffer_init(Buffer *buf) { + memset(buf, 0, sizeof *buf); +} + +bool buffer_grow(Buffer *buf, size_t size) { if (size < BUF_SIZE) size = BUF_SIZE; if (buf->size < size) { @@ -25,17 +29,15 @@ void buffer_truncate(Buffer *buf) { buf->len = 0; } -void buffer_free(Buffer *buf) { +void buffer_release(Buffer *buf) { if (!buf) return; free(buf->data); - buf->data = NULL; - buf->len = 0; - buf->size = 0; + buffer_init(buf); } bool buffer_put(Buffer *buf, const void *data, size_t len) { - if (!buffer_alloc(buf, len)) + if (!buffer_grow(buf, len)) return false; memcpy(buf->data, data, len); buf->len = len; @@ -44,7 +46,7 @@ bool buffer_put(Buffer *buf, const void *data, size_t len) { bool buffer_append(Buffer *buf, const void *data, size_t len) { size_t rem = buf->size - buf->len; - if (len > rem && !buffer_alloc(buf, buf->size + len - rem)) + if (len > rem && !buffer_grow(buf, buf->size + len - rem)) return false; memcpy(buf->data + buf->len, data, len); buf->len += len; diff --git a/buffer.h b/buffer.h index fc509b8..ef5a537 100644 --- a/buffer.h +++ b/buffer.h @@ -5,16 +5,23 @@ #include #include "text.h" -typedef struct { +typedef struct { /* a dynamically growing buffer storing arbitrary data */ char *data; /* NULL if empty */ size_t len; /* current length of data */ size_t size; /* maximal capacity of the buffer */ } Buffer; -void buffer_free(Buffer *buf); -bool buffer_alloc(Buffer *buf, size_t size); -void buffer_truncate(Buffer *buf); -bool buffer_put(Buffer *buf, const void *data, size_t len); -bool buffer_append(Buffer *buf, const void *data, size_t len); +/* initalize a (stack allocated) Buffer insteance */ +void buffer_init(Buffer*); +/* relase/free all data stored in this buffer, reset size to zero */ +void buffer_release(Buffer*); +/* reserve space to store at least size bytes in this buffer.*/ +bool buffer_grow(Buffer*, size_t size); +/* truncate buffer, but keep associated memory region for further data */ +void buffer_truncate(Buffer*); +/* replace buffer content with given data, growing the buffer if needed */ +bool buffer_put(Buffer*, const void *data, size_t len); +/* append futher content to the end of the buffer data */ +bool buffer_append(Buffer*, const void *data, size_t len); #endif diff --git a/editor.c b/editor.c index 499e87a..4cb5e41 100644 --- a/editor.c +++ b/editor.c @@ -410,12 +410,12 @@ void editor_free(Editor *ed) { window_free(ed->prompt); text_regex_free(ed->search_pattern); for (int i = 0; i < REG_LAST; i++) - register_free(&ed->registers[i]); + register_release(&ed->registers[i]); editor_syntax_unload(ed); ed->ui->free(ed->ui); map_free(ed->cmds); map_free(ed->options); - buffer_free(&ed->buffer_repeat); + buffer_release(&ed->buffer_repeat); free(ed); } diff --git a/macro.h b/macro.h index c605cdf..c91fcca 100644 --- a/macro.h +++ b/macro.h @@ -4,7 +4,7 @@ #include "buffer.h" typedef Buffer Macro; -#define macro_free buffer_free +#define macro_release buffer_release #define macro_reset buffer_truncate #define macro_append buffer_append diff --git a/register.c b/register.c index cc25414..b1a4453 100644 --- a/register.c +++ b/register.c @@ -6,13 +6,13 @@ #include "text.h" #include "util.h" -void register_free(Register *reg) { - buffer_free((Buffer*)reg); +void register_release(Register *reg) { + buffer_release((Buffer*)reg); } bool register_put(Register *reg, Text *txt, Filerange *range) { size_t len = range->end - range->start; - if (!buffer_alloc((Buffer*)reg, len)) + if (!buffer_grow((Buffer*)reg, len)) return false; reg->len = text_bytes_get(txt, range->start, len, reg->data); return true; @@ -21,7 +21,7 @@ bool register_put(Register *reg, Text *txt, Filerange *range) { bool register_append(Register *reg, Text *txt, Filerange *range) { size_t rem = reg->size - reg->len; size_t len = range->end - range->start; - if (len > rem && !buffer_alloc((Buffer*)reg, reg->size + len - rem)) + if (len > rem && !buffer_grow((Buffer*)reg, reg->size + len - rem)) return false; reg->len += text_bytes_get(txt, range->start, len, reg->data + reg->len); return true; diff --git a/register.h b/register.h index 02890e8..5909c9a 100644 --- a/register.h +++ b/register.h @@ -13,7 +13,7 @@ typedef struct { bool linewise; /* place register content on a new line when inserting? */ } Register; -void register_free(Register *reg); +void register_release(Register *reg); bool register_put(Register *reg, Text *txt, Filerange *range); bool register_append(Register *reg, Text *txt, Filerange *range); -- cgit v1.2.3