2
2
3
3
char *utf16_to_utf8 (const wchar_t *s)
4
4
{
5
- std::vector<char > v;
5
+ char *buf = (char *)Malloc (wcslen (s) * 3 + 1 );
6
+ char *p = buf;
6
7
while (*s) {
7
8
unsigned c = 0xfffd ;
8
9
unsigned short w1 = *s++;
@@ -16,34 +17,29 @@ char *utf16_to_utf8(const wchar_t *s)
16
17
}
17
18
}
18
19
if (c < (1 << 7 )) {
19
- v. push_back (c) ;
20
+ *p++ = c ;
20
21
} else if (c < (1 << 11 )) {
21
- v. push_back ( 0xc0 | (c >> 6 ) );
22
- v. push_back ( 0x80 | (c & 0x3f ) );
22
+ *p++ = 0xc0 | (c >> 6 );
23
+ *p++ = 0x80 | (c & 0x3f );
23
24
} else if (c < (1 << 16 )) {
24
- v. push_back ( 0xe0 | (c >> 12 ) );
25
- v. push_back ( 0x80 | ((c >> 6 ) & 0x3f ) );
26
- v. push_back ( 0x80 | (c & 0x3f ) );
25
+ *p++ = 0xe0 | (c >> 12 );
26
+ *p++ = 0x80 | ((c >> 6 ) & 0x3f );
27
+ *p++ = 0x80 | (c & 0x3f );
27
28
} else {
28
- v. push_back ( 0xf0 | (c >> 18 ) );
29
- v. push_back ( 0x80 | ((c >> 12 ) & 0x3f ) );
30
- v. push_back ( 0x80 | ((c >> 6 ) & 0x3f ) );
31
- v. push_back ( 0x80 | (c & 0x3f ) );
29
+ *p++ = 0xf0 | (c >> 18 );
30
+ *p++ = 0x80 | ((c >> 12 ) & 0x3f );
31
+ *p++ = 0x80 | ((c >> 6 ) & 0x3f );
32
+ *p++ = 0x80 | (c & 0x3f );
32
33
}
33
34
}
34
- size_t l = v.size ();
35
- char *buf = (char *) Malloc (l + 1 );
36
- size_t i;
37
- for (i = 0 ; i < l; i++) {
38
- buf[i] = v[i];
39
- }
40
- buf[l] = 0 ;
35
+ *p = 0 ;
41
36
return buf;
42
37
}
43
38
44
39
wchar_t *utf8_to_utf16 (const char *s)
45
40
{
46
- std::vector<wchar_t > v;
41
+ wchar_t *buf = (wchar_t *)Malloc (sizeof (wchar_t ) * (strlen (s) + 1 ));
42
+ wchar_t *p = buf;
47
43
while (*s) {
48
44
int i, n;
49
45
unsigned c;
@@ -79,20 +75,14 @@ wchar_t *utf8_to_utf16(const char *s)
79
75
s++;
80
76
}
81
77
if (c < 0x10000 ) {
82
- v. push_back (c) ;
78
+ *p++ = c ;
83
79
} else {
84
80
c -= 0x10000 ;
85
- v. push_back ( 0xd800 | (c >> 10 ) );
86
- v. push_back ( 0xdc00 | (c & 0x3ff ) );
81
+ *p++ = 0xd800 | (c >> 10 );
82
+ *p++ = 0xdc00 | (c & 0x3ff );
87
83
}
88
84
}
89
- size_t l = v.size ();
90
- wchar_t *buf = (wchar_t *) Malloc ((l + 1 ) * sizeof (wchar_t ));
91
- size_t i;
92
- for (i = 0 ; i < l; i++) {
93
- buf[i] = v[i];
94
- }
95
- buf[l] = 0 ;
85
+ *p = 0 ;
96
86
return buf;
97
87
}
98
88
0 commit comments