initial check-in, version 0.5.0
[musl] / src / stdio / vsnprintf.c
1 #include "stdio_impl.h"
2
3 static size_t sn_write(FILE *f, const unsigned char *s, size_t l)
4 {
5         /* pretend to succeed, but discard data */
6         return l;
7 }
8
9 int vsnprintf(char *s, size_t n, const char *fmt, va_list ap)
10 {
11         int r;
12         FILE f;
13         unsigned char buf[1];
14
15         memset(&f, 0, sizeof(FILE));
16         f.lbf = EOF;
17         f.write = sn_write;
18         f.buf_size = 1;
19         f.buf = buf;
20         if (n > INT_MAX) {
21                 errno = EOVERFLOW;
22                 return -1;
23         } else if (n > 0) {
24                 if (n > (char *)0+SIZE_MAX-s) n = (char *)0+SIZE_MAX-s;
25                 f.wpos = s;
26                 f.wbase = f.wend = s+n-1;
27                 f.wstop = f.wend - 1;
28         }
29         r = vfprintf(&f, fmt, ap);
30         /* wpos points just after last byte written, or to s+n-1 (wbase) */
31         *f.wpos = 0;
32         return r;
33 }