diff options
| -rw-r--r-- | buffer.c | 11 | ||||
| -rw-r--r-- | buffer.h | 2 | ||||
| -rw-r--r-- | register.c | 4 |
3 files changed, 13 insertions, 4 deletions
@@ -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; } @@ -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 */ @@ -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--; |
