1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT: 354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * Copyright (c) 1997-2012, 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" 19103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/utf16.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if !UCONFIG_NO_NORMALIZATION 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h> 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <time.h> 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unorm.h" 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cnormtst.h" 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof ((array)[0])) 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestAPI(void); 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNormCoverage(void); 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestConcatenate(void); 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNextPrevious(void); 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestIsNormalized(void); 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestFCNFKCClosure(void); 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestQuickCheckPerCP(void); 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestComposition(void); 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void 5727f654740f2a26ad62a5c155af9199af9e69b889clairehoTestFCD(void); 5827f654740f2a26ad62a5c155af9199af9e69b889claireho 5927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void 6027f654740f2a26ad62a5c155af9199af9e69b889clairehoTestGetDecomposition(void); 6127f654740f2a26ad62a5c155af9199af9e69b889claireho 62103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void 63103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusTestGetRawDecomposition(void); 64103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 65b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestAppendRestoreMiddle(void); 66103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestGetEasyToUseInstance(void); 67b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6827f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const canonTests[][3] = { 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Input*/ /*Decomposed*/ /*Composed*/ 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "cat", "cat", "cat" }, 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00e0ardvark", "a\\u0300ardvark", "\\u00e0ardvark", }, 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u1e0a", "D\\u0307", "\\u1e0a" }, /* D-dot_above*/ 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "D\\u0307", "D\\u0307", "\\u1e0a" }, /* D dot_above*/ 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u1e0c\\u0307", "D\\u0323\\u0307", "\\u1e0c\\u0307" }, /* D-dot_below dot_above*/ 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u1e0a\\u0323", "D\\u0323\\u0307", "\\u1e0c\\u0307" }, /* D-dot_above dot_below */ 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "D\\u0307\\u0323", "D\\u0323\\u0307", "\\u1e0c\\u0307" }, /* D dot_below dot_above */ 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u1e10\\u0307\\u0323", "D\\u0327\\u0323\\u0307", "\\u1e10\\u0323\\u0307" }, /*D dot_below cedilla dot_above*/ 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "D\\u0307\\u0328\\u0323", "D\\u0328\\u0323\\u0307", "\\u1e0c\\u0328\\u0307" }, /* D dot_above ogonek dot_below*/ 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u1E14", "E\\u0304\\u0300", "\\u1E14" }, /* E-macron-grave*/ 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u0112\\u0300", "E\\u0304\\u0300", "\\u1E14" }, /* E-macron + grave*/ 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00c8\\u0304", "E\\u0300\\u0304", "\\u00c8\\u0304" }, /* E-grave + macron*/ 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u212b", "A\\u030a", "\\u00c5" }, /* angstrom_sign*/ 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00c5", "A\\u030a", "\\u00c5" }, /* A-ring*/ 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00C4ffin", "A\\u0308ffin", "\\u00C4ffin" }, 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00C4\\uFB03n", "A\\u0308\\uFB03n", "\\u00C4\\uFB03n" }, 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "Henry IV", "Henry IV", "Henry IV" }, 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "Henry \\u2163", "Henry \\u2163", "Henry \\u2163" }, 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u30AC", "\\u30AB\\u3099", "\\u30AC" }, /* ga (Katakana)*/ 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u30AB\\u3099", "\\u30AB\\u3099", "\\u30AC" }, /*ka + ten*/ 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\uFF76\\uFF9E", "\\uFF76\\uFF9E", "\\uFF76\\uFF9E" }, /* hw_ka + hw_ten*/ 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u30AB\\uFF9E", "\\u30AB\\uFF9E", "\\u30AB\\uFF9E" }, /* ka + hw_ten*/ 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\uFF76\\u3099", "\\uFF76\\u3099", "\\uFF76\\u3099" }, /* hw_ka + ten*/ 10127f654740f2a26ad62a5c155af9199af9e69b889claireho { "A\\u0300\\u0316", "A\\u0316\\u0300", "\\u00C0\\u0316" }, /* hw_ka + ten*/ 10227f654740f2a26ad62a5c155af9199af9e69b889claireho { "", "", "" } 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 10527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const compatTests[][3] = { 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Input*/ /*Decomposed */ /*Composed*/ 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "cat", "cat", "cat" }, 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\uFB4f", "\\u05D0\\u05DC", "\\u05D0\\u05DC" }, /* Alef-Lamed vs. Alef, Lamed*/ 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00C4ffin", "A\\u0308ffin", "\\u00C4ffin" }, 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u00C4\\uFB03n", "A\\u0308ffin", "\\u00C4ffin" }, /* ffi ligature -> f + f + i*/ 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "Henry IV", "Henry IV", "Henry IV" }, 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "Henry \\u2163", "Henry IV", "Henry IV" }, 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u30AC", "\\u30AB\\u3099", "\\u30AC" }, /* ga (Katakana)*/ 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u30AB\\u3099", "\\u30AB\\u3099", "\\u30AC" }, /*ka + ten*/ 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\uFF76\\u3099", "\\u30AB\\u3099", "\\u30AC" }, /* hw_ka + ten*/ 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*These two are broken in Unicode 2.1.2 but fixed in 2.1.5 and later*/ 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\uFF76\\uFF9E", "\\u30AB\\u3099", "\\u30AC" }, /* hw_ka + hw_ten*/ 12427f654740f2a26ad62a5c155af9199af9e69b889claireho { "\\u30AB\\uFF9E", "\\u30AB\\u3099", "\\u30AC" }, /* ka + hw_ten*/ 12527f654740f2a26ad62a5c155af9199af9e69b889claireho { "", "", "" } 12627f654740f2a26ad62a5c155af9199af9e69b889claireho}; 12727f654740f2a26ad62a5c155af9199af9e69b889claireho 12827f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const fcdTests[][3] = { 12927f654740f2a26ad62a5c155af9199af9e69b889claireho /* Added for testing the below-U+0300 prefix of a NUL-terminated string. */ 13027f654740f2a26ad62a5c155af9199af9e69b889claireho { "\\u010e\\u0327", "D\\u0327\\u030c", NULL }, /* D-caron + cedilla */ 13127f654740f2a26ad62a5c155af9199af9e69b889claireho { "\\u010e", "\\u010e", NULL } /* D-caron */ 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNormTest(TestNode** root); 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNormTest(TestNode** root) 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestAPI, "tsnorm/cnormtst/TestAPI"); 13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestDecomp, "tsnorm/cnormtst/TestDecomp"); 14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestCompatDecomp, "tsnorm/cnormtst/TestCompatDecomp"); 14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestCanonDecompCompose, "tsnorm/cnormtst/TestCanonDecompCompose"); 14227f654740f2a26ad62a5c155af9199af9e69b889claireho addTest(root, &TestCompatDecompCompose, "tsnorm/cnormtst/TestCompatDecompCompose"); 14327f654740f2a26ad62a5c155af9199af9e69b889claireho addTest(root, &TestFCD, "tsnorm/cnormtst/TestFCD"); 14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestNull, "tsnorm/cnormtst/TestNull"); 14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestQuickCheck, "tsnorm/cnormtst/TestQuickCheck"); 14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestQuickCheckPerCP, "tsnorm/cnormtst/TestQuickCheckPerCP"); 14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestIsNormalized, "tsnorm/cnormtst/TestIsNormalized"); 14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestCheckFCD, "tsnorm/cnormtst/TestCheckFCD"); 14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestNormCoverage, "tsnorm/cnormtst/TestNormCoverage"); 15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestConcatenate, "tsnorm/cnormtst/TestConcatenate"); 15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestNextPrevious, "tsnorm/cnormtst/TestNextPrevious"); 15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestFCNFKCClosure, "tsnorm/cnormtst/TestFCNFKCClosure"); 15350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestComposition, "tsnorm/cnormtst/TestComposition"); 15427f654740f2a26ad62a5c155af9199af9e69b889claireho addTest(root, &TestGetDecomposition, "tsnorm/cnormtst/TestGetDecomposition"); 155103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius addTest(root, &TestGetRawDecomposition, "tsnorm/cnormtst/TestGetRawDecomposition"); 156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho addTest(root, &TestAppendRestoreMiddle, "tsnorm/cnormtst/TestAppendRestoreMiddle"); 157103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius addTest(root, &TestGetEasyToUseInstance, "tsnorm/cnormtst/TestGetEasyToUseInstance"); 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 16027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const modeStrings[]={ 16127f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_NONE", 16227f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_NFD", 16327f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_NFKD", 16427f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_NFC", 16527f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_NFKC", 16627f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_FCD", 16727f654740f2a26ad62a5c155af9199af9e69b889claireho "UNORM_MODE_COUNT" 16827f654740f2a26ad62a5c155af9199af9e69b889claireho}; 16927f654740f2a26ad62a5c155af9199af9e69b889claireho 17027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestNormCases(UNormalizationMode mode, 17127f654740f2a26ad62a5c155af9199af9e69b889claireho const char* const cases[][3], int32_t lengthOfCases) { 17227f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t x, neededLen, length2; 17327f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t expIndex= (mode==UNORM_NFC || mode==UNORM_NFKC) ? 2 : 1; 17427f654740f2a26ad62a5c155af9199af9e69b889claireho UChar *source=NULL; 17527f654740f2a26ad62a5c155af9199af9e69b889claireho UChar result[16]; 17627f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Testing unorm_normalize(%s)\n", modeStrings[mode]); 17727f654740f2a26ad62a5c155af9199af9e69b889claireho for(x=0; x < lengthOfCases; x++) 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 17927f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR, status2 = U_ZERO_ERROR; 18027f654740f2a26ad62a5c155af9199af9e69b889claireho source=CharsToUChars(cases[x][0]); 18127f654740f2a26ad62a5c155af9199af9e69b889claireho neededLen= unorm_normalize(source, u_strlen(source), mode, 0, NULL, 0, &status); 18227f654740f2a26ad62a5c155af9199af9e69b889claireho length2= unorm_normalize(source, -1, mode, 0, NULL, 0, &status2); 18327f654740f2a26ad62a5c155af9199af9e69b889claireho if(neededLen!=length2) { 18427f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("ERROR in unorm_normalize(%s)[%d]: " 18527f654740f2a26ad62a5c155af9199af9e69b889claireho "preflight length/NUL %d!=%d preflight length/srcLength\n", 18627f654740f2a26ad62a5c155af9199af9e69b889claireho modeStrings[mode], (int)x, (int)neededLen, (int)length2); 18727f654740f2a26ad62a5c155af9199af9e69b889claireho } 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status==U_BUFFER_OVERFLOW_ERROR) 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ZERO_ERROR; 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 19227f654740f2a26ad62a5c155af9199af9e69b889claireho length2=unorm_normalize(source, u_strlen(source), mode, 0, result, LENGTHOF(result), &status); 19327f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status) || neededLen!=length2) { 19427f654740f2a26ad62a5c155af9199af9e69b889claireho log_data_err("ERROR in unorm_normalize(%s/NUL) at %s: %s - (Are you missing data?)\n", 19527f654740f2a26ad62a5c155af9199af9e69b889claireho modeStrings[mode], austrdup(source), myErrorName(status)); 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 19727f654740f2a26ad62a5c155af9199af9e69b889claireho assertEqual(result, cases[x][expIndex], x); 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 19927f654740f2a26ad62a5c155af9199af9e69b889claireho length2=unorm_normalize(source, -1, mode, 0, result, LENGTHOF(result), &status); 20027f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status) || neededLen!=length2) { 20127f654740f2a26ad62a5c155af9199af9e69b889claireho log_data_err("ERROR in unorm_normalize(%s/srcLength) at %s: %s - (Are you missing data?)\n", 20227f654740f2a26ad62a5c155af9199af9e69b889claireho modeStrings[mode], austrdup(source), myErrorName(status)); 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 20427f654740f2a26ad62a5c155af9199af9e69b889claireho assertEqual(result, cases[x][expIndex], x); 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(source); 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 21027f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestDecomp() { 21127f654740f2a26ad62a5c155af9199af9e69b889claireho TestNormCases(UNORM_NFD, canonTests, LENGTHOF(canonTests)); 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 21427f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestCompatDecomp() { 21527f654740f2a26ad62a5c155af9199af9e69b889claireho TestNormCases(UNORM_NFKD, compatTests, LENGTHOF(compatTests)); 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 21827f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestCanonDecompCompose() { 21927f654740f2a26ad62a5c155af9199af9e69b889claireho TestNormCases(UNORM_NFC, canonTests, LENGTHOF(canonTests)); 22027f654740f2a26ad62a5c155af9199af9e69b889claireho} 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 22227f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestCompatDecompCompose() { 22327f654740f2a26ad62a5c155af9199af9e69b889claireho TestNormCases(UNORM_NFKC, compatTests, LENGTHOF(compatTests)); 22427f654740f2a26ad62a5c155af9199af9e69b889claireho} 22527f654740f2a26ad62a5c155af9199af9e69b889claireho 22627f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestFCD() { 22727f654740f2a26ad62a5c155af9199af9e69b889claireho TestNormCases(UNORM_FCD, fcdTests, LENGTHOF(fcdTests)); 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void assertEqual(const UChar* result, const char* expected, int32_t index) 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *expectedUni = CharsToUChars(expected); 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_strcmp(result, expectedUni)!=0){ 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in decomposition at index = %d. EXPECTED: %s , GOT: %s\n", index, expected, 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru austrdup(result) ); 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(expectedUni); 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNull_check(UChar *src, int32_t srcLen, 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *exp, int32_t expLen, 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNormalizationMode mode, 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *name) 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len, i; 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar result[50]; 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0;i<50;i++) 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result[i] = 0xFFFD; 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len = unorm_normalize(src, srcLen, mode, 0, result, 50, &status); 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 26150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_normalize(%s) with 0x0000 failed: %s - (Are you missing data?)\n", name, u_errorName(status)); 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (len != expLen) { 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("unorm_normalize(%s) with 0x0000 failed: Expected len %d, got %d\n", name, expLen, len); 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0;i<len;i++){ 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(exp[i] != result[i]) { 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("unorm_normalize(%s): @%d, expected \\u%04X got \\u%04X\n", 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name, 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exp[i], 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result[i]); 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" %d: \\u%04X\n", i, result[i]); 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("unorm_normalize(%s) with 0x0000: OK\n", name); 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestNull() 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar source_comp[] = { 0x0061, 0x0000, 0x0044, 0x0307 }; 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t source_comp_len = 4; 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar expect_comp[] = { 0x0061, 0x0000, 0x1e0a }; 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t expect_comp_len = 3; 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar source_dcmp[] = { 0x1e0A, 0x0000, 0x0929 }; 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t source_dcmp_len = 3; 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar expect_dcmp[] = { 0x0044, 0x0307, 0x0000, 0x0928, 0x093C }; 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t expect_dcmp_len = 5; 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestNull_check(source_comp, 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source_comp_len, 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect_comp, 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect_comp_len, 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFC, 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UNORM_NFC"); 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestNull_check(source_dcmp, 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source_dcmp_len, 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect_dcmp, 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect_dcmp_len, 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFD, 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UNORM_NFD"); 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestNull_check(source_comp, 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source_comp_len, 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect_comp, 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect_comp_len, 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFKC, 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UNORM_NFKC"); 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckResultNO() 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFD[] = {0x00C5, 0x0407, 0x1E00, 0x1F57, 0x220C, 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x30AE, 0xAC00, 0xD7A3, 0xFB36, 0xFB4E}; 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFC[] = {0x0340, 0x0F93, 0x1F77, 0x1FBB, 0x1FEB, 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2000, 0x232A, 0xF900, 0xFA1E, 0xFB4E}; 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFKD[] = {0x00A0, 0x02E4, 0x1FDB, 0x24EA, 0x32FE, 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xAC00, 0xFB4E, 0xFA10, 0xFF3F, 0xFA2D}; 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFKC[] = {0x00A0, 0x017F, 0x2000, 0x24EA, 0x32FE, 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x33FE, 0xFB4E, 0xFA10, 0xFF3F, 0xFA2D}; 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int SIZE = 10; 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int count = 0; 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode error = U_ZERO_ERROR; 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (; count < SIZE; count ++) 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFD[count]), 1, UNORM_NFD, &error) != 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NO) 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFD quick check at U+%04x\n", CPNFD[count]); 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFC[count]), 1, UNORM_NFC, &error) != 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NO) 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFC quick check at U+%04x\n", CPNFC[count]); 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFKD[count]), 1, UNORM_NFKD, &error) != 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NO) 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKD quick check at U+%04x\n", CPNFKD[count]); 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFKC[count]), 1, UNORM_NFKC, &error) != 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NO) 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKC quick check at U+%04x\n", CPNFKC[count]); 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckResultYES() 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFD[] = {0x00C6, 0x017F, 0x0F74, 0x1000, 0x1E9A, 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2261, 0x3075, 0x4000, 0x5000, 0xF000}; 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFC[] = {0x0400, 0x0540, 0x0901, 0x1000, 0x1500, 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x1E9A, 0x3000, 0x4000, 0x5000, 0xF000}; 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFKD[] = {0x00AB, 0x02A0, 0x1000, 0x1027, 0x2FFB, 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x3FFF, 0x4FFF, 0xA000, 0xF000, 0xFA27}; 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFKC[] = {0x00B0, 0x0100, 0x0200, 0x0A02, 0x1000, 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2010, 0x3030, 0x4000, 0xA000, 0xFA0E}; 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int SIZE = 10; 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int count = 0; 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode error = U_ZERO_ERROR; 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar cp = 0; 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (cp < 0xA0) 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&cp, 1, UNORM_NFD, &error) != UNORM_YES) 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 38750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("ERROR in NFD quick check at U+%04x - (Are you missing data?)\n", cp); 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&cp, 1, UNORM_NFC, &error) != 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFC quick check at U+%04x\n", cp); 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&cp, 1, UNORM_NFKD, &error) != UNORM_YES) 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKD quick check at U+%04x\n", cp); 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&cp, 1, UNORM_NFKC, &error) != 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKC quick check at U+%04x\n", cp); 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cp ++; 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (; count < SIZE; count ++) 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFD[count]), 1, UNORM_NFD, &error) != 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFD quick check at U+%04x\n", CPNFD[count]); 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFC[count]), 1, UNORM_NFC, &error) 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru != UNORM_YES) 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFC quick check at U+%04x\n", CPNFC[count]); 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFKD[count]), 1, UNORM_NFKD, &error) != 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKD quick check at U+%04x\n", CPNFKD[count]); 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFKC[count]), 1, UNORM_NFKC, &error) != 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKC quick check at U+%04x\n", CPNFKC[count]); 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckResultMAYBE() 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFC[] = {0x0306, 0x0654, 0x0BBE, 0x102E, 0x1161, 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x116A, 0x1173, 0x1175, 0x3099, 0x309A}; 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar CPNFKC[] = {0x0300, 0x0654, 0x0655, 0x09D7, 0x0B3E, 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0DCF, 0xDDF, 0x102E, 0x11A8, 0x3099}; 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int SIZE = 10; 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int count = 0; 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode error = U_ZERO_ERROR; 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* NFD and NFKD does not have any MAYBE codepoints */ 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (; count < SIZE; count ++) 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFC[count]), 1, UNORM_NFC, &error) != 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_MAYBE) 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 45850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("ERROR in NFC quick check at U+%04x - (Are you missing data?)\n", CPNFC[count]); 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(&(CPNFKC[count]), 1, UNORM_NFKC, &error) != 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_MAYBE) 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKC quick check at U+%04x\n", CPNFKC[count]); 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckStringResult() 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int count; 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *d = NULL; 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *c = NULL; 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode error = U_ZERO_ERROR; 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (count = 0; count < LENGTHOF(canonTests); count ++) 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru d = CharsToUChars(canonTests[count][1]); 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = CharsToUChars(canonTests[count][2]); 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(d, u_strlen(d), UNORM_NFD, &error) != 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 48450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("ERROR in NFD quick check for string at count %d - (Are you missing data?)\n", count); 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(c, u_strlen(c), UNORM_NFC, &error) == 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NO) 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFC quick check for string at count %d\n", count); 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(d); 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(c); 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (count = 0; count < LENGTHOF(compatTests); count ++) 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru d = CharsToUChars(compatTests[count][1]); 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = CharsToUChars(compatTests[count][2]); 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(d, u_strlen(d), UNORM_NFKD, &error) != 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKD quick check for string at count %d\n", count); 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(c, u_strlen(c), UNORM_NFKC, &error) != 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_YES) 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR in NFKC quick check for string at count %d\n", count); 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(d); 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(c); 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestQuickCheck() 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestQuickCheckResultNO(); 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestQuickCheckResultYES(); 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestQuickCheckResultMAYBE(); 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestQuickCheckStringResult(); 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The intltest/NormalizerConformanceTest tests a lot of strings that _are_ 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * normalized, and some that are not. 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Here we pick some specific cases and test the C API. 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestIsNormalized(void) { 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar notNFC[][8]={ /* strings that are not in NFC */ 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x62, 0x61, 0x300, 0x63, 0 }, /* 0061 0300 compose */ 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xfb1d, 0 }, /* excluded from composition */ 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x0627, 0x0653, 0 }, /* 0627 0653 compose */ 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x3071, 0x306f, 0x309a, 0x3073, 0 } /* 306F 309A compose */ 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar notNFKC[][8]={ /* strings that are not in NFKC */ 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x1100, 0x1161, 0 }, /* Jamo compose */ 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x1100, 0x314f, 0 }, /* compatibility Jamo compose */ 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x03b1, 0x1f00, 0x0345, 0x03b3, 0 } /* 1F00 0345 compose */ 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* API test */ 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* normal case with length>=0 (length -1 used for special cases below) */ 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!unorm_isNormalized(notNFC[0]+2, 1, UNORM_NFC, &errorCode) || U_FAILURE(errorCode)) { 55650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: !isNormalized(<U+0300>, NFC) (%s) - (Are you missing data?)\n", u_errorName(errorCode)); 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* incoming U_FAILURE */ 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_TRUNCATED_CHAR_FOUND; 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (void)unorm_isNormalized(notNFC[0]+2, 1, UNORM_NFC, &errorCode); 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_TRUNCATED_CHAR_FOUND) { 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: isNormalized(U_TRUNCATED_CHAR_FOUND) changed the error code to %s\n", u_errorName(errorCode)); 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* NULL source */ 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (void)unorm_isNormalized(NULL, 1, UNORM_NFC, &errorCode); 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 57050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: isNormalized(NULL) did not set U_ILLEGAL_ARGUMENT_ERROR but %s - (Are you missing data?)\n", u_errorName(errorCode)); 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* bad length */ 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (void)unorm_isNormalized(notNFC[0]+2, -2, UNORM_NFC, &errorCode); 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 57750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: isNormalized([-2]) did not set U_ILLEGAL_ARGUMENT_ERROR but %s - (Are you missing data?)\n", u_errorName(errorCode)); 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* specific cases */ 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<LENGTHOF(notNFC); ++i) { 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(unorm_isNormalized(notNFC[i], -1, UNORM_NFC, &errorCode) || U_FAILURE(errorCode)) { 58450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: isNormalized(notNFC[%d], NFC) is wrong (%s) - (Are you missing data?)\n", i, u_errorName(errorCode)); 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(unorm_isNormalized(notNFC[i], -1, UNORM_NFKC, &errorCode) || U_FAILURE(errorCode)) { 58850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: isNormalized(notNFC[%d], NFKC) is wrong (%s) - (Are you missing data?)\n", i, u_errorName(errorCode)); 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<LENGTHOF(notNFKC); ++i) { 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(unorm_isNormalized(notNFKC[i], -1, UNORM_NFKC, &errorCode) || U_FAILURE(errorCode)) { 59450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: isNormalized(notNFKC[%d], NFKC) is wrong (%s) - (Are you missing data?)\n", i, u_errorName(errorCode)); 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestCheckFCD() 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar FAST_[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0A}; 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar FALSE_[] = {0x0001, 0x0002, 0x02EA, 0x03EB, 0x0300, 0x0301, 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x02B9, 0x0314, 0x0315, 0x0316}; 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar TRUE_[] = {0x0030, 0x0040, 0x0440, 0x056D, 0x064F, 0x06E7, 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0050, 0x0730, 0x09EE, 0x1E10}; 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar datastr[][5] = 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { {0x0061, 0x030A, 0x1E05, 0x0302, 0}, 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0061, 0x030A, 0x00E2, 0x0323, 0}, 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0061, 0x0323, 0x00E2, 0x0323, 0}, 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0061, 0x0323, 0x1E05, 0x0302, 0} }; 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UBool result[] = {UNORM_YES, UNORM_NO, UNORM_NO, UNORM_YES}; 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar datachar[] = {0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6a, 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xea, 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0307, 0x0308, 0x0309, 0x030a, 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0327, 0x0328, 0x0329, 0x032a, 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x1e00, 0x1e01, 0x1e02, 0x1e03, 0x1e04, 0x1e05, 0x1e06, 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x1e07, 0x1e08, 0x1e09, 0x1e0a}; 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int count = 0; 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(FAST_, 10, UNORM_FCD, &status) != UNORM_YES) 63050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: expected value for fast unorm_quickCheck is UNORM_YES - (Are you missing data?)\n"); 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(FALSE_, 10, UNORM_FCD, &status) != UNORM_NO) 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("unorm_quickCheck(FCD) failed: expected value for error unorm_quickCheck is UNORM_NO\n"); 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(TRUE_, 10, UNORM_FCD, &status) != UNORM_YES) 63450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: expected value for correct unorm_quickCheck is UNORM_YES - (Are you missing data?)\n"); 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 63750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: %s - (Are you missing data?)\n", u_errorName(status)); 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (count < 4) 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool fcdresult = unorm_quickCheck(datastr[count], 4, UNORM_FCD, &status); 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 64350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: exception occured at data set %d - (Are you missing data?)\n", count); 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result[count] != fcdresult) { 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("unorm_quickCheck(FCD) failed: Data set %d expected value %d\n", count, 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result[count]); 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count ++; 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* random checks of long strings */ 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srand((unsigned)time( NULL )); 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (count = 0; count < 50; count ++) 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int size = 0; 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool testresult = UNORM_YES; 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar data[20]; 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar norm[100]; 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar nfd[100]; 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int normsize = 0; 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int nfdsize = 0; 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (size != 19) { 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru data[size] = datachar[(rand() * 50) / RAND_MAX]; 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("0x%x", data[size]); 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru normsize += unorm_normalize(data + size, 1, UNORM_NFD, 0, 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru norm + normsize, 100 - normsize, &status); 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 67550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: exception occured at data generation - (Are you missing data?)\n"); 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size ++; 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfdsize = unorm_normalize(data, size, UNORM_NFD, 0, 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfd, 100, &status); 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 68550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: exception occured at normalized data generation - (Are you missing data?)\n"); 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (nfdsize != normsize || u_memcmp(nfd, norm, nfdsize) != 0) { 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testresult = UNORM_NO; 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (testresult == UNORM_YES) { 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("result UNORM_YES\n"); 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("result UNORM_NO\n"); 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (unorm_quickCheck(data, size, UNORM_FCD, &status) != testresult || U_FAILURE(status)) { 69950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_quickCheck(FCD) failed: expected %d for random data - (Are you missing data?)\n", testresult); 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestAPI() { 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar in[]={ 0x68, 0xe4 }; 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar out[20]={ 0xffff, 0xffff, 0xffff, 0xffff }; 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try preflighting */ 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_normalize(in, 2, UNORM_NFD, 0, NULL, 0, &errorCode); 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=3) { 71550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unorm_normalize(pure preflighting NFD)=%ld failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode)); 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_normalize(in, 2, UNORM_NFD, 0, out, 3, &errorCode); 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("unorm_normalize(NFD)=%ld failed with %s\n", length, u_errorName(errorCode)); 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(length!=3 || out[2]!=0x308 || out[3]!=0xffff) { 726b13da9df870a61b11249bf741347908dbea0edd8Jean-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]); 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 72927f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm_normalize(NULL, 0, UNORM_NFC, 0, NULL, 0, &errorCode); 73027f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(errorCode)) { 73127f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("unorm_normalize(src NULL[0], NFC, dest NULL[0])=%ld failed with %s\n", (long)length, u_errorName(errorCode)); 73227f654740f2a26ad62a5c155af9199af9e69b889claireho return; 73327f654740f2a26ad62a5c155af9199af9e69b889claireho } 73427f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm_normalize(NULL, 0, UNORM_NFC, 0, out, 20, &errorCode); 73527f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(errorCode)) { 73627f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("unorm_normalize(src NULL[0], NFC, dest out[20])=%ld failed with %s\n", (long)length, u_errorName(errorCode)); 73727f654740f2a26ad62a5c155af9199af9e69b889claireho return; 73827f654740f2a26ad62a5c155af9199af9e69b889claireho } 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test cases to improve test code coverage */ 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum { 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_K_KIYEOK=0x3131, /* NFKD->Jamo L U+1100 */ 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_K_WEO=0x315d, /* NFKD->Jamo V U+116f */ 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_K_KIYEOK_SIOS=0x3133, /* NFKD->Jamo T U+11aa */ 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_KIYEOK=0x1100, /* Jamo L U+1100 */ 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_WEO=0x116f, /* Jamo V U+116f */ 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_KIYEOK_SIOS=0x11aa, /* Jamo T U+11aa */ 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_AC00=0xac00, /* Hangul syllable = Jamo LV U+ac00 */ 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HANGUL_SYLLABLE=0xac00+14*28+3, /* Hangul syllable = U+1100 * U+116f * U+11aa */ 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MUSICAL_VOID_NOTEHEAD=0x1d157, 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MUSICAL_HALF_NOTE=0x1d15e, /* NFC/NFD->Notehead+Stem */ 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MUSICAL_STEM=0x1d165, /* cc=216 */ 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MUSICAL_STACCATO=0x1d17c /* cc=220 */ 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNormCoverage() { 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar input[1000], expect[1000], output[1000]; 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, length, inLength, expectLength, hangulPrefixLength, preflightLength; 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* create a long and nasty string with NFKC-unsafe characters */ 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inLength=0; 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 3 Jamos L/V/T, all 8 combinations normal/compatibility */ 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK; 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_WEO; 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK_SIOS; 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK; 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_WEO; 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_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_KIYEOK_SIOS; 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK; 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_WEO; 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_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_KIYEOK_SIOS; 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK; 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_WEO; 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_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_KIYEOK_SIOS; 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK; 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_WEO; 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK_SIOS; 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Hangul LV with normal/compatibility Jamo T */ 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_AC00; 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_KIYEOK_SIOS; 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_AC00; 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK_SIOS; 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* compatibility Jamo L, V */ 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK; 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_WEO; 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru hangulPrefixLength=inLength; 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 815103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius input[inLength++]=U16_LEAD(MUSICAL_HALF_NOTE); 816103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius input[inLength++]=U16_TRAIL(MUSICAL_HALF_NOTE); 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<200; ++i) { 818103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius input[inLength++]=U16_LEAD(MUSICAL_STACCATO); 819103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius input[inLength++]=U16_TRAIL(MUSICAL_STACCATO); 820103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius input[inLength++]=U16_LEAD(MUSICAL_STEM); 821103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius input[inLength++]=U16_TRAIL(MUSICAL_STEM); 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* (compatibility) Jamo L, T do not compose */ 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK; 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input[inLength++]=HANGUL_K_KIYEOK_SIOS; 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* quick checks */ 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_NFD, &errorCode) || U_FAILURE(errorCode)) { 83150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_quickCheck(long input, UNORM_NFD)!=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_NFKD, &errorCode) || U_FAILURE(errorCode)) { 83550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_quickCheck(long input, UNORM_NFKD)!=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_NFC, &errorCode) || U_FAILURE(errorCode)) { 83950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_quickCheck(long input, UNORM_NFC)!=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_NFKC, &errorCode) || U_FAILURE(errorCode)) { 84350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_quickCheck(long input, UNORM_NFKC)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode)); 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_FCD, &errorCode) || U_FAILURE(errorCode)) { 84750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_quickCheck(long input, UNORM_FCD)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode)); 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* NFKC */ 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectLength=0; 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_SYLLABLE; 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_SYLLABLE; 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_AC00+3; 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_AC00+3; 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_AC00+14*28; 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 874103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_LEAD(MUSICAL_VOID_NOTEHEAD); 875103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_TRAIL(MUSICAL_VOID_NOTEHEAD); 876103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_LEAD(MUSICAL_STEM); 877103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_TRAIL(MUSICAL_STEM); 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<200; ++i) { 879103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_LEAD(MUSICAL_STEM); 880103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_TRAIL(MUSICAL_STEM); 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<200; ++i) { 883103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_LEAD(MUSICAL_STACCATO); 884103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_TRAIL(MUSICAL_STACCATO); 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_KIYEOK; 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_KIYEOK_SIOS; 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try destination overflow first */ 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru preflightLength=unorm_normalize(input, inLength, 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFKC, 0, 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru output, 100, /* too short */ 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR) { 89750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 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)); 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* real NFKC */ 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_normalize(input, inLength, 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFKC, 0, 904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru output, sizeof(output)/U_SIZEOF_UCHAR, 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 90750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_normalize(long input, UNORM_NFKC) failed with %s - (Are you missing data?)\n", u_errorName(errorCode)); 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(length!=expectLength || u_memcmp(output, expect, length)!=0) { 909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_normalize(long input, UNORM_NFKC) produced wrong result\n"); 910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<length; ++i) { 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(output[i]!=expect[i]) { 912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err(" NFKC[%d]==U+%04lx expected U+%04lx\n", i, output[i], expect[i]); 913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(length!=preflightLength) { 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_normalize(long input, UNORM_NFKC)==%ld but preflightLength==%ld\n", length, preflightLength); 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* FCD */ 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memcpy(expect, input, hangulPrefixLength); 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectLength=hangulPrefixLength; 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 925103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_LEAD(MUSICAL_VOID_NOTEHEAD); 926103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_TRAIL(MUSICAL_VOID_NOTEHEAD); 927103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_LEAD(MUSICAL_STEM); 928103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_TRAIL(MUSICAL_STEM); 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<200; ++i) { 930103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_LEAD(MUSICAL_STEM); 931103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_TRAIL(MUSICAL_STEM); 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<200; ++i) { 934103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_LEAD(MUSICAL_STACCATO); 935103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius expect[expectLength++]=U16_TRAIL(MUSICAL_STACCATO); 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_K_KIYEOK; 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[expectLength++]=HANGUL_K_KIYEOK_SIOS; 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_normalize(input, inLength, 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_FCD, 0, 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru output, sizeof(output)/U_SIZEOF_UCHAR, 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 94750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_normalize(long input, UNORM_FCD) failed with %s - (Are you missing data?)\n", u_errorName(errorCode)); 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(length!=expectLength || u_memcmp(output, expect, length)!=0) { 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_normalize(long input, UNORM_FCD) produced wrong result\n"); 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<length; ++i) { 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(output[i]!=expect[i]) { 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err(" FCD[%d]==U+%04lx expected U+%04lx\n", i, output[i], expect[i]); 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* API test for unorm_concatenate() - for real test strings see intltest/tstnorm.cpp */ 960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestConcatenate(void) { 962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* "re + 'sume'" */ 963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar 964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru left[]={ 965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x72, 0x65, 0 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru right[]={ 968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x301, 0x73, 0x75, 0x6d, 0xe9, 0 969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect[]={ 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x72, 0xe9, 0x73, 0x75, 0x6d, 0xe9, 0 972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[100]; 975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* left with length, right NUL-terminated */ 979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_concatenate(left, 2, right, -1, buffer, 100, UNORM_NFC, 0, &errorCode); 981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode) || length!=6 || 0!=u_memcmp(buffer, expect, length)) { 98250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: unorm_concatenate()=%ld (expect 6) failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode)); 983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflighting */ 986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_concatenate(left, 2, right, -1, NULL, 0, UNORM_NFC, 0, &errorCode); 988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=6) { 98950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: unorm_concatenate(preflighting)=%ld (expect 6) failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode)); 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[2]=0x5555; 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_concatenate(left, 2, right, -1, buffer, 1, UNORM_NFC, 0, &errorCode); 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=6 || buffer[2]!=0x5555) { 99650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: unorm_concatenate(preflighting 2)=%ld (expect 6) failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode)); 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* enter with U_FAILURE */ 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[2]=0xaaaa; 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_UNEXPECTED_TOKEN; 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_concatenate(left, 2, right, -1, buffer, 100, UNORM_NFC, 0, &errorCode); 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_UNEXPECTED_TOKEN || buffer[2]!=0xaaaa) { 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: unorm_concatenate(failure)=%ld failed with %s\n", length, u_errorName(errorCode)); 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* illegal arguments */ 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[2]=0xaaaa; 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_concatenate(NULL, 2, right, -1, buffer, 100, UNORM_NFC, 0, &errorCode); 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || buffer[2]!=0xaaaa) { 101250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: unorm_concatenate(left=NULL)=%ld failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode)); 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_concatenate(left, 2, right, -1, NULL, 100, UNORM_NFC, 0, &errorCode); 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 101850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error: unorm_concatenate(buffer=NULL)=%ld failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode)); 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum { 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _PLUS=0x2b 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *const _modeString[UNORM_MODE_COUNT]={ 1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "0", "NONE", "NFD", "NFKD", "NFC", "NFKC", "FCD" 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_testIter(const UChar *src, int32_t srcLength, 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator *iter, UNormalizationMode mode, UBool forward, 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *out, int32_t outLength, 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int32_t *srcIndexes, int32_t srcIndexesLength) { 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[4]; 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *expect, *outLimit, *in; 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length, i, expectLength, expectIndex, prevIndex, index, inLength; 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool neededToNormalize, expectNeeded; 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru outLimit=out+outLength; 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(forward) { 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect=out; 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=index=0; 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect=outLimit; 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=srcIndexesLength-2; 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru index=srcLength; 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(;;) { 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prevIndex=index; 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(forward) { 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!iter->hasNext(iter)) { 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(iter, 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer, sizeof(buffer)/U_SIZEOF_UCHAR, 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mode, 0, 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (UBool)(out!=NULL), &neededToNormalize, 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectIndex=srcIndexes[i+1]; 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru in=src+prevIndex; 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inLength=expectIndex-prevIndex; 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(out!=NULL) { 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* get output piece from between plus signs */ 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectLength=0; 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while((expect+expectLength)!=outLimit && expect[expectLength]!=_PLUS) { 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++expectLength; 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectNeeded=(UBool)(0!=u_memcmp(buffer, in, inLength)); 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect=in; 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectLength=inLength; 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectNeeded=FALSE; 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!iter->hasPrevious(iter)) { 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_previous(iter, 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer, sizeof(buffer)/U_SIZEOF_UCHAR, 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mode, 0, 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (UBool)(out!=NULL), &neededToNormalize, 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectIndex=srcIndexes[i]; 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru in=src+expectIndex; 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inLength=prevIndex-expectIndex; 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(out!=NULL) { 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* get output piece from between plus signs */ 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectLength=0; 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(expect!=out && expect[-1]!=_PLUS) { 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++expectLength; 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --expect; 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectNeeded=(UBool)(0!=u_memcmp(buffer, in, inLength)); 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect=in; 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectLength=inLength; 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectNeeded=FALSE; 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru index=iter->getIndex(iter, UITER_CURRENT); 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 110950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm iteration (next/previous %d %s)[%d]: %s - (Are you missing data?)\n", 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru forward, _modeString[mode], i, u_errorName(errorCode)); 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(expectIndex!=index) { 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm iteration (next/previous %d %s): index[%d] wrong, got %d expected %d\n", 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru forward, _modeString[mode], i, index, expectIndex); 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(expectLength!=length) { 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm iteration (next/previous %d %s): length[%d] wrong, got %d expected %d\n", 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru forward, _modeString[mode], i, length, expectLength); 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(0!=u_memcmp(expect, buffer, length)) { 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm iteration (next/previous %d %s): output string[%d] wrong\n", 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru forward, _modeString[mode], i); 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(neededToNormalize!=expectNeeded) { 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(forward) { 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect+=expectLength+1; /* go after the + */ 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++i; 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --expect; /* go before the + */ 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --i; 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNextPrevious() { 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src[]={ /* input string */ 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xa0, 0xe4, 0x63, 0x302, 0x327, 0xac00, 0x3133 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfd[]={ /* + separates expected output pieces */ 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xa0, _PLUS, 0x61, 0x308, _PLUS, 0x63, 0x327, 0x302, _PLUS, 0x1100, 0x1161, _PLUS, 0x3133 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfkd[]={ 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20, _PLUS, 0x61, 0x308, _PLUS, 0x63, 0x327, 0x302, _PLUS, 0x1100, 0x1161, _PLUS, 0x11aa 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfc[]={ 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xa0, _PLUS, 0xe4, _PLUS, 0xe7, 0x302, _PLUS, 0xac00, _PLUS, 0x3133 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfkc[]={ 1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20, _PLUS, 0xe4, _PLUS, 0xe7, 0x302, _PLUS, 0xac03 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fcd[]={ 1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xa0, _PLUS, 0xe4, _PLUS, 0x63, 0x327, 0x302, _PLUS, 0xac00, _PLUS, 0x3133 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* expected iterator indexes in the source string for each iteration piece */ 1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const int32_t 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfdIndexes[]={ 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 1, 2, 5, 6, 7 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfkdIndexes[]={ 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 1, 2, 5, 6, 7 1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfcIndexes[]={ 1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 1, 2, 5, 6, 7 1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfkcIndexes[]={ 1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 1, 2, 5, 7 1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fcdIndexes[]={ 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 1, 2, 5, 6, 7 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator iter; 1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[4]; 1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool neededToNormalize; 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&iter, src, sizeof(src)/U_SIZEOF_UCHAR); 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test iteration with doNormalize */ 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, TRUE, nfd, sizeof(nfd)/U_SIZEOF_UCHAR, nfdIndexes, sizeof(nfdIndexes)/4); 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, TRUE, nfkd, sizeof(nfkd)/U_SIZEOF_UCHAR, nfkdIndexes, sizeof(nfkdIndexes)/4); 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, TRUE, nfc, sizeof(nfc)/U_SIZEOF_UCHAR, nfcIndexes, sizeof(nfcIndexes)/4); 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, TRUE, nfkc, sizeof(nfkc)/U_SIZEOF_UCHAR, nfkcIndexes, sizeof(nfkcIndexes)/4); 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, TRUE, fcd, sizeof(fcd)/U_SIZEOF_UCHAR, fcdIndexes, sizeof(fcdIndexes)/4); 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, FALSE, nfd, sizeof(nfd)/U_SIZEOF_UCHAR, nfdIndexes, sizeof(nfdIndexes)/4); 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, FALSE, nfkd, sizeof(nfkd)/U_SIZEOF_UCHAR, nfkdIndexes, sizeof(nfkdIndexes)/4); 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, FALSE, nfc, sizeof(nfc)/U_SIZEOF_UCHAR, nfcIndexes, sizeof(nfcIndexes)/4); 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, FALSE, nfkc, sizeof(nfkc)/U_SIZEOF_UCHAR, nfkcIndexes, sizeof(nfkcIndexes)/4); 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, FALSE, fcd, sizeof(fcd)/U_SIZEOF_UCHAR, fcdIndexes, sizeof(fcdIndexes)/4); 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test iteration without doNormalize */ 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, TRUE, NULL, 0, nfdIndexes, sizeof(nfdIndexes)/4); 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, TRUE, NULL, 0, nfkdIndexes, sizeof(nfkdIndexes)/4); 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, TRUE, NULL, 0, nfcIndexes, sizeof(nfcIndexes)/4); 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, TRUE, NULL, 0, nfkcIndexes, sizeof(nfkcIndexes)/4); 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=0; 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, TRUE, NULL, 0, fcdIndexes, sizeof(fcdIndexes)/4); 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, FALSE, NULL, 0, nfdIndexes, sizeof(nfdIndexes)/4); 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, FALSE, NULL, 0, nfkdIndexes, sizeof(nfkdIndexes)/4); 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, FALSE, NULL, 0, nfcIndexes, sizeof(nfcIndexes)/4); 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, FALSE, NULL, 0, nfkcIndexes, sizeof(nfkcIndexes)/4); 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=iter.length; 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, FALSE, NULL, 0, fcdIndexes, sizeof(fcdIndexes)/4); 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try without neededToNormalize */ 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[0]=5; 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=1; 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(&iter, buffer, sizeof(buffer)/U_SIZEOF_UCHAR, 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFD, 0, TRUE, NULL, 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode) || length!=2 || buffer[0]!=nfd[2] || buffer[1]!=nfd[3]) { 124550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("error unorm_next(without needed) %s - (Are you missing data?)\n", u_errorName(errorCode)); 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight */ 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru neededToNormalize=9; 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=1; 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(&iter, NULL, 0, 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFD, 0, TRUE, &neededToNormalize, 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || neededToNormalize!=FALSE || length!=2) { 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_next(pure preflighting) %s\n", u_errorName(errorCode)); 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[0]=buffer[1]=5; 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru neededToNormalize=9; 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=1; 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(&iter, buffer, 1, 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFD, 0, TRUE, &neededToNormalize, 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || neededToNormalize!=FALSE || length!=2 || buffer[1]!=5) { 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_next(preflighting) %s\n", u_errorName(errorCode)); 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* no iterator */ 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[0]=buffer[1]=5; 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru neededToNormalize=9; 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=1; 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(NULL, buffer, sizeof(buffer)/U_SIZEOF_UCHAR, 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFD, 0, TRUE, &neededToNormalize, 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_next(no iterator) %s\n", u_errorName(errorCode)); 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* illegal mode */ 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[0]=buffer[1]=5; 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru neededToNormalize=9; 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=1; 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(&iter, buffer, sizeof(buffer)/U_SIZEOF_UCHAR, 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (UNormalizationMode)0, 0, TRUE, &neededToNormalize, 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_next(illegal mode) %s\n", u_errorName(errorCode)); 1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* error coming in */ 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_MISPLACED_QUANTIFIER; 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[0]=5; 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter.index=1; 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_next(&iter, buffer, sizeof(buffer)/U_SIZEOF_UCHAR, 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNORM_NFD, 0, TRUE, NULL, 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_MISPLACED_QUANTIFIER) { 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error unorm_next(U_MISPLACED_QUANTIFIER) %s\n", u_errorName(errorCode)); 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestFCNFKCClosure(void) { 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c; 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar s[6]; 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } tests[]={ 131650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 0x00C4, { 0 } }, 131750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 0x00E4, { 0 } }, 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x037A, { 0x0020, 0x03B9, 0 } }, 1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x03D2, { 0x03C5, 0 } }, 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x20A8, { 0x0072, 0x0073, 0 } }, 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x210B, { 0x0068, 0 } }, 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x210C, { 0x0068, 0 } }, 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x2121, { 0x0074, 0x0065, 0x006C, 0 } }, 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x2122, { 0x0074, 0x006D, 0 } }, 1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x2128, { 0x007A, 0 } }, 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x1D5DB, { 0x0068, 0 } }, 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x1D5ED, { 0x007A, 0 } }, 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x0061, { 0 } } 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[8]; 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, length; 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<LENGTHOF(tests); ++i) { 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=u_getFC_NFKC_Closure(tests[i].c, buffer, LENGTHOF(buffer), &errorCode); 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode) || length!=u_strlen(buffer) || 0!=u_strcmp(tests[i].s, buffer)) { 133950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("u_getFC_NFKC_Closure(U+%04lx) is wrong (%s) - (Are you missing data?)\n", tests[i].c, u_errorName(errorCode)); 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* error handling */ 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=u_getFC_NFKC_Closure(0x5c, NULL, LENGTHOF(buffer), &errorCode); 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_getFC_NFKC_Closure(dest=NULL) is wrong (%s)\n", u_errorName(errorCode)); 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=u_getFC_NFKC_Closure(0x5c, buffer, LENGTHOF(buffer), &errorCode); 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_getFC_NFKC_Closure(U_FAILURE) is wrong (%s)\n", u_errorName(errorCode)); 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestQuickCheckPerCP() { 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c, lead, trail; 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar s[U16_MAX_LENGTH], nfd[16]; 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length, lccc1, lccc2, tccc1, tccc2; 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t qc1, qc2; 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getIntPropertyMaxValue(UCHAR_NFD_QUICK_CHECK)!=(int32_t)UNORM_YES || 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getIntPropertyMaxValue(UCHAR_NFKD_QUICK_CHECK)!=(int32_t)UNORM_YES || 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getIntPropertyMaxValue(UCHAR_NFC_QUICK_CHECK)!=(int32_t)UNORM_MAYBE || 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getIntPropertyMaxValue(UCHAR_NFKC_QUICK_CHECK)!=(int32_t)UNORM_MAYBE || 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getIntPropertyMaxValue(UCHAR_LEAD_CANONICAL_COMBINING_CLASS)!=u_getIntPropertyMaxValue(UCHAR_CANONICAL_COMBINING_CLASS) || 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getIntPropertyMaxValue(UCHAR_TRAIL_CANONICAL_COMBINING_CLASS)!=u_getIntPropertyMaxValue(UCHAR_CANONICAL_COMBINING_CLASS) 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("wrong result from one of the u_getIntPropertyMaxValue(UCHAR_NF*_QUICK_CHECK) or UCHAR_*_CANONICAL_COMBINING_CLASS\n"); 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * compare the quick check property values for some code points 1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to the quick check results for checking same-code point strings 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c=0; 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(c<0x110000) { 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=0; 1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U16_APPEND_UNSAFE(s, length, c); 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc1=u_getIntPropertyValue(c, UCHAR_NFC_QUICK_CHECK); 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc2=unorm_quickCheck(s, length, UNORM_NFC, &errorCode); 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(qc1!=qc2) { 138850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("u_getIntPropertyValue(NFC)=%d != %d=unorm_quickCheck(NFC) for U+%04x - (Are you missing data?)\n", qc1, qc2, c); 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc1=u_getIntPropertyValue(c, UCHAR_NFD_QUICK_CHECK); 1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc2=unorm_quickCheck(s, length, UNORM_NFD, &errorCode); 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(qc1!=qc2) { 139450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("u_getIntPropertyValue(NFD)=%d != %d=unorm_quickCheck(NFD) for U+%04x - (Are you missing data?)\n", qc1, qc2, c); 1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc1=u_getIntPropertyValue(c, UCHAR_NFKC_QUICK_CHECK); 1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc2=unorm_quickCheck(s, length, UNORM_NFKC, &errorCode); 1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(qc1!=qc2) { 140050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("u_getIntPropertyValue(NFKC)=%d != %d=unorm_quickCheck(NFKC) for U+%04x - (Are you missing data?)\n", qc1, qc2, c); 1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc1=u_getIntPropertyValue(c, UCHAR_NFKD_QUICK_CHECK); 1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qc2=unorm_quickCheck(s, length, UNORM_NFKD, &errorCode); 1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(qc1!=qc2) { 140650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("u_getIntPropertyValue(NFKD)=%d != %d=unorm_quickCheck(NFKD) for U+%04x - (Are you missing data?)\n", qc1, qc2, c); 1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_normalize(s, length, UNORM_NFD, 0, nfd, LENGTHOF(nfd), &errorCode); 1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* length-length == 0 is used to get around a compiler warning. */ 1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U16_GET(nfd, 0, length-length, length, lead); 1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U16_GET(nfd, 0, length-1, length, trail); 1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lccc1=u_getIntPropertyValue(c, UCHAR_LEAD_CANONICAL_COMBINING_CLASS); 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lccc2=u_getCombiningClass(lead); 1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tccc1=u_getIntPropertyValue(c, UCHAR_TRAIL_CANONICAL_COMBINING_CLASS); 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tccc2=u_getCombiningClass(trail); 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(lccc1!=lccc2) { 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_getIntPropertyValue(lccc)=%d != %d=u_getCombiningClass(lead) for U+%04x\n", 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lccc1, lccc2, c); 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(tccc1!=tccc2) { 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_getIntPropertyValue(tccc)=%d != %d=u_getCombiningClass(trail) for U+%04x\n", 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tccc1, tccc2, c); 1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* skip some code points */ 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c=(20*c)/19+1; 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestComposition(void) { 1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UNormalizationMode mode; 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t options; 1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar input[12]; 1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar expect[12]; 1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } cases[]={ 1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * special cases for UAX #15 bug 144350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * see Unicode Corrigendum #5: Normalization Idempotency 144450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * at http://unicode.org/versions/corrigendum5.html 144550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * (was Public Review Issue #29) 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UNORM_NFC, 0, { 0x1100, 0x0300, 0x1161, 0x0327 }, { 0x1100, 0x0300, 0x1161, 0x0327 } }, 1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UNORM_NFC, 0, { 0x1100, 0x0300, 0x1161, 0x0327, 0x11a8 }, { 0x1100, 0x0300, 0x1161, 0x0327, 0x11a8 } }, 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UNORM_NFC, 0, { 0xac00, 0x0300, 0x0327, 0x11a8 }, { 0xac00, 0x0327, 0x0300, 0x11a8 } }, 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UNORM_NFC, 0, { 0x0b47, 0x0300, 0x0b3e }, { 0x0b47, 0x0300, 0x0b3e } }, 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* TODO: add test cases for UNORM_FCC here (j2151) */ 1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar output[16]; 1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, length; 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<LENGTHOF(cases); ++i) { 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=unorm_normalize( 1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cases[i].input, -1, 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cases[i].mode, cases[i].options, 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru output, LENGTHOF(output), 1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( U_FAILURE(errorCode) || 1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length!=u_strlen(cases[i].expect) || 1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=u_memcmp(output, cases[i].expect, length) 1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 147050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("unexpected result for case %d - (Are you missing data?)\n", i); 1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void 147627f654740f2a26ad62a5c155af9199af9e69b889clairehoTestGetDecomposition() { 147727f654740f2a26ad62a5c155af9199af9e69b889claireho UChar decomp[32]; 147827f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t length; 147927f654740f2a26ad62a5c155af9199af9e69b889claireho 148027f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode errorCode=U_ZERO_ERROR; 148127f654740f2a26ad62a5c155af9199af9e69b889claireho const UNormalizer2 *n2=unorm2_getInstance(NULL, "nfc", UNORM2_COMPOSE_CONTIGUOUS, &errorCode); 148227f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(errorCode)) { 148327f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(errorCode, "unorm2_getInstance(nfc/FCC) failed: %s\n", u_errorName(errorCode)); 148427f654740f2a26ad62a5c155af9199af9e69b889claireho return; 148527f654740f2a26ad62a5c155af9199af9e69b889claireho } 148627f654740f2a26ad62a5c155af9199af9e69b889claireho 148727f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm2_getDecomposition(n2, 0x20, decomp, LENGTHOF(decomp), &errorCode); 148827f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(errorCode) || length>=0) { 1489103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(fcc, space) failed\n"); 149027f654740f2a26ad62a5c155af9199af9e69b889claireho } 149127f654740f2a26ad62a5c155af9199af9e69b889claireho errorCode=U_ZERO_ERROR; 149227f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm2_getDecomposition(n2, 0xe4, decomp, LENGTHOF(decomp), &errorCode); 149327f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(errorCode) || length!=2 || decomp[0]!=0x61 || decomp[1]!=0x308 || decomp[2]!=0) { 1494103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(fcc, a-umlaut) failed\n"); 149527f654740f2a26ad62a5c155af9199af9e69b889claireho } 149627f654740f2a26ad62a5c155af9199af9e69b889claireho errorCode=U_ZERO_ERROR; 149727f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm2_getDecomposition(n2, 0xac01, decomp, LENGTHOF(decomp), &errorCode); 149827f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(errorCode) || length!=3 || decomp[0]!=0x1100 || decomp[1]!=0x1161 || decomp[2]!=0x11a8 || decomp[3]!=0) { 1499103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(fcc, Hangul syllable U+AC01) failed\n"); 150027f654740f2a26ad62a5c155af9199af9e69b889claireho } 150127f654740f2a26ad62a5c155af9199af9e69b889claireho errorCode=U_ZERO_ERROR; 150227f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm2_getDecomposition(n2, 0xac01, NULL, 0, &errorCode); 150327f654740f2a26ad62a5c155af9199af9e69b889claireho if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=3) { 1504103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(fcc, Hangul syllable U+AC01) overflow failed\n"); 150527f654740f2a26ad62a5c155af9199af9e69b889claireho } 150627f654740f2a26ad62a5c155af9199af9e69b889claireho errorCode=U_ZERO_ERROR; 150727f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm2_getDecomposition(n2, 0xac01, decomp, -1, &errorCode); 150827f654740f2a26ad62a5c155af9199af9e69b889claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 1509103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(fcc, capacity<0) failed\n"); 151027f654740f2a26ad62a5c155af9199af9e69b889claireho } 151127f654740f2a26ad62a5c155af9199af9e69b889claireho errorCode=U_ZERO_ERROR; 151227f654740f2a26ad62a5c155af9199af9e69b889claireho length=unorm2_getDecomposition(n2, 0xac01, NULL, 4, &errorCode); 151327f654740f2a26ad62a5c155af9199af9e69b889claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 1514103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(fcc, decomposition=NULL) failed\n"); 1515103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1516103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 1517103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1518103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void 1519103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusTestGetRawDecomposition() { 1520103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar decomp[32]; 1521103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t length; 1522103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1523103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode errorCode=U_ZERO_ERROR; 1524103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const UNormalizer2 *n2=unorm2_getNFKCInstance(&errorCode); 1525103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode)) { 1526103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err_status(errorCode, "unorm2_getNFKCInstance() failed: %s\n", u_errorName(errorCode)); 1527103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 1528103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1529103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* 1530103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Raw decompositions from NFKC data are the Unicode Decomposition_Mapping values, 1531103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * without recursive decomposition. 1532103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 1533103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1534103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_getRawDecomposition(n2, 0x20, decomp, LENGTHOF(decomp), &errorCode); 1535103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode) || length>=0) { 1536103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(nfkc, space) failed\n"); 1537103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1538103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errorCode=U_ZERO_ERROR; 1539103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_getRawDecomposition(n2, 0xe4, decomp, LENGTHOF(decomp), &errorCode); 1540103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode) || length!=2 || decomp[0]!=0x61 || decomp[1]!=0x308 || decomp[2]!=0) { 1541103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(nfkc, a-umlaut) failed\n"); 1542103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1543103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* U+1E08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE */ 1544103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errorCode=U_ZERO_ERROR; 1545103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_getRawDecomposition(n2, 0x1e08, decomp, LENGTHOF(decomp), &errorCode); 1546103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode) || length!=2 || decomp[0]!=0xc7 || decomp[1]!=0x301 || decomp[2]!=0) { 1547103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(nfkc, c-cedilla-acute) failed\n"); 1548103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1549103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* U+212B ANGSTROM SIGN */ 1550103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errorCode=U_ZERO_ERROR; 1551103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_getRawDecomposition(n2, 0x212b, decomp, LENGTHOF(decomp), &errorCode); 1552103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode) || length!=1 || decomp[0]!=0xc5 || decomp[1]!=0) { 1553103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(nfkc, angstrom sign) failed\n"); 1554103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1555103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errorCode=U_ZERO_ERROR; 1556103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_getRawDecomposition(n2, 0xac00, decomp, LENGTHOF(decomp), &errorCode); 1557103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode) || length!=2 || decomp[0]!=0x1100 || decomp[1]!=0x1161 || decomp[2]!=0) { 1558103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(nfkc, Hangul syllable U+AC00) failed\n"); 1559103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1560103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* A Hangul LVT syllable has a raw decomposition of an LV syllable + T. */ 1561103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errorCode=U_ZERO_ERROR; 1562103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_getRawDecomposition(n2, 0xac01, decomp, LENGTHOF(decomp), &errorCode); 1563103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode) || length!=2 || decomp[0]!=0xac00 || decomp[1]!=0x11a8 || decomp[2]!=0) { 1564103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(nfkc, Hangul syllable U+AC01) failed\n"); 1565103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1566103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errorCode=U_ZERO_ERROR; 1567103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_getRawDecomposition(n2, 0xac01, NULL, 0, &errorCode); 1568103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=2) { 1569103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(nfkc, Hangul syllable U+AC01) overflow failed\n"); 1570103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1571103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errorCode=U_ZERO_ERROR; 1572103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_getRawDecomposition(n2, 0xac01, decomp, -1, &errorCode); 1573103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 1574103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(nfkc, capacity<0) failed\n"); 1575103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1576103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errorCode=U_ZERO_ERROR; 1577103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_getRawDecomposition(n2, 0xac01, NULL, 4, &errorCode); 1578103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 1579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getDecomposition(nfkc, decomposition=NULL) failed\n"); 158027f654740f2a26ad62a5c155af9199af9e69b889claireho } 158127f654740f2a26ad62a5c155af9199af9e69b889claireho} 158227f654740f2a26ad62a5c155af9199af9e69b889claireho 1583b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void 1584b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoTestAppendRestoreMiddle() { 1585b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar a[20]={ 0x61, 0x62, 0x63, 0x41, 0x327, 0 }; /* last chars are 'A' and 'cedilla' NFC */ 1586b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const UChar b[]={ 0x30A, 0x64, 0x65, 0x66, 0 }; /* first char is 'ring above' NFC */ 1587b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* NFC: C5 is 'A with ring above' */ 1588b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const UChar expected[]={ 0x61, 0x62, 0x63, 0xC5, 0x327, 0x64, 0x65, 0x66 }; 1589b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t length; 1590b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode errorCode=U_ZERO_ERROR; 1591103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const UNormalizer2 *n2=unorm2_getNFCInstance(&errorCode); 1592b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(U_FAILURE(errorCode)) { 1593103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err_status(errorCode, "unorm2_getNFCInstance() failed: %s\n", u_errorName(errorCode)); 1594b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 1595b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1596b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* 1597b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Use length=-1 to fool the estimate of the ReorderingBuffer capacity. 1598b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Use a capacity of 6 or 7 so that the middle sequence <41 327 30A> 1599b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * still fits into a[] but the full result still overflows this capacity. 1600b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * (Let it modify the destination buffer before reallocating internally.) 1601b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */ 1602b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho length=unorm2_append(n2, a, -1, 6, b, -1, &errorCode); 1603b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=LENGTHOF(expected)) { 1604b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("unorm2_append(preflight) returned wrong length of %d\n", (int)length); 1605b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 1606b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1607b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* Verify that the middle is unchanged or restored. (ICU ticket #7848) */ 1608b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(a[0]!=0x61 || a[1]!=0x62 || a[2]!=0x63 || a[3]!=0x41 || a[4]!=0x327 || a[5]!=0) { 1609b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("unorm2_append(overflow) modified the first string\n"); 1610b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 1611b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1612b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errorCode=U_ZERO_ERROR; 1613b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho length=unorm2_append(n2, a, -1, LENGTHOF(a), b, -1, &errorCode); 1614b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(U_FAILURE(errorCode) || length!=LENGTHOF(expected) || 0!=u_memcmp(a, expected, length)) { 1615b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("unorm2_append(real) failed - %s, length %d\n", u_errorName(errorCode), (int)length); 1616b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 1617b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1618b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 1619b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1620103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void 1621103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusTestGetEasyToUseInstance() { 1622103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius static const UChar in[]={ 1623103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 0xA0, /* -> <noBreak> 0020 */ 1624103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 0xC7, 0x301 /* = 1E08 = 0043 0327 0301 */ 1625103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 1626103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar out[32]; 1627103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t length; 1628103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1629103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode errorCode=U_ZERO_ERROR; 1630103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const UNormalizer2 *n2=unorm2_getNFCInstance(&errorCode); 1631103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode)) { 1632103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err_status(errorCode, "unorm2_getNFCInstance() failed: %s\n", u_errorName(errorCode)); 1633103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 1634103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1635103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_normalize(n2, in, LENGTHOF(in), out, LENGTHOF(out), &errorCode); 1636103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode) || length!=2 || out[0]!=0xa0 || out[1]!=0x1e08) { 1637103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getNFCInstance() did not return an NFC instance (normalized length=%d; %s)\n", 1638103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius (int)length, u_errorName(errorCode)); 1639103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1640103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1641103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errorCode=U_ZERO_ERROR; 1642103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius n2=unorm2_getNFDInstance(&errorCode); 1643103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode)) { 1644103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err_status(errorCode, "unorm2_getNFDInstance() failed: %s\n", u_errorName(errorCode)); 1645103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 1646103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1647103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_normalize(n2, in, LENGTHOF(in), out, LENGTHOF(out), &errorCode); 1648103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode) || length!=4 || out[0]!=0xa0 || out[1]!=0x43 || out[2]!=0x327 || out[3]!=0x301) { 1649103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getNFDInstance() did not return an NFD instance (normalized length=%d; %s)\n", 1650103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius (int)length, u_errorName(errorCode)); 1651103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1652103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1653103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errorCode=U_ZERO_ERROR; 1654103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius n2=unorm2_getNFKCInstance(&errorCode); 1655103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode)) { 1656103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err_status(errorCode, "unorm2_getNFKCInstance() failed: %s\n", u_errorName(errorCode)); 1657103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 1658103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1659103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_normalize(n2, in, LENGTHOF(in), out, LENGTHOF(out), &errorCode); 1660103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode) || length!=2 || out[0]!=0x20 || out[1]!=0x1e08) { 1661103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getNFKCInstance() did not return an NFKC instance (normalized length=%d; %s)\n", 1662103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius (int)length, u_errorName(errorCode)); 1663103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1664103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1665103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errorCode=U_ZERO_ERROR; 1666103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius n2=unorm2_getNFKDInstance(&errorCode); 1667103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode)) { 1668103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err_status(errorCode, "unorm2_getNFKDInstance() failed: %s\n", u_errorName(errorCode)); 1669103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 1670103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1671103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_normalize(n2, in, LENGTHOF(in), out, LENGTHOF(out), &errorCode); 1672103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode) || length!=4 || out[0]!=0x20 || out[1]!=0x43 || out[2]!=0x327 || out[3]!=0x301) { 1673103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getNFKDInstance() did not return an NFKD instance (normalized length=%d; %s)\n", 1674103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius (int)length, u_errorName(errorCode)); 1675103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1676103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1677103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errorCode=U_ZERO_ERROR; 1678103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius n2=unorm2_getNFKCCasefoldInstance(&errorCode); 1679103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode)) { 1680103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err_status(errorCode, "unorm2_getNFKCCasefoldInstance() failed: %s\n", u_errorName(errorCode)); 1681103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 1682103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1683103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length=unorm2_normalize(n2, in, LENGTHOF(in), out, LENGTHOF(out), &errorCode); 1684103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(errorCode) || length!=2 || out[0]!=0x20 || out[1]!=0x1e09) { 1685103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("unorm2_getNFKCCasefoldInstance() did not return an NFKC_Casefold instance (normalized length=%d; %s)\n", 1686103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius (int)length, u_errorName(errorCode)); 1687103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1688103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 1689103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_NORMALIZATION */ 1691