• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <wchar.h>
2 
wcsrtombs(char * restrict s,const wchar_t ** restrict ws,size_t n,mbstate_t * restrict st)3 size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstate_t *restrict st)
4 {
5 	const wchar_t *ws2;
6 	char buf[4];
7 	size_t N = n, l;
8 	if (!s) {
9 		for (n=0, ws2=*ws; *ws2; ws2++) {
10 			if (*ws2 >= 0x80u) {
11 				l = wcrtomb(buf, *ws2, 0);
12 				if (!(l+1)) return -1;
13 				n += l;
14 			} else n++;
15 		}
16 		return n;
17 	}
18 	while (n>=4) {
19 		if (**ws-1u >= 0x7fu) {
20 			if (!**ws) {
21 				*s = 0;
22 				*ws = 0;
23 				return N-n;
24 			}
25 			l = wcrtomb(s, **ws, 0);
26 			if (!(l+1)) return -1;
27 			s += l;
28 			n -= l;
29 		} else {
30 			*s++ = **ws;
31 			n--;
32 		}
33 		(*ws)++;
34 	}
35 	while (n) {
36 		if (**ws-1u >= 0x7fu) {
37 			if (!**ws) {
38 				*s = 0;
39 				*ws = 0;
40 				return N-n;
41 			}
42 			l = wcrtomb(buf, **ws, 0);
43 			if (!(l+1)) return -1;
44 			if (l>n) return N-n;
45 			wcrtomb(s, **ws, 0);
46 			s += l;
47 			n -= l;
48 		} else {
49 			*s++ = **ws;
50 			n--;
51 		}
52 		(*ws)++;
53 	}
54 	return N;
55 }
56