X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-lib%2Fbuffer.c;h=4cc4dc5730f474dc0d5f0f1d163bbd7d93165a67;hp=b442721d480d76d04fe6fa0ea038d7250ea6b7b1;hb=6d838d9aef36d95fa439b3f7cc06d4e81c8581bd;hpb=388148b48fedd8007192a5f94cf0bad89c65227b diff --git a/lib-lib/buffer.c b/lib-lib/buffer.c index b442721..4cc4dc5 100644 --- a/lib-lib/buffer.c +++ b/lib-lib/buffer.c @@ -28,20 +28,56 @@ #include "lib-lib.h" -#define BUFSIZ_INCREMENT 1024 +void buffer_splice(buffer_t *buf, ssize_t pos, ssize_t len, + const void *data, ssize_t dlen) +{ + if (dlen >= len) + buffer_extend(buf, dlen - len); + if (len >= buf->len) + len = buf->len; + memmove(buf->data + pos + dlen, + buf->data + pos + len, + buf->len - pos - len); + memcpy(buf->data + pos, data, dlen); + buffer_setlen(buf, buf->len + dlen - len); +} -void buffer_resize(buffer_t *buf, ssize_t newsize) +void buffer_consume_upto(buffer_t *buf, const char *s) { - 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); - } + assert (buf->data <= s && s <= buf->data + buf->len); + buffer_splice(buf, 0, s - buf->data, NULL, 0); } +ssize_t buffer_addvf(buffer_t *buf, const char *fmt, va_list args) +{ + ssize_t len; + va_list ap; + va_copy(ap, args); + buffer_ensure(buf, BUFSIZ); + len = vsnprintf(buf->data + buf->len, buf->size - buf->len, fmt, args); + if (len < 0) + return len; + if (len >= buf->size - buf->len) { + buffer_ensure(buf, len); + vsnprintf(buf->data + buf->len, buf->size - buf->len, fmt, ap); + } + buf->len += len; + buf->data[buf->len] = '\0'; + return len; +} + +ssize_t buffer_addf(buffer_t *buf, const char *fmt, ...) +{ + ssize_t res; + va_list args; + va_start(args, fmt); + res = buffer_addvf(buf, fmt, args); + va_end(args); + return res; +} /****** LEGACY BUFFERS *******/ /*