#include #include #include #include int vbufprintf(struct print_buf *buf, const char *format, va_list ap) { va_list ap2; int rv; va_copy(ap2, ap); rv = vsnprintf(NULL, 0, format, ap); /* >= to make sure we have space for terminating null */ if (rv + buf->len >= buf->size) { size_t newsize = rv + buf->len + BUFPAD; char *newbuf; newbuf = realloc(buf->buf, newsize); if (!newbuf) return -1; buf->buf = newbuf; buf->size = newsize; } rv = vsnprintf(buf->buf + buf->len, buf->size - buf->len, format, ap2); buf->len += rv; return rv; } int bufprintf(struct print_buf *buf, const char *format, ...) { va_list ap; int rv; va_start(ap, format); rv = vbufprintf(buf, format, ap); va_end(ap); return rv; }