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 | |
parent | eb79f4e969c1640f0d199133415e1a99fa25567e (diff) | |
download | syslinux-95e239ee7700114c9ca6a1765d9bdd74241a1eb8.tar.gz |
bufprintf: Adding bufprintf
-rw-r--r-- | com32/include/bufprintf.h | 10 | ||||
-rw-r--r-- | com32/lib/Makefile | 1 | ||||
-rw-r--r-- | com32/lib/bufprintf.c | 41 |
3 files changed, 52 insertions, 0 deletions
diff --git a/com32/include/bufprintf.h b/com32/include/bufprintf.h new file mode 100644 index 00000000..5cbeaa4b --- /dev/null +++ b/com32/include/bufprintf.h @@ -0,0 +1,10 @@ +#define BUFPAD 4096 + +struct print_buf { + char *buf; + size_t len; + size_t size; +}; + +int vbufprintf(struct print_buf *buf, const char *format, va_list ap); +int bufprintf(struct print_buf *buf, const char *format, ...); diff --git a/com32/lib/Makefile b/com32/lib/Makefile index d65976be..0614cf3c 100644 --- a/com32/lib/Makefile +++ b/com32/lib/Makefile @@ -29,6 +29,7 @@ LIBOBJS = \ vsscanf.o zalloc.o \ skipspace.o \ chrreplace.o \ + bufprintf.o \ \ lmalloc.o lstrdup.o \ \ 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; +} |