1570af302Sopenharmony_ci#include "stdio_impl.h"
2570af302Sopenharmony_ci#include <wchar.h>
3570af302Sopenharmony_ci
4570af302Sopenharmony_cistatic size_t wstring_read(FILE *f, unsigned char *buf, size_t len)
5570af302Sopenharmony_ci{
6570af302Sopenharmony_ci	const wchar_t *src = f->cookie;
7570af302Sopenharmony_ci	size_t k;
8570af302Sopenharmony_ci
9570af302Sopenharmony_ci	if (!src) return 0;
10570af302Sopenharmony_ci
11570af302Sopenharmony_ci	k = wcsrtombs((void *)f->buf, &src, f->buf_size, 0);
12570af302Sopenharmony_ci	if (k==(size_t)-1) {
13570af302Sopenharmony_ci		f->rpos = f->rend = 0;
14570af302Sopenharmony_ci		return 0;
15570af302Sopenharmony_ci	}
16570af302Sopenharmony_ci
17570af302Sopenharmony_ci	f->rpos = f->buf;
18570af302Sopenharmony_ci	f->rend = f->buf + k;
19570af302Sopenharmony_ci	f->cookie = (void *)src;
20570af302Sopenharmony_ci
21570af302Sopenharmony_ci	if (!len || !k) return 0;
22570af302Sopenharmony_ci
23570af302Sopenharmony_ci	*buf = *f->rpos++;
24570af302Sopenharmony_ci	return 1;
25570af302Sopenharmony_ci}
26570af302Sopenharmony_ci
27570af302Sopenharmony_ciint vswscanf(const wchar_t *restrict s, const wchar_t *restrict fmt, va_list ap)
28570af302Sopenharmony_ci{
29570af302Sopenharmony_ci	unsigned char buf[256];
30570af302Sopenharmony_ci	FILE f = {
31570af302Sopenharmony_ci		.buf = buf, .buf_size = sizeof buf,
32570af302Sopenharmony_ci		.cookie = (void *)s,
33570af302Sopenharmony_ci		.read = wstring_read, .lock = -1
34570af302Sopenharmony_ci	};
35570af302Sopenharmony_ci	return vfwscanf(&f, fmt, ap);
36570af302Sopenharmony_ci}
37570af302Sopenharmony_ci
38570af302Sopenharmony_ciweak_alias(vswscanf,__isoc99_vswscanf);
39