1 /* 2 * This code was written by Rich Felker in 2010; no copyright is claimed. 3 * This code is in the public domain. Attribution is appreciated but 4 * unnecessary. 5 */ 6 7 #include <wchar.h> 8 9 size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict wcs, size_t wn, size_t n, mbstate_t *restrict st) 10 { 11 size_t l, cnt=0, n2; 12 char *s, buf[256]; 13 const wchar_t *ws = *wcs; 14 15 if (!dst) s = buf, n = sizeof buf; 16 else s = dst; 17 18 while ( ws && n && ( (n2=wn)>=n || n2>32 ) ) { 19 if (n2>=n) n2=n; 20 wn -= n2; 21 l = wcsrtombs(s, &ws, n2, 0); 22 if (!(l+1)) { 23 cnt = l; 24 n = 0; 25 break; 26 } 27 if (s != buf) { 28 s += l; 29 n -= l; 30 } 31 cnt += l; 32 } 33 if (ws) while (n && wn) { 34 l = wcrtomb(s, *ws, 0); 35 if ((l+1)<=1) { 36 if (!l) ws = 0; 37 else cnt = l; 38 break; 39 } 40 ws++; wn--; 41 /* safe - this loop runs fewer than sizeof(buf) times */ 42 s+=l; n-=l; 43 cnt++; 44 } 45 if (dst) *wcs = ws; 46 return cnt; 47 } 48