Home | History | Annotate | Download | only in musl-multibyte
      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