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