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