7a2f7c7a98705c91a462c0bfbb3a029ae7d436f8
[musl] / src / stdio / vswscanf.c
1 #include "stdio_impl.h"
2 #include <wchar.h>
3
4 static size_t wstring_read(FILE *f, unsigned char *buf, size_t len)
5 {
6         const wchar_t *src = f->cookie;
7         size_t k;
8
9         if (!src) return 0;
10
11         k = wcsrtombs((void *)f->buf, &src, f->buf_size, 0);
12         if (k==(size_t)-1) {
13                 f->rpos = f->rend = 0;
14                 return 0;
15         }
16
17         f->rpos = f->buf;
18         f->rend = f->buf + k;
19         f->cookie = (void *)src;
20
21         if (!len || !k) return 0;
22
23         *buf = *f->rpos++;
24         return 1;
25 }
26
27 int vswscanf(const wchar_t *restrict s, const wchar_t *restrict fmt, va_list ap)
28 {
29         unsigned char buf[256];
30         FILE f = {
31                 .buf = buf, .buf_size = sizeof buf,
32                 .cookie = (void *)s,
33                 .read = wstring_read, .lock = -1
34         };
35         return vfwscanf(&f, fmt, ap);
36 }