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