aboutsummaryrefslogtreecommitdiff
path: root/buffer.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-12-20 19:02:54 +0100
committerMarc André Tanner <mat@brain-dump.org>2016-12-20 22:08:42 +0100
commit92c90987dbf2b96c8e8dbe6af53b1352d15ca4d9 (patch)
tree8eb6f0e7822018f6a9bb7f42c4733fbc91c9b898 /buffer.c
parentc61b642318cd428b188ffb82ec90a7d912423067 (diff)
downloadvis-92c90987dbf2b96c8e8dbe6af53b1352d15ca4d9.tar.gz
vis-92c90987dbf2b96c8e8dbe6af53b1352d15ca4d9.tar.xz
buffer: implement buffer_appendf to append formatted content
Diffstat (limited to 'buffer.c')
-rw-r--r--buffer.c36
1 files changed, 23 insertions, 13 deletions
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')