1#include "libc.h"
2#include "stdio_impl.h"
3#include <wchar.h>
4
5static size_t wstring_read(FILE* f, unsigned char* buf, size_t len) {
6    const wchar_t* src = f->cookie;
7    size_t k;
8
9    if (!src)
10        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)
23        return 0;
24
25    *buf = *f->rpos++;
26    return 1;
27}
28
29int vswscanf(const wchar_t* restrict s, const wchar_t* restrict fmt, va_list ap) {
30    unsigned char buf[256];
31    FILE f = {
32        .buf = buf, .buf_size = sizeof buf, .cookie = (void*)s, .read = wstring_read, .lock = -1};
33    return vfwscanf(&f, fmt, ap);
34}
35