From 92c90987dbf2b96c8e8dbe6af53b1352d15ca4d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Tue, 20 Dec 2016 19:02:54 +0100 Subject: buffer: implement buffer_appendf to append formatted content --- buffer.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) (limited to 'buffer.c') diff --git a/buffer.c b/buffer.c index 8794e20..ddc6dba 100644 --- a/buffer.c +++ b/buffer.c @@ -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') -- cgit v1.2.3