#include "stdio_impl.h" | |
#include "libc.h" | |
#include <wchar.h> | |
static size_t wstring_read(FILE* f, unsigned char* buf, size_t len) { | |
const wchar_t* src = f->cookie; | |
size_t k; | |
if (!src) | |
return 0; | |
k = wcsrtombs((void*)f->buf, &src, f->buf_size, 0); | |
if (k == (size_t)-1) { | |
f->rpos = f->rend = 0; | |
return 0; | |
} | |
f->rpos = f->buf; | |
f->rend = f->buf + k; | |
f->cookie = (void*)src; | |
if (!len || !k) | |
return 0; | |
*buf = *f->rpos++; | |
return 1; | |
} | |
int vswscanf(const wchar_t* restrict s, | |
const wchar_t* restrict fmt, | |
va_list ap) { | |
unsigned char buf[256]; | |
FILE f = {.buf = buf, | |
.buf_size = sizeof buf, | |
.cookie = (void*)s, | |
.read = wstring_read, | |
.lock = -1}; | |
return vfwscanf(&f, fmt, ap); | |
} | |
weak_alias(vswscanf, __isoc99_vswscanf); |