1 #include <uchar.h> 2 #include <errno.h> 3 #include <wchar.h> 4 c16rtomb(char * restrict s,char16_t c16,mbstate_t * restrict ps)5size_t c16rtomb(char *restrict s, char16_t c16, mbstate_t *restrict ps) 6 { 7 static unsigned internal_state; 8 if (!ps) ps = (void *)&internal_state; 9 unsigned *x = (unsigned *)ps; 10 wchar_t wc; 11 12 if (!s) { 13 if (*x) goto ilseq; 14 return 1; 15 } 16 17 if (!*x && c16 - 0xd800u < 0x400) { 18 *x = c16 - 0xd7c0 << 10; 19 return 0; 20 } 21 22 if (*x) { 23 if (c16 - 0xdc00u >= 0x400) goto ilseq; 24 else wc = *x + c16 - 0xdc00; 25 *x = 0; 26 } else { 27 wc = c16; 28 } 29 return wcrtomb(s, wc, 0); 30 31 ilseq: 32 *x = 0; 33 errno = EILSEQ; 34 return -1; 35 } 36