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