X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-lib%2Fbuffer.c;h=f27dc5102d381aec71aa2a6c24da49afd6294bb4;hp=e1327c8e04463e58b34ae232a4a17ed84bdb9435;hb=db3bd72d8b48f1f9b49899da081ffbec4ce2c1c6;hpb=230399f9632c37b66c1c117a17e8327eae6b3235 diff --git a/lib-lib/buffer.c b/lib-lib/buffer.c index e1327c8..f27dc51 100644 --- a/lib-lib/buffer.c +++ b/lib-lib/buffer.c @@ -26,15 +26,51 @@ * please see the file GPL in the top level source directory. */ -#include -#include -#include +#include "lib-lib.h" -#include "mem.h" -#include "str.h" -#include "ascii.h" -#include "buffer.h" -#include "file.h" +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); + 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); +} + +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 *******/ /* * Creates and initializes a BUFFER*. If passed an existing BUFFER*,