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