diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2017-02-20 13:32:13 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2017-02-20 13:32:13 +0100 |
| commit | a284af94d449046116e8c40d1adfac6091a6ffb5 (patch) | |
| tree | 51e882b09209b035ac2bc122d00607f89bb3690c | |
| parent | 99e17811ecb0ee355a8d5aaeab28276892060e1c (diff) | |
| download | vis-a284af94d449046116e8c40d1adfac6091a6ffb5.tar.gz vis-a284af94d449046116e8c40d1adfac6091a6ffb5.tar.xz | |
buffer: add buffer_grow
| -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--; |
