| 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 { |
| 7 static unsigned internal_state; | 7 static unsigned internal_state; |
| 8 if (!ps) ps = (void *)&internal_state; | 8 if (!ps) 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) goto ilseq; |
| 14 return 1; | 14 return 1; |
| 15 } | 15 } |
| 16 | 16 |
| 17 if (!*x && c16 - 0xd800u < 0x400) { | 17 if (!*x && c16 - 0xd800u < 0x400) { |
| 18 » » *x = c16 - 0xd7c0 << 10; | 18 » » *x = (c16 - 0xd7c0) << 10; |
| 19 return 0; | 19 return 0; |
| 20 } | 20 } |
| 21 | 21 |
| 22 if (*x) { | 22 if (*x) { |
| 23 if (c16 - 0xdc00u >= 0x400) goto ilseq; | 23 if (c16 - 0xdc00u >= 0x400) goto ilseq; |
| 24 else wc = *x + c16 - 0xdc00; | 24 else wc = *x + c16 - 0xdc00; |
| 25 *x = 0; | 25 *x = 0; |
| 26 } else { | 26 } else { |
| 27 wc = c16; | 27 wc = c16; |
| 28 } | 28 } |
| 29 return wcrtomb(s, wc, 0); | 29 return wcrtomb(s, wc, 0); |
| 30 | 30 |
| 31 ilseq: | 31 ilseq: |
| 32 *x = 0; | 32 *x = 0; |
| 33 errno = EILSEQ; | 33 errno = EILSEQ; |
| 34 return -1; | 34 return -1; |
| 35 } | 35 } |
| OLD | NEW |