simplify and optimize FILE lock handling
[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         f.lock = -1;
21         if (n > INT_MAX) {
22                 errno = EOVERFLOW;
23                 return -1;
24         } else if (n > 0) {
25                 if (n > (char *)0+SIZE_MAX-s) n = (char *)0+SIZE_MAX-s;
26                 f.wpos = s;
27                 f.wbase = f.wend = s+n-1;
28                 f.wstop = f.wend - 1;
29         }
30         r = vfprintf(&f, fmt, ap);
31         /* wpos points just after last byte written, or to s+n-1 (wbase) */
32         *f.wpos = 0;
33         return r;
34 }