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