16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************** 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT: 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2013, International Business Machines Corporation and 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/ 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************************** 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File CITERTST.C 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History: 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Date Name Description 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Madhu Katragadda Ported for C API 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 02/19/01 synwee Modified test case for new collation iterator 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*********************************************************************************/ 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Collation Iterator tests. 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (Let me reiterate my position...) 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_COLLATION 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucol.h" 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucoleitr.h" 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uloc.h" 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h" 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/putil.h" 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "callcoll.h" 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cintltst.h" 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "citertst.h" 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ccolltst.h" 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "filestrm.h" 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucol_imp.h" 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucol_tok.h" 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uparse.h" 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h> 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgextern uint8_t ucol_uprv_getCaseBits(const UChar *, uint32_t, UErrorCode *); 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addCollIterTest(TestNode** root) 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestPrevious, "tscoll/citertst/TestPrevious"); 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestOffset, "tscoll/citertst/TestOffset"); 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestSetText, "tscoll/citertst/TestSetText"); 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestMaxExpansion, "tscoll/citertst/TestMaxExpansion"); 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestUnicodeChar, "tscoll/citertst/TestUnicodeChar"); 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestNormalizedUnicodeChar, 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "tscoll/citertst/TestNormalizedUnicodeChar"); 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestNormalization, "tscoll/citertst/TestNormalization"); 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestBug672, "tscoll/citertst/TestBug672"); 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestBug672Normalize, "tscoll/citertst/TestBug672Normalize"); 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestSmallBuffer, "tscoll/citertst/TestSmallBuffer"); 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestCEs, "tscoll/citertst/TestCEs"); 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestDiscontiguos, "tscoll/citertst/TestDiscontiguos"); 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestCEBufferOverflow, "tscoll/citertst/TestCEBufferOverflow"); 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestCEValidity, "tscoll/citertst/TestCEValidity"); 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestSortKeyValidity, "tscoll/citertst/TestSortKeyValidity"); 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestSearchCollatorElements, "tscoll/citertst/TestSearchCollatorElements"); 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* The locales we support */ 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char * LOCALES[] = {"en_AU", "en_BE", "en_CA"}; 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBug672() { 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar pattern[20]; 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar text[50]; 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int result[3][3]; 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(pattern, "resume"); 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(text, "Time to resume updating my resume."); 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < 3; ++ i) { 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *coll = ucol_open(LOCALES[i], &status); 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *pitr = ucol_openElements(coll, pattern, -1, 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &status); 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *titer = ucol_openElements(coll, text, -1, 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &status); 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "ERROR: in creation of either the collator or the collation iterator :%s\n", 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("locale tested %s\n", LOCALES[i]); 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (ucol_next(pitr, &status) != UCOL_NULLORDER && 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SUCCESS(status)) { 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: reversing collation iterator :%s\n", 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_reset(pitr); 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setOffset(titer, u_strlen(pattern), &status); 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: setting offset in collator :%s\n", 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result[i][0] = ucol_getOffset(titer); 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Text iterator set to offset %d\n", result[i][0]); 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Use previous() */ 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_previous(titer, &status); 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result[i][1] = ucol_getOffset(titer); 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Current offset %d after previous\n", result[i][1]); 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Add one to index */ 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Adding one to current offset...\n"); 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setOffset(titer, ucol_getOffset(titer) + 1, &status); 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: setting offset in collator :%s\n", 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result[i][2] = ucol_getOffset(titer); 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Current offset in text = %d\n", result[i][2]); 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(pitr); 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(titer); 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uprv_memcmp(result[0], result[1], 3) != 0 || 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcmp(result[1], result[2], 3) != 0) { 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Different locales have different offsets at the same character\n"); 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Running this test with normalization enabled showed up a bug in the incremental 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org normalization code. */ 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBug672Normalize() { 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar pattern[20]; 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar text[50]; 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int result[3][3]; 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(pattern, "resume"); 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(text, "Time to resume updating my resume."); 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < 3; ++ i) { 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *coll = ucol_open(LOCALES[i], &status); 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *pitr = NULL; 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *titer = NULL; 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pitr = ucol_openElements(coll, pattern, -1, &status); 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org titer = ucol_openElements(coll, text, -1, &status); 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "ERROR: in creation of either the collator or the collation iterator :%s\n", 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("locale tested %s\n", LOCALES[i]); 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (ucol_next(pitr, &status) != UCOL_NULLORDER && 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SUCCESS(status)) { 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: reversing collation iterator :%s\n", 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_reset(pitr); 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setOffset(titer, u_strlen(pattern), &status); 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: setting offset in collator :%s\n", 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result[i][0] = ucol_getOffset(titer); 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Text iterator set to offset %d\n", result[i][0]); 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Use previous() */ 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_previous(titer, &status); 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result[i][1] = ucol_getOffset(titer); 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Current offset %d after previous\n", result[i][1]); 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Add one to index */ 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Adding one to current offset...\n"); 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setOffset(titer, ucol_getOffset(titer) + 1, &status); 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: setting offset in collator :%s\n", 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result[i][2] = ucol_getOffset(titer); 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Current offset in text = %d\n", result[i][2]); 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(pitr); 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(titer); 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uprv_memcmp(result[0], result[1], 3) != 0 || 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcmp(result[1], result[2], 3) != 0) { 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Different locales have different offsets at the same character\n"); 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test for CollationElementIterator previous and next for the whole set of 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * unicode characters. 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestUnicodeChar() 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar source[0x100]; 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *en_us; 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *iter; 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar codepoint; 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *test; 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org en_us = ucol_open("en_US", &status); 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)){ 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "ERROR: in creation of collation data using ucol_open()\n %s\n", 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (codepoint = 1; codepoint < 0xFFFE;) 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test = source; 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (codepoint % 0xFF != 0) 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (u_isdefined(codepoint)) 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *(test ++) = codepoint; 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoint ++; 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (u_isdefined(codepoint)) 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *(test ++) = codepoint; 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (codepoint != 0xFFFF) 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoint ++; 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *test = 0; 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter=ucol_openElements(en_us, source, u_strlen(source), &status); 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(en_us); 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* A basic test to see if it's working at all */ 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("codepoint testing %x\n", codepoint); 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* null termination test */ 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter=ucol_openElements(en_us, source, -1, &status); 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(en_us); 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* A basic test to see if it's working at all */ 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(en_us); 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test for CollationElementIterator previous and next for the whole set of 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * unicode characters with normalization on. 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestNormalizedUnicodeChar() 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar source[0x100]; 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *th_th; 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *iter; 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar codepoint; 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *test; 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* thai should have normalization on */ 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org th_th = ucol_open("th_TH", &status); 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)){ 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "ERROR: in creation of thai collation using ucol_open()\n %s\n", 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (codepoint = 1; codepoint < 0xFFFE;) 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test = source; 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (codepoint % 0xFF != 0) 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (u_isdefined(codepoint)) 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *(test ++) = codepoint; 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoint ++; 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (u_isdefined(codepoint)) 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *(test ++) = codepoint; 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (codepoint != 0xFFFF) 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoint ++; 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *test = 0; 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter=ucol_openElements(th_th, source, u_strlen(source), &status); 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(th_th); 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter=ucol_openElements(th_th, source, -1, &status); 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(th_th); 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(th_th); 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Test the incremental normalization 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestNormalization() 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *str = 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "&a < \\u0300\\u0315 < A\\u0300\\u0315 < \\u0316\\u0315B < \\u0316\\u0300\\u0315"; 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *coll; 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar rule[50]; 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int rulelen = u_unescape(str, rule, 50); 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *testdata[] = 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"\\u1ED9", "o\\u0323\\u0302", 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u0300\\u0315", "\\u0315\\u0300", 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "A\\u0300\\u0315B", "A\\u0315\\u0300B", 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "A\\u0316\\u0315B", "A\\u0315\\u0316B", 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u0316\\u0300\\u0315", "\\u0315\\u0300\\u0316", 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "A\\u0316\\u0300\\u0315B", "A\\u0315\\u0300\\u0316B", 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u0316\\u0315\\u0300", "A\\u0316\\u0315\\u0300B"}; 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srclen; 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar source[10]; 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *iter; 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll = ucol_openRules(rule, rulelen, UCOL_ON, UCOL_TERTIARY, NULL, &status); 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)){ 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "ERROR: in creation of collator using ucol_openRules()\n %s\n", 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srclen = u_unescape(testdata[0], source, 10); 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter = ucol_openElements(coll, source, srclen, &status); 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srclen = u_unescape(testdata[1], source, 10); 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter = ucol_openElements(coll, source, srclen, &status); 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (count < 12) { 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srclen = u_unescape(testdata[count], source, 10); 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter = ucol_openElements(coll, source, srclen, &status); 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)){ 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collator element iterator\n %s\n", 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter = ucol_openElements(coll, source, -1, &status); 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)){ 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collator element iterator\n %s\n", 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test for CollationElementIterator.previous() 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4108758 - Make sure it works with contracting characters 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestPrevious() 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *coll=NULL; 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar rule[50]; 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *source; 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *c1, *c2, *c3; 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *iter; 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar test1[50]; 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar test2[50]; 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(test1, "What subset of all possible test cases?"); 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(test2, "has the highest probability of detecting"); 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll = ucol_open("en_US", &status); 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter=ucol_openElements(coll, test1, u_strlen(test1), &status); 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("English locale testing back and forth\n"); 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* A basic test to see if it's working at all */ 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Test with a contracting character sequence */ 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(rule, "&a,A < b,B < c,C, d,D < z,Z < ch,cH,Ch,CH"); 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c1 = ucol_openRules(rule, u_strlen(rule), UCOL_OFF, UCOL_DEFAULT_STRENGTH, NULL, &status); 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Contraction rule testing back and forth with no normalization\n"); 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (c1 == NULL || U_FAILURE(status)) 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Couldn't create a RuleBasedCollator with a contracting sequence\n %s\n", 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source=(UChar*)malloc(sizeof(UChar) * 20); 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(source, "abchdcba"); 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter=ucol_openElements(c1, source, u_strlen(source), &status); 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(c1); 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Test with an expanding character sequence */ 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(rule, "&a < b < c/abd < d"); 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c2 = ucol_openRules(rule, u_strlen(rule), UCOL_OFF, UCOL_DEFAULT_STRENGTH, NULL, &status); 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Expansion rule testing back and forth with no normalization\n"); 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (c2 == NULL || U_FAILURE(status)) 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Couldn't create a RuleBasedCollator with a contracting sequence.\n %s\n", 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(source, "abcd"); 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter=ucol_openElements(c2, source, u_strlen(source), &status); 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(c2); 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Now try both */ 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(rule, "&a < b < c/aba < d < z < ch"); 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c3 = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH,NULL, &status); 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Expansion/contraction rule testing back and forth with no normalization\n"); 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (c3 == NULL || U_FAILURE(status)) 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Couldn't create a RuleBasedCollator with a contracting sequence.\n %s\n", 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(source, "abcdbchdc"); 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter=ucol_openElements(c3, source, u_strlen(source), &status); 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(c3); 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[0] = 0x0e41; 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[1] = 0x0e02; 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[2] = 0x0e41; 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[3] = 0x0e02; 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[4] = 0x0e27; 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[5] = 0x61; 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[6] = 0x62; 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[7] = 0x63; 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[8] = 0; 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll = ucol_open("th_TH", &status); 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Thai locale testing back and forth with normalization\n"); 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter=ucol_openElements(coll, source, u_strlen(source), &status); 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* prev test */ 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[0] = 0x0061; 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[1] = 0x30CF; 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[2] = 0x3099; 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[3] = 0x30FC; 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[4] = 0; 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll = ucol_open("ja_JP", &status); 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Japanese locale testing back and forth with normalization\n"); 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter=ucol_openElements(coll, source, u_strlen(source), &status); 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org free(source); 5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test for getOffset() and setOffset() 5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestOffset() 5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status= U_ZERO_ERROR; 5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *en_us=NULL; 5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *iter, *pristine; 5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset; 5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OrderAndOffset *orders; 5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t orderLength=0; 5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar test1[50]; 5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar test2[50]; 5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(test1, "What subset of all possible test cases?"); 5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(test2, "has the highest probability of detecting"); 5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org en_us = ucol_open("en_US", &status); 5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing getOffset and setOffset for collations\n"); 5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter = ucol_openElements(en_us, test1, u_strlen(test1), &status); 5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(en_us); 5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* testing boundaries */ 5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setOffset(iter, 0, &status); 5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status) || ucol_previous(iter, &status) != UCOL_NULLORDER) { 5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error: After setting offset to 0, we should be at the end " 5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "of the backwards iteration"); 5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setOffset(iter, u_strlen(test1), &status); 5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status) || ucol_next(iter, &status) != UCOL_NULLORDER) { 5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error: After setting offset to end of the string, we should " 5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "be at the end of the backwards iteration"); 5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Run all the way through the iterator, then get the offset */ 5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org orders = getOrders(iter, &orderLength); 6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset = ucol_getOffset(iter); 6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (offset != u_strlen(test1)) 6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("offset at end != length %d vs %d\n", offset, 6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_strlen(test1) ); 6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Now set the offset back to the beginning and see if it works */ 6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pristine=ucol_openElements(en_us, test1, u_strlen(test1), &status); 6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(en_us); 6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setOffset(iter, 0, &status); 6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) 6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("setOffset failed. %s\n", myErrorName(status)); 6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertEqual(iter, pristine); 6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(pristine); 6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org free(orders); 6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* testing offsets in normalization buffer */ 6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1[0] = 0x61; 6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1[1] = 0x300; 6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1[2] = 0x316; 6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1[3] = 0x62; 6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1[4] = 0; 6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setAttribute(en_us, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter = ucol_openElements(en_us, test1, 4, &status); 6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(en_us); 6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count = 0; 6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (ucol_next(iter, &status) != UCOL_NULLORDER && 6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SUCCESS(status)) { 6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (count) { 6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0: 6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ucol_getOffset(iter) != 1) { 6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Offset of iteration should be 1\n"); 6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 3: 6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ucol_getOffset(iter) != 4) { 6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Offset of iteration should be 4\n"); 6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ucol_getOffset(iter) != 3) { 6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Offset of iteration should be 3\n"); 6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_reset(iter); 6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count = 0; 6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (ucol_previous(iter, &status) != UCOL_NULLORDER && 6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SUCCESS(status)) { 6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (count) { 6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0: 6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 1: 6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ucol_getOffset(iter) != 3) { 6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Offset of iteration should be 3\n"); 6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 2: 6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ucol_getOffset(iter) != 1) { 6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Offset of iteration should be 1\n"); 6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ucol_getOffset(iter) != 0) { 6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Offset of iteration should be 0\n"); 6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in iterating collation elements %s\n", 6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(en_us); 7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test for setText() 7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestSetText() 7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t c,i; 7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *en_us=NULL; 7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *iter1, *iter2; 7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar test1[50]; 7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar test2[50]; 7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(test1, "What subset of all possible test cases?"); 7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(test2, "has the highest probability of detecting"); 7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org en_us = ucol_open("en_US", &status); 7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("testing setText for Collation elements\n"); 7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter1=ucol_openElements(en_us, test1, u_strlen(test1), &status); 7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "ERROR: in creation of collation element iterator1 using ucol_openElements()\n %s\n", 7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(en_us); 7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter2=ucol_openElements(en_us, test2, u_strlen(test2), &status); 7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: in creation of collation element iterator2 using ucol_openElements()\n %s\n", 7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myErrorName(status)); 7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(en_us); 7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Run through the second iterator just to exercise it */ 7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = ucol_next(iter2, &status); 7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i = 0; 7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ( ++i < 10 && (c != UCOL_NULLORDER)) 7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) 7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("iter2->next() returned an error. %s\n", myErrorName(status)); 7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter2); 7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter1); 7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(en_us); 7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = ucol_next(iter2, &status); 7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Now set it to point to the same string as the first iterator */ 7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setText(iter2, test1, u_strlen(test1), &status); 7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) 7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("call to iter2->setText(test1) failed. %s\n", myErrorName(status)); 7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertEqual(iter1, iter2); 7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Now set it to point to a null string with fake length*/ 7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setText(iter2, NULL, 2, &status); 7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) 7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("call to iter2->setText(null) failed. %s\n", myErrorName(status)); 7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ucol_next(iter2, &status) != UCOL_NULLORDER) { 7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("iter2 with null text expected to return UCOL_NULLORDER\n"); 7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter2); 7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter1); 7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(en_us); 7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** @bug 4108762 7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test for getMaxExpansion() 7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestMaxExpansion() 7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *coll ;/*= ucol_open("en_US", &status);*/ 7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar ch = 0; 7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 unassigned = 0xEFFFD; 7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar supplementary[2]; 7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t stringOffset = 0; 7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isError = FALSE; 7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t sorder = 0; 7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *iter ;/*= ucol_openElements(coll, &ch, 1, &status);*/ 7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t temporder = 0; 7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar rule[256]; 7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(rule, "&a < ab < c/aba < d < z < ch"); 8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT, 8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCOL_DEFAULT_STRENGTH,NULL, &status); 8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status) && coll) { 8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter = ucol_openElements(coll, &ch, 1, &status); 8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (ch < 0xFFFF && U_SUCCESS(status)) { 8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 1; 8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t order; 8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t size = 0; 8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch ++; 8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setText(iter, &ch, 1, &status); 8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org order = ucol_previous(iter, &status); 8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* thai management */ 8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (order == 0) 8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org order = ucol_previous(iter, &status); 8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (U_SUCCESS(status) && 8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_previous(iter, &status) != UCOL_NULLORDER) { 8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org size = ucol_getMaxExpansion(iter, order); 8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status) || size < count) { 8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Failure at codepoint %d, maximum expansion count < %d\n", 8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch, count); 8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* testing for exact max expansion */ 8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch = 0; 8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (ch < 0x61) { 8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t order; 8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t size; 8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setText(iter, &ch, 1, &status); 8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org order = ucol_previous(iter, &status); 8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org size = ucol_getMaxExpansion(iter, order); 8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status) || size != 1) { 8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Failure at codepoint %d, maximum expansion count < %d\n", 8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch, 1); 8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch ++; 8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch = 0x63; 8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setText(iter, &ch, 1, &status); 8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temporder = ucol_previous(iter, &status); 8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) != 3) { 8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Failure at codepoint %d, maximum expansion count != %d\n", 8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch, 3); 8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch = 0x64; 8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setText(iter, &ch, 1, &status); 8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temporder = ucol_previous(iter, &status); 8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) != 1) { 8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Failure at codepoint %d, maximum expansion count != %d\n", 8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch, 3); 8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_APPEND(supplementary, stringOffset, 2, unassigned, isError); 8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)isError; /* Suppress set but not used warning. */ 8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setText(iter, supplementary, 2, &status); 8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sorder = ucol_previous(iter, &status); 8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status) || ucol_getMaxExpansion(iter, sorder) != 2) { 8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Failure at codepoint %d, maximum expansion count < %d\n", 8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch, 2); 8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* testing jamo */ 8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch = 0x1165; 8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setText(iter, &ch, 1, &status); 8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temporder = ucol_previous(iter, &status); 8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) > 3) { 8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Failure at codepoint %d, maximum expansion count > %d\n", 8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch, 3); 8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* testing special jamo &a<\u1160 */ 8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rule[0] = 0x26; 8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rule[1] = 0x71; 8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rule[2] = 0x3c; 8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rule[3] = 0x1165; 8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rule[4] = 0x2f; 8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rule[5] = 0x71; 8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rule[6] = 0x71; 8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rule[7] = 0x71; 8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rule[8] = 0x71; 8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rule[9] = 0; 8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT, 9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCOL_DEFAULT_STRENGTH,NULL, &status); 9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter = ucol_openElements(coll, &ch, 1, &status); 9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temporder = ucol_previous(iter, &status); 9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) != 6) { 9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Failure at codepoint %d, maximum expansion count > %d\n", 9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch, 5); 9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "Couldn't open collator -> %s\n", u_errorName(status)); 9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void assertEqual(UCollationElements *i1, UCollationElements *i2) 9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t c1, c2; 9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t count = 0; 9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org do 9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c1 = ucol_next(i1, &status); 9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c2 = ucol_next(i2, &status); 9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (c1 != c2) 9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error in iteration %d assetEqual between\n %d and %d, they are not equal\n", count, c1, c2); 9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count += 1; 9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (c1 != UCOL_NULLORDER); 9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Testing iterators with extremely small buffers 9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestSmallBuffer() 9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *coll; 9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *testiter, 9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *iter; 9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t count = 0; 9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OrderAndOffset *testorders, 9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *orders; 9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar teststr[500]; 9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar str[] = {0x300, 0x31A, 0}; 9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org creating a long string of decomposable characters, 9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org since by default the writable buffer is of size 256 9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (count < 500) { 9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((count & 1) == 0) { 9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org teststr[count ++] = 0x300; 9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org teststr[count ++] = 0x31A; 9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll = ucol_open("th_TH", &status); 9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status) && coll) { 9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testiter = ucol_openElements(coll, teststr, 500, &status); 9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter = ucol_openElements(coll, str, 2, &status); 9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org orders = getOrders(iter, &count); 9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (count != 2) { 9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error collation elements size is not 2 for \\u0300\\u031A\n"); 9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this will rearrange the string data to 250 characters of 0x300 first then 9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 250 characters of 0x031A 9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testorders = getOrders(testiter, &count); 9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (count != 500) { 9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error decomposition does not give the right sized collation elements\n"); 9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (count != 0) { 9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* UCA collation element for 0x0F76 */ 9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((count > 250 && testorders[-- count].order != orders[1].order) || 9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (count <= 250 && testorders[-- count].order != orders[0].order)) { 9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error decomposition does not give the right collation element at %d count\n", count); 9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org free(testorders); 9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org free(orders); 9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_reset(testiter); 10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* ensures closing of elements done properly to clear writable buffer */ 10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_next(testiter, &status); 10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_next(testiter, &status); 10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(testiter); 10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "Couldn't open collator -> %s\n", u_errorName(status)); 10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Sniplets of code from genuca 10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t hex2num(char hex) { 10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(hex>='0' && hex <='9') { 10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return hex-'0'; 10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(hex>='a' && hex<='f') { 10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return hex-'a'+10; 10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(hex>='A' && hex<='F') { 10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return hex-'A'+10; 10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Getting codepoints from a string 10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param str character string contain codepoints seperated by space and ended 10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* by a semicolon 10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param codepoints array for storage, assuming size > 5 10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @return position at the end of the codepoint section 10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char *getCodePoints(char *str, UChar *codepoints, UChar *contextCPs) { 10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode = U_ZERO_ERROR; 10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *semi = uprv_strchr(str, ';'); 10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *pipe = uprv_strchr(str, '|'); 10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *s; 10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *codepoints = 0; 10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *contextCPs = 0; 10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(semi == NULL) { 10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("expected semicolon after code point string in FractionalUCA.txt %s\n", str); 10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return str; 10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pipe != NULL) { 10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t contextLength; 10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pipe = 0; 10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org contextLength = u_parseString(str, contextCPs, 99, NULL, &errorCode); 10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pipe = '|'; 10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("error parsing precontext string from FractionalUCA.txt %s\n", str); 10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return str; 10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* prepend the precontext string to the codepoints */ 10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_memcpy(codepoints, contextCPs, contextLength); 10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoints += contextLength; 10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* start of the code point string */ 10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s = pipe + 1; 10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s = str; 10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_parseString(s, codepoints, 99, NULL, &errorCode); 10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("error parsing code point string from FractionalUCA.txt %s\n", str); 10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return str; 10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return semi + 1; 10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Sniplets of code from genuca 10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t 10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgreadElement(char **from, char *to, char separator, UErrorCode *status) 10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(*status)) { 10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char buffer[1024]; 10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i = 0; 10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (**from != separator) { 10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (**from != ' ') { 10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *(buffer+i++) = **from; 10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (*from)++; 10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (*from)++; 10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *(buffer + i) = 0; 10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(to, buffer); 10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return i/2; 10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Sniplets of code from genuca 10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint32_t 10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetSingleCEValue(char *primary, char *secondary, char *tertiary, 11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *status) 11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(*status)) { 11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t value = 0; 11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char primsave = '\0'; 11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char secsave = '\0'; 11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char tersave = '\0'; 11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *primend = primary+4; 11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *secend = secondary+2; 11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *terend = tertiary+2; 11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t primvalue; 11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t secvalue; 11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t tervalue; 11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uprv_strlen(primary) > 4) { 11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org primsave = *primend; 11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *primend = '\0'; 11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uprv_strlen(secondary) > 2) { 11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org secsave = *secend; 11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *secend = '\0'; 11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uprv_strlen(tertiary) > 2) { 11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tersave = *terend; 11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *terend = '\0'; 11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org primvalue = (*primary!='\0')?uprv_strtoul(primary, &primend, 16):0; 11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org secvalue = (*secondary!='\0')?uprv_strtoul(secondary, &secend, 16):0; 11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tervalue = (*tertiary!='\0')?uprv_strtoul(tertiary, &terend, 16):0; 11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(primvalue <= 0xFF) { 11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org primvalue <<= 8; 11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value = ((primvalue << UCOL_PRIMARYORDERSHIFT) & UCOL_PRIMARYORDERMASK) 11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org | ((secvalue << UCOL_SECONDARYORDERSHIFT) & UCOL_SECONDARYORDERMASK) 11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org | (tervalue & UCOL_TERTIARYORDERMASK); 11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(primsave!='\0') { 11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *primend = primsave; 11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(secsave!='\0') { 11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *secend = secsave; 11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(tersave!='\0') { 11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *terend = tersave; 11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return value; 11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Getting collation elements generated from a string 11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param str character string contain collation elements contained in [] and 11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* seperated by space 11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param ce array for storage, assuming size > 20 11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param status error status 11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @return position at the end of the codepoint section 11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char * getCEs(char *str, uint32_t *ces, UErrorCode *status) { 11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *pStartCP = uprv_strchr(str, '['); 11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *pEndCP; 11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char primary[100]; 11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char secondary[100]; 11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char tertiary[100]; 11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (*pStartCP == '[') { 11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t primarycount = 0; 11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t secondarycount = 0; 11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t tertiarycount = 0; 11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t CEi = 1; 11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pEndCP = strchr(pStartCP, ']'); 11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pEndCP == NULL) { 11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pStartCP ++; 11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org primarycount = readElement(&pStartCP, primary, ',', status); 11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org secondarycount = readElement(&pStartCP, secondary, ',', status); 11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tertiarycount = readElement(&pStartCP, tertiary, ']', status); 11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* I want to get the CEs entered right here, including continuation */ 11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ces[count ++] = getSingleCEValue(primary, secondary, tertiary, status); 11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(*status)) { 11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (2 * CEi < primarycount || CEi < secondarycount || 11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CEi < tertiarycount) { 11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t value = UCOL_CONTINUATION_MARKER; /* Continuation marker */ 11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (2 * CEi < primarycount) { 11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value |= ((hex2num(*(primary + 4 * CEi)) & 0xF) << 28); 11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value |= ((hex2num(*(primary + 4 * CEi + 1)) & 0xF) << 24); 11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (2 * CEi + 1 < primarycount) { 12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value |= ((hex2num(*(primary + 4 * CEi + 2)) & 0xF) << 20); 12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value |= ((hex2num(*(primary + 4 * CEi + 3)) &0xF) << 16); 12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (CEi < secondarycount) { 12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value |= ((hex2num(*(secondary + 2 * CEi)) & 0xF) << 12); 12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value |= ((hex2num(*(secondary + 2 * CEi + 1)) & 0xF) << 8); 12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (CEi < tertiarycount) { 12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value |= ((hex2num(*(tertiary + 2 * CEi)) & 0x3) << 4); 12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value |= (hex2num(*(tertiary + 2 * CEi + 1)) & 0xF); 12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CEi ++; 12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ces[count ++] = value; 12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pStartCP = pEndCP + 1; 12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ces[count] = 0; 12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return pStartCP; 12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Getting the FractionalUCA.txt file stream 12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic FileStream * getFractionalUCA(void) 12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char newPath[256]; 12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char backupPath[256]; 12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FileStream *result = NULL; 12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Look inside ICU_DATA first */ 12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcpy(newPath, ctest_dataSrcDir()); 12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcat(newPath, "unidata" U_FILE_SEP_STRING ); 12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcat(newPath, "FractionalUCA.txt"); 12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* As a fallback, try to guess where the source data was located 12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * at the time ICU was built, and look there. 12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined (U_TOPSRCDIR) 12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(backupPath, U_TOPSRCDIR U_FILE_SEP_STRING "data"); 12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else 12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode = U_ZERO_ERROR; 12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(backupPath, loadTestData(&errorCode)); 12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(backupPath, U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data"); 12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(backupPath, U_FILE_SEP_STRING "unidata" U_FILE_SEP_STRING "FractionalUCA.txt"); 12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = T_FileStream_open(newPath, "rb"); 12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result == NULL) { 12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = T_FileStream_open(backupPath, "rb"); 12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result == NULL) { 12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Failed to open either %s or %s\n", newPath, backupPath); 12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Testing the CEs returned by the iterator 12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCEs() { 12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FileStream *file = NULL; 12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char line[2048]; 12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *str; 12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar codepoints[10]; 12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t ces[20]; 12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *coll = ucol_open("", &status); 12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t lineNo = 0; 12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar contextCPs[5]; 12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "Error in opening root collator -> %s\n", u_errorName(status)); 12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org file = getFractionalUCA(); 12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (file == NULL) { 12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("*** unable to open input FractionalUCA.txt file ***\n"); 12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (T_FileStream_readLine(file, line, sizeof(line)) != NULL) { 12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *iter; 12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t preContextCeLen=0; 12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineNo++; 12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* skip this line if it is empty or a comment or is a return value 12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org or start of some variable section */ 12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(line[0] == 0 || line[0] == '#' || line[0] == '\n' || 12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org line[0] == 0x000D || line[0] == '[') { 12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str = getCodePoints(line, codepoints, contextCPs); 13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* these are 'fake' codepoints in the fractional UCA, and are used just 13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for positioning of indirect values. They should not go through this 13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * test. 13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(*codepoints == 0xFDD0) { 13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (*contextCPs != 0) { 13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter = ucol_openElements(coll, contextCPs, -1, &status); 13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error in opening collation elements\n"); 13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while((ces[preContextCeLen] = ucol_next(iter, &status)) != (uint32_t)UCOL_NULLORDER) { 13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org preContextCeLen++; 13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org getCEs(str, ces+preContextCeLen, &status); 13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error in parsing collation elements in FractionalUCA.txt\n"); 13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter = ucol_openElements(coll, codepoints, -1, &status); 13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error in opening collation elements\n"); 13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t ce = (uint32_t)ucol_next(iter, &status); 13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ce == 0xFFFFFFFF) { 13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ce = 0; 13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* we now unconditionally reorder Thai/Lao prevowels, so this 13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * test would fail if we don't skip here. 13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(UCOL_ISTHAIPREVOWEL(*codepoints) && ce == 0 && count == 0) { 13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ce != ces[count] || U_FAILURE(status)) { 13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Collation elements in FractionalUCA.txt and iterators do not match!\n"); 13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ces[count] == 0) { 13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org T_FileStream_close(file); 13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Testing the discontigous contractions 13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestDiscontiguos() { 13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *rulestr = 13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "&z < AB < X\\u0300 < ABC < X\\u0300\\u0315"; 13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar rule[50]; 13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int rulelen = u_unescape(rulestr, rule, 50); 13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *src[] = { 13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ADB", "ADBC", "A\\u0315B", "A\\u0315BC", 13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* base character blocked */ 13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "XD\\u0300", "XD\\u0300\\u0315", 13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* non blocking combining character */ 13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "X\\u0319\\u0300", "X\\u0319\\u0300\\u0315", 13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* blocking combining character */ 13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "X\\u0314\\u0300", "X\\u0314\\u0300\\u0315", 13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* contraction prefix */ 13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ABDC", "AB\\u0315C","X\\u0300D\\u0315", "X\\u0300\\u0319\\u0315", 13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "X\\u0300\\u031A\\u0315", 13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* ends not with a contraction character */ 13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "X\\u0319\\u0300D", "X\\u0319\\u0300\\u0315D", "X\\u0300D\\u0315D", 13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "X\\u0300\\u0319\\u0315D", "X\\u0300\\u031A\\u0315D" 13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *tgt[] = { 13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* non blocking combining character */ 13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "A D B", "A D BC", "A \\u0315 B", "A \\u0315 BC", 13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* base character blocked */ 13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "X D \\u0300", "X D \\u0300\\u0315", 13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* non blocking combining character */ 13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "X\\u0300 \\u0319", "X\\u0300\\u0315 \\u0319", 13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* blocking combining character */ 13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "X \\u0314 \\u0300", "X \\u0314 \\u0300\\u0315", 13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* contraction prefix */ 13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "AB DC", "AB \\u0315 C","X\\u0300 D \\u0315", "X\\u0300\\u0315 \\u0319", 13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "X\\u0300 \\u031A \\u0315", 13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* ends not with a contraction character */ 13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "X\\u0300 \\u0319D", "X\\u0300\\u0315 \\u0319D", "X\\u0300 D\\u0315D", 13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "X\\u0300\\u0315 \\u0319D", "X\\u0300 \\u031A\\u0315D" 13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int size = 20; 14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *coll; 14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *iter; 14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *resultiter; 14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll = ucol_openRules(rule, rulelen, UCOL_OFF, UCOL_DEFAULT_STRENGTH,NULL, &status); 14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter = ucol_openElements(coll, rule, 1, &status); 14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org resultiter = ucol_openElements(coll, rule, 1, &status); 14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "Error opening collation rules -> %s\n", u_errorName(status)); 14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (count < size) { 14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar str[20]; 14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar tstr[20]; 14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int strLen = u_unescape(src[count], str, 20); 14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *s; 14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setText(iter, str, strLen, &status); 14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error opening collation iterator\n"); 14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_unescape(tgt[count], tstr, 20); 14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s = tstr; 14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("count %d\n", count); 14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t ce; 14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *e = u_strchr(s, 0x20); 14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (e == 0) { 14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org e = u_strchr(s, 0); 14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setText(resultiter, s, (int32_t)(e - s), &status); 14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ce = ucol_next(resultiter, &status); 14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error manipulating collation iterator\n"); 14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (ce != UCOL_NULLORDER) { 14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ce != (uint32_t)ucol_next(iter, &status) || 14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_FAILURE(status)) { 14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Discontiguos contraction test mismatch\n"); 14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ce = ucol_next(resultiter, &status); 14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error getting next collation element\n"); 14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s = e + 1; 14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (*e == 0) { 14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_reset(iter); 14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org backAndForth(iter); 14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(resultiter); 14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCEBufferOverflow() 14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar str[UCOL_EXPAND_CE_BUFFER_SIZE + 1]; 14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar rule[10]; 14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *coll; 14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *iter; 14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_uastrcpy(rule, "&z < AB"); 14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll = ucol_openRules(rule, u_strlen(rule), UCOL_OFF, UCOL_DEFAULT_STRENGTH, NULL,&status); 14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "Rule based collator not created for testing ce buffer overflow -> %s\n", u_errorName(status)); 14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 0xDCDC is a trail surrogate hence deemed unsafe by the heuristic 14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test. this will cause an overflow in getPrev */ 14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str[0] = 0x0041; /* 'A' */ 14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*uprv_memset(str + 1, 0xE0, sizeof(UChar) * UCOL_EXPAND_CE_BUFFER_SIZE);*/ 14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memset(str + 1, 0xDC, sizeof(UChar) * UCOL_EXPAND_CE_BUFFER_SIZE); 14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str[UCOL_EXPAND_CE_BUFFER_SIZE] = 0x0042; /* 'B' */ 14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter = ucol_openElements(coll, str, UCOL_EXPAND_CE_BUFFER_SIZE + 1, 14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &status); 14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ucol_previous(iter, &status) == UCOL_NULLORDER || 14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status == U_BUFFER_OVERFLOW_ERROR) { 14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("CE buffer should not overflow with long string of trail surrogates\n"); 14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Checking collation element validity. 15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAX_CODEPOINTS_TO_SHOW 10 15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void showCodepoints(const UChar *codepoints, int length, char * codepointText) { 15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i, lengthToUse = length; 15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (lengthToUse > MAX_CODEPOINTS_TO_SHOW) { 15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lengthToUse = MAX_CODEPOINTS_TO_SHOW; 15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < lengthToUse; ++i) { 15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int bytesWritten = sprintf(codepointText, " %04X", *codepoints++); 15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (bytesWritten <= 0) { 15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepointText += bytesWritten; 15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (i < length) { 15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sprintf(codepointText, " ..."); 15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool checkCEValidity(const UCollator *coll, const UChar *codepoints, 15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int length) 15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *iter = ucol_openElements(coll, codepoints, length, 15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &status); 15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool result = FALSE; 15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool primaryDone = FALSE, secondaryDone = FALSE, tertiaryDone = FALSE; 15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char * collLocale; 15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error creating iterator for testing validity\n"); 15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org collLocale = ucol_getLocale(coll, ULOC_VALID_LOCALE, &status); 15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status) || collLocale==NULL) { 15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org collLocale = "?"; 15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t ce = ucol_next(iter, &status); 15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t primary, p1, p2, secondary, tertiary; 15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ce == UCOL_NULLORDER) { 15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = TRUE; 15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ce == 0) { 15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ce == 0x02000202) { 15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* special CE for merge-sort character */ 15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (*codepoints == 0xFFFE /* && length == 1 */) { 15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Note: We should check for length==1 but the token parser appears 15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to give us trailing NUL characters. 15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * TODO: Ticket #8047: Change TestCEValidity to use ucol_getTailoredSet() 15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * rather than the internal collation rule parser 15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Special 02/02/02 weight for code point U+%04X [len %d] != U+FFFE\n", 15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (int)*codepoints, (int)length); 15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org primary = UCOL_PRIMARYORDER(ce); 15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org p1 = primary >> 8; 15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org p2 = primary & 0xFF; 15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org secondary = UCOL_SECONDARYORDER(ce); 15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tertiary = UCOL_TERTIARYORDER(ce) & UCOL_REMOVE_CONTINUATION; 15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!isContinuation(ce)) { 15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((ce & UCOL_REMOVE_CONTINUATION) == 0) { 15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Empty CE %08lX except for case bits\n", (long)ce); 15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (p1 == 0) { 15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (p2 != 0) { 15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Primary 00 xx in %08lX\n", (long)ce); 15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org primaryDone = TRUE; 15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (p1 <= 2 || p1 >= 0xF0) { 15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Primary first bytes F0..FF are specials. */ 15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Primary first byte of %08lX out of range\n", (long)ce); 15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (p2 == 0) { 15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org primaryDone = TRUE; 15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (p2 <= 3 || p2 >= 0xFF) { 15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Primary second bytes 03 and FF are sort key compression terminators. */ 15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Primary second byte of %08lX out of range\n", (long)ce); 15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org primaryDone = FALSE; 16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (secondary == 0) { 16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (primary != 0) { 16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Primary!=0 secondary==0 in %08lX\n", (long)ce); 16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org secondaryDone = TRUE; 16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (secondary <= 2 || 16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (UCOL_BYTE_COMMON < secondary && secondary <= (UCOL_BYTE_COMMON + 0x80)) 16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Secondary first bytes common+1..+0x80 are used for sort key compression. */ 16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Secondary byte of %08lX out of range\n", (long)ce); 16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org secondaryDone = FALSE; 16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tertiary == 0) { 16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* We know that ce != 0. */ 16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Primary!=0 or secondary!=0 but tertiary==0 in %08lX\n", (long)ce); 16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tertiary <= 2) { 16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Tertiary byte of %08lX out of range\n", (long)ce); 16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tertiaryDone = FALSE; 16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((ce & UCOL_REMOVE_CONTINUATION) == 0) { 16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Empty continuation %08lX\n", (long)ce); 16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (primaryDone && primary != 0) { 16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Primary was done but continues in %08lX\n", (long)ce); 16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (p1 == 0) { 16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (p2 != 0) { 16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Primary 00 xx in %08lX\n", (long)ce); 16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org primaryDone = TRUE; 16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (p1 <= 2) { 16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Primary first byte of %08lX out of range\n", (long)ce); 16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (p2 == 0) { 16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org primaryDone = TRUE; 16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (p2 <= 3) { 16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Primary second byte of %08lX out of range\n", (long)ce); 16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (secondaryDone && secondary != 0) { 16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Secondary was done but continues in %08lX\n", (long)ce); 16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (secondary == 0) { 16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org secondaryDone = TRUE; 16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (secondary <= 2) { 16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Secondary byte of %08lX out of range\n", (long)ce); 16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tertiaryDone && tertiary != 0) { 16706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Tertiary was done but continues in %08lX\n", (long)ce); 16716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 16726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tertiary == 0) { 16746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tertiaryDone = TRUE; 16756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (tertiary <= 2) { 16766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Tertiary byte of %08lX out of range\n", (long)ce); 16776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 16786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!result) { 16826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char codepointText[5*MAX_CODEPOINTS_TO_SHOW + 5]; 16836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org showCodepoints(codepoints, length, codepointText); 16846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Locale: %s Code point string: %s\n", collLocale, codepointText); 16856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 16876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 16886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 16896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar IMPORT[] = { 0x5B, 0x69, 0x6D, 0x70, 0x6F, 0x72, 0x74, 0 }; /* "[import" */ 16916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCEValidity() 16936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 16946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* testing UCA collation elements */ 16956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 16966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* en_US has no tailorings */ 16976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *coll = ucol_open("root", &status); 16986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* tailored locales */ 16996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char locale[][11] = {"fr_FR", "ko_KR", "sh_YU", "th_TH", "zh_CN", "zh__PINYIN"}; 17006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *loc; 17016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FileStream *file = NULL; 17026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char line[2048]; 17036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar codepoints[11]; 17046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 17056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int maxCount = 0; 17066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar contextCPs[3]; 17076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c; 17086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError parseError; 17096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 17106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "en_US collator creation failed -> %s\n", u_errorName(status)); 17116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 17126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing UCA elements\n"); 17146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org file = getFractionalUCA(); 17156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (file == NULL) { 17166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Fractional UCA data can not be opened\n"); 17176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 17186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (T_FileStream_readLine(file, line, sizeof(line)) != NULL) { 17216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(line[0] == 0 || line[0] == '#' || line[0] == '\n' || 17226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org line[0] == 0x000D || line[0] == '[') { 17236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 17246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org getCodePoints(line, codepoints, contextCPs); 17276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkCEValidity(coll, codepoints, u_strlen(codepoints)); 17286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing UCA elements for the whole range of unicode characters\n"); 17316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (c = 0; c <= 0xffff; ++c) { 17326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (u_isdefined(c)) { 17336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoints[0] = (UChar)c; 17346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkCEValidity(coll, codepoints, 1); 17356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (; c <= 0x10ffff; ++c) { 17386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (u_isdefined(c)) { 17396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i = 0; 17406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_APPEND_UNSAFE(codepoints, i, c); 17416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkCEValidity(coll, codepoints, i); 17426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 17466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* testing tailored collation elements */ 17486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing tailored elements\n"); 17496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(getTestOption(QUICK_OPTION)) { 17506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org maxCount = sizeof(locale)/sizeof(locale[0]); 17516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 17526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org maxCount = uloc_countAvailable(); 17536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (count < maxCount) { 17556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *rules = NULL, 17566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *current = NULL; 17576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *rulesCopy = NULL; 17586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t ruleLen = 0; 17596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t chOffset = 0; 17616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t chLen = 0; 17626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t exOffset = 0; 17636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t exLen = 0; 17646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t prefixOffset = 0; 17656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t prefixLen = 0; 17666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool startOfRules = TRUE; 17676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColOptionSet opts; 17686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColTokenParser src; 17706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t strength = 0; 17716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t specs = 0; 17726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)specs; /* Suppress set but not used warnings. */ 17746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)strength; 17756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)prefixLen; 17766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)prefixOffset; 17776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)exLen; 17786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)exOffset; 17796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(getTestOption(QUICK_OPTION)) { 17816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org loc = locale[count]; 17826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 17836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org loc = uloc_getAvailable(count); 17846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!hasCollationElements(loc)) { 17856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count++; 17866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 17876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; // clear status from previous loop iteration 17906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memset(&src, 0, sizeof(UColTokenParser)); 17926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing CEs for %s\n", loc); 17946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll = ucol_open(loc, &status); 17966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 17976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("%s collator creation failed with status %s\n", loc, u_errorName(status)); 17986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 17996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.opts = &opts; 18026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rules = ucol_getRules(coll, &ruleLen); 18036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 18056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * We have not set up the UColTokenParser with a callback function 18066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to fetch [import] sub-rules, 18076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * so skip testing tailorings that import others. 18086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * TODO: Ticket #8047: Change TestCEValidity to use ucol_getTailoredSet() 18096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * rather than the internal collation rule parser 18106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 18116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ruleLen > 0 && u_strstr(rules, IMPORT) == NULL) { 18126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rulesCopy = (UChar *)uprv_malloc((ruleLen + 18136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCOL_TOK_EXTRA_RULE_SPACE_SIZE) * sizeof(UChar)); 18146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcpy(rulesCopy, rules, ruleLen * sizeof(UChar)); 18156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.current = src.source = rulesCopy; 18166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.end = rulesCopy + ruleLen; 18176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.extraCurrent = src.end; 18186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.extraEnd = src.end + UCOL_TOK_EXTRA_RULE_SPACE_SIZE; 18196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to 18216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */ 18226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((current = ucol_tok_parseNextToken(&src, startOfRules, &parseError,&status)) != NULL && U_SUCCESS(status)) { 18236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strength = src.parsedToken.strength; 18246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chOffset = src.parsedToken.charsOffset; 18256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chLen = src.parsedToken.charsLen; 18266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org exOffset = src.parsedToken.extensionOffset; 18276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org exLen = src.parsedToken.extensionLen; 18286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org prefixOffset = src.parsedToken.prefixOffset; 18296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org prefixLen = src.parsedToken.prefixLen; 18306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org specs = src.parsedToken.flags; 18316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startOfRules = FALSE; 18336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcpy(codepoints, src.source + chOffset, 18346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chLen * sizeof(UChar)); 18356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoints[chLen] = 0; 18366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkCEValidity(coll, codepoints, chLen); 18376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 18396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("%s collator, ucol_tok_parseNextToken failed with status %s\n", loc, u_errorName(status)); 18406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(src.source); 18426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(src.reorderCodes); 18436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 18466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 18476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org T_FileStream_close(file); 18496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 18506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void printSortKeyError(const UChar *codepoints, int length, 18526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t *sortkey, int sklen) 18536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 18546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 18556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Sortkey not valid for "); 18566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (length > 0) { 18576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("0x%04x ", *codepoints); 18586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length --; 18596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoints ++; 18606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nSortkey : "); 18626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (count < sklen) { 18636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("0x%02x ", sortkey[count]); 18646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 18656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\n"); 18676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 18686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 18706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Checking sort key validity for all levels 18716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 18726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool checkSortKeyValidity(UCollator *coll, 18736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *codepoints, 18746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int length) 18756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 18766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 18776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationStrength strength[5] = {UCOL_PRIMARY, UCOL_SECONDARY, 18786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCOL_TERTIARY, UCOL_QUATERNARY, 18796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCOL_IDENTICAL}; 18806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int strengthlen = 5; 18816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int strengthIndex = 0; 18826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int caselevel = 0; 18836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (caselevel < 1) { 18856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (caselevel == 0) { 18866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_OFF, &status); 18876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 18896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_ON, &status); 18906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (strengthIndex < strengthlen) { 18936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count01 = 0; 18946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t count = 0; 18956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t sortkey[128]; 18966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t sklen; 18976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setStrength(coll, strength[strengthIndex]); 18996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sklen = ucol_getSortKey(coll, codepoints, length, sortkey, 128); 19006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (sortkey[count] != 0) { 19016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (sortkey[count] == 2 || (sortkey[count] == 3 && count01 > 0 && strengthIndex != 4)) { 19026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printSortKeyError(codepoints, length, sortkey, sklen); 19036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 19046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (sortkey[count] == 1) { 19066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count01 ++; 19076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 19096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (count + 1 != sklen || (count01 != strengthIndex + caselevel)) { 19126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printSortKeyError(codepoints, length, sortkey, sklen); 19136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 19146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strengthIndex ++; 19166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org caselevel ++; 19186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 19206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 19216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestSortKeyValidity(void) 19236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 19246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* testing UCA collation elements */ 19256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 19266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* en_US has no tailorings */ 19276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *coll = ucol_open("en_US", &status); 19286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* tailored locales */ 19296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char locale[][6] = {"fr_FR", "ko_KR", "sh_YU", "th_TH", "zh_CN"}; 19306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FileStream *file = NULL; 19316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char line[2048]; 19326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar codepoints[10]; 19336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 19346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar contextCPs[5]; 19356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError parseError; 19366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 19376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err_status(status, "en_US collator creation failed -> %s\n", u_errorName(status)); 19386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 19396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing UCA elements\n"); 19416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org file = getFractionalUCA(); 19426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (file == NULL) { 19436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Fractional UCA data can not be opened\n"); 19446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 19456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (T_FileStream_readLine(file, line, sizeof(line)) != NULL) { 19486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(line[0] == 0 || line[0] == '#' || line[0] == '\n' || 19496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org line[0] == 0x000D || line[0] == '[') { 19506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 19516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org getCodePoints(line, codepoints, contextCPs); 19546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(codepoints[0] == 0xFFFE) { 19556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Skip special merge-sort character U+FFFE which has otherwise illegal 02 weight bytes. */ 19566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 19576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkSortKeyValidity(coll, codepoints, u_strlen(codepoints)); 19596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing UCA elements for the whole range of unicode characters\n"); 19626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoints[0] = 0; 19636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (codepoints[0] < 0xFFFF) { 19656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (u_isdefined((UChar32)codepoints[0])) { 19666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkSortKeyValidity(coll, codepoints, 1); 19676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoints[0] ++; 19696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 19726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* testing tailored collation elements */ 19746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing tailored elements\n"); 19756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (count < 5) { 19766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *rules = NULL, 19776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *current = NULL; 19786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *rulesCopy = NULL; 19796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t ruleLen = 0; 19806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t chOffset = 0; 19826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t chLen = 0; 19836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t exOffset = 0; 19846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t exLen = 0; 19856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t prefixOffset = 0; 19866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t prefixLen = 0; 19876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool startOfRules = TRUE; 19886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColOptionSet opts; 19896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColTokenParser src; 19916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t strength = 0; 19926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t specs = 0; 19936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; // clear status from previous loop iteration 19946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)specs; 19966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)strength; 19976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)prefixLen; 19986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)prefixOffset; 19996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)exLen; 20006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)exOffset; 20016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memset(&src, 0, sizeof(UColTokenParser)); 20036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll = ucol_open(locale[count], &status); 20056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 20066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("%s collator creation failed with status %s\n", locale[count], u_errorName(status)); 20076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 20086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.opts = &opts; 20116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rules = ucol_getRules(coll, &ruleLen); 20126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 20146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * We have not set up the UColTokenParser with a callback function 20156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to fetch [import] sub-rules, 20166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * so skip testing tailorings that import others. 20176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * TODO: Ticket #8047: Change TestSortKeyValidity to use ucol_getTailoredSet() 20186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * rather than the internal collation rule parser 20196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 20206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ruleLen > 0 && u_strstr(rules, IMPORT) == NULL) { 20216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rulesCopy = (UChar *)uprv_malloc((ruleLen + 20226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCOL_TOK_EXTRA_RULE_SPACE_SIZE) * sizeof(UChar)); 20236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcpy(rulesCopy, rules, ruleLen * sizeof(UChar)); 20246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.current = src.source = rulesCopy; 20256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.end = rulesCopy + ruleLen; 20266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.extraCurrent = src.end; 20276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.extraEnd = src.end + UCOL_TOK_EXTRA_RULE_SPACE_SIZE; 20286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to 20306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */ 20316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((current = ucol_tok_parseNextToken(&src, startOfRules,&parseError, &status)) != NULL && U_SUCCESS(status)) { 20326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strength = src.parsedToken.strength; 20336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chOffset = src.parsedToken.charsOffset; 20346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chLen = src.parsedToken.charsLen; 20356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org exOffset = src.parsedToken.extensionOffset; 20366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org exLen = src.parsedToken.extensionLen; 20376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org prefixOffset = src.parsedToken.prefixOffset; 20386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org prefixLen = src.parsedToken.prefixLen; 20396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org specs = src.parsedToken.flags; 20406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startOfRules = FALSE; 20426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcpy(codepoints, src.source + chOffset, 20436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chLen * sizeof(UChar)); 20446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoints[chLen] = 0; 20456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(codepoints[0] == 0xFFFE) { 20466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Skip special merge-sort character U+FFFE which has otherwise illegal 02 weight bytes. */ 20476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 20486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkSortKeyValidity(coll, codepoints, chLen); 20506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 20526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("%s collator, ucol_tok_parseNextToken failed with status %s\n", locale[count], u_errorName(status)); 20536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(src.source); 20556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(src.reorderCodes); 20566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(coll); 20596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 20606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org T_FileStream_close(file); 20626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 20636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 20656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* TestSearchCollatorElements tests iterator behavior (forwards and backwards) with 20666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* normalization on AND jamo tailoring, among other things. 20676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 20686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar tsceText[] = { /* Nothing in here should be ignorable */ 20696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0xAC00, /* simple LV Hangul */ 20706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0xAC01, /* simple LVT Hangul */ 20716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0xAC0F, /* LVTT, last jamo expands for search */ 20726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0xAFFF, /* LLVVVTT, every jamo expands for search */ 20736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0x1100, 0x1161, 0x11A8, /* 0xAC01 as conjoining jamo */ 20746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0x3131, 0x314F, 0x3131, /* 0xAC01 as compatibility jamo */ 20756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0x1100, 0x1161, 0x11B6, /* 0xAC0F as conjoining jamo; last expands for search */ 20766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0x1101, 0x1170, 0x11B6, /* 0xAFFF as conjoining jamo; all expand for search */ 20776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0x00E6, /* small letter ae, expands */ 20786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0x1E4D, /* small letter o with tilde and acute, decomposes */ 20796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020 20806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 20816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum { kLen_tsceText = sizeof(tsceText)/sizeof(tsceText[0]) }; 20826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t rootStandardOffsets[] = { 20846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 1,2, 20856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, 3,4,4, 20866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4, 5,6,6, 20876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6, 7,8,8, 20886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8, 9,10,11, 20896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12, 13,14,15, 20906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16, 17,18,19, 20916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20, 21,22,23, 20926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 24, 25,26,26,26, 20936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 26, 27,28,28, 20946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28, 20956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29 20966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 20976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum { kLen_rootStandardOffsets = sizeof(rootStandardOffsets)/sizeof(rootStandardOffsets[0]) }; 20986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t rootSearchOffsets[] = { 21006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 1,2, 21016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, 3,4,4, 21026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4, 5,6,6,6, 21036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6, 7,8,8,8,8,8,8, 21046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8, 9,10,11, 21056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12, 13,14,15, 21066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16, 17,18,19,20, 21076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20, 21,22,22,23,23,23,24, 21086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 24, 25,26,26,26, 21096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 26, 27,28,28, 21106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28, 21116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29 21126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 21136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum { kLen_rootSearchOffsets = sizeof(rootSearchOffsets)/sizeof(rootSearchOffsets[0]) }; 21146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct { 21166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char * locale; 21176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t * offsets; 21186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offsetsLen; 21196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} TSCEItem; 21206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const TSCEItem tsceItems[] = { 21226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "root", rootStandardOffsets, kLen_rootStandardOffsets }, 21236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "root@collation=search", rootSearchOffsets, kLen_rootSearchOffsets }, 21246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { NULL, NULL, 0 } 21256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 21266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestSearchCollatorElements(void) 21286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 21296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const TSCEItem * tsceItemPtr; 21306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (tsceItemPtr = tsceItems; tsceItemPtr->locale != NULL; tsceItemPtr++) { 21316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 21326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator* ucol = ucol_open(tsceItemPtr->locale, &status); 21336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( U_SUCCESS(status) ) { 21346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements * uce = ucol_openElements(ucol, tsceText, kLen_tsceText, &status); 21356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( U_SUCCESS(status) ) { 21366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset, element; 21376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t * nextOffsetPtr; 21386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t * limitOffsetPtr; 21396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nextOffsetPtr = tsceItemPtr->offsets; 21416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org limitOffsetPtr = tsceItemPtr->offsets + tsceItemPtr->offsetsLen; 21426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org do { 21436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset = ucol_getOffset(uce); 21446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org element = ucol_next(uce, &status); 21456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( element == 0 ) { 21466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("error, locale %s, ucol_next returned element 0\n", tsceItemPtr->locale ); 21476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( nextOffsetPtr < limitOffsetPtr ) { 21496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (offset != *nextOffsetPtr) { 21506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("error, locale %s, expected ucol_next -> ucol_getOffset %d, got %d\n", 21516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tsceItemPtr->locale, *nextOffsetPtr, offset ); 21526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nextOffsetPtr = limitOffsetPtr; 21536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 21546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nextOffsetPtr++; 21566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 21576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("error, locale %s, ucol_next returned more elements than expected\n", tsceItemPtr->locale ); 21586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } while ( U_SUCCESS(status) && element != UCOL_NULLORDER ); 21606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( nextOffsetPtr < limitOffsetPtr ) { 21616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("error, locale %s, ucol_next returned fewer elements than expected\n", tsceItemPtr->locale ); 21626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setOffset(uce, kLen_tsceText, &status); 21656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 21666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nextOffsetPtr = tsceItemPtr->offsets + tsceItemPtr->offsetsLen; 21676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org limitOffsetPtr = tsceItemPtr->offsets; 21686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org do { 21696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset = ucol_getOffset(uce); 21706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org element = ucol_previous(uce, &status); 21716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( element == 0 ) { 21726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("error, locale %s, ucol_previous returned element 0\n", tsceItemPtr->locale ); 21736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( nextOffsetPtr > limitOffsetPtr ) { 21756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nextOffsetPtr--; 21766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (offset != *nextOffsetPtr) { 21776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("error, locale %s, expected ucol_previous -> ucol_getOffset %d, got %d\n", 21786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tsceItemPtr->locale, *nextOffsetPtr, offset ); 21796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nextOffsetPtr = limitOffsetPtr; 21806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 21816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 21836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("error, locale %s, ucol_previous returned more elements than expected\n", tsceItemPtr->locale ); 21846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } while ( U_SUCCESS(status) && element != UCOL_NULLORDER ); 21866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( nextOffsetPtr > limitOffsetPtr ) { 21876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("error, locale %s, ucol_previous returned fewer elements than expected\n", tsceItemPtr->locale ); 21886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(uce); 21916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 21926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("error, locale %s, ucol_openElements failed: %s\n", tsceItemPtr->locale, u_errorName(status) ); 21936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(ucol); 21956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 21966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_data_err("error, locale %s, ucol_open failed: %s\n", tsceItemPtr->locale, u_errorName(status) ); 21976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 22006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_COLLATION */ 2202