cnormtst.c revision 27f654740f2a26ad62a5c155af9199af9e69b889
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT: 350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (c) 1997-2010, International Business Machines Corporation and 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/ 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************************** 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File CNORMTST.C 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History: 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Name Description 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Madhu Katragadda Ported for C API 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* synwee added test for quick check 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* synwee added test for checkFCD 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*********************************************************************************/ 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*tests for u_normalization*/ 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unorm.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_NORMALIZATION 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNormTest(TestNode** root) { 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* no normalization - nothing to do */ 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h> 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <time.h> 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h" 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unorm.h" 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cnormtst.h" 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof ((array)[0])) 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestAPI(void); 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNormCoverage(void); 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestConcatenate(void); 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNextPrevious(void); 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestIsNormalized(void); 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestFCNFKCClosure(void); 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestQuickCheckPerCP(void); 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestComposition(void); 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 6127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void 6227f654740f2a26ad62a5c155af9199af9e69b889clairehoTestFCD(void); 6327f654740f2a26ad62a5c155af9199af9e69b889claireho 6427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void 6527f654740f2a26ad62a5c155af9199af9e69b889clairehoTestGetDecomposition(void); 6627f654740f2a26ad62a5c155af9199af9e69b889claireho 6727f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const canonTests[][3] = { 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Input*/ /*Decomposed*/ /*Composed*/ 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "cat", "cat", "cat" }, 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00e0ardvark", "a\\u0300ardvark", "\\u00e0ardvark", }, 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u1e0a", "D\\u0307", "\\u1e0a" }, /* D-dot_above*/ 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "D\\u0307", "D\\u0307", "\\u1e0a" }, /* D dot_above*/ 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u1e0c\\u0307", "D\\u0323\\u0307", "\\u1e0c\\u0307" }, /* D-dot_below dot_above*/ 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u1e0a\\u0323", "D\\u0323\\u0307", "\\u1e0c\\u0307" }, /* D-dot_above dot_below */ 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "D\\u0307\\u0323", "D\\u0323\\u0307", "\\u1e0c\\u0307" }, /* D dot_below dot_above */ 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u1e10\\u0307\\u0323", "D\\u0327\\u0323\\u0307", "\\u1e10\\u0323\\u0307" }, /*D dot_below cedilla dot_above*/ 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "D\\u0307\\u0328\\u0323", "D\\u0328\\u0323\\u0307", "\\u1e0c\\u0328\\u0307" }, /* D dot_above ogonek dot_below*/ 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u1E14", "E\\u0304\\u0300", "\\u1E14" }, /* E-macron-grave*/ 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u0112\\u0300", "E\\u0304\\u0300", "\\u1E14" }, /* E-macron + grave*/ 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00c8\\u0304", "E\\u0300\\u0304", "\\u00c8\\u0304" }, /* E-grave + macron*/ 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u212b", "A\\u030a", "\\u00c5" }, /* angstrom_sign*/ 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00c5", "A\\u030a", "\\u00c5" }, /* A-ring*/ 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00C4ffin", "A\\u0308ffin", "\\u00C4ffin" }, 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00C4\\uFB03n", "A\\u0308\\uFB03n", "\\u00C4\\uFB03n" }, 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "Henry IV", "Henry IV", "Henry IV" }, 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "Henry \\u2163", "Henry \\u2163", "Henry \\u2163" }, 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u30AC", "\\u30AB\\u3099", "\\u30AC" }, /* ga (Katakana)*/ 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u30AB\\u3099", "\\u30AB\\u3099", "\\u30AC" }, /*ka + ten*/ 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\uFF76\\uFF9E", "\\uFF76\\uFF9E", "\\uFF76\\uFF9E" }, /* hw_ka + hw_ten*/ 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u30AB\\uFF9E", "\\u30AB\\uFF9E", "\\u30AB\\uFF9E" }, /* ka + hw_ten*/ 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\uFF76\\u3099", "\\uFF76\\u3099", "\\uFF76\\u3099" }, /* hw_ka + ten*/ 10027f654740f2a26ad62a5c155af9199af9e69b889claireho { "A\\u0300\\u0316", "A\\u0316\\u0300", "\\u00C0\\u0316" }, /* hw_ka + ten*/ 10127f654740f2a26ad62a5c155af9199af9e69b889claireho { "", "", "" } 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 10427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const compatTests[][3] = { 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Input*/ /*Decomposed */ /*Composed*/ 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "cat", "cat", "cat" }, 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\uFB4f", "\\u05D0\\u05DC", "\\u05D0\\u05DC" }, /* Alef-Lamed vs. Alef, Lamed*/ 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00C4ffin", "A\\u0308ffin", "\\u00C4ffin" }, 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00C4\\uFB03n", "A\\u0308ffin", "\\u00C4ffin" }, /* ffi ligature -> f + f + i*/ 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "Henry IV", "Henry IV", "Henry IV" }, 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "Henry \\u2163", "Henry IV", "Henry IV" }, 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u30AC", "\\u30AB\\u3099", "\\u30AC" }, /* ga (Katakana)*/ 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u30AB\\u3099", "\\u30AB\\u3099", "\\u30AC" }, /*ka + ten*/ 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\uFF76\\u3099", "\\u30AB\\u3099", "\\u30AC" }, /* hw_ka + ten*/ 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*These two are broken in Unicode 2.1.2 but fixed in 2.1.5 and later*/ 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\uFF76\\uFF9E", "\\u30AB\\u3099", "\\u30AC" }, /* hw_ka + hw_ten*/ 12327f654740f2a26ad62a5c155af9199af9e69b889claireho { "\\u30AB\\uFF9E", "\\u30AB\\u3099", "\\u30AC" }, /* ka + hw_ten*/ 12427f654740f2a26ad62a5c155af9199af9e69b889claireho { "", "", "" } 12527f654740f2a26ad62a5c155af9199af9e69b889claireho}; 12627f654740f2a26ad62a5c155af9199af9e69b889claireho 12727f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const fcdTests[][3] = { 12827f654740f2a26ad62a5c155af9199af9e69b889claireho /* Added for testing the below-U+0300 prefix of a NUL-terminated string. */ 12927f654740f2a26ad62a5c155af9199af9e69b889claireho { "\\u010e\\u0327", "D\\u0327\\u030c", NULL }, /* D-caron + cedilla */ 13027f654740f2a26ad62a5c155af9199af9e69b889claireho { "\\u010e", "\\u010e", NULL } /* D-caron */ 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNormTest(TestNode** root); 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNormTest(TestNode** root) 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestAPI, "tsnorm/cnormtst/TestAPI"); 13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestDecomp, "tsnorm/cnormtst/TestDecomp"); 13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestCompatDecomp, "tsnorm/cnormtst/TestCompatDecomp"); 14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestCanonDecompCompose, "tsnorm/cnormtst/TestCanonDecompCompose"); 14127f654740f2a26ad62a5c155af9199af9e69b889claireho addTest(root, &TestCompatDecompCompose, "tsnorm/cnormtst/TestCompatDecompCompose"); 14227f654740f2a26ad62a5c155af9199af9e69b889claireho addTest(root, &TestFCD, "tsnorm/cnormtst/TestFCD"); 14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestNull, "tsnorm/cnormtst/TestNull"); 14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestQuickCheck, "tsnorm/cnormtst/TestQuickCheck"); 14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestQuickCheckPerCP, "tsnorm/cnormtst/TestQuickCheckPerCP"); 14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestIsNormalized, "tsnorm/cnormtst/TestIsNormalized"); 14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestCheckFCD, "tsnorm/cnormtst/TestCheckFCD"); 14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestNormCoverage, "tsnorm/cnormtst/TestNormCoverage"); 14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestConcatenate, "tsnorm/cnormtst/TestConcatenate"); 15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestNextPrevious, "tsnorm/cnormtst/TestNextPrevious"); 15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestFCNFKCClosure, "tsnorm/cnormtst/TestFCNFKCClosure"); 15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestComposition, "tsnorm/cnormtst/TestComposition"); 15327f654740f2a26ad62a5c155af9199af9e69b889claireho addTest(root, &TestGetDecomposition, "tsnorm/cnormtst/TestGetDecomposition"); 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 15627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const modeStrings[]={ 15727f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_NONE", 15827f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_NFD", 15927f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_NFKD", 16027f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_NFC", 16127f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_NFKC", 16227f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_FCD", 16327f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_MODE_COUNT" 16427f654740f2a26ad62a5c155af9199af9e69b889claireho}; 16527f654740f2a26ad62a5c155af9199af9e69b889claireho 16627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestNormCases(UNormalizationMode mode, 16727f654740f2a26ad62a5c155af9199af9e69b889claireho const char* const cases[][3], int32_t lengthOfCases) { 16827f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t x, neededLen, length2; 16927f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t expIndex= (mode==UNORM_NFC || mode==UNORM_NFKC) ? 2 : 1; 17027f654740f2a26ad62a5c155af9199af9e69b889claireho UChar *source=NULL; 17127f654740f2a26ad62a5c155af9199af9e69b889claireho UChar result[16]; 17227f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Testing unorm_normalize(%s)\n", modeStrings[mode]); 17327f654740f2a26ad62a5c155af9199af9e69b889claireho for(x=0; x < lengthOfCases; x++) 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 17527f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR, status2 = U_ZERO_ERROR; 17627f654740f2a26ad62a5c155af9199af9e69b889claireho source=CharsToUChars(cases[x][0]); 17727f654740f2a26ad62a5c155af9199af9e69b889claireho neededLen= unorm_normalize(source, u_strlen(source), mode, 0, NULL, 0, &status); 17827f654740f2a26ad62a5c155af9199af9e69b889claireho length2= unorm_normalize(source, -1, mode, 0, NULL, 0, &status2); 17927f654740f2a26ad62a5c155af9199af9e69b889claireho if(neededLen!=length2) { 18027f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("ERROR in unorm_normalize(%s)[%d]: " 18127f654740f2a26ad62a5c155af9199af9e69b889claireho "preflight length/NUL %d!=%d preflight length/srcLength\n", 18227f654740f2a26ad62a5c155af9199af9e69b889claireho modeStrings[mode], (int)x, (int)neededLen, (int)length2); 18327f654740f2a26ad62a5c155af9199af9e69b889claireho } 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status==U_BUFFER_OVERFLOW_ERROR) 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ZERO_ERROR; 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 18827f654740f2a26ad62a5c155af9199af9e69b889claireho length2=unorm_normalize(source, u_strlen(source), mode, 0, result, LENGTHOF(result), &status); 18927f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status) || neededLen!=length2) { 19027f654740f2a26ad62a5c155af9199af9e69b889claireho log_data_err("ERROR in unorm_normalize(%s/NUL) at %s: %s - (Are you missing data?)\n", 19127f654740f2a26ad62a5c155af9199af9e69b889claireho modeStrings[mode], austrdup(source), myErrorName(status)); 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 19327f654740f2a26ad62a5c155af9199af9e69b889claireho assertEqual(result, cases[x][expIndex], x); 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 19527f654740f2a26ad62a5c155af9199af9e69b889claireho length2=unorm_normalize(source, -1, mode, 0, result, LENGTHOF(result), &status); 19627f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status) || neededLen!=length2) { 19727f654740f2a26ad62a5c155af9199af9e69b889claireho log_data_err("ERROR in unorm_normalize(%s/srcLength) at %s: %s - (Are you missing data?)\n", 19827f654740f2a26ad62a5c155af9199af9e69b889claireho modeStrings[mode], austrdup(source), myErrorName(status)); 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 20027f654740f2a26ad62a5c155af9199af9e69b889claireho assertEqual(result, cases[x][expIndex], x); 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(source); 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 20627f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestDecomp() { 20727f654740f2a26ad62a5c155af9199af9e69b889claireho TestNormCases(UNORM_NFD, canonTests, LENGTHOF(canonTests)); 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 21027f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestCompatDecomp() { 21127f654740f2a26ad62a5c155af9199af9e69b889claireho TestNormCases(UNORM_NFKD, compatTests, LENGTHOF(compatTests)); 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 21427f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestCanonDecompCompose() { 21527f654740f2a26ad62a5c155af9199af9e69b889claireho TestNormCases(UNORM_NFC, canonTests, LENGTHOF(canonTests)); 21627f654740f2a26ad62a5c155af9199af9e69b889claireho} 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 21827f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestCompatDecompCompose() { 21927f654740f2a26ad62a5c155af9199af9e69b889claireho TestNormCases(UNORM_NFKC, compatTests, LENGTHOF(compatTests)); 22027f654740f2a26ad62a5c155af9199af9e69b889claireho} 22127f654740f2a26ad62a5c155af9199af9e69b889claireho 22227f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestFCD() { 22327f654740f2a26ad62a5c155af9199af9e69b889claireho TestNormCases(UNORM_FCD, fcdTests, LENGTHOF(fcdTests)); 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void assertEqual(const UChar* result, const char* expected, int32_t index) 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *expectedUni = CharsToUChars(expected); 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strcmp(result, expectedUni)!=0){ 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in decomposition at index = %d. EXPECTED: %s , GOT: %s\n", index, expected, 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru austrdup(result) ); 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(expectedUni); 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNull_check(UChar *src, int32_t srcLen, 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *exp, int32_t expLen, 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNormalizationMode mode, 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *name) 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len, i; 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar result[50]; 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0;i<50;i++) 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result[i] = 0xFFFD; 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len = unorm_normalize(src, srcLen, mode, 0, result, 50, &status); 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 25750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_normalize(%s) with 0x0000 failed: %s - (Are you missing data?)\n", name, u_errorName(status)); 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (len != expLen) { 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("unorm_normalize(%s) with 0x0000 failed: Expected len %d, got %d\n", name, expLen, len); 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0;i<len;i++){ 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(exp[i] != result[i]) { 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("unorm_normalize(%s): @%d, expected \\u%04X got \\u%04X\n", 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name, 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exp[i], 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result[i]); 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" %d: \\u%04X\n", i, result[i]); 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("unorm_normalize(%s) with 0x0000: OK\n", name); 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestNull() 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar source_comp[] = { 0x0061, 0x0000, 0x0044, 0x0307 }; 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t source_comp_len = 4; 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar expect_comp[] = { 0x0061, 0x0000, 0x1e0a }; 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t expect_comp_len = 3; 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar source_dcmp[] = { 0x1e0A, 0x0000, 0x0929 }; 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t source_dcmp_len = 3; 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar expect_dcmp[] = { 0x0044, 0x0307, 0x0000, 0x0928, 0x093C }; 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t expect_dcmp_len = 5; 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestNull_check(source_comp, 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source_comp_len, 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect_comp, 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect_comp_len, 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFC, 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UNORM_NFC"); 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestNull_check(source_dcmp, 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source_dcmp_len, 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect_dcmp, 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect_dcmp_len, 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFD, 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UNORM_NFD"); 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestNull_check(source_comp, 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source_comp_len, 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect_comp, 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect_comp_len, 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFKC, 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UNORM_NFKC"); 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckResultNO() 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFD[] = {0x00C5, 0x0407, 0x1E00, 0x1F57, 0x220C, 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x30AE, 0xAC00, 0xD7A3, 0xFB36, 0xFB4E}; 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFC[] = {0x0340, 0x0F93, 0x1F77, 0x1FBB, 0x1FEB, 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2000, 0x232A, 0xF900, 0xFA1E, 0xFB4E}; 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFKD[] = {0x00A0, 0x02E4, 0x1FDB, 0x24EA, 0x32FE, 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xAC00, 0xFB4E, 0xFA10, 0xFF3F, 0xFA2D}; 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFKC[] = {0x00A0, 0x017F, 0x2000, 0x24EA, 0x32FE, 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x33FE, 0xFB4E, 0xFA10, 0xFF3F, 0xFA2D}; 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int SIZE = 10; 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int count = 0; 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode error = U_ZERO_ERROR; 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (; count < SIZE; count ++) 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFD[count]), 1, UNORM_NFD, &error) != 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NO) 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFD quick check at U+%04x\n", CPNFD[count]); 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFC[count]), 1, UNORM_NFC, &error) != 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NO) 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFC quick check at U+%04x\n", CPNFC[count]); 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFKD[count]), 1, UNORM_NFKD, &error) != 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NO) 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKD quick check at U+%04x\n", CPNFKD[count]); 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFKC[count]), 1, UNORM_NFKC, &error) != 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NO) 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKC quick check at U+%04x\n", CPNFKC[count]); 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckResultYES() 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFD[] = {0x00C6, 0x017F, 0x0F74, 0x1000, 0x1E9A, 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2261, 0x3075, 0x4000, 0x5000, 0xF000}; 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFC[] = {0x0400, 0x0540, 0x0901, 0x1000, 0x1500, 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x1E9A, 0x3000, 0x4000, 0x5000, 0xF000}; 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFKD[] = {0x00AB, 0x02A0, 0x1000, 0x1027, 0x2FFB, 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x3FFF, 0x4FFF, 0xA000, 0xF000, 0xFA27}; 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFKC[] = {0x00B0, 0x0100, 0x0200, 0x0A02, 0x1000, 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2010, 0x3030, 0x4000, 0xA000, 0xFA0E}; 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int SIZE = 10; 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int count = 0; 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode error = U_ZERO_ERROR; 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar cp = 0; 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (cp < 0xA0) 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&cp, 1, UNORM_NFD, &error) != UNORM_YES) 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 38350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("ERROR in NFD quick check at U+%04x - (Are you missing data?)\n", cp); 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&cp, 1, UNORM_NFC, &error) != 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFC quick check at U+%04x\n", cp); 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&cp, 1, UNORM_NFKD, &error) != UNORM_YES) 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKD quick check at U+%04x\n", cp); 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&cp, 1, UNORM_NFKC, &error) != 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKC quick check at U+%04x\n", cp); 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cp ++; 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (; count < SIZE; count ++) 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFD[count]), 1, UNORM_NFD, &error) != 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFD quick check at U+%04x\n", CPNFD[count]); 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFC[count]), 1, UNORM_NFC, &error) 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru != UNORM_YES) 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFC quick check at U+%04x\n", CPNFC[count]); 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFKD[count]), 1, UNORM_NFKD, &error) != 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKD quick check at U+%04x\n", CPNFKD[count]); 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFKC[count]), 1, UNORM_NFKC, &error) != 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKC quick check at U+%04x\n", CPNFKC[count]); 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckResultMAYBE() 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFC[] = {0x0306, 0x0654, 0x0BBE, 0x102E, 0x1161, 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x116A, 0x1173, 0x1175, 0x3099, 0x309A}; 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFKC[] = {0x0300, 0x0654, 0x0655, 0x09D7, 0x0B3E, 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0DCF, 0xDDF, 0x102E, 0x11A8, 0x3099}; 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int SIZE = 10; 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int count = 0; 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode error = U_ZERO_ERROR; 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* NFD and NFKD does not have any MAYBE codepoints */ 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (; count < SIZE; count ++) 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFC[count]), 1, UNORM_NFC, &error) != 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_MAYBE) 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 45450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("ERROR in NFC quick check at U+%04x - (Are you missing data?)\n", CPNFC[count]); 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFKC[count]), 1, UNORM_NFKC, &error) != 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_MAYBE) 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKC quick check at U+%04x\n", CPNFKC[count]); 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckStringResult() 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int count; 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *d = NULL; 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *c = NULL; 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode error = U_ZERO_ERROR; 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (count = 0; count < LENGTHOF(canonTests); count ++) 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru d = CharsToUChars(canonTests[count][1]); 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = CharsToUChars(canonTests[count][2]); 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(d, u_strlen(d), UNORM_NFD, &error) != 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 48050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("ERROR in NFD quick check for string at count %d - (Are you missing data?)\n", count); 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(c, u_strlen(c), UNORM_NFC, &error) == 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NO) 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFC quick check for string at count %d\n", count); 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(d); 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(c); 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (count = 0; count < LENGTHOF(compatTests); count ++) 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru d = CharsToUChars(compatTests[count][1]); 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = CharsToUChars(compatTests[count][2]); 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(d, u_strlen(d), UNORM_NFKD, &error) != 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKD quick check for string at count %d\n", count); 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(c, u_strlen(c), UNORM_NFKC, &error) != 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKC quick check for string at count %d\n", count); 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(d); 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(c); 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestQuickCheck() 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestQuickCheckResultNO(); 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestQuickCheckResultYES(); 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestQuickCheckResultMAYBE(); 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestQuickCheckStringResult(); 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The intltest/NormalizerConformanceTest tests a lot of strings that _are_ 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * normalized, and some that are not. 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Here we pick some specific cases and test the C API. 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestIsNormalized(void) { 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar notNFC[][8]={ /* strings that are not in NFC */ 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x62, 0x61, 0x300, 0x63, 0 }, /* 0061 0300 compose */ 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xfb1d, 0 }, /* excluded from composition */ 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x0627, 0x0653, 0 }, /* 0627 0653 compose */ 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x3071, 0x306f, 0x309a, 0x3073, 0 } /* 306F 309A compose */ 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar notNFKC[][8]={ /* strings that are not in NFKC */ 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x1100, 0x1161, 0 }, /* Jamo compose */ 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x1100, 0x314f, 0 }, /* compatibility Jamo compose */ 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x03b1, 0x1f00, 0x0345, 0x03b3, 0 } /* 1F00 0345 compose */ 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* API test */ 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* normal case with length>=0 (length -1 used for special cases below) */ 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!unorm_isNormalized(notNFC[0]+2, 1, UNORM_NFC, &errorCode) || U_FAILURE(errorCode)) { 55250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: !isNormalized(<U+0300>, NFC) (%s) - (Are you missing data?)\n", u_errorName(errorCode)); 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* incoming U_FAILURE */ 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_TRUNCATED_CHAR_FOUND; 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (void)unorm_isNormalized(notNFC[0]+2, 1, UNORM_NFC, &errorCode); 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_TRUNCATED_CHAR_FOUND) { 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: isNormalized(U_TRUNCATED_CHAR_FOUND) changed the error code to %s\n", u_errorName(errorCode)); 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* NULL source */ 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (void)unorm_isNormalized(NULL, 1, UNORM_NFC, &errorCode); 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 56650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: isNormalized(NULL) did not set U_ILLEGAL_ARGUMENT_ERROR but %s - (Are you missing data?)\n", u_errorName(errorCode)); 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* bad length */ 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (void)unorm_isNormalized(notNFC[0]+2, -2, UNORM_NFC, &errorCode); 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 57350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: isNormalized([-2]) did not set U_ILLEGAL_ARGUMENT_ERROR but %s - (Are you missing data?)\n", u_errorName(errorCode)); 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* specific cases */ 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<LENGTHOF(notNFC); ++i) { 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(unorm_isNormalized(notNFC[i], -1, UNORM_NFC, &errorCode) || U_FAILURE(errorCode)) { 58050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: isNormalized(notNFC[%d], NFC) is wrong (%s) - (Are you missing data?)\n", i, u_errorName(errorCode)); 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(unorm_isNormalized(notNFC[i], -1, UNORM_NFKC, &errorCode) || U_FAILURE(errorCode)) { 58450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: isNormalized(notNFC[%d], NFKC) is wrong (%s) - (Are you missing data?)\n", i, u_errorName(errorCode)); 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<LENGTHOF(notNFKC); ++i) { 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(unorm_isNormalized(notNFKC[i], -1, UNORM_NFKC, &errorCode) || U_FAILURE(errorCode)) { 59050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: isNormalized(notNFKC[%d], NFKC) is wrong (%s) - (Are you missing data?)\n", i, u_errorName(errorCode)); 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestCheckFCD() 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar FAST_[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0A}; 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar FALSE_[] = {0x0001, 0x0002, 0x02EA, 0x03EB, 0x0300, 0x0301, 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x02B9, 0x0314, 0x0315, 0x0316}; 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar TRUE_[] = {0x0030, 0x0040, 0x0440, 0x056D, 0x064F, 0x06E7, 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0050, 0x0730, 0x09EE, 0x1E10}; 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar datastr[][5] = 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { {0x0061, 0x030A, 0x1E05, 0x0302, 0}, 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0061, 0x030A, 0x00E2, 0x0323, 0}, 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0061, 0x0323, 0x00E2, 0x0323, 0}, 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0061, 0x0323, 0x1E05, 0x0302, 0} }; 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UBool result[] = {UNORM_YES, UNORM_NO, UNORM_NO, UNORM_YES}; 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar datachar[] = {0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6a, 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xea, 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0307, 0x0308, 0x0309, 0x030a, 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0327, 0x0328, 0x0329, 0x032a, 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x1e00, 0x1e01, 0x1e02, 0x1e03, 0x1e04, 0x1e05, 0x1e06, 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x1e07, 0x1e08, 0x1e09, 0x1e0a}; 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int count = 0; 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(FAST_, 10, UNORM_FCD, &status) != UNORM_YES) 62650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: expected value for fast unorm_quickCheck is UNORM_YES - (Are you missing data?)\n"); 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(FALSE_, 10, UNORM_FCD, &status) != UNORM_NO) 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("unorm_quickCheck(FCD) failed: expected value for error unorm_quickCheck is UNORM_NO\n"); 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(TRUE_, 10, UNORM_FCD, &status) != UNORM_YES) 63050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: expected value for correct unorm_quickCheck is UNORM_YES - (Are you missing data?)\n"); 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 63350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: %s - (Are you missing data?)\n", u_errorName(status)); 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (count < 4) 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool fcdresult = unorm_quickCheck(datastr[count], 4, UNORM_FCD, &status); 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 63950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: exception occured at data set %d - (Are you missing data?)\n", count); 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result[count] != fcdresult) { 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("unorm_quickCheck(FCD) failed: Data set %d expected value %d\n", count, 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result[count]); 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count ++; 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* random checks of long strings */ 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srand((unsigned)time( NULL )); 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (count = 0; count < 50; count ++) 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int size = 0; 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool testresult = UNORM_YES; 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar data[20]; 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar norm[100]; 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar nfd[100]; 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int normsize = 0; 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int nfdsize = 0; 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (size != 19) { 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru data[size] = datachar[(rand() * 50) / RAND_MAX]; 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("0x%x", data[size]); 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru normsize += unorm_normalize(data + size, 1, UNORM_NFD, 0, 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru norm + normsize, 100 - normsize, &status); 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 67150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: exception occured at data generation - (Are you missing data?)\n"); 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size ++; 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfdsize = unorm_normalize(data, size, UNORM_NFD, 0, 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfd, 100, &status); 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 68150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: exception occured at normalized data generation - (Are you missing data?)\n"); 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (nfdsize != normsize || u_memcmp(nfd, norm, nfdsize) != 0) { 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testresult = UNORM_NO; 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (testresult == UNORM_YES) { 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("result UNORM_YES\n"); 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("result UNORM_NO\n"); 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(data, size, UNORM_FCD, &status) != testresult || U_FAILURE(status)) { 69550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: expected %d for random data - (Are you missing data?)\n", testresult); 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestAPI() { 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar in[]={ 0x68, 0xe4 }; 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar out[20]={ 0xffff, 0xffff, 0xffff, 0xffff }; 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try preflighting */ 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_normalize(in, 2, UNORM_NFD, 0, NULL, 0, &errorCode); 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=3) { 71150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_normalize(pure preflighting NFD)=%ld failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode)); 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_normalize(in, 2, UNORM_NFD, 0, out, 3, &errorCode); 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("unorm_normalize(NFD)=%ld failed with %s\n", length, u_errorName(errorCode)); 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(length!=3 || out[2]!=0x308 || out[3]!=0xffff) { 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("unorm_normalize(NFD ma<umlaut>)=%ld failed with out[]=U+%04x U+%04x U+%04x U+%04x\n", length, out[0], out[1], out[2], out[3]); 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 72527f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm_normalize(NULL, 0, UNORM_NFC, 0, NULL, 0, &errorCode); 72627f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(errorCode)) { 72727f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("unorm_normalize(src NULL[0], NFC, dest NULL[0])=%ld failed with %s\n", (long)length, u_errorName(errorCode)); 72827f654740f2a26ad62a5c155af9199af9e69b889claireho return; 72927f654740f2a26ad62a5c155af9199af9e69b889claireho } 73027f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm_normalize(NULL, 0, UNORM_NFC, 0, out, 20, &errorCode); 73127f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(errorCode)) { 73227f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("unorm_normalize(src NULL[0], NFC, dest out[20])=%ld failed with %s\n", (long)length, u_errorName(errorCode)); 73327f654740f2a26ad62a5c155af9199af9e69b889claireho return; 73427f654740f2a26ad62a5c155af9199af9e69b889claireho } 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test cases to improve test code coverage */ 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum { 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_K_KIYEOK=0x3131, /* NFKD->Jamo L U+1100 */ 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_K_WEO=0x315d, /* NFKD->Jamo V U+116f */ 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_K_KIYEOK_SIOS=0x3133, /* NFKD->Jamo T U+11aa */ 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_KIYEOK=0x1100, /* Jamo L U+1100 */ 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_WEO=0x116f, /* Jamo V U+116f */ 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_KIYEOK_SIOS=0x11aa, /* Jamo T U+11aa */ 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_AC00=0xac00, /* Hangul syllable = Jamo LV U+ac00 */ 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_SYLLABLE=0xac00+14*28+3, /* Hangul syllable = U+1100 * U+116f * U+11aa */ 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MUSICAL_VOID_NOTEHEAD=0x1d157, 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MUSICAL_HALF_NOTE=0x1d15e, /* NFC/NFD->Notehead+Stem */ 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MUSICAL_STEM=0x1d165, /* cc=216 */ 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MUSICAL_STACCATO=0x1d17c /* cc=220 */ 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNormCoverage() { 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar input[1000], expect[1000], output[1000]; 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, length, inLength, expectLength, hangulPrefixLength, preflightLength; 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* create a long and nasty string with NFKC-unsafe characters */ 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inLength=0; 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 3 Jamos L/V/T, all 8 combinations normal/compatibility */ 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK; 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_WEO; 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK_SIOS; 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK; 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_WEO; 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK_SIOS; 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK; 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_WEO; 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK_SIOS; 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK; 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_WEO; 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK_SIOS; 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK; 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_WEO; 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK_SIOS; 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK; 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_WEO; 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK_SIOS; 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK; 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_WEO; 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK_SIOS; 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK; 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_WEO; 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK_SIOS; 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Hangul LV with normal/compatibility Jamo T */ 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_AC00; 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK_SIOS; 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_AC00; 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK_SIOS; 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* compatibility Jamo L, V */ 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK; 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_WEO; 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru hangulPrefixLength=inLength; 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=UTF16_LEAD(MUSICAL_HALF_NOTE); 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=UTF16_TRAIL(MUSICAL_HALF_NOTE); 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<200; ++i) { 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=UTF16_LEAD(MUSICAL_STACCATO); 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=UTF16_TRAIL(MUSICAL_STACCATO); 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=UTF16_LEAD(MUSICAL_STEM); 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=UTF16_TRAIL(MUSICAL_STEM); 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* (compatibility) Jamo L, T do not compose */ 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK; 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK_SIOS; 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* quick checks */ 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_NFD, &errorCode) || U_FAILURE(errorCode)) { 82750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_quickCheck(long input, UNORM_NFD)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode)); 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_NFKD, &errorCode) || U_FAILURE(errorCode)) { 83150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_quickCheck(long input, UNORM_NFKD)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode)); 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_NFC, &errorCode) || U_FAILURE(errorCode)) { 83550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_quickCheck(long input, UNORM_NFC)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode)); 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_NFKC, &errorCode) || U_FAILURE(errorCode)) { 83950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_quickCheck(long input, UNORM_NFKC)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode)); 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_FCD, &errorCode) || U_FAILURE(errorCode)) { 84350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_quickCheck(long input, UNORM_FCD)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode)); 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* NFKC */ 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectLength=0; 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_SYLLABLE; 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_SYLLABLE; 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_SYLLABLE; 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_SYLLABLE; 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_SYLLABLE; 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_SYLLABLE; 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_SYLLABLE; 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_SYLLABLE; 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_AC00+3; 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_AC00+3; 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_AC00+14*28; 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_LEAD(MUSICAL_VOID_NOTEHEAD); 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_TRAIL(MUSICAL_VOID_NOTEHEAD); 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_LEAD(MUSICAL_STEM); 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_TRAIL(MUSICAL_STEM); 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<200; ++i) { 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_LEAD(MUSICAL_STEM); 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_TRAIL(MUSICAL_STEM); 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<200; ++i) { 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_LEAD(MUSICAL_STACCATO); 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_TRAIL(MUSICAL_STACCATO); 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_KIYEOK; 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_KIYEOK_SIOS; 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try destination overflow first */ 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru preflightLength=unorm_normalize(input, inLength, 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFKC, 0, 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru output, 100, /* too short */ 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR) { 89350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_normalize(long input, output too short, UNORM_NFKC) did not overflow but %s - (Are you missing data?)\n", u_errorName(errorCode)); 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* real NFKC */ 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_normalize(input, inLength, 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFKC, 0, 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru output, sizeof(output)/U_SIZEOF_UCHAR, 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 90350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_normalize(long input, UNORM_NFKC) failed with %s - (Are you missing data?)\n", u_errorName(errorCode)); 904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(length!=expectLength || u_memcmp(output, expect, length)!=0) { 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_normalize(long input, UNORM_NFKC) produced wrong result\n"); 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<length; ++i) { 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(output[i]!=expect[i]) { 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err(" NFKC[%d]==U+%04lx expected U+%04lx\n", i, output[i], expect[i]); 909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(length!=preflightLength) { 914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_normalize(long input, UNORM_NFKC)==%ld but preflightLength==%ld\n", length, preflightLength); 915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* FCD */ 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memcpy(expect, input, hangulPrefixLength); 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectLength=hangulPrefixLength; 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_LEAD(MUSICAL_VOID_NOTEHEAD); 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_TRAIL(MUSICAL_VOID_NOTEHEAD); 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_LEAD(MUSICAL_STEM); 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_TRAIL(MUSICAL_STEM); 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<200; ++i) { 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_LEAD(MUSICAL_STEM); 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_TRAIL(MUSICAL_STEM); 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<200; ++i) { 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_LEAD(MUSICAL_STACCATO); 931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=UTF16_TRAIL(MUSICAL_STACCATO); 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_K_KIYEOK; 935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_K_KIYEOK_SIOS; 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_normalize(input, inLength, 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_FCD, 0, 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru output, sizeof(output)/U_SIZEOF_UCHAR, 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 94350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_normalize(long input, UNORM_FCD) failed with %s - (Are you missing data?)\n", u_errorName(errorCode)); 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(length!=expectLength || u_memcmp(output, expect, length)!=0) { 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_normalize(long input, UNORM_FCD) produced wrong result\n"); 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<length; ++i) { 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(output[i]!=expect[i]) { 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err(" FCD[%d]==U+%04lx expected U+%04lx\n", i, output[i], expect[i]); 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* API test for unorm_concatenate() - for real test strings see intltest/tstnorm.cpp */ 956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestConcatenate(void) { 958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* "re + 'sume'" */ 959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar 960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru left[]={ 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x72, 0x65, 0 962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru right[]={ 964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x301, 0x73, 0x75, 0x6d, 0xe9, 0 965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[]={ 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x72, 0xe9, 0x73, 0x75, 0x6d, 0xe9, 0 968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[100]; 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* left with length, right NUL-terminated */ 975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_concatenate(left, 2, right, -1, buffer, 100, UNORM_NFC, 0, &errorCode); 977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode) || length!=6 || 0!=u_memcmp(buffer, expect, length)) { 97850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: unorm_concatenate()=%ld (expect 6) failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode)); 979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflighting */ 982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_concatenate(left, 2, right, -1, NULL, 0, UNORM_NFC, 0, &errorCode); 984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=6) { 98550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: unorm_concatenate(preflighting)=%ld (expect 6) failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode)); 986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[2]=0x5555; 989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_concatenate(left, 2, right, -1, buffer, 1, UNORM_NFC, 0, &errorCode); 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=6 || buffer[2]!=0x5555) { 99250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: unorm_concatenate(preflighting 2)=%ld (expect 6) failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode)); 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* enter with U_FAILURE */ 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[2]=0xaaaa; 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_UNEXPECTED_TOKEN; 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_concatenate(left, 2, right, -1, buffer, 100, UNORM_NFC, 0, &errorCode); 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_UNEXPECTED_TOKEN || buffer[2]!=0xaaaa) { 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: unorm_concatenate(failure)=%ld failed with %s\n", length, u_errorName(errorCode)); 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* illegal arguments */ 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[2]=0xaaaa; 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_concatenate(NULL, 2, right, -1, buffer, 100, UNORM_NFC, 0, &errorCode); 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || buffer[2]!=0xaaaa) { 100850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: unorm_concatenate(left=NULL)=%ld failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode)); 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_concatenate(left, 2, right, -1, NULL, 100, UNORM_NFC, 0, &errorCode); 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 101450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: unorm_concatenate(buffer=NULL)=%ld failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode)); 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum { 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _PLUS=0x2b 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *const _modeString[UNORM_MODE_COUNT]={ 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "0", "NONE", "NFD", "NFKD", "NFC", "NFKC", "FCD" 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_testIter(const UChar *src, int32_t srcLength, 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator *iter, UNormalizationMode mode, UBool forward, 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *out, int32_t outLength, 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int32_t *srcIndexes, int32_t srcIndexesLength) { 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[4]; 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *expect, *outLimit, *in; 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length, i, expectLength, expectIndex, prevIndex, index, inLength; 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool neededToNormalize, expectNeeded; 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru outLimit=out+outLength; 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(forward) { 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect=out; 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=index=0; 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect=outLimit; 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=srcIndexesLength-2; 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru index=srcLength; 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(;;) { 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prevIndex=index; 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(forward) { 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!iter->hasNext(iter)) { 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(iter, 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer, sizeof(buffer)/U_SIZEOF_UCHAR, 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mode, 0, 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (UBool)(out!=NULL), &neededToNormalize, 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectIndex=srcIndexes[i+1]; 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru in=src+prevIndex; 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inLength=expectIndex-prevIndex; 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(out!=NULL) { 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* get output piece from between plus signs */ 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectLength=0; 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while((expect+expectLength)!=outLimit && expect[expectLength]!=_PLUS) { 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++expectLength; 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectNeeded=(UBool)(0!=u_memcmp(buffer, in, inLength)); 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect=in; 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectLength=inLength; 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectNeeded=FALSE; 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!iter->hasPrevious(iter)) { 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_previous(iter, 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer, sizeof(buffer)/U_SIZEOF_UCHAR, 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mode, 0, 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (UBool)(out!=NULL), &neededToNormalize, 1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectIndex=srcIndexes[i]; 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru in=src+expectIndex; 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inLength=prevIndex-expectIndex; 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(out!=NULL) { 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* get output piece from between plus signs */ 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectLength=0; 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(expect!=out && expect[-1]!=_PLUS) { 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++expectLength; 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --expect; 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectNeeded=(UBool)(0!=u_memcmp(buffer, in, inLength)); 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect=in; 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectLength=inLength; 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectNeeded=FALSE; 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru index=iter->getIndex(iter, UITER_CURRENT); 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 110550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm iteration (next/previous %d %s)[%d]: %s - (Are you missing data?)\n", 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru forward, _modeString[mode], i, u_errorName(errorCode)); 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(expectIndex!=index) { 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm iteration (next/previous %d %s): index[%d] wrong, got %d expected %d\n", 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru forward, _modeString[mode], i, index, expectIndex); 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(expectLength!=length) { 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm iteration (next/previous %d %s): length[%d] wrong, got %d expected %d\n", 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru forward, _modeString[mode], i, length, expectLength); 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(0!=u_memcmp(expect, buffer, length)) { 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm iteration (next/previous %d %s): output string[%d] wrong\n", 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru forward, _modeString[mode], i); 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(neededToNormalize!=expectNeeded) { 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(forward) { 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect+=expectLength+1; /* go after the + */ 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++i; 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --expect; /* go before the + */ 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --i; 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNextPrevious() { 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src[]={ /* input string */ 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xa0, 0xe4, 0x63, 0x302, 0x327, 0xac00, 0x3133 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfd[]={ /* + separates expected output pieces */ 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xa0, _PLUS, 0x61, 0x308, _PLUS, 0x63, 0x327, 0x302, _PLUS, 0x1100, 0x1161, _PLUS, 0x3133 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfkd[]={ 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20, _PLUS, 0x61, 0x308, _PLUS, 0x63, 0x327, 0x302, _PLUS, 0x1100, 0x1161, _PLUS, 0x11aa 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfc[]={ 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xa0, _PLUS, 0xe4, _PLUS, 0xe7, 0x302, _PLUS, 0xac00, _PLUS, 0x3133 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfkc[]={ 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20, _PLUS, 0xe4, _PLUS, 0xe7, 0x302, _PLUS, 0xac03 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fcd[]={ 1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xa0, _PLUS, 0xe4, _PLUS, 0x63, 0x327, 0x302, _PLUS, 0xac00, _PLUS, 0x3133 1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* expected iterator indexes in the source string for each iteration piece */ 1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const int32_t 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfdIndexes[]={ 1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 1, 2, 5, 6, 7 1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfkdIndexes[]={ 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 1, 2, 5, 6, 7 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfcIndexes[]={ 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 1, 2, 5, 6, 7 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfkcIndexes[]={ 1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 1, 2, 5, 7 1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fcdIndexes[]={ 1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 1, 2, 5, 6, 7 1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator iter; 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[4]; 1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool neededToNormalize; 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&iter, src, sizeof(src)/U_SIZEOF_UCHAR); 1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test iteration with doNormalize */ 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, TRUE, nfd, sizeof(nfd)/U_SIZEOF_UCHAR, nfdIndexes, sizeof(nfdIndexes)/4); 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, TRUE, nfkd, sizeof(nfkd)/U_SIZEOF_UCHAR, nfkdIndexes, sizeof(nfkdIndexes)/4); 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, TRUE, nfc, sizeof(nfc)/U_SIZEOF_UCHAR, nfcIndexes, sizeof(nfcIndexes)/4); 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, TRUE, nfkc, sizeof(nfkc)/U_SIZEOF_UCHAR, nfkcIndexes, sizeof(nfkcIndexes)/4); 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, TRUE, fcd, sizeof(fcd)/U_SIZEOF_UCHAR, fcdIndexes, sizeof(fcdIndexes)/4); 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, FALSE, nfd, sizeof(nfd)/U_SIZEOF_UCHAR, nfdIndexes, sizeof(nfdIndexes)/4); 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, FALSE, nfkd, sizeof(nfkd)/U_SIZEOF_UCHAR, nfkdIndexes, sizeof(nfkdIndexes)/4); 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, FALSE, nfc, sizeof(nfc)/U_SIZEOF_UCHAR, nfcIndexes, sizeof(nfcIndexes)/4); 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, FALSE, nfkc, sizeof(nfkc)/U_SIZEOF_UCHAR, nfkcIndexes, sizeof(nfkcIndexes)/4); 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, FALSE, fcd, sizeof(fcd)/U_SIZEOF_UCHAR, fcdIndexes, sizeof(fcdIndexes)/4); 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test iteration without doNormalize */ 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, TRUE, NULL, 0, nfdIndexes, sizeof(nfdIndexes)/4); 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, TRUE, NULL, 0, nfkdIndexes, sizeof(nfkdIndexes)/4); 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, TRUE, NULL, 0, nfcIndexes, sizeof(nfcIndexes)/4); 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, TRUE, NULL, 0, nfkcIndexes, sizeof(nfkcIndexes)/4); 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, TRUE, NULL, 0, fcdIndexes, sizeof(fcdIndexes)/4); 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, FALSE, NULL, 0, nfdIndexes, sizeof(nfdIndexes)/4); 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, FALSE, NULL, 0, nfkdIndexes, sizeof(nfkdIndexes)/4); 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, FALSE, NULL, 0, nfcIndexes, sizeof(nfcIndexes)/4); 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, FALSE, NULL, 0, nfkcIndexes, sizeof(nfkcIndexes)/4); 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, FALSE, NULL, 0, fcdIndexes, sizeof(fcdIndexes)/4); 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try without neededToNormalize */ 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[0]=5; 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=1; 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(&iter, buffer, sizeof(buffer)/U_SIZEOF_UCHAR, 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFD, 0, TRUE, NULL, 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode) || length!=2 || buffer[0]!=nfd[2] || buffer[1]!=nfd[3]) { 124150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_next(without needed) %s - (Are you missing data?)\n", u_errorName(errorCode)); 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight */ 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru neededToNormalize=9; 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=1; 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(&iter, NULL, 0, 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFD, 0, TRUE, &neededToNormalize, 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || neededToNormalize!=FALSE || length!=2) { 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_next(pure preflighting) %s\n", u_errorName(errorCode)); 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[0]=buffer[1]=5; 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru neededToNormalize=9; 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=1; 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(&iter, buffer, 1, 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFD, 0, TRUE, &neededToNormalize, 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || neededToNormalize!=FALSE || length!=2 || buffer[1]!=5) { 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_next(preflighting) %s\n", u_errorName(errorCode)); 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* no iterator */ 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[0]=buffer[1]=5; 1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru neededToNormalize=9; 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=1; 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(NULL, buffer, sizeof(buffer)/U_SIZEOF_UCHAR, 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFD, 0, TRUE, &neededToNormalize, 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_next(no iterator) %s\n", u_errorName(errorCode)); 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* illegal mode */ 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[0]=buffer[1]=5; 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru neededToNormalize=9; 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=1; 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(&iter, buffer, sizeof(buffer)/U_SIZEOF_UCHAR, 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (UNormalizationMode)0, 0, TRUE, &neededToNormalize, 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_next(illegal mode) %s\n", u_errorName(errorCode)); 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* error coming in */ 1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_MISPLACED_QUANTIFIER; 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[0]=5; 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=1; 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(&iter, buffer, sizeof(buffer)/U_SIZEOF_UCHAR, 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFD, 0, TRUE, NULL, 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_MISPLACED_QUANTIFIER) { 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_next(U_MISPLACED_QUANTIFIER) %s\n", u_errorName(errorCode)); 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestFCNFKCClosure(void) { 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c; 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar s[6]; 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } tests[]={ 131250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 0x00C4, { 0 } }, 131350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 0x00E4, { 0 } }, 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x037A, { 0x0020, 0x03B9, 0 } }, 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x03D2, { 0x03C5, 0 } }, 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x20A8, { 0x0072, 0x0073, 0 } }, 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x210B, { 0x0068, 0 } }, 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x210C, { 0x0068, 0 } }, 1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x2121, { 0x0074, 0x0065, 0x006C, 0 } }, 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x2122, { 0x0074, 0x006D, 0 } }, 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x2128, { 0x007A, 0 } }, 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x1D5DB, { 0x0068, 0 } }, 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x1D5ED, { 0x007A, 0 } }, 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x0061, { 0 } } 1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[8]; 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, length; 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<LENGTHOF(tests); ++i) { 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=u_getFC_NFKC_Closure(tests[i].c, buffer, LENGTHOF(buffer), &errorCode); 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode) || length!=u_strlen(buffer) || 0!=u_strcmp(tests[i].s, buffer)) { 133550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("u_getFC_NFKC_Closure(U+%04lx) is wrong (%s) - (Are you missing data?)\n", tests[i].c, u_errorName(errorCode)); 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* error handling */ 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=u_getFC_NFKC_Closure(0x5c, NULL, LENGTHOF(buffer), &errorCode); 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_getFC_NFKC_Closure(dest=NULL) is wrong (%s)\n", u_errorName(errorCode)); 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=u_getFC_NFKC_Closure(0x5c, buffer, LENGTHOF(buffer), &errorCode); 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_getFC_NFKC_Closure(U_FAILURE) is wrong (%s)\n", u_errorName(errorCode)); 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestQuickCheckPerCP() { 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c, lead, trail; 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar s[U16_MAX_LENGTH], nfd[16]; 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length, lccc1, lccc2, tccc1, tccc2; 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t qc1, qc2; 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getIntPropertyMaxValue(UCHAR_NFD_QUICK_CHECK)!=(int32_t)UNORM_YES || 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getIntPropertyMaxValue(UCHAR_NFKD_QUICK_CHECK)!=(int32_t)UNORM_YES || 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getIntPropertyMaxValue(UCHAR_NFC_QUICK_CHECK)!=(int32_t)UNORM_MAYBE || 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getIntPropertyMaxValue(UCHAR_NFKC_QUICK_CHECK)!=(int32_t)UNORM_MAYBE || 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getIntPropertyMaxValue(UCHAR_LEAD_CANONICAL_COMBINING_CLASS)!=u_getIntPropertyMaxValue(UCHAR_CANONICAL_COMBINING_CLASS) || 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getIntPropertyMaxValue(UCHAR_TRAIL_CANONICAL_COMBINING_CLASS)!=u_getIntPropertyMaxValue(UCHAR_CANONICAL_COMBINING_CLASS) 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("wrong result from one of the u_getIntPropertyMaxValue(UCHAR_NF*_QUICK_CHECK) or UCHAR_*_CANONICAL_COMBINING_CLASS\n"); 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * compare the quick check property values for some code points 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to the quick check results for checking same-code point strings 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c=0; 1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(c<0x110000) { 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=0; 1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U16_APPEND_UNSAFE(s, length, c); 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc1=u_getIntPropertyValue(c, UCHAR_NFC_QUICK_CHECK); 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc2=unorm_quickCheck(s, length, UNORM_NFC, &errorCode); 1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(qc1!=qc2) { 138450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("u_getIntPropertyValue(NFC)=%d != %d=unorm_quickCheck(NFC) for U+%04x - (Are you missing data?)\n", qc1, qc2, c); 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc1=u_getIntPropertyValue(c, UCHAR_NFD_QUICK_CHECK); 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc2=unorm_quickCheck(s, length, UNORM_NFD, &errorCode); 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(qc1!=qc2) { 139050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("u_getIntPropertyValue(NFD)=%d != %d=unorm_quickCheck(NFD) for U+%04x - (Are you missing data?)\n", qc1, qc2, c); 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc1=u_getIntPropertyValue(c, UCHAR_NFKC_QUICK_CHECK); 1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc2=unorm_quickCheck(s, length, UNORM_NFKC, &errorCode); 1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(qc1!=qc2) { 139650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("u_getIntPropertyValue(NFKC)=%d != %d=unorm_quickCheck(NFKC) for U+%04x - (Are you missing data?)\n", qc1, qc2, c); 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc1=u_getIntPropertyValue(c, UCHAR_NFKD_QUICK_CHECK); 1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc2=unorm_quickCheck(s, length, UNORM_NFKD, &errorCode); 1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(qc1!=qc2) { 140250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("u_getIntPropertyValue(NFKD)=%d != %d=unorm_quickCheck(NFKD) for U+%04x - (Are you missing data?)\n", qc1, qc2, c); 1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_normalize(s, length, UNORM_NFD, 0, nfd, LENGTHOF(nfd), &errorCode); 1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* length-length == 0 is used to get around a compiler warning. */ 1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U16_GET(nfd, 0, length-length, length, lead); 1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U16_GET(nfd, 0, length-1, length, trail); 1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lccc1=u_getIntPropertyValue(c, UCHAR_LEAD_CANONICAL_COMBINING_CLASS); 1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lccc2=u_getCombiningClass(lead); 1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tccc1=u_getIntPropertyValue(c, UCHAR_TRAIL_CANONICAL_COMBINING_CLASS); 1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tccc2=u_getCombiningClass(trail); 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(lccc1!=lccc2) { 1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_getIntPropertyValue(lccc)=%d != %d=u_getCombiningClass(lead) for U+%04x\n", 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lccc1, lccc2, c); 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(tccc1!=tccc2) { 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_getIntPropertyValue(tccc)=%d != %d=u_getCombiningClass(trail) for U+%04x\n", 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tccc1, tccc2, c); 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* skip some code points */ 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c=(20*c)/19+1; 1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestComposition(void) { 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNormalizationMode mode; 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t options; 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar input[12]; 1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar expect[12]; 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } cases[]={ 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * special cases for UAX #15 bug 143950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * see Unicode Corrigendum #5: Normalization Idempotency 144050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * at http://unicode.org/versions/corrigendum5.html 144150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * (was Public Review Issue #29) 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UNORM_NFC, 0, { 0x1100, 0x0300, 0x1161, 0x0327 }, { 0x1100, 0x0300, 0x1161, 0x0327 } }, 1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UNORM_NFC, 0, { 0x1100, 0x0300, 0x1161, 0x0327, 0x11a8 }, { 0x1100, 0x0300, 0x1161, 0x0327, 0x11a8 } }, 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UNORM_NFC, 0, { 0xac00, 0x0300, 0x0327, 0x11a8 }, { 0xac00, 0x0327, 0x0300, 0x11a8 } }, 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UNORM_NFC, 0, { 0x0b47, 0x0300, 0x0b3e }, { 0x0b47, 0x0300, 0x0b3e } }, 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* TODO: add test cases for UNORM_FCC here (j2151) */ 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar output[16]; 1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, length; 1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<LENGTHOF(cases); ++i) { 1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_normalize( 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cases[i].input, -1, 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cases[i].mode, cases[i].options, 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru output, LENGTHOF(output), 1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( U_FAILURE(errorCode) || 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length!=u_strlen(cases[i].expect) || 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=u_memcmp(output, cases[i].expect, length) 1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 146650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unexpected result for case %d - (Are you missing data?)\n", i); 1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void 147227f654740f2a26ad62a5c155af9199af9e69b889clairehoTestGetDecomposition() { 147327f654740f2a26ad62a5c155af9199af9e69b889claireho UChar decomp[32]; 147427f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t length; 147527f654740f2a26ad62a5c155af9199af9e69b889claireho 147627f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode errorCode=U_ZERO_ERROR; 147727f654740f2a26ad62a5c155af9199af9e69b889claireho const UNormalizer2 *n2=unorm2_getInstance(NULL, "nfc", UNORM2_COMPOSE_CONTIGUOUS, &errorCode); 147827f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(errorCode)) { 147927f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(errorCode, "unorm2_getInstance(nfc/FCC) failed: %s\n", u_errorName(errorCode)); 148027f654740f2a26ad62a5c155af9199af9e69b889claireho return; 148127f654740f2a26ad62a5c155af9199af9e69b889claireho } 148227f654740f2a26ad62a5c155af9199af9e69b889claireho 148327f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm2_getDecomposition(n2, 0x20, decomp, LENGTHOF(decomp), &errorCode); 148427f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(errorCode) || length>=0) { 148527f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("unorm2_getDecomposition(space) failed\n"); 148627f654740f2a26ad62a5c155af9199af9e69b889claireho } 148727f654740f2a26ad62a5c155af9199af9e69b889claireho errorCode=U_ZERO_ERROR; 148827f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm2_getDecomposition(n2, 0xe4, decomp, LENGTHOF(decomp), &errorCode); 148927f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(errorCode) || length!=2 || decomp[0]!=0x61 || decomp[1]!=0x308 || decomp[2]!=0) { 149027f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("unorm2_getDecomposition(a-umlaut) failed\n"); 149127f654740f2a26ad62a5c155af9199af9e69b889claireho } 149227f654740f2a26ad62a5c155af9199af9e69b889claireho errorCode=U_ZERO_ERROR; 149327f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm2_getDecomposition(n2, 0xac01, decomp, LENGTHOF(decomp), &errorCode); 149427f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(errorCode) || length!=3 || decomp[0]!=0x1100 || decomp[1]!=0x1161 || decomp[2]!=0x11a8 || decomp[3]!=0) { 149527f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("unorm2_getDecomposition(Hangul syllable U+AC01) failed\n"); 149627f654740f2a26ad62a5c155af9199af9e69b889claireho } 149727f654740f2a26ad62a5c155af9199af9e69b889claireho errorCode=U_ZERO_ERROR; 149827f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm2_getDecomposition(n2, 0xac01, NULL, 0, &errorCode); 149927f654740f2a26ad62a5c155af9199af9e69b889claireho if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=3) { 150027f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("unorm2_getDecomposition(Hangul syllable U+AC01) overflow failed\n"); 150127f654740f2a26ad62a5c155af9199af9e69b889claireho } 150227f654740f2a26ad62a5c155af9199af9e69b889claireho errorCode=U_ZERO_ERROR; 150327f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm2_getDecomposition(n2, 0xac01, decomp, -1, &errorCode); 150427f654740f2a26ad62a5c155af9199af9e69b889claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 150527f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("unorm2_getDecomposition(capacity<0) failed\n"); 150627f654740f2a26ad62a5c155af9199af9e69b889claireho } 150727f654740f2a26ad62a5c155af9199af9e69b889claireho errorCode=U_ZERO_ERROR; 150827f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm2_getDecomposition(n2, 0xac01, NULL, 4, &errorCode); 150927f654740f2a26ad62a5c155af9199af9e69b889claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 151027f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("unorm2_getDecomposition(decomposition=NULL) failed\n"); 151127f654740f2a26ad62a5c155af9199af9e69b889claireho } 151227f654740f2a26ad62a5c155af9199af9e69b889claireho} 151327f654740f2a26ad62a5c155af9199af9e69b889claireho 1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_NORMALIZATION */ 1515