1#include <wchar.h>
2
3size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict wcs, size_t wn, size_t n, mbstate_t *restrict st)
4{
5	size_t l, cnt=0, n2;
6	char *s, buf[256];
7	const wchar_t *ws = *wcs;
8
9	if (!dst) s = buf, n = sizeof buf;
10	else s = dst;
11
12	while ( ws && n && ( (n2=wn)>=n || n2>32 ) ) {
13		if (n2>=n) n2=n;
14		wn -= n2;
15		l = wcsrtombs(s, &ws, n2, 0);
16		if (!(l+1)) {
17			cnt = l;
18			n = 0;
19			break;
20		}
21		if (s != buf) {
22			s += l;
23			n -= l;
24		}
25		cnt += l;
26	}
27	if (ws) while (n && wn) {
28		l = wcrtomb(s, *ws, 0);
29		if ((l+1)<=1) {
30			if (!l) ws = 0;
31			else cnt = l;
32			break;
33		}
34		ws++; wn--;
35		/* safe - this loop runs fewer than sizeof(buf) times */
36		s+=l; n-=l;
37		cnt += l;
38	}
39	if (dst) *wcs = ws;
40	return cnt;
41}
42