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 Workersize_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