X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=buffer.c;fp=buffer.c;h=847f202002a680fa2fabcae3f1ccd9000222ee48;hb=8a872b1a9ec12dd44292603137c41f1b29b9f756;hp=4e41b3cf796cff903739478ce753621a66d9daa6;hpb=61c2720436d78e1ebd68def62cbdf67c5c21a7e9;p=apps%2Fpfixtools.git diff --git a/buffer.c b/buffer.c index 4e41b3c..847f202 100644 --- a/buffer.c +++ b/buffer.c @@ -37,20 +37,40 @@ #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 pos; + int len, available; + va_list ap2; + + va_copy(ap2, ap); + + pos = buf->len; + available = buf->size - pos; + + len = vsnprintf(buf->data + pos, available, fmt, ap); + if (len >= available) { + buffer_resize(buf, buf->len + len); + len = vsnprintf(buf->data + pos, available, fmt, ap2); } + buf->len = pos + 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;