10
10
#include "UniConversion.h"
12
enum { SURROGATE_LEAD_FIRST = 0xD800 };
13
enum { SURROGATE_TRAIL_FIRST = 0xDC00 };
14
enum { SURROGATE_TRAIL_LAST = 0xDFFF };
12
16
unsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen) {
13
17
unsigned int len = 0;
14
for (unsigned int i = 0; i < tlen && uptr[i]; i++) {
18
for (unsigned int i = 0; i < tlen && uptr[i];) {
15
19
unsigned int uch = uptr[i];
22
} else if (uch < 0x800) {
24
} else if ((uch >= SURROGATE_LEAD_FIRST) &&
25
(uch <= SURROGATE_TRAIL_LAST)) {
26
void UTF8FromUCS2(const wchar_t *uptr, unsigned int tlen, char *putf, unsigned int len) {
36
void UTF8FromUTF16(const wchar_t *uptr, unsigned int tlen, char *putf, unsigned int len) {
28
for (unsigned int i = 0; i < tlen && uptr[i]; i++) {
38
for (unsigned int i = 0; i < tlen && uptr[i];) {
29
39
unsigned int uch = uptr[i];
31
41
putf[k++] = static_cast<char>(uch);
32
42
} else if (uch < 0x800) {
33
43
putf[k++] = static_cast<char>(0xC0 | (uch >> 6));
34
44
putf[k++] = static_cast<char>(0x80 | (uch & 0x3f));
45
} else if ((uch >= SURROGATE_LEAD_FIRST) &&
46
(uch <= SURROGATE_TRAIL_LAST)) {
47
// Half a surrogate pair
49
unsigned int xch = 0x10000 + ((uch & 0x3ff) << 10) + (uptr[i] & 0x3ff);
50
putf[k++] = static_cast<char>(0xF0 | (xch >> 18));
51
putf[k++] = static_cast<char>(0x80 | (xch >> 12) & 0x3f);
52
putf[k++] = static_cast<char>(0x80 | ((xch >> 6) & 0x3f));
53
putf[k++] = static_cast<char>(0x80 | (xch & 0x3f));
36
55
putf[k++] = static_cast<char>(0xE0 | (uch >> 12));
37
56
putf[k++] = static_cast<char>(0x80 | ((uch >> 6) & 0x3f));
38
57
putf[k++] = static_cast<char>(0x80 | (uch & 0x3f));
44
unsigned int UCS2Length(const char *s, unsigned int len) {
64
unsigned int UTF16Length(const char *s, unsigned int len) {
45
65
unsigned int ulen = 0;
46
for (unsigned int i=0;i<len;i++) {
67
for (unsigned int i=0;i<len;) {
47
68
unsigned char ch = static_cast<unsigned char>(s[i]);
48
if ((ch < 0x80) || (ch > (0x80 + 0x40)))
71
} else if (ch < 0x80 + 0x40 + 0x20) {
73
} else if (ch < 0x80 + 0x40 + 0x20 + 0x10) {
54
unsigned int UCS2FromUTF8(const char *s, unsigned int len, wchar_t *tbuf, unsigned int tlen) {
85
unsigned int UTF16FromUTF8(const char *s, unsigned int len, wchar_t *tbuf, unsigned int tlen) {
56
87
const unsigned char *us = reinterpret_cast<const unsigned char *>(s);
63
94
tbuf[ui] = static_cast<wchar_t>((ch & 0x1F) << 6);
65
96
tbuf[ui] = static_cast<wchar_t>(tbuf[ui] + (ch & 0x7F));
97
} else if (ch < 0x80 + 0x40 + 0x20 + 0x10) {
67
98
tbuf[ui] = static_cast<wchar_t>((ch & 0xF) << 12);
69
100
tbuf[ui] = static_cast<wchar_t>(tbuf[ui] + ((ch & 0x7F) << 6));
71
102
tbuf[ui] = static_cast<wchar_t>(tbuf[ui] + (ch & 0x7F));
104
// Outside the BMP so need two surrogates
105
int val = (ch & 0x7) << 18;
107
val += (ch & 0x3F) << 12;
109
val += (ch & 0x3F) << 6;
112
tbuf[ui] = static_cast<wchar_t>(((val - 0x10000) >> 10) + SURROGATE_LEAD_FIRST);
114
tbuf[ui] = static_cast<wchar_t>((val & 0x3ff) + SURROGATE_TRAIL_FIRST);