master
1#include "stdio_impl.h"
2#include <wchar.h>
3
4static 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
27int 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}
37
38weak_alias(vswscanf,__isoc99_vswscanf);