source:
EcnlProtoTool/trunk/musl-1.1.18/src/multibyte/mbrtoc16.c
Last change on this file was 444, checked in by , 4 years ago | |
---|---|
|
|
File size: 726 bytes |
Line | |
---|---|
1 | #include <uchar.h> |
2 | #include <wchar.h> |
3 | |
4 | size_t mbrtoc16(char16_t *restrict pc16, const char *restrict s, size_t n, mbstate_t *restrict ps) |
5 | { |
6 | static unsigned internal_state; |
7 | if (!ps) ps = (void *)&internal_state; |
8 | unsigned *pending = (unsigned *)ps; |
9 | |
10 | if (!s) return mbrtoc16(0, "", 1, ps); |
11 | |
12 | /* mbrtowc states for partial UTF-8 characters have the high bit set; |
13 | * we use nonzero states without high bit for pending surrogates. */ |
14 | if ((int)*pending > 0) { |
15 | if (pc16) *pc16 = *pending; |
16 | *pending = 0; |
17 | return -3; |
18 | } |
19 | |
20 | wchar_t wc; |
21 | size_t ret = mbrtowc(&wc, s, n, ps); |
22 | if (ret <= 4) { |
23 | if (wc >= 0x10000) { |
24 | *pending = (wc & 0x3ff) + 0xdc00; |
25 | wc = 0xd7c0 + (wc >> 10); |
26 | } |
27 | if (pc16) *pc16 = wc; |
28 | } |
29 | return ret; |
30 | } |
Note:
See TracBrowser
for help on using the repository browser.