| OLD | NEW |
| 1 #include <uchar.h> | 1 #include <uchar.h> |
| 2 #include <wchar.h> | 2 #include <wchar.h> |
| 3 | 3 |
| 4 size_t mbrtoc16(char16_t *restrict pc16, const char *restrict s, size_t n, mbsta
te_t *restrict ps) | 4 size_t mbrtoc16(char16_t* restrict pc16, |
| 5 { | 5 const char* restrict s, |
| 6 » static unsigned internal_state; | 6 size_t n, |
| 7 » if (!ps) ps = (void *)&internal_state; | 7 mbstate_t* restrict ps) { |
| 8 » unsigned *pending = (unsigned *)ps; | 8 static unsigned internal_state; |
| 9 if (!ps) |
| 10 ps = (void*)&internal_state; |
| 11 unsigned* pending = (unsigned*)ps; |
| 9 | 12 |
| 10 » if (!s) return mbrtoc16(0, "", 1, ps); | 13 if (!s) |
| 14 return mbrtoc16(0, "", 1, ps); |
| 11 | 15 |
| 12 » /* mbrtowc states for partial UTF-8 characters have the high bit set; | 16 /* mbrtowc states for partial UTF-8 characters have the high bit set; |
| 13 » * we use nonzero states without high bit for pending surrogates. */ | 17 * we use nonzero states without high bit for pending surrogates. */ |
| 14 » if ((int)*pending > 0) { | 18 if ((int)*pending > 0) { |
| 15 » » if (pc16) *pc16 = *pending; | 19 if (pc16) |
| 16 » » *pending = 0; | 20 *pc16 = *pending; |
| 17 » » return -3; | 21 *pending = 0; |
| 18 » } | 22 return -3; |
| 23 } |
| 19 | 24 |
| 20 » wchar_t wc; | 25 wchar_t wc; |
| 21 » size_t ret = mbrtowc(&wc, s, n, ps); | 26 size_t ret = mbrtowc(&wc, s, n, ps); |
| 22 » if (ret <= 4) { | 27 if (ret <= 4) { |
| 23 » » if (wc >= 0x10000) { | 28 if (wc >= 0x10000) { |
| 24 » » » *pending = (wc & 0x3ff) + 0xdc00; | 29 *pending = (wc & 0x3ff) + 0xdc00; |
| 25 » » » wc = 0xd7c0 + (wc >> 10); | 30 wc = 0xd7c0 + (wc >> 10); |
| 26 » » } | 31 } |
| 27 » » if (pc16) *pc16 = wc; | 32 if (pc16) |
| 28 » } | 33 *pc16 = wc; |
| 29 » return ret; | 34 } |
| 35 return ret; |
| 30 } | 36 } |
| OLD | NEW |