X-Git-Url: http://git.madism.org/?a=blobdiff_plain;ds=sidebyside;f=buffer.c;h=81855fd9c0a53c2ce1387bf246415d5258313c95;hb=063fa644df8a1bc2f0d76027dae5d7d0d8ce4f47;hp=4e41b3cf796cff903739478ce753621a66d9daa6;hpb=9a6e88e7139970a218bbcd027a1ef461f06c8893;p=apps%2Fpfixtools.git diff --git a/buffer.c b/buffer.c index 4e41b3c..81855fd 100644 --- a/buffer.c +++ b/buffer.c @@ -37,20 +37,37 @@ #include #include +#include "mem.h" #include "buffer.h" #define BUFSIZ_INCREMENT 256 void buffer_resize(buffer_t *buf, ssize_t newsize) { - if (newsize >= buf->size) { - /* rounds newsize to the 1024 multiple just after newsize+1 */ - newsize = (newsize + BUFSIZ_INCREMENT) & ~(BUFSIZ_INCREMENT - 1); - p_realloc(&buf->data, newsize); + p_allocgrow(&buf->data, newsize + 1, &buf->size); +} + +ssize_t buffer_addvf(buffer_t *buf, const char *fmt, va_list ap) +{ + ssize_t len, avail = buf->size - buf->len; + va_list ap2; + + va_copy(ap2, ap); + + len = vsnprintf(buf->data + buf->len, avail, fmt, ap); + if (len >= avail) { + buffer_resize(buf, buf->len + len); + avail = buf->size - buf->len; + len = vsnprintf(buf->data + buf->len, avail, fmt, ap2); } + buf->len += len; + buf->data[buf->len] = '\0'; + va_end(ap2); + return len; } -void buffer_consume(buffer_t *buf, ssize_t len) { +void buffer_consume(buffer_t *buf, ssize_t len) +{ if (len <= 0) return;