github.com/afumu/libc@v0.0.6/musl/src/stdio/vswscanf.c (about)

     1  #include "stdio_impl.h"
     2  #include <wchar.h>
     3  
     4  static size_t wstring_read(FILE *f, unsigned char *buf, size_t len)
     5  {
     6  	const wchar_t *src = f->cookie;
     7  	size_t k;
     8  
     9  	if (!src) return 0;
    10  
    11  	k = wcsrtombs((void *)f->buf, &src, f->buf_size, 0);
    12  	if (k==(size_t)-1) {
    13  		f->rpos = f->rend = 0;
    14  		return 0;
    15  	}
    16  
    17  	f->rpos = f->buf;
    18  	f->rend = f->buf + k;
    19  	f->cookie = (void *)src;
    20  
    21  	if (!len || !k) return 0;
    22  
    23  	*buf = *f->rpos++;
    24  	return 1;
    25  }
    26  
    27  int vswscanf(const wchar_t *restrict s, const wchar_t *restrict fmt, va_list ap)
    28  {
    29  	unsigned char buf[256];
    30  	FILE f = {
    31  		.buf = buf, .buf_size = sizeof buf,
    32  		.cookie = (void *)s,
    33  		.read = wstring_read, .lock = -1
    34  	};
    35  	return vfwscanf(&f, fmt, ap);
    36  }
    37  
    38  weak_alias(vswscanf,__isoc99_vswscanf);