xref: /aosp_15_r20/external/musl/src/multibyte/wcrtomb.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <stdlib.h>
2*c9945492SAndroid Build Coastguard Worker #include <wchar.h>
3*c9945492SAndroid Build Coastguard Worker #include <errno.h>
4*c9945492SAndroid Build Coastguard Worker #include "internal.h"
5*c9945492SAndroid Build Coastguard Worker 
wcrtomb(char * restrict s,wchar_t wc,mbstate_t * restrict st)6*c9945492SAndroid Build Coastguard Worker size_t wcrtomb(char *restrict s, wchar_t wc, mbstate_t *restrict st)
7*c9945492SAndroid Build Coastguard Worker {
8*c9945492SAndroid Build Coastguard Worker 	if (!s) return 1;
9*c9945492SAndroid Build Coastguard Worker 	if ((unsigned)wc < 0x80) {
10*c9945492SAndroid Build Coastguard Worker 		*s = wc;
11*c9945492SAndroid Build Coastguard Worker 		return 1;
12*c9945492SAndroid Build Coastguard Worker 	} else if (MB_CUR_MAX == 1) {
13*c9945492SAndroid Build Coastguard Worker 		if (!IS_CODEUNIT(wc)) {
14*c9945492SAndroid Build Coastguard Worker 			errno = EILSEQ;
15*c9945492SAndroid Build Coastguard Worker 			return -1;
16*c9945492SAndroid Build Coastguard Worker 		}
17*c9945492SAndroid Build Coastguard Worker 		*s = wc;
18*c9945492SAndroid Build Coastguard Worker 		return 1;
19*c9945492SAndroid Build Coastguard Worker 	} else if ((unsigned)wc < 0x800) {
20*c9945492SAndroid Build Coastguard Worker 		*s++ = 0xc0 | (wc>>6);
21*c9945492SAndroid Build Coastguard Worker 		*s = 0x80 | (wc&0x3f);
22*c9945492SAndroid Build Coastguard Worker 		return 2;
23*c9945492SAndroid Build Coastguard Worker 	} else if ((unsigned)wc < 0xd800 || (unsigned)wc-0xe000 < 0x2000) {
24*c9945492SAndroid Build Coastguard Worker 		*s++ = 0xe0 | (wc>>12);
25*c9945492SAndroid Build Coastguard Worker 		*s++ = 0x80 | ((wc>>6)&0x3f);
26*c9945492SAndroid Build Coastguard Worker 		*s = 0x80 | (wc&0x3f);
27*c9945492SAndroid Build Coastguard Worker 		return 3;
28*c9945492SAndroid Build Coastguard Worker 	} else if ((unsigned)wc-0x10000 < 0x100000) {
29*c9945492SAndroid Build Coastguard Worker 		*s++ = 0xf0 | (wc>>18);
30*c9945492SAndroid Build Coastguard Worker 		*s++ = 0x80 | ((wc>>12)&0x3f);
31*c9945492SAndroid Build Coastguard Worker 		*s++ = 0x80 | ((wc>>6)&0x3f);
32*c9945492SAndroid Build Coastguard Worker 		*s = 0x80 | (wc&0x3f);
33*c9945492SAndroid Build Coastguard Worker 		return 4;
34*c9945492SAndroid Build Coastguard Worker 	}
35*c9945492SAndroid Build Coastguard Worker 	errno = EILSEQ;
36*c9945492SAndroid Build Coastguard Worker 	return -1;
37*c9945492SAndroid Build Coastguard Worker }
38