diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2016-12-20 19:02:54 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2016-12-20 22:08:42 +0100 |
| commit | 92c90987dbf2b96c8e8dbe6af53b1352d15ca4d9 (patch) | |
| tree | 8eb6f0e7822018f6a9bb7f42c4733fbc91c9b898 /buffer.c | |
| parent | c61b642318cd428b188ffb82ec90a7d912423067 (diff) | |
| download | vis-92c90987dbf2b96c8e8dbe6af53b1352d15ca4d9.tar.gz vis-92c90987dbf2b96c8e8dbe6af53b1352d15ca4d9.tar.xz | |
buffer: implement buffer_appendf to append formatted content
Diffstat (limited to 'buffer.c')
| -rw-r--r-- | buffer.c | 36 |
1 files changed, 23 insertions, 13 deletions
@@ -109,29 +109,39 @@ bool buffer_prepend0(Buffer *buf, const char *data) { return buffer_prepend(buf, data, strlen(data) + (buf->len == 0)); } -bool buffer_printf(Buffer *buf, const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - bool ret = buffer_vprintf(buf, fmt, ap); - va_end(ap); - return ret; -} - -bool buffer_vprintf(Buffer *buf, const char *fmt, va_list ap) { +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_grow(buf, len+1)) { + if (len == -1 || !buffer_grow(buf, buf->len+len+1)) { va_end(ap_save); return false; } - bool ret = vsnprintf(buf->data, len+1, fmt, ap_save) == len; - if (ret) - buf->len = len+1; + size_t nul = (buf->len > 0 && buf->data[buf->len-1] == '\0') ? 1 : 0; + buf->len -= nul; + bool ret = vsnprintf(buf->data+buf->len, len+1, fmt, ap_save) == len; + buf->len += ret ? (size_t)len+1 : nul; va_end(ap_save); return ret; } +bool buffer_appendf(Buffer *buf, const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + bool ret = buffer_vappendf(buf, fmt, ap); + va_end(ap); + return ret; +} + +bool buffer_printf(Buffer *buf, const char *fmt, ...) { + buffer_clear(buf); + va_list ap; + va_start(ap, fmt); + bool ret = buffer_vappendf(buf, fmt, ap); + va_end(ap); + return ret; +} + size_t buffer_length0(Buffer *buf) { size_t len = buf->len; if (len > 0 && buf->data[len-1] == '\0') |
