1 #include <stdarg.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <bufprintf.h>
5
vbufprintf(struct print_buf * buf,const char * format,va_list ap)6 int vbufprintf(struct print_buf *buf, const char *format, va_list ap)
7 {
8 va_list ap2;
9 int rv;
10
11 va_copy(ap2, ap);
12 rv = vsnprintf(NULL, 0, format, ap);
13
14 /* >= to make sure we have space for terminating null */
15 if (rv + buf->len >= buf->size) {
16 size_t newsize = rv + buf->len + BUFPAD;
17 char *newbuf;
18
19 newbuf = realloc(buf->buf, newsize);
20 if (!newbuf) {
21 rv = -1;
22 goto bail;
23 }
24
25 buf->buf = newbuf;
26 buf->size = newsize;
27 }
28
29 rv = vsnprintf(buf->buf + buf->len, buf->size - buf->len, format, ap2);
30 buf->len += rv;
31 bail:
32 va_end(ap2);
33 return rv;
34 }
35
bufprintf(struct print_buf * buf,const char * format,...)36 int bufprintf(struct print_buf *buf, const char *format, ...)
37 {
38 va_list ap;
39 int rv;
40
41 va_start(ap, format);
42 rv = vbufprintf(buf, format, ap);
43 va_end(ap);
44 return rv;
45 }
46