vswscanf.c raw

   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);
  39