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