xref: /aosp_15_r20/external/musl/src/multibyte/wcsnrtombs.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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