• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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