1 #include <wchar.h>
2 #include <limits.h>
3 #include <string.h>
4
wcsnrtombs(char * restrict dst,const wchar_t ** restrict wcs,size_t wn,size_t n,mbstate_t * restrict st)5 size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict wcs, size_t wn, size_t n, mbstate_t *restrict st)
6 {
7 const wchar_t *ws = *wcs;
8 size_t cnt = 0;
9 if (!dst) n=0;
10 while (ws && wn) {
11 char tmp[MB_LEN_MAX];
12 size_t l = wcrtomb(n<MB_LEN_MAX ? tmp : dst, *ws, 0);
13 if (l==-1) {
14 cnt = -1;
15 break;
16 }
17 if (dst) {
18 if (n<MB_LEN_MAX) {
19 if (l>n) break;
20 memcpy(dst, tmp, l);
21 }
22 dst += l;
23 n -= l;
24 }
25 if (!*ws) {
26 ws = 0;
27 break;
28 }
29 ws++;
30 wn--;
31 cnt += l;
32 }
33 if (dst) *wcs = ws;
34 return cnt;
35 }
36