diff options
author | Erwan Velu <erwanaliasr1@gmail.com> | 2011-03-19 21:02:53 +0100 |
---|---|---|
committer | Erwan Velu <erwanaliasr1@gmail.com> | 2011-03-19 21:02:53 +0100 |
commit | 95e239ee7700114c9ca6a1765d9bdd74241a1eb8 (patch) | |
tree | c330d44efc25d54522197c099d5a107b2a35fb6f /com32/lib/bufprintf.c | |
parent | eb79f4e969c1640f0d199133415e1a99fa25567e (diff) | |
download | syslinux-95e239ee7700114c9ca6a1765d9bdd74241a1eb8.tar.gz |
bufprintf: Adding bufprintf
Diffstat (limited to 'com32/lib/bufprintf.c')
-rw-r--r-- | com32/lib/bufprintf.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/com32/lib/bufprintf.c b/com32/lib/bufprintf.c new file mode 100644 index 00000000..939bcec3 --- /dev/null +++ b/com32/lib/bufprintf.c @@ -0,0 +1,41 @@ +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <bufprintf.h> + +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; +} |