implement [v]swprintf
[musl] / src / stdio / vswprintf.c
1 #include "stdio_impl.h"
2
3 struct cookie {
4         wchar_t *ws;
5         size_t l;
6 };
7
8 static size_t sw_write(FILE *f, const unsigned char *s, size_t l)
9 {
10         size_t l0 = l;
11         int i = 0;
12         struct cookie *c = f->cookie;
13         while (c->l && l && (i=mbtowc(c->ws, s, l))>=0) {
14                 s+=i;
15                 l-=i;
16                 c->l--;
17                 c->ws++;
18         }
19         *c->ws = 0;
20         return i<0 ? i : l0;
21 }
22
23 int vswprintf(wchar_t *s, size_t n, const wchar_t *fmt, va_list ap)
24 {
25         int r;
26         FILE f;
27         unsigned char buf[256];
28         struct cookie c = { s, n-1 };
29
30         memset(&f, 0, sizeof(FILE));
31         f.lbf = EOF;
32         f.write = sw_write;
33         f.buf_size = sizeof buf;
34         f.buf = buf;
35         f.owner = -1;
36         f.cookie = &c;
37         if (!n) {
38                 return -1;
39         } else if (n > INT_MAX) {
40                 errno = EOVERFLOW;
41                 return -1;
42         }
43         r = vfwprintf(&f, fmt, ap);
44         __oflow(&f);
45         return r>=n ? -1 : r;
46 }