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