1#include <wchar.h> 2 3size_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