From a284af94d449046116e8c40d1adfac6091a6ffb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Mon, 20 Feb 2017 13:32:13 +0100 Subject: buffer: add buffer_grow --- buffer.c | 11 +++++++++-- buffer.h | 2 ++ register.c | 4 ++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/buffer.c b/buffer.c index ca63265..a3403fd 100644 --- a/buffer.c +++ b/buffer.c @@ -29,6 +29,13 @@ bool buffer_reserve(Buffer *buf, size_t size) { return true; } +bool buffer_grow(Buffer *buf, size_t len) { + size_t size; + if (!addu(buf->len, len, &size)) + return false; + return buffer_reserve(buf, size); +} + bool buffer_terminate(Buffer *buf) { return !buf->data || buf->len == 0 || buf->data[buf->len-1] == '\0' || buffer_append(buf, "\0", 1); @@ -72,7 +79,7 @@ bool buffer_insert(Buffer *buf, size_t pos, const void *data, size_t len) { return false; if (len == 0) return true; - if (!buffer_reserve(buf, buf->len + len)) + if (!buffer_grow(buf, len)) return false; size_t move = buf->len - pos; if (move > 0) @@ -115,7 +122,7 @@ static bool buffer_vappendf(Buffer *buf, const char *fmt, va_list ap) { va_list ap_save; va_copy(ap_save, ap); int len = vsnprintf(NULL, 0, fmt, ap); - if (len == -1 || !buffer_reserve(buf, buf->len+len+1)) { + if (len == -1 || !buffer_grow(buf, len+1)) { va_end(ap_save); return false; } diff --git a/buffer.h b/buffer.h index 759217a..1730b05 100644 --- a/buffer.h +++ b/buffer.h @@ -20,6 +20,8 @@ void buffer_release(Buffer*); void buffer_clear(Buffer*); /* reserve space to store at least size bytes in this buffer.*/ bool buffer_reserve(Buffer*, size_t size); +/* reserve space for at least `len` more bytes in this buffer */ +bool buffer_grow(Buffer*, size_t len); /* if buffer is not empty, make sure it is NUL terminated */ bool buffer_terminate(Buffer*); /* replace buffer content with given data, growing the buffer if needed */ diff --git a/register.c b/register.c index 2e630b0..69409c1 100644 --- a/register.c +++ b/register.c @@ -61,7 +61,7 @@ bool register_put_range(Vis *vis, Register *reg, Text *txt, Filerange *range) { case REGISTER_NORMAL: { size_t len = text_range_size(range); - if (!buffer_reserve(®->buf, len+1)) + if (len == SIZE_MAX || !buffer_reserve(®->buf, len+1)) return false; reg->buf.len = text_bytes_get(txt, range->start, len, reg->buf.data); return buffer_append(®->buf, "\0", 1); @@ -91,7 +91,7 @@ bool register_append_range(Register *reg, Text *txt, Filerange *range) { case REGISTER_NORMAL: { size_t len = text_range_size(range); - if (!buffer_reserve(®->buf, reg->buf.len + len + 1)) + if (!buffer_grow(®->buf, len+1)) return false; if (reg->buf.len > 0 && reg->buf.data[reg->buf.len-1] == '\0') reg->buf.len--; -- cgit v1.2.3