OLD | NEW |
| (Empty) |
1 /******************************************************************** | |
2 * COPYRIGHT: | |
3 * Copyright (c) 2001-2014, International Business Machines Corporation and | |
4 * others. All Rights Reserved. | |
5 ********************************************************************/ | |
6 /*******************************************************************************
* | |
7 * | |
8 * File custrtrn.C | |
9 * | |
10 * Modification History: | |
11 * Name Description | |
12 * Ram String transformations test | |
13 ********************************************************************************
* | |
14 */ | |
15 /****************************************************************************/ | |
16 | |
17 | |
18 #include <stdlib.h> | |
19 #include <stdio.h> | |
20 #include <string.h> | |
21 #include "unicode/utypes.h" | |
22 #include "unicode/ustring.h" | |
23 #include "unicode/ures.h" | |
24 #include "ustr_imp.h" | |
25 #include "cintltst.h" | |
26 #include "cmemory.h" | |
27 #include "cstring.h" | |
28 #include "cwchar.h" | |
29 | |
30 void addUCharTransformTest(TestNode** root); | |
31 | |
32 static void Test_strToUTF32(void); | |
33 static void Test_strToUTF32_surrogates(void); | |
34 static void Test_strFromUTF32(void); | |
35 static void Test_strFromUTF32_surrogates(void); | |
36 static void Test_UChar_UTF8_API(void); | |
37 static void Test_FromUTF8(void); | |
38 static void Test_FromUTF8Lenient(void); | |
39 static void Test_UChar_WCHART_API(void); | |
40 static void Test_widestrs(void); | |
41 static void Test_WCHART_LongString(void); | |
42 static void Test_strToJavaModifiedUTF8(void); | |
43 static void Test_strFromJavaModifiedUTF8(void); | |
44 static void TestNullEmptySource(void); | |
45 | |
46 void | |
47 addUCharTransformTest(TestNode** root) | |
48 { | |
49 addTest(root, &Test_strToUTF32, "custrtrn/Test_strToUTF32"); | |
50 addTest(root, &Test_strToUTF32_surrogates, "custrtrn/Test_strToUTF32_surrogat
es"); | |
51 addTest(root, &Test_strFromUTF32, "custrtrn/Test_strFromUTF32"); | |
52 addTest(root, &Test_strFromUTF32_surrogates, "custrtrn/Test_strFromUTF32_surr
ogates"); | |
53 addTest(root, &Test_UChar_UTF8_API, "custrtrn/Test_UChar_UTF8_API"); | |
54 addTest(root, &Test_FromUTF8, "custrtrn/Test_FromUTF8"); | |
55 addTest(root, &Test_FromUTF8Lenient, "custrtrn/Test_FromUTF8Lenient"); | |
56 addTest(root, &Test_UChar_WCHART_API, "custrtrn/Test_UChar_WCHART_API"); | |
57 addTest(root, &Test_widestrs, "custrtrn/Test_widestrs"); | |
58 #if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION | |
59 addTest(root, &Test_WCHART_LongString, "custrtrn/Test_WCHART_LongString"); | |
60 #endif | |
61 addTest(root, &Test_strToJavaModifiedUTF8, "custrtrn/Test_strToJavaModifiedU
TF8"); | |
62 addTest(root, &Test_strFromJavaModifiedUTF8, "custrtrn/Test_strFromJavaModif
iedUTF8"); | |
63 addTest(root, &TestNullEmptySource, "custrtrn/TestNullEmptySource"); | |
64 } | |
65 | |
66 static const UChar32 src32[]={ | |
67 0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x00
0A, | |
68 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x00
0A, | |
69 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x00
0A, | |
70 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x00
0A, | |
71 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x00
0A, | |
72 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x00
0A, | |
73 0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x00
0A, | |
74 0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x00
0A, | |
75 0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x00
0A, | |
76 0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x00
0A, | |
77 0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x00
0A, | |
78 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x00
0A, | |
79 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x00
0A, | |
80 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x00
0A, | |
81 0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x00
0A, | |
82 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x00
0A, | |
83 0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x00
0A, | |
84 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x00
0A, | |
85 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x00
0A, | |
86 /* test non-BMP code points */ | |
87 0x0002A699, | |
88 0x0002A69C, 0x0002A69D, 0x0002A69E, 0x0002A69F, 0x0002A6A0, 0x0002A6A5, 0x00
02A6A6, 0x0002A6A7, 0x0002A6A8, 0x0002A6AB, | |
89 0x0002A6AC, 0x0002A6AD, 0x0002A6AE, 0x0002A6AF, 0x0002A6B0, 0x0002A6B1, 0x00
02A6B3, 0x0002A6B5, 0x0002A6B6, 0x0002A6B7, | |
90 0x0002A6B8, 0x0002A6B9, 0x0002A6BA, 0x0002A6BB, 0x0002A6BC, 0x0002A6BD, 0x00
02A6BE, 0x0002A6BF, 0x0002A6C0, 0x0002A6C1, | |
91 0x0002A6C2, 0x0002A6C3, 0x0002A6C4, 0x0002A6C8, 0x0002A6CA, 0x0002A6CB, 0x00
02A6CD, 0x0002A6CE, 0x0002A6CF, 0x0002A6D0, | |
92 0x0002A6D1, 0x0002A6D2, 0x0002A6D3, 0x0002A6D4, 0x0002A6D5, | |
93 | |
94 0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x00
0A, | |
95 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x00
0A, | |
96 0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x00
0A, | |
97 0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x00
0A, | |
98 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x00
0A,0x0000 | |
99 }; | |
100 | |
101 static const UChar src16[] = { | |
102 0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x00
0A, | |
103 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x00
0A, | |
104 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x00
0A, | |
105 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x00
0A, | |
106 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x00
0A, | |
107 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x00
0A, | |
108 0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x00
0A, | |
109 0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x00
0A, | |
110 0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x00
0A, | |
111 0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x00
0A, | |
112 0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x00
0A, | |
113 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x00
0A, | |
114 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x00
0A, | |
115 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x00
0A, | |
116 0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x00
0A, | |
117 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x00
0A, | |
118 0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x00
0A, | |
119 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x00
0A, | |
120 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x00
0A, | |
121 | |
122 /* test non-BMP code points */ | |
123 0xD869, 0xDE99, 0xD869, 0xDE9C, 0xD869, 0xDE9D, 0xD869, 0xDE9E, 0xD869, 0xDE
9F, | |
124 0xD869, 0xDEA0, 0xD869, 0xDEA5, 0xD869, 0xDEA6, 0xD869, 0xDEA7, 0xD869, 0xDE
A8, | |
125 0xD869, 0xDEAB, 0xD869, 0xDEAC, 0xD869, 0xDEAD, 0xD869, 0xDEAE, 0xD869, 0xDE
AF, | |
126 0xD869, 0xDEB0, 0xD869, 0xDEB1, 0xD869, 0xDEB3, 0xD869, 0xDEB5, 0xD869, 0xDE
B6, | |
127 0xD869, 0xDEB7, 0xD869, 0xDEB8, 0xD869, 0xDEB9, 0xD869, 0xDEBA, 0xD869, 0xDE
BB, | |
128 0xD869, 0xDEBC, 0xD869, 0xDEBD, 0xD869, 0xDEBE, 0xD869, 0xDEBF, 0xD869, 0xDE
C0, | |
129 0xD869, 0xDEC1, 0xD869, 0xDEC2, 0xD869, 0xDEC3, 0xD869, 0xDEC4, 0xD869, 0xDE
C8, | |
130 0xD869, 0xDECA, 0xD869, 0xDECB, 0xD869, 0xDECD, 0xD869, 0xDECE, 0xD869, 0xDE
CF, | |
131 0xD869, 0xDED0, 0xD869, 0xDED1, 0xD869, 0xDED2, 0xD869, 0xDED3, 0xD869, 0xDE
D4, | |
132 0xD869, 0xDED5, | |
133 | |
134 0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x00
0A, | |
135 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x00
0A, | |
136 0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x00
0A, | |
137 0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x00
0A, | |
138 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x00
0A,0x0000 | |
139 }; | |
140 | |
141 | |
142 static void Test_strToUTF32(void){ | |
143 UErrorCode err = U_ZERO_ERROR; | |
144 UChar32 u32Target[400]; | |
145 int32_t u32DestLen; | |
146 int i= 0; | |
147 | |
148 /* first with length */ | |
149 u32DestLen = -2; | |
150 u_strToUTF32(u32Target, 0, &u32DestLen, src16, UPRV_LENGTHOF(src16),&err); | |
151 if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != UPRV_LENGTHOF(src32)) { | |
152 log_err("u_strToUTF32(preflight with length): " | |
153 "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", | |
154 (long)u32DestLen, (long)UPRV_LENGTHOF(src32), u_errorName(err)); | |
155 return; | |
156 } | |
157 err = U_ZERO_ERROR; | |
158 u32DestLen = -2; | |
159 u_strToUTF32(u32Target, UPRV_LENGTHOF(src32)+1, &u32DestLen, src16, UPRV_LEN
GTHOF(src16),&err); | |
160 if(err != U_ZERO_ERROR || u32DestLen != UPRV_LENGTHOF(src32)) { | |
161 log_err("u_strToUTF32(with length): " | |
162 "length %ld != %ld and %s != U_ZERO_ERROR\n", | |
163 (long)u32DestLen, (long)UPRV_LENGTHOF(src32), u_errorName(err)); | |
164 return; | |
165 } | |
166 /*for(i=0; i< u32DestLen; i++){ | |
167 printf("0x%08X, ",uTarget[i]); | |
168 if(i%10==0){ | |
169 printf("\n"); | |
170 } | |
171 }*/ | |
172 for(i=0; i< UPRV_LENGTHOF(src32); i++){ | |
173 if(u32Target[i] != src32[i]){ | |
174 log_verbose("u_strToUTF32(with length) failed expected: %04X got: %0
4X at index: %i \n", src32[i], u32Target[i],i); | |
175 } | |
176 } | |
177 if(u32Target[i] != 0){ | |
178 log_verbose("u_strToUTF32(with length) failed expected: %04X got: %04X a
t index: %i \n", 0, u32Target[i],i); | |
179 } | |
180 | |
181 /* now NUL-terminated */ | |
182 u32DestLen = -2; | |
183 u_strToUTF32(NULL,0, &u32DestLen, src16, -1,&err); | |
184 if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != UPRV_LENGTHOF(src32)-1) { | |
185 log_err("u_strToUTF32(preflight with NUL-termination): " | |
186 "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", | |
187 (long)u32DestLen, (long)UPRV_LENGTHOF(src32)-1, u_errorName(err)
); | |
188 return; | |
189 } | |
190 err = U_ZERO_ERROR; | |
191 u32DestLen = -2; | |
192 u_strToUTF32(u32Target, UPRV_LENGTHOF(src32), &u32DestLen, src16, -1,&err); | |
193 if(err != U_ZERO_ERROR || u32DestLen != UPRV_LENGTHOF(src32)-1) { | |
194 log_err("u_strToUTF32(with NUL-termination): " | |
195 "length %ld != %ld and %s != U_ZERO_ERROR\n", | |
196 (long)u32DestLen, (long)UPRV_LENGTHOF(src32)-1, u_errorName(err)
); | |
197 return; | |
198 } | |
199 | |
200 for(i=0; i< UPRV_LENGTHOF(src32); i++){ | |
201 if(u32Target[i] != src32[i]){ | |
202 log_verbose("u_strToUTF32(NUL-termination) failed expected: %04X got
: %04X \n", src32[i], u32Target[i]); | |
203 } | |
204 } | |
205 } | |
206 | |
207 /* test unpaired surrogates */ | |
208 static void Test_strToUTF32_surrogates() { | |
209 UErrorCode err = U_ZERO_ERROR; | |
210 UChar32 u32Target[400]; | |
211 int32_t len16, u32DestLen; | |
212 int32_t numSubstitutions; | |
213 int i; | |
214 | |
215 static const UChar surr16[] = { 0x41, 0xd900, 0x61, 0xdc00, 0x5a, 0xd900, 0x
dc00, 0x7a, 0 }; | |
216 static const UChar32 expected[] = { 0x5a, 0x50000, 0x7a, 0 }; | |
217 static const UChar32 expected_FFFD[] = { 0x41, 0xfffd, 0x61, 0xfffd, 0x5a, 0
x50000, 0x7a, 0 }; | |
218 static const UChar32 expected_12345[] = { 0x41, 0x12345, 0x61, 0x12345, 0x5a
, 0x50000, 0x7a, 0 }; | |
219 len16 = UPRV_LENGTHOF(surr16); | |
220 for(i = 0; i < 4; ++i) { | |
221 err = U_ZERO_ERROR; | |
222 u_strToUTF32(u32Target, 0, &u32DestLen, surr16+i, len16-i, &err); | |
223 if(err != U_INVALID_CHAR_FOUND) { | |
224 log_err("u_strToUTF32(preflight surr16+%ld) sets %s != U_INVALID_CHA
R_FOUND\n", | |
225 (long)i, u_errorName(err)); | |
226 return; | |
227 } | |
228 | |
229 err = U_ZERO_ERROR; | |
230 u_strToUTF32(u32Target, UPRV_LENGTHOF(u32Target), &u32DestLen, surr16+i,
len16-i, &err); | |
231 if(err != U_INVALID_CHAR_FOUND) { | |
232 log_err("u_strToUTF32(surr16+%ld) sets %s != U_INVALID_CHAR_FOUND\n"
, | |
233 (long)i, u_errorName(err)); | |
234 return; | |
235 } | |
236 | |
237 err = U_ZERO_ERROR; | |
238 u_strToUTF32(NULL, 0, &u32DestLen, surr16+i, -1, &err); | |
239 if(err != U_INVALID_CHAR_FOUND) { | |
240 log_err("u_strToUTF32(preflight surr16+%ld/NUL) sets %s != U_INVALID
_CHAR_FOUND\n", | |
241 (long)i, u_errorName(err)); | |
242 return; | |
243 } | |
244 | |
245 err = U_ZERO_ERROR; | |
246 u_strToUTF32(u32Target, UPRV_LENGTHOF(u32Target), &u32DestLen, surr16+i,
-1, &err); | |
247 if(err != U_INVALID_CHAR_FOUND) { | |
248 log_err("u_strToUTF32(surr16+%ld/NUL) sets %s != U_INVALID_CHAR_FOUN
D\n", | |
249 (long)i, u_errorName(err)); | |
250 return; | |
251 } | |
252 } | |
253 | |
254 err = U_ZERO_ERROR; | |
255 u_strToUTF32(u32Target, 0, &u32DestLen, surr16+4, len16-4-1, &err); | |
256 if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 3) { | |
257 log_err("u_strToUTF32(preflight surr16+4) sets %s != U_BUFFER_OVERFLOW_E
RROR or an unexpected length\n", | |
258 u_errorName(err)); | |
259 return; | |
260 } | |
261 | |
262 err = U_ZERO_ERROR; | |
263 u_strToUTF32(u32Target, UPRV_LENGTHOF(u32Target), &u32DestLen, surr16+4, len
16-4-1, &err); | |
264 if(err != U_ZERO_ERROR || u32DestLen != 3 || uprv_memcmp(u32Target, expected
, 4*4)) { | |
265 log_err("u_strToUTF32(surr16+4) sets %s != U_ZERO_ERROR or does not prod
uce the expected string\n", | |
266 u_errorName(err)); | |
267 return; | |
268 } | |
269 | |
270 err = U_ZERO_ERROR; | |
271 u_strToUTF32(NULL, 0, &u32DestLen, surr16+4, -1, &err); | |
272 if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 3) { | |
273 log_err("u_strToUTF32(preflight surr16+4/NUL) sets %s != U_BUFFER_OVERFL
OW_ERROR or an unexpected length\n", | |
274 u_errorName(err)); | |
275 return; | |
276 } | |
277 | |
278 err = U_ZERO_ERROR; | |
279 u_strToUTF32(u32Target, UPRV_LENGTHOF(u32Target), &u32DestLen, surr16+4, -1,
&err); | |
280 if(err != U_ZERO_ERROR || u32DestLen != 3 || uprv_memcmp(u32Target, expected
, 4*4)) { | |
281 log_err("u_strToUTF32(surr16+4/NUL) sets %s != U_ZERO_ERROR or does not
produce the expected string\n", | |
282 u_errorName(err)); | |
283 return; | |
284 } | |
285 | |
286 /* with substitution character */ | |
287 numSubstitutions = -1; | |
288 err = U_ZERO_ERROR; | |
289 u_strToUTF32WithSub(u32Target, 0, &u32DestLen, surr16, len16-1, 0xfffd, &num
Substitutions, &err); | |
290 if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 7 || numSubstitutions !=
2) { | |
291 log_err("u_strToUTF32WithSub(preflight surr16) sets %s != U_BUFFER_OVERF
LOW_ERROR or an unexpected length\n", | |
292 u_errorName(err)); | |
293 return; | |
294 } | |
295 | |
296 err = U_ZERO_ERROR; | |
297 u_strToUTF32WithSub(u32Target, UPRV_LENGTHOF(u32Target), &u32DestLen, surr16
, len16-1, 0xfffd, &numSubstitutions, &err); | |
298 if(err != U_ZERO_ERROR || u32DestLen != 7 || numSubstitutions != 2 || uprv_m
emcmp(u32Target, expected_FFFD, 8*4)) { | |
299 log_err("u_strToUTF32WithSub(surr16) sets %s != U_ZERO_ERROR or does not
produce the expected string\n", | |
300 u_errorName(err)); | |
301 return; | |
302 } | |
303 | |
304 err = U_ZERO_ERROR; | |
305 u_strToUTF32WithSub(NULL, 0, &u32DestLen, surr16, -1, 0x12345, &numSubstitut
ions, &err); | |
306 if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 7 || numSubstitutions !=
2) { | |
307 log_err("u_strToUTF32WithSub(preflight surr16/NUL) sets %s != U_BUFFER_O
VERFLOW_ERROR or an unexpected length\n", | |
308 u_errorName(err)); | |
309 return; | |
310 } | |
311 | |
312 err = U_ZERO_ERROR; | |
313 u_strToUTF32WithSub(u32Target, UPRV_LENGTHOF(u32Target), &u32DestLen, surr16
, -1, 0x12345, &numSubstitutions, &err); | |
314 if(err != U_ZERO_ERROR || u32DestLen != 7 || numSubstitutions != 2 || uprv_m
emcmp(u32Target, expected_12345, 8*4)) { | |
315 log_err("u_strToUTF32WithSub(surr16/NUL) sets %s != U_ZERO_ERROR or does
not produce the expected string\n", | |
316 u_errorName(err)); | |
317 return; | |
318 } | |
319 } | |
320 | |
321 static void Test_strFromUTF32(void){ | |
322 UErrorCode err = U_ZERO_ERROR; | |
323 UChar uTarget[400]; | |
324 int32_t uDestLen; | |
325 int i= 0; | |
326 | |
327 /* first with length */ | |
328 uDestLen = -2; | |
329 u_strFromUTF32(uTarget,0,&uDestLen,src32,UPRV_LENGTHOF(src32),&err); | |
330 if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != UPRV_LENGTHOF(src16)) { | |
331 log_err("u_strFromUTF32(preflight with length): " | |
332 "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", | |
333 (long)uDestLen, (long)UPRV_LENGTHOF(src16), u_errorName(err)); | |
334 return; | |
335 } | |
336 err = U_ZERO_ERROR; | |
337 uDestLen = -2; | |
338 u_strFromUTF32(uTarget, UPRV_LENGTHOF(src16)+1,&uDestLen,src32,UPRV_LENGTHOF
(src32),&err); | |
339 if(err != U_ZERO_ERROR || uDestLen != UPRV_LENGTHOF(src16)) { | |
340 log_err("u_strFromUTF32(with length): " | |
341 "length %ld != %ld and %s != U_ZERO_ERROR\n", | |
342 (long)uDestLen, (long)UPRV_LENGTHOF(src16), u_errorName(err)); | |
343 return; | |
344 } | |
345 /*for(i=0; i< uDestLen; i++){ | |
346 printf("0x%04X, ",uTarget[i]); | |
347 if(i%10==0){ | |
348 printf("\n"); | |
349 } | |
350 }*/ | |
351 | |
352 for(i=0; i< uDestLen; i++){ | |
353 if(uTarget[i] != src16[i]){ | |
354 log_verbose("u_strFromUTF32(with length) failed expected: %04X got:
%04X at index: %i \n", src16[i] ,uTarget[i],i); | |
355 } | |
356 } | |
357 if(uTarget[i] != 0){ | |
358 log_verbose("u_strFromUTF32(with length) failed expected: %04X got: %04X
at index: %i \n", 0,uTarget[i],i); | |
359 } | |
360 | |
361 /* now NUL-terminated */ | |
362 uDestLen = -2; | |
363 u_strFromUTF32(NULL,0,&uDestLen,src32,-1,&err); | |
364 if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != UPRV_LENGTHOF(src16)-1) { | |
365 log_err("u_strFromUTF32(preflight with NUL-termination): " | |
366 "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", | |
367 (long)uDestLen, (long)UPRV_LENGTHOF(src16)-1, u_errorName(err)); | |
368 return; | |
369 } | |
370 err = U_ZERO_ERROR; | |
371 uDestLen = -2; | |
372 u_strFromUTF32(uTarget, UPRV_LENGTHOF(src16),&uDestLen,src32,-1,&err); | |
373 if(err != U_ZERO_ERROR || uDestLen != UPRV_LENGTHOF(src16)-1) { | |
374 log_err("u_strFromUTF32(with NUL-termination): " | |
375 "length %ld != %ld and %s != U_ZERO_ERROR\n", | |
376 (long)uDestLen, (long)UPRV_LENGTHOF(src16)-1, u_errorName(err)); | |
377 return; | |
378 } | |
379 | |
380 for(i=0; i< uDestLen; i++){ | |
381 if(uTarget[i] != src16[i]){ | |
382 log_verbose("u_strFromUTF32(with NUL-termination) failed expected: %
04X got: %04X \n", src16[i] ,uTarget[i]); | |
383 } | |
384 } | |
385 } | |
386 | |
387 /* test surrogate code points */ | |
388 static void Test_strFromUTF32_surrogates() { | |
389 UErrorCode err = U_ZERO_ERROR; | |
390 UChar uTarget[400]; | |
391 int32_t len32, uDestLen; | |
392 int32_t numSubstitutions; | |
393 int i; | |
394 | |
395 static const UChar32 surr32[] = { 0x41, 0xd900, 0x61, 0xdc00, -1, 0x110000,
0x5a, 0x50000, 0x7a, 0 }; | |
396 static const UChar expected[] = { 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; | |
397 static const UChar expected_FFFD[] = { 0x41, 0xfffd, 0x61, 0xfffd, 0xfffd, 0
xfffd, 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; | |
398 static const UChar expected_12345[] = { 0x41, 0xd808, 0xdf45, 0x61, 0xd808,
0xdf45, 0xd808, 0xdf45, 0xd808, 0xdf45, | |
399 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; | |
400 len32 = UPRV_LENGTHOF(surr32); | |
401 for(i = 0; i < 6; ++i) { | |
402 err = U_ZERO_ERROR; | |
403 u_strFromUTF32(uTarget, 0, &uDestLen, surr32+i, len32-i, &err); | |
404 if(err != U_INVALID_CHAR_FOUND) { | |
405 log_err("u_strFromUTF32(preflight surr32+%ld) sets %s != U_INVALID_C
HAR_FOUND\n", | |
406 (long)i, u_errorName(err)); | |
407 return; | |
408 } | |
409 | |
410 err = U_ZERO_ERROR; | |
411 u_strFromUTF32(uTarget, UPRV_LENGTHOF(uTarget), &uDestLen, surr32+i, len
32-i, &err); | |
412 if(err != U_INVALID_CHAR_FOUND) { | |
413 log_err("u_strFromUTF32(surr32+%ld) sets %s != U_INVALID_CHAR_FOUND\
n", | |
414 (long)i, u_errorName(err)); | |
415 return; | |
416 } | |
417 | |
418 err = U_ZERO_ERROR; | |
419 u_strFromUTF32(NULL, 0, &uDestLen, surr32+i, -1, &err); | |
420 if(err != U_INVALID_CHAR_FOUND) { | |
421 log_err("u_strFromUTF32(preflight surr32+%ld/NUL) sets %s != U_INVAL
ID_CHAR_FOUND\n", | |
422 (long)i, u_errorName(err)); | |
423 return; | |
424 } | |
425 | |
426 err = U_ZERO_ERROR; | |
427 u_strFromUTF32(uTarget, UPRV_LENGTHOF(uTarget), &uDestLen, surr32+i, -1,
&err); | |
428 if(err != U_INVALID_CHAR_FOUND) { | |
429 log_err("u_strFromUTF32(surr32+%ld/NUL) sets %s != U_INVALID_CHAR_FO
UND\n", | |
430 (long)i, u_errorName(err)); | |
431 return; | |
432 } | |
433 } | |
434 | |
435 err = U_ZERO_ERROR; | |
436 u_strFromUTF32(uTarget, 0, &uDestLen, surr32+6, len32-6-1, &err); | |
437 if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 4) { | |
438 log_err("u_strFromUTF32(preflight surr32+6) sets %s != U_BUFFER_OVERFLOW
_ERROR or an unexpected length\n", | |
439 u_errorName(err)); | |
440 return; | |
441 } | |
442 | |
443 err = U_ZERO_ERROR; | |
444 u_strFromUTF32(uTarget, UPRV_LENGTHOF(uTarget), &uDestLen, surr32+6, len32-6
-1, &err); | |
445 if(err != U_ZERO_ERROR || uDestLen != 4 || u_memcmp(uTarget, expected, 5)) { | |
446 log_err("u_strFromUTF32(surr32+6) sets %s != U_ZERO_ERROR or does not pr
oduce the expected string\n", | |
447 u_errorName(err)); | |
448 return; | |
449 } | |
450 | |
451 err = U_ZERO_ERROR; | |
452 u_strFromUTF32(NULL, 0, &uDestLen, surr32+6, -1, &err); | |
453 if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 4) { | |
454 log_err("u_strFromUTF32(preflight surr32+6/NUL) sets %s != U_BUFFER_OVER
FLOW_ERROR or an unexpected length\n", | |
455 u_errorName(err)); | |
456 return; | |
457 } | |
458 | |
459 err = U_ZERO_ERROR; | |
460 u_strFromUTF32(uTarget, UPRV_LENGTHOF(uTarget), &uDestLen, surr32+6, -1, &er
r); | |
461 if(err != U_ZERO_ERROR || uDestLen != 4 || u_memcmp(uTarget, expected, 5)) { | |
462 log_err("u_strFromUTF32(surr32+6/NUL) sets %s != U_ZERO_ERROR or does no
t produce the expected string\n", | |
463 u_errorName(err)); | |
464 return; | |
465 } | |
466 | |
467 /* with substitution character */ | |
468 numSubstitutions = -1; | |
469 err = U_ZERO_ERROR; | |
470 u_strFromUTF32WithSub(uTarget, 0, &uDestLen, surr32, len32-1, 0xfffd, &numSu
bstitutions, &err); | |
471 if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 10 || numSubstitutions != 4
) { | |
472 log_err("u_strFromUTF32WithSub(preflight surr32) sets %s != U_BUFFER_OVE
RFLOW_ERROR or an unexpected length\n", | |
473 u_errorName(err)); | |
474 return; | |
475 } | |
476 | |
477 err = U_ZERO_ERROR; | |
478 u_strFromUTF32WithSub(uTarget, UPRV_LENGTHOF(uTarget), &uDestLen, surr32, le
n32-1, 0xfffd, &numSubstitutions, &err); | |
479 if(err != U_ZERO_ERROR || uDestLen != 10 || numSubstitutions != 4 || u_memcm
p(uTarget, expected_FFFD, 11)) { | |
480 log_err("u_strFromUTF32WithSub(surr32) sets %s != U_ZERO_ERROR or does n
ot produce the expected string\n", | |
481 u_errorName(err)); | |
482 return; | |
483 } | |
484 | |
485 err = U_ZERO_ERROR; | |
486 u_strFromUTF32WithSub(NULL, 0, &uDestLen, surr32, -1, 0x12345, &numSubstitut
ions, &err); | |
487 if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 14 || numSubstitutions != 4
) { | |
488 log_err("u_strFromUTF32WithSub(preflight surr32/NUL) sets %s != U_BUFFER
_OVERFLOW_ERROR or an unexpected length\n", | |
489 u_errorName(err)); | |
490 return; | |
491 } | |
492 | |
493 err = U_ZERO_ERROR; | |
494 u_strFromUTF32WithSub(uTarget, UPRV_LENGTHOF(uTarget), &uDestLen, surr32, -1
, 0x12345, &numSubstitutions, &err); | |
495 if(err != U_ZERO_ERROR || uDestLen != 14 || numSubstitutions != 4 || u_memcm
p(uTarget, expected_12345, 15)) { | |
496 log_err("u_strFromUTF32WithSub(surr32/NUL) sets %s != U_ZERO_ERROR or do
es not produce the expected string\n", | |
497 u_errorName(err)); | |
498 return; | |
499 } | |
500 } | |
501 | |
502 static void Test_UChar_UTF8_API(void){ | |
503 | |
504 UErrorCode err = U_ZERO_ERROR; | |
505 UChar uTemp[1]; | |
506 char u8Temp[1]; | |
507 UChar* uTarget=uTemp; | |
508 const char* u8Src; | |
509 int32_t u8SrcLen = 0; | |
510 int32_t uTargetLength = 0; | |
511 int32_t uDestLen=0; | |
512 const UChar* uSrc = src16; | |
513 int32_t uSrcLen = sizeof(src16)/2; | |
514 char* u8Target = u8Temp; | |
515 int32_t u8TargetLength =0; | |
516 int32_t u8DestLen =0; | |
517 UBool failed = FALSE; | |
518 int i= 0; | |
519 int32_t numSubstitutions; | |
520 | |
521 { | |
522 /* preflight */ | |
523 u8Temp[0] = 0x12; | |
524 u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err); | |
525 if(err == U_BUFFER_OVERFLOW_ERROR && u8Temp[0] == 0x12){ | |
526 err = U_ZERO_ERROR; | |
527 u8Target = (char*) malloc (sizeof(uint8_t) * (u8DestLen+1)); | |
528 u8TargetLength = u8DestLen; | |
529 | |
530 u8Target[u8TargetLength] = (char)0xfe; | |
531 u8DestLen = -1; | |
532 u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err)
; | |
533 if(U_FAILURE(err) || u8DestLen != u8TargetLength || u8Target[u8Targe
tLength] != (char)0xfe){ | |
534 log_err("u_strToUTF8 failed after preflight. Error: %s\n", u_err
orName(err)); | |
535 return; | |
536 } | |
537 | |
538 } | |
539 else { | |
540 log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR"); | |
541 } | |
542 failed = FALSE; | |
543 /*for(i=0; i< u8DestLen; i++){ | |
544 printf("0x%04X, ",u8Target[i]); | |
545 if(i%10==0){ | |
546 printf("\n"); | |
547 } | |
548 }*/ | |
549 /*for(i=0; i< u8DestLen; i++){ | |
550 if(u8Target[i] != src8[i]){ | |
551 log_verbose("u_strToUTF8() failed expected: %04X got: %04X \n",
src8[i], u8Target[i]); | |
552 failed =TRUE; | |
553 } | |
554 } | |
555 if(failed){ | |
556 log_err("u_strToUTF8() failed \n"); | |
557 }*/ | |
558 u8Src = u8Target; | |
559 u8SrcLen = u8DestLen; | |
560 | |
561 /* preflight */ | |
562 uTemp[0] = 0x1234; | |
563 u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); | |
564 if(err == U_BUFFER_OVERFLOW_ERROR && uTemp[0] == 0x1234){ | |
565 err = U_ZERO_ERROR; | |
566 uTarget = (UChar*) malloc( sizeof(UChar) * (uDestLen+1)); | |
567 uTargetLength = uDestLen; | |
568 | |
569 uTarget[uTargetLength] = 0xfff0; | |
570 uDestLen = -1; | |
571 u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); | |
572 } | |
573 else { | |
574 log_err("error: u_strFromUTF8(preflight) should have gotten U_BUFFER
_OVERFLOW_ERROR\n"); | |
575 } | |
576 /*for(i=0; i< uDestLen; i++){ | |
577 printf("0x%04X, ",uTarget[i]); | |
578 if(i%10==0){ | |
579 printf("\n"); | |
580 } | |
581 }*/ | |
582 | |
583 if(U_FAILURE(err) || uDestLen != uTargetLength || uTarget[uTargetLength]
!= 0xfff0) { | |
584 failed = TRUE; | |
585 } | |
586 for(i=0; i< uSrcLen; i++){ | |
587 if(uTarget[i] != src16[i]){ | |
588 log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%0
4X at index: %i \n", src16[i] ,uTarget[i],i); | |
589 failed =TRUE; | |
590 } | |
591 } | |
592 if(failed){ | |
593 log_err("error: u_strFromUTF8(after preflighting) failed\n"); | |
594 } | |
595 | |
596 free(u8Target); | |
597 free(uTarget); | |
598 } | |
599 { | |
600 u8SrcLen = -1; | |
601 uTargetLength = 0; | |
602 uSrcLen =-1; | |
603 u8TargetLength=0; | |
604 failed = FALSE; | |
605 /* preflight */ | |
606 u_strToUTF8(NULL,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err); | |
607 if(err == U_BUFFER_OVERFLOW_ERROR){ | |
608 err = U_ZERO_ERROR; | |
609 u8Target = (char*) malloc (sizeof(uint8_t) * (u8DestLen+1)); | |
610 u8TargetLength = u8DestLen; | |
611 | |
612 u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err)
; | |
613 | |
614 } | |
615 else { | |
616 log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR"); | |
617 } | |
618 failed = FALSE; | |
619 /*for(i=0; i< u8DestLen; i++){ | |
620 printf("0x%04X, ",u8Target[i]); | |
621 if(i%10==0){ | |
622 printf("\n"); | |
623 } | |
624 }*/ | |
625 /*for(i=0; i< u8DestLen; i++){ | |
626 if(u8Target[i] != src8[i]){ | |
627 log_verbose("u_strToUTF8() failed expected: %04X got: %04X \n",
src8[i], u8Target[i]); | |
628 failed =TRUE; | |
629 } | |
630 } | |
631 if(failed){ | |
632 log_err("u_strToUTF8() failed \n"); | |
633 }*/ | |
634 u8Src = u8Target; | |
635 u8SrcLen = u8DestLen; | |
636 | |
637 /* preflight */ | |
638 u_strFromUTF8(NULL,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); | |
639 if(err == U_BUFFER_OVERFLOW_ERROR){ | |
640 err = U_ZERO_ERROR; | |
641 uTarget = (UChar*) malloc( sizeof(UChar) * (uDestLen+1)); | |
642 uTargetLength = uDestLen; | |
643 | |
644 u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); | |
645 } | |
646 else { | |
647 log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR"); | |
648 } | |
649 /*for(i=0; i< uDestLen; i++){ | |
650 printf("0x%04X, ",uTarget[i]); | |
651 if(i%10==0){ | |
652 printf("\n"); | |
653 } | |
654 }*/ | |
655 | |
656 for(i=0; i< uSrcLen; i++){ | |
657 if(uTarget[i] != src16[i]){ | |
658 log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%0
4X at index: %i \n", src16[i] ,uTarget[i],i); | |
659 failed =TRUE; | |
660 } | |
661 } | |
662 if(failed){ | |
663 log_err("u_strToUTF8() failed \n"); | |
664 } | |
665 | |
666 free(u8Target); | |
667 free(uTarget); | |
668 } | |
669 | |
670 /* test UTF-8 with single surrogates - illegal in Unicode 3.2 */ | |
671 { | |
672 static const UChar | |
673 withLead16[]={ 0x1800, 0xd89a, 0x0061 }, | |
674 withTrail16[]={ 0x1800, 0xdcba, 0x0061, 0 }, | |
675 withTrail16SubFFFD[]={ 0x1800, 0xfffd, 0x0061, 0 }, /* sub==U+FFFD *
/ | |
676 withTrail16Sub50005[]={ 0x1800, 0xd900, 0xdc05, 0x0061, 0 }; /* sub=
=U+50005 */ | |
677 static const uint8_t | |
678 withLead8[]={ 0xe1, 0xa0, 0x80, 0xed, 0xa2, 0x9a, 0x61 }, | |
679 withTrail8[]={ 0xe1, 0xa0, 0x80, 0xed, 0xb2, 0xba, 0x61, 0 }, | |
680 withTrail8Sub1A[]={ 0xe1, 0xa0, 0x80, 0x1a, 0x61, 0 }, /* sub==U+001
A */ | |
681 withTrail8SubFFFD[]={ 0xe1, 0xa0, 0x80, 0xef, 0xbf, 0xbd, 0x61, 0 };
/* sub==U+FFFD */ | |
682 UChar out16[10]; | |
683 char out8[10]; | |
684 | |
685 if( | |
686 (err=U_ZERO_ERROR, u_strToUTF8(out8, UPRV_LENGTHOF(out8), NULL, with
Lead16, UPRV_LENGTHOF(withLead16), &err), err!=U_INVALID_CHAR_FOUND) || | |
687 (err=U_ZERO_ERROR, u_strToUTF8(out8, UPRV_LENGTHOF(out8), NULL, with
Trail16, -1, &err), err!=U_INVALID_CHAR_FOUND) || | |
688 (err=U_ZERO_ERROR, u_strFromUTF8(out16, UPRV_LENGTHOF(out16), NULL,
(const char *)withLead8, UPRV_LENGTHOF(withLead8), &err), err!=U_INVALID_CHAR_FO
UND) || | |
689 (err=U_ZERO_ERROR, u_strFromUTF8(out16, UPRV_LENGTHOF(out16), NULL,
(const char *)withTrail8, -1, &err), err!=U_INVALID_CHAR_FOUND) | |
690 ) { | |
691 log_err("error: u_strTo/FromUTF8(string with single surrogate) fails
to report error\n"); | |
692 } | |
693 | |
694 /* test error handling with substitution characters */ | |
695 | |
696 /* from UTF-8 with length */ | |
697 err=U_ZERO_ERROR; | |
698 numSubstitutions=-1; | |
699 out16[0]=0x55aa; | |
700 uDestLen=0; | |
701 u_strFromUTF8WithSub(out16, UPRV_LENGTHOF(out16), &uDestLen, | |
702 (const char *)withTrail8, uprv_strlen((const char *
)withTrail8), | |
703 0x50005, &numSubstitutions, | |
704 &err); | |
705 if(U_FAILURE(err) || uDestLen!=u_strlen(withTrail16Sub50005) || | |
706 0!=u_memcmp(withTrail16Sub50005, out16, uDestLen+1)
|| | |
707 numSubstitutions!=1) { | |
708 log_err("error: u_strFromUTF8WithSub(length) failed\n"); | |
709 } | |
710 | |
711 /* from UTF-8 with NUL termination */ | |
712 err=U_ZERO_ERROR; | |
713 numSubstitutions=-1; | |
714 out16[0]=0x55aa; | |
715 uDestLen=0; | |
716 u_strFromUTF8WithSub(out16, UPRV_LENGTHOF(out16), &uDestLen, | |
717 (const char *)withTrail8, -1, | |
718 0xfffd, &numSubstitutions, | |
719 &err); | |
720 if(U_FAILURE(err) || uDestLen!=u_strlen(withTrail16SubFFFD) || | |
721 0!=u_memcmp(withTrail16SubFFFD, out16, uDestLen+1)
|| | |
722 numSubstitutions!=1) { | |
723 log_err("error: u_strFromUTF8WithSub(NUL termination) failed\n"); | |
724 } | |
725 | |
726 /* preflight from UTF-8 with NUL termination */ | |
727 err=U_ZERO_ERROR; | |
728 numSubstitutions=-1; | |
729 out16[0]=0x55aa; | |
730 uDestLen=0; | |
731 u_strFromUTF8WithSub(out16, 1, &uDestLen, | |
732 (const char *)withTrail8, -1, | |
733 0x50005, &numSubstitutions, | |
734 &err); | |
735 if(err!=U_BUFFER_OVERFLOW_ERROR || uDestLen!=u_strlen(withTrail16Sub5000
5) || numSubstitutions!=1) { | |
736 log_err("error: u_strFromUTF8WithSub(preflight/NUL termination) fail
ed\n"); | |
737 } | |
738 | |
739 /* to UTF-8 with length */ | |
740 err=U_ZERO_ERROR; | |
741 numSubstitutions=-1; | |
742 out8[0]=(char)0xf5; | |
743 u8DestLen=0; | |
744 u_strToUTF8WithSub(out8, UPRV_LENGTHOF(out8), &u8DestLen, | |
745 withTrail16, u_strlen(withTrail16), | |
746 0xfffd, &numSubstitutions, | |
747 &err); | |
748 if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8SubF
FFD) || | |
749 0!=uprv_memcmp((const char *)withTrail8SubFFFD, out
8, u8DestLen+1) || | |
750 numSubstitutions!=1) { | |
751 log_err("error: u_strToUTF8WithSub(length) failed\n"); | |
752 } | |
753 | |
754 /* to UTF-8 with NUL termination */ | |
755 err=U_ZERO_ERROR; | |
756 numSubstitutions=-1; | |
757 out8[0]=(char)0xf5; | |
758 u8DestLen=0; | |
759 u_strToUTF8WithSub(out8, UPRV_LENGTHOF(out8), &u8DestLen, | |
760 withTrail16, -1, | |
761 0x1a, &numSubstitutions, | |
762 &err); | |
763 if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8Sub1
A) || | |
764 0!=uprv_memcmp((const char *)withTrail8Sub1A, out8,
u8DestLen+1) || | |
765 numSubstitutions!=1) { | |
766 log_err("error: u_strToUTF8WithSub(NUL termination) failed\n"); | |
767 } | |
768 | |
769 /* preflight to UTF-8 with NUL termination */ | |
770 err=U_ZERO_ERROR; | |
771 numSubstitutions=-1; | |
772 out8[0]=(char)0xf5; | |
773 u8DestLen=0; | |
774 u_strToUTF8WithSub(out8, 1, &u8DestLen, | |
775 withTrail16, -1, | |
776 0xfffd, &numSubstitutions, | |
777 &err); | |
778 if(err!=U_BUFFER_OVERFLOW_ERROR || u8DestLen!=uprv_strlen((const char *)
withTrail8SubFFFD) || | |
779 numSubstitutions!=1) { | |
780 log_err("error: u_strToUTF8WithSub(preflight/NUL termination) failed
\n"); | |
781 } | |
782 | |
783 /* test that numSubstitutions==0 if there are no substitutions */ | |
784 | |
785 /* from UTF-8 with length (just first 3 bytes which are valid) */ | |
786 err=U_ZERO_ERROR; | |
787 numSubstitutions=-1; | |
788 out16[0]=0x55aa; | |
789 uDestLen=0; | |
790 u_strFromUTF8WithSub(out16, UPRV_LENGTHOF(out16), &uDestLen, | |
791 (const char *)withTrail8, 3, | |
792 0x50005, &numSubstitutions, | |
793 &err); | |
794 if(U_FAILURE(err) || uDestLen!=1 || | |
795 0!=u_memcmp(withTrail16Sub50005, out16, uDestLen) |
| | |
796 numSubstitutions!=0) { | |
797 log_err("error: u_strFromUTF8WithSub(no subs) failed\n"); | |
798 } | |
799 | |
800 /* to UTF-8 with length (just first UChar which is valid) */ | |
801 err=U_ZERO_ERROR; | |
802 numSubstitutions=-1; | |
803 out8[0]=(char)0xf5; | |
804 u8DestLen=0; | |
805 u_strToUTF8WithSub(out8, UPRV_LENGTHOF(out8), &u8DestLen, | |
806 withTrail16, 1, | |
807 0xfffd, &numSubstitutions, | |
808 &err); | |
809 if(U_FAILURE(err) || u8DestLen!=3 || | |
810 0!=uprv_memcmp((const char *)withTrail8SubFFFD, out
8, u8DestLen) || | |
811 numSubstitutions!=0) { | |
812 log_err("error: u_strToUTF8WithSub(no subs) failed\n"); | |
813 } | |
814 | |
815 /* test that numSubstitutions==0 if subchar==U_SENTINEL (no subchar) */ | |
816 | |
817 /* from UTF-8 with length (just first 3 bytes which are valid) */ | |
818 err=U_ZERO_ERROR; | |
819 numSubstitutions=-1; | |
820 out16[0]=0x55aa; | |
821 uDestLen=0; | |
822 u_strFromUTF8WithSub(out16, UPRV_LENGTHOF(out16), &uDestLen, | |
823 (const char *)withTrail8, 3, | |
824 U_SENTINEL, &numSubstitutions, | |
825 &err); | |
826 if(U_FAILURE(err) || uDestLen!=1 || | |
827 0!=u_memcmp(withTrail16Sub50005, out16, uDestLen) |
| | |
828 numSubstitutions!=0) { | |
829 log_err("error: u_strFromUTF8WithSub(no subchar) failed\n"); | |
830 } | |
831 | |
832 /* to UTF-8 with length (just first UChar which is valid) */ | |
833 err=U_ZERO_ERROR; | |
834 numSubstitutions=-1; | |
835 out8[0]=(char)0xf5; | |
836 u8DestLen=0; | |
837 u_strToUTF8WithSub(out8, UPRV_LENGTHOF(out8), &u8DestLen, | |
838 withTrail16, 1, | |
839 U_SENTINEL, &numSubstitutions, | |
840 &err); | |
841 if(U_FAILURE(err) || u8DestLen!=3 || | |
842 0!=uprv_memcmp((const char *)withTrail8SubFFFD, out
8, u8DestLen) || | |
843 numSubstitutions!=0) { | |
844 log_err("error: u_strToUTF8WithSub(no subchar) failed\n"); | |
845 } | |
846 } | |
847 { | |
848 /* | |
849 * Test with an illegal lead byte that would be followed by more than 3
trail bytes. | |
850 * See ticket #10371. | |
851 */ | |
852 static const char src[1]={ (char)0xf8 }; | |
853 UChar out16[10]; | |
854 err=U_ZERO_ERROR; | |
855 u_strFromUTF8(out16, UPRV_LENGTHOF(out16), NULL, src, 1, &err); | |
856 if(err!=U_INVALID_CHAR_FOUND) { | |
857 log_err("error: u_strFromUTF8(5-byte lead byte) failed\n"); | |
858 } | |
859 } | |
860 } | |
861 | |
862 /* compare if two strings are equal, but match 0xfffd in the second string with
anything in the first */ | |
863 static UBool | |
864 equalAnyFFFD(const UChar *s, const UChar *t, int32_t length) { | |
865 UChar c1, c2; | |
866 | |
867 while(length>0) { | |
868 c1=*s++; | |
869 c2=*t++; | |
870 if(c1!=c2 && c2!=0xfffd) { | |
871 return FALSE; | |
872 } | |
873 --length; | |
874 } | |
875 return TRUE; | |
876 } | |
877 | |
878 /* test u_strFromUTF8Lenient() */ | |
879 static void | |
880 Test_FromUTF8(void) { | |
881 /* | |
882 * Test case from icu-support list 20071130 "u_strFromUTF8() returns U_INVAL
ID_CHAR_FOUND(10)" | |
883 */ | |
884 static const uint8_t bytes[]={ 0xe0, 0xa5, 0x9c, 0 }; | |
885 UChar dest[64]; | |
886 UChar *destPointer; | |
887 int32_t destLength; | |
888 UErrorCode errorCode; | |
889 | |
890 /* 3 bytes input, one UChar output (U+095C) */ | |
891 errorCode=U_ZERO_ERROR; | |
892 destLength=-99; | |
893 destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, 3, &err
orCode); | |
894 if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=1)
{ | |
895 log_err("error: u_strFromUTF8(preflight srcLength=3) fails: destLength=%
ld - %s\n", | |
896 (long)destLength, u_errorName(errorCode)); | |
897 } | |
898 | |
899 /* 4 bytes input, two UChars output (U+095C U+0000) */ | |
900 errorCode=U_ZERO_ERROR; | |
901 destLength=-99; | |
902 destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, 4, &err
orCode); | |
903 if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=2)
{ | |
904 log_err("error: u_strFromUTF8(preflight srcLength=4) fails: destLength=%
ld - %s\n", | |
905 (long)destLength, u_errorName(errorCode)); | |
906 } | |
907 | |
908 /* NUL-terminated 3 bytes input, one UChar output (U+095C) */ | |
909 errorCode=U_ZERO_ERROR; | |
910 destLength=-99; | |
911 destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, -1, &er
rorCode); | |
912 if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=1)
{ | |
913 log_err("error: u_strFromUTF8(preflight srcLength=-1) fails: destLength=
%ld - %s\n", | |
914 (long)destLength, u_errorName(errorCode)); | |
915 } | |
916 | |
917 /* 3 bytes input, one UChar output (U+095C), transform not just preflight */ | |
918 errorCode=U_ZERO_ERROR; | |
919 dest[0]=dest[1]=99; | |
920 destLength=-99; | |
921 destPointer=u_strFromUTF8(dest, UPRV_LENGTHOF(dest), &destLength, (const cha
r *)bytes, 3, &errorCode); | |
922 if(U_FAILURE(errorCode) || destPointer!=dest || destLength!=1 || dest[0]!=0x
95c || dest[1]!=0) { | |
923 log_err("error: u_strFromUTF8(transform srcLength=3) fails: destLength=%
ld - %s\n", | |
924 (long)destLength, u_errorName(errorCode)); | |
925 } | |
926 } | |
927 | |
928 /* test u_strFromUTF8Lenient() */ | |
929 static void | |
930 Test_FromUTF8Lenient(void) { | |
931 /* | |
932 * Multiple input strings, each NUL-terminated. | |
933 * Terminate with a string starting with 0xff. | |
934 */ | |
935 static const uint8_t bytes[]={ | |
936 /* well-formed UTF-8 */ | |
937 0x61, 0xc3, 0x9f, 0xe0, 0xa0, 0x80, 0xf0, 0xa0, 0x80, 0x80, | |
938 0x62, 0xc3, 0xa0, 0xe0, 0xa0, 0x81, 0xf0, 0xa0, 0x80, 0x81, 0, | |
939 | |
940 /* various malformed sequences */ | |
941 0xc3, 0xc3, 0x9f, 0xc3, 0xa0, 0xe0, 0x80, 0x8a, 0xf0, 0x41, 0x42, 0x4
3, 0, | |
942 | |
943 /* truncated input */ | |
944 0xc3, 0, | |
945 0xe0, 0, | |
946 0xe0, 0xa0, 0, | |
947 0xf0, 0, | |
948 0xf0, 0x90, 0, | |
949 0xf0, 0x90, 0x80, 0, | |
950 | |
951 /* non-ASCII characters in the last few bytes */ | |
952 0x61, 0xc3, 0x9f, 0xe0, 0xa0, 0x80, 0, | |
953 0x61, 0xe0, 0xa0, 0x80, 0xc3, 0x9f, 0, | |
954 | |
955 /* empty string */ | |
956 0, | |
957 | |
958 /* finish */ | |
959 0xff, 0 | |
960 }; | |
961 | |
962 /* Multiple output strings, each NUL-terminated. 0xfffd matches anything. */ | |
963 static const UChar uchars[]={ | |
964 0x61, 0xdf, 0x800, 0xd840, 0xdc00, | |
965 0x62, 0xe0, 0x801, 0xd840, 0xdc01, 0, | |
966 | |
967 0xfffd, 0x9f, 0xe0, 0xa, 0xfffd, 0xfffd, 0, | |
968 | |
969 0xfffd, 0, | |
970 0xfffd, 0, | |
971 0xfffd, 0, | |
972 0xfffd, 0, | |
973 0xfffd, 0, | |
974 0xfffd, 0, | |
975 | |
976 0x61, 0xdf, 0x800, 0, | |
977 0x61, 0x800, 0xdf, 0, | |
978 | |
979 0, | |
980 | |
981 0 | |
982 }; | |
983 | |
984 UChar dest[64]; | |
985 const char *pb; | |
986 const UChar *pu, *pDest; | |
987 int32_t srcLength, destLength0, destLength; | |
988 int number; | |
989 UErrorCode errorCode; | |
990 | |
991 /* verify checking for some illegal arguments */ | |
992 dest[0]=0x1234; | |
993 destLength=-1; | |
994 errorCode=U_ZERO_ERROR; | |
995 pDest=u_strFromUTF8Lenient(dest, 1, &destLength, NULL, -1, &errorCode); | |
996 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0x1234) { | |
997 log_err("u_strFromUTF8Lenient(src=NULL) failed\n"); | |
998 } | |
999 | |
1000 dest[0]=0x1234; | |
1001 destLength=-1; | |
1002 errorCode=U_ZERO_ERROR; | |
1003 pDest=u_strFromUTF8Lenient(NULL, 1, &destLength, (const char *)bytes, -1, &e
rrorCode); | |
1004 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { | |
1005 log_err("u_strFromUTF8Lenient(dest=NULL[1]) failed\n"); | |
1006 } | |
1007 | |
1008 dest[0]=0x1234; | |
1009 destLength=-1; | |
1010 errorCode=U_MEMORY_ALLOCATION_ERROR; | |
1011 pDest=u_strFromUTF8Lenient(dest, 1, &destLength, (const char *)bytes, -1, &e
rrorCode); | |
1012 if(errorCode!=U_MEMORY_ALLOCATION_ERROR || dest[0]!=0x1234) { | |
1013 log_err("u_strFromUTF8Lenient(U_MEMORY_ALLOCATION_ERROR) failed\n"); | |
1014 } | |
1015 | |
1016 dest[0]=0x1234; | |
1017 destLength=-1; | |
1018 errorCode=U_MEMORY_ALLOCATION_ERROR; | |
1019 pDest=u_strFromUTF8Lenient(dest, 1, &destLength, (const char *)bytes, -1, NU
LL); | |
1020 if(dest[0]!=0x1234) { | |
1021 log_err("u_strFromUTF8Lenient(pErrorCode=NULL) failed\n"); | |
1022 } | |
1023 | |
1024 /* test normal behavior */ | |
1025 number=0; /* string number for log_err() */ | |
1026 | |
1027 for(pb=(const char *)bytes, pu=uchars; | |
1028 *pb!=(char)0xff; | |
1029 pb+=srcLength+1, pu+=destLength0+1, ++number | |
1030 ) { | |
1031 srcLength=uprv_strlen(pb); | |
1032 destLength0=u_strlen(pu); | |
1033 | |
1034 /* preflighting with NUL-termination */ | |
1035 dest[0]=0x1234; | |
1036 destLength=-1; | |
1037 errorCode=U_ZERO_ERROR; | |
1038 pDest=u_strFromUTF8Lenient(NULL, 0, &destLength, pb, -1, &errorCode); | |
1039 if (errorCode!= (destLength0==0 ? U_STRING_NOT_TERMINATED_WARNING : U_BU
FFER_OVERFLOW_ERROR) || | |
1040 pDest!=NULL || dest[0]!=0x1234 || destLength!=destLength0 | |
1041 ) { | |
1042 log_err("u_strFromUTF8Lenient(%d preflighting with NUL-termination)
failed\n", number); | |
1043 } | |
1044 | |
1045 /* preflighting/some capacity with NUL-termination */ | |
1046 if(srcLength>0) { | |
1047 dest[destLength0-1]=0x1234; | |
1048 destLength=-1; | |
1049 errorCode=U_ZERO_ERROR; | |
1050 pDest=u_strFromUTF8Lenient(dest, destLength0-1, &destLength, pb, -1,
&errorCode); | |
1051 if (errorCode!=U_BUFFER_OVERFLOW_ERROR || | |
1052 dest[destLength0-1]!=0x1234 || destLength!=destLength0 | |
1053 ) { | |
1054 log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with
NUL-termination) failed\n", number); | |
1055 } | |
1056 } | |
1057 | |
1058 /* conversion with NUL-termination, much capacity */ | |
1059 dest[0]=dest[destLength0]=0x1234; | |
1060 destLength=-1; | |
1061 errorCode=U_ZERO_ERROR; | |
1062 pDest=u_strFromUTF8Lenient(dest, UPRV_LENGTHOF(dest), &destLength, pb, -
1, &errorCode); | |
1063 if (errorCode!=U_ZERO_ERROR || | |
1064 pDest!=dest || dest[destLength0]!=0 || | |
1065 destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) | |
1066 ) { | |
1067 log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, mu
ch capacity) failed\n", number); | |
1068 } | |
1069 | |
1070 /* conversion with NUL-termination, exact capacity */ | |
1071 dest[0]=dest[destLength0]=0x1234; | |
1072 destLength=-1; | |
1073 errorCode=U_ZERO_ERROR; | |
1074 pDest=u_strFromUTF8Lenient(dest, destLength0, &destLength, pb, -1, &erro
rCode); | |
1075 if (errorCode!=U_STRING_NOT_TERMINATED_WARNING || | |
1076 pDest!=dest || dest[destLength0]!=0x1234 || | |
1077 destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) | |
1078 ) { | |
1079 log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, ex
act capacity) failed\n", number); | |
1080 } | |
1081 | |
1082 /* preflighting with length */ | |
1083 dest[0]=0x1234; | |
1084 destLength=-1; | |
1085 errorCode=U_ZERO_ERROR; | |
1086 pDest=u_strFromUTF8Lenient(NULL, 0, &destLength, pb, srcLength, &errorCo
de); | |
1087 if (errorCode!= (destLength0==0 ? U_STRING_NOT_TERMINATED_WARNING : U_BU
FFER_OVERFLOW_ERROR) || | |
1088 pDest!=NULL || dest[0]!=0x1234 || destLength!=srcLength | |
1089 ) { | |
1090 log_err("u_strFromUTF8Lenient(%d preflighting with length) failed\n"
, number); | |
1091 } | |
1092 | |
1093 /* preflighting/some capacity with length */ | |
1094 if(srcLength>0) { | |
1095 dest[srcLength-1]=0x1234; | |
1096 destLength=-1; | |
1097 errorCode=U_ZERO_ERROR; | |
1098 pDest=u_strFromUTF8Lenient(dest, srcLength-1, &destLength, pb, srcLe
ngth, &errorCode); | |
1099 if (errorCode!=U_BUFFER_OVERFLOW_ERROR || | |
1100 dest[srcLength-1]!=0x1234 || destLength!=srcLength | |
1101 ) { | |
1102 log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with
length) failed\n", number); | |
1103 } | |
1104 } | |
1105 | |
1106 /* conversion with length, much capacity */ | |
1107 dest[0]=dest[destLength0]=0x1234; | |
1108 destLength=-1; | |
1109 errorCode=U_ZERO_ERROR; | |
1110 pDest=u_strFromUTF8Lenient(dest, UPRV_LENGTHOF(dest), &destLength, pb, s
rcLength, &errorCode); | |
1111 if (errorCode!=U_ZERO_ERROR || | |
1112 pDest!=dest || dest[destLength0]!=0 || | |
1113 destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) | |
1114 ) { | |
1115 log_err("u_strFromUTF8Lenient(%d conversion with length, much capaci
ty) failed\n", number); | |
1116 } | |
1117 | |
1118 /* conversion with length, srcLength capacity */ | |
1119 dest[0]=dest[srcLength]=dest[destLength0]=0x1234; | |
1120 destLength=-1; | |
1121 errorCode=U_ZERO_ERROR; | |
1122 pDest=u_strFromUTF8Lenient(dest, srcLength, &destLength, pb, srcLength,
&errorCode); | |
1123 if(srcLength==destLength0) { | |
1124 if (errorCode!=U_STRING_NOT_TERMINATED_WARNING || | |
1125 pDest!=dest || dest[destLength0]!=0x1234 || | |
1126 destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) | |
1127 ) { | |
1128 log_err("u_strFromUTF8Lenient(%d conversion with length, srcLeng
th capacity/not terminated) failed\n", number); | |
1129 } | |
1130 } else { | |
1131 if (errorCode!=U_ZERO_ERROR || | |
1132 pDest!=dest || dest[destLength0]!=0 || | |
1133 destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) | |
1134 ) { | |
1135 log_err("u_strFromUTF8Lenient(%d conversion with length, srcLeng
th capacity/terminated) failed\n", number); | |
1136 } | |
1137 } | |
1138 } | |
1139 } | |
1140 | |
1141 static const uint16_t src16j[] = { | |
1142 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x00
0A, | |
1143 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x00
0A, | |
1144 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x00
0A, | |
1145 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x00
0A, | |
1146 0x0000, | |
1147 /* Test only ASCII */ | |
1148 | |
1149 }; | |
1150 static const uint16_t src16WithNulls[] = { | |
1151 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0000, | |
1152 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, 0x0000, | |
1153 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0000, | |
1154 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, 0x0000, | |
1155 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000, | |
1156 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000, | |
1157 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000, | |
1158 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000, | |
1159 /* test only ASCII */ | |
1160 /* | |
1161 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, | |
1162 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00
B7, | |
1163 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00
C1, | |
1164 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00
CB, | |
1165 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00
D5, | |
1166 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00
DF, | |
1167 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00
E9, | |
1168 0x0054, 0x0000 */ | |
1169 | |
1170 }; | |
1171 static void Test_UChar_WCHART_API(void){ | |
1172 #if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CON
VERSION && !UCONFIG_NO_LEGACY_CONVERSION) | |
1173 UErrorCode err = U_ZERO_ERROR; | |
1174 const UChar* uSrc = src16j; | |
1175 int32_t uSrcLen = sizeof(src16j)/2; | |
1176 wchar_t* wDest = NULL; | |
1177 int32_t wDestLen = 0; | |
1178 int32_t reqLen= 0 ; | |
1179 UBool failed = FALSE; | |
1180 UChar* uDest = NULL; | |
1181 int32_t uDestLen = 0; | |
1182 int i =0; | |
1183 { | |
1184 /* Bad UErrorCode arguments. Make sure that the API doesn't crash, and t
hat Purify doesn't complain. */ | |
1185 if (u_strFromWCS(NULL,0,NULL,NULL,0,NULL) != NULL) { | |
1186 log_err("u_strFromWCS() should return NULL with a bad argument\n"); | |
1187 } | |
1188 if (u_strToWCS(NULL,0,NULL,NULL,0,NULL) != NULL) { | |
1189 log_err("u_strToWCS() should return NULL with a bad argument\n"); | |
1190 } | |
1191 | |
1192 /* NULL source & destination. */ | |
1193 err = U_ZERO_ERROR; | |
1194 u_strFromWCS(NULL,0,NULL,NULL,0,&err); | |
1195 if (err != U_STRING_NOT_TERMINATED_WARNING) { | |
1196 log_err("u_strFromWCS(NULL, NULL) failed. Error: %s \n", u_errorName
(err)); | |
1197 } | |
1198 err = U_ZERO_ERROR; | |
1199 u_strToWCS(NULL,0,NULL,NULL,0,&err); | |
1200 if (err != U_STRING_NOT_TERMINATED_WARNING) { | |
1201 log_err("u_strToWCS(NULL, NULL) failed. Error: %s \n", u_errorName(e
rr)); | |
1202 } | |
1203 err = U_ZERO_ERROR; | |
1204 | |
1205 /* pre-flight*/ | |
1206 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); | |
1207 | |
1208 if(err == U_BUFFER_OVERFLOW_ERROR){ | |
1209 err=U_ZERO_ERROR; | |
1210 wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); | |
1211 wDestLen = reqLen+1; | |
1212 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); | |
1213 } | |
1214 | |
1215 /* pre-flight */ | |
1216 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); | |
1217 | |
1218 | |
1219 if(err == U_BUFFER_OVERFLOW_ERROR){ | |
1220 err =U_ZERO_ERROR; | |
1221 uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); | |
1222 uDestLen = reqLen + 1; | |
1223 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); | |
1224 }else if(U_FAILURE(err)){ | |
1225 | |
1226 log_err("u_strFromWCS() failed. Error: %s \n", u_errorName(err)); | |
1227 return; | |
1228 } | |
1229 | |
1230 for(i=0; i< uSrcLen; i++){ | |
1231 if(uDest[i] != src16j[i]){ | |
1232 log_verbose("u_str*WCS() failed for unterminated string expected
: \\u%04X got: \\u%04X at index: %i \n", src16j[i] ,uDest[i],i); | |
1233 failed =TRUE; | |
1234 } | |
1235 } | |
1236 | |
1237 if(U_FAILURE(err)){ | |
1238 failed = TRUE; | |
1239 } | |
1240 if(failed){ | |
1241 log_err("u_strToWCS() failed \n"); | |
1242 } | |
1243 free(wDest); | |
1244 free(uDest); | |
1245 | |
1246 | |
1247 /* test with embeded nulls */ | |
1248 uSrc = src16WithNulls; | |
1249 uSrcLen = sizeof(src16WithNulls)/2; | |
1250 wDestLen =0; | |
1251 uDestLen =0; | |
1252 wDest = NULL; | |
1253 uDest = NULL; | |
1254 /* pre-flight*/ | |
1255 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); | |
1256 | |
1257 if(err == U_BUFFER_OVERFLOW_ERROR){ | |
1258 err=U_ZERO_ERROR; | |
1259 wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); | |
1260 wDestLen = reqLen+1; | |
1261 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); | |
1262 } | |
1263 | |
1264 /* pre-flight */ | |
1265 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); | |
1266 | |
1267 if(err == U_BUFFER_OVERFLOW_ERROR){ | |
1268 err =U_ZERO_ERROR; | |
1269 uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); | |
1270 uDestLen = reqLen + 1; | |
1271 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); | |
1272 } | |
1273 | |
1274 if(!U_FAILURE(err)) { | |
1275 for(i=0; i< uSrcLen; i++){ | |
1276 if(uDest[i] != src16WithNulls[i]){ | |
1277 log_verbose("u_str*WCS() failed for string with nulls expected:
\\u%04X got: \\u%04X at index: %i \n", src16WithNulls[i] ,uDest[i],i); | |
1278 failed =TRUE; | |
1279 } | |
1280 } | |
1281 } | |
1282 | |
1283 if(U_FAILURE(err)){ | |
1284 failed = TRUE; | |
1285 } | |
1286 if(failed){ | |
1287 log_err("u_strToWCS() failed \n"); | |
1288 } | |
1289 free(wDest); | |
1290 free(uDest); | |
1291 | |
1292 } | |
1293 | |
1294 { | |
1295 | |
1296 uSrc = src16j; | |
1297 uSrcLen = sizeof(src16j)/2; | |
1298 wDestLen =0; | |
1299 uDestLen =0; | |
1300 wDest = NULL; | |
1301 uDest = NULL; | |
1302 wDestLen = 0; | |
1303 /* pre-flight*/ | |
1304 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&err); | |
1305 | |
1306 if(err == U_BUFFER_OVERFLOW_ERROR){ | |
1307 err=U_ZERO_ERROR; | |
1308 wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); | |
1309 wDestLen = reqLen+1; | |
1310 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&err); | |
1311 } | |
1312 uDestLen = 0; | |
1313 /* pre-flight */ | |
1314 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&err); | |
1315 | |
1316 if(err == U_BUFFER_OVERFLOW_ERROR){ | |
1317 err =U_ZERO_ERROR; | |
1318 uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); | |
1319 uDestLen = reqLen + 1; | |
1320 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&err); | |
1321 } | |
1322 | |
1323 | |
1324 if(!U_FAILURE(err)) { | |
1325 for(i=0; i< uSrcLen; i++){ | |
1326 if(uDest[i] != src16j[i]){ | |
1327 log_verbose("u_str*WCS() failed for null terminated string expec
ted: \\u%04X got: \\u%04X at index: %i \n", src16j[i] ,uDest[i],i); | |
1328 failed =TRUE; | |
1329 } | |
1330 } | |
1331 } | |
1332 | |
1333 if(U_FAILURE(err)){ | |
1334 failed = TRUE; | |
1335 } | |
1336 if(failed){ | |
1337 log_err("u_strToWCS() failed \n"); | |
1338 } | |
1339 free(wDest); | |
1340 free(uDest); | |
1341 } | |
1342 | |
1343 /* | |
1344 * Test u_terminateWChars(). | |
1345 * All u_terminateXYZ() use the same implementation macro; | |
1346 * we test this function to improve API coverage. | |
1347 */ | |
1348 { | |
1349 wchar_t buffer[10]; | |
1350 | |
1351 err=U_ZERO_ERROR; | |
1352 buffer[3]=0x20ac; | |
1353 wDestLen=u_terminateWChars(buffer, UPRV_LENGTHOF(buffer), 3, &err); | |
1354 if(err!=U_ZERO_ERROR || wDestLen!=3 || buffer[3]!=0) { | |
1355 log_err("u_terminateWChars(buffer, all, 3, zero) failed: %s length %
d [3]==U+%04x\n", | |
1356 u_errorName(err), wDestLen, buffer[3]); | |
1357 } | |
1358 | |
1359 err=U_ZERO_ERROR; | |
1360 buffer[3]=0x20ac; | |
1361 wDestLen=u_terminateWChars(buffer, 3, 3, &err); | |
1362 if(err!=U_STRING_NOT_TERMINATED_WARNING || wDestLen!=3 || buffer[3]!=0x2
0ac) { | |
1363 log_err("u_terminateWChars(buffer, 3, 3, zero) failed: %s length %d
[3]==U+%04x\n", | |
1364 u_errorName(err), wDestLen, buffer[3]); | |
1365 } | |
1366 | |
1367 err=U_STRING_NOT_TERMINATED_WARNING; | |
1368 buffer[3]=0x20ac; | |
1369 wDestLen=u_terminateWChars(buffer, UPRV_LENGTHOF(buffer), 3, &err); | |
1370 if(err!=U_ZERO_ERROR || wDestLen!=3 || buffer[3]!=0) { | |
1371 log_err("u_terminateWChars(buffer, all, 3, not-terminated) failed: %
s length %d [3]==U+%04x\n", | |
1372 u_errorName(err), wDestLen, buffer[3]); | |
1373 } | |
1374 | |
1375 err=U_ZERO_ERROR; | |
1376 buffer[3]=0x20ac; | |
1377 wDestLen=u_terminateWChars(buffer, 2, 3, &err); | |
1378 if(err!=U_BUFFER_OVERFLOW_ERROR || wDestLen!=3 || buffer[3]!=0x20ac) { | |
1379 log_err("u_terminateWChars(buffer, 2, 3, zero) failed: %s length %d
[3]==U+%04x\n", | |
1380 u_errorName(err), wDestLen, buffer[3]); | |
1381 } | |
1382 } | |
1383 #else | |
1384 log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_
NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32"); | |
1385 #endif | |
1386 } | |
1387 | |
1388 static void Test_widestrs() | |
1389 { | |
1390 #if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CON
VERSION && !UCONFIG_NO_LEGACY_CONVERSION) | |
1391 wchar_t ws[100]; | |
1392 UChar rts[100]; | |
1393 int32_t wcap = sizeof(ws) / sizeof(*ws); | |
1394 int32_t wl; | |
1395 int32_t rtcap = sizeof(rts) / sizeof(*rts); | |
1396 int32_t rtl; | |
1397 wchar_t *wcs; | |
1398 UChar *cp; | |
1399 const char *errname; | |
1400 UChar ustr[] = {'h', 'e', 'l', 'l', 'o', 0}; | |
1401 int32_t ul = sizeof(ustr)/sizeof(*ustr) -1; | |
1402 char astr[100]; | |
1403 | |
1404 UErrorCode err; | |
1405 | |
1406 err = U_ZERO_ERROR; | |
1407 wcs = u_strToWCS(ws, wcap, &wl, ustr, ul, &err); | |
1408 if (U_FAILURE(err)) { | |
1409 errname = u_errorName(err); | |
1410 log_err("test_widestrs: u_strToWCS error: %s!\n",errname); | |
1411 } | |
1412 if(ul!=wl){ | |
1413 log_err("u_strToWCS: ustr = %s, ul = %d, ws = %S, wl = %d!\n", u_aus
trcpy(astr, ustr), ul, ws, wl); | |
1414 } | |
1415 err = U_ZERO_ERROR; | |
1416 wl = (int32_t)uprv_wcslen(wcs); | |
1417 cp = u_strFromWCS(rts, rtcap, &rtl, wcs, wl, &err); | |
1418 (void)cp; /* Suppress set but not used warning. */ | |
1419 if (U_FAILURE(err)) { | |
1420 errname = u_errorName(err); | |
1421 fprintf(stderr, "test_widestrs: ucnv_wcstombs error: %s!\n",errn
ame); | |
1422 } | |
1423 if(wl != rtl){ | |
1424 log_err("u_strFromWCS: wcs = %S, wl = %d,rts = %s, rtl = %d!\n", wcs
, wl, u_austrcpy(astr, rts), rtl); | |
1425 } | |
1426 #else | |
1427 log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_
NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32"); | |
1428 #endif | |
1429 } | |
1430 | |
1431 static void | |
1432 Test_WCHART_LongString(){ | |
1433 #if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CON
VERSION && !UCONFIG_NO_LEGACY_CONVERSION) | |
1434 UErrorCode status = U_ZERO_ERROR; | |
1435 const char* testdatapath=loadTestData(&status); | |
1436 UResourceBundle *theBundle = ures_open(testdatapath, "testtypes", &status); | |
1437 int32_t strLen =0; | |
1438 const UChar* str = ures_getStringByKey(theBundle, "testinclude",&strLen,&sta
tus); | |
1439 const UChar* uSrc = str; | |
1440 int32_t uSrcLen = strLen; | |
1441 int32_t wDestLen =0, reqLen=0, i=0; | |
1442 int32_t uDestLen =0; | |
1443 wchar_t* wDest = NULL; | |
1444 UChar* uDest = NULL; | |
1445 UBool failed = FALSE; | |
1446 | |
1447 log_verbose("Loaded string of %d UChars\n", uSrcLen); | |
1448 | |
1449 if(U_FAILURE(status)){ | |
1450 log_data_err("Could not get testinclude resource from testtypes bundle.
Error: %s\n",u_errorName(status)); | |
1451 return; | |
1452 } | |
1453 | |
1454 /* pre-flight*/ | |
1455 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status); | |
1456 | |
1457 if(status == U_BUFFER_OVERFLOW_ERROR){ | |
1458 status=U_ZERO_ERROR; | |
1459 wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); | |
1460 wDestLen = reqLen+1; | |
1461 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status); | |
1462 log_verbose("To %d*%d-byte wchar_ts\n", reqLen,sizeof(wchar_t)); | |
1463 } | |
1464 | |
1465 { | |
1466 int j; | |
1467 for(j=0;j>=0&&j<reqLen;j++) { | |
1468 if(wDest[j]!=uSrc[j]) { | |
1469 log_verbose("Diff %04X vs %04X @ %d\n", wDest[j],uSrc[j],j); | |
1470 break; | |
1471 } | |
1472 } | |
1473 } | |
1474 | |
1475 uDestLen = 0; | |
1476 /* pre-flight */ | |
1477 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status); | |
1478 if(status == U_BUFFER_OVERFLOW_ERROR){ | |
1479 status =U_ZERO_ERROR; | |
1480 uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); | |
1481 u_memset(uDest,0xFFFF,reqLen+1); | |
1482 uDestLen = reqLen + 1; | |
1483 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status); | |
1484 log_verbose("Back to %d UChars\n", reqLen); | |
1485 } | |
1486 #if defined(U_WCHAR_IS_UTF16) | |
1487 log_verbose("U_WCHAR_IS_UTF16\n"); | |
1488 #elif defined(U_WCHAR_IS_UTF32) | |
1489 log_verbose("U_WCHAR_IS_UTF32\n"); | |
1490 #else | |
1491 log_verbose("U_WCHAR_IS_idunno (not UTF)\n"); | |
1492 #endif | |
1493 | |
1494 if(reqLen!=uSrcLen) { | |
1495 log_err("Error: dest len is %d but expected src len %d\n", reqLen, uSrcL
en); | |
1496 } | |
1497 | |
1498 for(i=0; i< uSrcLen; i++){ | |
1499 if(uDest[i] != str[i]){ | |
1500 log_verbose("u_str*WCS() failed for null terminated string expected:
\\u%04X got: \\u%04X at index: %i \n", str[i], uDest[i],i); | |
1501 failed =TRUE; | |
1502 } | |
1503 } | |
1504 | |
1505 if(U_FAILURE(status)){ | |
1506 failed = TRUE; | |
1507 } | |
1508 if(failed){ | |
1509 log_err("u_strToWCS() failed \n"); | |
1510 } | |
1511 free(wDest); | |
1512 free(uDest); | |
1513 /* close the bundle */ | |
1514 ures_close(theBundle); | |
1515 #else | |
1516 log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_
NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32"); | |
1517 #endif | |
1518 } | |
1519 | |
1520 static void Test_strToJavaModifiedUTF8() { | |
1521 static const UChar src[]={ | |
1522 0x61, 0x62, 0x63, 0xe1, 0xe2, 0xe3, | |
1523 0xe01, 0xe02, 0xe03, 0xe001, 0xe002, 0xe003, | |
1524 0xd800, 0xdc00, 0xdc00, 0xd800, 0, | |
1525 0xdbff, 0xdfff, | |
1526 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0xed, 0xe0e, 0x6f | |
1527 }; | |
1528 static const uint8_t expected[]={ | |
1529 0x61, 0x62, 0x63, 0xc3, 0xa1, 0xc3, 0xa2, 0xc3, 0xa3, | |
1530 0xe0, 0xb8, 0x81, 0xe0, 0xb8, 0x82, 0xe0, 0xb8, 0x83, | |
1531 0xee, 0x80, 0x81, 0xee, 0x80, 0x82, 0xee, 0x80, 0x83, | |
1532 0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xa0, 0x80,
0xc0, 0x80, | |
1533 0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf, | |
1534 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0xc3, 0xad, 0xe0,
0xb8, 0x8e, 0x6f | |
1535 }; | |
1536 static const UChar shortSrc[]={ | |
1537 0xe01, 0xe1, 0x61 | |
1538 }; | |
1539 static const uint8_t shortExpected[]={ | |
1540 0xe0, 0xb8, 0x81, 0xc3, 0xa1, 0x61 | |
1541 }; | |
1542 static const UChar asciiNul[]={ | |
1543 0x61, 0x62, 0x63, 0 | |
1544 }; | |
1545 static const uint8_t asciiNulExpected[]={ | |
1546 0x61, 0x62, 0x63 | |
1547 }; | |
1548 char dest[200]; | |
1549 char *p; | |
1550 int32_t length, expectedTerminatedLength; | |
1551 UErrorCode errorCode; | |
1552 | |
1553 expectedTerminatedLength=(int32_t)(strstr((const char *)expected, "\xc0\x80"
)- | |
1554 (const char *)expected); | |
1555 | |
1556 errorCode=U_ZERO_ERROR; | |
1557 length=-5; | |
1558 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, | |
1559 src, UPRV_LENGTHOF(src), &errorCode); | |
1560 if( U_FAILURE(errorCode) || p!=dest || | |
1561 length!=UPRV_LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || | |
1562 dest[length]!=0 | |
1563 ) { | |
1564 log_err("u_strToJavaModifiedUTF8(normal) failed - %s\n", u_errorName(err
orCode)); | |
1565 } | |
1566 memset(dest, 0xff, sizeof(dest)); | |
1567 errorCode=U_ZERO_ERROR; | |
1568 length=-5; | |
1569 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), NULL, | |
1570 src, UPRV_LENGTHOF(src), &errorCode); | |
1571 if( U_FAILURE(errorCode) || p!=dest || | |
1572 0!=memcmp(dest, expected, UPRV_LENGTHOF(expected)) || | |
1573 dest[UPRV_LENGTHOF(expected)]!=0 | |
1574 ) { | |
1575 log_err("u_strToJavaModifiedUTF8(normal, pLength=NULL) failed - %s\n", u
_errorName(errorCode)); | |
1576 } | |
1577 memset(dest, 0xff, sizeof(dest)); | |
1578 errorCode=U_ZERO_ERROR; | |
1579 length=-5; | |
1580 p=u_strToJavaModifiedUTF8(dest, UPRV_LENGTHOF(expected), &length, | |
1581 src, UPRV_LENGTHOF(src), &errorCode); | |
1582 if( errorCode!=U_STRING_NOT_TERMINATED_WARNING || p!=dest || | |
1583 length!=UPRV_LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || | |
1584 dest[length]!=(char)0xff | |
1585 ) { | |
1586 log_err("u_strToJavaModifiedUTF8(tight) failed - %s\n", u_errorName(erro
rCode)); | |
1587 } | |
1588 memset(dest, 0xff, sizeof(dest)); | |
1589 errorCode=U_ZERO_ERROR; | |
1590 length=-5; | |
1591 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, src, -1, &er
rorCode); | |
1592 if( U_FAILURE(errorCode) || p!=dest || | |
1593 length!=expectedTerminatedLength || 0!=memcmp(dest, expected, length) || | |
1594 dest[length]!=0 | |
1595 ) { | |
1596 log_err("u_strToJavaModifiedUTF8(NUL-terminated) failed - %s\n", u_error
Name(errorCode)); | |
1597 } | |
1598 memset(dest, 0xff, sizeof(dest)); | |
1599 errorCode=U_ZERO_ERROR; | |
1600 length=-5; | |
1601 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), NULL, src, -1, &error
Code); | |
1602 if( U_FAILURE(errorCode) || p!=dest || | |
1603 0!=memcmp(dest, expected, expectedTerminatedLength) || | |
1604 dest[expectedTerminatedLength]!=0 | |
1605 ) { | |
1606 log_err("u_strToJavaModifiedUTF8(NUL-terminated, pLength=NULL) failed -
%s\n", u_errorName(errorCode)); | |
1607 } | |
1608 memset(dest, 0xff, sizeof(dest)); | |
1609 errorCode=U_ZERO_ERROR; | |
1610 length=-5; | |
1611 p=u_strToJavaModifiedUTF8(dest, UPRV_LENGTHOF(expected)/2, &length, | |
1612 src, UPRV_LENGTHOF(src), &errorCode); | |
1613 if( errorCode!=U_BUFFER_OVERFLOW_ERROR || | |
1614 length!=UPRV_LENGTHOF(expected) || dest[UPRV_LENGTHOF(expected)/2]!=(cha
r)0xff | |
1615 ) { | |
1616 log_err("u_strToJavaModifiedUTF8(overflow) failed - %s\n", u_errorName(e
rrorCode)); | |
1617 } | |
1618 memset(dest, 0xff, sizeof(dest)); | |
1619 errorCode=U_ZERO_ERROR; | |
1620 length=-5; | |
1621 p=u_strToJavaModifiedUTF8(NULL, 0, &length, | |
1622 src, UPRV_LENGTHOF(src), &errorCode); | |
1623 if( errorCode!=U_BUFFER_OVERFLOW_ERROR || | |
1624 length!=UPRV_LENGTHOF(expected) || dest[0]!=(char)0xff | |
1625 ) { | |
1626 log_err("u_strToJavaModifiedUTF8(pure preflighting) failed - %s\n", u_er
rorName(errorCode)); | |
1627 } | |
1628 memset(dest, 0xff, sizeof(dest)); | |
1629 errorCode=U_ZERO_ERROR; | |
1630 length=-5; | |
1631 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, | |
1632 shortSrc, UPRV_LENGTHOF(shortSrc), &errorCode); | |
1633 if( U_FAILURE(errorCode) || p!=dest || | |
1634 length!=UPRV_LENGTHOF(shortExpected) || 0!=memcmp(dest, shortExpected, l
ength) || | |
1635 dest[length]!=0 | |
1636 ) { | |
1637 log_err("u_strToJavaModifiedUTF8(short) failed - %s\n", u_errorName(erro
rCode)); | |
1638 } | |
1639 memset(dest, 0xff, sizeof(dest)); | |
1640 errorCode=U_ZERO_ERROR; | |
1641 length=-5; | |
1642 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, | |
1643 asciiNul, -1, &errorCode); | |
1644 if( U_FAILURE(errorCode) || p!=dest || | |
1645 length!=UPRV_LENGTHOF(asciiNulExpected) || 0!=memcmp(dest, asciiNulExpec
ted, length) || | |
1646 dest[length]!=0 | |
1647 ) { | |
1648 log_err("u_strToJavaModifiedUTF8(asciiNul) failed - %s\n", u_errorName(e
rrorCode)); | |
1649 } | |
1650 memset(dest, 0xff, sizeof(dest)); | |
1651 errorCode=U_ZERO_ERROR; | |
1652 length=-5; | |
1653 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, | |
1654 NULL, 0, &errorCode); | |
1655 if( U_FAILURE(errorCode) || p!=dest || | |
1656 length!=0 || dest[0]!=0 | |
1657 ) { | |
1658 log_err("u_strToJavaModifiedUTF8(empty) failed - %s\n", u_errorName(erro
rCode)); | |
1659 } | |
1660 | |
1661 /* illegal arguments */ | |
1662 memset(dest, 0xff, sizeof(dest)); | |
1663 errorCode=U_ZERO_ERROR; | |
1664 length=-5; | |
1665 p=u_strToJavaModifiedUTF8(NULL, sizeof(dest), &length, | |
1666 src, UPRV_LENGTHOF(src), &errorCode); | |
1667 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) { | |
1668 log_err("u_strToJavaModifiedUTF8(dest=NULL) failed - %s\n", u_errorName(
errorCode)); | |
1669 } | |
1670 memset(dest, 0xff, sizeof(dest)); | |
1671 errorCode=U_ZERO_ERROR; | |
1672 length=-5; | |
1673 p=u_strToJavaModifiedUTF8(dest, -1, &length, | |
1674 src, UPRV_LENGTHOF(src), &errorCode); | |
1675 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) { | |
1676 log_err("u_strToJavaModifiedUTF8(destCapacity<0) failed - %s\n", u_error
Name(errorCode)); | |
1677 } | |
1678 memset(dest, 0xff, sizeof(dest)); | |
1679 errorCode=U_ZERO_ERROR; | |
1680 length=-5; | |
1681 p=u_strToJavaModifiedUTF8(dest, sizeof(dest), &length, | |
1682 NULL, UPRV_LENGTHOF(src), &errorCode); | |
1683 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) { | |
1684 log_err("u_strToJavaModifiedUTF8(src=NULL) failed - %s\n", u_errorName(e
rrorCode)); | |
1685 } | |
1686 memset(dest, 0xff, sizeof(dest)); | |
1687 errorCode=U_ZERO_ERROR; | |
1688 length=-5; | |
1689 p=u_strToJavaModifiedUTF8(dest, sizeof(dest), &length, | |
1690 NULL, -1, &errorCode); | |
1691 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) { | |
1692 log_err("u_strToJavaModifiedUTF8(src=NULL, srcLength<0) failed - %s\n",
u_errorName(errorCode)); | |
1693 } | |
1694 } | |
1695 | |
1696 static void Test_strFromJavaModifiedUTF8() { | |
1697 static const uint8_t src[]={ | |
1698 0x61, 0x62, 0x63, 0xc3, 0xa1, 0xc3, 0xa2, 0xc3, 0xa3, | |
1699 0xe0, 0xb8, 0x81, 0xe0, 0xb8, 0x82, 0xe0, 0xb8, 0x83, | |
1700 0xee, 0x80, 0x81, 0xee, 0x80, 0x82, 0xee, 0x80, 0x83, | |
1701 0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xa0, 0x80,
0, | |
1702 0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf, | |
1703 0x81, 0xc0, 0xe0, 0xb8, 0xf0, 0x90, 0x80, 0x80, /* invalid sequences */ | |
1704 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, | |
1705 0xe0, 0x81, 0xac, 0xe0, 0x83, 0xad, /* non-shortest forms are allowed *
/ | |
1706 0xe0, 0xb8, 0x8e, 0x6f | |
1707 }; | |
1708 static const UChar expected[]={ | |
1709 0x61, 0x62, 0x63, 0xe1, 0xe2, 0xe3, | |
1710 0xe01, 0xe02, 0xe03, 0xe001, 0xe002, 0xe003, | |
1711 0xd800, 0xdc00, 0xdc00, 0xd800, 0, | |
1712 0xdbff, 0xdfff, | |
1713 0xfffd, 0xfffd, 0xfffd, 0xfffd, | |
1714 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, | |
1715 0x6c, 0xed, | |
1716 0xe0e, 0x6f | |
1717 }; | |
1718 static const uint8_t shortSrc[]={ | |
1719 0xe0, 0xb8, 0x81, 0xc3, 0xa1, 0x61 | |
1720 }; | |
1721 static const UChar shortExpected[]={ | |
1722 0xe01, 0xe1, 0x61 | |
1723 }; | |
1724 static const uint8_t asciiNul[]={ | |
1725 0x61, 0x62, 0x63, 0 | |
1726 }; | |
1727 static const UChar asciiNulExpected[]={ | |
1728 0x61, 0x62, 0x63 | |
1729 }; | |
1730 static const uint8_t invalid[]={ | |
1731 0x81, 0xc0, 0xe0, 0xb8, 0xf0, 0x90, 0x80, 0x80 | |
1732 }; | |
1733 static const UChar invalidExpectedFFFD[]={ | |
1734 0xfffd, 0xfffd, 0xfffd, 0xfffd | |
1735 }; | |
1736 static const UChar invalidExpected50000[]={ | |
1737 0xd900, 0xdc00, 0xd900, 0xdc00, 0xd900, 0xdc00, 0xd900, 0xdc00 | |
1738 }; | |
1739 UChar dest[200]; | |
1740 UChar *p; | |
1741 int32_t length, expectedTerminatedLength; | |
1742 int32_t numSubstitutions; | |
1743 UErrorCode errorCode; | |
1744 | |
1745 expectedTerminatedLength=(int32_t)(u_strchr(expected, 0)-expected); | |
1746 | |
1747 errorCode=U_ZERO_ERROR; | |
1748 length=numSubstitutions=-5; | |
1749 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, | |
1750 (const char *)src, UPRV_LENGTHOF(src), | |
1751 0xfffd, &numSubstitutions, &errorCode); | |
1752 if( U_FAILURE(errorCode) || p!=dest || | |
1753 length!=UPRV_LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || | |
1754 dest[length]!=0 || | |
1755 numSubstitutions!=UPRV_LENGTHOF(invalidExpectedFFFD) | |
1756 ) { | |
1757 log_err("u_strFromJavaModifiedUTF8WithSub(normal) failed - %s\n", u_erro
rName(errorCode)); | |
1758 } | |
1759 memset(dest, 0xff, sizeof(dest)); | |
1760 errorCode=U_ZERO_ERROR; | |
1761 length=numSubstitutions=-5; | |
1762 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), NULL, | |
1763 (const char *)src, UPRV_LENGTHOF(src), | |
1764 0xfffd, &numSubstitutions, &errorCode); | |
1765 if( U_FAILURE(errorCode) || p!=dest || | |
1766 0!=memcmp(dest, expected, UPRV_LENGTHOF(expected)) || | |
1767 dest[UPRV_LENGTHOF(expected)]!=0 || | |
1768 numSubstitutions!=UPRV_LENGTHOF(invalidExpectedFFFD) | |
1769 ) { | |
1770 log_err("u_strFromJavaModifiedUTF8WithSub(normal, pLength=NULL) failed -
%s\n", u_errorName(errorCode)); | |
1771 } | |
1772 memset(dest, 0xff, sizeof(dest)); | |
1773 errorCode=U_ZERO_ERROR; | |
1774 length=numSubstitutions=-5; | |
1775 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, | |
1776 (const char *)src, UPRV_LENGTHOF(src), | |
1777 0xfffd, NULL, &errorCode); | |
1778 if( U_FAILURE(errorCode) || p!=dest || | |
1779 length!=UPRV_LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || | |
1780 dest[length]!=0 | |
1781 ) { | |
1782 log_err("u_strFromJavaModifiedUTF8WithSub(normal, pNumSubstitutions=NULL
) failed - %s\n", u_errorName(errorCode)); | |
1783 } | |
1784 memset(dest, 0xff, sizeof(dest)); | |
1785 errorCode=U_ZERO_ERROR; | |
1786 length=numSubstitutions=-5; | |
1787 p=u_strFromJavaModifiedUTF8WithSub(dest, UPRV_LENGTHOF(expected), &length, | |
1788 (const char *)src, UPRV_LENGTHOF(src), | |
1789 0xfffd, &numSubstitutions, &errorCode); | |
1790 if( errorCode!=U_STRING_NOT_TERMINATED_WARNING || p!=dest || | |
1791 length!=UPRV_LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || | |
1792 dest[length]!=0xffff || | |
1793 numSubstitutions!=UPRV_LENGTHOF(invalidExpectedFFFD) | |
1794 ) { | |
1795 log_err("u_strFromJavaModifiedUTF8WithSub(tight) failed - %s\n", u_error
Name(errorCode)); | |
1796 } | |
1797 memset(dest, 0xff, sizeof(dest)); | |
1798 errorCode=U_ZERO_ERROR; | |
1799 length=numSubstitutions=-5; | |
1800 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, | |
1801 (const char *)src, -1, | |
1802 0xfffd, &numSubstitutions, &errorCode); | |
1803 if( U_FAILURE(errorCode) || p!=dest || | |
1804 length!=expectedTerminatedLength || 0!=memcmp(dest, expected, length) || | |
1805 dest[length]!=0 || | |
1806 numSubstitutions!=0 | |
1807 ) { | |
1808 log_err("u_strFromJavaModifiedUTF8WithSub(NUL-terminated) failed - %s\n"
, u_errorName(errorCode)); | |
1809 } | |
1810 memset(dest, 0xff, sizeof(dest)); | |
1811 errorCode=U_ZERO_ERROR; | |
1812 length=numSubstitutions=-5; | |
1813 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), NULL, | |
1814 (const char *)src, -1, | |
1815 0xfffd, &numSubstitutions, &errorCode); | |
1816 if( U_FAILURE(errorCode) || p!=dest || | |
1817 0!=memcmp(dest, expected, expectedTerminatedLength) || | |
1818 dest[expectedTerminatedLength]!=0 || | |
1819 numSubstitutions!=0 | |
1820 ) { | |
1821 log_err("u_strFromJavaModifiedUTF8WithSub(NUL-terminated, pLength=NULL)
failed - %s\n", u_errorName(errorCode)); | |
1822 } | |
1823 memset(dest, 0xff, sizeof(dest)); | |
1824 errorCode=U_ZERO_ERROR; | |
1825 length=numSubstitutions=-5; | |
1826 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, | |
1827 (const char *)src, -1, | |
1828 0xfffd, NULL, &errorCode); | |
1829 if( U_FAILURE(errorCode) || p!=dest || | |
1830 length!=expectedTerminatedLength || 0!=memcmp(dest, expected, length) || | |
1831 dest[length]!=0 | |
1832 ) { | |
1833 log_err("u_strFromJavaModifiedUTF8WithSub(NUL-terminated, pNumSubstituti
ons=NULL) failed - %s\n", u_errorName(errorCode)); | |
1834 } | |
1835 memset(dest, 0xff, sizeof(dest)); | |
1836 errorCode=U_ZERO_ERROR; | |
1837 length=numSubstitutions=-5; | |
1838 p=u_strFromJavaModifiedUTF8WithSub(dest, UPRV_LENGTHOF(expected)/2, &length, | |
1839 (const char *)src, UPRV_LENGTHOF(src), | |
1840 0xfffd, &numSubstitutions, &errorCode); | |
1841 if( errorCode!=U_BUFFER_OVERFLOW_ERROR || | |
1842 length!=UPRV_LENGTHOF(expected) || dest[UPRV_LENGTHOF(expected)/2]!=0xff
ff | |
1843 ) { | |
1844 log_err("u_strFromJavaModifiedUTF8WithSub(overflow) failed - %s\n", u_er
rorName(errorCode)); | |
1845 } | |
1846 memset(dest, 0xff, sizeof(dest)); | |
1847 errorCode=U_ZERO_ERROR; | |
1848 length=numSubstitutions=-5; | |
1849 p=u_strFromJavaModifiedUTF8WithSub(NULL, 0, &length, | |
1850 (const char *)src, UPRV_LENGTHOF(src), | |
1851 0xfffd, &numSubstitutions, &errorCode); | |
1852 if( errorCode!=U_BUFFER_OVERFLOW_ERROR || | |
1853 length!=UPRV_LENGTHOF(expected) || dest[0]!=0xffff | |
1854 ) { | |
1855 log_err("u_strFromJavaModifiedUTF8WithSub(pure preflighting) failed - %s
\n", u_errorName(errorCode)); | |
1856 } | |
1857 memset(dest, 0xff, sizeof(dest)); | |
1858 errorCode=U_ZERO_ERROR; | |
1859 length=numSubstitutions=-5; | |
1860 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, | |
1861 (const char *)shortSrc, UPRV_LENGTHOF(sho
rtSrc), | |
1862 0xfffd, &numSubstitutions, &errorCode); | |
1863 if( U_FAILURE(errorCode) || p!=dest || | |
1864 length!=UPRV_LENGTHOF(shortExpected) || 0!=memcmp(dest, shortExpected, l
ength) || | |
1865 dest[length]!=0 || | |
1866 numSubstitutions!=0 | |
1867 ) { | |
1868 log_err("u_strFromJavaModifiedUTF8WithSub(short) failed - %s\n", u_error
Name(errorCode)); | |
1869 } | |
1870 memset(dest, 0xff, sizeof(dest)); | |
1871 errorCode=U_ZERO_ERROR; | |
1872 length=numSubstitutions=-5; | |
1873 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, | |
1874 (const char *)asciiNul, -1, | |
1875 0xfffd, &numSubstitutions, &errorCode); | |
1876 if( U_FAILURE(errorCode) || p!=dest || | |
1877 length!=UPRV_LENGTHOF(asciiNulExpected) || 0!=memcmp(dest, asciiNulExpec
ted, length) || | |
1878 dest[length]!=0 || | |
1879 numSubstitutions!=0 | |
1880 ) { | |
1881 log_err("u_strFromJavaModifiedUTF8WithSub(asciiNul) failed - %s\n", u_er
rorName(errorCode)); | |
1882 } | |
1883 memset(dest, 0xff, sizeof(dest)); | |
1884 errorCode=U_ZERO_ERROR; | |
1885 length=numSubstitutions=-5; | |
1886 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, | |
1887 NULL, 0, 0xfffd, &numSubstitutions, &erro
rCode); | |
1888 if( U_FAILURE(errorCode) || p!=dest || | |
1889 length!=0 || dest[0]!=0 || | |
1890 numSubstitutions!=0 | |
1891 ) { | |
1892 log_err("u_strFromJavaModifiedUTF8WithSub(empty) failed - %s\n", u_error
Name(errorCode)); | |
1893 } | |
1894 memset(dest, 0xff, sizeof(dest)); | |
1895 errorCode=U_ZERO_ERROR; | |
1896 length=numSubstitutions=-5; | |
1897 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, | |
1898 (const char *)invalid, UPRV_LENGTHOF(inva
lid), | |
1899 0xfffd, &numSubstitutions, &errorCode); | |
1900 if( U_FAILURE(errorCode) || p!=dest || | |
1901 length!=UPRV_LENGTHOF(invalidExpectedFFFD) || 0!=memcmp(dest, invalidExp
ectedFFFD, length) || | |
1902 dest[length]!=0 || | |
1903 numSubstitutions!=UPRV_LENGTHOF(invalidExpectedFFFD) | |
1904 ) { | |
1905 log_err("u_strFromJavaModifiedUTF8WithSub(invalid->fffd) failed - %s\n",
u_errorName(errorCode)); | |
1906 } | |
1907 memset(dest, 0xff, sizeof(dest)); | |
1908 errorCode=U_ZERO_ERROR; | |
1909 length=numSubstitutions=-5; | |
1910 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, | |
1911 (const char *)invalid, UPRV_LENGTHOF(inva
lid), | |
1912 0x50000, &numSubstitutions, &errorCode); | |
1913 if( U_FAILURE(errorCode) || p!=dest || | |
1914 length!=UPRV_LENGTHOF(invalidExpected50000) || 0!=memcmp(dest, invalidEx
pected50000, length) || | |
1915 dest[length]!=0 || | |
1916 numSubstitutions!=UPRV_LENGTHOF(invalidExpectedFFFD) /* not ...50000 */ | |
1917 ) { | |
1918 log_err("u_strFromJavaModifiedUTF8WithSub(invalid->50000) failed - %s\n"
, u_errorName(errorCode)); | |
1919 } | |
1920 memset(dest, 0xff, sizeof(dest)); | |
1921 errorCode=U_ZERO_ERROR; | |
1922 length=numSubstitutions=-5; | |
1923 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, | |
1924 (const char *)invalid, UPRV_LENGTHOF(inva
lid), | |
1925 U_SENTINEL, &numSubstitutions, &errorCode
); | |
1926 if(errorCode!=U_INVALID_CHAR_FOUND || dest[0]!=0xffff || numSubstitutions!=0
) { | |
1927 log_err("u_strFromJavaModifiedUTF8WithSub(invalid->error) failed - %s\n"
, u_errorName(errorCode)); | |
1928 } | |
1929 memset(dest, 0xff, sizeof(dest)); | |
1930 errorCode=U_ZERO_ERROR; | |
1931 length=numSubstitutions=-5; | |
1932 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, | |
1933 (const char *)src, UPRV_LENGTHOF(src), | |
1934 U_SENTINEL, &numSubstitutions, &errorCode
); | |
1935 if( errorCode!=U_INVALID_CHAR_FOUND || | |
1936 length>=UPRV_LENGTHOF(expected) || dest[UPRV_LENGTHOF(expected)-1]!=0xff
ff || | |
1937 numSubstitutions!=0 | |
1938 ) { | |
1939 log_err("u_strFromJavaModifiedUTF8WithSub(normal->error) failed - %s\n",
u_errorName(errorCode)); | |
1940 } | |
1941 | |
1942 /* illegal arguments */ | |
1943 memset(dest, 0xff, sizeof(dest)); | |
1944 errorCode=U_ZERO_ERROR; | |
1945 length=numSubstitutions=-5; | |
1946 p=u_strFromJavaModifiedUTF8WithSub(NULL, sizeof(dest), &length, | |
1947 (const char *)src, UPRV_LENGTHOF(src), | |
1948 0xfffd, &numSubstitutions, &errorCode); | |
1949 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { | |
1950 log_err("u_strFromJavaModifiedUTF8WithSub(dest=NULL) failed - %s\n", u_e
rrorName(errorCode)); | |
1951 } | |
1952 memset(dest, 0xff, sizeof(dest)); | |
1953 errorCode=U_ZERO_ERROR; | |
1954 length=numSubstitutions=-5; | |
1955 p=u_strFromJavaModifiedUTF8WithSub(dest, -1, &length, | |
1956 (const char *)src, UPRV_LENGTHOF(src), | |
1957 0xfffd, &numSubstitutions, &errorCode); | |
1958 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { | |
1959 log_err("u_strFromJavaModifiedUTF8WithSub(destCapacity<0) failed - %s\n"
, u_errorName(errorCode)); | |
1960 } | |
1961 memset(dest, 0xff, sizeof(dest)); | |
1962 errorCode=U_ZERO_ERROR; | |
1963 length=numSubstitutions=-5; | |
1964 p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length, | |
1965 NULL, UPRV_LENGTHOF(src), | |
1966 0xfffd, &numSubstitutions, &errorCode); | |
1967 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { | |
1968 log_err("u_strFromJavaModifiedUTF8WithSub(src=NULL) failed - %s\n", u_er
rorName(errorCode)); | |
1969 } | |
1970 memset(dest, 0xff, sizeof(dest)); | |
1971 errorCode=U_ZERO_ERROR; | |
1972 length=numSubstitutions=-5; | |
1973 p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length, | |
1974 NULL, -1, 0xfffd, &numSubstitutions, &err
orCode); | |
1975 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { | |
1976 log_err("u_strFromJavaModifiedUTF8WithSub(src=NULL, srcLength<0) failed
- %s\n", u_errorName(errorCode)); | |
1977 } | |
1978 memset(dest, 0xff, sizeof(dest)); | |
1979 errorCode=U_ZERO_ERROR; | |
1980 length=numSubstitutions=-5; | |
1981 p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length, | |
1982 (const char *)src, UPRV_LENGTHOF(src), | |
1983 0x110000, &numSubstitutions, &errorCode); | |
1984 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { | |
1985 log_err("u_strFromJavaModifiedUTF8WithSub(subchar=U_SENTINEL) failed - %
s\n", u_errorName(errorCode)); | |
1986 } | |
1987 memset(dest, 0xff, sizeof(dest)); | |
1988 errorCode=U_ZERO_ERROR; | |
1989 length=numSubstitutions=-5; | |
1990 p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length, | |
1991 (const char *)src, UPRV_LENGTHOF(src), | |
1992 0xdfff, &numSubstitutions, &errorCode); | |
1993 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { | |
1994 log_err("u_strFromJavaModifiedUTF8WithSub(subchar is surrogate) failed -
%s\n", u_errorName(errorCode)); | |
1995 } | |
1996 } | |
1997 | |
1998 /* test that string transformation functions permit NULL source pointer when sou
rce length==0 */ | |
1999 static void TestNullEmptySource() { | |
2000 char dest8[4]={ 3, 3, 3, 3 }; | |
2001 UChar dest16[4]={ 3, 3, 3, 3 }; | |
2002 UChar32 dest32[4]={ 3, 3, 3, 3 }; | |
2003 #if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CON
VERSION && !UCONFIG_NO_LEGACY_CONVERSION) | |
2004 wchar_t destW[4]={ 3, 3, 3, 3 }; | |
2005 #endif | |
2006 | |
2007 int32_t length; | |
2008 UErrorCode errorCode; | |
2009 | |
2010 /* u_strFromXyz() */ | |
2011 | |
2012 dest16[0]=3; | |
2013 length=3; | |
2014 errorCode=U_ZERO_ERROR; | |
2015 u_strFromUTF8(dest16, UPRV_LENGTHOF(dest16), &length, NULL, 0, &errorCode); | |
2016 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { | |
2017 log_err("u_strFromUTF8(source=NULL, sourceLength=0) failed\n"); | |
2018 } | |
2019 | |
2020 dest16[0]=3; | |
2021 length=3; | |
2022 errorCode=U_ZERO_ERROR; | |
2023 u_strFromUTF8WithSub(dest16, UPRV_LENGTHOF(dest16), &length, NULL, 0, 0xfffd
, NULL, &errorCode); | |
2024 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { | |
2025 log_err("u_strFromUTF8WithSub(source=NULL, sourceLength=0) failed\n"); | |
2026 } | |
2027 | |
2028 dest16[0]=3; | |
2029 length=3; | |
2030 errorCode=U_ZERO_ERROR; | |
2031 u_strFromUTF8Lenient(dest16, UPRV_LENGTHOF(dest16), &length, NULL, 0, &error
Code); | |
2032 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { | |
2033 log_err("u_strFromUTF8Lenient(source=NULL, sourceLength=0) failed\n"); | |
2034 } | |
2035 | |
2036 dest16[0]=3; | |
2037 length=3; | |
2038 errorCode=U_ZERO_ERROR; | |
2039 u_strFromUTF32(dest16, UPRV_LENGTHOF(dest16), &length, NULL, 0, &errorCode); | |
2040 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { | |
2041 log_err("u_strFromUTF32(source=NULL, sourceLength=0) failed\n"); | |
2042 } | |
2043 | |
2044 dest16[0]=3; | |
2045 length=3; | |
2046 errorCode=U_ZERO_ERROR; | |
2047 u_strFromUTF32WithSub(dest16, UPRV_LENGTHOF(dest16), &length, NULL, 0, 0xfff
d, NULL, &errorCode); | |
2048 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { | |
2049 log_err("u_strFromUTF32WithSub(source=NULL, sourceLength=0) failed\n"); | |
2050 } | |
2051 | |
2052 dest16[0]=3; | |
2053 length=3; | |
2054 errorCode=U_ZERO_ERROR; | |
2055 u_strFromJavaModifiedUTF8WithSub(dest16, UPRV_LENGTHOF(dest16), &length, NUL
L, 0, 0xfffd, NULL, &errorCode); | |
2056 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { | |
2057 log_err("u_strFromJavaModifiedUTF8WithSub(source=NULL, sourceLength=0) f
ailed\n"); | |
2058 } | |
2059 | |
2060 /* u_strToXyz() */ | |
2061 | |
2062 dest8[0]=3; | |
2063 length=3; | |
2064 errorCode=U_ZERO_ERROR; | |
2065 u_strToUTF8(dest8, UPRV_LENGTHOF(dest8), &length, NULL, 0, &errorCode); | |
2066 if(errorCode!=U_ZERO_ERROR || length!=0 || dest8[0]!=0 || dest8[1]!=3) { | |
2067 log_err("u_strToUTF8(source=NULL, sourceLength=0) failed\n"); | |
2068 } | |
2069 | |
2070 dest8[0]=3; | |
2071 length=3; | |
2072 errorCode=U_ZERO_ERROR; | |
2073 u_strToUTF8WithSub(dest8, UPRV_LENGTHOF(dest8), &length, NULL, 0, 0xfffd, NU
LL, &errorCode); | |
2074 if(errorCode!=U_ZERO_ERROR || length!=0 || dest8[0]!=0 || dest8[1]!=3) { | |
2075 log_err("u_strToUTF8(source=NULL, sourceLength=0) failed\n"); | |
2076 } | |
2077 | |
2078 dest32[0]=3; | |
2079 length=3; | |
2080 errorCode=U_ZERO_ERROR; | |
2081 u_strToUTF32(dest32, UPRV_LENGTHOF(dest32), &length, NULL, 0, &errorCode); | |
2082 if(errorCode!=U_ZERO_ERROR || length!=0 || dest32[0]!=0 || dest32[1]!=3) { | |
2083 log_err("u_strToUTF32(source=NULL, sourceLength=0) failed\n"); | |
2084 } | |
2085 | |
2086 dest32[0]=3; | |
2087 length=3; | |
2088 errorCode=U_ZERO_ERROR; | |
2089 u_strToUTF32WithSub(dest32, UPRV_LENGTHOF(dest32), &length, NULL, 0, 0xfffd,
NULL, &errorCode); | |
2090 if(errorCode!=U_ZERO_ERROR || length!=0 || dest32[0]!=0 || dest32[1]!=3) { | |
2091 log_err("u_strToUTF32WithSub(source=NULL, sourceLength=0) failed\n"); | |
2092 } | |
2093 | |
2094 dest8[0]=3; | |
2095 length=3; | |
2096 errorCode=U_ZERO_ERROR; | |
2097 u_strToJavaModifiedUTF8(dest8, UPRV_LENGTHOF(dest8), &length, NULL, 0, &erro
rCode); | |
2098 if(errorCode!=U_ZERO_ERROR || length!=0 || dest8[0]!=0 || dest8[1]!=3) { | |
2099 log_err("u_strToJavaModifiedUTF8(source=NULL, sourceLength=0) failed\n")
; | |
2100 } | |
2101 | |
2102 #if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CON
VERSION && !UCONFIG_NO_LEGACY_CONVERSION) | |
2103 | |
2104 dest16[0]=3; | |
2105 length=3; | |
2106 errorCode=U_ZERO_ERROR; | |
2107 u_strFromWCS(dest16, UPRV_LENGTHOF(dest16), &length, NULL, 0, &errorCode); | |
2108 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { | |
2109 log_err("u_strFromWCS(source=NULL, sourceLength=0) failed\n"); | |
2110 } | |
2111 | |
2112 destW[0]=3; | |
2113 length=3; | |
2114 errorCode=U_ZERO_ERROR; | |
2115 u_strToWCS(destW, UPRV_LENGTHOF(destW), &length, NULL, 0, &errorCode); | |
2116 if(errorCode!=U_ZERO_ERROR || length!=0 || destW[0]!=0 || destW[1]!=3) { | |
2117 log_err("u_strToWCS(source=NULL, sourceLength=0) failed\n"); | |
2118 } | |
2119 | |
2120 #endif | |
2121 } | |
OLD | NEW |