aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buffer.c11
-rw-r--r--buffer.h2
-rw-r--r--register.c4
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(&reg->buf, len+1))
+ if (len == SIZE_MAX || !buffer_reserve(&reg->buf, len+1))
return false;
reg->buf.len = text_bytes_get(txt, range->start, len, reg->buf.data);
return buffer_append(&reg->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(&reg->buf, reg->buf.len + len + 1))
+ if (!buffer_grow(&reg->buf, len+1))
return false;
if (reg->buf.len > 0 && reg->buf.data[reg->buf.len-1] == '\0')
reg->buf.len--;