diff options
| -rw-r--r-- | buffer.c | 36 | ||||
| -rw-r--r-- | buffer.h | 5 |
2 files changed, 26 insertions, 15 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') @@ -42,9 +42,10 @@ bool buffer_append0(Buffer*, const char *data); bool buffer_prepend(Buffer*, const void *data, size_t len); /* prepend NUL-terminated data */ bool buffer_prepend0(Buffer*, const char *data); - +/* set formatted buffer content, ensures NUL termination on success */ bool buffer_printf(Buffer*, const char *fmt, ...); -bool buffer_vprintf(Buffer*, const char *fmt, va_list); +/* append formatted buffer content, ensures NUL termination on success */ +bool buffer_appendf(Buffer*, const char *fmt, ...); /* return length of a buffer without trailing NUL byte */ size_t buffer_length0(Buffer*); /* return length of a buffer including possible NUL byte */ |
