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 |