]>
Commit | Line | Data |
---|---|---|
b75a7d8f A |
1 | /******************************************************************** |
2 | * COPYRIGHT: | |
d5d484b0 | 3 | * Copyright (c) 1997-2006,2008 International Business Machines Corporation and |
b75a7d8f A |
4 | * others. All Rights Reserved. |
5 | ********************************************************************/ | |
73c04bcf | 6 | /******************************************************************************* |
b75a7d8f A |
7 | * |
8 | * File CCONVTST.C | |
9 | * | |
10 | * Modification History: | |
11 | * Name Description | |
12 | * Steven R. Loomis 7/8/1999 Adding input buffer test | |
73c04bcf | 13 | ******************************************************************************** |
b75a7d8f A |
14 | */ |
15 | #include <stdio.h> | |
16 | #include "cstring.h" | |
17 | #include "unicode/uloc.h" | |
18 | #include "unicode/ucnv.h" | |
19 | #include "unicode/ucnv_err.h" | |
20 | #include "cintltst.h" | |
21 | #include "unicode/utypes.h" | |
22 | #include "unicode/ustring.h" | |
23 | #include "unicode/ucol.h" | |
24 | #include "cmemory.h" | |
25 | ||
374ca955 | 26 | static void TestNextUChar(UConverter* cnv, const char* source, const char* limit, const int32_t results[], const char* message); |
b75a7d8f A |
27 | static void TestNextUCharError(UConverter* cnv, const char* source, const char* limit, UErrorCode expected, const char* message); |
28 | #if !UCONFIG_NO_COLLATION | |
29 | static void TestJitterbug981(void); | |
30 | #endif | |
31 | static void TestJitterbug1293(void); | |
32 | static void TestNewConvertWithBufferSizes(int32_t osize, int32_t isize) ; | |
33 | static void TestConverterTypesAndStarters(void); | |
34 | static void TestAmbiguous(void); | |
35 | static void TestSignatureDetection(void); | |
36 | static void TestUTF7(void); | |
37 | static void TestIMAP(void); | |
38 | static void TestUTF8(void); | |
39 | static void TestCESU8(void); | |
40 | static void TestUTF16(void); | |
41 | static void TestUTF16BE(void); | |
42 | static void TestUTF16LE(void); | |
43 | static void TestUTF32(void); | |
44 | static void TestUTF32BE(void); | |
45 | static void TestUTF32LE(void); | |
46 | static void TestLATIN1(void); | |
73c04bcf A |
47 | |
48 | #if !UCONFIG_NO_LEGACY_CONVERSION | |
b75a7d8f A |
49 | static void TestSBCS(void); |
50 | static void TestDBCS(void); | |
51 | static void TestMBCS(void); | |
73c04bcf | 52 | |
374ca955 | 53 | #ifdef U_ENABLE_GENERIC_ISO_2022 |
b75a7d8f | 54 | static void TestISO_2022(void); |
374ca955 | 55 | #endif |
73c04bcf | 56 | |
b75a7d8f A |
57 | static void TestISO_2022_JP(void); |
58 | static void TestISO_2022_JP_1(void); | |
59 | static void TestISO_2022_JP_2(void); | |
60 | static void TestISO_2022_KR(void); | |
61 | static void TestISO_2022_KR_1(void); | |
62 | static void TestISO_2022_CN(void); | |
63 | static void TestISO_2022_CN_EXT(void); | |
64 | static void TestJIS(void); | |
65 | static void TestHZ(void); | |
73c04bcf A |
66 | #endif |
67 | ||
b75a7d8f | 68 | static void TestSCSU(void); |
73c04bcf A |
69 | |
70 | #if !UCONFIG_NO_LEGACY_CONVERSION | |
b75a7d8f A |
71 | static void TestEBCDIC_STATEFUL(void); |
72 | static void TestGB18030(void); | |
73 | static void TestLMBCS(void); | |
74 | static void TestJitterbug255(void); | |
75 | static void TestEBCDICUS4XML(void); | |
76 | static void TestJitterbug915(void); | |
77 | static void TestISCII(void); | |
73c04bcf A |
78 | |
79 | static void TestCoverageMBCS(void); | |
80 | static void TestJitterbug2346(void); | |
81 | static void TestJitterbug2411(void); | |
d5d484b0 | 82 | static void TestJitterbug6175(void); |
73c04bcf A |
83 | #endif |
84 | ||
85 | static void TestRoundTrippingAllUTF(void); | |
b75a7d8f A |
86 | static void TestConv(const uint16_t in[], |
87 | int len, | |
88 | const char* conv, | |
89 | const char* lang, | |
90 | char byteArr[], | |
91 | int byteArrLen); | |
b75a7d8f A |
92 | void addTestNewConvert(TestNode** root); |
93 | ||
94 | /* open a converter, using test data if it begins with '@' */ | |
95 | static UConverter *my_ucnv_open(const char *cnv, UErrorCode *err); | |
96 | ||
97 | ||
98 | #define NEW_MAX_BUFFER 999 | |
99 | ||
100 | static int32_t gInBufferSize = NEW_MAX_BUFFER; | |
101 | static int32_t gOutBufferSize = NEW_MAX_BUFFER; | |
102 | static char gNuConvTestName[1024]; | |
103 | ||
104 | #define nct_min(x,y) ((x<y) ? x : y) | |
105 | ||
106 | static UConverter *my_ucnv_open(const char *cnv, UErrorCode *err) | |
107 | { | |
108 | if(cnv && cnv[0] == '@') { | |
374ca955 | 109 | return ucnv_openPackage(loadTestData(err), cnv+1, err); |
b75a7d8f A |
110 | } else { |
111 | return ucnv_open(cnv, err); | |
112 | } | |
113 | } | |
114 | ||
115 | static void printSeq(const unsigned char* a, int len) | |
116 | { | |
117 | int i=0; | |
118 | log_verbose("{"); | |
119 | while (i<len) | |
120 | log_verbose("0x%02x ", a[i++]); | |
121 | log_verbose("}\n"); | |
122 | } | |
123 | ||
124 | static void printUSeq(const UChar* a, int len) | |
125 | { | |
126 | int i=0; | |
127 | log_verbose("{U+"); | |
128 | while (i<len) log_verbose("0x%04x ", a[i++]); | |
129 | log_verbose("}\n"); | |
130 | } | |
131 | ||
132 | static void printSeqErr(const unsigned char* a, int len) | |
133 | { | |
134 | int i=0; | |
135 | fprintf(stderr, "{"); | |
136 | while (i<len) | |
137 | fprintf(stderr, "0x%02x ", a[i++]); | |
138 | fprintf(stderr, "}\n"); | |
139 | } | |
140 | ||
141 | static void printUSeqErr(const UChar* a, int len) | |
142 | { | |
143 | int i=0; | |
144 | fprintf(stderr, "{U+"); | |
145 | while (i<len) | |
146 | fprintf(stderr, "0x%04x ", a[i++]); | |
147 | fprintf(stderr,"}\n"); | |
148 | } | |
149 | ||
150 | static void | |
374ca955 | 151 | TestNextUChar(UConverter* cnv, const char* source, const char* limit, const int32_t results[], const char* message) |
b75a7d8f A |
152 | { |
153 | const char* s0; | |
154 | const char* s=(char*)source; | |
374ca955 | 155 | const int32_t *r=results; |
b75a7d8f | 156 | UErrorCode errorCode=U_ZERO_ERROR; |
374ca955 | 157 | UChar32 c; |
b75a7d8f A |
158 | |
159 | while(s<limit) { | |
160 | s0=s; | |
161 | c=ucnv_getNextUChar(cnv, &s, limit, &errorCode); | |
162 | if(errorCode==U_INDEX_OUTOFBOUNDS_ERROR) { | |
163 | break; /* no more significant input */ | |
164 | } else if(U_FAILURE(errorCode)) { | |
165 | log_err("%s ucnv_getNextUChar() failed: %s\n", message, u_errorName(errorCode)); | |
166 | break; | |
374ca955 A |
167 | } else if( |
168 | /* test the expected number of input bytes only if >=0 */ | |
169 | (*r>=0 && (int32_t)(s-s0)!=*r) || | |
170 | c!=*(r+1) | |
171 | ) { | |
b75a7d8f A |
172 | log_err("%s ucnv_getNextUChar() result %lx from %d bytes, should have been %lx from %d bytes.\n", |
173 | message, c, (s-s0), *(r+1), *r); | |
174 | break; | |
175 | } | |
176 | r+=2; | |
177 | } | |
178 | } | |
179 | ||
180 | static void | |
181 | TestNextUCharError(UConverter* cnv, const char* source, const char* limit, UErrorCode expected, const char* message) | |
182 | { | |
183 | const char* s=(char*)source; | |
184 | UErrorCode errorCode=U_ZERO_ERROR; | |
185 | uint32_t c; | |
186 | c=ucnv_getNextUChar(cnv, &s, limit, &errorCode); | |
187 | if(errorCode != expected){ | |
188 | log_err("FAIL: Expected:%s when %s-----Got:%s\n", myErrorName(expected), message, myErrorName(errorCode)); | |
189 | } | |
190 | if(c != 0xFFFD && c != 0xffff){ | |
191 | log_err("FAIL: Expected return value of 0xfffd or 0xffff when %s-----Got 0x%lx\n", message, c); | |
192 | } | |
193 | ||
194 | } | |
195 | ||
196 | static void TestInBufSizes(void) | |
197 | { | |
198 | TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,1); | |
199 | #if 1 | |
200 | TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,2); | |
201 | TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,3); | |
202 | TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,4); | |
203 | TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,5); | |
204 | TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,6); | |
205 | TestNewConvertWithBufferSizes(1,1); | |
206 | TestNewConvertWithBufferSizes(2,3); | |
207 | TestNewConvertWithBufferSizes(3,2); | |
208 | #endif | |
209 | } | |
210 | ||
211 | static void TestOutBufSizes(void) | |
212 | { | |
213 | #if 1 | |
214 | TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,NEW_MAX_BUFFER); | |
215 | TestNewConvertWithBufferSizes(1,NEW_MAX_BUFFER); | |
216 | TestNewConvertWithBufferSizes(2,NEW_MAX_BUFFER); | |
217 | TestNewConvertWithBufferSizes(3,NEW_MAX_BUFFER); | |
218 | TestNewConvertWithBufferSizes(4,NEW_MAX_BUFFER); | |
219 | TestNewConvertWithBufferSizes(5,NEW_MAX_BUFFER); | |
220 | ||
221 | #endif | |
222 | } | |
223 | ||
224 | ||
225 | void addTestNewConvert(TestNode** root) | |
226 | { | |
227 | addTest(root, &TestInBufSizes, "tsconv/nucnvtst/TestInBufSizes"); | |
228 | addTest(root, &TestOutBufSizes, "tsconv/nucnvtst/TestOutBufSizes"); | |
229 | addTest(root, &TestConverterTypesAndStarters, "tsconv/nucnvtst/TestConverterTypesAndStarters"); | |
230 | addTest(root, &TestAmbiguous, "tsconv/nucnvtst/TestAmbiguous"); | |
231 | addTest(root, &TestSignatureDetection, "tsconv/nucnvtst/TestSignatureDetection"); | |
232 | addTest(root, &TestUTF7, "tsconv/nucnvtst/TestUTF7"); | |
233 | addTest(root, &TestIMAP, "tsconv/nucnvtst/TestIMAP"); | |
234 | addTest(root, &TestUTF8, "tsconv/nucnvtst/TestUTF8"); | |
374ca955 A |
235 | |
236 | /* test ucnv_getNextUChar() for charsets that encode single surrogates with complete byte sequences */ | |
b75a7d8f A |
237 | addTest(root, &TestCESU8, "tsconv/nucnvtst/TestCESU8"); |
238 | addTest(root, &TestUTF16, "tsconv/nucnvtst/TestUTF16"); | |
239 | addTest(root, &TestUTF16BE, "tsconv/nucnvtst/TestUTF16BE"); | |
240 | addTest(root, &TestUTF16LE, "tsconv/nucnvtst/TestUTF16LE"); | |
241 | addTest(root, &TestUTF32, "tsconv/nucnvtst/TestUTF32"); | |
242 | addTest(root, &TestUTF32BE, "tsconv/nucnvtst/TestUTF32BE"); | |
243 | addTest(root, &TestUTF32LE, "tsconv/nucnvtst/TestUTF32LE"); | |
73c04bcf A |
244 | |
245 | #if !UCONFIG_NO_LEGACY_CONVERSION | |
374ca955 | 246 | addTest(root, &TestLMBCS, "tsconv/nucnvtst/TestLMBCS"); |
73c04bcf | 247 | #endif |
374ca955 | 248 | |
b75a7d8f | 249 | addTest(root, &TestLATIN1, "tsconv/nucnvtst/TestLATIN1"); |
73c04bcf A |
250 | |
251 | #if !UCONFIG_NO_LEGACY_CONVERSION | |
b75a7d8f A |
252 | addTest(root, &TestSBCS, "tsconv/nucnvtst/TestSBCS"); |
253 | addTest(root, &TestDBCS, "tsconv/nucnvtst/TestDBCS"); | |
254 | addTest(root, &TestMBCS, "tsconv/nucnvtst/TestMBCS"); | |
73c04bcf | 255 | |
374ca955 | 256 | #ifdef U_ENABLE_GENERIC_ISO_2022 |
b75a7d8f | 257 | addTest(root, &TestISO_2022, "tsconv/nucnvtst/TestISO_2022"); |
374ca955 | 258 | #endif |
73c04bcf | 259 | |
b75a7d8f A |
260 | addTest(root, &TestISO_2022_JP, "tsconv/nucnvtst/TestISO_2022_JP"); |
261 | addTest(root, &TestJIS, "tsconv/nucnvtst/TestJIS"); | |
262 | addTest(root, &TestISO_2022_JP_1, "tsconv/nucnvtst/TestISO_2022_JP_1"); | |
263 | addTest(root, &TestISO_2022_JP_2, "tsconv/nucnvtst/TestISO_2022_JP_2"); | |
264 | addTest(root, &TestISO_2022_KR, "tsconv/nucnvtst/TestISO_2022_KR"); | |
265 | addTest(root, &TestISO_2022_KR_1, "tsconv/nucnvtst/TestISO_2022_KR_1"); | |
266 | addTest(root, &TestISO_2022_CN, "tsconv/nucnvtst/TestISO_2022_CN"); | |
267 | addTest(root, &TestISO_2022_CN_EXT, "tsconv/nucnvtst/TestISO_2022_CN_EXT"); | |
268 | addTest(root, &TestJitterbug915, "tsconv/nucnvtst/TestJitterbug915"); | |
269 | addTest(root, &TestHZ, "tsconv/nucnvtst/TestHZ"); | |
73c04bcf A |
270 | #endif |
271 | ||
b75a7d8f | 272 | addTest(root, &TestSCSU, "tsconv/nucnvtst/TestSCSU"); |
73c04bcf A |
273 | |
274 | #if !UCONFIG_NO_LEGACY_CONVERSION | |
b75a7d8f A |
275 | addTest(root, &TestEBCDIC_STATEFUL, "tsconv/nucnvtst/TestEBCDIC_STATEFUL"); |
276 | addTest(root, &TestGB18030, "tsconv/nucnvtst/TestGB18030"); | |
b75a7d8f A |
277 | addTest(root, &TestJitterbug255, "tsconv/nucnvtst/TestJitterbug255"); |
278 | addTest(root, &TestEBCDICUS4XML, "tsconv/nucnvtst/TestEBCDICUS4XML"); | |
279 | addTest(root, &TestISCII, "tsconv/nucnvtst/TestISCII"); | |
73c04bcf | 280 | |
b75a7d8f A |
281 | #if !UCONFIG_NO_COLLATION |
282 | addTest(root, &TestJitterbug981, "tsconv/nucnvtst/TestJitterbug981"); | |
283 | #endif | |
73c04bcf | 284 | |
b75a7d8f | 285 | addTest(root, &TestJitterbug1293, "tsconv/nucnvtst/TestJitterbug1293"); |
73c04bcf A |
286 | #endif |
287 | ||
288 | ||
289 | #if !UCONFIG_NO_LEGACY_CONVERSION | |
b75a7d8f | 290 | addTest(root, &TestCoverageMBCS, "tsconv/nucnvtst/TestCoverageMBCS"); |
73c04bcf A |
291 | #endif |
292 | ||
b75a7d8f | 293 | addTest(root, &TestRoundTrippingAllUTF, "tsconv/nucnvtst/TestRoundTrippingAllUTF"); |
73c04bcf A |
294 | |
295 | #if !UCONFIG_NO_LEGACY_CONVERSION | |
b75a7d8f A |
296 | addTest(root, &TestJitterbug2346, "tsconv/nucnvtst/TestJitterbug2346"); |
297 | addTest(root, &TestJitterbug2411, "tsconv/nucnvtst/TestJitterbug2411"); | |
d5d484b0 | 298 | addTest(root, &TestJitterbug6175, "tsconv/nucnvtst/TestJitterbug6175"); |
73c04bcf | 299 | #endif |
b75a7d8f A |
300 | } |
301 | ||
302 | ||
303 | /* Note that this test already makes use of statics, so it's not really | |
304 | multithread safe. | |
305 | This convenience function lets us make the error messages actually useful. | |
306 | */ | |
307 | ||
308 | static void setNuConvTestName(const char *codepage, const char *direction) | |
309 | { | |
374ca955 A |
310 | sprintf(gNuConvTestName, "[Testing %s %s Unicode, InputBufSiz=%d, OutputBufSiz=%d]", |
311 | codepage, | |
312 | direction, | |
313 | (int)gInBufferSize, | |
314 | (int)gOutBufferSize); | |
b75a7d8f A |
315 | } |
316 | ||
317 | typedef enum | |
318 | { | |
319 | TC_OK = 0, /* test was OK */ | |
320 | TC_MISMATCH = 1, /* Match failed - err was printed */ | |
321 | TC_FAIL = 2 /* Test failed, don't print an err because it was already printed. */ | |
322 | } ETestConvertResult; | |
323 | ||
324 | /* Note: This function uses global variables and it will not do offset | |
325 | checking without gOutBufferSize and gInBufferSize set to NEW_MAX_BUFFER */ | |
326 | static ETestConvertResult testConvertFromU( const UChar *source, int sourceLen, const uint8_t *expect, int expectLen, | |
327 | const char *codepage, const int32_t *expectOffsets , UBool useFallback) | |
328 | { | |
329 | UErrorCode status = U_ZERO_ERROR; | |
330 | UConverter *conv = 0; | |
73c04bcf | 331 | char junkout[NEW_MAX_BUFFER]; /* FIX */ |
b75a7d8f | 332 | int32_t junokout[NEW_MAX_BUFFER]; /* FIX */ |
73c04bcf | 333 | char *p; |
b75a7d8f | 334 | const UChar *src; |
73c04bcf A |
335 | char *end; |
336 | char *targ; | |
b75a7d8f A |
337 | int32_t *offs; |
338 | int i; | |
339 | int32_t realBufferSize; | |
73c04bcf | 340 | char *realBufferEnd; |
b75a7d8f A |
341 | const UChar *realSourceEnd; |
342 | const UChar *sourceLimit; | |
343 | UBool checkOffsets = TRUE; | |
344 | UBool doFlush; | |
345 | ||
346 | for(i=0;i<NEW_MAX_BUFFER;i++) | |
73c04bcf | 347 | junkout[i] = (char)0xF0; |
b75a7d8f A |
348 | for(i=0;i<NEW_MAX_BUFFER;i++) |
349 | junokout[i] = 0xFF; | |
350 | ||
351 | setNuConvTestName(codepage, "FROM"); | |
352 | ||
353 | log_verbose("\n========= %s\n", gNuConvTestName); | |
354 | ||
355 | conv = my_ucnv_open(codepage, &status); | |
356 | ||
357 | if(U_FAILURE(status)) | |
358 | { | |
359 | log_data_err("Couldn't open converter %s\n",codepage); | |
360 | return TC_FAIL; | |
361 | } | |
362 | if(useFallback){ | |
363 | ucnv_setFallback(conv,useFallback); | |
364 | } | |
365 | ||
366 | log_verbose("Converter opened..\n"); | |
367 | ||
368 | src = source; | |
369 | targ = junkout; | |
370 | offs = junokout; | |
371 | ||
372 | realBufferSize = (sizeof(junkout)/sizeof(junkout[0])); | |
373 | realBufferEnd = junkout + realBufferSize; | |
374 | realSourceEnd = source + sourceLen; | |
375 | ||
376 | if ( gOutBufferSize != realBufferSize || gInBufferSize != NEW_MAX_BUFFER ) | |
377 | checkOffsets = FALSE; | |
378 | ||
379 | do | |
380 | { | |
381 | end = nct_min(targ + gOutBufferSize, realBufferEnd); | |
382 | sourceLimit = nct_min(src + gInBufferSize, realSourceEnd); | |
383 | ||
384 | doFlush = (UBool)(sourceLimit == realSourceEnd); | |
385 | ||
386 | if(targ == realBufferEnd) { | |
387 | log_err("Error, overflowed the real buffer while about to call fromUnicode! targ=%08lx %s", targ, gNuConvTestName); | |
388 | return TC_FAIL; | |
389 | } | |
390 | log_verbose("calling fromUnicode @ SOURCE:%08lx to %08lx TARGET: %08lx to %08lx, flush=%s\n", src,sourceLimit, targ,end, doFlush?"TRUE":"FALSE"); | |
391 | ||
392 | ||
393 | status = U_ZERO_ERROR; | |
394 | ||
395 | ucnv_fromUnicode (conv, | |
73c04bcf A |
396 | &targ, |
397 | end, | |
b75a7d8f A |
398 | &src, |
399 | sourceLimit, | |
400 | checkOffsets ? offs : NULL, | |
401 | doFlush, /* flush if we're at the end of the input data */ | |
402 | &status); | |
403 | } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (U_SUCCESS(status) && sourceLimit < realSourceEnd) ); | |
404 | ||
405 | if(U_FAILURE(status)) { | |
406 | log_err("Problem doing fromUnicode to %s, errcode %s %s\n", codepage, myErrorName(status), gNuConvTestName); | |
407 | return TC_FAIL; | |
408 | } | |
409 | ||
410 | log_verbose("\nConversion done [%d uchars in -> %d chars out]. \nResult :", | |
411 | sourceLen, targ-junkout); | |
412 | ||
413 | if(VERBOSITY) | |
414 | { | |
415 | char junk[9999]; | |
416 | char offset_str[9999]; | |
73c04bcf | 417 | char *ptr; |
b75a7d8f A |
418 | |
419 | junk[0] = 0; | |
420 | offset_str[0] = 0; | |
421 | for(ptr = junkout;ptr<targ;ptr++) { | |
422 | sprintf(junk + strlen(junk), "0x%02x, ", (int)(0xFF & *ptr)); | |
423 | sprintf(offset_str + strlen(offset_str), "0x%02x, ", (int)(0xFF & junokout[ptr-junkout])); | |
424 | } | |
425 | ||
426 | log_verbose(junk); | |
427 | printSeq((const uint8_t *)expect, expectLen); | |
428 | if ( checkOffsets ) { | |
429 | log_verbose("\nOffsets:"); | |
430 | log_verbose(offset_str); | |
431 | } | |
432 | log_verbose("\n"); | |
433 | } | |
434 | ucnv_close(conv); | |
435 | ||
436 | if(expectLen != targ-junkout) { | |
437 | log_err("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName); | |
438 | log_verbose("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName); | |
439 | printf("\nGot:"); | |
73c04bcf | 440 | printSeqErr((const unsigned char*)junkout, (int32_t)(targ-junkout)); |
b75a7d8f A |
441 | printf("\nExpected:"); |
442 | printSeqErr((const unsigned char*)expect, expectLen); | |
443 | return TC_MISMATCH; | |
444 | } | |
445 | ||
446 | if (checkOffsets && (expectOffsets != 0) ) { | |
447 | log_verbose("comparing %d offsets..\n", targ-junkout); | |
448 | if(memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t) )){ | |
449 | log_err("did not get the expected offsets. %s\n", gNuConvTestName); | |
73c04bcf | 450 | printSeqErr((const unsigned char*)junkout, (int32_t)(targ-junkout)); |
b75a7d8f A |
451 | log_err("\n"); |
452 | log_err("Got : "); | |
453 | for(p=junkout;p<targ;p++) { | |
454 | log_err("%d,", junokout[p-junkout]); | |
455 | } | |
456 | log_err("\n"); | |
457 | log_err("Expected: "); | |
458 | for(i=0; i<(targ-junkout); i++) { | |
459 | log_err("%d,", expectOffsets[i]); | |
460 | } | |
461 | log_err("\n"); | |
462 | } | |
463 | } | |
464 | ||
465 | log_verbose("comparing..\n"); | |
466 | if(!memcmp(junkout, expect, expectLen)) { | |
467 | log_verbose("Matches!\n"); | |
468 | return TC_OK; | |
469 | } else { | |
470 | log_err("String does not match u->%s\n", gNuConvTestName); | |
471 | printUSeqErr(source, sourceLen); | |
472 | printf("\nGot:"); | |
473 | printSeqErr((const unsigned char *)junkout, expectLen); | |
474 | printf("\nExpected:"); | |
475 | printSeqErr((const unsigned char *)expect, expectLen); | |
476 | ||
477 | return TC_MISMATCH; | |
478 | } | |
479 | } | |
480 | ||
481 | /* Note: This function uses global variables and it will not do offset | |
482 | checking without gOutBufferSize and gInBufferSize set to NEW_MAX_BUFFER */ | |
483 | static ETestConvertResult testConvertToU( const uint8_t *source, int sourcelen, const UChar *expect, int expectlen, | |
484 | const char *codepage, const int32_t *expectOffsets, UBool useFallback) | |
485 | { | |
486 | UErrorCode status = U_ZERO_ERROR; | |
487 | UConverter *conv = 0; | |
488 | UChar junkout[NEW_MAX_BUFFER]; /* FIX */ | |
489 | int32_t junokout[NEW_MAX_BUFFER]; /* FIX */ | |
73c04bcf A |
490 | const char *src; |
491 | const char *realSourceEnd; | |
492 | const char *srcLimit; | |
b75a7d8f A |
493 | UChar *p; |
494 | UChar *targ; | |
495 | UChar *end; | |
496 | int32_t *offs; | |
497 | int i; | |
498 | UBool checkOffsets = TRUE; | |
499 | ||
500 | int32_t realBufferSize; | |
501 | UChar *realBufferEnd; | |
502 | ||
503 | ||
504 | for(i=0;i<NEW_MAX_BUFFER;i++) | |
505 | junkout[i] = 0xFFFE; | |
506 | ||
507 | for(i=0;i<NEW_MAX_BUFFER;i++) | |
508 | junokout[i] = -1; | |
509 | ||
510 | setNuConvTestName(codepage, "TO"); | |
511 | ||
512 | log_verbose("\n========= %s\n", gNuConvTestName); | |
513 | ||
514 | conv = my_ucnv_open(codepage, &status); | |
515 | ||
516 | if(U_FAILURE(status)) | |
517 | { | |
518 | log_data_err("Couldn't open converter %s\n",gNuConvTestName); | |
519 | return TC_FAIL; | |
520 | } | |
521 | if(useFallback){ | |
522 | ucnv_setFallback(conv,useFallback); | |
523 | } | |
524 | log_verbose("Converter opened..\n"); | |
525 | ||
73c04bcf | 526 | src = (const char *)source; |
b75a7d8f A |
527 | targ = junkout; |
528 | offs = junokout; | |
529 | ||
530 | realBufferSize = (sizeof(junkout)/sizeof(junkout[0])); | |
531 | realBufferEnd = junkout + realBufferSize; | |
532 | realSourceEnd = src + sourcelen; | |
533 | ||
534 | if ( gOutBufferSize != realBufferSize || gInBufferSize != NEW_MAX_BUFFER ) | |
535 | checkOffsets = FALSE; | |
536 | ||
537 | do | |
538 | { | |
539 | end = nct_min( targ + gOutBufferSize, realBufferEnd); | |
540 | srcLimit = nct_min(realSourceEnd, src + gInBufferSize); | |
541 | ||
542 | if(targ == realBufferEnd) | |
543 | { | |
544 | log_err("Error, the end would overflow the real output buffer while about to call toUnicode! tarjet=%08lx %s",targ,gNuConvTestName); | |
545 | return TC_FAIL; | |
546 | } | |
547 | log_verbose("calling toUnicode @ %08lx to %08lx\n", targ,end); | |
548 | ||
549 | /* oldTarg = targ; */ | |
550 | ||
551 | status = U_ZERO_ERROR; | |
552 | ||
553 | ucnv_toUnicode (conv, | |
554 | &targ, | |
555 | end, | |
73c04bcf A |
556 | &src, |
557 | srcLimit, | |
b75a7d8f A |
558 | checkOffsets ? offs : NULL, |
559 | (UBool)(srcLimit == realSourceEnd), /* flush if we're at the end of hte source data */ | |
560 | &status); | |
561 | ||
562 | /* offs += (targ-oldTarg); */ | |
563 | ||
564 | } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (U_SUCCESS(status) && (srcLimit < realSourceEnd)) ); /* while we just need another buffer */ | |
565 | ||
566 | if(U_FAILURE(status)) | |
567 | { | |
568 | log_err("Problem doing %s toUnicode, errcode %s %s\n", codepage, myErrorName(status), gNuConvTestName); | |
569 | return TC_FAIL; | |
570 | } | |
571 | ||
572 | log_verbose("\nConversion done. %d bytes -> %d chars.\nResult :", | |
573 | sourcelen, targ-junkout); | |
574 | if(VERBOSITY) | |
575 | { | |
576 | char junk[9999]; | |
577 | char offset_str[9999]; | |
578 | UChar *ptr; | |
579 | ||
580 | junk[0] = 0; | |
581 | offset_str[0] = 0; | |
582 | ||
583 | for(ptr = junkout;ptr<targ;ptr++) | |
584 | { | |
585 | sprintf(junk + strlen(junk), "0x%04x, ", (0xFFFF) & (unsigned int)*ptr); | |
586 | sprintf(offset_str + strlen(offset_str), "0x%04x, ", (0xFFFF) & (unsigned int)junokout[ptr-junkout]); | |
587 | } | |
588 | ||
589 | log_verbose(junk); | |
590 | printUSeq(expect, expectlen); | |
591 | if ( checkOffsets ) | |
592 | { | |
593 | log_verbose("\nOffsets:"); | |
594 | log_verbose(offset_str); | |
595 | } | |
596 | log_verbose("\n"); | |
597 | } | |
598 | ucnv_close(conv); | |
599 | ||
600 | log_verbose("comparing %d uchars (%d bytes)..\n",expectlen,expectlen*2); | |
601 | ||
602 | if (checkOffsets && (expectOffsets != 0)) | |
603 | { | |
604 | if(memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t))){ | |
605 | log_err("did not get the expected offsets. %s\n",gNuConvTestName); | |
606 | log_err("Got: "); | |
607 | for(p=junkout;p<targ;p++) { | |
608 | log_err("%d,", junokout[p-junkout]); | |
609 | } | |
610 | log_err("\n"); | |
611 | log_err("Expected: "); | |
612 | for(i=0; i<(targ-junkout); i++) { | |
613 | log_err("%d,", expectOffsets[i]); | |
614 | } | |
615 | log_err("\n"); | |
616 | log_err("output: "); | |
617 | for(i=0; i<(targ-junkout); i++) { | |
618 | log_err("%X,", junkout[i]); | |
619 | } | |
620 | log_err("\n"); | |
621 | log_err("input: "); | |
73c04bcf | 622 | for(i=0; i<(src-(const char *)source); i++) { |
b75a7d8f A |
623 | log_err("%X,", (unsigned char)source[i]); |
624 | } | |
625 | log_err("\n"); | |
626 | } | |
627 | } | |
628 | ||
629 | if(!memcmp(junkout, expect, expectlen*2)) | |
630 | { | |
631 | log_verbose("Matches!\n"); | |
632 | return TC_OK; | |
633 | } | |
634 | else | |
635 | { | |
636 | log_err("String does not match. %s\n", gNuConvTestName); | |
637 | log_verbose("String does not match. %s\n", gNuConvTestName); | |
638 | printf("\nGot:"); | |
639 | printUSeqErr(junkout, expectlen); | |
640 | printf("\nExpected:"); | |
641 | printUSeqErr(expect, expectlen); | |
642 | return TC_MISMATCH; | |
643 | } | |
644 | } | |
645 | ||
646 | ||
647 | static void TestNewConvertWithBufferSizes(int32_t outsize, int32_t insize ) | |
648 | { | |
649 | /** test chars #1 */ | |
650 | /* 1 2 3 1Han 2Han 3Han . */ | |
73c04bcf A |
651 | static const UChar sampleText[] = |
652 | { 0x0031, 0x0032, 0x0033, 0x0000, 0x4e00, 0x4e8c, 0x4e09, 0x002E }; | |
b75a7d8f A |
653 | |
654 | ||
73c04bcf | 655 | static const uint8_t expectedUTF8[] = |
b75a7d8f | 656 | { 0x31, 0x32, 0x33, 0x00, 0xe4, 0xb8, 0x80, 0xe4, 0xba, 0x8c, 0xe4, 0xb8, 0x89, 0x2E }; |
73c04bcf | 657 | static const int32_t toUTF8Offs[] = |
b75a7d8f | 658 | { 0x00, 0x01, 0x02, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07}; |
73c04bcf | 659 | static const int32_t fmUTF8Offs[] = |
b75a7d8f A |
660 | { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0007, 0x000a, 0x000d }; |
661 | ||
374ca955 | 662 | #ifdef U_ENABLE_GENERIC_ISO_2022 |
b75a7d8f | 663 | /* Same as UTF8, but with ^[%B preceeding */ |
73c04bcf | 664 | static const const uint8_t expectedISO2022[] = |
b75a7d8f | 665 | { 0x1b, 0x25, 0x42, 0x31, 0x32, 0x33, 0x00, 0xe4, 0xb8, 0x80, 0xe4, 0xba, 0x8c, 0xe4, 0xb8, 0x89, 0x2E }; |
73c04bcf | 666 | static const int32_t toISO2022Offs[] = |
b75a7d8f A |
667 | { -1, -1, -1, 0x00, 0x01, 0x02, 0x03, 0x04, 0x04, |
668 | 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07 }; /* right? */ | |
73c04bcf | 669 | static const int32_t fmISO2022Offs[] = |
b75a7d8f | 670 | { 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x000a, 0x000d, 0x0010 }; /* is this right? */ |
374ca955 | 671 | #endif |
b75a7d8f A |
672 | |
673 | /* 1 2 3 0, <SO> h1 h2 h3 <SI> . EBCDIC_STATEFUL */ | |
73c04bcf | 674 | static const uint8_t expectedIBM930[] = |
b75a7d8f | 675 | { 0xF1, 0xF2, 0xF3, 0x00, 0x0E, 0x45, 0x41, 0x45, 0x42, 0x45, 0x43, 0x0F, 0x4B }; |
73c04bcf | 676 | static const int32_t toIBM930Offs[] = |
b75a7d8f | 677 | { 0x00, 0x01, 0x02, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, }; |
73c04bcf | 678 | static const int32_t fmIBM930Offs[] = |
b75a7d8f A |
679 | { 0x0000, 0x0001, 0x0002, 0x0003, 0x0005, 0x0007, 0x0009, 0x000c}; |
680 | ||
681 | /* 1 2 3 0 h1 h2 h3 . MBCS*/ | |
73c04bcf | 682 | static const uint8_t expectedIBM943[] = |
b75a7d8f | 683 | { 0x31, 0x32, 0x33, 0x00, 0x88, 0xea, 0x93, 0xf1, 0x8e, 0x4f, 0x2e }; |
73c04bcf | 684 | static const int32_t toIBM943Offs [] = |
b75a7d8f | 685 | { 0x00, 0x01, 0x02, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07 }; |
73c04bcf | 686 | static const int32_t fmIBM943Offs[] = |
b75a7d8f A |
687 | { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0006, 0x0008, 0x000a}; |
688 | ||
689 | /* 1 2 3 0 h1 h2 h3 . DBCS*/ | |
73c04bcf | 690 | static const uint8_t expectedIBM9027[] = |
b75a7d8f | 691 | { 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0x4c, 0x41, 0x4c, 0x48, 0x4c, 0x55, 0xfe, 0xfe}; |
73c04bcf | 692 | static const int32_t toIBM9027Offs [] = |
b75a7d8f A |
693 | { 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07}; |
694 | ||
695 | /* 1 2 3 0 <?> <?> <?> . SBCS*/ | |
73c04bcf | 696 | static const uint8_t expectedIBM920[] = |
b75a7d8f | 697 | { 0x31, 0x32, 0x33, 0x00, 0x1a, 0x1a, 0x1a, 0x2e }; |
73c04bcf | 698 | static const int32_t toIBM920Offs [] = |
b75a7d8f A |
699 | { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; |
700 | ||
701 | /* 1 2 3 0 <?> <?> <?> . SBCS*/ | |
73c04bcf | 702 | static const uint8_t expectedISO88593[] = |
b75a7d8f | 703 | { 0x31, 0x32, 0x33, 0x00, 0x1a, 0x1a, 0x1a, 0x2E }; |
73c04bcf | 704 | static const int32_t toISO88593Offs[] = |
b75a7d8f A |
705 | { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; |
706 | ||
73c04bcf A |
707 | /* 1 2 3 0 <?> <?> <?> . <?> LATIN_1*/ |
708 | static const uint8_t expectedLATIN1[] = | |
b75a7d8f | 709 | { 0x31, 0x32, 0x33, 0x00, 0x1a, 0x1a, 0x1a, 0x2E }; |
73c04bcf | 710 | static const int32_t toLATIN1Offs[] = |
b75a7d8f A |
711 | { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; |
712 | ||
713 | ||
714 | /* etc */ | |
73c04bcf | 715 | static const uint8_t expectedUTF16BE[] = |
b75a7d8f | 716 | { 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x00, 0x4e, 0x00, 0x4e, 0x8c, 0x4e, 0x09, 0x00, 0x2e }; |
73c04bcf | 717 | static const int32_t toUTF16BEOffs[]= |
b75a7d8f | 718 | { 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07}; |
73c04bcf | 719 | static const int32_t fmUTF16BEOffs[] = |
b75a7d8f A |
720 | { 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e }; |
721 | ||
73c04bcf | 722 | static const uint8_t expectedUTF16LE[] = |
b75a7d8f | 723 | { 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x8c, 0x4e, 0x09, 0x4e, 0x2e, 0x00 }; |
73c04bcf | 724 | static const int32_t toUTF16LEOffs[]= |
b75a7d8f | 725 | { 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07}; |
73c04bcf | 726 | static const int32_t fmUTF16LEOffs[] = |
b75a7d8f A |
727 | { 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e }; |
728 | ||
73c04bcf | 729 | static const uint8_t expectedUTF32BE[] = |
b75a7d8f A |
730 | { 0x00, 0x00, 0x00, 0x31, |
731 | 0x00, 0x00, 0x00, 0x32, | |
732 | 0x00, 0x00, 0x00, 0x33, | |
733 | 0x00, 0x00, 0x00, 0x00, | |
734 | 0x00, 0x00, 0x4e, 0x00, | |
735 | 0x00, 0x00, 0x4e, 0x8c, | |
736 | 0x00, 0x00, 0x4e, 0x09, | |
737 | 0x00, 0x00, 0x00, 0x2e }; | |
73c04bcf | 738 | static const int32_t toUTF32BEOffs[]= |
b75a7d8f A |
739 | { 0x00, 0x00, 0x00, 0x00, |
740 | 0x01, 0x01, 0x01, 0x01, | |
741 | 0x02, 0x02, 0x02, 0x02, | |
742 | 0x03, 0x03, 0x03, 0x03, | |
743 | 0x04, 0x04, 0x04, 0x04, | |
744 | 0x05, 0x05, 0x05, 0x05, | |
745 | 0x06, 0x06, 0x06, 0x06, | |
746 | 0x07, 0x07, 0x07, 0x07, | |
747 | 0x08, 0x08, 0x08, 0x08 }; | |
73c04bcf | 748 | static const int32_t fmUTF32BEOffs[] = |
b75a7d8f A |
749 | { 0x0000, 0x0004, 0x0008, 0x000c, 0x0010, 0x0014, 0x0018, 0x001c }; |
750 | ||
73c04bcf | 751 | static const uint8_t expectedUTF32LE[] = |
b75a7d8f A |
752 | { 0x31, 0x00, 0x00, 0x00, |
753 | 0x32, 0x00, 0x00, 0x00, | |
754 | 0x33, 0x00, 0x00, 0x00, | |
755 | 0x00, 0x00, 0x00, 0x00, | |
756 | 0x00, 0x4e, 0x00, 0x00, | |
757 | 0x8c, 0x4e, 0x00, 0x00, | |
758 | 0x09, 0x4e, 0x00, 0x00, | |
759 | 0x2e, 0x00, 0x00, 0x00 }; | |
73c04bcf | 760 | static const int32_t toUTF32LEOffs[]= |
b75a7d8f A |
761 | { 0x00, 0x00, 0x00, 0x00, |
762 | 0x01, 0x01, 0x01, 0x01, | |
763 | 0x02, 0x02, 0x02, 0x02, | |
764 | 0x03, 0x03, 0x03, 0x03, | |
765 | 0x04, 0x04, 0x04, 0x04, | |
766 | 0x05, 0x05, 0x05, 0x05, | |
767 | 0x06, 0x06, 0x06, 0x06, | |
768 | 0x07, 0x07, 0x07, 0x07, | |
769 | 0x08, 0x08, 0x08, 0x08 }; | |
73c04bcf | 770 | static const int32_t fmUTF32LEOffs[] = |
b75a7d8f A |
771 | { 0x0000, 0x0004, 0x0008, 0x000c, 0x0010, 0x0014, 0x0018, 0x001c }; |
772 | ||
773 | ||
774 | ||
775 | ||
776 | /** Test chars #2 **/ | |
777 | ||
778 | /* Sahha [health], slashed h's */ | |
73c04bcf A |
779 | static const UChar malteseUChars[] = { 0x0053, 0x0061, 0x0127, 0x0127, 0x0061 }; |
780 | static const uint8_t expectedMaltese913[] = { 0x53, 0x61, 0xB1, 0xB1, 0x61 }; | |
b75a7d8f A |
781 | |
782 | /* LMBCS */ | |
73c04bcf A |
783 | static const UChar LMBCSUChars[] = { 0x0027, 0x010A, 0x0000, 0x0127, 0x2666, 0x0220 }; |
784 | static const uint8_t expectedLMBCS[] = { 0x27, 0x06, 0x04, 0x00, 0x01, 0x73, 0x01, 0x04, 0x14, 0x02, 0x20 }; | |
785 | static const int32_t toLMBCSOffs[] = { 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x04 , 0x05, 0x05, 0x05 }; | |
786 | static const int32_t fmLMBCSOffs[] = { 0x0000, 0x0001, 0x0003, 0x0004, 0x0006, 0x0008}; | |
b75a7d8f A |
787 | /*********************************** START OF CODE finally *************/ |
788 | ||
73c04bcf A |
789 | gInBufferSize = insize; |
790 | gOutBufferSize = outsize; | |
b75a7d8f | 791 | |
73c04bcf | 792 | log_verbose("\n\n\nTesting conversions with InputBufferSize = %d, OutputBufferSize = %d\n", gInBufferSize, gOutBufferSize); |
b75a7d8f A |
793 | |
794 | ||
b75a7d8f A |
795 | /*UTF-8*/ |
796 | testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), | |
797 | expectedUTF8, sizeof(expectedUTF8), "UTF8", toUTF8Offs,FALSE ); | |
798 | ||
799 | log_verbose("Test surrogate behaviour for UTF8\n"); | |
800 | { | |
73c04bcf A |
801 | static const UChar testinput[]={ 0x20ac, 0xd801, 0xdc01, 0xdc01 }; |
802 | static const uint8_t expectedUTF8test2[]= { 0xe2, 0x82, 0xac, | |
b75a7d8f A |
803 | 0xf0, 0x90, 0x90, 0x81, |
804 | 0xef, 0xbf, 0xbd | |
805 | }; | |
73c04bcf | 806 | static const int32_t offsets[]={ 0, 0, 0, 1, 1, 1, 1, 3, 3, 3 }; |
b75a7d8f A |
807 | testConvertFromU(testinput, sizeof(testinput)/sizeof(testinput[0]), |
808 | expectedUTF8test2, sizeof(expectedUTF8test2), "UTF8", offsets,FALSE ); | |
809 | ||
810 | ||
811 | } | |
73c04bcf A |
812 | |
813 | #if !UCONFIG_NO_LEGACY_CONVERSION && defined(U_ENABLE_GENERIC_ISO_2022) | |
b75a7d8f A |
814 | /*ISO-2022*/ |
815 | testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), | |
816 | expectedISO2022, sizeof(expectedISO2022), "ISO_2022", toISO2022Offs,FALSE ); | |
374ca955 | 817 | #endif |
73c04bcf | 818 | |
b75a7d8f A |
819 | /*UTF16 LE*/ |
820 | testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), | |
821 | expectedUTF16LE, sizeof(expectedUTF16LE), "utf-16le", toUTF16LEOffs,FALSE ); | |
822 | /*UTF16 BE*/ | |
823 | testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), | |
824 | expectedUTF16BE, sizeof(expectedUTF16BE), "utf-16be", toUTF16BEOffs,FALSE ); | |
825 | /*UTF32 LE*/ | |
826 | testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), | |
827 | expectedUTF32LE, sizeof(expectedUTF32LE), "utf-32le", toUTF32LEOffs,FALSE ); | |
828 | /*UTF32 BE*/ | |
829 | testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), | |
830 | expectedUTF32BE, sizeof(expectedUTF32BE), "utf-32be", toUTF32BEOffs,FALSE ); | |
73c04bcf | 831 | |
b75a7d8f A |
832 | /*LATIN_1*/ |
833 | testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), | |
834 | expectedLATIN1, sizeof(expectedLATIN1), "LATIN_1", toLATIN1Offs,FALSE ); | |
73c04bcf A |
835 | |
836 | #if !UCONFIG_NO_LEGACY_CONVERSION | |
b75a7d8f A |
837 | /*EBCDIC_STATEFUL*/ |
838 | testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), | |
839 | expectedIBM930, sizeof(expectedIBM930), "ibm-930", toIBM930Offs,FALSE ); | |
840 | ||
841 | testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), | |
842 | expectedISO88593, sizeof(expectedISO88593), "iso-8859-3", toISO88593Offs,FALSE ); | |
843 | ||
844 | /*MBCS*/ | |
845 | ||
846 | testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), | |
847 | expectedIBM943, sizeof(expectedIBM943), "ibm-943", toIBM943Offs,FALSE ); | |
848 | /*DBCS*/ | |
849 | testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), | |
850 | expectedIBM9027, sizeof(expectedIBM9027), "@ibm9027", toIBM9027Offs,FALSE ); | |
851 | /*SBCS*/ | |
852 | testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), | |
853 | expectedIBM920, sizeof(expectedIBM920), "ibm-920", toIBM920Offs,FALSE ); | |
854 | /*SBCS*/ | |
855 | testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), | |
856 | expectedISO88593, sizeof(expectedISO88593), "iso-8859-3", toISO88593Offs,FALSE ); | |
73c04bcf | 857 | #endif |
b75a7d8f A |
858 | |
859 | ||
860 | /****/ | |
b75a7d8f | 861 | |
b75a7d8f A |
862 | /*UTF-8*/ |
863 | testConvertToU(expectedUTF8, sizeof(expectedUTF8), | |
864 | sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf8", fmUTF8Offs,FALSE); | |
73c04bcf | 865 | #if !UCONFIG_NO_LEGACY_CONVERSION && defined(U_ENABLE_GENERIC_ISO_2022) |
b75a7d8f A |
866 | /*ISO-2022*/ |
867 | testConvertToU(expectedISO2022, sizeof(expectedISO2022), | |
868 | sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "ISO_2022", fmISO2022Offs,FALSE); | |
374ca955 | 869 | #endif |
73c04bcf | 870 | |
b75a7d8f A |
871 | /*UTF16 LE*/ |
872 | testConvertToU(expectedUTF16LE, sizeof(expectedUTF16LE), | |
873 | sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf-16le", fmUTF16LEOffs,FALSE); | |
874 | /*UTF16 BE*/ | |
875 | testConvertToU(expectedUTF16BE, sizeof(expectedUTF16BE), | |
876 | sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf-16be", fmUTF16BEOffs,FALSE); | |
877 | /*UTF32 LE*/ | |
878 | testConvertToU(expectedUTF32LE, sizeof(expectedUTF32LE), | |
879 | sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf-32le", fmUTF32LEOffs,FALSE); | |
880 | /*UTF32 BE*/ | |
881 | testConvertToU(expectedUTF32BE, sizeof(expectedUTF32BE), | |
882 | sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf-32be", fmUTF32BEOffs,FALSE); | |
73c04bcf A |
883 | |
884 | #if !UCONFIG_NO_LEGACY_CONVERSION | |
b75a7d8f A |
885 | /*EBCDIC_STATEFUL*/ |
886 | testConvertToU(expectedIBM930, sizeof(expectedIBM930), | |
887 | sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "ibm-930", fmIBM930Offs,FALSE); | |
888 | /*MBCS*/ | |
889 | testConvertToU(expectedIBM943, sizeof(expectedIBM943), | |
890 | sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "ibm-943", fmIBM943Offs,FALSE); | |
73c04bcf | 891 | #endif |
b75a7d8f A |
892 | |
893 | /* Try it again to make sure it still works */ | |
894 | testConvertToU(expectedUTF16LE, sizeof(expectedUTF16LE), | |
895 | sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf-16le", fmUTF16LEOffs,FALSE); | |
896 | ||
73c04bcf | 897 | #if !UCONFIG_NO_LEGACY_CONVERSION |
b75a7d8f A |
898 | testConvertToU(expectedMaltese913, sizeof(expectedMaltese913), |
899 | malteseUChars, sizeof(malteseUChars)/sizeof(malteseUChars[0]), "latin3", NULL,FALSE); | |
900 | ||
901 | testConvertFromU(malteseUChars, sizeof(malteseUChars)/sizeof(malteseUChars[0]), | |
902 | expectedMaltese913, sizeof(expectedMaltese913), "iso-8859-3", NULL,FALSE ); | |
903 | ||
904 | /*LMBCS*/ | |
905 | testConvertFromU(LMBCSUChars, sizeof(LMBCSUChars)/sizeof(LMBCSUChars[0]), | |
906 | expectedLMBCS, sizeof(expectedLMBCS), "LMBCS-1", toLMBCSOffs,FALSE ); | |
907 | testConvertToU(expectedLMBCS, sizeof(expectedLMBCS), | |
908 | LMBCSUChars, sizeof(LMBCSUChars)/sizeof(LMBCSUChars[0]), "LMBCS-1", fmLMBCSOffs,FALSE); | |
73c04bcf | 909 | #endif |
b75a7d8f A |
910 | |
911 | /* UTF-7 examples are mostly from http://www.imc.org/rfc2152 */ | |
912 | { | |
913 | /* encode directly set D and set O */ | |
914 | static const uint8_t utf7[] = { | |
915 | /* | |
916 | Hi Mom -+Jjo--! | |
917 | A+ImIDkQ. | |
918 | +- | |
919 | +ZeVnLIqe | |
920 | */ | |
921 | 0x48, 0x69, 0x20, 0x4d, 0x6f, 0x6d, 0x20, 0x2d, 0x2b, 0x4a, 0x6a, 0x6f, 0x2d, 0x2d, 0x21, | |
922 | 0x41, 0x2b, 0x49, 0x6d, 0x49, 0x44, 0x6b, 0x51, 0x2e, | |
923 | 0x2b, 0x2d, | |
924 | 0x2b, 0x5a, 0x65, 0x56, 0x6e, 0x4c, 0x49, 0x71, 0x65 | |
925 | }; | |
926 | static const UChar unicode[] = { | |
927 | /* | |
928 | Hi Mom -<WHITE SMILING FACE>-! | |
929 | A<NOT IDENTICAL TO><ALPHA>. | |
930 | + | |
931 | [Japanese word "nihongo"] | |
932 | */ | |
933 | 0x48, 0x69, 0x20, 0x4d, 0x6f, 0x6d, 0x20, 0x2d, 0x263a, 0x2d, 0x21, | |
934 | 0x41, 0x2262, 0x0391, 0x2e, | |
935 | 0x2b, | |
936 | 0x65e5, 0x672c, 0x8a9e | |
937 | }; | |
938 | static const int32_t toUnicodeOffsets[] = { | |
939 | 0, 1, 2, 3, 4, 5, 6, 7, 9, 13, 14, | |
940 | 15, 17, 19, 23, | |
941 | 24, | |
942 | 27, 29, 32 | |
943 | }; | |
944 | static const int32_t fromUnicodeOffsets[] = { | |
945 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 9, 10, | |
946 | 11, 12, 12, 12, 13, 13, 13, 13, 14, | |
947 | 15, 15, | |
948 | 16, 16, 16, 17, 17, 17, 18, 18, 18 | |
949 | }; | |
950 | ||
951 | /* same but escaping set O (the exclamation mark) */ | |
952 | static const uint8_t utf7Restricted[] = { | |
953 | /* | |
954 | Hi Mom -+Jjo--+ACE- | |
955 | A+ImIDkQ. | |
956 | +- | |
957 | +ZeVnLIqe | |
958 | */ | |
959 | 0x48, 0x69, 0x20, 0x4d, 0x6f, 0x6d, 0x20, 0x2d, 0x2b, 0x4a, 0x6a, 0x6f, 0x2d, 0x2d, 0x2b, 0x41, 0x43, 0x45, 0x2d, | |
960 | 0x41, 0x2b, 0x49, 0x6d, 0x49, 0x44, 0x6b, 0x51, 0x2e, | |
961 | 0x2b, 0x2d, | |
962 | 0x2b, 0x5a, 0x65, 0x56, 0x6e, 0x4c, 0x49, 0x71, 0x65 | |
963 | }; | |
964 | static const int32_t toUnicodeOffsetsR[] = { | |
965 | 0, 1, 2, 3, 4, 5, 6, 7, 9, 13, 15, | |
966 | 19, 21, 23, 27, | |
967 | 28, | |
968 | 31, 33, 36 | |
969 | }; | |
970 | static const int32_t fromUnicodeOffsetsR[] = { | |
971 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 9, 10, 10, 10, 10, 10, | |
972 | 11, 12, 12, 12, 13, 13, 13, 13, 14, | |
973 | 15, 15, | |
974 | 16, 16, 16, 17, 17, 17, 18, 18, 18 | |
975 | }; | |
976 | ||
977 | testConvertFromU(unicode, sizeof(unicode)/U_SIZEOF_UCHAR, utf7, sizeof(utf7), "UTF-7", fromUnicodeOffsets,FALSE); | |
978 | ||
979 | testConvertToU(utf7, sizeof(utf7), unicode, sizeof(unicode)/U_SIZEOF_UCHAR, "UTF-7", toUnicodeOffsets,FALSE); | |
980 | ||
981 | testConvertFromU(unicode, sizeof(unicode)/U_SIZEOF_UCHAR, utf7Restricted, sizeof(utf7Restricted), "UTF-7,version=1", fromUnicodeOffsetsR,FALSE); | |
982 | ||
983 | testConvertToU(utf7Restricted, sizeof(utf7Restricted), unicode, sizeof(unicode)/U_SIZEOF_UCHAR, "UTF-7,version=1", toUnicodeOffsetsR,FALSE); | |
984 | } | |
985 | ||
986 | /* | |
987 | * IMAP-mailbox-name examples are mostly from http://www.imc.org/rfc2152, | |
988 | * modified according to RFC 2060, | |
989 | * and supplemented with the one example in RFC 2060 itself. | |
990 | */ | |
991 | { | |
992 | static const uint8_t imap[] = { | |
993 | /* Hi Mom -&Jjo--! | |
994 | A&ImIDkQ-. | |
995 | &- | |
996 | &ZeVnLIqe- | |
997 | \ | |
998 | ~peter | |
999 | ||
1000 | /&ZeVnLIqe- | |
1001 | /&U,BTFw- | |
1002 | */ | |
1003 | 0x48, 0x69, 0x20, 0x4d, 0x6f, 0x6d, 0x20, 0x2d, 0x26, 0x4a, 0x6a, 0x6f, 0x2d, 0x2d, 0x21, | |
1004 | 0x41, 0x26, 0x49, 0x6d, 0x49, 0x44, 0x6b, 0x51, 0x2d, 0x2e, | |
1005 | 0x26, 0x2d, | |
1006 | 0x26, 0x5a, 0x65, 0x56, 0x6e, 0x4c, 0x49, 0x71, 0x65, 0x2d, | |
1007 | 0x5c, | |
1008 | 0x7e, 0x70, 0x65, 0x74, 0x65, 0x72, | |
1009 | 0x2f, 0x6d, 0x61, 0x69, 0x6c, | |
1010 | 0x2f, 0x26, 0x5a, 0x65, 0x56, 0x6e, 0x4c, 0x49, 0x71, 0x65, 0x2d, | |
1011 | 0x2f, 0x26, 0x55, 0x2c, 0x42, 0x54, 0x46, 0x77, 0x2d | |
1012 | }; | |
1013 | static const UChar unicode[] = { | |
1014 | /* Hi Mom -<WHITE SMILING FACE>-! | |
1015 | A<NOT IDENTICAL TO><ALPHA>. | |
1016 | & | |
1017 | [Japanese word "nihongo"] | |
1018 | \ | |
1019 | ~peter | |
1020 | ||
1021 | /<65e5, 672c, 8a9e> | |
1022 | /<53f0, 5317> | |
1023 | */ | |
1024 | 0x48, 0x69, 0x20, 0x4d, 0x6f, 0x6d, 0x20, 0x2d, 0x263a, 0x2d, 0x21, | |
1025 | 0x41, 0x2262, 0x0391, 0x2e, | |
1026 | 0x26, | |
1027 | 0x65e5, 0x672c, 0x8a9e, | |
1028 | 0x5c, | |
1029 | 0x7e, 0x70, 0x65, 0x74, 0x65, 0x72, | |
1030 | 0x2f, 0x6d, 0x61, 0x69, 0x6c, | |
1031 | 0x2f, 0x65e5, 0x672c, 0x8a9e, | |
1032 | 0x2f, 0x53f0, 0x5317 | |
1033 | }; | |
1034 | static const int32_t toUnicodeOffsets[] = { | |
1035 | 0, 1, 2, 3, 4, 5, 6, 7, 9, 13, 14, | |
1036 | 15, 17, 19, 24, | |
1037 | 25, | |
1038 | 28, 30, 33, | |
1039 | 37, | |
1040 | 38, 39, 40, 41, 42, 43, | |
1041 | 44, 45, 46, 47, 48, | |
1042 | 49, 51, 53, 56, | |
1043 | 60, 62, 64 | |
1044 | }; | |
1045 | static const int32_t fromUnicodeOffsets[] = { | |
1046 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 9, 10, | |
1047 | 11, 12, 12, 12, 13, 13, 13, 13, 13, 14, | |
1048 | 15, 15, | |
1049 | 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, | |
1050 | 19, | |
1051 | 20, 21, 22, 23, 24, 25, | |
1052 | 26, 27, 28, 29, 30, | |
1053 | 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 34, | |
1054 | 35, 36, 36, 36, 37, 37, 37, 37, 37 | |
1055 | }; | |
1056 | ||
1057 | testConvertFromU(unicode, sizeof(unicode)/U_SIZEOF_UCHAR, imap, sizeof(imap), "IMAP-mailbox-name", fromUnicodeOffsets,FALSE); | |
1058 | ||
1059 | testConvertToU(imap, sizeof(imap), unicode, sizeof(unicode)/U_SIZEOF_UCHAR, "IMAP-mailbox-name", toUnicodeOffsets,FALSE); | |
1060 | } | |
1061 | ||
1062 | /* Test UTF-8 bad data handling*/ | |
1063 | { | |
1064 | static const uint8_t utf8[]={ | |
1065 | 0x61, | |
1066 | 0xf7, 0xbf, 0xbf, 0xbf, /* > 10FFFF */ | |
1067 | 0x00, | |
1068 | 0x62, | |
1069 | 0xfb, 0xbf, 0xbf, 0xbf, 0xbf, /* > 10FFFF */ | |
1070 | 0xfb, 0xbf, 0xbf, 0xbf, 0xbf, /* > 10FFFF */ | |
1071 | 0xf4, 0x8f, 0xbf, 0xbf, /* 10FFFF */ | |
1072 | 0xdf, 0xbf, /* 7ff */ | |
1073 | 0xbf, /* truncated tail */ | |
1074 | 0xf4, 0x90, 0x80, 0x80, /* 11FFFF */ | |
1075 | 0x02 | |
1076 | }; | |
1077 | ||
1078 | static const uint16_t utf8Expected[]={ | |
1079 | 0x0061, | |
1080 | 0xfffd, | |
1081 | 0x0000, | |
1082 | 0x0062, | |
1083 | 0xfffd, | |
1084 | 0xfffd, | |
1085 | 0xdbff, 0xdfff, | |
1086 | 0x07ff, | |
1087 | 0xfffd, | |
1088 | 0xfffd, | |
1089 | 0x0002 | |
1090 | }; | |
1091 | ||
1092 | static const int32_t utf8Offsets[]={ | |
1093 | 0, 1, 5, 6, 7, 12, 17, 17, 21, 23, 24, 28 | |
1094 | }; | |
1095 | testConvertToU(utf8, sizeof(utf8), | |
1096 | utf8Expected, sizeof(utf8Expected)/sizeof(utf8Expected[0]), "utf-8", utf8Offsets ,FALSE); | |
1097 | ||
1098 | } | |
1099 | ||
1100 | /* Test UTF-32BE bad data handling*/ | |
1101 | { | |
1102 | static const uint8_t utf32[]={ | |
1103 | 0x00, 0x00, 0x00, 0x61, | |
1104 | 0x00, 0x11, 0x00, 0x00, /* 0x110000 out of range */ | |
1105 | 0x00, 0x10, 0xff, 0xff, /* 0x10FFFF in range */ | |
1106 | 0x00, 0x00, 0x00, 0x62, | |
1107 | 0xff, 0xff, 0xff, 0xff, /* 0xffffffff out of range */ | |
1108 | 0x7f, 0xff, 0xff, 0xff, /* 0x7fffffff out of range */ | |
1109 | 0x00, 0x00, 0x01, 0x62, | |
1110 | 0x00, 0x00, 0x02, 0x62 | |
1111 | }; | |
b75a7d8f A |
1112 | static const uint16_t utf32Expected[]={ |
1113 | 0x0061, | |
1114 | 0xfffd, /* 0x110000 out of range */ | |
1115 | 0xDBFF, /* 0x10FFFF in range */ | |
1116 | 0xDFFF, | |
1117 | 0x0062, | |
1118 | 0xfffd, /* 0xffffffff out of range */ | |
1119 | 0xfffd, /* 0x7fffffff out of range */ | |
1120 | 0x0162, | |
1121 | 0x0262 | |
1122 | }; | |
b75a7d8f A |
1123 | static const int32_t utf32Offsets[]={ |
1124 | 0, 4, 8, 8, 12, 16, 20, 24, 28 | |
1125 | }; | |
73c04bcf A |
1126 | static const uint8_t utf32ExpectedBack[]={ |
1127 | 0x00, 0x00, 0x00, 0x61, | |
1128 | 0x00, 0x00, 0xff, 0xfd, /* 0x110000 out of range */ | |
1129 | 0x00, 0x10, 0xff, 0xff, /* 0x10FFFF in range */ | |
1130 | 0x00, 0x00, 0x00, 0x62, | |
1131 | 0x00, 0x00, 0xff, 0xfd, /* 0xffffffff out of range */ | |
1132 | 0x00, 0x00, 0xff, 0xfd, /* 0x7fffffff out of range */ | |
1133 | 0x00, 0x00, 0x01, 0x62, | |
1134 | 0x00, 0x00, 0x02, 0x62 | |
1135 | }; | |
1136 | static const int32_t utf32OffsetsBack[]={ | |
1137 | 0,0,0,0, | |
1138 | 1,1,1,1, | |
1139 | 2,2,2,2, | |
1140 | 4,4,4,4, | |
1141 | 5,5,5,5, | |
1142 | 6,6,6,6, | |
1143 | 7,7,7,7, | |
1144 | 8,8,8,8 | |
1145 | }; | |
1146 | ||
b75a7d8f A |
1147 | testConvertToU(utf32, sizeof(utf32), |
1148 | utf32Expected, sizeof(utf32Expected)/sizeof(utf32Expected[0]), "utf-32be", utf32Offsets ,FALSE); | |
73c04bcf A |
1149 | testConvertFromU(utf32Expected, sizeof(utf32Expected)/sizeof(utf32Expected[0]), |
1150 | utf32ExpectedBack, sizeof(utf32ExpectedBack), "utf-32be", utf32OffsetsBack, FALSE); | |
b75a7d8f A |
1151 | } |
1152 | ||
1153 | /* Test UTF-32LE bad data handling*/ | |
1154 | { | |
1155 | static const uint8_t utf32[]={ | |
1156 | 0x61, 0x00, 0x00, 0x00, | |
1157 | 0x00, 0x00, 0x11, 0x00, /* 0x110000 out of range */ | |
1158 | 0xff, 0xff, 0x10, 0x00, /* 0x10FFFF in range */ | |
1159 | 0x62, 0x00, 0x00, 0x00, | |
1160 | 0xff, 0xff, 0xff, 0xff, /* 0xffffffff out of range */ | |
1161 | 0xff, 0xff, 0xff, 0x7f, /* 0x7fffffff out of range */ | |
1162 | 0x62, 0x01, 0x00, 0x00, | |
1163 | 0x62, 0x02, 0x00, 0x00, | |
1164 | }; | |
1165 | ||
1166 | static const uint16_t utf32Expected[]={ | |
1167 | 0x0061, | |
1168 | 0xfffd, /* 0x110000 out of range */ | |
1169 | 0xDBFF, /* 0x10FFFF in range */ | |
1170 | 0xDFFF, | |
1171 | 0x0062, | |
1172 | 0xfffd, /* 0xffffffff out of range */ | |
1173 | 0xfffd, /* 0x7fffffff out of range */ | |
1174 | 0x0162, | |
1175 | 0x0262 | |
1176 | }; | |
b75a7d8f A |
1177 | static const int32_t utf32Offsets[]={ |
1178 | 0, 4, 8, 8, 12, 16, 20, 24, 28 | |
1179 | }; | |
73c04bcf A |
1180 | static const uint8_t utf32ExpectedBack[]={ |
1181 | 0x61, 0x00, 0x00, 0x00, | |
1182 | 0xfd, 0xff, 0x00, 0x00, /* 0x110000 out of range */ | |
1183 | 0xff, 0xff, 0x10, 0x00, /* 0x10FFFF in range */ | |
1184 | 0x62, 0x00, 0x00, 0x00, | |
1185 | 0xfd, 0xff, 0x00, 0x00, /* 0xffffffff out of range */ | |
1186 | 0xfd, 0xff, 0x00, 0x00, /* 0x7fffffff out of range */ | |
1187 | 0x62, 0x01, 0x00, 0x00, | |
1188 | 0x62, 0x02, 0x00, 0x00 | |
1189 | }; | |
1190 | static const int32_t utf32OffsetsBack[]={ | |
1191 | 0,0,0,0, | |
1192 | 1,1,1,1, | |
1193 | 2,2,2,2, | |
1194 | 4,4,4,4, | |
1195 | 5,5,5,5, | |
1196 | 6,6,6,6, | |
1197 | 7,7,7,7, | |
1198 | 8,8,8,8 | |
1199 | }; | |
b75a7d8f A |
1200 | testConvertToU(utf32, sizeof(utf32), |
1201 | utf32Expected, sizeof(utf32Expected)/sizeof(utf32Expected[0]), "utf-32le", utf32Offsets,FALSE ); | |
73c04bcf A |
1202 | testConvertFromU(utf32Expected, sizeof(utf32Expected)/sizeof(utf32Expected[0]), |
1203 | utf32ExpectedBack, sizeof(utf32ExpectedBack), "utf-32le", utf32OffsetsBack, FALSE); | |
b75a7d8f A |
1204 | } |
1205 | } | |
1206 | ||
1207 | static void TestCoverageMBCS(){ | |
1208 | #if 0 | |
1209 | UErrorCode status = U_ZERO_ERROR; | |
1210 | const char *directory = loadTestData(&status); | |
1211 | char* tdpath = NULL; | |
1212 | char* saveDirectory = (char*)malloc(sizeof(char) *(strlen(u_getDataDirectory())+1)); | |
1213 | int len = strlen(directory); | |
1214 | char* index=NULL; | |
1215 | ||
1216 | tdpath = (char*) malloc(sizeof(char) * (len * 2)); | |
1217 | uprv_strcpy(saveDirectory,u_getDataDirectory()); | |
1218 | log_verbose("Retrieved data directory %s \n",saveDirectory); | |
1219 | uprv_strcpy(tdpath,directory); | |
1220 | index=strrchr(tdpath,(char)U_FILE_SEP_CHAR); | |
1221 | ||
1222 | if((unsigned int)(index-tdpath) != (strlen(tdpath)-1)){ | |
1223 | *(index+1)=0; | |
1224 | } | |
1225 | u_setDataDirectory(tdpath); | |
1226 | log_verbose("ICU data directory is set to: %s \n" ,tdpath); | |
1227 | #endif | |
1228 | ||
1229 | /*some more test to increase the code coverage in MBCS. Create an test converter from test1.ucm | |
1230 | which is test file for MBCS conversion with single-byte codepage data.*/ | |
1231 | { | |
1232 | ||
1233 | /* MBCS with single byte codepage data test1.ucm*/ | |
1234 | const UChar unicodeInput[] = { 0x20ac, 0x0005, 0x0006, 0xdbc4, 0xde34, 0x0003}; | |
1235 | const uint8_t expectedtest1[] = { 0x00, 0x05, 0xff, 0x07, 0xff,}; | |
1236 | int32_t totest1Offs[] = { 0, 1, 2, 3, 5, }; | |
1237 | ||
b75a7d8f A |
1238 | /*from Unicode*/ |
1239 | testConvertFromU(unicodeInput, sizeof(unicodeInput)/sizeof(unicodeInput[0]), | |
1240 | expectedtest1, sizeof(expectedtest1), "@test1", totest1Offs,FALSE ); | |
b75a7d8f A |
1241 | } |
1242 | ||
1243 | /*some more test to increase the code coverage in MBCS. Create an test converter from test3.ucm | |
1244 | which is test file for MBCS conversion with three-byte codepage data.*/ | |
1245 | { | |
1246 | ||
1247 | /* MBCS with three byte codepage data test3.ucm*/ | |
1248 | const UChar unicodeInput[] = { 0x20ac, 0x0005, 0x0006, 0x000b, 0xdbc4, 0xde34, 0xd84d, 0xdc56, 0x000e}; | |
1249 | const uint8_t expectedtest3[] = { 0x00, 0x05, 0xff, 0x01, 0x02, 0x0b, 0x07, 0x01, 0x02, 0x0a, 0xff,}; | |
1250 | int32_t totest3Offs[] = { 0, 1, 2, 3, 3, 3, 4, 6, 6, 6, 8}; | |
1251 | ||
1252 | const uint8_t test3input[] = { 0x00, 0x05, 0x06, 0x01, 0x02, 0x0b, 0x07, 0x01, 0x02, 0x0a, 0x01, 0x02, 0x0c,}; | |
1253 | const UChar expectedUnicode[] = { 0x20ac, 0x0005, 0x0006, 0x000b, 0xdbc4, 0xde34, 0xd84d, 0xdc56, 0xfffd}; | |
1254 | int32_t fromtest3Offs[] = { 0, 1, 2, 3, 6, 6, 7, 7, 10 }; | |
1255 | ||
1256 | /*from Unicode*/ | |
1257 | testConvertFromU(unicodeInput, sizeof(unicodeInput)/sizeof(unicodeInput[0]), | |
1258 | expectedtest3, sizeof(expectedtest3), "@test3", totest3Offs,FALSE ); | |
1259 | ||
1260 | /*to Unicode*/ | |
1261 | testConvertToU(test3input, sizeof(test3input), | |
1262 | expectedUnicode, sizeof(expectedUnicode)/sizeof(expectedUnicode[0]), "@test3", fromtest3Offs ,FALSE); | |
1263 | ||
1264 | } | |
1265 | ||
1266 | /*some more test to increase the code coverage in MBCS. Create an test converter from test4.ucm | |
1267 | which is test file for MBCS conversion with four-byte codepage data.*/ | |
1268 | { | |
1269 | ||
1270 | /* MBCS with three byte codepage data test4.ucm*/ | |
1271 | static const UChar unicodeInput[] = { 0x20ac, 0x0005, 0x0006, 0x000b, 0xdbc4, 0xde34, 0xd84d, 0xdc56, 0x000e}; | |
1272 | static const uint8_t expectedtest4[] = { 0x00, 0x05, 0xff, 0x01, 0x02, 0x03, 0x0b, 0x07, 0x01, 0x02, 0x03, 0x0a, 0xff,}; | |
1273 | static const int32_t totest4Offs[] = { 0, 1, 2, 3, 3, 3, 3, 4, 6, 6, 6, 6, 8,}; | |
1274 | ||
1275 | static const uint8_t test4input[] = { 0x00, 0x05, 0x06, 0x01, 0x02, 0x03, 0x0b, 0x07, 0x01, 0x02, 0x03, 0x0a, 0x01, 0x02, 0x03, 0x0c,}; | |
1276 | static const UChar expectedUnicode[] = { 0x20ac, 0x0005, 0x0006, 0x000b, 0xdbc4, 0xde34, 0xd84d, 0xdc56, 0xfffd}; | |
1277 | static const int32_t fromtest4Offs[] = { 0, 1, 2, 3, 7, 7, 8, 8, 12,}; | |
1278 | ||
1279 | /*from Unicode*/ | |
1280 | testConvertFromU(unicodeInput, sizeof(unicodeInput)/sizeof(unicodeInput[0]), | |
1281 | expectedtest4, sizeof(expectedtest4), "@test4", totest4Offs,FALSE ); | |
1282 | ||
1283 | /*to Unicode*/ | |
1284 | testConvertToU(test4input, sizeof(test4input), | |
1285 | expectedUnicode, sizeof(expectedUnicode)/sizeof(expectedUnicode[0]), "@test4", fromtest4Offs,FALSE ); | |
1286 | ||
1287 | } | |
1288 | #if 0 | |
1289 | free(tdpath); | |
1290 | /* restore the original data directory */ | |
1291 | log_verbose("Setting the data directory to %s \n", saveDirectory); | |
1292 | u_setDataDirectory(saveDirectory); | |
1293 | free(saveDirectory); | |
1294 | #endif | |
1295 | ||
1296 | } | |
1297 | ||
1298 | static void TestConverterType(const char *convName, UConverterType convType) { | |
1299 | UConverter* myConverter; | |
1300 | UErrorCode err = U_ZERO_ERROR; | |
1301 | ||
1302 | myConverter = my_ucnv_open(convName, &err); | |
1303 | ||
1304 | if (U_FAILURE(err)) { | |
1305 | log_data_err("Failed to create an %s converter\n", convName); | |
1306 | return; | |
1307 | } | |
1308 | else | |
1309 | { | |
1310 | if (ucnv_getType(myConverter)!=convType) { | |
1311 | log_err("ucnv_getType Failed for %s. Got enum value 0x%X\n", | |
1312 | convName, convType); | |
1313 | } | |
1314 | else { | |
1315 | log_verbose("ucnv_getType %s ok\n", convName); | |
1316 | } | |
1317 | } | |
1318 | ucnv_close(myConverter); | |
1319 | } | |
1320 | ||
1321 | static void TestConverterTypesAndStarters() | |
1322 | { | |
73c04bcf | 1323 | #if !UCONFIG_NO_LEGACY_CONVERSION |
b75a7d8f A |
1324 | UConverter* myConverter; |
1325 | UErrorCode err = U_ZERO_ERROR; | |
1326 | UBool mystarters[256]; | |
1327 | ||
1328 | /* const UBool expectedKSCstarters[256] = { | |
1329 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1330 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1331 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1332 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1333 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1334 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1335 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1336 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1337 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1338 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1339 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1340 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1341 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1342 | FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, | |
1343 | FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, | |
1344 | TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, | |
1345 | TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, | |
1346 | TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, | |
1347 | TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, | |
1348 | TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, | |
1349 | TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, | |
1350 | TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, | |
1351 | TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, | |
1352 | TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, | |
1353 | TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, | |
1354 | TRUE, TRUE, TRUE, TRUE, TRUE, TRUE};*/ | |
1355 | ||
1356 | ||
1357 | log_verbose("Testing KSC, ibm-930, ibm-878 for starters and their conversion types."); | |
1358 | ||
1359 | myConverter = ucnv_open("ksc", &err); | |
1360 | if (U_FAILURE(err)) { | |
1361 | log_data_err("Failed to create an ibm-ksc converter\n"); | |
1362 | return; | |
1363 | } | |
1364 | else | |
1365 | { | |
1366 | if (ucnv_getType(myConverter)!=UCNV_MBCS) | |
1367 | log_err("ucnv_getType Failed for ibm-949\n"); | |
1368 | else | |
1369 | log_verbose("ucnv_getType ibm-949 ok\n"); | |
1370 | ||
1371 | if(myConverter!=NULL) | |
1372 | ucnv_getStarters(myConverter, mystarters, &err); | |
1373 | ||
1374 | /*if (memcmp(expectedKSCstarters, mystarters, sizeof(expectedKSCstarters))) | |
1375 | log_err("Failed ucnv_getStarters for ksc\n"); | |
1376 | else | |
1377 | log_verbose("ucnv_getStarters ok\n");*/ | |
1378 | ||
1379 | } | |
1380 | ucnv_close(myConverter); | |
1381 | ||
1382 | TestConverterType("ibm-930", UCNV_EBCDIC_STATEFUL); | |
1383 | TestConverterType("ibm-878", UCNV_SBCS); | |
73c04bcf A |
1384 | #endif |
1385 | ||
b75a7d8f | 1386 | TestConverterType("iso-8859-1", UCNV_LATIN_1); |
73c04bcf | 1387 | |
b75a7d8f | 1388 | TestConverterType("ibm-1208", UCNV_UTF8); |
73c04bcf | 1389 | |
b75a7d8f A |
1390 | TestConverterType("utf-8", UCNV_UTF8); |
1391 | TestConverterType("UTF-16BE", UCNV_UTF16_BigEndian); | |
1392 | TestConverterType("UTF-16LE", UCNV_UTF16_LittleEndian); | |
1393 | TestConverterType("UTF-32BE", UCNV_UTF32_BigEndian); | |
1394 | TestConverterType("UTF-32LE", UCNV_UTF32_LittleEndian); | |
73c04bcf A |
1395 | |
1396 | #if !UCONFIG_NO_LEGACY_CONVERSION | |
1397 | ||
1398 | #if defined(U_ENABLE_GENERIC_ISO_2022) | |
b75a7d8f | 1399 | TestConverterType("iso-2022", UCNV_ISO_2022); |
374ca955 | 1400 | #endif |
73c04bcf | 1401 | |
b75a7d8f | 1402 | TestConverterType("hz", UCNV_HZ); |
73c04bcf A |
1403 | #endif |
1404 | ||
b75a7d8f | 1405 | TestConverterType("scsu", UCNV_SCSU); |
73c04bcf A |
1406 | |
1407 | #if !UCONFIG_NO_LEGACY_CONVERSION | |
b75a7d8f | 1408 | TestConverterType("x-iscii-de", UCNV_ISCII); |
73c04bcf A |
1409 | #endif |
1410 | ||
b75a7d8f A |
1411 | TestConverterType("ascii", UCNV_US_ASCII); |
1412 | TestConverterType("utf-7", UCNV_UTF7); | |
1413 | TestConverterType("IMAP-mailbox-name", UCNV_IMAP_MAILBOX); | |
1414 | TestConverterType("bocu-1", UCNV_BOCU1); | |
1415 | } | |
1416 | ||
1417 | static void | |
1418 | TestAmbiguousConverter(UConverter *cnv) { | |
1419 | static const char inBytes[2]={ 0x61, 0x5c }; | |
1420 | UChar outUnicode[20]={ 0, 0, 0, 0 }; | |
1421 | ||
1422 | const char *s; | |
1423 | UChar *u; | |
1424 | UErrorCode errorCode; | |
1425 | UBool isAmbiguous; | |
1426 | ||
1427 | /* try to convert an 'a' and a US-ASCII backslash */ | |
1428 | errorCode=U_ZERO_ERROR; | |
1429 | s=inBytes; | |
1430 | u=outUnicode; | |
1431 | ucnv_toUnicode(cnv, &u, u+20, &s, s+2, NULL, TRUE, &errorCode); | |
1432 | if(U_FAILURE(errorCode)) { | |
1433 | /* we do not care about general failures in this test; the input may just not be mappable */ | |
1434 | return; | |
1435 | } | |
1436 | ||
1437 | if(outUnicode[0]!=0x61 || outUnicode[1]==0xfffd) { | |
1438 | /* not an ASCII-family encoding, or 0x5c is unassigned/illegal: this test is not applicable */ | |
1439 | return; | |
1440 | } | |
1441 | ||
1442 | isAmbiguous=ucnv_isAmbiguous(cnv); | |
1443 | ||
1444 | /* check that outUnicode[1]!=0x5c is exactly the same as ucnv_isAmbiguous() */ | |
1445 | if((outUnicode[1]!=0x5c)!=isAmbiguous) { | |
1446 | log_err("error: converter \"%s\" needs a backslash fix: %d but ucnv_isAmbiguous()==%d\n", | |
1447 | ucnv_getName(cnv, &errorCode), outUnicode[1]!=0x5c, isAmbiguous); | |
1448 | return; | |
1449 | } | |
1450 | ||
1451 | if(outUnicode[1]!=0x5c) { | |
1452 | /* needs fixup, fix it */ | |
1453 | ucnv_fixFileSeparator(cnv, outUnicode, (int32_t)(u-outUnicode)); | |
1454 | if(outUnicode[1]!=0x5c) { | |
1455 | /* the fix failed */ | |
1456 | log_err("error: ucnv_fixFileSeparator(%s) failed\n", ucnv_getName(cnv, &errorCode)); | |
1457 | return; | |
1458 | } | |
1459 | } | |
1460 | } | |
1461 | ||
1462 | static void TestAmbiguous() | |
1463 | { | |
1464 | UErrorCode status = U_ZERO_ERROR; | |
1465 | UConverter *ascii_cnv = 0, *sjis_cnv = 0, *cnv; | |
73c04bcf | 1466 | static const char target[] = { |
b75a7d8f A |
1467 | /* "\\usr\\local\\share\\data\\icutest.txt" */ |
1468 | 0x5c, 0x75, 0x73, 0x72, | |
1469 | 0x5c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, | |
1470 | 0x5c, 0x73, 0x68, 0x61, 0x72, 0x65, | |
1471 | 0x5c, 0x64, 0x61, 0x74, 0x61, | |
1472 | 0x5c, 0x69, 0x63, 0x75, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74, 0x78, 0x74, | |
1473 | 0 | |
1474 | }; | |
1475 | UChar asciiResult[200], sjisResult[200]; | |
1476 | int32_t asciiLength = 0, sjisLength = 0, i; | |
1477 | const char *name; | |
1478 | ||
1479 | /* enumerate all converters */ | |
1480 | status=U_ZERO_ERROR; | |
1481 | for(i=0; (name=ucnv_getAvailableName(i))!=NULL; ++i) { | |
1482 | cnv=ucnv_open(name, &status); | |
1483 | if(U_SUCCESS(status)) { | |
1484 | TestAmbiguousConverter(cnv); | |
1485 | ucnv_close(cnv); | |
1486 | } else { | |
1487 | log_err("error: unable to open available converter \"%s\"\n", name); | |
1488 | status=U_ZERO_ERROR; | |
1489 | } | |
1490 | } | |
1491 | ||
73c04bcf | 1492 | #if !UCONFIG_NO_LEGACY_CONVERSION |
b75a7d8f A |
1493 | sjis_cnv = ucnv_open("ibm-943", &status); |
1494 | if (U_FAILURE(status)) | |
1495 | { | |
1496 | log_data_err("Failed to create a SJIS converter\n"); | |
1497 | return; | |
1498 | } | |
1499 | ascii_cnv = ucnv_open("LATIN-1", &status); | |
1500 | if (U_FAILURE(status)) | |
1501 | { | |
1502 | log_data_err("Failed to create a LATIN-1 converter\n"); | |
1503 | ucnv_close(sjis_cnv); | |
1504 | return; | |
1505 | } | |
1506 | /* convert target from SJIS to Unicode */ | |
73c04bcf | 1507 | sjisLength = ucnv_toUChars(sjis_cnv, sjisResult, sizeof(sjisResult)/U_SIZEOF_UCHAR, target, (int32_t)strlen(target), &status); |
b75a7d8f A |
1508 | if (U_FAILURE(status)) |
1509 | { | |
1510 | log_err("Failed to convert the SJIS string.\n"); | |
1511 | ucnv_close(sjis_cnv); | |
1512 | ucnv_close(ascii_cnv); | |
1513 | return; | |
1514 | } | |
1515 | /* convert target from Latin-1 to Unicode */ | |
73c04bcf | 1516 | asciiLength = ucnv_toUChars(ascii_cnv, asciiResult, sizeof(asciiResult)/U_SIZEOF_UCHAR, target, (int32_t)strlen(target), &status); |
b75a7d8f A |
1517 | if (U_FAILURE(status)) |
1518 | { | |
1519 | log_err("Failed to convert the Latin-1 string.\n"); | |
1520 | free(sjisResult); | |
1521 | ucnv_close(sjis_cnv); | |
1522 | ucnv_close(ascii_cnv); | |
1523 | return; | |
1524 | } | |
1525 | if (!ucnv_isAmbiguous(sjis_cnv)) | |
1526 | { | |
1527 | log_err("SJIS converter should contain ambiguous character mappings.\n"); | |
1528 | free(sjisResult); | |
1529 | free(asciiResult); | |
1530 | ucnv_close(sjis_cnv); | |
1531 | ucnv_close(ascii_cnv); | |
1532 | return; | |
1533 | } | |
1534 | if (u_strcmp(sjisResult, asciiResult) == 0) | |
1535 | { | |
1536 | log_err("File separators for SJIS don't need to be fixed.\n"); | |
1537 | } | |
1538 | ucnv_fixFileSeparator(sjis_cnv, sjisResult, sjisLength); | |
1539 | if (u_strcmp(sjisResult, asciiResult) != 0) | |
1540 | { | |
1541 | log_err("Fixing file separator for SJIS failed.\n"); | |
1542 | } | |
1543 | ucnv_close(sjis_cnv); | |
1544 | ucnv_close(ascii_cnv); | |
73c04bcf | 1545 | #endif |
b75a7d8f A |
1546 | } |
1547 | ||
1548 | static void | |
1549 | TestSignatureDetection(){ | |
1550 | /* with null terminated strings */ | |
1551 | { | |
1552 | static const char* data[] = { | |
1553 | "\xFE\xFF\x00\x00", /* UTF-16BE */ | |
1554 | "\xFF\xFE\x00\x00", /* UTF-16LE */ | |
1555 | "\xEF\xBB\xBF\x00", /* UTF-8 */ | |
1556 | "\x0E\xFE\xFF\x00", /* SCSU */ | |
1557 | ||
1558 | "\xFE\xFF", /* UTF-16BE */ | |
1559 | "\xFF\xFE", /* UTF-16LE */ | |
1560 | "\xEF\xBB\xBF", /* UTF-8 */ | |
1561 | "\x0E\xFE\xFF", /* SCSU */ | |
1562 | ||
1563 | "\xFE\xFF\x41\x42", /* UTF-16BE */ | |
1564 | "\xFF\xFE\x41\x41", /* UTF-16LE */ | |
1565 | "\xEF\xBB\xBF\x41", /* UTF-8 */ | |
1566 | "\x0E\xFE\xFF\x41", /* SCSU */ | |
1567 | ||
1568 | "\x2B\x2F\x76\x38\x2D", /* UTF-7 */ | |
1569 | "\x2B\x2F\x76\x38\x41", /* UTF-7 */ | |
1570 | "\x2B\x2F\x76\x39\x41", /* UTF-7 */ | |
1571 | "\x2B\x2F\x76\x2B\x41", /* UTF-7 */ | |
374ca955 A |
1572 | "\x2B\x2F\x76\x2F\x41", /* UTF-7 */ |
1573 | ||
1574 | "\xDD\x73\x66\x73" /* UTF-EBCDIC */ | |
b75a7d8f A |
1575 | }; |
1576 | static const char* expected[] = { | |
1577 | "UTF-16BE", | |
1578 | "UTF-16LE", | |
1579 | "UTF-8", | |
1580 | "SCSU", | |
1581 | ||
1582 | "UTF-16BE", | |
1583 | "UTF-16LE", | |
1584 | "UTF-8", | |
1585 | "SCSU", | |
1586 | ||
1587 | "UTF-16BE", | |
1588 | "UTF-16LE", | |
1589 | "UTF-8", | |
1590 | "SCSU", | |
1591 | ||
1592 | "UTF-7", | |
1593 | "UTF-7", | |
1594 | "UTF-7", | |
1595 | "UTF-7", | |
374ca955 A |
1596 | "UTF-7", |
1597 | "UTF-EBCDIC" | |
b75a7d8f A |
1598 | }; |
1599 | static const int32_t expectedLength[] ={ | |
1600 | 2, | |
1601 | 2, | |
1602 | 3, | |
1603 | 3, | |
1604 | ||
1605 | 2, | |
1606 | 2, | |
1607 | 3, | |
1608 | 3, | |
1609 | ||
1610 | 2, | |
1611 | 2, | |
1612 | 3, | |
1613 | 3, | |
1614 | ||
1615 | 5, | |
1616 | 4, | |
1617 | 4, | |
1618 | 4, | |
374ca955 | 1619 | 4, |
b75a7d8f A |
1620 | 4 |
1621 | }; | |
1622 | int i=0; | |
1623 | UErrorCode err; | |
1624 | int32_t signatureLength = -1; | |
1625 | const char* source = NULL; | |
1626 | const char* enc = NULL; | |
1627 | for( ; i<sizeof(data)/sizeof(char*); i++){ | |
1628 | err = U_ZERO_ERROR; | |
1629 | source = data[i]; | |
1630 | enc = ucnv_detectUnicodeSignature(source, -1 , &signatureLength, &err); | |
1631 | if(U_FAILURE(err)){ | |
1632 | log_err("ucnv_detectUnicodeSignature failed for source : %s at index :%i. Error: %s\n", source,i,u_errorName(err)); | |
1633 | continue; | |
1634 | } | |
1635 | if(enc == NULL || strcmp(enc,expected[i]) !=0){ | |
1636 | log_err("ucnv_detectUnicodeSignature failed for source : %s at index :%i. Expected: %s. Got: %s\n",source,i,expected[i],enc); | |
1637 | continue; | |
1638 | } | |
1639 | if(signatureLength != expectedLength[i]){ | |
1640 | log_err("ucnv_detectUnicodeSignature failed for source : %s at index :%i.Expected Length: %i. Got length: %i\n",source,i,signatureLength,expectedLength[i]); | |
1641 | } | |
1642 | } | |
1643 | } | |
1644 | { | |
1645 | static const char* data[] = { | |
1646 | "\xFE\xFF\x00", /* UTF-16BE */ | |
1647 | "\xFF\xFE\x00", /* UTF-16LE */ | |
1648 | "\xEF\xBB\xBF\x00", /* UTF-8 */ | |
1649 | "\x0E\xFE\xFF\x00", /* SCSU */ | |
1650 | "\x00\x00\xFE\xFF", /* UTF-32BE */ | |
1651 | "\xFF\xFE\x00\x00", /* UTF-32LE */ | |
1652 | "\xFE\xFF", /* UTF-16BE */ | |
1653 | "\xFF\xFE", /* UTF-16LE */ | |
1654 | "\xEF\xBB\xBF", /* UTF-8 */ | |
1655 | "\x0E\xFE\xFF", /* SCSU */ | |
1656 | "\x00\x00\xFE\xFF", /* UTF-32BE */ | |
1657 | "\xFF\xFE\x00\x00", /* UTF-32LE */ | |
1658 | "\xFE\xFF\x41\x42", /* UTF-16BE */ | |
1659 | "\xFF\xFE\x41\x41", /* UTF-16LE */ | |
1660 | "\xEF\xBB\xBF\x41", /* UTF-8 */ | |
1661 | "\x0E\xFE\xFF\x41", /* SCSU */ | |
1662 | "\x00\x00\xFE\xFF\x41", /* UTF-32BE */ | |
1663 | "\xFF\xFE\x00\x00\x42", /* UTF-32LE */ | |
1664 | "\xFB\xEE\x28", /* BOCU-1 */ | |
1665 | "\xFF\x41\x42" /* NULL */ | |
1666 | }; | |
1667 | static const int len[] = { | |
1668 | 3, | |
1669 | 3, | |
1670 | 4, | |
1671 | 4, | |
1672 | 4, | |
1673 | 4, | |
1674 | 2, | |
1675 | 2, | |
1676 | 3, | |
1677 | 3, | |
1678 | 4, | |
1679 | 4, | |
1680 | 4, | |
1681 | 4, | |
1682 | 4, | |
1683 | 4, | |
1684 | 5, | |
1685 | 5, | |
1686 | 3, | |
1687 | 3 | |
1688 | }; | |
1689 | ||
1690 | static const char* expected[] = { | |
1691 | "UTF-16BE", | |
1692 | "UTF-16LE", | |
1693 | "UTF-8", | |
1694 | "SCSU", | |
1695 | "UTF-32BE", | |
1696 | "UTF-32LE", | |
1697 | "UTF-16BE", | |
1698 | "UTF-16LE", | |
1699 | "UTF-8", | |
1700 | "SCSU", | |
1701 | "UTF-32BE", | |
1702 | "UTF-32LE", | |
1703 | "UTF-16BE", | |
1704 | "UTF-16LE", | |
1705 | "UTF-8", | |
1706 | "SCSU", | |
1707 | "UTF-32BE", | |
1708 | "UTF-32LE", | |
1709 | "BOCU-1", | |
1710 | NULL | |
1711 | }; | |
1712 | static const int32_t expectedLength[] ={ | |
1713 | 2, | |
1714 | 2, | |
1715 | 3, | |
1716 | 3, | |
1717 | 4, | |
1718 | 4, | |
1719 | 2, | |
1720 | 2, | |
1721 | 3, | |
1722 | 3, | |
1723 | 4, | |
1724 | 4, | |
1725 | 2, | |
1726 | 2, | |
1727 | 3, | |
1728 | 3, | |
1729 | 4, | |
1730 | 4, | |
1731 | 3, | |
1732 | 0 | |
1733 | }; | |
1734 | int i=0; | |
1735 | UErrorCode err; | |
1736 | int32_t signatureLength = -1; | |
1737 | int32_t sourceLength=-1; | |
1738 | const char* source = NULL; | |
1739 | const char* enc = NULL; | |
1740 | for( ; i<sizeof(data)/sizeof(char*); i++){ | |
1741 | err = U_ZERO_ERROR; | |
1742 | source = data[i]; | |
1743 | sourceLength = len[i]; | |
1744 | enc = ucnv_detectUnicodeSignature(source, sourceLength , &signatureLength, &err); | |
1745 | if(U_FAILURE(err)){ | |
1746 | log_err("ucnv_detectUnicodeSignature test2 failed for source : %s at index :%i. Error: %s\n", source,i,u_errorName(err)); | |
1747 | continue; | |
1748 | } | |
1749 | if(enc == NULL || strcmp(enc,expected[i]) !=0){ | |
1750 | if(expected[i] !=NULL){ | |
1751 | log_err("ucnv_detectUnicodeSignature test2 failed for source : %s at index :%i. Expected: %s. Got: %s\n",source,i,expected[i],enc); | |
1752 | continue; | |
1753 | } | |
1754 | } | |
1755 | if(signatureLength != expectedLength[i]){ | |
1756 | log_err("ucnv_detectUnicodeSignature test2 failed for source : %s at index :%i.Expected Length: %i. Got length: %i\n",source,i,signatureLength,expectedLength[i]); | |
1757 | } | |
1758 | } | |
1759 | } | |
1760 | } | |
1761 | ||
1762 | void | |
1763 | static TestUTF7() { | |
1764 | /* test input */ | |
1765 | static const uint8_t in[]={ | |
1766 | /* H - +Jjo- - ! +- +2AHcAQ */ | |
1767 | 0x48, | |
1768 | 0x2d, | |
1769 | 0x2b, 0x4a, 0x6a, 0x6f, | |
1770 | 0x2d, 0x2d, | |
1771 | 0x21, | |
1772 | 0x2b, 0x2d, | |
1773 | 0x2b, 0x32, 0x41, 0x48, 0x63, 0x41, 0x51 | |
1774 | }; | |
1775 | ||
1776 | /* expected test results */ | |
374ca955 | 1777 | static const int32_t results[]={ |
b75a7d8f A |
1778 | /* number of bytes read, code point */ |
1779 | 1, 0x48, | |
1780 | 1, 0x2d, | |
1781 | 4, 0x263a, /* <WHITE SMILING FACE> */ | |
1782 | 2, 0x2d, | |
1783 | 1, 0x21, | |
1784 | 2, 0x2b, | |
1785 | 7, 0x10401 | |
1786 | }; | |
1787 | ||
1788 | const char *cnvName; | |
1789 | const char *source=(const char *)in, *limit=(const char *)in+sizeof(in); | |
1790 | UErrorCode errorCode=U_ZERO_ERROR; | |
1791 | UConverter *cnv=ucnv_open("UTF-7", &errorCode); | |
1792 | if(U_FAILURE(errorCode)) { | |
1793 | log_err("Unable to open a UTF-7 converter: %s\n", u_errorName(errorCode)); /* sholdn't be a data err */ | |
1794 | return; | |
1795 | } | |
1796 | TestNextUChar(cnv, source, limit, results, "UTF-7"); | |
1797 | /* Test the condition when source >= sourceLimit */ | |
1798 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
1799 | cnvName = ucnv_getName(cnv, &errorCode); | |
1800 | if (U_FAILURE(errorCode) || uprv_strcmp(cnvName, "UTF-7") != 0) { | |
1801 | log_err("UTF-7 converter is called %s: %s\n", cnvName, u_errorName(errorCode)); | |
1802 | } | |
1803 | ucnv_close(cnv); | |
1804 | } | |
1805 | ||
1806 | void | |
1807 | static TestIMAP() { | |
1808 | /* test input */ | |
1809 | static const uint8_t in[]={ | |
1810 | /* H - &Jjo- - ! &- &2AHcAQ- \ */ | |
1811 | 0x48, | |
1812 | 0x2d, | |
1813 | 0x26, 0x4a, 0x6a, 0x6f, | |
1814 | 0x2d, 0x2d, | |
1815 | 0x21, | |
1816 | 0x26, 0x2d, | |
1817 | 0x26, 0x32, 0x41, 0x48, 0x63, 0x41, 0x51, 0x2d | |
1818 | }; | |
1819 | ||
1820 | /* expected test results */ | |
374ca955 | 1821 | static const int32_t results[]={ |
b75a7d8f A |
1822 | /* number of bytes read, code point */ |
1823 | 1, 0x48, | |
1824 | 1, 0x2d, | |
1825 | 4, 0x263a, /* <WHITE SMILING FACE> */ | |
1826 | 2, 0x2d, | |
1827 | 1, 0x21, | |
1828 | 2, 0x26, | |
1829 | 7, 0x10401 | |
1830 | }; | |
1831 | ||
1832 | const char *cnvName; | |
1833 | const char *source=(const char *)in, *limit=(const char *)in+sizeof(in); | |
1834 | UErrorCode errorCode=U_ZERO_ERROR; | |
1835 | UConverter *cnv=ucnv_open("IMAP-mailbox-name", &errorCode); | |
1836 | if(U_FAILURE(errorCode)) { | |
1837 | log_err("Unable to open a IMAP-mailbox-name converter: %s\n", u_errorName(errorCode)); /* sholdn't be a data err */ | |
1838 | return; | |
1839 | } | |
1840 | TestNextUChar(cnv, source, limit, results, "IMAP-mailbox-name"); | |
1841 | /* Test the condition when source >= sourceLimit */ | |
1842 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
1843 | cnvName = ucnv_getName(cnv, &errorCode); | |
1844 | if (U_FAILURE(errorCode) || uprv_strcmp(cnvName, "IMAP-mailbox-name") != 0) { | |
1845 | log_err("IMAP-mailbox-name converter is called %s: %s\n", cnvName, u_errorName(errorCode)); | |
1846 | } | |
1847 | ucnv_close(cnv); | |
1848 | } | |
1849 | ||
1850 | void | |
1851 | static TestUTF8() { | |
1852 | /* test input */ | |
1853 | static const uint8_t in[]={ | |
1854 | 0x61, | |
1855 | 0xc2, 0x80, | |
1856 | 0xe0, 0xa0, 0x80, | |
1857 | 0xf0, 0x90, 0x80, 0x80, | |
1858 | 0xf4, 0x84, 0x8c, 0xa1, | |
1859 | 0xf0, 0x90, 0x90, 0x81 | |
1860 | }; | |
1861 | ||
1862 | /* expected test results */ | |
374ca955 | 1863 | static const int32_t results[]={ |
b75a7d8f A |
1864 | /* number of bytes read, code point */ |
1865 | 1, 0x61, | |
1866 | 2, 0x80, | |
1867 | 3, 0x800, | |
1868 | 4, 0x10000, | |
1869 | 4, 0x104321, | |
1870 | 4, 0x10401 | |
1871 | }; | |
1872 | ||
1873 | /* error test input */ | |
1874 | static const uint8_t in2[]={ | |
1875 | 0x61, | |
1876 | 0xc0, 0x80, /* illegal non-shortest form */ | |
1877 | 0xe0, 0x80, 0x80, /* illegal non-shortest form */ | |
1878 | 0xf0, 0x80, 0x80, 0x80, /* illegal non-shortest form */ | |
1879 | 0xc0, 0xc0, /* illegal trail byte */ | |
1880 | 0xf4, 0x90, 0x80, 0x80, /* 0x110000 out of range */ | |
1881 | 0xf8, 0x80, 0x80, 0x80, 0x80, /* too long */ | |
1882 | 0xfe, /* illegal byte altogether */ | |
1883 | 0x62 | |
1884 | }; | |
1885 | ||
1886 | /* expected error test results */ | |
374ca955 | 1887 | static const int32_t results2[]={ |
b75a7d8f A |
1888 | /* number of bytes read, code point */ |
1889 | 1, 0x61, | |
1890 | 22, 0x62 | |
1891 | }; | |
1892 | ||
1893 | UConverterToUCallback cb; | |
1894 | const void *p; | |
1895 | ||
1896 | const char *source=(const char *)in,*limit=(const char *)in+sizeof(in); | |
1897 | UErrorCode errorCode=U_ZERO_ERROR; | |
1898 | UConverter *cnv=ucnv_open("UTF-8", &errorCode); | |
1899 | if(U_FAILURE(errorCode)) { | |
1900 | log_err("Unable to open a UTF-8 converter: %s\n", u_errorName(errorCode)); | |
1901 | return; | |
1902 | } | |
1903 | TestNextUChar(cnv, source, limit, results, "UTF-8"); | |
1904 | /* Test the condition when source >= sourceLimit */ | |
1905 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
1906 | ||
1907 | /* test error behavior with a skip callback */ | |
1908 | ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_SKIP, NULL, &cb, &p, &errorCode); | |
1909 | source=(const char *)in2; | |
1910 | limit=(const char *)(in2+sizeof(in2)); | |
1911 | TestNextUChar(cnv, source, limit, results2, "UTF-8"); | |
1912 | ||
1913 | ucnv_close(cnv); | |
1914 | } | |
1915 | ||
1916 | void | |
1917 | static TestCESU8() { | |
1918 | /* test input */ | |
1919 | static const uint8_t in[]={ | |
1920 | 0x61, | |
1921 | 0xc2, 0x80, | |
1922 | 0xe0, 0xa0, 0x80, | |
1923 | 0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80, | |
1924 | 0xed, 0xb0, 0x81, 0xed, 0xa0, 0x82, | |
1925 | 0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf, | |
1926 | 0xef, 0xbf, 0xbc | |
1927 | }; | |
1928 | ||
1929 | /* expected test results */ | |
374ca955 | 1930 | static const int32_t results[]={ |
b75a7d8f A |
1931 | /* number of bytes read, code point */ |
1932 | 1, 0x61, | |
1933 | 2, 0x80, | |
1934 | 3, 0x800, | |
1935 | 6, 0x10000, | |
1936 | 3, 0xdc01, | |
374ca955 A |
1937 | -1,0xd802, /* may read 3 or 6 bytes */ |
1938 | -1,0x10ffff,/* may read 0 or 3 bytes */ | |
b75a7d8f A |
1939 | 3, 0xfffc |
1940 | }; | |
1941 | ||
1942 | /* error test input */ | |
1943 | static const uint8_t in2[]={ | |
1944 | 0x61, | |
1945 | 0xc0, 0x80, /* illegal non-shortest form */ | |
1946 | 0xe0, 0x80, 0x80, /* illegal non-shortest form */ | |
1947 | 0xf0, 0x80, 0x80, 0x80, /* illegal non-shortest form */ | |
1948 | 0xc0, 0xc0, /* illegal trail byte */ | |
1949 | 0xf0, 0x90, 0x80, 0x80, /* illegal 4-byte supplementary code point */ | |
1950 | 0xf4, 0x84, 0x8c, 0xa1, /* illegal 4-byte supplementary code point */ | |
1951 | 0xf0, 0x90, 0x90, 0x81, /* illegal 4-byte supplementary code point */ | |
1952 | 0xf4, 0x90, 0x80, 0x80, /* 0x110000 out of range */ | |
1953 | 0xf8, 0x80, 0x80, 0x80, 0x80, /* too long */ | |
1954 | 0xfe, /* illegal byte altogether */ | |
1955 | 0x62 | |
1956 | }; | |
1957 | ||
1958 | /* expected error test results */ | |
374ca955 | 1959 | static const int32_t results2[]={ |
b75a7d8f A |
1960 | /* number of bytes read, code point */ |
1961 | 1, 0x61, | |
1962 | 34, 0x62 | |
1963 | }; | |
1964 | ||
1965 | UConverterToUCallback cb; | |
1966 | const void *p; | |
1967 | ||
1968 | const char *source=(const char *)in,*limit=(const char *)in+sizeof(in); | |
1969 | UErrorCode errorCode=U_ZERO_ERROR; | |
1970 | UConverter *cnv=ucnv_open("CESU-8", &errorCode); | |
1971 | if(U_FAILURE(errorCode)) { | |
1972 | log_err("Unable to open a CESU-8 converter: %s\n", u_errorName(errorCode)); | |
1973 | return; | |
1974 | } | |
1975 | TestNextUChar(cnv, source, limit, results, "CESU-8"); | |
1976 | /* Test the condition when source >= sourceLimit */ | |
1977 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
1978 | ||
1979 | /* test error behavior with a skip callback */ | |
1980 | ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_SKIP, NULL, &cb, &p, &errorCode); | |
1981 | source=(const char *)in2; | |
1982 | limit=(const char *)(in2+sizeof(in2)); | |
1983 | TestNextUChar(cnv, source, limit, results2, "CESU-8"); | |
1984 | ||
1985 | ucnv_close(cnv); | |
1986 | } | |
1987 | ||
1988 | void | |
1989 | static TestUTF16() { | |
1990 | /* test input */ | |
1991 | static const uint8_t in1[]={ | |
1992 | 0xfe, 0xff, 0x4e, 0x00, 0xfe, 0xff | |
1993 | }; | |
1994 | static const uint8_t in2[]={ | |
1995 | 0xff, 0xfe, 0x4e, 0x00, 0xfe, 0xff | |
1996 | }; | |
1997 | static const uint8_t in3[]={ | |
1998 | 0xfe, 0xfe, 0x4e, 0x00, 0xfe, 0xff, 0xd8, 0x40, 0xdc, 0x01 | |
1999 | }; | |
2000 | ||
2001 | /* expected test results */ | |
374ca955 | 2002 | static const int32_t results1[]={ |
b75a7d8f A |
2003 | /* number of bytes read, code point */ |
2004 | 4, 0x4e00, | |
2005 | 2, 0xfeff | |
2006 | }; | |
374ca955 | 2007 | static const int32_t results2[]={ |
b75a7d8f A |
2008 | /* number of bytes read, code point */ |
2009 | 4, 0x004e, | |
2010 | 2, 0xfffe | |
2011 | }; | |
374ca955 | 2012 | static const int32_t results3[]={ |
b75a7d8f A |
2013 | /* number of bytes read, code point */ |
2014 | 2, 0xfefe, | |
2015 | 2, 0x4e00, | |
2016 | 2, 0xfeff, | |
2017 | 4, 0x20001 | |
2018 | }; | |
2019 | ||
2020 | const char *source, *limit; | |
2021 | ||
2022 | UErrorCode errorCode=U_ZERO_ERROR; | |
2023 | UConverter *cnv=ucnv_open("UTF-16", &errorCode); | |
2024 | if(U_FAILURE(errorCode)) { | |
2025 | log_err("Unable to open a UTF-16 converter: %s\n", u_errorName(errorCode)); | |
2026 | return; | |
2027 | } | |
2028 | ||
2029 | source=(const char *)in1, limit=(const char *)in1+sizeof(in1); | |
2030 | TestNextUChar(cnv, source, limit, results1, "UTF-16"); | |
2031 | ||
2032 | source=(const char *)in2, limit=(const char *)in2+sizeof(in2); | |
2033 | ucnv_resetToUnicode(cnv); | |
2034 | TestNextUChar(cnv, source, limit, results2, "UTF-16"); | |
2035 | ||
2036 | source=(const char *)in3, limit=(const char *)in3+sizeof(in3); | |
2037 | ucnv_resetToUnicode(cnv); | |
2038 | TestNextUChar(cnv, source, limit, results3, "UTF-16"); | |
2039 | ||
2040 | /* Test the condition when source >= sourceLimit */ | |
2041 | ucnv_resetToUnicode(cnv); | |
2042 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
2043 | ||
2044 | ucnv_close(cnv); | |
2045 | } | |
2046 | ||
2047 | void | |
2048 | static TestUTF16BE() { | |
2049 | /* test input */ | |
2050 | static const uint8_t in[]={ | |
2051 | 0x00, 0x61, | |
2052 | 0x00, 0xc0, | |
2053 | 0x00, 0x31, | |
2054 | 0x00, 0xf4, | |
2055 | 0xce, 0xfe, | |
2056 | 0xd8, 0x01, 0xdc, 0x01 | |
2057 | }; | |
2058 | ||
2059 | /* expected test results */ | |
374ca955 | 2060 | static const int32_t results[]={ |
b75a7d8f A |
2061 | /* number of bytes read, code point */ |
2062 | 2, 0x61, | |
2063 | 2, 0xc0, | |
2064 | 2, 0x31, | |
2065 | 2, 0xf4, | |
2066 | 2, 0xcefe, | |
2067 | 4, 0x10401 | |
2068 | }; | |
2069 | ||
2070 | const char *source=(const char *)in, *limit=(const char *)in+sizeof(in); | |
2071 | UErrorCode errorCode=U_ZERO_ERROR; | |
2072 | UConverter *cnv=ucnv_open("utf-16be", &errorCode); | |
2073 | if(U_FAILURE(errorCode)) { | |
2074 | log_err("Unable to open a UTF16-BE converter: %s\n", u_errorName(errorCode)); | |
2075 | return; | |
2076 | } | |
2077 | TestNextUChar(cnv, source, limit, results, "UTF-16BE"); | |
2078 | /* Test the condition when source >= sourceLimit */ | |
2079 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
2080 | /*Test for the condition where there is an invalid character*/ | |
2081 | { | |
2082 | static const uint8_t source2[]={0x61}; | |
374ca955 | 2083 | ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); |
b75a7d8f A |
2084 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_TRUNCATED_CHAR_FOUND, "an invalid character"); |
2085 | } | |
374ca955 A |
2086 | #if 0 |
2087 | /* | |
2088 | * Test disabled because currently the UTF-16BE/LE converters are supposed | |
2089 | * to not set errors for unpaired surrogates. | |
2090 | * This may change with | |
2091 | * Jitterbug 1838 - forbid converting surrogate code points in UTF-16/32 | |
2092 | */ | |
2093 | ||
b75a7d8f A |
2094 | /*Test for the condition where there is a surrogate pair*/ |
2095 | { | |
2096 | const uint8_t source2[]={0xd8, 0x01}; | |
2097 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_TRUNCATED_CHAR_FOUND, "an truncated surrogate character"); | |
2098 | } | |
374ca955 | 2099 | #endif |
b75a7d8f A |
2100 | ucnv_close(cnv); |
2101 | } | |
2102 | ||
2103 | static void | |
2104 | TestUTF16LE() { | |
2105 | /* test input */ | |
2106 | static const uint8_t in[]={ | |
2107 | 0x61, 0x00, | |
2108 | 0x31, 0x00, | |
2109 | 0x4e, 0x2e, | |
2110 | 0x4e, 0x00, | |
2111 | 0x01, 0xd8, 0x01, 0xdc | |
2112 | }; | |
2113 | ||
2114 | /* expected test results */ | |
374ca955 | 2115 | static const int32_t results[]={ |
b75a7d8f A |
2116 | /* number of bytes read, code point */ |
2117 | 2, 0x61, | |
2118 | 2, 0x31, | |
2119 | 2, 0x2e4e, | |
2120 | 2, 0x4e, | |
2121 | 4, 0x10401 | |
2122 | }; | |
2123 | ||
2124 | const char *source=(const char *)in, *limit=(const char *)in+sizeof(in); | |
2125 | UErrorCode errorCode=U_ZERO_ERROR; | |
2126 | UConverter *cnv=ucnv_open("utf-16le", &errorCode); | |
2127 | if(U_FAILURE(errorCode)) { | |
2128 | log_err("Unable to open a UTF16-LE converter: %s\n", u_errorName(errorCode)); | |
2129 | return; | |
2130 | } | |
2131 | TestNextUChar(cnv, source, limit, results, "UTF-16LE"); | |
2132 | /* Test the condition when source >= sourceLimit */ | |
2133 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
2134 | /*Test for the condition where there is an invalid character*/ | |
2135 | { | |
2136 | static const uint8_t source2[]={0x61}; | |
374ca955 | 2137 | ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); |
b75a7d8f A |
2138 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_TRUNCATED_CHAR_FOUND, "an invalid character"); |
2139 | } | |
374ca955 A |
2140 | #if 0 |
2141 | /* | |
2142 | * Test disabled because currently the UTF-16BE/LE converters are supposed | |
2143 | * to not set errors for unpaired surrogates. | |
2144 | * This may change with | |
2145 | * Jitterbug 1838 - forbid converting surrogate code points in UTF-16/32 | |
2146 | */ | |
2147 | ||
b75a7d8f A |
2148 | /*Test for the condition where there is a surrogate character*/ |
2149 | { | |
2150 | static const uint8_t source2[]={0x01, 0xd8}; | |
2151 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_TRUNCATED_CHAR_FOUND, "an truncated surrogate character"); | |
2152 | } | |
374ca955 | 2153 | #endif |
b75a7d8f A |
2154 | |
2155 | ucnv_close(cnv); | |
2156 | } | |
2157 | ||
2158 | void | |
2159 | static TestUTF32() { | |
2160 | /* test input */ | |
2161 | static const uint8_t in1[]={ | |
2162 | 0x00, 0x00, 0xfe, 0xff, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0xfe, 0xff | |
2163 | }; | |
2164 | static const uint8_t in2[]={ | |
2165 | 0xff, 0xfe, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00, 0xfe, 0xff, 0x00, 0x00 | |
2166 | }; | |
2167 | static const uint8_t in3[]={ | |
2168 | 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0xd8, 0x40, 0x00, 0x00, 0xdc, 0x01 | |
2169 | }; | |
2170 | ||
2171 | /* expected test results */ | |
374ca955 | 2172 | static const int32_t results1[]={ |
b75a7d8f A |
2173 | /* number of bytes read, code point */ |
2174 | 8, 0x100f00, | |
2175 | 4, 0xfeff | |
2176 | }; | |
374ca955 | 2177 | static const int32_t results2[]={ |
b75a7d8f A |
2178 | /* number of bytes read, code point */ |
2179 | 8, 0x0f1000, | |
2180 | 4, 0xfffe | |
2181 | }; | |
374ca955 | 2182 | static const int32_t results3[]={ |
b75a7d8f A |
2183 | /* number of bytes read, code point */ |
2184 | 4, 0xfefe, | |
2185 | 4, 0x100f00, | |
374ca955 A |
2186 | 4, 0xfffd, /* unmatched surrogate */ |
2187 | 4, 0xfffd /* unmatched surrogate */ | |
b75a7d8f A |
2188 | }; |
2189 | ||
2190 | const char *source, *limit; | |
2191 | ||
2192 | UErrorCode errorCode=U_ZERO_ERROR; | |
2193 | UConverter *cnv=ucnv_open("UTF-32", &errorCode); | |
2194 | if(U_FAILURE(errorCode)) { | |
2195 | log_err("Unable to open a UTF-32 converter: %s\n", u_errorName(errorCode)); | |
2196 | return; | |
2197 | } | |
2198 | ||
2199 | source=(const char *)in1, limit=(const char *)in1+sizeof(in1); | |
2200 | TestNextUChar(cnv, source, limit, results1, "UTF-32"); | |
2201 | ||
2202 | source=(const char *)in2, limit=(const char *)in2+sizeof(in2); | |
2203 | ucnv_resetToUnicode(cnv); | |
2204 | TestNextUChar(cnv, source, limit, results2, "UTF-32"); | |
2205 | ||
2206 | source=(const char *)in3, limit=(const char *)in3+sizeof(in3); | |
2207 | ucnv_resetToUnicode(cnv); | |
2208 | TestNextUChar(cnv, source, limit, results3, "UTF-32"); | |
2209 | ||
2210 | /* Test the condition when source >= sourceLimit */ | |
2211 | ucnv_resetToUnicode(cnv); | |
2212 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
2213 | ||
2214 | ucnv_close(cnv); | |
2215 | } | |
2216 | ||
2217 | static void | |
2218 | TestUTF32BE() { | |
2219 | /* test input */ | |
2220 | static const uint8_t in[]={ | |
2221 | 0x00, 0x00, 0x00, 0x61, | |
374ca955 | 2222 | 0x00, 0x00, 0x30, 0x61, |
b75a7d8f A |
2223 | 0x00, 0x00, 0xdc, 0x00, |
2224 | 0x00, 0x00, 0xd8, 0x00, | |
2225 | 0x00, 0x00, 0xdf, 0xff, | |
374ca955 | 2226 | 0x00, 0x00, 0xff, 0xfe, |
b75a7d8f A |
2227 | 0x00, 0x10, 0xab, 0xcd, |
2228 | 0x00, 0x10, 0xff, 0xff | |
2229 | }; | |
2230 | ||
2231 | /* expected test results */ | |
374ca955 | 2232 | static const int32_t results[]={ |
b75a7d8f A |
2233 | /* number of bytes read, code point */ |
2234 | 4, 0x61, | |
374ca955 A |
2235 | 4, 0x3061, |
2236 | 4, 0xfffd, | |
2237 | 4, 0xfffd, | |
b75a7d8f | 2238 | 4, 0xfffd, |
374ca955 | 2239 | 4, 0xfffe, |
b75a7d8f A |
2240 | 4, 0x10abcd, |
2241 | 4, 0x10ffff | |
2242 | }; | |
2243 | ||
2244 | /* error test input */ | |
2245 | static const uint8_t in2[]={ | |
2246 | 0x00, 0x00, 0x00, 0x61, | |
2247 | 0x00, 0x11, 0x00, 0x00, /* 0x110000 out of range */ | |
2248 | 0x00, 0x00, 0x00, 0x62, | |
2249 | 0xff, 0xff, 0xff, 0xff, /* 0xffffffff out of range */ | |
2250 | 0x7f, 0xff, 0xff, 0xff, /* 0x7fffffff out of range */ | |
2251 | 0x00, 0x00, 0x01, 0x62, | |
2252 | 0x00, 0x00, 0x02, 0x62 | |
2253 | }; | |
2254 | ||
2255 | /* expected error test results */ | |
374ca955 | 2256 | static const int32_t results2[]={ |
b75a7d8f A |
2257 | /* number of bytes read, code point */ |
2258 | 4, 0x61, | |
2259 | 8, 0x62, | |
2260 | 12, 0x162, | |
2261 | 4, 0x262 | |
2262 | }; | |
2263 | ||
2264 | UConverterToUCallback cb; | |
2265 | const void *p; | |
2266 | ||
2267 | const char *source=(const char *)in, *limit=(const char *)in+sizeof(in); | |
2268 | UErrorCode errorCode=U_ZERO_ERROR; | |
2269 | UConverter *cnv=ucnv_open("UTF-32BE", &errorCode); | |
2270 | if(U_FAILURE(errorCode)) { | |
2271 | log_err("Unable to open a UTF-32BE converter: %s\n", u_errorName(errorCode)); | |
2272 | return; | |
2273 | } | |
2274 | TestNextUChar(cnv, source, limit, results, "UTF-32BE"); | |
2275 | ||
2276 | /* Test the condition when source >= sourceLimit */ | |
2277 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
2278 | ||
2279 | /* test error behavior with a skip callback */ | |
2280 | ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_SKIP, NULL, &cb, &p, &errorCode); | |
2281 | source=(const char *)in2; | |
2282 | limit=(const char *)(in2+sizeof(in2)); | |
2283 | TestNextUChar(cnv, source, limit, results2, "UTF-32BE"); | |
2284 | ||
2285 | ucnv_close(cnv); | |
2286 | } | |
2287 | ||
2288 | static void | |
2289 | TestUTF32LE() { | |
2290 | /* test input */ | |
2291 | static const uint8_t in[]={ | |
2292 | 0x61, 0x00, 0x00, 0x00, | |
374ca955 | 2293 | 0x61, 0x30, 0x00, 0x00, |
b75a7d8f A |
2294 | 0x00, 0xdc, 0x00, 0x00, |
2295 | 0x00, 0xd8, 0x00, 0x00, | |
2296 | 0xff, 0xdf, 0x00, 0x00, | |
374ca955 | 2297 | 0xfe, 0xff, 0x00, 0x00, |
b75a7d8f A |
2298 | 0xcd, 0xab, 0x10, 0x00, |
2299 | 0xff, 0xff, 0x10, 0x00 | |
2300 | }; | |
2301 | ||
2302 | /* expected test results */ | |
374ca955 | 2303 | static const int32_t results[]={ |
b75a7d8f A |
2304 | /* number of bytes read, code point */ |
2305 | 4, 0x61, | |
374ca955 | 2306 | 4, 0x3061, |
b75a7d8f | 2307 | 4, 0xfffd, |
374ca955 A |
2308 | 4, 0xfffd, |
2309 | 4, 0xfffd, | |
2310 | 4, 0xfffe, | |
b75a7d8f A |
2311 | 4, 0x10abcd, |
2312 | 4, 0x10ffff | |
2313 | }; | |
2314 | ||
2315 | /* error test input */ | |
2316 | static const uint8_t in2[]={ | |
2317 | 0x61, 0x00, 0x00, 0x00, | |
2318 | 0x00, 0x00, 0x11, 0x00, /* 0x110000 out of range */ | |
2319 | 0x62, 0x00, 0x00, 0x00, | |
2320 | 0xff, 0xff, 0xff, 0xff, /* 0xffffffff out of range */ | |
2321 | 0xff, 0xff, 0xff, 0x7f, /* 0x7fffffff out of range */ | |
2322 | 0x62, 0x01, 0x00, 0x00, | |
2323 | 0x62, 0x02, 0x00, 0x00, | |
2324 | }; | |
2325 | ||
2326 | /* expected error test results */ | |
374ca955 | 2327 | static const int32_t results2[]={ |
b75a7d8f A |
2328 | /* number of bytes read, code point */ |
2329 | 4, 0x61, | |
2330 | 8, 0x62, | |
2331 | 12, 0x162, | |
2332 | 4, 0x262, | |
2333 | }; | |
2334 | ||
2335 | UConverterToUCallback cb; | |
2336 | const void *p; | |
2337 | ||
2338 | const char *source=(const char *)in, *limit=(const char *)in+sizeof(in); | |
2339 | UErrorCode errorCode=U_ZERO_ERROR; | |
2340 | UConverter *cnv=ucnv_open("UTF-32LE", &errorCode); | |
2341 | if(U_FAILURE(errorCode)) { | |
2342 | log_err("Unable to open a UTF-32LE converter: %s\n", u_errorName(errorCode)); | |
2343 | return; | |
2344 | } | |
2345 | TestNextUChar(cnv, source, limit, results, "UTF-32LE"); | |
2346 | ||
2347 | /* Test the condition when source >= sourceLimit */ | |
2348 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
2349 | ||
2350 | /* test error behavior with a skip callback */ | |
2351 | ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_SKIP, NULL, &cb, &p, &errorCode); | |
2352 | source=(const char *)in2; | |
2353 | limit=(const char *)(in2+sizeof(in2)); | |
2354 | TestNextUChar(cnv, source, limit, results2, "UTF-32LE"); | |
2355 | ||
2356 | ucnv_close(cnv); | |
2357 | } | |
2358 | ||
2359 | static void | |
2360 | TestLATIN1() { | |
2361 | /* test input */ | |
2362 | static const uint8_t in[]={ | |
2363 | 0x61, | |
2364 | 0x31, | |
2365 | 0x32, | |
2366 | 0xc0, | |
2367 | 0xf0, | |
2368 | 0xf4, | |
2369 | }; | |
2370 | ||
2371 | /* expected test results */ | |
374ca955 | 2372 | static const int32_t results[]={ |
b75a7d8f A |
2373 | /* number of bytes read, code point */ |
2374 | 1, 0x61, | |
2375 | 1, 0x31, | |
2376 | 1, 0x32, | |
2377 | 1, 0xc0, | |
2378 | 1, 0xf0, | |
2379 | 1, 0xf4, | |
2380 | }; | |
2381 | static const uint16_t in1[] = { | |
2382 | 0x08, 0x00, 0x1b, 0x4c, 0xea, 0x16, 0xca, 0xd3, 0x94, 0x0f, 0x53, 0xef, 0x61, 0x1b, 0xe5, 0x84, | |
2383 | 0xc4, 0x0f, 0x53, 0xef, 0x61, 0x1b, 0xe5, 0x84, 0xc4, 0x16, 0xca, 0xd3, 0x94, 0x08, 0x02, 0x0f, | |
2384 | 0x53, 0x4a, 0x4e, 0x16, 0x7d, 0x00, 0x30, 0x82, 0x52, 0x4d, 0x30, 0x6b, 0x6d, 0x41, 0x88, 0x4c, | |
2385 | 0xe5, 0x97, 0x9f, 0x08, 0x0c, 0x16, 0xca, 0xd3, 0x94, 0x15, 0xae, 0x0e, 0x6b, 0x4c, 0x08, 0x0d, | |
2386 | 0x8c, 0xb4, 0xa3, 0x9f, 0xca, 0x99, 0xcb, 0x8b, 0xc2, 0x97, 0xcc, 0xaa, 0x84, 0x08, 0x02, 0x0e, | |
2387 | 0x7c, 0x73, 0xe2, 0x16, 0xa3, 0xb7, 0xcb, 0x93, 0xd3, 0xb4, 0xc5, 0xdc, 0x9f, 0x0e, 0x79, 0x3e, | |
2388 | 0x06, 0xae, 0xb1, 0x9d, 0x93, 0xd3, 0x08, 0x0c, 0xbe, 0xa3, 0x8f, 0x08, 0x88, 0xbe, 0xa3, 0x8d, | |
2389 | 0xd3, 0xa8, 0xa3, 0x97, 0xc5, 0x17, 0x89, 0x08, 0x0d, 0x15, 0xd2, 0x08, 0x01, 0x93, 0xc8, 0xaa, | |
2390 | 0x8f, 0x0e, 0x61, 0x1b, 0x99, 0xcb, 0x0e, 0x4e, 0xba, 0x9f, 0xa1, 0xae, 0x93, 0xa8, 0xa0, 0x08, | |
2391 | 0x02, 0x08, 0x0c, 0xe2, 0x16, 0xa3, 0xb7, 0xcb, 0x0f, 0x4f, 0xe1, 0x80, 0x05, 0xec, 0x60, 0x8d, | |
2392 | 0xea, 0x06, 0xd3, 0xe6, 0x0f, 0x8a, 0x00, 0x30, 0x44, 0x65, 0xb9, 0xe4, 0xfe, 0xe7, 0xc2, 0x06, | |
2393 | 0xcb, 0x82 | |
2394 | }; | |
2395 | static const uint8_t out1[] = { | |
2396 | 0x08, 0x00, 0x1b, 0x4c, 0xea, 0x16, 0xca, 0xd3, 0x94, 0x0f, 0x53, 0xef, 0x61, 0x1b, 0xe5, 0x84, | |
2397 | 0xc4, 0x0f, 0x53, 0xef, 0x61, 0x1b, 0xe5, 0x84, 0xc4, 0x16, 0xca, 0xd3, 0x94, 0x08, 0x02, 0x0f, | |
2398 | 0x53, 0x4a, 0x4e, 0x16, 0x7d, 0x00, 0x30, 0x82, 0x52, 0x4d, 0x30, 0x6b, 0x6d, 0x41, 0x88, 0x4c, | |
2399 | 0xe5, 0x97, 0x9f, 0x08, 0x0c, 0x16, 0xca, 0xd3, 0x94, 0x15, 0xae, 0x0e, 0x6b, 0x4c, 0x08, 0x0d, | |
2400 | 0x8c, 0xb4, 0xa3, 0x9f, 0xca, 0x99, 0xcb, 0x8b, 0xc2, 0x97, 0xcc, 0xaa, 0x84, 0x08, 0x02, 0x0e, | |
2401 | 0x7c, 0x73, 0xe2, 0x16, 0xa3, 0xb7, 0xcb, 0x93, 0xd3, 0xb4, 0xc5, 0xdc, 0x9f, 0x0e, 0x79, 0x3e, | |
2402 | 0x06, 0xae, 0xb1, 0x9d, 0x93, 0xd3, 0x08, 0x0c, 0xbe, 0xa3, 0x8f, 0x08, 0x88, 0xbe, 0xa3, 0x8d, | |
2403 | 0xd3, 0xa8, 0xa3, 0x97, 0xc5, 0x17, 0x89, 0x08, 0x0d, 0x15, 0xd2, 0x08, 0x01, 0x93, 0xc8, 0xaa, | |
2404 | 0x8f, 0x0e, 0x61, 0x1b, 0x99, 0xcb, 0x0e, 0x4e, 0xba, 0x9f, 0xa1, 0xae, 0x93, 0xa8, 0xa0, 0x08, | |
2405 | 0x02, 0x08, 0x0c, 0xe2, 0x16, 0xa3, 0xb7, 0xcb, 0x0f, 0x4f, 0xe1, 0x80, 0x05, 0xec, 0x60, 0x8d, | |
2406 | 0xea, 0x06, 0xd3, 0xe6, 0x0f, 0x8a, 0x00, 0x30, 0x44, 0x65, 0xb9, 0xe4, 0xfe, 0xe7, 0xc2, 0x06, | |
2407 | 0xcb, 0x82 | |
2408 | }; | |
2409 | static const uint16_t in2[]={ | |
2410 | 0x1B, 0x24, 0x29, 0x47, 0x0E, 0x23, 0x21, 0x23, 0x22, 0x23, | |
2411 | 0x23, 0x23, 0x24, 0x23, 0x25, 0x23, 0x26, 0x23, 0x27, 0x23, | |
2412 | 0x28, 0x23, 0x29, 0x23, 0x2A, 0x23, 0x2B, 0x0F, 0x2F, 0x2A, | |
2413 | 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, 0x31, 0x20, 0x2A, 0x2F, | |
2414 | 0x0D, 0x0A, 0x1B, 0x24, 0x2A, 0x48, 0x1B, 0x4E, 0x22, 0x21, | |
2415 | 0x1B, 0x4E, 0x22, 0x22, 0x1B, 0x4E, 0x22, 0x23, 0x1B, 0x4E, | |
2416 | 0x22, 0x24, 0x1B, 0x4E, 0x22, 0x25, 0x0F, 0x2F, 0x2A, 0x70, | |
2417 | 0x6C, 0x61, 0x6E, 0x65, 0x32, 0x2A, 0x2F, 0x20, 0x0D, 0x0A, | |
2418 | 0x1B, 0x24, 0x2B, 0x49, 0x1B, 0x4F, 0x22, 0x44, 0x1B, 0x4F, | |
2419 | 0x22, 0x45, 0x1B, 0x4F, 0x22, 0x46, 0x1B, 0x4F, 0x22, 0x47, | |
2420 | 0x1B, 0x4F, 0x22, 0x48, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, | |
2421 | 0x6E, 0x65, 0x20, 0x33, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, | |
2422 | 0x24, 0x2B, 0x4A, 0x1B, 0x4F, 0x21, 0x44, 0x1B, 0x4F, 0x21, | |
2423 | 0x45, 0x1B, 0x4F, 0x22, 0x6A, 0x1B, 0x4F, 0x22, 0x6B, 0x1B, | |
2424 | 0x4F, 0x22, 0x6C, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, | |
2425 | 0x65, 0x20, 0x34, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, | |
2426 | 0x2B, 0x4B, 0x1B, 0x4F, 0x21, 0x74, 0x1B, 0x4F, 0x22, 0x50, | |
2427 | 0x1B, 0x4F, 0x22, 0x51, 0x1B, 0x4F, 0x23, 0x37, 0x1B, 0x4F, | |
2428 | 0x22, 0x5C, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, | |
2429 | 0x65, 0x20, 0x35, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, | |
2430 | 0x2B, 0x4C, 0x1B, 0x4F, 0x21, 0x23, 0x1B, 0x4F, 0x22, 0x2C, | |
2431 | 0x1B, 0x4F, 0x23, 0x4E, 0x1B, 0x4F, 0x21, 0x6E, 0x1B, 0x4F, | |
2432 | 0x23, 0x71, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, | |
2433 | 0x20, 0x36, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, 0x2B, | |
2434 | 0x4D, 0x1B, 0x4F, 0x22, 0x71, 0x1B, 0x4F, 0x21, 0x4E, 0x1B, | |
2435 | 0x4F, 0x21, 0x6A, 0x1B, 0x4F, 0x23, 0x3A, 0x1B, 0x4F, 0x23, | |
2436 | 0x6F, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, | |
2437 | 0x37, 0x20, 0x2A, 0x2F, | |
2438 | }; | |
2439 | static const unsigned char out2[]={ | |
2440 | 0x1B, 0x24, 0x29, 0x47, 0x0E, 0x23, 0x21, 0x23, 0x22, 0x23, | |
2441 | 0x23, 0x23, 0x24, 0x23, 0x25, 0x23, 0x26, 0x23, 0x27, 0x23, | |
2442 | 0x28, 0x23, 0x29, 0x23, 0x2A, 0x23, 0x2B, 0x0F, 0x2F, 0x2A, | |
2443 | 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, 0x31, 0x20, 0x2A, 0x2F, | |
2444 | 0x0D, 0x0A, 0x1B, 0x24, 0x2A, 0x48, 0x1B, 0x4E, 0x22, 0x21, | |
2445 | 0x1B, 0x4E, 0x22, 0x22, 0x1B, 0x4E, 0x22, 0x23, 0x1B, 0x4E, | |
2446 | 0x22, 0x24, 0x1B, 0x4E, 0x22, 0x25, 0x0F, 0x2F, 0x2A, 0x70, | |
2447 | 0x6C, 0x61, 0x6E, 0x65, 0x32, 0x2A, 0x2F, 0x20, 0x0D, 0x0A, | |
2448 | 0x1B, 0x24, 0x2B, 0x49, 0x1B, 0x4F, 0x22, 0x44, 0x1B, 0x4F, | |
2449 | 0x22, 0x45, 0x1B, 0x4F, 0x22, 0x46, 0x1B, 0x4F, 0x22, 0x47, | |
2450 | 0x1B, 0x4F, 0x22, 0x48, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, | |
2451 | 0x6E, 0x65, 0x20, 0x33, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, | |
2452 | 0x24, 0x2B, 0x4A, 0x1B, 0x4F, 0x21, 0x44, 0x1B, 0x4F, 0x21, | |
2453 | 0x45, 0x1B, 0x4F, 0x22, 0x6A, 0x1B, 0x4F, 0x22, 0x6B, 0x1B, | |
2454 | 0x4F, 0x22, 0x6C, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, | |
2455 | 0x65, 0x20, 0x34, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, | |
2456 | 0x2B, 0x4B, 0x1B, 0x4F, 0x21, 0x74, 0x1B, 0x4F, 0x22, 0x50, | |
2457 | 0x1B, 0x4F, 0x22, 0x51, 0x1B, 0x4F, 0x23, 0x37, 0x1B, 0x4F, | |
2458 | 0x22, 0x5C, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, | |
2459 | 0x65, 0x20, 0x35, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, | |
2460 | 0x2B, 0x4C, 0x1B, 0x4F, 0x21, 0x23, 0x1B, 0x4F, 0x22, 0x2C, | |
2461 | 0x1B, 0x4F, 0x23, 0x4E, 0x1B, 0x4F, 0x21, 0x6E, 0x1B, 0x4F, | |
2462 | 0x23, 0x71, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, | |
2463 | 0x20, 0x36, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, 0x2B, | |
2464 | 0x4D, 0x1B, 0x4F, 0x22, 0x71, 0x1B, 0x4F, 0x21, 0x4E, 0x1B, | |
2465 | 0x4F, 0x21, 0x6A, 0x1B, 0x4F, 0x23, 0x3A, 0x1B, 0x4F, 0x23, | |
2466 | 0x6F, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, | |
2467 | 0x37, 0x20, 0x2A, 0x2F, | |
2468 | }; | |
2469 | const char *source=(const char *)in; | |
2470 | const char *limit=(const char *)in+sizeof(in); | |
2471 | ||
2472 | UErrorCode errorCode=U_ZERO_ERROR; | |
2473 | UConverter *cnv=ucnv_open("LATIN_1", &errorCode); | |
2474 | if(U_FAILURE(errorCode)) { | |
2475 | log_err("Unable to open a LATIN_1 converter: %s\n", u_errorName(errorCode)); | |
2476 | return; | |
2477 | } | |
2478 | TestNextUChar(cnv, source, limit, results, "LATIN_1"); | |
2479 | /* Test the condition when source >= sourceLimit */ | |
2480 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
2481 | TestConv((uint16_t*)in1,sizeof(in1)/2,"LATIN_1","LATIN-1",(char*)out1,sizeof(out1)); | |
2482 | TestConv((uint16_t*)in2,sizeof(in2)/2,"ASCII","ASCII",(char*)out2,sizeof(out2)); | |
2483 | ||
2484 | ucnv_close(cnv); | |
2485 | } | |
2486 | ||
2487 | static void | |
2488 | TestSBCS() { | |
2489 | /* test input */ | |
2490 | static const uint8_t in[]={ 0x61, 0xc0, 0x80, 0xe0, 0xf0, 0xf4}; | |
2491 | /* expected test results */ | |
374ca955 | 2492 | static const int32_t results[]={ |
b75a7d8f A |
2493 | /* number of bytes read, code point */ |
2494 | 1, 0x61, | |
2495 | 1, 0xbf, | |
2496 | 1, 0xc4, | |
2497 | 1, 0x2021, | |
2498 | 1, 0xf8ff, | |
2499 | 1, 0x00d9 | |
2500 | }; | |
2501 | ||
2502 | const char *source=(const char *)in, *limit=(const char *)in+sizeof(in); | |
2503 | UErrorCode errorCode=U_ZERO_ERROR; | |
374ca955 | 2504 | UConverter *cnv=ucnv_open("x-mac-turkish", &errorCode); |
b75a7d8f | 2505 | if(U_FAILURE(errorCode)) { |
374ca955 | 2506 | log_data_err("Unable to open a SBCS(x-mac-turkish) converter: %s\n", u_errorName(errorCode)); |
b75a7d8f A |
2507 | return; |
2508 | } | |
374ca955 | 2509 | TestNextUChar(cnv, source, limit, results, "SBCS(x-mac-turkish)"); |
b75a7d8f A |
2510 | /* Test the condition when source >= sourceLimit */ |
2511 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
2512 | /*Test for Illegal character */ /* | |
2513 | { | |
2514 | static const uint8_t input1[]={ 0xA1 }; | |
2515 | const char* illegalsource=(const char*)input1; | |
2516 | TestNextUCharError(cnv, illegalsource, illegalsource+sizeof(illegalsource), U_INVALID_CHAR_FOUND, "source has a illegal characte"); | |
2517 | } | |
2518 | */ | |
2519 | ucnv_close(cnv); | |
2520 | } | |
2521 | ||
2522 | static void | |
2523 | TestDBCS() { | |
2524 | /* test input */ | |
2525 | static const uint8_t in[]={ | |
2526 | 0x44, 0x6a, | |
2527 | 0xc4, 0x9c, | |
2528 | 0x7a, 0x74, | |
2529 | 0x46, 0xab, | |
2530 | 0x42, 0x5b, | |
2531 | ||
2532 | }; | |
2533 | ||
2534 | /* expected test results */ | |
374ca955 | 2535 | static const int32_t results[]={ |
b75a7d8f A |
2536 | /* number of bytes read, code point */ |
2537 | 2, 0x00a7, | |
2538 | 2, 0xe1d2, | |
2539 | 2, 0x6962, | |
2540 | 2, 0xf842, | |
2541 | 2, 0xffe5, | |
2542 | }; | |
2543 | ||
2544 | const char *source=(const char *)in, *limit=(const char *)in+sizeof(in); | |
2545 | UErrorCode errorCode=U_ZERO_ERROR; | |
2546 | ||
2547 | UConverter *cnv=my_ucnv_open("@ibm9027", &errorCode); | |
2548 | if(U_FAILURE(errorCode)) { | |
2549 | log_data_err("Unable to open a DBCS(@ibm9027) converter: %s\n", u_errorName(errorCode)); | |
2550 | return; | |
2551 | } | |
2552 | TestNextUChar(cnv, source, limit, results, "DBCS(@ibm9027)"); | |
2553 | /* Test the condition when source >= sourceLimit */ | |
2554 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
b75a7d8f A |
2555 | /*Test for the condition where there is an invalid character*/ |
2556 | { | |
2557 | static const uint8_t source2[]={0x1a, 0x1b}; | |
2558 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character"); | |
2559 | } | |
374ca955 A |
2560 | /*Test for the condition where we have a truncated char*/ |
2561 | { | |
2562 | static const uint8_t source1[]={0xc4}; | |
2563 | ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); | |
2564 | TestNextUCharError(cnv, (const char*)source1, (const char*)source1+sizeof(source1), U_TRUNCATED_CHAR_FOUND, "a character is truncated"); | |
2565 | } | |
b75a7d8f A |
2566 | ucnv_close(cnv); |
2567 | } | |
2568 | ||
2569 | static void | |
2570 | TestMBCS() { | |
2571 | /* test input */ | |
2572 | static const uint8_t in[]={ | |
2573 | 0x01, | |
2574 | 0xa6, 0xa3, | |
2575 | 0x00, | |
2576 | 0xa6, 0xa1, | |
2577 | 0x08, | |
2578 | 0xc2, 0x76, | |
2579 | 0xc2, 0x78, | |
2580 | ||
2581 | }; | |
2582 | ||
2583 | /* expected test results */ | |
374ca955 | 2584 | static const int32_t results[]={ |
b75a7d8f A |
2585 | /* number of bytes read, code point */ |
2586 | 1, 0x0001, | |
2587 | 2, 0x250c, | |
2588 | 1, 0x0000, | |
2589 | 2, 0x2500, | |
2590 | 1, 0x0008, | |
2591 | 2, 0xd60c, | |
2592 | 2, 0xd60e, | |
2593 | }; | |
2594 | ||
2595 | const char *source=(const char *)in, *limit=(const char *)in+sizeof(in); | |
2596 | UErrorCode errorCode=U_ZERO_ERROR; | |
2597 | ||
2598 | UConverter *cnv=ucnv_open("ibm-1363", &errorCode); | |
2599 | if(U_FAILURE(errorCode)) { | |
2600 | log_data_err("Unable to open a MBCS(ibm-1363) converter: %s\n", u_errorName(errorCode)); | |
2601 | return; | |
2602 | } | |
2603 | TestNextUChar(cnv, source, limit, results, "MBCS(ibm-1363)"); | |
2604 | /* Test the condition when source >= sourceLimit */ | |
2605 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
b75a7d8f A |
2606 | /*Test for the condition where there is an invalid character*/ |
2607 | { | |
fd0068a8 | 2608 | static const uint8_t source2[]={0xa1, 0x80}; |
b75a7d8f A |
2609 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character"); |
2610 | } | |
374ca955 A |
2611 | /*Test for the condition where we have a truncated char*/ |
2612 | { | |
2613 | static const uint8_t source1[]={0xc4}; | |
2614 | ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); | |
2615 | TestNextUCharError(cnv, (const char*)source1, (const char*)source1+sizeof(source1), U_TRUNCATED_CHAR_FOUND, "a character is truncated"); | |
2616 | } | |
b75a7d8f A |
2617 | ucnv_close(cnv); |
2618 | ||
2619 | } | |
2620 | ||
374ca955 A |
2621 | #ifdef U_ENABLE_GENERIC_ISO_2022 |
2622 | ||
b75a7d8f A |
2623 | static void |
2624 | TestISO_2022() { | |
2625 | /* test input */ | |
2626 | static const uint8_t in[]={ | |
374ca955 A |
2627 | 0x1b, 0x25, 0x42, |
2628 | 0x31, | |
b75a7d8f A |
2629 | 0x32, |
2630 | 0x61, | |
2631 | 0xc2, 0x80, | |
2632 | 0xe0, 0xa0, 0x80, | |
2633 | 0xf0, 0x90, 0x80, 0x80 | |
2634 | }; | |
2635 | ||
2636 | ||
2637 | ||
2638 | /* expected test results */ | |
374ca955 | 2639 | static const int32_t results[]={ |
b75a7d8f | 2640 | /* number of bytes read, code point */ |
374ca955 | 2641 | 4, 0x0031, /* 4 bytes including the escape sequence */ |
b75a7d8f A |
2642 | 1, 0x0032, |
2643 | 1, 0x61, | |
2644 | 2, 0x80, | |
2645 | 3, 0x800, | |
374ca955 | 2646 | 4, 0x10000 |
b75a7d8f A |
2647 | }; |
2648 | ||
2649 | const char *source=(const char *)in, *limit=(const char *)in+sizeof(in); | |
2650 | UErrorCode errorCode=U_ZERO_ERROR; | |
2651 | UConverter *cnv; | |
2652 | ||
2653 | cnv=ucnv_open("ISO_2022", &errorCode); | |
2654 | if(U_FAILURE(errorCode)) { | |
2655 | log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode)); | |
2656 | return; | |
2657 | } | |
2658 | TestNextUChar(cnv, source, limit, results, "ISO_2022"); | |
2659 | ||
2660 | /* Test the condition when source >= sourceLimit */ | |
2661 | TestNextUCharError(cnv, source, source-1, U_ILLEGAL_ARGUMENT_ERROR, "sourceLimit < source"); | |
2662 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
2663 | /*Test for the condition where we have a truncated char*/ | |
2664 | { | |
2665 | static const uint8_t source1[]={0xc4}; | |
374ca955 | 2666 | ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); |
b75a7d8f A |
2667 | TestNextUCharError(cnv, (const char*)source1, (const char*)source1+sizeof(source1), U_TRUNCATED_CHAR_FOUND, "a character is truncated"); |
2668 | } | |
2669 | /*Test for the condition where there is an invalid character*/ | |
2670 | { | |
2671 | static const uint8_t source2[]={0xa1, 0x01}; | |
374ca955 | 2672 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ILLEGAL_CHAR_FOUND, "an invalid character"); |
b75a7d8f A |
2673 | } |
2674 | ucnv_close(cnv); | |
2675 | } | |
2676 | ||
374ca955 A |
2677 | #endif |
2678 | ||
b75a7d8f A |
2679 | static void |
2680 | TestSmallTargetBuffer(const uint16_t* source, const UChar* sourceLimit,UConverter* cnv){ | |
2681 | const UChar* uSource; | |
2682 | const UChar* uSourceLimit; | |
2683 | const char* cSource; | |
2684 | const char* cSourceLimit; | |
2685 | UChar *uTargetLimit =NULL; | |
2686 | UChar *uTarget; | |
2687 | char *cTarget; | |
2688 | const char *cTargetLimit; | |
2689 | char *cBuf; | |
2690 | UChar *uBuf,*test; | |
2691 | int32_t uBufSize = 120; | |
2692 | int len=0; | |
2693 | int i=2; | |
2694 | UErrorCode errorCode=U_ZERO_ERROR; | |
2695 | uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5); | |
2696 | cBuf =(char*)malloc(uBufSize * sizeof(char) * 10); | |
2697 | ucnv_reset(cnv); | |
2698 | for(;--i>0; ){ | |
2699 | uSource = (UChar*) source; | |
2700 | uSourceLimit=(const UChar*)sourceLimit; | |
2701 | cTarget = cBuf; | |
2702 | uTarget = uBuf; | |
2703 | cSource = cBuf; | |
2704 | cTargetLimit = cBuf; | |
2705 | uTargetLimit = uBuf; | |
2706 | ||
2707 | do{ | |
2708 | ||
2709 | cTargetLimit = cTargetLimit+ i; | |
2710 | ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,NULL,FALSE, &errorCode); | |
2711 | if(errorCode==U_BUFFER_OVERFLOW_ERROR){ | |
2712 | errorCode=U_ZERO_ERROR; | |
2713 | continue; | |
2714 | } | |
2715 | ||
2716 | if(U_FAILURE(errorCode)){ | |
2717 | log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
2718 | return; | |
2719 | } | |
2720 | ||
2721 | }while (uSource<uSourceLimit); | |
2722 | ||
2723 | cSourceLimit =cTarget; | |
2724 | do{ | |
2725 | uTargetLimit=uTargetLimit+i; | |
2726 | ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,NULL,FALSE,&errorCode); | |
2727 | if(errorCode==U_BUFFER_OVERFLOW_ERROR){ | |
2728 | errorCode=U_ZERO_ERROR; | |
2729 | continue; | |
2730 | } | |
2731 | if(U_FAILURE(errorCode)){ | |
2732 | log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
2733 | return; | |
2734 | } | |
2735 | }while(cSource<cSourceLimit); | |
2736 | ||
2737 | uSource = source; | |
2738 | test =uBuf; | |
2739 | for(len=0;len<(int)(source - sourceLimit);len++){ | |
2740 | if(uBuf[len]!=uSource[len]){ | |
2741 | log_err("Expected : \\u%04X \t Got: \\u%04X\n",uSource[len],(int)uBuf[len]) ; | |
2742 | } | |
2743 | } | |
2744 | } | |
2745 | free(uBuf); | |
2746 | free(cBuf); | |
2747 | } | |
2748 | /* Test for Jitterbug 778 */ | |
2749 | static void TestToAndFromUChars(const uint16_t* source, const UChar* sourceLimit,UConverter* cnv){ | |
2750 | const UChar* uSource; | |
2751 | const UChar* uSourceLimit; | |
2752 | const char* cSource; | |
2753 | UChar *uTargetLimit =NULL; | |
2754 | UChar *uTarget; | |
2755 | char *cTarget; | |
2756 | const char *cTargetLimit; | |
2757 | char *cBuf; | |
2758 | UChar *uBuf,*test; | |
2759 | int32_t uBufSize = 120; | |
2760 | int numCharsInTarget=0; | |
2761 | UErrorCode errorCode=U_ZERO_ERROR; | |
2762 | uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5); | |
2763 | cBuf =(char*)malloc(uBufSize * sizeof(char) * 5); | |
2764 | uSource = source; | |
2765 | uSourceLimit=sourceLimit; | |
2766 | cTarget = cBuf; | |
2767 | cTargetLimit = cBuf +uBufSize*5; | |
2768 | uTarget = uBuf; | |
2769 | uTargetLimit = uBuf+ uBufSize*5; | |
2770 | ucnv_reset(cnv); | |
73c04bcf | 2771 | numCharsInTarget=ucnv_fromUChars(cnv, cTarget, (int32_t)(cTargetLimit-cTarget), uSource, (int32_t)(uSourceLimit-uSource), &errorCode); |
b75a7d8f A |
2772 | if(U_FAILURE(errorCode)){ |
2773 | log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
2774 | return; | |
2775 | } | |
2776 | cSource = cBuf; | |
2777 | test =uBuf; | |
73c04bcf | 2778 | ucnv_toUChars(cnv,uTarget,(int32_t)(uTargetLimit-uTarget),cSource,numCharsInTarget,&errorCode); |
b75a7d8f A |
2779 | if(U_FAILURE(errorCode)){ |
2780 | log_err("ucnv_toUChars conversion failed, reason %s\n", u_errorName(errorCode)); | |
2781 | return; | |
2782 | } | |
2783 | uSource = source; | |
2784 | while(uSource<uSourceLimit){ | |
2785 | if(*test!=*uSource){ | |
2786 | ||
2787 | log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ; | |
2788 | } | |
2789 | uSource++; | |
2790 | test++; | |
2791 | } | |
2792 | free(uBuf); | |
2793 | free(cBuf); | |
2794 | } | |
2795 | ||
2796 | static void TestSmallSourceBuffer(const uint16_t* source, const UChar* sourceLimit,UConverter* cnv){ | |
2797 | const UChar* uSource; | |
2798 | const UChar* uSourceLimit; | |
2799 | const char* cSource; | |
2800 | const char* cSourceLimit; | |
2801 | UChar *uTargetLimit =NULL; | |
2802 | UChar *uTarget; | |
2803 | char *cTarget; | |
2804 | const char *cTargetLimit; | |
2805 | char *cBuf; | |
2806 | UChar *uBuf,*test; | |
2807 | int32_t uBufSize = 120; | |
2808 | int len=0; | |
2809 | int i=2; | |
2810 | const UChar *temp = sourceLimit; | |
2811 | UErrorCode errorCode=U_ZERO_ERROR; | |
2812 | uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5); | |
2813 | cBuf =(char*)malloc(uBufSize * sizeof(char) * 10); | |
2814 | ||
2815 | ucnv_reset(cnv); | |
2816 | for(;--i>0;){ | |
2817 | uSource = (UChar*) source; | |
2818 | cTarget = cBuf; | |
2819 | uTarget = uBuf; | |
2820 | cSource = cBuf; | |
2821 | cTargetLimit = cBuf; | |
2822 | uTargetLimit = uBuf+uBufSize*5; | |
2823 | cTargetLimit = cTargetLimit+uBufSize*10; | |
2824 | uSourceLimit=uSource; | |
2825 | do{ | |
2826 | ||
2827 | if (uSourceLimit < sourceLimit) { | |
2828 | uSourceLimit = uSourceLimit+1; | |
2829 | } | |
2830 | ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,NULL,FALSE, &errorCode); | |
2831 | if(errorCode==U_BUFFER_OVERFLOW_ERROR){ | |
2832 | errorCode=U_ZERO_ERROR; | |
2833 | continue; | |
2834 | } | |
2835 | ||
2836 | if(U_FAILURE(errorCode)){ | |
2837 | log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
2838 | return; | |
2839 | } | |
2840 | ||
2841 | }while (uSource<temp); | |
2842 | ||
2843 | cSourceLimit =cBuf; | |
2844 | do{ | |
2845 | if (cSourceLimit < cBuf + (cTarget - cBuf)) { | |
2846 | cSourceLimit = cSourceLimit+1; | |
2847 | } | |
2848 | ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,NULL,FALSE,&errorCode); | |
2849 | if(errorCode==U_BUFFER_OVERFLOW_ERROR){ | |
2850 | errorCode=U_ZERO_ERROR; | |
2851 | continue; | |
2852 | } | |
2853 | if(U_FAILURE(errorCode)){ | |
2854 | log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
2855 | return; | |
2856 | } | |
2857 | }while(cSource<cTarget); | |
2858 | ||
2859 | uSource = source; | |
2860 | test =uBuf; | |
2861 | for(;len<(int)(source - sourceLimit);len++){ | |
2862 | if(uBuf[len]!=uSource[len]){ | |
2863 | log_err("Expected : \\u%04X \t Got: \\u%04X\n",uSource[len],(int)uBuf[len]) ; | |
2864 | } | |
2865 | } | |
2866 | } | |
2867 | free(uBuf); | |
2868 | free(cBuf); | |
2869 | } | |
2870 | static void | |
2871 | TestGetNextUChar2022(UConverter* cnv, const char* source, const char* limit, | |
2872 | const uint16_t results[], const char* message){ | |
2873 | const char* s0; | |
2874 | const char* s=(char*)source; | |
2875 | const uint16_t *r=results; | |
2876 | UErrorCode errorCode=U_ZERO_ERROR; | |
2877 | uint32_t c,exC; | |
2878 | ucnv_reset(cnv); | |
2879 | while(s<limit) { | |
2880 | s0=s; | |
2881 | c=ucnv_getNextUChar(cnv, &s, limit, &errorCode); | |
2882 | if(errorCode==U_INDEX_OUTOFBOUNDS_ERROR) { | |
2883 | break; /* no more significant input */ | |
2884 | } else if(U_FAILURE(errorCode)) { | |
2885 | log_err("%s ucnv_getNextUChar() failed: %s\n", message, u_errorName(errorCode)); | |
2886 | break; | |
2887 | } else { | |
2888 | if(UTF_IS_FIRST_SURROGATE(*r)){ | |
2889 | int i =0, len = 2; | |
2890 | UTF_NEXT_CHAR_SAFE(r, i, len, exC, FALSE); | |
2891 | r++; | |
2892 | }else{ | |
2893 | exC = *r; | |
2894 | } | |
2895 | if(c!=(uint32_t)(exC)) | |
2896 | log_err("%s ucnv_getNextUChar() Expected: \\u%04X Got: \\u%04X \n",message,(uint32_t) (*r),c); | |
2897 | } | |
2898 | r++; | |
2899 | } | |
2900 | } | |
2901 | ||
2902 | static int TestJitterbug930(const char* enc){ | |
2903 | UErrorCode err = U_ZERO_ERROR; | |
2904 | UConverter*converter; | |
2905 | char out[80]; | |
2906 | char*target = out; | |
2907 | UChar in[4]; | |
2908 | const UChar*source = in; | |
2909 | int32_t off[80]; | |
2910 | int32_t* offsets = off; | |
2911 | int numOffWritten=0; | |
2912 | UBool flush = 0; | |
2913 | converter = my_ucnv_open(enc, &err); | |
2914 | ||
2915 | in[0] = 0x41; /* 0x4E00;*/ | |
2916 | in[1] = 0x4E01; | |
2917 | in[2] = 0x4E02; | |
2918 | in[3] = 0x4E03; | |
2919 | ||
2920 | memset(off, '*', sizeof(off)); | |
2921 | ||
2922 | ucnv_fromUnicode (converter, | |
2923 | &target, | |
2924 | target+2, | |
2925 | &source, | |
2926 | source+3, | |
2927 | offsets, | |
2928 | flush, | |
2929 | &err); | |
2930 | ||
2931 | /* writes three bytes into the output buffer: 41 1B 24 | |
2932 | * but offsets contains 0 1 1 | |
2933 | */ | |
2934 | while(*offsets< off[10]){ | |
2935 | numOffWritten++; | |
2936 | offsets++; | |
2937 | } | |
2938 | log_verbose("Testing Jitterbug 930 for encoding %s",enc); | |
2939 | if(numOffWritten!= (int)(target-out)){ | |
2940 | log_err("Jitterbug 930 test for enc: %s failed. Expected: %i Got: %i",enc, (int)(target-out),numOffWritten); | |
2941 | } | |
2942 | ||
2943 | err = U_ZERO_ERROR; | |
2944 | ||
2945 | memset(off,'*' , sizeof(off)); | |
2946 | ||
2947 | flush = 1; | |
2948 | offsets=off; | |
2949 | ucnv_fromUnicode (converter, | |
2950 | &target, | |
2951 | target+4, | |
2952 | &source, | |
2953 | source, | |
2954 | offsets, | |
2955 | flush, | |
2956 | &err); | |
2957 | numOffWritten=0; | |
2958 | while(*offsets< off[10]){ | |
2959 | numOffWritten++; | |
2960 | if(*offsets!= -1){ | |
2961 | log_err("Jitterbug 930 test for enc: %s failed. Expected: %i Got: %i",enc,-1,*offsets) ; | |
2962 | } | |
2963 | offsets++; | |
2964 | } | |
2965 | ||
2966 | /* writes 42 43 7A into output buffer, | |
2967 | * offsets contains -1 -1 -1 | |
2968 | */ | |
2969 | ucnv_close(converter); | |
2970 | return 0; | |
2971 | } | |
2972 | ||
2973 | static void | |
2974 | TestHZ() { | |
2975 | /* test input */ | |
2976 | static const uint16_t in[]={ | |
2977 | 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, 0x3003, 0x3005, 0x2014, | |
2978 | 0xFF5E, 0x2016, 0x2026, 0x007E, 0x997C, 0x70B3, 0x75C5, 0x5E76, 0x73BB, 0x83E0, | |
2979 | 0x64AD, 0x62E8, 0x94B5, 0x000A, 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, | |
2980 | 0x4F2F, 0x5E1B, 0x8236, 0x000A, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, | |
2981 | 0x535C, 0x54FA, 0x8865, 0x000A, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, | |
2982 | 0x6016, 0x248F, 0x2490, 0x000A, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, | |
2983 | 0x2497, 0x2498, 0x2499, 0x000A, 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, 0x2477, | |
2984 | 0x2478, 0x2479, 0x247A, 0x000A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, | |
2985 | 0x2481, 0x2482, 0x2483, 0x000A, 0x0041, 0x0043, 0x0044, 0x0045, 0x0046, 0x007E, | |
2986 | 0x0048, 0x0049, 0x004A, 0x000A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, | |
2987 | 0x0051, 0x0052, 0x0053, 0x000A, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, | |
2988 | 0x005A, 0x005B, 0x005C, 0x000A | |
2989 | }; | |
2990 | const UChar* uSource; | |
2991 | const UChar* uSourceLimit; | |
2992 | const char* cSource; | |
2993 | const char* cSourceLimit; | |
2994 | UChar *uTargetLimit =NULL; | |
2995 | UChar *uTarget; | |
2996 | char *cTarget; | |
2997 | const char *cTargetLimit; | |
2998 | char *cBuf; | |
2999 | UChar *uBuf,*test; | |
3000 | int32_t uBufSize = 120; | |
3001 | UErrorCode errorCode=U_ZERO_ERROR; | |
3002 | UConverter *cnv; | |
3003 | int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5); | |
3004 | int32_t* myOff= offsets; | |
3005 | cnv=ucnv_open("HZ", &errorCode); | |
3006 | if(U_FAILURE(errorCode)) { | |
3007 | log_data_err("Unable to open HZ converter: %s\n", u_errorName(errorCode)); | |
3008 | return; | |
3009 | } | |
3010 | ||
3011 | uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5); | |
3012 | cBuf =(char*)malloc(uBufSize * sizeof(char) * 5); | |
73c04bcf A |
3013 | uSource = (const UChar*)in; |
3014 | uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0])); | |
b75a7d8f A |
3015 | cTarget = cBuf; |
3016 | cTargetLimit = cBuf +uBufSize*5; | |
3017 | uTarget = uBuf; | |
3018 | uTargetLimit = uBuf+ uBufSize*5; | |
3019 | ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode); | |
3020 | if(U_FAILURE(errorCode)){ | |
3021 | log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
3022 | return; | |
3023 | } | |
3024 | cSource = cBuf; | |
3025 | cSourceLimit =cTarget; | |
3026 | test =uBuf; | |
3027 | myOff=offsets; | |
3028 | ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode); | |
3029 | if(U_FAILURE(errorCode)){ | |
3030 | log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
3031 | return; | |
3032 | } | |
73c04bcf | 3033 | uSource = (const UChar*)in; |
b75a7d8f A |
3034 | while(uSource<uSourceLimit){ |
3035 | if(*test!=*uSource){ | |
3036 | ||
3037 | log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ; | |
3038 | } | |
3039 | uSource++; | |
3040 | test++; | |
3041 | } | |
3042 | TestGetNextUChar2022(cnv, cBuf, cTarget, in, "HZ encoding"); | |
73c04bcf A |
3043 | TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); |
3044 | TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); | |
3045 | TestToAndFromUChars(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); | |
b75a7d8f A |
3046 | TestJitterbug930("csISO2022JP"); |
3047 | ucnv_close(cnv); | |
3048 | free(offsets); | |
3049 | free(uBuf); | |
3050 | free(cBuf); | |
3051 | } | |
3052 | ||
3053 | static void | |
3054 | TestISCII(){ | |
3055 | /* test input */ | |
3056 | static const uint16_t in[]={ | |
3057 | /* test full range of Devanagari */ | |
3058 | 0x0901,0x0902,0x0903,0x0905,0x0906,0x0907,0x0908,0x0909,0x090A, | |
3059 | 0x090B,0x090E,0x090F,0x0910,0x090D,0x0912,0x0913,0x0914,0x0911, | |
3060 | 0x0915,0x0916,0x0917,0x0918,0x0919,0x091A,0x091B,0x091C,0x091D, | |
3061 | 0x091E,0x091F,0x0920,0x0921,0x0922,0x0923,0x0924,0x0925,0x0926, | |
3062 | 0x0927,0x0928,0x0929,0x092A,0x092B,0x092C,0x092D,0x092E,0x092F, | |
3063 | 0x095F,0x0930,0x0931,0x0932,0x0933,0x0934,0x0935,0x0936,0x0937, | |
3064 | 0x0938,0x0939,0x200D,0x093E,0x093F,0x0940,0x0941,0x0942,0x0943, | |
3065 | 0x0946,0x0947,0x0948,0x0945,0x094A,0x094B,0x094C,0x0949,0x094D, | |
3066 | 0x093d,0x0966,0x0967,0x0968,0x0969,0x096A,0x096B,0x096C, | |
3067 | 0x096D,0x096E,0x096F, | |
3068 | /* test Soft halant*/ | |
3069 | 0x0915,0x094d, 0x200D, | |
3070 | /* test explicit halant */ | |
3071 | 0x0915,0x094d, 0x200c, | |
3072 | /* test double danda */ | |
3073 | 0x965, | |
3074 | /* test ASCII */ | |
3075 | 0x1B, 0x24, 0x29, 0x47, 0x0E, 0x23, 0x21, 0x23, 0x22, 0x23, | |
3076 | 0x23, 0x23, 0x24, 0x23, 0x25, 0x23, 0x26, 0x23, 0x27, 0x23, | |
3077 | 0x28, 0x23, 0x29, 0x23, 0x2A, 0x23, 0x2B, 0x0F, 0x2F, 0x2A, | |
3078 | /* tests from Lotus */ | |
3079 | 0x0061,0x0915,0x000D,0x000A,0x0996,0x0043, | |
3080 | 0x0930,0x094D,0x200D, | |
3081 | 0x0901,0x000D,0x000A,0x0905,0x0985,0x0043, | |
3082 | 0x0915,0x0921,0x002B,0x095F, | |
3083 | /* tamil range */ | |
3084 | 0x0B86, 0xB87, 0xB88, | |
3085 | /* telugu range */ | |
3086 | 0x0C05, 0x0C02, 0x0C03,0x0c31, | |
3087 | /* kannada range */ | |
3088 | 0x0C85, 0xC82, 0x0C83, | |
3089 | /* test Abbr sign and Anudatta */ | |
3090 | 0x0970, 0x952, | |
3091 | /* 0x0958, | |
3092 | 0x0959, | |
3093 | 0x095A, | |
3094 | 0x095B, | |
3095 | 0x095C, | |
3096 | 0x095D, | |
3097 | 0x095E, | |
3098 | 0x095F,*/ | |
3099 | 0x0960 /* Vocallic RRI 0xAB, 0xE9*/, | |
3100 | 0x0944 /* Vowel Sign Vocallic RRI 0xDF, 0xE9 */, | |
3101 | 0x090C , | |
3102 | 0x0962, | |
3103 | 0x0961 /* Vocallic LL 0xa6, 0xE9 */, | |
3104 | 0x0963 /* Vowel Sign Vocallic LL 0xdb, 0xE9, */, | |
3105 | 0x0950 /* OM Symbol 0xa1, 0xE9,*/, | |
3106 | 0x093D /* Avagraha 0xEA, 0xE9*/, | |
3107 | 0x0958, | |
3108 | 0x0959, | |
3109 | 0x095A, | |
3110 | 0x095B, | |
3111 | 0x095C, | |
3112 | 0x095D, | |
3113 | 0x095E, | |
3114 | 0x0020, 0x094D, 0x0930, 0x0000, 0x00A0 | |
3115 | }; | |
3116 | static const unsigned char byteArr[]={ | |
3117 | ||
3118 | 0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9, | |
3119 | 0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2, | |
3120 | 0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb, | |
3121 | 0xbc,0xbd,0xbe,0xbf,0xc0,0xc1,0xc2,0xc3,0xc4, | |
3122 | 0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd, | |
3123 | 0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6, | |
3124 | 0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf, | |
3125 | 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8, | |
3126 | 0xea,0xe9,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7, | |
3127 | 0xf8,0xf9,0xfa, | |
3128 | /* test soft halant */ | |
3129 | 0xb3, 0xE8, 0xE9, | |
3130 | /* test explicit halant */ | |
3131 | 0xb3, 0xE8, 0xE8, | |
3132 | /* test double danda */ | |
3133 | 0xea, 0xea, | |
3134 | /* test ASCII */ | |
3135 | 0x1B, 0x24, 0x29, 0x47, 0x0E, 0x23, 0x21, 0x23, 0x22, 0x23, | |
3136 | 0x23, 0x23, 0x24, 0x23, 0x25, 0x23, 0x26, 0x23, 0x27, 0x23, | |
3137 | 0x28, 0x23, 0x29, 0x23, 0x2A, 0x23, 0x2B, 0x0F, 0x2F, 0x2A, | |
3138 | /* test ATR code */ | |
3139 | ||
3140 | /* tests from Lotus */ | |
3141 | 0x61,0xEF,0x42,0xEF,0x30,0xB3,0x0D,0x0A,0xEF,0x43,0xB4,0x43, | |
3142 | 0xEF,0x42,0xCF,0xE8,0xD9, | |
3143 | 0xEF,0x42,0xA1,0x0D,0x0A,0xEF,0x42,0xA4,0xEF,0x43,0xA4,0x43, | |
3144 | 0xEF,0x42,0xB3,0xBF,0x2B,0xEF,0x42,0xCE, | |
3145 | /* tamil range */ | |
3146 | 0xEF, 0x44, 0xa5, 0xa6, 0xa7, | |
3147 | /* telugu range */ | |
3148 | 0xEF, 0x45,0xa4, 0xa2, 0xa3,0xd0, | |
3149 | /* kannada range */ | |
3150 | 0xEF, 0x48,0xa4, 0xa2, 0xa3, | |
3151 | /* anudatta and abbreviation sign */ | |
3152 | 0xEF, 0x42, 0xF0, 0xBF, 0xF0, 0xB8, | |
3153 | ||
3154 | ||
3155 | 0xAA, 0xE9,/* RI + NUKTA 0x0960*/ | |
3156 | ||
3157 | 0xDF, 0xE9,/* Vowel sign RI + NUKTA 0x0944*/ | |
3158 | ||
3159 | 0xa6, 0xE9,/* Vowel I + NUKTA 0x090C*/ | |
3160 | ||
3161 | 0xdb, 0xE9,/* Vowel sign I + Nukta 0x0962*/ | |
3162 | ||
3163 | 0xa7, 0xE9,/* Vowel II + NUKTA 0x0961*/ | |
3164 | ||
3165 | 0xdc, 0xE9,/* Vowel sign II + Nukta 0x0963*/ | |
3166 | ||
3167 | 0xa1, 0xE9,/* chandrabindu + Nukta 0x0950*/ | |
3168 | ||
3169 | 0xEA, 0xE9, /* Danda + Nukta 0x093D*/ | |
3170 | ||
3171 | 0xB3, 0xE9, /* Ka + NUKTA */ | |
3172 | ||
3173 | 0xB4, 0xE9, /* Kha + NUKTA */ | |
3174 | ||
3175 | 0xB5, 0xE9, /* Ga + NUKTA */ | |
3176 | ||
3177 | 0xBA, 0xE9, | |
3178 | ||
3179 | 0xBF, 0xE9, | |
3180 | ||
3181 | 0xC0, 0xE9, | |
3182 | ||
3183 | 0xC9, 0xE9, | |
3184 | /* INV halant RA */ | |
3185 | 0xD9, 0xE8, 0xCF, | |
3186 | 0x00, 0x00A0, | |
3187 | /* just consume unhandled codepoints */ | |
3188 | 0xEF, 0x30, | |
3189 | ||
3190 | }; | |
3191 | testConvertToU(byteArr,(sizeof(byteArr)),in,(sizeof(in)/U_SIZEOF_UCHAR),"x-iscii-de",NULL,TRUE); | |
3192 | TestConv(in,(sizeof(in)/2),"ISCII,version=0","hindi", (char *)byteArr,sizeof(byteArr)); | |
3193 | ||
3194 | } | |
3195 | ||
3196 | static void | |
3197 | TestISO_2022_JP() { | |
3198 | /* test input */ | |
3199 | static const uint16_t in[]={ | |
3200 | 0x0041,/*0x00E9,*/0x3000, 0x3001, 0x3002, 0x0020, 0x000D, 0x000A, | |
3201 | 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, | |
3202 | 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, | |
3203 | 0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F, 0x005C, 0x000D, 0x000A, | |
3204 | 0x301C, 0x2016, 0x2026, 0x2025, 0x2018, 0x2019, 0x201C, 0x000D, 0x000A, | |
3205 | 0x201D, 0x3014, 0x000D, 0x000A, | |
3206 | 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, | |
3207 | 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, | |
3208 | }; | |
3209 | const UChar* uSource; | |
3210 | const UChar* uSourceLimit; | |
3211 | const char* cSource; | |
3212 | const char* cSourceLimit; | |
3213 | UChar *uTargetLimit =NULL; | |
3214 | UChar *uTarget; | |
3215 | char *cTarget; | |
3216 | const char *cTargetLimit; | |
3217 | char *cBuf; | |
3218 | UChar *uBuf,*test; | |
3219 | int32_t uBufSize = 120; | |
3220 | UErrorCode errorCode=U_ZERO_ERROR; | |
3221 | UConverter *cnv; | |
3222 | int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5); | |
3223 | int32_t* myOff= offsets; | |
3224 | cnv=ucnv_open("ISO_2022_JP_1", &errorCode); | |
3225 | if(U_FAILURE(errorCode)) { | |
374ca955 | 3226 | log_data_err("Unable to open an ISO_2022_JP_1 converter: %s\n", u_errorName(errorCode)); |
b75a7d8f A |
3227 | return; |
3228 | } | |
3229 | ||
3230 | uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5); | |
3231 | cBuf =(char*)malloc(uBufSize * sizeof(char) * 5); | |
73c04bcf A |
3232 | uSource = (const UChar*)in; |
3233 | uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0])); | |
b75a7d8f A |
3234 | cTarget = cBuf; |
3235 | cTargetLimit = cBuf +uBufSize*5; | |
3236 | uTarget = uBuf; | |
3237 | uTargetLimit = uBuf+ uBufSize*5; | |
3238 | ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode); | |
3239 | if(U_FAILURE(errorCode)){ | |
3240 | log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
3241 | return; | |
3242 | } | |
3243 | cSource = cBuf; | |
3244 | cSourceLimit =cTarget; | |
3245 | test =uBuf; | |
3246 | myOff=offsets; | |
3247 | ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode); | |
3248 | if(U_FAILURE(errorCode)){ | |
3249 | log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
3250 | return; | |
3251 | } | |
3252 | ||
73c04bcf | 3253 | uSource = (const UChar*)in; |
b75a7d8f A |
3254 | while(uSource<uSourceLimit){ |
3255 | if(*test!=*uSource){ | |
3256 | ||
3257 | log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ; | |
3258 | } | |
3259 | uSource++; | |
3260 | test++; | |
3261 | } | |
3262 | ||
73c04bcf A |
3263 | TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); |
3264 | TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); | |
b75a7d8f | 3265 | TestGetNextUChar2022(cnv, cBuf, cTarget, in, "ISO-2022-JP encoding"); |
73c04bcf | 3266 | TestToAndFromUChars(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); |
b75a7d8f A |
3267 | TestJitterbug930("csISO2022JP"); |
3268 | ucnv_close(cnv); | |
3269 | free(uBuf); | |
3270 | free(cBuf); | |
3271 | free(offsets); | |
3272 | } | |
3273 | ||
3274 | static void TestConv(const uint16_t in[],int len, const char* conv, const char* lang, char byteArr[],int byteArrLen){ | |
3275 | const UChar* uSource; | |
3276 | const UChar* uSourceLimit; | |
3277 | const char* cSource; | |
3278 | const char* cSourceLimit; | |
3279 | UChar *uTargetLimit =NULL; | |
3280 | UChar *uTarget; | |
3281 | char *cTarget; | |
3282 | const char *cTargetLimit; | |
3283 | char *cBuf; | |
3284 | UChar *uBuf,*test; | |
3285 | int32_t uBufSize = 120*10; | |
3286 | UErrorCode errorCode=U_ZERO_ERROR; | |
3287 | UConverter *cnv; | |
3288 | int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) ); | |
3289 | int32_t* myOff= offsets; | |
3290 | cnv=my_ucnv_open(conv, &errorCode); | |
3291 | if(U_FAILURE(errorCode)) { | |
3292 | log_data_err("Unable to open a %s converter: %s\n", conv, u_errorName(errorCode)); | |
3293 | return; | |
3294 | } | |
3295 | ||
3296 | uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)); | |
3297 | cBuf =(char*)malloc(uBufSize * sizeof(char)); | |
73c04bcf | 3298 | uSource = (const UChar*)in; |
b75a7d8f A |
3299 | uSourceLimit=uSource+len; |
3300 | cTarget = cBuf; | |
3301 | cTargetLimit = cBuf +uBufSize; | |
3302 | uTarget = uBuf; | |
3303 | uTargetLimit = uBuf+ uBufSize; | |
3304 | ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode); | |
3305 | if(U_FAILURE(errorCode)){ | |
3306 | log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
3307 | return; | |
3308 | } | |
3309 | /*log_verbose("length of compressed string for language %s using %s:%i \n",conv,lang,(cTarget-cBuf));*/ | |
3310 | cSource = cBuf; | |
3311 | cSourceLimit =cTarget; | |
3312 | test =uBuf; | |
3313 | myOff=offsets; | |
3314 | ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode); | |
3315 | if(U_FAILURE(errorCode)){ | |
3316 | log_err("ucnv_toUnicode conversion failed, reason: %s\n", u_errorName(errorCode)); | |
3317 | return; | |
3318 | } | |
3319 | ||
73c04bcf | 3320 | uSource = (const UChar*)in; |
b75a7d8f A |
3321 | while(uSource<uSourceLimit){ |
3322 | if(*test!=*uSource){ | |
3323 | log_err("for codepage %s : Expected : \\u%04X \t Got: \\u%04X\n",conv,*uSource,(int)*test) ; | |
3324 | } | |
3325 | uSource++; | |
3326 | test++; | |
3327 | } | |
73c04bcf A |
3328 | TestSmallTargetBuffer(in,(const UChar*)&in[len],cnv); |
3329 | TestSmallSourceBuffer(in,(const UChar*)&in[len],cnv); | |
b75a7d8f A |
3330 | TestGetNextUChar2022(cnv, cBuf, cTarget, in, conv); |
3331 | if(byteArr && byteArrLen!=0){ | |
3332 | TestGetNextUChar2022(cnv, byteArr, (byteArr+byteArrLen), in, lang); | |
73c04bcf | 3333 | TestToAndFromUChars(in,(const UChar*)&in[len],cnv); |
b75a7d8f A |
3334 | { |
3335 | cSource = byteArr; | |
3336 | cSourceLimit = cSource+byteArrLen; | |
3337 | test=uBuf; | |
3338 | myOff = offsets; | |
3339 | ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode); | |
3340 | if(U_FAILURE(errorCode)){ | |
3341 | log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
3342 | return; | |
3343 | } | |
3344 | ||
73c04bcf | 3345 | uSource = (const UChar*)in; |
b75a7d8f A |
3346 | while(uSource<uSourceLimit){ |
3347 | if(*test!=*uSource){ | |
3348 | log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ; | |
3349 | } | |
3350 | uSource++; | |
3351 | test++; | |
3352 | } | |
3353 | } | |
3354 | } | |
3355 | ||
3356 | ucnv_close(cnv); | |
3357 | free(uBuf); | |
3358 | free(cBuf); | |
3359 | free(offsets); | |
3360 | } | |
3361 | static UChar U_CALLCONV | |
3362 | _charAt(int32_t offset, void *context) { | |
3363 | return ((char*)context)[offset]; | |
3364 | } | |
3365 | ||
3366 | static int32_t | |
3367 | unescape(UChar* dst, int32_t dstLen,const char* src,int32_t srcLen,UErrorCode *status){ | |
3368 | int32_t srcIndex=0; | |
3369 | int32_t dstIndex=0; | |
3370 | if(U_FAILURE(*status)){ | |
3371 | return 0; | |
3372 | } | |
3373 | if((dst==NULL && dstLen>0) || (src==NULL ) || dstLen < -1 || srcLen <-1 ){ | |
3374 | *status = U_ILLEGAL_ARGUMENT_ERROR; | |
3375 | return 0; | |
3376 | } | |
3377 | if(srcLen==-1){ | |
73c04bcf | 3378 | srcLen = (int32_t)uprv_strlen(src); |
b75a7d8f A |
3379 | } |
3380 | ||
3381 | for (; srcIndex<srcLen; ) { | |
3382 | UChar32 c = src[srcIndex++]; | |
3383 | if (c == 0x005C /*'\\'*/) { | |
3384 | c = u_unescapeAt(_charAt,&srcIndex,srcLen,(void*)src); /* advances i*/ | |
3385 | if (c == (UChar32)0xFFFFFFFF) { | |
3386 | *status=U_INVALID_CHAR_FOUND; /* return empty string */ | |
3387 | break; /* invalid escape sequence */ | |
3388 | } | |
3389 | } | |
3390 | if(dstIndex < dstLen){ | |
3391 | if(c>0xFFFF){ | |
3392 | dst[dstIndex++] = UTF16_LEAD(c); | |
3393 | if(dstIndex<dstLen){ | |
3394 | dst[dstIndex]=UTF16_TRAIL(c); | |
3395 | }else{ | |
3396 | *status=U_BUFFER_OVERFLOW_ERROR; | |
3397 | } | |
3398 | }else{ | |
3399 | dst[dstIndex]=(UChar)c; | |
3400 | } | |
3401 | ||
3402 | }else{ | |
3403 | *status = U_BUFFER_OVERFLOW_ERROR; | |
3404 | } | |
3405 | dstIndex++; /* for preflighting */ | |
3406 | } | |
3407 | return dstIndex; | |
3408 | } | |
3409 | ||
3410 | static void | |
3411 | TestFullRoundtrip(const char* cp){ | |
3412 | UChar usource[10] ={0}; | |
3413 | UChar nsrc[10] = {0}; | |
3414 | uint32_t i=1; | |
3415 | int len=0, ulen; | |
3416 | nsrc[0]=0x0061; | |
3417 | /* Test codepoint 0 */ | |
3418 | TestConv(usource,1,cp,"",NULL,0); | |
3419 | TestConv(usource,2,cp,"",NULL,0); | |
3420 | nsrc[2]=0x5555; | |
3421 | TestConv(nsrc,3,cp,"",NULL,0); | |
3422 | ||
3423 | for(;i<=0x10FFFF;i++){ | |
3424 | if(i==0xD800){ | |
3425 | i=0xDFFF; | |
3426 | continue; | |
3427 | } | |
3428 | if(i<=0xFFFF){ | |
3429 | usource[0] =(UChar) i; | |
3430 | len=1; | |
3431 | }else{ | |
3432 | usource[0]=UTF16_LEAD(i); | |
3433 | usource[1]=UTF16_TRAIL(i); | |
3434 | len=2; | |
3435 | } | |
3436 | ulen=len; | |
3437 | if(i==0x80) { | |
3438 | usource[2]=0; | |
3439 | } | |
3440 | /* Test only single code points */ | |
3441 | TestConv(usource,ulen,cp,"",NULL,0); | |
3442 | /* Test codepoint repeated twice */ | |
3443 | usource[ulen]=usource[0]; | |
3444 | usource[ulen+1]=usource[1]; | |
3445 | ulen+=len; | |
3446 | TestConv(usource,ulen,cp,"",NULL,0); | |
3447 | /* Test codepoint repeated 3 times */ | |
3448 | usource[ulen]=usource[0]; | |
3449 | usource[ulen+1]=usource[1]; | |
3450 | ulen+=len; | |
3451 | TestConv(usource,ulen,cp,"",NULL,0); | |
3452 | /* Test codepoint in between 2 codepoints */ | |
3453 | nsrc[1]=usource[0]; | |
3454 | nsrc[2]=usource[1]; | |
3455 | nsrc[len+1]=0x5555; | |
3456 | TestConv(nsrc,len+2,cp,"",NULL,0); | |
3457 | uprv_memset(usource,0,sizeof(UChar)*10); | |
3458 | } | |
3459 | } | |
3460 | ||
3461 | static void | |
3462 | TestRoundTrippingAllUTF(void){ | |
3463 | if(!QUICK){ | |
3464 | log_verbose("Running exhaustive round trip test for BOCU-1\n"); | |
3465 | TestFullRoundtrip("BOCU-1"); | |
3466 | log_verbose("Running exhaustive round trip test for SCSU\n"); | |
3467 | TestFullRoundtrip("SCSU"); | |
3468 | log_verbose("Running exhaustive round trip test for UTF-8\n"); | |
3469 | TestFullRoundtrip("UTF-8"); | |
3470 | log_verbose("Running exhaustive round trip test for CESU-8\n"); | |
3471 | TestFullRoundtrip("CESU-8"); | |
3472 | log_verbose("Running exhaustive round trip test for UTF-16BE\n"); | |
3473 | TestFullRoundtrip("UTF-16BE"); | |
3474 | log_verbose("Running exhaustive round trip test for UTF-16LE\n"); | |
3475 | TestFullRoundtrip("UTF-16LE"); | |
3476 | log_verbose("Running exhaustive round trip test for UTF-16\n"); | |
3477 | TestFullRoundtrip("UTF-16"); | |
3478 | log_verbose("Running exhaustive round trip test for UTF-32BE\n"); | |
3479 | TestFullRoundtrip("UTF-32BE"); | |
3480 | log_verbose("Running exhaustive round trip test for UTF-32LE\n"); | |
3481 | TestFullRoundtrip("UTF-32LE"); | |
3482 | log_verbose("Running exhaustive round trip test for UTF-32\n"); | |
3483 | TestFullRoundtrip("UTF-32"); | |
3484 | log_verbose("Running exhaustive round trip test for UTF-7\n"); | |
3485 | TestFullRoundtrip("UTF-7"); | |
3486 | log_verbose("Running exhaustive round trip test for UTF-7\n"); | |
3487 | TestFullRoundtrip("UTF-7,version=1"); | |
3488 | log_verbose("Running exhaustive round trip test for IMAP-mailbox-name\n"); | |
3489 | TestFullRoundtrip("IMAP-mailbox-name"); | |
3490 | log_verbose("Running exhaustive round trip test for GB18030\n"); | |
3491 | TestFullRoundtrip("GB18030"); | |
3492 | } | |
3493 | } | |
3494 | ||
3495 | static void | |
3496 | TestSCSU() { | |
3497 | ||
3498 | static const uint16_t germanUTF16[]={ | |
3499 | 0x00d6, 0x006c, 0x0020, 0x0066, 0x006c, 0x0069, 0x0065, 0x00df, 0x0074 | |
3500 | }; | |
3501 | ||
3502 | static const uint8_t germanSCSU[]={ | |
3503 | 0xd6, 0x6c, 0x20, 0x66, 0x6c, 0x69, 0x65, 0xdf, 0x74 | |
3504 | }; | |
3505 | ||
3506 | static const uint16_t russianUTF16[]={ | |
3507 | 0x041c, 0x043e, 0x0441, 0x043a, 0x0432, 0x0430 | |
3508 | }; | |
3509 | ||
3510 | static const uint8_t russianSCSU[]={ | |
3511 | 0x12, 0x9c, 0xbe, 0xc1, 0xba, 0xb2, 0xb0 | |
3512 | }; | |
3513 | ||
3514 | static const uint16_t japaneseUTF16[]={ | |
3515 | 0x3000, 0x266a, 0x30ea, 0x30f3, 0x30b4, 0x53ef, 0x611b, | |
3516 | 0x3044, 0x3084, 0x53ef, 0x611b, 0x3044, 0x3084, 0x30ea, 0x30f3, | |
3517 | 0x30b4, 0x3002, 0x534a, 0x4e16, 0x7d00, 0x3082, 0x524d, 0x306b, | |
3518 | 0x6d41, 0x884c, 0x3057, 0x305f, 0x300c, 0x30ea, 0x30f3, 0x30b4, | |
3519 | 0x306e, 0x6b4c, 0x300d, 0x304c, 0x3074, 0x3063, 0x305f, 0x308a, | |
3520 | 0x3059, 0x308b, 0x304b, 0x3082, 0x3057, 0x308c, 0x306a, 0x3044, | |
3521 | 0x3002, 0x7c73, 0x30a2, 0x30c3, 0x30d7, 0x30eb, 0x30b3, 0x30f3, | |
3522 | 0x30d4, 0x30e5, 0x30fc, 0x30bf, 0x793e, 0x306e, 0x30d1, 0x30bd, | |
3523 | 0x30b3, 0x30f3, 0x300c, 0x30de, 0x30c3, 0x30af, 0xff08, 0x30de, | |
3524 | 0x30c3, 0x30ad, 0x30f3, 0x30c8, 0x30c3, 0x30b7, 0x30e5, 0xff09, | |
3525 | 0x300d, 0x3092, 0x3001, 0x3053, 0x3088, 0x306a, 0x304f, 0x611b, | |
3526 | 0x3059, 0x308b, 0x4eba, 0x305f, 0x3061, 0x306e, 0x3053, 0x3068, | |
3527 | 0x3060, 0x3002, 0x300c, 0x30a2, 0x30c3, 0x30d7, 0x30eb, 0x4fe1, | |
3528 | 0x8005, 0x300d, 0x306a, 0x3093, 0x3066, 0x8a00, 0x3044, 0x65b9, | |
3529 | 0x307e, 0x3067, 0x3042, 0x308b, 0x3002 | |
3530 | }; | |
3531 | ||
3532 | /* SCSUEncoder produces a slightly longer result (179B vs. 178B) because of one different choice: | |
3533 | it uses an SQn once where a longer look-ahead could have shown that SCn is more efficient */ | |
3534 | static const uint8_t japaneseSCSU[]={ | |
3535 | 0x08, 0x00, 0x1b, 0x4c, 0xea, 0x16, 0xca, 0xd3, 0x94, 0x0f, 0x53, 0xef, 0x61, 0x1b, 0xe5, 0x84, | |
3536 | 0xc4, 0x0f, 0x53, 0xef, 0x61, 0x1b, 0xe5, 0x84, 0xc4, 0x16, 0xca, 0xd3, 0x94, 0x08, 0x02, 0x0f, | |
3537 | 0x53, 0x4a, 0x4e, 0x16, 0x7d, 0x00, 0x30, 0x82, 0x52, 0x4d, 0x30, 0x6b, 0x6d, 0x41, 0x88, 0x4c, | |
3538 | 0xe5, 0x97, 0x9f, 0x08, 0x0c, 0x16, 0xca, 0xd3, 0x94, 0x15, 0xae, 0x0e, 0x6b, 0x4c, 0x08, 0x0d, | |
3539 | 0x8c, 0xb4, 0xa3, 0x9f, 0xca, 0x99, 0xcb, 0x8b, 0xc2, 0x97, 0xcc, 0xaa, 0x84, 0x08, 0x02, 0x0e, | |
3540 | 0x7c, 0x73, 0xe2, 0x16, 0xa3, 0xb7, 0xcb, 0x93, 0xd3, 0xb4, 0xc5, 0xdc, 0x9f, 0x0e, 0x79, 0x3e, | |
3541 | 0x06, 0xae, 0xb1, 0x9d, 0x93, 0xd3, 0x08, 0x0c, 0xbe, 0xa3, 0x8f, 0x08, 0x88, 0xbe, 0xa3, 0x8d, | |
3542 | 0xd3, 0xa8, 0xa3, 0x97, 0xc5, 0x17, 0x89, 0x08, 0x0d, 0x15, 0xd2, 0x08, 0x01, 0x93, 0xc8, 0xaa, | |
3543 | 0x8f, 0x0e, 0x61, 0x1b, 0x99, 0xcb, 0x0e, 0x4e, 0xba, 0x9f, 0xa1, 0xae, 0x93, 0xa8, 0xa0, 0x08, | |
3544 | 0x02, 0x08, 0x0c, 0xe2, 0x16, 0xa3, 0xb7, 0xcb, 0x0f, 0x4f, 0xe1, 0x80, 0x05, 0xec, 0x60, 0x8d, | |
3545 | 0xea, 0x06, 0xd3, 0xe6, 0x0f, 0x8a, 0x00, 0x30, 0x44, 0x65, 0xb9, 0xe4, 0xfe, 0xe7, 0xc2, 0x06, | |
3546 | 0xcb, 0x82 | |
3547 | }; | |
3548 | ||
3549 | static const uint16_t allFeaturesUTF16[]={ | |
3550 | 0x0041, 0x00df, 0x0401, 0x015f, 0x00df, 0x01df, 0xf000, 0xdbff, | |
3551 | 0xdfff, 0x000d, 0x000a, 0x0041, 0x00df, 0x0401, 0x015f, 0x00df, | |
3552 | 0x01df, 0xf000, 0xdbff, 0xdfff | |
3553 | }; | |
3554 | ||
3555 | /* see comment at japaneseSCSU: the same kind of different choice yields a slightly shorter | |
3556 | * result here (34B vs. 35B) | |
3557 | */ | |
3558 | static const uint8_t allFeaturesSCSU[]={ | |
3559 | 0x41, 0xdf, 0x12, 0x81, 0x03, 0x5f, 0x10, 0xdf, 0x1b, 0x03, | |
3560 | 0xdf, 0x1c, 0x88, 0x80, 0x0b, 0xbf, 0xff, 0xff, 0x0d, 0x0a, | |
3561 | 0x41, 0x10, 0xdf, 0x12, 0x81, 0x03, 0x5f, 0x10, 0xdf, 0x13, | |
3562 | 0xdf, 0x14, 0x80, 0x15, 0xff | |
3563 | }; | |
3564 | static const uint16_t monkeyIn[]={ | |
3565 | 0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A, | |
3566 | 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A, | |
3567 | 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A, | |
3568 | 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A, | |
3569 | 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A, | |
3570 | 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A, | |
3571 | 0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A, | |
3572 | 0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A, | |
3573 | 0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A, | |
3574 | 0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A, | |
3575 | 0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A, | |
3576 | 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, | |
3577 | 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, | |
3578 | 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, | |
3579 | 0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A, | |
3580 | 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A, | |
3581 | 0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A, | |
3582 | 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A, | |
3583 | 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A, | |
3584 | /* test non-BMP code points */ | |
3585 | 0xD869, 0xDE99, 0xD869, 0xDE9C, 0xD869, 0xDE9D, 0xD869, 0xDE9E, 0xD869, 0xDE9F, | |
3586 | 0xD869, 0xDEA0, 0xD869, 0xDEA5, 0xD869, 0xDEA6, 0xD869, 0xDEA7, 0xD869, 0xDEA8, | |
3587 | 0xD869, 0xDEAB, 0xD869, 0xDEAC, 0xD869, 0xDEAD, 0xD869, 0xDEAE, 0xD869, 0xDEAF, | |
3588 | 0xD869, 0xDEB0, 0xD869, 0xDEB1, 0xD869, 0xDEB3, 0xD869, 0xDEB5, 0xD869, 0xDEB6, | |
3589 | 0xD869, 0xDEB7, 0xD869, 0xDEB8, 0xD869, 0xDEB9, 0xD869, 0xDEBA, 0xD869, 0xDEBB, | |
3590 | 0xD869, 0xDEBC, 0xD869, 0xDEBD, 0xD869, 0xDEBE, 0xD869, 0xDEBF, 0xD869, 0xDEC0, | |
3591 | 0xD869, 0xDEC1, 0xD869, 0xDEC2, 0xD869, 0xDEC3, 0xD869, 0xDEC4, 0xD869, 0xDEC8, | |
3592 | 0xD869, 0xDECA, 0xD869, 0xDECB, 0xD869, 0xDECD, 0xD869, 0xDECE, 0xD869, 0xDECF, | |
3593 | 0xD869, 0xDED0, 0xD869, 0xDED1, 0xD869, 0xDED2, 0xD869, 0xDED3, 0xD869, 0xDED4, | |
3594 | 0xD869, 0xDED5, 0xD800, 0xDC00, 0xD800, 0xDC00, 0xD800, 0xDC00, 0xDBFF, 0xDFFF, | |
3595 | 0xDBFF, 0xDFFF, 0xDBFF, 0xDFFF, | |
3596 | ||
3597 | ||
3598 | 0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A, | |
3599 | 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A, | |
3600 | 0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A, | |
3601 | 0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A, | |
3602 | 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A, | |
3603 | }; | |
3604 | static const char *fTestCases [] = { | |
3605 | "\\ud800\\udc00", /* smallest surrogate*/ | |
3606 | "\\ud8ff\\udcff", | |
3607 | "\\udBff\\udFff", /* largest surrogate pair*/ | |
3608 | "\\ud834\\udc00", | |
3609 | "\\U0010FFFF", | |
3610 | "Hello \\u9292 \\u9192 World!", | |
3611 | "Hell\\u0429o \\u9292 \\u9192 W\\u00e4rld!", | |
3612 | "Hell\\u0429o \\u9292 \\u9292W\\u00e4rld!", | |
3613 | ||
3614 | "\\u0648\\u06c8", /* catch missing reset*/ | |
3615 | "\\u0648\\u06c8", | |
3616 | ||
3617 | "\\u4444\\uE001", /* lowest quotable*/ | |
3618 | "\\u4444\\uf2FF", /* highest quotable*/ | |
3619 | "\\u4444\\uf188\\u4444", | |
3620 | "\\u4444\\uf188\\uf288", | |
3621 | "\\u4444\\uf188abc\\u0429\\uf288", | |
3622 | "\\u9292\\u2222", | |
3623 | "Hell\\u0429\\u04230o \\u9292 \\u9292W\\u00e4\\u0192rld!", | |
3624 | "Hell\\u0429o \\u9292 \\u9292W\\u00e4rld!", | |
3625 | "Hello World!123456", | |
3626 | "Hello W\\u0081\\u011f\\u0082!", /* Latin 1 run*/ | |
3627 | ||
3628 | "abc\\u0301\\u0302", /* uses SQn for u301 u302*/ | |
3629 | "abc\\u4411d", /* uses SQU*/ | |
3630 | "abc\\u4411\\u4412d",/* uses SCU*/ | |
3631 | "abc\\u0401\\u0402\\u047f\\u00a5\\u0405", /* uses SQn for ua5*/ | |
3632 | "\\u9191\\u9191\\u3041\\u9191\\u3041\\u3041\\u3000", /* SJIS like data*/ | |
3633 | "\\u9292\\u2222", | |
3634 | "\\u9191\\u9191\\u3041\\u9191\\u3041\\u3041\\u3000", | |
3635 | "\\u9999\\u3051\\u300c\\u9999\\u9999\\u3060\\u9999\\u3065\\u3065\\u3065\\u300c", | |
3636 | "\\u3000\\u266a\\u30ea\\u30f3\\u30b4\\u53ef\\u611b\\u3044\\u3084\\u53ef\\u611b\\u3044\\u3084\\u30ea\\u30f3\\u30b4\\u3002", | |
3637 | ||
3638 | "", /* empty input*/ | |
3639 | "\\u0000", /* smallest BMP character*/ | |
3640 | "\\uFFFF", /* largest BMP character*/ | |
3641 | ||
3642 | /* regression tests*/ | |
3643 | "\\u6441\\ub413\\ua733\\uf8fe\\ueedb\\u587f\\u195f\\u4899\\uf23d\\u49fd\\u0aac\\u5792\\ufc22\\ufc3c\\ufc46\\u00aa", | |
3644 | "\\u00df\\u01df\\uf000\\udbff\\udfff\\u000d\n\\u0041\\u00df\\u0401\\u015f\\u00df\\u01df\\uf000\\udbff\\udfff", | |
3645 | "\\u30f9\\u8321\\u05e5\\u181c\\ud72b\\u2019\\u99c9\\u2f2f\\uc10c\\u82e1\\u2c4d\\u1ebc\\u6013\\u66dc\\ubbde\\u94a5\\u4726\\u74af\\u3083\\u55b9\\u000c", | |
3646 | "\\u0041\\u00df\\u0401\\u015f", | |
3647 | "\\u9066\\u2123abc", | |
3648 | "\\ud266\\u43d7\\u\\ue386\\uc9c0\\u4a6b\\u9222\\u901f\\u7410\\ua63f\\u539b\\u9596\\u482e\\u9d47\\ucfe4\\u7b71\\uc280\\uf26a\\u982f\\u862a\\u4edd\\uf513\\ufda6\\u869d\\u2ee0\\ua216\\u3ff6\\u3c70\\u89c0\\u9576\\ud5ec\\ubfda\\u6cca\\u5bb3\\ubcea\\u554c\\u914e\\ufa4a\\uede3\\u2990\\ud2f5\\u2729\\u5141\\u0f26\\uccd8\\u5413\\ud196\\ubbe2\\u51b9\\u9b48\\u0dc8\\u2195\\u21a2\\u21e9\\u00e4\\u9d92\\u0bc0\\u06c5", | |
3649 | "\\uf95b\\u2458\\u2468\\u0e20\\uf51b\\ue36e\\ubfc1\\u0080\\u02dd\\uf1b5\\u0cf3\\u6059\\u7489", | |
3650 | }; | |
3651 | int i=0; | |
3652 | for(;i<sizeof(fTestCases)/sizeof(*fTestCases);i++){ | |
3653 | const char* cSrc = fTestCases[i]; | |
3654 | UErrorCode status = U_ZERO_ERROR; | |
3655 | int32_t cSrcLen,srcLen; | |
3656 | UChar* src; | |
3657 | /* UConverter* cnv = ucnv_open("SCSU",&status); */ | |
73c04bcf | 3658 | cSrcLen = srcLen = (int32_t)uprv_strlen(fTestCases[i]); |
b75a7d8f A |
3659 | src = (UChar*) malloc((sizeof(UChar) * srcLen) + sizeof(UChar)); |
3660 | srcLen=unescape(src,srcLen,cSrc,cSrcLen,&status); | |
3661 | log_verbose("Testing roundtrip for src: %s at index :%d\n",cSrc,i); | |
3662 | TestConv(src,srcLen,"SCSU","Coverage",NULL,0); | |
3663 | free(src); | |
3664 | } | |
3665 | TestConv(allFeaturesUTF16,(sizeof(allFeaturesUTF16)/2),"SCSU","all features", (char *)allFeaturesSCSU,sizeof(allFeaturesSCSU)); | |
3666 | TestConv(allFeaturesUTF16,(sizeof(allFeaturesUTF16)/2),"SCSU","all features",(char *)allFeaturesSCSU,sizeof(allFeaturesSCSU)); | |
3667 | TestConv(japaneseUTF16,(sizeof(japaneseUTF16)/2),"SCSU","japaneese",(char *)japaneseSCSU,sizeof(japaneseSCSU)); | |
3668 | TestConv(japaneseUTF16,(sizeof(japaneseUTF16)/2),"SCSU,locale=ja","japaneese",(char *)japaneseSCSU,sizeof(japaneseSCSU)); | |
3669 | TestConv(germanUTF16,(sizeof(germanUTF16)/2),"SCSU","german",(char *)germanSCSU,sizeof(germanSCSU)); | |
3670 | TestConv(russianUTF16,(sizeof(russianUTF16)/2), "SCSU","russian",(char *)russianSCSU,sizeof(russianSCSU)); | |
3671 | TestConv(monkeyIn,(sizeof(monkeyIn)/2),"SCSU","monkey",NULL,0); | |
3672 | } | |
73c04bcf A |
3673 | |
3674 | #if !UCONFIG_NO_LEGACY_CONVERSION | |
b75a7d8f A |
3675 | static void TestJitterbug2346(){ |
3676 | char source[] = { 0x1b,0x24,0x42,0x3d,0x45,0x1b,0x28,0x4a,0x0d,0x0a, | |
3677 | 0x1b,0x24,0x42,0x3d,0x45,0x1b,0x28,0x4a,0x0d,0x0a}; | |
3678 | uint16_t expected[] = {0x91CD,0x000D,0x000A,0x91CD,0x000D,0x000A}; | |
3679 | ||
3680 | UChar uTarget[500]={'\0'}; | |
3681 | UChar* utarget=uTarget; | |
3682 | UChar* utargetLimit=uTarget+sizeof(uTarget)/2; | |
3683 | ||
3684 | char cTarget[500]={'\0'}; | |
3685 | char* ctarget=cTarget; | |
3686 | char* ctargetLimit=cTarget+sizeof(cTarget); | |
3687 | const char* csource=source; | |
3688 | UChar* temp = expected; | |
3689 | UErrorCode err=U_ZERO_ERROR; | |
3690 | ||
3691 | UConverter* conv =ucnv_open("ISO_2022_JP",&err); | |
3692 | if(U_FAILURE(err)) { | |
3693 | log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(err)); | |
3694 | return; | |
3695 | } | |
3696 | ucnv_toUnicode(conv,&utarget,utargetLimit,&csource,csource+sizeof(source),NULL,TRUE,&err); | |
3697 | if(U_FAILURE(err)) { | |
3698 | log_err("ISO_2022_JP to Unicode conversion failed: %s\n", u_errorName(err)); | |
3699 | return; | |
3700 | } | |
3701 | utargetLimit=utarget; | |
3702 | utarget = uTarget; | |
3703 | while(utarget<utargetLimit){ | |
3704 | if(*temp!=*utarget){ | |
3705 | ||
3706 | log_err("Expected : \\u%04X \t Got: \\u%04X\n",*utarget,(int)*temp) ; | |
3707 | } | |
3708 | utarget++; | |
3709 | temp++; | |
3710 | } | |
3711 | ucnv_fromUnicode(conv,&ctarget,ctargetLimit,(const UChar**)&utarget,utargetLimit,NULL,TRUE,&err); | |
3712 | if(U_FAILURE(err)) { | |
3713 | log_err("ISO_2022_JP from Unicode conversion failed: %s\n", u_errorName(err)); | |
3714 | return; | |
3715 | } | |
3716 | ctargetLimit=ctarget; | |
3717 | ctarget =cTarget; | |
3718 | ucnv_close(conv); | |
3719 | ||
3720 | ||
3721 | } | |
73c04bcf | 3722 | |
b75a7d8f A |
3723 | static void |
3724 | TestISO_2022_JP_1() { | |
3725 | /* test input */ | |
3726 | static const uint16_t in[]={ | |
3727 | 0x3000, 0x3001, 0x3002, 0x0020, 0xFF0E, 0x30FB, 0xFF1A, 0xFF1B, 0x000D, 0x000A, | |
3728 | 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, | |
3729 | 0x52C8, 0x52CC, 0x52CF, 0x52D1, 0x52D4, 0x52D6, 0x52DB, 0x52DC, 0x000D, 0x000A, | |
3730 | 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, | |
3731 | 0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F, 0x005C, 0x000D, 0x000A, | |
3732 | 0x301C, 0x2016, 0x2026, 0x2025, 0x2018, 0x2019, 0x201C, 0x000D, 0x000A, | |
3733 | 0x201D, 0x000D, 0x000A, | |
3734 | 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, | |
3735 | 0x4F94, 0x4F97, 0x52BA, 0x52BB, 0x52BD, 0x52C0, 0x52C4, 0x52C6, 0x000D, 0x000A, | |
3736 | 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, | |
3737 | 0x4F78, 0x4F79, 0x4F7A, 0x4F7D, 0x4F7E, 0x4F81, 0x4F82, 0x4F84, 0x000D, 0x000A, | |
3738 | 0x4F85, 0x4F89, 0x4F8A, 0x4F8C, 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x000D, 0x000A, | |
3739 | 0x52E1, 0x52E5, 0x52E8, 0x52E9, 0x000D, 0x000A | |
3740 | }; | |
3741 | const UChar* uSource; | |
3742 | const UChar* uSourceLimit; | |
3743 | const char* cSource; | |
3744 | const char* cSourceLimit; | |
3745 | UChar *uTargetLimit =NULL; | |
3746 | UChar *uTarget; | |
3747 | char *cTarget; | |
3748 | const char *cTargetLimit; | |
3749 | char *cBuf; | |
3750 | UChar *uBuf,*test; | |
3751 | int32_t uBufSize = 120; | |
3752 | UErrorCode errorCode=U_ZERO_ERROR; | |
3753 | UConverter *cnv; | |
3754 | ||
3755 | cnv=ucnv_open("ISO_2022_JP_1", &errorCode); | |
3756 | if(U_FAILURE(errorCode)) { | |
3757 | log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode)); | |
3758 | return; | |
3759 | } | |
3760 | ||
3761 | uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5); | |
3762 | cBuf =(char*)malloc(uBufSize * sizeof(char) * 5); | |
73c04bcf A |
3763 | uSource = (const UChar*)in; |
3764 | uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0])); | |
b75a7d8f A |
3765 | cTarget = cBuf; |
3766 | cTargetLimit = cBuf +uBufSize*5; | |
3767 | uTarget = uBuf; | |
3768 | uTargetLimit = uBuf+ uBufSize*5; | |
3769 | ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,NULL,TRUE, &errorCode); | |
3770 | if(U_FAILURE(errorCode)){ | |
3771 | log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
3772 | return; | |
3773 | } | |
3774 | cSource = cBuf; | |
3775 | cSourceLimit =cTarget; | |
3776 | test =uBuf; | |
3777 | ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,NULL,TRUE,&errorCode); | |
3778 | if(U_FAILURE(errorCode)){ | |
3779 | log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
3780 | return; | |
3781 | } | |
73c04bcf | 3782 | uSource = (const UChar*)in; |
b75a7d8f A |
3783 | while(uSource<uSourceLimit){ |
3784 | if(*test!=*uSource){ | |
3785 | ||
3786 | log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ; | |
3787 | } | |
3788 | uSource++; | |
3789 | test++; | |
3790 | } | |
3791 | /*ucnv_close(cnv); | |
3792 | cnv=ucnv_open("ISO_2022,locale=jp,version=1", &errorCode);*/ | |
3793 | /*Test for the condition where there is an invalid character*/ | |
3794 | ucnv_reset(cnv); | |
3795 | { | |
3796 | static const uint8_t source2[]={0x0e,0x24,0x053}; | |
3797 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character [ISO-2022-JP-1]"); | |
3798 | } | |
73c04bcf A |
3799 | TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); |
3800 | TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); | |
b75a7d8f A |
3801 | ucnv_close(cnv); |
3802 | free(uBuf); | |
3803 | free(cBuf); | |
3804 | } | |
3805 | ||
3806 | static void | |
3807 | TestISO_2022_JP_2() { | |
3808 | /* test input */ | |
3809 | static const uint16_t in[]={ | |
3810 | 0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A, | |
3811 | 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A, | |
3812 | 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A, | |
3813 | 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A, | |
3814 | 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A, | |
3815 | 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A, | |
3816 | 0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A, | |
3817 | 0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A, | |
3818 | 0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A, | |
3819 | 0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A, | |
3820 | 0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A, | |
3821 | 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, | |
3822 | 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, | |
3823 | 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, | |
3824 | 0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A, | |
3825 | 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A, | |
3826 | 0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A, | |
3827 | 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A, | |
3828 | 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A | |
3829 | }; | |
3830 | const UChar* uSource; | |
3831 | const UChar* uSourceLimit; | |
3832 | const char* cSource; | |
3833 | const char* cSourceLimit; | |
3834 | UChar *uTargetLimit =NULL; | |
3835 | UChar *uTarget; | |
3836 | char *cTarget; | |
3837 | const char *cTargetLimit; | |
3838 | char *cBuf; | |
3839 | UChar *uBuf,*test; | |
3840 | int32_t uBufSize = 120; | |
3841 | UErrorCode errorCode=U_ZERO_ERROR; | |
3842 | UConverter *cnv; | |
3843 | int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5); | |
3844 | int32_t* myOff= offsets; | |
3845 | cnv=ucnv_open("ISO_2022_JP_2", &errorCode); | |
3846 | if(U_FAILURE(errorCode)) { | |
3847 | log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode)); | |
3848 | return; | |
3849 | } | |
3850 | ||
3851 | uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5); | |
3852 | cBuf =(char*)malloc(uBufSize * sizeof(char) * 5); | |
73c04bcf A |
3853 | uSource = (const UChar*)in; |
3854 | uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0])); | |
b75a7d8f A |
3855 | cTarget = cBuf; |
3856 | cTargetLimit = cBuf +uBufSize*5; | |
3857 | uTarget = uBuf; | |
3858 | uTargetLimit = uBuf+ uBufSize*5; | |
3859 | ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode); | |
3860 | if(U_FAILURE(errorCode)){ | |
3861 | log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
3862 | return; | |
3863 | } | |
3864 | cSource = cBuf; | |
3865 | cSourceLimit =cTarget; | |
3866 | test =uBuf; | |
3867 | myOff=offsets; | |
3868 | ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode); | |
3869 | if(U_FAILURE(errorCode)){ | |
3870 | log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
3871 | return; | |
3872 | } | |
73c04bcf | 3873 | uSource = (const UChar*)in; |
b75a7d8f A |
3874 | while(uSource<uSourceLimit){ |
3875 | if(*test!=*uSource){ | |
3876 | ||
3877 | log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ; | |
3878 | } | |
3879 | uSource++; | |
3880 | test++; | |
3881 | } | |
73c04bcf A |
3882 | TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); |
3883 | TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); | |
3884 | TestToAndFromUChars(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); | |
b75a7d8f A |
3885 | /*Test for the condition where there is an invalid character*/ |
3886 | ucnv_reset(cnv); | |
3887 | { | |
3888 | static const uint8_t source2[]={0x0e,0x24,0x053}; | |
3889 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character [ISO-2022-JP-2]"); | |
3890 | } | |
3891 | ucnv_close(cnv); | |
3892 | free(uBuf); | |
3893 | free(cBuf); | |
3894 | free(offsets); | |
3895 | } | |
3896 | ||
3897 | static void | |
3898 | TestISO_2022_KR() { | |
3899 | /* test input */ | |
3900 | static const uint16_t in[]={ | |
fd0068a8 A |
3901 | 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D |
3902 | ,0x9F6C,0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04 | |
b75a7d8f A |
3903 | ,0xAC07,0xAC08,0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029 |
3904 | ,0x002A,0x002B,0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB | |
fd0068a8 | 3905 | ,0x53CD,0x53D4,0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2 |
b75a7d8f A |
3906 | ,0x53E3,0x53E4,0x000A,0x000D}; |
3907 | const UChar* uSource; | |
3908 | const UChar* uSourceLimit; | |
3909 | const char* cSource; | |
3910 | const char* cSourceLimit; | |
3911 | UChar *uTargetLimit =NULL; | |
3912 | UChar *uTarget; | |
3913 | char *cTarget; | |
3914 | const char *cTargetLimit; | |
3915 | char *cBuf; | |
3916 | UChar *uBuf,*test; | |
3917 | int32_t uBufSize = 120; | |
3918 | UErrorCode errorCode=U_ZERO_ERROR; | |
3919 | UConverter *cnv; | |
3920 | int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5); | |
3921 | int32_t* myOff= offsets; | |
3922 | cnv=ucnv_open("ISO_2022,locale=kr", &errorCode); | |
3923 | if(U_FAILURE(errorCode)) { | |
3924 | log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode)); | |
3925 | return; | |
3926 | } | |
3927 | ||
3928 | uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5); | |
3929 | cBuf =(char*)malloc(uBufSize * sizeof(char) * 5); | |
73c04bcf A |
3930 | uSource = (const UChar*)in; |
3931 | uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0])); | |
b75a7d8f A |
3932 | cTarget = cBuf; |
3933 | cTargetLimit = cBuf +uBufSize*5; | |
3934 | uTarget = uBuf; | |
3935 | uTargetLimit = uBuf+ uBufSize*5; | |
3936 | ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode); | |
3937 | if(U_FAILURE(errorCode)){ | |
3938 | log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
3939 | return; | |
3940 | } | |
3941 | cSource = cBuf; | |
3942 | cSourceLimit =cTarget; | |
3943 | test =uBuf; | |
3944 | myOff=offsets; | |
3945 | ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode); | |
3946 | if(U_FAILURE(errorCode)){ | |
3947 | log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
3948 | return; | |
3949 | } | |
73c04bcf | 3950 | uSource = (const UChar*)in; |
b75a7d8f A |
3951 | while(uSource<uSourceLimit){ |
3952 | if(*test!=*uSource){ | |
3953 | log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,*test) ; | |
3954 | } | |
3955 | uSource++; | |
3956 | test++; | |
3957 | } | |
3958 | TestGetNextUChar2022(cnv, cBuf, cTarget, in, "ISO-2022-KR encoding"); | |
73c04bcf A |
3959 | TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); |
3960 | TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); | |
3961 | TestToAndFromUChars(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); | |
b75a7d8f A |
3962 | TestJitterbug930("csISO2022KR"); |
3963 | /*Test for the condition where there is an invalid character*/ | |
3964 | ucnv_reset(cnv); | |
3965 | { | |
3966 | static const uint8_t source2[]={0x1b,0x24,0x053}; | |
374ca955 | 3967 | ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); |
b75a7d8f A |
3968 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ILLEGAL_ESCAPE_SEQUENCE, "an invalid character [ISO-2022-KR]"); |
3969 | } | |
3970 | ucnv_close(cnv); | |
3971 | free(uBuf); | |
3972 | free(cBuf); | |
3973 | free(offsets); | |
3974 | } | |
3975 | ||
3976 | static void | |
3977 | TestISO_2022_KR_1() { | |
3978 | /* test input */ | |
3979 | static const uint16_t in[]={ | |
3980 | 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D | |
3981 | ,0x9F6C,0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04 | |
3982 | ,0xAC07,0xAC08,0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029 | |
3983 | ,0x002A,0x002B,0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB | |
3984 | ,0x53CD,0x53D4,0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2 | |
3985 | ,0x53E3,0x53E4,0x000A,0x000D}; | |
3986 | const UChar* uSource; | |
3987 | const UChar* uSourceLimit; | |
3988 | const char* cSource; | |
3989 | const char* cSourceLimit; | |
3990 | UChar *uTargetLimit =NULL; | |
3991 | UChar *uTarget; | |
3992 | char *cTarget; | |
3993 | const char *cTargetLimit; | |
3994 | char *cBuf; | |
3995 | UChar *uBuf,*test; | |
3996 | int32_t uBufSize = 120; | |
3997 | UErrorCode errorCode=U_ZERO_ERROR; | |
3998 | UConverter *cnv; | |
3999 | int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5); | |
4000 | int32_t* myOff= offsets; | |
4001 | cnv=ucnv_open("ibm-25546", &errorCode); | |
4002 | if(U_FAILURE(errorCode)) { | |
4003 | log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode)); | |
4004 | return; | |
4005 | } | |
4006 | ||
4007 | uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5); | |
4008 | cBuf =(char*)malloc(uBufSize * sizeof(char) * 5); | |
73c04bcf A |
4009 | uSource = (const UChar*)in; |
4010 | uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0])); | |
b75a7d8f A |
4011 | cTarget = cBuf; |
4012 | cTargetLimit = cBuf +uBufSize*5; | |
4013 | uTarget = uBuf; | |
4014 | uTargetLimit = uBuf+ uBufSize*5; | |
4015 | ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode); | |
4016 | if(U_FAILURE(errorCode)){ | |
4017 | log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
4018 | return; | |
4019 | } | |
4020 | cSource = cBuf; | |
4021 | cSourceLimit =cTarget; | |
4022 | test =uBuf; | |
4023 | myOff=offsets; | |
4024 | ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode); | |
4025 | if(U_FAILURE(errorCode)){ | |
4026 | log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
4027 | return; | |
4028 | } | |
73c04bcf | 4029 | uSource = (const UChar*)in; |
b75a7d8f A |
4030 | while(uSource<uSourceLimit){ |
4031 | if(*test!=*uSource){ | |
4032 | log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,*test) ; | |
4033 | } | |
4034 | uSource++; | |
4035 | test++; | |
4036 | } | |
4037 | ucnv_reset(cnv); | |
4038 | TestGetNextUChar2022(cnv, cBuf, cTarget, in, "ISO-2022-KR encoding"); | |
73c04bcf A |
4039 | TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); |
4040 | TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); | |
b75a7d8f | 4041 | ucnv_reset(cnv); |
73c04bcf | 4042 | TestToAndFromUChars(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); |
b75a7d8f A |
4043 | /*Test for the condition where there is an invalid character*/ |
4044 | ucnv_reset(cnv); | |
4045 | { | |
4046 | static const uint8_t source2[]={0x1b,0x24,0x053}; | |
374ca955 | 4047 | ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); |
b75a7d8f A |
4048 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ILLEGAL_ESCAPE_SEQUENCE, "an invalid character [ISO-2022-KR]"); |
4049 | } | |
4050 | ucnv_close(cnv); | |
4051 | free(uBuf); | |
4052 | free(cBuf); | |
4053 | free(offsets); | |
4054 | } | |
4055 | ||
4056 | static void TestJitterbug2411(){ | |
73c04bcf | 4057 | static const char* source = "\x1b\x24\x29\x43\x6b\x6b\x6e\x6e\x6a\x68\x70\x6f\x69\x75\x79\x71\x77\x65\x68\x67\x0A" |
b75a7d8f A |
4058 | "\x1b\x24\x29\x43\x6a\x61\x73\x64\x66\x6a\x61\x73\x64\x66\x68\x6f\x69\x75\x79\x1b\x24\x29\x43"; |
4059 | UConverter* kr=NULL, *kr1=NULL; | |
4060 | UErrorCode errorCode = U_ZERO_ERROR; | |
4061 | UChar tgt[100]={'\0'}; | |
4062 | UChar* target = tgt; | |
4063 | UChar* targetLimit = target+100; | |
4064 | kr=ucnv_open("iso-2022-kr", &errorCode); | |
4065 | if(U_FAILURE(errorCode)) { | |
4066 | log_data_err("Unable to open a iso-2022-kr converter: %s\n", u_errorName(errorCode)); | |
4067 | return; | |
4068 | } | |
4069 | ucnv_toUnicode(kr,&target,targetLimit,&source,source+uprv_strlen(source),NULL,TRUE,&errorCode); | |
4070 | if(U_FAILURE(errorCode)) { | |
4071 | log_err("iso-2022-kr cannot handle multiple escape sequences : %s\n", u_errorName(errorCode)); | |
4072 | return; | |
4073 | } | |
4074 | kr1 = ucnv_open("ibm-25546", &errorCode); | |
4075 | if(U_FAILURE(errorCode)) { | |
4076 | log_data_err("Unable to open a iso-2022-kr_1 converter: %s\n", u_errorName(errorCode)); | |
4077 | return; | |
4078 | } | |
4079 | target = tgt; | |
4080 | targetLimit = target+100; | |
4081 | ucnv_toUnicode(kr,&target,targetLimit,&source,source+uprv_strlen(source),NULL,TRUE,&errorCode); | |
4082 | ||
4083 | if(U_FAILURE(errorCode)) { | |
4084 | log_err("iso-2022-kr_1 cannot handle multiple escape sequences : %s\n", u_errorName(errorCode)); | |
4085 | return; | |
4086 | } | |
4087 | ||
4088 | ucnv_close(kr); | |
4089 | ucnv_close(kr1); | |
4090 | ||
4091 | } | |
4092 | ||
4093 | static void | |
4094 | TestJIS(){ | |
374ca955 | 4095 | /* From Unicode moved to testdata/conversion.txt */ |
b75a7d8f A |
4096 | /*To Unicode*/ |
4097 | { | |
73c04bcf | 4098 | static const uint8_t sampleTextJIS[] = { |
b75a7d8f A |
4099 | 0x1b,0x28,0x48,0x41,0x42, /*jis-Roman*/ |
4100 | 0x1b,0x28,0x49,0x41,0x42, /*Katakana Set*/ | |
4101 | 0x1b,0x26,0x40,0x1b,0x24,0x42,0x21,0x21 /*recognize and ignore <esc>&@*/ | |
4102 | }; | |
73c04bcf | 4103 | static const uint16_t expectedISO2022JIS[] = { |
b75a7d8f A |
4104 | 0x0041, 0x0042, |
4105 | 0xFF81, 0xFF82, | |
4106 | 0x3000 | |
4107 | }; | |
73c04bcf | 4108 | static const int32_t toISO2022JISOffs[]={ |
b75a7d8f A |
4109 | 3,4, |
4110 | 8,9, | |
4111 | 16 | |
4112 | }; | |
4113 | ||
73c04bcf | 4114 | static const uint8_t sampleTextJIS7[] = { |
b75a7d8f A |
4115 | 0x1b,0x28,0x48,0x41,0x42, /*JIS7-Roman*/ |
4116 | 0x1b,0x28,0x49,0x41,0x42, /*Katakana Set*/ | |
4117 | 0x1b,0x24,0x42,0x21,0x21, | |
4118 | 0x0e,0x41,0x42,0x0f, /*Test Katakana set with SI and SO */ | |
4119 | 0x21,0x22, | |
4120 | 0x1b,0x26,0x40,0x1b,0x24,0x42,0x21,0x21 /*recognize and ignore <esc>&@*/ | |
4121 | }; | |
73c04bcf | 4122 | static const uint16_t expectedISO2022JIS7[] = { |
b75a7d8f A |
4123 | 0x0041, 0x0042, |
4124 | 0xFF81, 0xFF82, | |
4125 | 0x3000, | |
4126 | 0xFF81, 0xFF82, | |
4127 | 0x3001, | |
4128 | 0x3000 | |
4129 | }; | |
73c04bcf | 4130 | static const int32_t toISO2022JIS7Offs[]={ |
b75a7d8f A |
4131 | 3,4, |
4132 | 8,9, | |
4133 | 13,16, | |
4134 | 17, | |
4135 | 19,27 | |
4136 | }; | |
73c04bcf | 4137 | static const uint8_t sampleTextJIS8[] = { |
b75a7d8f A |
4138 | 0x1b,0x28,0x48,0x41,0x42, /*JIS8-Roman*/ |
4139 | 0xa1,0xc8,0xd9,/*Katakana Set*/ | |
4140 | 0x1b,0x28,0x42, | |
4141 | 0x41,0x42, | |
4142 | 0xb1,0xc3, /*Katakana Set*/ | |
4143 | 0x1b,0x24,0x42,0x21,0x21 | |
4144 | }; | |
73c04bcf | 4145 | static const uint16_t expectedISO2022JIS8[] = { |
b75a7d8f A |
4146 | 0x0041, 0x0042, |
4147 | 0xff61, 0xff88, 0xff99, | |
4148 | 0x0041, 0x0042, | |
4149 | 0xff71, 0xff83, | |
4150 | 0x3000 | |
4151 | }; | |
73c04bcf | 4152 | static const int32_t toISO2022JIS8Offs[]={ |
b75a7d8f A |
4153 | 3, 4, 5, 6, |
4154 | 7, 11, 12, 13, | |
4155 | 14, 18, | |
4156 | }; | |
4157 | ||
4158 | testConvertToU(sampleTextJIS,sizeof(sampleTextJIS),expectedISO2022JIS, | |
4159 | sizeof(expectedISO2022JIS)/sizeof(expectedISO2022JIS[0]),"JIS", toISO2022JISOffs,TRUE); | |
4160 | testConvertToU(sampleTextJIS7,sizeof(sampleTextJIS7),expectedISO2022JIS7, | |
4161 | sizeof(expectedISO2022JIS7)/sizeof(expectedISO2022JIS7[0]),"JIS7", toISO2022JIS7Offs,TRUE); | |
4162 | testConvertToU(sampleTextJIS8,sizeof(sampleTextJIS8),expectedISO2022JIS8, | |
4163 | sizeof(expectedISO2022JIS8)/sizeof(expectedISO2022JIS8[0]),"JIS8", toISO2022JIS8Offs,TRUE); | |
4164 | } | |
4165 | ||
4166 | } | |
4167 | ||
4168 | static void TestJitterbug915(){ | |
4169 | /* tests for roundtripping of the below sequence | |
4170 | \x1b$)G\x0E#!#"###$#%#&#'#(#)#*#+ / *plane 1 * / | |
4171 | \x1b$*H\x1bN"!\x1bN""\x1bN"#\x1bN"$\x1bN"% / *plane 2 * / | |
4172 | \x1b$+I\x1bO"D\x1bO"E\x1bO"F\x1bO"G\x1bO"H / *plane 3 * / | |
4173 | \x1b$+J\x1bO!D\x1bO!E\x1bO"j\x1bO"k\x1bO"l / *plane 4 * / | |
4174 | \x1b$+K\x1bO!t\x1bO"P\x1bO"Q\x1bO#7\x1bO"\ / *plane 5 * / | |
4175 | \x1b$+L\x1bO!#\x1bO",\x1bO#N\x1bO!n\x1bO#q / *plane 6 * / | |
4176 | \x1b$+M\x1bO"q\x1bO!N\x1bO!j\x1bO#:\x1bO#o / *plane 7 * / | |
4177 | */ | |
73c04bcf | 4178 | static const char cSource[]={ |
b75a7d8f A |
4179 | 0x1B, 0x24, 0x29, 0x47, 0x0E, 0x23, 0x21, 0x23, 0x22, 0x23, |
4180 | 0x23, 0x23, 0x24, 0x23, 0x25, 0x23, 0x26, 0x23, 0x27, 0x23, | |
4181 | 0x28, 0x23, 0x29, 0x23, 0x2A, 0x23, 0x2B, 0x0F, 0x2F, 0x2A, | |
4182 | 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, 0x31, 0x20, 0x2A, 0x2F, | |
4183 | 0x0D, 0x0A, 0x1B, 0x24, 0x2A, 0x48, 0x1B, 0x4E, 0x22, 0x21, | |
4184 | 0x1B, 0x4E, 0x22, 0x22, 0x1B, 0x4E, 0x22, 0x23, 0x1B, 0x4E, | |
374ca955 | 4185 | 0x22, 0x24, 0x1B, 0x4E, 0x22, 0x25, 0x2F, 0x2A, 0x70, |
b75a7d8f A |
4186 | 0x6C, 0x61, 0x6E, 0x65, 0x32, 0x2A, 0x2F, 0x20, 0x0D, 0x0A, |
4187 | 0x1B, 0x24, 0x2B, 0x49, 0x1B, 0x4F, 0x22, 0x44, 0x1B, 0x4F, | |
4188 | 0x22, 0x45, 0x1B, 0x4F, 0x22, 0x46, 0x1B, 0x4F, 0x22, 0x47, | |
374ca955 | 4189 | 0x1B, 0x4F, 0x22, 0x48, 0x2F, 0x2A, 0x70, 0x6C, 0x61, |
b75a7d8f A |
4190 | 0x6E, 0x65, 0x20, 0x33, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, |
4191 | 0x24, 0x2B, 0x4A, 0x1B, 0x4F, 0x21, 0x44, 0x1B, 0x4F, 0x21, | |
4192 | 0x45, 0x1B, 0x4F, 0x22, 0x6A, 0x1B, 0x4F, 0x22, 0x6B, 0x1B, | |
374ca955 | 4193 | 0x4F, 0x22, 0x6C, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, |
b75a7d8f A |
4194 | 0x65, 0x20, 0x34, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, |
4195 | 0x2B, 0x4B, 0x1B, 0x4F, 0x21, 0x74, 0x1B, 0x4F, 0x22, 0x50, | |
4196 | 0x1B, 0x4F, 0x22, 0x51, 0x1B, 0x4F, 0x23, 0x37, 0x1B, 0x4F, | |
374ca955 | 4197 | 0x22, 0x5C, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, |
b75a7d8f A |
4198 | 0x65, 0x20, 0x35, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, |
4199 | 0x2B, 0x4C, 0x1B, 0x4F, 0x21, 0x23, 0x1B, 0x4F, 0x22, 0x2C, | |
4200 | 0x1B, 0x4F, 0x23, 0x4E, 0x1B, 0x4F, 0x21, 0x6E, 0x1B, 0x4F, | |
374ca955 | 4201 | 0x23, 0x71, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, |
b75a7d8f A |
4202 | 0x20, 0x36, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, 0x2B, |
4203 | 0x4D, 0x1B, 0x4F, 0x22, 0x71, 0x1B, 0x4F, 0x21, 0x4E, 0x1B, | |
4204 | 0x4F, 0x21, 0x6A, 0x1B, 0x4F, 0x23, 0x3A, 0x1B, 0x4F, 0x23, | |
374ca955 A |
4205 | 0x6F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, |
4206 | 0x37, 0x20, 0x2A, 0x2F | |
b75a7d8f A |
4207 | }; |
4208 | UChar uTarget[500]={'\0'}; | |
4209 | UChar* utarget=uTarget; | |
4210 | UChar* utargetLimit=uTarget+sizeof(uTarget)/2; | |
4211 | ||
4212 | char cTarget[500]={'\0'}; | |
4213 | char* ctarget=cTarget; | |
4214 | char* ctargetLimit=cTarget+sizeof(cTarget); | |
4215 | const char* csource=cSource; | |
73c04bcf | 4216 | const char* tempSrc = cSource; |
b75a7d8f A |
4217 | UErrorCode err=U_ZERO_ERROR; |
4218 | ||
4219 | UConverter* conv =ucnv_open("ISO_2022_CN_EXT",&err); | |
4220 | if(U_FAILURE(err)) { | |
4221 | log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(err)); | |
4222 | return; | |
4223 | } | |
4224 | ucnv_toUnicode(conv,&utarget,utargetLimit,&csource,csource+sizeof(cSource),NULL,TRUE,&err); | |
4225 | if(U_FAILURE(err)) { | |
4226 | log_err("iso-2022-CN to Unicode conversion failed: %s\n", u_errorName(err)); | |
4227 | return; | |
4228 | } | |
4229 | utargetLimit=utarget; | |
4230 | utarget = uTarget; | |
4231 | ucnv_fromUnicode(conv,&ctarget,ctargetLimit,(const UChar**)&utarget,utargetLimit,NULL,TRUE,&err); | |
4232 | if(U_FAILURE(err)) { | |
4233 | log_err("iso-2022-CN from Unicode conversion failed: %s\n", u_errorName(err)); | |
4234 | return; | |
4235 | } | |
4236 | ctargetLimit=ctarget; | |
4237 | ctarget =cTarget; | |
4238 | while(ctarget<ctargetLimit){ | |
374ca955 A |
4239 | if(*ctarget != *tempSrc){ |
4240 | log_err("j915[%d] Expected : \\x%02X \t Got: \\x%02X\n", (int)(ctarget-cTarget), *ctarget,(int)*tempSrc) ; | |
b75a7d8f | 4241 | } |
374ca955 A |
4242 | ++ctarget; |
4243 | ++tempSrc; | |
b75a7d8f A |
4244 | } |
4245 | ||
4246 | ucnv_close(conv); | |
4247 | } | |
4248 | ||
4249 | static void | |
4250 | TestISO_2022_CN_EXT() { | |
4251 | /* test input */ | |
4252 | static const uint16_t in[]={ | |
4253 | /* test Non-BMP code points */ | |
4254 | 0xD869, 0xDE99, 0xD869, 0xDE9C, 0xD869, 0xDE9D, 0xD869, 0xDE9E, 0xD869, 0xDE9F, | |
4255 | 0xD869, 0xDEA0, 0xD869, 0xDEA5, 0xD869, 0xDEA6, 0xD869, 0xDEA7, 0xD869, 0xDEA8, | |
4256 | 0xD869, 0xDEAB, 0xD869, 0xDEAC, 0xD869, 0xDEAD, 0xD869, 0xDEAE, 0xD869, 0xDEAF, | |
4257 | 0xD869, 0xDEB0, 0xD869, 0xDEB1, 0xD869, 0xDEB3, 0xD869, 0xDEB5, 0xD869, 0xDEB6, | |
4258 | 0xD869, 0xDEB7, 0xD869, 0xDEB8, 0xD869, 0xDEB9, 0xD869, 0xDEBA, 0xD869, 0xDEBB, | |
4259 | 0xD869, 0xDEBC, 0xD869, 0xDEBD, 0xD869, 0xDEBE, 0xD869, 0xDEBF, 0xD869, 0xDEC0, | |
4260 | 0xD869, 0xDEC1, 0xD869, 0xDEC2, 0xD869, 0xDEC3, 0xD869, 0xDEC4, 0xD869, 0xDEC8, | |
4261 | 0xD869, 0xDECA, 0xD869, 0xDECB, 0xD869, 0xDECD, 0xD869, 0xDECE, 0xD869, 0xDECF, | |
4262 | 0xD869, 0xDED0, 0xD869, 0xDED1, 0xD869, 0xDED2, 0xD869, 0xDED3, 0xD869, 0xDED4, | |
4263 | 0xD869, 0xDED5, | |
4264 | ||
4265 | 0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A, | |
4266 | 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A, | |
4267 | 0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A, | |
4268 | 0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A, | |
4269 | 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A, | |
4270 | 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0x6332, 0x63B0, 0x643F, 0x000D, 0x000A, | |
4271 | 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, 0x6C05, 0x000D, 0x000A, | |
4272 | 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x000D, 0x000A, | |
4273 | 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A, | |
4274 | 0x9CE2, 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x000D, 0x000A, | |
4275 | 0x97A3, 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x000D, 0x000A, | |
4276 | 0x9ABA, 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x000D, 0x000A, | |
4277 | 0x9AD1, 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x000D, 0x000A, | |
4278 | 0x98E8, 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x3443, 0x3444, 0x000D, 0x000A, | |
4279 | 0x3445, 0x3449, 0x344A, 0x344B, 0x60F2, 0x60F3, 0x60F4, 0x60F5, 0x000D, 0x000A, | |
4280 | 0x60F6, 0x60F7, 0x60F8, 0x60F9, 0x60FA, 0x60FB, 0x60FC, 0x60FD, 0x000D, 0x000A, | |
4281 | 0x60FE, 0x60FF, 0x6100, 0x6101, 0x6102, 0x0041, 0x0042, 0x0043, 0x000D, 0x000A, | |
4282 | 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x000D, 0x000A, | |
4283 | ||
4284 | 0x33E7, 0x33E8, 0x33E9, 0x33EA, 0x000D, 0x000A | |
4285 | ||
4286 | }; | |
4287 | ||
4288 | const UChar* uSource; | |
4289 | const UChar* uSourceLimit; | |
4290 | const char* cSource; | |
4291 | const char* cSourceLimit; | |
4292 | UChar *uTargetLimit =NULL; | |
4293 | UChar *uTarget; | |
4294 | char *cTarget; | |
4295 | const char *cTargetLimit; | |
4296 | char *cBuf; | |
4297 | UChar *uBuf,*test; | |
4298 | int32_t uBufSize = 180; | |
4299 | UErrorCode errorCode=U_ZERO_ERROR; | |
4300 | UConverter *cnv; | |
4301 | int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5); | |
4302 | int32_t* myOff= offsets; | |
4303 | cnv=ucnv_open("ISO_2022,locale=cn,version=1", &errorCode); | |
4304 | if(U_FAILURE(errorCode)) { | |
4305 | log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode)); | |
4306 | return; | |
4307 | } | |
4308 | ||
4309 | uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5); | |
4310 | cBuf =(char*)malloc(uBufSize * sizeof(char) * 10); | |
73c04bcf A |
4311 | uSource = (const UChar*)in; |
4312 | uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0])); | |
b75a7d8f A |
4313 | cTarget = cBuf; |
4314 | cTargetLimit = cBuf +uBufSize*5; | |
4315 | uTarget = uBuf; | |
4316 | uTargetLimit = uBuf+ uBufSize*5; | |
4317 | ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode); | |
4318 | if(U_FAILURE(errorCode)){ | |
4319 | log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
4320 | return; | |
4321 | } | |
4322 | cSource = cBuf; | |
4323 | cSourceLimit =cTarget; | |
4324 | test =uBuf; | |
4325 | myOff=offsets; | |
4326 | ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode); | |
4327 | if(U_FAILURE(errorCode)){ | |
4328 | log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
4329 | return; | |
4330 | } | |
73c04bcf | 4331 | uSource = (const UChar*)in; |
b75a7d8f A |
4332 | while(uSource<uSourceLimit){ |
4333 | if(*test!=*uSource){ | |
4334 | log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ; | |
4335 | } | |
4336 | else{ | |
4337 | log_verbose(" Got: \\u%04X\n",(int)*test) ; | |
4338 | } | |
4339 | uSource++; | |
4340 | test++; | |
4341 | } | |
73c04bcf A |
4342 | TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); |
4343 | TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); | |
b75a7d8f A |
4344 | /*Test for the condition where there is an invalid character*/ |
4345 | ucnv_reset(cnv); | |
4346 | { | |
4347 | static const uint8_t source2[]={0x0e,0x24,0x053}; | |
4348 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character [ISO-2022-CN-EXT]"); | |
4349 | } | |
4350 | ucnv_close(cnv); | |
4351 | free(uBuf); | |
4352 | free(cBuf); | |
4353 | free(offsets); | |
4354 | } | |
4355 | ||
4356 | static void | |
4357 | TestISO_2022_CN() { | |
4358 | /* test input */ | |
4359 | static const uint16_t in[]={ | |
4360 | /* jitterbug 951 */ | |
4361 | 0xFF2D, 0xFF49, 0xFF58, 0xFF45, 0xFF44, 0x0020, 0xFF43, 0xFF48, 0xFF41, 0xFF52, | |
4362 | 0x0020, 0xFF06, 0x0020, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, | |
4363 | 0xFF18, 0xFF19, 0xFF10, 0x0020, 0xFF4E, 0xFF55, 0xFF4D, 0xFF42, 0xFF45, 0xFF52, | |
4364 | 0x0020, 0xFF54, 0xFF45, 0xFF53, 0xFF54, 0x0020, 0xFF4C, 0xFF49, 0xFF4E, 0xFF45, | |
4365 | 0x0020, 0x0045, 0x004e, 0x0044, | |
4366 | /**/ | |
4367 | 0x4E00, 0x4E00, 0x4E01, 0x4E03, 0x60F6, 0x60F7, 0x60F8, 0x60FB, 0x000D, 0x000A, | |
4368 | 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x60FB, 0x60FC, 0x000D, 0x000A, | |
4369 | 0x4E07, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x0042, 0x0043, 0x000D, 0x000A, | |
4370 | 0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A, | |
4371 | 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A, | |
4372 | 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0x6332, 0x63B0, 0x643F, 0x000D, 0x000A, | |
4373 | 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, 0x6C05, 0x000D, 0x000A, | |
4374 | 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A, | |
4375 | 0x9CE2, 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x000D, 0x000A, | |
4376 | 0x97A3, 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x000D, 0x000A, | |
4377 | 0x9ABA, 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x000D, 0x000A, | |
4378 | 0x9AD1, 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x000D, 0x000A, | |
4379 | 0x98E8, 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x60FE, 0x60FF, 0x000D, 0x000A, | |
4380 | 0x60F2, 0x60F3, 0x60F4, 0x60F5, 0x000D, 0x000A, 0x60F9, 0x60FA, 0x000D, 0x000A, | |
4381 | 0x6100, 0x6101, 0x0041, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x000D, 0x000A, | |
4382 | 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, | |
4383 | 0x2487, 0x2460, 0x2461, 0xFF20, 0xFF21, 0xFF22, 0x0049, 0x004A, 0x000D, 0x000A, | |
4384 | ||
4385 | }; | |
4386 | const UChar* uSource; | |
4387 | const UChar* uSourceLimit; | |
4388 | const char* cSource; | |
4389 | const char* cSourceLimit; | |
4390 | UChar *uTargetLimit =NULL; | |
4391 | UChar *uTarget; | |
4392 | char *cTarget; | |
4393 | const char *cTargetLimit; | |
4394 | char *cBuf; | |
4395 | UChar *uBuf,*test; | |
4396 | int32_t uBufSize = 180; | |
4397 | UErrorCode errorCode=U_ZERO_ERROR; | |
4398 | UConverter *cnv; | |
4399 | int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5); | |
4400 | int32_t* myOff= offsets; | |
4401 | cnv=ucnv_open("ISO_2022,locale=cn,version=0", &errorCode); | |
4402 | if(U_FAILURE(errorCode)) { | |
4403 | log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode)); | |
4404 | return; | |
4405 | } | |
4406 | ||
4407 | uBuf = (UChar*)malloc(uBufSize * sizeof(UChar)*5); | |
4408 | cBuf =(char*)malloc(uBufSize * sizeof(char) * 10); | |
73c04bcf A |
4409 | uSource = (const UChar*)in; |
4410 | uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0])); | |
b75a7d8f A |
4411 | cTarget = cBuf; |
4412 | cTargetLimit = cBuf +uBufSize*5; | |
4413 | uTarget = uBuf; | |
4414 | uTargetLimit = uBuf+ uBufSize*5; | |
4415 | ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode); | |
4416 | if(U_FAILURE(errorCode)){ | |
4417 | log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
4418 | return; | |
4419 | } | |
4420 | cSource = cBuf; | |
4421 | cSourceLimit =cTarget; | |
4422 | test =uBuf; | |
4423 | myOff=offsets; | |
4424 | ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode); | |
4425 | if(U_FAILURE(errorCode)){ | |
4426 | log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode)); | |
4427 | return; | |
4428 | } | |
73c04bcf | 4429 | uSource = (const UChar*)in; |
b75a7d8f A |
4430 | while(uSource<uSourceLimit){ |
4431 | if(*test!=*uSource){ | |
4432 | log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ; | |
4433 | } | |
4434 | else{ | |
4435 | log_verbose(" Got: \\u%04X\n",(int)*test) ; | |
4436 | } | |
4437 | uSource++; | |
4438 | test++; | |
4439 | } | |
4440 | TestGetNextUChar2022(cnv, cBuf, cTarget, in, "ISO-2022-CN encoding"); | |
73c04bcf A |
4441 | TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); |
4442 | TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); | |
4443 | TestToAndFromUChars(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv); | |
b75a7d8f A |
4444 | TestJitterbug930("csISO2022CN"); |
4445 | /*Test for the condition where there is an invalid character*/ | |
4446 | ucnv_reset(cnv); | |
4447 | { | |
4448 | static const uint8_t source2[]={0x0e,0x24,0x053}; | |
4449 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character [ISO-2022-CN]"); | |
4450 | } | |
4451 | ||
4452 | ucnv_close(cnv); | |
4453 | free(uBuf); | |
4454 | free(cBuf); | |
4455 | free(offsets); | |
4456 | } | |
4457 | ||
d5d484b0 A |
4458 | /* Tests for empty segments in ISO-2022-JP/KR/CN, HZ, check that UConverterCallbackReason is UCNV_IRREGULAR */ |
4459 | typedef struct { | |
4460 | const char * converterName; | |
4461 | const char * inputText; | |
4462 | int inputTextLength; | |
4463 | } EmptySegmentTest; | |
4464 | ||
4465 | /* Callback for TestJitterbug6175, should only get called for empty segment errors */ | |
4466 | static void UCNV_TO_U_CALLBACK_EMPTYSEGMENT( const void *context, UConverterToUnicodeArgs *toArgs, const char* codeUnits, | |
4467 | int32_t length, UConverterCallbackReason reason, UErrorCode * err ) { | |
4468 | if (reason > UCNV_IRREGULAR) | |
4469 | return; | |
4470 | if (reason != UCNV_IRREGULAR) | |
4471 | log_err("toUnicode callback invoked for empty segment but reason is not UCNV_IRREGULAR\n"); | |
4472 | /* Standard stuff below from UCNV_TO_U_CALLBACK_SUBSTITUTE */ | |
4473 | *err = U_ZERO_ERROR; | |
4474 | ucnv_cbToUWriteSub(toArgs,0,err); | |
4475 | } | |
4476 | ||
4477 | enum { kEmptySegmentToUCharsMax = 64 }; | |
4478 | static void TestJitterbug6175(void) { | |
4479 | static const char iso2022jp_a[] = { 0x61, 0x62, 0x1B,0x24,0x42, 0x1B,0x28,0x42, 0x63, 0x64, 0x0D, 0x0A }; | |
4480 | static const char iso2022kr_a[] = { 0x1B,0x24,0x29,0x43, 0x61, 0x0E, 0x0F, 0x62, 0x0D, 0x0A }; | |
4481 | static const char iso2022cn_a[] = { 0x61, 0x1B,0x24,0x29,0x41, 0x62, 0x0E, 0x0F, 0x1B,0x24,0x2A,0x48, 0x1B,0x4E, 0x6A,0x65, 0x63, 0x0D, 0x0A }; | |
4482 | static const char iso2022cn_b[] = { 0x61, 0x1B,0x24,0x29,0x41, 0x62, 0x0E, 0x1B,0x24,0x29,0x47, 0x68,0x64, 0x0F, 0x63, 0x0D, 0x0A }; | |
4483 | static const char hzGB2312_a[] = { 0x61, 0x62, 0x7E,0x7B, 0x7E,0x7D, 0x63, 0x64 }; | |
4484 | static const EmptySegmentTest emptySegmentTests[] = { | |
4485 | /* converterName inputText inputTextLength */ | |
4486 | { "ISO-2022-JP", iso2022jp_a, sizeof(iso2022jp_a) }, | |
4487 | { "ISO-2022-KR", iso2022kr_a, sizeof(iso2022kr_a) }, | |
4488 | { "ISO-2022-CN", iso2022cn_a, sizeof(iso2022cn_a) }, | |
4489 | { "ISO-2022-CN", iso2022cn_b, sizeof(iso2022cn_b) }, | |
4490 | { "HZ-GB-2312", hzGB2312_a, sizeof(hzGB2312_a) }, | |
4491 | /* terminator: */ | |
4492 | { NULL, NULL, 0, } | |
4493 | }; | |
4494 | const EmptySegmentTest * testPtr; | |
4495 | for (testPtr = emptySegmentTests; testPtr->converterName != NULL; ++testPtr) { | |
4496 | UErrorCode err = U_ZERO_ERROR; | |
4497 | UConverter * cnv = ucnv_open(testPtr->converterName, &err); | |
4498 | if (U_FAILURE(err)) { | |
4499 | log_data_err("Unable to open %s converter: %s\n", testPtr->converterName, u_errorName(err)); | |
4500 | return; | |
4501 | } | |
4502 | ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_EMPTYSEGMENT, NULL, NULL, NULL, &err); | |
4503 | if (U_FAILURE(err)) { | |
4504 | log_data_err("Unable to setToUCallBack for %s converter: %s\n", testPtr->converterName, u_errorName(err)); | |
4505 | ucnv_close(cnv); | |
4506 | return; | |
4507 | } | |
4508 | { | |
4509 | UChar toUChars[kEmptySegmentToUCharsMax]; | |
4510 | UChar * toUCharsPtr = toUChars; | |
4511 | const UChar * toUCharsLimit = toUCharsPtr + kEmptySegmentToUCharsMax; | |
4512 | const char * inCharsPtr = testPtr->inputText; | |
4513 | const char * inCharsLimit = inCharsPtr + testPtr->inputTextLength; | |
4514 | ucnv_toUnicode(cnv, &toUCharsPtr, toUCharsLimit, &inCharsPtr, inCharsLimit, NULL, TRUE, &err); | |
4515 | } | |
4516 | ucnv_close(cnv); | |
4517 | } | |
4518 | } | |
4519 | ||
b75a7d8f A |
4520 | static void |
4521 | TestEBCDIC_STATEFUL() { | |
4522 | /* test input */ | |
4523 | static const uint8_t in[]={ | |
4524 | 0x61, | |
4525 | 0x1a, | |
4526 | 0x0f, 0x4b, | |
4527 | 0x42, | |
4528 | 0x40, | |
4529 | 0x36, | |
4530 | }; | |
4531 | ||
4532 | /* expected test results */ | |
374ca955 | 4533 | static const int32_t results[]={ |
b75a7d8f A |
4534 | /* number of bytes read, code point */ |
4535 | 1, 0x002f, | |
4536 | 1, 0x0092, | |
4537 | 2, 0x002e, | |
4538 | 1, 0xff62, | |
4539 | 1, 0x0020, | |
4540 | 1, 0x0096, | |
4541 | ||
4542 | }; | |
4543 | static const uint8_t in2[]={ | |
4544 | 0x0f, | |
4545 | 0xa1, | |
4546 | 0x01 | |
4547 | }; | |
4548 | ||
4549 | /* expected test results */ | |
374ca955 | 4550 | static const int32_t results2[]={ |
b75a7d8f A |
4551 | /* number of bytes read, code point */ |
4552 | 2, 0x203E, | |
4553 | 1, 0x0001, | |
4554 | }; | |
4555 | ||
4556 | const char *source=(const char *)in, *limit=(const char *)in+sizeof(in); | |
4557 | UErrorCode errorCode=U_ZERO_ERROR; | |
4558 | UConverter *cnv=ucnv_open("ibm-930", &errorCode); | |
4559 | if(U_FAILURE(errorCode)) { | |
4560 | log_data_err("Unable to open a EBCDIC_STATEFUL(ibm-930) converter: %s\n", u_errorName(errorCode)); | |
4561 | return; | |
4562 | } | |
4563 | TestNextUChar(cnv, source, limit, results, "EBCDIC_STATEFUL(ibm-930)"); | |
4564 | ucnv_reset(cnv); | |
4565 | /* Test the condition when source >= sourceLimit */ | |
4566 | TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); | |
4567 | ucnv_reset(cnv); | |
4568 | /*Test for the condition where source > sourcelimit after consuming the shift chracter */ | |
4569 | { | |
4570 | static const uint8_t source1[]={0x0f}; | |
4571 | TestNextUCharError(cnv, (const char*)source1, (const char*)source1+sizeof(source1), U_INDEX_OUTOFBOUNDS_ERROR, "a character is truncated"); | |
4572 | } | |
4573 | /*Test for the condition where there is an invalid character*/ | |
4574 | ucnv_reset(cnv); | |
4575 | { | |
4576 | static const uint8_t source2[]={0x0e, 0x7F, 0xFF}; | |
4577 | TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character [EBCDIC STATEFUL]"); | |
4578 | } | |
4579 | ucnv_reset(cnv); | |
4580 | source=(const char*)in2; | |
4581 | limit=(const char*)in2+sizeof(in2); | |
4582 | TestNextUChar(cnv,source,limit,results2,"EBCDIC_STATEFUL(ibm-930),seq#2"); | |
4583 | ucnv_close(cnv); | |
4584 | ||
4585 | } | |
4586 | ||
4587 | static void | |
4588 | TestGB18030() { | |
4589 | /* test input */ | |
4590 | static const uint8_t in[]={ | |
4591 | 0x24, | |
4592 | 0x7f, | |
4593 | 0x81, 0x30, 0x81, 0x30, | |
4594 | 0xa8, 0xbf, | |
4595 | 0xa2, 0xe3, | |
4596 | 0xd2, 0xbb, | |
4597 | 0x82, 0x35, 0x8f, 0x33, | |
4598 | 0x84, 0x31, 0xa4, 0x39, | |
4599 | 0x90, 0x30, 0x81, 0x30, | |
4600 | 0xe3, 0x32, 0x9a, 0x35 | |
4601 | #if 0 | |
4602 | /* | |
4603 | * Feature removed markus 2000-oct-26 | |
4604 | * Only some codepages must match surrogate pairs into supplementary code points - | |
4605 | * see javadoc for ucnv_getNextUChar() and implementation notes in ucnvmbcs.c . | |
4606 | * GB 18030 provides direct encodings for supplementary code points, therefore | |
4607 | * it must not combine two single-encoded surrogates into one code point. | |
4608 | */ | |
4609 | 0x83, 0x36, 0xc8, 0x30, 0x83, 0x37, 0xb0, 0x34 /* separately encoded surrogates */ | |
4610 | #endif | |
4611 | }; | |
4612 | ||
4613 | /* expected test results */ | |
374ca955 | 4614 | static const int32_t results[]={ |
b75a7d8f A |
4615 | /* number of bytes read, code point */ |
4616 | 1, 0x24, | |
4617 | 1, 0x7f, | |
4618 | 4, 0x80, | |
4619 | 2, 0x1f9, | |
4620 | 2, 0x20ac, | |
4621 | 2, 0x4e00, | |
4622 | 4, 0x9fa6, | |
4623 | 4, 0xffff, | |
4624 | 4, 0x10000, | |
4625 | 4, 0x10ffff | |
4626 | #if 0 | |
4627 | /* Feature removed. See comment above. */ | |
4628 | 8, 0x10000 | |
4629 | #endif | |
4630 | }; | |
4631 | ||
4632 | /* const char *source=(const char *)in,*limit=(const char *)in+sizeof(in); */ | |
4633 | UErrorCode errorCode=U_ZERO_ERROR; | |
4634 | UConverter *cnv=ucnv_open("gb18030", &errorCode); | |
4635 | if(U_FAILURE(errorCode)) { | |
4636 | log_data_err("Unable to open a gb18030 converter: %s\n", u_errorName(errorCode)); | |
4637 | return; | |
4638 | } | |
4639 | TestNextUChar(cnv, (const char *)in, (const char *)in+sizeof(in), results, "gb18030"); | |
4640 | ucnv_close(cnv); | |
4641 | } | |
4642 | ||
4643 | static void | |
4644 | TestLMBCS() { | |
4645 | /* LMBCS-1 string */ | |
4646 | static const uint8_t pszLMBCS[]={ | |
4647 | 0x61, | |
4648 | 0x01, 0x29, | |
4649 | 0x81, | |
4650 | 0xA0, | |
4651 | 0x0F, 0x27, | |
4652 | 0x0F, 0x91, | |
4653 | 0x14, 0x0a, 0x74, | |
4654 | 0x14, 0xF6, 0x02, | |
4655 | 0x14, 0xd8, 0x4d, 0x14, 0xdc, 0x56, /* UTF-16 surrogate pair */ | |
4656 | 0x10, 0x88, 0xA0, | |
4657 | }; | |
4658 | ||
4659 | /* Unicode UChar32 equivalents */ | |
4660 | static const UChar32 pszUnicode32[]={ | |
4661 | /* code point */ | |
4662 | 0x00000061, | |
4663 | 0x00002013, | |
4664 | 0x000000FC, | |
4665 | 0x000000E1, | |
4666 | 0x00000007, | |
4667 | 0x00000091, | |
4668 | 0x00000a74, | |
4669 | 0x00000200, | |
4670 | 0x00023456, /* code point for surrogate pair */ | |
4671 | 0x00005516 | |
4672 | }; | |
4673 | ||
4674 | /* Unicode UChar equivalents */ | |
4675 | static const UChar pszUnicode[]={ | |
4676 | /* code point */ | |
4677 | 0x0061, | |
4678 | 0x2013, | |
4679 | 0x00FC, | |
4680 | 0x00E1, | |
4681 | 0x0007, | |
4682 | 0x0091, | |
4683 | 0x0a74, | |
4684 | 0x0200, | |
4685 | 0xD84D, /* low surrogate */ | |
4686 | 0xDC56, /* high surrogate */ | |
4687 | 0x5516 | |
4688 | }; | |
4689 | ||
4690 | /* expected test results */ | |
4691 | static const int offsets32[]={ | |
4692 | /* number of bytes read, code point */ | |
4693 | 0, | |
4694 | 1, | |
4695 | 3, | |
4696 | 4, | |
4697 | 5, | |
4698 | 7, | |
4699 | 9, | |
4700 | 12, | |
4701 | 15, | |
4702 | 21, | |
4703 | 24 | |
4704 | }; | |
4705 | ||
4706 | /* expected test results */ | |
4707 | static const int offsets[]={ | |
4708 | /* number of bytes read, code point */ | |
4709 | 0, | |
4710 | 1, | |
4711 | 3, | |
4712 | 4, | |
4713 | 5, | |
4714 | 7, | |
4715 | 9, | |
4716 | 12, | |
4717 | 15, | |
4718 | 18, | |
4719 | 21, | |
4720 | 24 | |
4721 | }; | |
4722 | ||
4723 | ||
4724 | UConverter *cnv; | |
4725 | ||
4726 | #define NAME_LMBCS_1 "LMBCS-1" | |
4727 | #define NAME_LMBCS_2 "LMBCS-2" | |
4728 | ||
4729 | ||
4730 | /* Some basic open/close/property tests on some LMBCS converters */ | |
4731 | { | |
4732 | ||
4733 | char expected_subchars[] = {0x3F}; /* ANSI Question Mark */ | |
4734 | char new_subchars [] = {0x7F}; /* subst char used by SmartSuite..*/ | |
4735 | char get_subchars [1]; | |
4736 | const char * get_name; | |
4737 | UConverter *cnv1; | |
4738 | UConverter *cnv2; | |
4739 | ||
4740 | int8_t len = sizeof(get_subchars); | |
4741 | ||
4742 | UErrorCode errorCode=U_ZERO_ERROR; | |
4743 | ||
4744 | /* Open */ | |
4745 | cnv1=ucnv_open(NAME_LMBCS_1, &errorCode); | |
4746 | if(U_FAILURE(errorCode)) { | |
4747 | log_data_err("Unable to open a LMBCS-1 converter: %s\n", u_errorName(errorCode)); | |
4748 | return; | |
4749 | } | |
4750 | cnv2=ucnv_open(NAME_LMBCS_2, &errorCode); | |
4751 | if(U_FAILURE(errorCode)) { | |
4752 | log_data_err("Unable to open a LMBCS-2 converter: %s\n", u_errorName(errorCode)); | |
4753 | return; | |
4754 | } | |
4755 | ||
4756 | /* Name */ | |
4757 | get_name = ucnv_getName (cnv1, &errorCode); | |
4758 | if (strcmp(NAME_LMBCS_1,get_name)){ | |
4759 | log_err("Unexpected converter name: %s\n", get_name); | |
4760 | } | |
4761 | get_name = ucnv_getName (cnv2, &errorCode); | |
4762 | if (strcmp(NAME_LMBCS_2,get_name)){ | |
4763 | log_err("Unexpected converter name: %s\n", get_name); | |
4764 | } | |
4765 | ||
4766 | /* substitution chars */ | |
4767 | ucnv_getSubstChars (cnv1, get_subchars, &len, &errorCode); | |
4768 | if(U_FAILURE(errorCode)) { | |
4769 | log_err("Failure on get subst chars: %s\n", u_errorName(errorCode)); | |
4770 | } | |
4771 | if (len!=1){ | |
4772 | log_err("Unexpected length of sub chars\n"); | |
4773 | } | |
4774 | if (get_subchars[0] != expected_subchars[0]){ | |
4775 | log_err("Unexpected value of sub chars\n"); | |
4776 | } | |
4777 | ucnv_setSubstChars (cnv2,new_subchars, len, &errorCode); | |
4778 | if(U_FAILURE(errorCode)) { | |
4779 | log_err("Failure on set subst chars: %s\n", u_errorName(errorCode)); | |
4780 | } | |
4781 | ucnv_getSubstChars (cnv2, get_subchars, &len, &errorCode); | |
4782 | if(U_FAILURE(errorCode)) { | |
4783 | log_err("Failure on get subst chars: %s\n", u_errorName(errorCode)); | |
4784 | } | |
4785 | if (len!=1){ | |
4786 | log_err("Unexpected length of sub chars\n"); | |
4787 | } | |
4788 | if (get_subchars[0] != new_subchars[0]){ | |
4789 | log_err("Unexpected value of sub chars\n"); | |
4790 | } | |
4791 | ucnv_close(cnv1); | |
4792 | ucnv_close(cnv2); | |
4793 | ||
4794 | } | |
4795 | ||
4796 | /* LMBCS to Unicode - offsets */ | |
4797 | { | |
4798 | UErrorCode errorCode=U_ZERO_ERROR; | |
4799 | ||
73c04bcf A |
4800 | const char * pSource = (const char *)pszLMBCS; |
4801 | const char * sourceLimit = (const char *)pszLMBCS + sizeof(pszLMBCS); | |
b75a7d8f A |
4802 | |
4803 | UChar Out [sizeof(pszUnicode) + 1]; | |
4804 | UChar * pOut = Out; | |
4805 | UChar * OutLimit = Out + sizeof(pszUnicode)/sizeof(UChar); | |
4806 | ||
4807 | int32_t off [sizeof(offsets)]; | |
4808 | ||
4809 | /* last 'offset' in expected results is just the final size. | |
4810 | (Makes other tests easier). Compensate here: */ | |
4811 | ||
4812 | off[(sizeof(offsets)/sizeof(offsets[0]))-1] = sizeof(pszLMBCS); | |
4813 | ||
4814 | ||
4815 | ||
4816 | cnv=ucnv_open("lmbcs", &errorCode); /* use generic name for LMBCS-1 */ | |
4817 | if(U_FAILURE(errorCode)) { | |
4818 | log_data_err("Unable to open a LMBCS converter: %s\n", u_errorName(errorCode)); | |
4819 | return; | |
4820 | } | |
4821 | ||
4822 | ||
4823 | ||
4824 | ucnv_toUnicode (cnv, | |
4825 | &pOut, | |
4826 | OutLimit, | |
73c04bcf A |
4827 | &pSource, |
4828 | sourceLimit, | |
b75a7d8f A |
4829 | off, |
4830 | TRUE, | |
4831 | &errorCode); | |
4832 | ||
4833 | ||
4834 | if (memcmp(off,offsets,sizeof(offsets))) | |
4835 | { | |
4836 | log_err("LMBCS->Uni: Calculated offsets do not match expected results\n"); | |
4837 | } | |
4838 | if (memcmp(Out,pszUnicode,sizeof(pszUnicode))) | |
4839 | { | |
4840 | log_err("LMBCS->Uni: Calculated codepoints do not match expected results\n"); | |
4841 | } | |
4842 | ucnv_close(cnv); | |
4843 | } | |
4844 | { | |
4845 | /* LMBCS to Unicode - getNextUChar */ | |
4846 | const char * sourceStart; | |
4847 | const char *source=(const char *)pszLMBCS; | |
4848 | const char *limit=(const char *)pszLMBCS+sizeof(pszLMBCS); | |
4849 | const UChar32 *results= pszUnicode32; | |
4850 | const int *off = offsets32; | |
4851 | ||
4852 | UErrorCode errorCode=U_ZERO_ERROR; | |
4853 | UChar32 uniChar; | |
4854 | ||
4855 | cnv=ucnv_open("LMBCS-1", &errorCode); | |
4856 | if(U_FAILURE(errorCode)) { | |
4857 | log_data_err("Unable to open a LMBCS-1 converter: %s\n", u_errorName(errorCode)); | |
4858 | return; | |
4859 | } | |
4860 | else | |
4861 | { | |
4862 | ||
4863 | while(source<limit) { | |
4864 | sourceStart=source; | |
4865 | uniChar=ucnv_getNextUChar(cnv, &source, source + (off[1] - off[0]), &errorCode); | |
4866 | if(U_FAILURE(errorCode)) { | |
4867 | log_err("LMBCS-1 ucnv_getNextUChar() failed: %s\n", u_errorName(errorCode)); | |
4868 | break; | |
4869 | } else if(source-sourceStart != off[1] - off[0] || uniChar != *results) { | |
4870 | log_err("LMBCS-1 ucnv_getNextUChar() result %lx from %d bytes, should have been %lx from %d bytes.\n", | |
4871 | uniChar, (source-sourceStart), *results, *off); | |
4872 | break; | |
4873 | } | |
4874 | results++; | |
4875 | off++; | |
4876 | } | |
4877 | } | |
4878 | ucnv_close(cnv); | |
4879 | } | |
4880 | { /* test locale & optimization group operations: Unicode to LMBCS */ | |
4881 | ||
4882 | UErrorCode errorCode=U_ZERO_ERROR; | |
4883 | UConverter *cnv16he = ucnv_open("LMBCS-16,locale=he", &errorCode); | |
4884 | UConverter *cnv16jp = ucnv_open("LMBCS-16,locale=ja_JP", &errorCode); | |
4885 | UConverter *cnv01us = ucnv_open("LMBCS-1,locale=us_EN", &errorCode); | |
4886 | UChar uniString [] = {0x0192}; /* Latin Small letter f with hook */ | |
4887 | const UChar * pUniOut = uniString; | |
4888 | UChar * pUniIn = uniString; | |
4889 | uint8_t lmbcsString [4]; | |
73c04bcf A |
4890 | const char * pLMBCSOut = (const char *)lmbcsString; |
4891 | char * pLMBCSIn = (char *)lmbcsString; | |
b75a7d8f A |
4892 | |
4893 | /* 0192 (hook) converts to both group 3 & group 1. input locale should differentiate */ | |
4894 | ucnv_fromUnicode (cnv16he, | |
73c04bcf | 4895 | &pLMBCSIn, (pLMBCSIn + sizeof(lmbcsString)/sizeof(lmbcsString[0])), |
b75a7d8f A |
4896 | &pUniOut, pUniOut + sizeof(uniString)/sizeof(uniString[0]), |
4897 | NULL, 1, &errorCode); | |
4898 | ||
4899 | if (lmbcsString[0] != 0x3 || lmbcsString[1] != 0x83) | |
4900 | { | |
4901 | log_err("LMBCS-16,locale=he gives unexpected translation\n"); | |
4902 | } | |
4903 | ||
73c04bcf | 4904 | pLMBCSIn= (char *)lmbcsString; |
b75a7d8f A |
4905 | pUniOut = uniString; |
4906 | ucnv_fromUnicode (cnv01us, | |
73c04bcf | 4907 | &pLMBCSIn, (const char *)(lmbcsString + sizeof(lmbcsString)/sizeof(lmbcsString[0])), |
b75a7d8f A |
4908 | &pUniOut, pUniOut + sizeof(uniString)/sizeof(uniString[0]), |
4909 | NULL, 1, &errorCode); | |
4910 | ||
4911 | if (lmbcsString[0] != 0x9F) | |
4912 | { | |
4913 | log_err("LMBCS-1,locale=US gives unexpected translation\n"); | |
4914 | } | |
4915 | ||
4916 | /* single byte char from mbcs char set */ | |
4917 | lmbcsString[0] = 0xAE; /* 1/2 width katakana letter small Yo */ | |
73c04bcf | 4918 | pLMBCSOut = (const char *)lmbcsString; |
b75a7d8f A |
4919 | pUniIn = uniString; |
4920 | ucnv_toUnicode (cnv16jp, | |
4921 | &pUniIn, pUniIn + 1, | |
73c04bcf | 4922 | &pLMBCSOut, (pLMBCSOut + 1), |
b75a7d8f | 4923 | NULL, 1, &errorCode); |
73c04bcf | 4924 | if (U_FAILURE(errorCode) || pLMBCSOut != (const char *)lmbcsString+1 || pUniIn != uniString+1 || uniString[0] != 0xFF6E) |
b75a7d8f A |
4925 | { |
4926 | log_err("Unexpected results from LMBCS-16 single byte char\n"); | |
4927 | } | |
4928 | /* convert to group 1: should be 3 bytes */ | |
73c04bcf | 4929 | pLMBCSIn = (char *)lmbcsString; |
b75a7d8f A |
4930 | pUniOut = uniString; |
4931 | ucnv_fromUnicode (cnv01us, | |
73c04bcf | 4932 | &pLMBCSIn, (const char *)(pLMBCSIn + 3), |
b75a7d8f A |
4933 | &pUniOut, pUniOut + 1, |
4934 | NULL, 1, &errorCode); | |
73c04bcf | 4935 | if (U_FAILURE(errorCode) || pLMBCSIn != (const char *)lmbcsString+3 || pUniOut != uniString+1 |
b75a7d8f A |
4936 | || lmbcsString[0] != 0x10 || lmbcsString[1] != 0x10 || lmbcsString[2] != 0xAE) |
4937 | { | |
4938 | log_err("Unexpected results to LMBCS-1 single byte mbcs char\n"); | |
4939 | } | |
73c04bcf | 4940 | pLMBCSOut = (const char *)lmbcsString; |
b75a7d8f A |
4941 | pUniIn = uniString; |
4942 | ucnv_toUnicode (cnv01us, | |
4943 | &pUniIn, pUniIn + 1, | |
73c04bcf | 4944 | &pLMBCSOut, (const char *)(pLMBCSOut + 3), |
b75a7d8f | 4945 | NULL, 1, &errorCode); |
73c04bcf | 4946 | if (U_FAILURE(errorCode) || pLMBCSOut != (const char *)lmbcsString+3 || pUniIn != uniString+1 || uniString[0] != 0xFF6E) |
b75a7d8f A |
4947 | { |
4948 | log_err("Unexpected results from LMBCS-1 single byte mbcs char\n"); | |
4949 | } | |
73c04bcf | 4950 | pLMBCSIn = (char *)lmbcsString; |
b75a7d8f A |
4951 | pUniOut = uniString; |
4952 | ucnv_fromUnicode (cnv16jp, | |
73c04bcf | 4953 | &pLMBCSIn, (const char *)(pLMBCSIn + 1), |
b75a7d8f A |
4954 | &pUniOut, pUniOut + 1, |
4955 | NULL, 1, &errorCode); | |
73c04bcf | 4956 | if (U_FAILURE(errorCode) || pLMBCSIn != (const char *)lmbcsString+1 || pUniOut != uniString+1 || lmbcsString[0] != 0xAE) |
b75a7d8f A |
4957 | { |
4958 | log_err("Unexpected results to LMBCS-16 single byte mbcs char\n"); | |
4959 | } | |
4960 | ucnv_close(cnv16he); | |
4961 | ucnv_close(cnv16jp); | |
4962 | ucnv_close(cnv01us); | |
4963 | } | |
4964 | { | |
4965 | /* Small source buffer testing, LMBCS -> Unicode */ | |
4966 | ||
4967 | UErrorCode errorCode=U_ZERO_ERROR; | |
4968 | ||
73c04bcf A |
4969 | const char * pSource = (const char *)pszLMBCS; |
4970 | const char * sourceLimit = (const char *)pszLMBCS + sizeof(pszLMBCS); | |
b75a7d8f A |
4971 | int codepointCount = 0; |
4972 | ||
4973 | UChar Out [sizeof(pszUnicode) + 1]; | |
4974 | UChar * pOut = Out; | |
4975 | UChar * OutLimit = Out + sizeof(pszUnicode)/sizeof(UChar); | |
4976 | ||
4977 | ||
4978 | cnv = ucnv_open(NAME_LMBCS_1, &errorCode); | |
4979 | if(U_FAILURE(errorCode)) { | |
4980 | log_err("Unable to open a LMBCS-1 converter: %s\n", u_errorName(errorCode)); | |
4981 | return; | |
4982 | } | |
4983 | ||
4984 | ||
4985 | while ((pSource < sourceLimit) && U_SUCCESS (errorCode)) | |
4986 | { | |
4987 | ucnv_toUnicode (cnv, | |
4988 | &pOut, | |
4989 | OutLimit, | |
73c04bcf A |
4990 | &pSource, |
4991 | (pSource+1), /* claim that this is a 1- byte buffer */ | |
b75a7d8f A |
4992 | NULL, |
4993 | FALSE, /* FALSE means there might be more chars in the next buffer */ | |
4994 | &errorCode); | |
4995 | ||
4996 | if (U_SUCCESS (errorCode)) | |
4997 | { | |
73c04bcf | 4998 | if ((pSource - (const char *)pszLMBCS) == offsets [codepointCount+1]) |
b75a7d8f A |
4999 | { |
5000 | /* we are on to the next code point: check value */ | |
5001 | ||
5002 | if (Out[0] != pszUnicode[codepointCount]){ | |
5003 | log_err("LMBCS->Uni result %lx should have been %lx \n", | |
5004 | Out[0], pszUnicode[codepointCount]); | |
5005 | } | |
5006 | ||
5007 | pOut = Out; /* reset for accumulating next code point */ | |
5008 | codepointCount++; | |
5009 | } | |
5010 | } | |
5011 | else | |
5012 | { | |
5013 | log_err("Unexpected Error on toUnicode: %s\n", u_errorName(errorCode)); | |
5014 | } | |
5015 | } | |
5016 | { | |
5017 | /* limits & surrogate error testing */ | |
73c04bcf A |
5018 | char LIn [sizeof(pszLMBCS)]; |
5019 | const char * pLIn = LIn; | |
b75a7d8f A |
5020 | |
5021 | char LOut [sizeof(pszLMBCS)]; | |
5022 | char * pLOut = LOut; | |
5023 | ||
5024 | UChar UOut [sizeof(pszUnicode)]; | |
5025 | UChar * pUOut = UOut; | |
5026 | ||
5027 | UChar UIn [sizeof(pszUnicode)]; | |
5028 | const UChar * pUIn = UIn; | |
5029 | ||
5030 | int32_t off [sizeof(offsets)]; | |
5031 | UChar32 uniChar; | |
5032 | ||
5033 | errorCode=U_ZERO_ERROR; | |
5034 | ||
5035 | /* negative source request should always return U_ILLEGAL_ARGUMENT_ERROR */ | |
5036 | ucnv_fromUnicode(cnv, &pLOut,pLOut+1,&pUIn,pUIn-1,off,FALSE, &errorCode); | |
5037 | if (errorCode != U_ILLEGAL_ARGUMENT_ERROR) | |
5038 | { | |
5039 | log_err("Unexpected Error on negative source request to ucnv_fromUnicode: %s\n", u_errorName(errorCode)); | |
5040 | } | |
5041 | errorCode=U_ZERO_ERROR; | |
5042 | ucnv_toUnicode(cnv, &pUOut,pUOut+1,(const char **)&pLIn,(const char *)(pLIn-1),off,FALSE, &errorCode); | |
5043 | if (errorCode != U_ILLEGAL_ARGUMENT_ERROR) | |
5044 | { | |
5045 | log_err("Unexpected Error on negative source request to ucnv_toUnicode: %s\n", u_errorName(errorCode)); | |
5046 | } | |
5047 | errorCode=U_ZERO_ERROR; | |
5048 | ||
5049 | uniChar = ucnv_getNextUChar(cnv, (const char **)&pLIn, (const char *)(pLIn-1), &errorCode); | |
5050 | if (errorCode != U_ILLEGAL_ARGUMENT_ERROR) | |
5051 | { | |
5052 | log_err("Unexpected Error on negative source request to ucnv_getNextUChar: %s\n", u_errorName(errorCode)); | |
5053 | } | |
5054 | errorCode=U_ZERO_ERROR; | |
5055 | ||
5056 | /* 0 byte source request - no error, no pointer movement */ | |
5057 | ucnv_toUnicode(cnv, &pUOut,pUOut+1,(const char **)&pLIn,(const char *)pLIn,off,FALSE, &errorCode); | |
5058 | ucnv_fromUnicode(cnv, &pLOut,pLOut+1,&pUIn,pUIn,off,FALSE, &errorCode); | |
5059 | if(U_FAILURE(errorCode)) { | |
5060 | log_err("0 byte source request: unexpected error: %s\n", u_errorName(errorCode)); | |
5061 | } | |
5062 | if ((pUOut != UOut) || (pUIn != UIn) || (pLOut != LOut) || (pLIn != LIn)) | |
5063 | { | |
5064 | log_err("Unexpected pointer move in 0 byte source request \n"); | |
5065 | } | |
5066 | /*0 byte source request - GetNextUChar : error & value == fffe or ffff */ | |
5067 | uniChar = ucnv_getNextUChar(cnv, (const char **)&pLIn, (const char *)pLIn, &errorCode); | |
374ca955 | 5068 | if (errorCode != U_INDEX_OUTOFBOUNDS_ERROR) |
b75a7d8f A |
5069 | { |
5070 | log_err("Unexpected Error on 0-byte source request to ucnv_getnextUChar: %s\n", u_errorName(errorCode)); | |
5071 | } | |
5072 | if (((uint32_t)uniChar - 0xfffe) > 1) /* not 0xfffe<=uniChar<=0xffff */ | |
5073 | { | |
5074 | log_err("Unexpected value on 0-byte source request to ucnv_getnextUChar \n"); | |
5075 | } | |
5076 | errorCode = U_ZERO_ERROR; | |
5077 | ||
5078 | /* running out of target room : U_BUFFER_OVERFLOW_ERROR */ | |
5079 | ||
5080 | pUIn = pszUnicode; | |
5081 | ucnv_fromUnicode(cnv, &pLOut,pLOut+offsets[4],&pUIn,pUIn+sizeof(pszUnicode)/sizeof(UChar),off,FALSE, &errorCode); | |
5082 | if (errorCode != U_BUFFER_OVERFLOW_ERROR || pLOut != LOut + offsets[4] || pUIn != pszUnicode+4 ) | |
5083 | { | |
5084 | log_err("Unexpected results on out of target room to ucnv_fromUnicode\n"); | |
5085 | } | |
5086 | ||
5087 | errorCode = U_ZERO_ERROR; | |
5088 | ||
73c04bcf A |
5089 | pLIn = (const char *)pszLMBCS; |
5090 | ucnv_toUnicode(cnv, &pUOut,pUOut+4,&pLIn,(pLIn+sizeof(pszLMBCS)),off,FALSE, &errorCode); | |
5091 | if (errorCode != U_BUFFER_OVERFLOW_ERROR || pUOut != UOut + 4 || pLIn != (const char *)pszLMBCS+offsets[4]) | |
b75a7d8f A |
5092 | { |
5093 | log_err("Unexpected results on out of target room to ucnv_toUnicode\n"); | |
5094 | } | |
5095 | ||
5096 | /* unpaired or chopped LMBCS surrogates */ | |
5097 | ||
5098 | /* OK high surrogate, Low surrogate is chopped */ | |
73c04bcf A |
5099 | LIn [0] = (char)0x14; |
5100 | LIn [1] = (char)0xD8; | |
5101 | LIn [2] = (char)0x01; | |
5102 | LIn [3] = (char)0x14; | |
5103 | LIn [4] = (char)0xDC; | |
b75a7d8f A |
5104 | pLIn = LIn; |
5105 | errorCode = U_ZERO_ERROR; | |
5106 | pUOut = UOut; | |
5107 | ||
374ca955 | 5108 | ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); |
b75a7d8f A |
5109 | ucnv_toUnicode(cnv, &pUOut,pUOut+sizeof(UOut)/sizeof(UChar),(const char **)&pLIn,(const char *)(pLIn+5),off,TRUE, &errorCode); |
5110 | if (UOut[0] != 0xD801 || errorCode != U_TRUNCATED_CHAR_FOUND || pUOut != UOut + 1 || pLIn != LIn + 5) | |
5111 | { | |
5112 | log_err("Unexpected results on chopped low surrogate\n"); | |
5113 | } | |
5114 | ||
5115 | /* chopped at surrogate boundary */ | |
73c04bcf A |
5116 | LIn [0] = (char)0x14; |
5117 | LIn [1] = (char)0xD8; | |
5118 | LIn [2] = (char)0x01; | |
b75a7d8f A |
5119 | pLIn = LIn; |
5120 | errorCode = U_ZERO_ERROR; | |
5121 | pUOut = UOut; | |
5122 | ||
5123 | ucnv_toUnicode(cnv, &pUOut,pUOut+sizeof(UOut)/sizeof(UChar),(const char **)&pLIn,(const char *)(pLIn+3),off,TRUE, &errorCode); | |
5124 | if (UOut[0] != 0xD801 || U_FAILURE(errorCode) || pUOut != UOut + 1 || pLIn != LIn + 3) | |
5125 | { | |
5126 | log_err("Unexpected results on chopped at surrogate boundary \n"); | |
5127 | } | |
5128 | ||
5129 | /* unpaired surrogate plus valid Unichar */ | |
73c04bcf A |
5130 | LIn [0] = (char)0x14; |
5131 | LIn [1] = (char)0xD8; | |
5132 | LIn [2] = (char)0x01; | |
5133 | LIn [3] = (char)0x14; | |
5134 | LIn [4] = (char)0xC9; | |
5135 | LIn [5] = (char)0xD0; | |
b75a7d8f A |
5136 | pLIn = LIn; |
5137 | errorCode = U_ZERO_ERROR; | |
5138 | pUOut = UOut; | |
5139 | ||
5140 | ucnv_toUnicode(cnv, &pUOut,pUOut+sizeof(UOut)/sizeof(UChar),(const char **)&pLIn,(const char *)(pLIn+6),off,TRUE, &errorCode); | |
5141 | if (UOut[0] != 0xD801 || UOut[1] != 0xC9D0 || U_FAILURE(errorCode) || pUOut != UOut + 2 || pLIn != LIn + 6) | |
5142 | { | |
5143 | log_err("Unexpected results after unpaired surrogate plus valid Unichar \n"); | |
5144 | } | |
5145 | ||
5146 | /* unpaired surrogate plus chopped Unichar */ | |
73c04bcf A |
5147 | LIn [0] = (char)0x14; |
5148 | LIn [1] = (char)0xD8; | |
5149 | LIn [2] = (char)0x01; | |
5150 | LIn [3] = (char)0x14; | |
5151 | LIn [4] = (char)0xC9; | |
b75a7d8f A |
5152 | |
5153 | pLIn = LIn; | |
5154 | errorCode = U_ZERO_ERROR; | |
5155 | pUOut = UOut; | |
5156 | ||
5157 | ucnv_toUnicode(cnv, &pUOut,pUOut+sizeof(UOut)/sizeof(UChar),(const char **)&pLIn,(const char *)(pLIn+5),off,TRUE, &errorCode); | |
5158 | if (UOut[0] != 0xD801 || errorCode != U_TRUNCATED_CHAR_FOUND || pUOut != UOut + 1 || pLIn != LIn + 5) | |
5159 | { | |
5160 | log_err("Unexpected results after unpaired surrogate plus chopped Unichar \n"); | |
5161 | } | |
5162 | ||
5163 | /* unpaired surrogate plus valid non-Unichar */ | |
73c04bcf A |
5164 | LIn [0] = (char)0x14; |
5165 | LIn [1] = (char)0xD8; | |
5166 | LIn [2] = (char)0x01; | |
5167 | LIn [3] = (char)0x0F; | |
5168 | LIn [4] = (char)0x3B; | |
b75a7d8f A |
5169 | |
5170 | pLIn = LIn; | |
5171 | errorCode = U_ZERO_ERROR; | |
5172 | pUOut = UOut; | |
5173 | ||
5174 | ucnv_toUnicode(cnv, &pUOut,pUOut+sizeof(UOut)/sizeof(UChar),(const char **)&pLIn,(const char *)(pLIn+5),off,TRUE, &errorCode); | |
5175 | if (UOut[0] != 0xD801 || UOut[1] != 0x1B || U_FAILURE(errorCode) || pUOut != UOut + 2 || pLIn != LIn + 5) | |
5176 | { | |
5177 | log_err("Unexpected results after unpaired surrogate plus valid non-Unichar\n"); | |
5178 | } | |
5179 | ||
5180 | /* unpaired surrogate plus chopped non-Unichar */ | |
73c04bcf A |
5181 | LIn [0] = (char)0x14; |
5182 | LIn [1] = (char)0xD8; | |
5183 | LIn [2] = (char)0x01; | |
5184 | LIn [3] = (char)0x0F; | |
b75a7d8f A |
5185 | |
5186 | pLIn = LIn; | |
5187 | errorCode = U_ZERO_ERROR; | |
5188 | pUOut = UOut; | |
5189 | ||
5190 | ucnv_toUnicode(cnv, &pUOut,pUOut+sizeof(UOut)/sizeof(UChar),(const char **)&pLIn,(const char *)(pLIn+4),off,TRUE, &errorCode); | |
5191 | ||
5192 | if (UOut[0] != 0xD801 || errorCode != U_TRUNCATED_CHAR_FOUND || pUOut != UOut + 1 || pLIn != LIn + 4) | |
5193 | { | |
5194 | log_err("Unexpected results after unpaired surrogate plus chopped non-Unichar\n"); | |
5195 | } | |
5196 | } | |
5197 | } | |
5198 | ucnv_close(cnv); /* final cleanup */ | |
5199 | } | |
5200 | ||
5201 | ||
5202 | static void TestJitterbug255() | |
5203 | { | |
73c04bcf A |
5204 | static const uint8_t testBytes[] = { 0x95, 0xcf, 0x8a, 0xb7, 0x0d, 0x0a, 0x00 }; |
5205 | const char *testBuffer = (const char *)testBytes; | |
5206 | const char *testEnd = (const char *)testBytes + sizeof(testBytes); | |
b75a7d8f A |
5207 | UErrorCode status = U_ZERO_ERROR; |
5208 | UChar32 result; | |
5209 | UConverter *cnv = 0; | |
5210 | ||
5211 | cnv = ucnv_open("shift-jis", &status); | |
5212 | if (U_FAILURE(status) || cnv == 0) { | |
5213 | log_data_err("Failed to open the converter for SJIS.\n"); | |
5214 | return; | |
5215 | } | |
5216 | while (testBuffer != testEnd) | |
5217 | { | |
73c04bcf | 5218 | result = ucnv_getNextUChar (cnv, &testBuffer, testEnd , &status); |
b75a7d8f A |
5219 | if (U_FAILURE(status)) |
5220 | { | |
5221 | log_err("Failed to convert the next UChar for SJIS.\n"); | |
5222 | break; | |
5223 | } | |
5224 | } | |
5225 | ucnv_close(cnv); | |
5226 | } | |
5227 | ||
5228 | static void TestEBCDICUS4XML() | |
5229 | { | |
5230 | UChar unicodes_x[] = {0x0000, 0x0000, 0x0000, 0x0000}; | |
5231 | static const UChar toUnicodeMaps_x[] = {0x000A, 0x000A, 0x000D, 0x0000}; | |
5232 | static const char fromUnicodeMaps_x[] = {0x25, 0x25, 0x0D, 0x00}; | |
5233 | static const char newLines_x[] = {0x25, 0x15, 0x0D, 0x00}; | |
5234 | char target_x[] = {0x00, 0x00, 0x00, 0x00}; | |
5235 | UChar *unicodes = unicodes_x; | |
5236 | const UChar *toUnicodeMaps = toUnicodeMaps_x; | |
5237 | char *target = target_x; | |
5238 | const char* fromUnicodeMaps = fromUnicodeMaps_x, *newLines = newLines_x; | |
5239 | UErrorCode status = U_ZERO_ERROR; | |
5240 | UConverter *cnv = 0; | |
5241 | ||
5242 | cnv = ucnv_open("ebcdic-xml-us", &status); | |
5243 | if (U_FAILURE(status) || cnv == 0) { | |
5244 | log_data_err("Failed to open the converter for EBCDIC-XML-US.\n"); | |
5245 | return; | |
5246 | } | |
5247 | ucnv_toUnicode(cnv, &unicodes, unicodes+3, (const char**)&newLines, newLines+3, NULL, TRUE, &status); | |
5248 | if (U_FAILURE(status) || memcmp(unicodes_x, toUnicodeMaps, sizeof(UChar)*3) != 0) { | |
5249 | log_err("To Unicode conversion failed in EBCDICUS4XML test. %s\n", | |
5250 | u_errorName(status)); | |
5251 | printUSeqErr(unicodes_x, 3); | |
5252 | printUSeqErr(toUnicodeMaps, 3); | |
5253 | } | |
5254 | status = U_ZERO_ERROR; | |
5255 | ucnv_fromUnicode(cnv, &target, target+3, (const UChar**)&toUnicodeMaps, toUnicodeMaps+3, NULL, TRUE, &status); | |
5256 | if (U_FAILURE(status) || memcmp(target_x, fromUnicodeMaps, sizeof(char)*3) != 0) { | |
5257 | log_err("From Unicode conversion failed in EBCDICUS4XML test. %s\n", | |
5258 | u_errorName(status)); | |
5259 | printSeqErr((const unsigned char*)target_x, 3); | |
5260 | printSeqErr((const unsigned char*)fromUnicodeMaps, 3); | |
5261 | } | |
5262 | ucnv_close(cnv); | |
5263 | } | |
73c04bcf | 5264 | #endif /* #if !UCONFIG_NO_LEGACY_COLLATION */ |
b75a7d8f A |
5265 | |
5266 | #if !UCONFIG_NO_COLLATION | |
5267 | ||
5268 | static void TestJitterbug981(){ | |
374ca955 A |
5269 | const UChar* rules; |
5270 | int32_t rules_length, target_cap, bytes_needed, buff_size; | |
5271 | UErrorCode status = U_ZERO_ERROR; | |
5272 | UConverter *utf8cnv; | |
5273 | UCollator* myCollator; | |
5274 | char *buff; | |
5275 | int numNeeded=0; | |
5276 | utf8cnv = ucnv_open ("utf8", &status); | |
5277 | if(U_FAILURE(status)){ | |
5278 | log_err("Could not open UTF-8 converter. Error: %s", u_errorName(status)); | |
5279 | return; | |
5280 | } | |
5281 | myCollator = ucol_open("zh", &status); | |
5282 | if(U_FAILURE(status)){ | |
5283 | log_err("Could not open collator for zh locale. Error: %s", u_errorName(status)); | |
5284 | return; | |
5285 | } | |
b75a7d8f | 5286 | |
374ca955 A |
5287 | rules = ucol_getRules(myCollator, &rules_length); |
5288 | buff_size = rules_length * ucnv_getMaxCharSize(utf8cnv); | |
5289 | buff = malloc(buff_size); | |
b75a7d8f | 5290 | |
374ca955 A |
5291 | target_cap = 0; |
5292 | do { | |
5293 | ucnv_reset(utf8cnv); | |
5294 | status = U_ZERO_ERROR; | |
5295 | if(target_cap >= buff_size) { | |
5296 | log_err("wanted %d bytes, only %d available\n", target_cap, buff_size); | |
5297 | return; | |
5298 | } | |
5299 | bytes_needed = ucnv_fromUChars(utf8cnv, buff, target_cap, | |
5300 | rules, rules_length, &status); | |
5301 | target_cap = (bytes_needed > target_cap) ? bytes_needed : target_cap +1; | |
5302 | if(numNeeded!=0 && numNeeded!= bytes_needed){ | |
5303 | log_err("ucnv_fromUChars returns different values for required capacity in pre-flight and conversion modes"); | |
5304 | } | |
5305 | numNeeded = bytes_needed; | |
5306 | } while (status == U_BUFFER_OVERFLOW_ERROR); | |
5307 | ucol_close(myCollator); | |
5308 | ucnv_close(utf8cnv); | |
5309 | free(buff); | |
b75a7d8f A |
5310 | } |
5311 | ||
5312 | #endif | |
5313 | ||
5314 | static void TestJitterbug1293(){ | |
73c04bcf | 5315 | static const UChar src[] = {0x30DE, 0x30A4, 0x5E83, 0x544A, 0x30BF, 0x30A4, 0x30D7,0x000}; |
b75a7d8f A |
5316 | char target[256]; |
5317 | UErrorCode status = U_ZERO_ERROR; | |
5318 | UConverter* conv=NULL; | |
5319 | int32_t target_cap, bytes_needed, numNeeded = 0; | |
5320 | conv = ucnv_open("shift-jis",&status); | |
5321 | if(U_FAILURE(status)){ | |
5322 | log_data_err("Could not open Shift-Jis converter. Error: %s", u_errorName(status)); | |
5323 | return; | |
5324 | } | |
5325 | ||
5326 | do{ | |
5327 | target_cap =0; | |
5328 | bytes_needed = ucnv_fromUChars(conv,target,256,src,u_strlen(src),&status); | |
5329 | target_cap = (bytes_needed > target_cap) ? bytes_needed : target_cap +1; | |
5330 | if(numNeeded!=0 && numNeeded!= bytes_needed){ | |
5331 | log_err("ucnv_fromUChars returns different values for required capacity in pre-flight and conversion modes"); | |
5332 | } | |
5333 | numNeeded = bytes_needed; | |
5334 | } while (status == U_BUFFER_OVERFLOW_ERROR); | |
5335 | if(U_FAILURE(status)){ | |
5336 | log_err("An error occured in ucnv_fromUChars. Error: %s", u_errorName(status)); | |
5337 | return; | |
5338 | } | |
5339 | ucnv_close(conv); | |
5340 | } | |
5341 |