16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************** 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT: 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (C) 2001-2011 IBM, Inc. All Rights Reserved. 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/ 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************************** 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File dumpce.cpp 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History: 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Name Date Description 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* synwee May 31 2001 Creation 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************* 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* This program outputs the collation elements used for a requested tailoring. 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Usage: 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* dumpce options... please check main function. 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/utypes.h> 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/ucol.h> 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/uloc.h> 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/ucoleitr.h> 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/uchar.h> 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/uscript.h> 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/utf16.h> 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/putil.h> 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/ustring.h> 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h> 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h> 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h> 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <time.h> 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucol_tok.h" 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uoptions.h" 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucol_imp.h" 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/ures.h> 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/uniset.h> 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/usetiter.h> 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Command line option variables. 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* These global variables are set according to the options specified on the 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* command line by the user. 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UOption options[]={ 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 00 */ UOPTION_HELP_H, 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 01 */ UOPTION_HELP_QUESTION_MARK, 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 02 */ {"locale", NULL, NULL, NULL, 'l', UOPT_REQUIRES_ARG, 0}, 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 03 */ {"serialize", NULL, NULL, NULL, 'z', UOPT_NO_ARG, 0}, 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 04 */ UOPTION_DESTDIR, 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 05 */ UOPTION_SOURCEDIR, 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 06 */ {"attribute", NULL, NULL, NULL, 'a', UOPT_REQUIRES_ARG, 0}, 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 07 */ {"rule", NULL, NULL, NULL, 'r', UOPT_REQUIRES_ARG, 0}, 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 08 */ {"normalization", NULL, NULL, NULL, 'n', UOPT_REQUIRES_ARG, 0}, 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 09 */ {"scripts", NULL, NULL, NULL, 't', UOPT_NO_ARG, 0}, 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 10 */ {"reducehan", NULL, NULL, NULL, 'e', UOPT_NO_ARG, 0}, 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 11 */ UOPTION_VERBOSE, 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 12 */ {"wholescripts", NULL, NULL, NULL, 'W', UOPT_NO_ARG, 0} 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Collator used in this program 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UCollator *COLLATOR_; 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Output strea, used in this program 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic FILE *OUTPUT_; 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UColAttributeValue ATTRIBUTE_[UCOL_ATTRIBUTE_COUNT] = { 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCOL_DEFAULT, UCOL_DEFAULT, UCOL_DEFAULT, UCOL_DEFAULT, UCOL_DEFAULT, 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCOL_DEFAULT, UCOL_DEFAULT, UCOL_DEFAULT, 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct { 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int value; 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *name; 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} EnumNameValuePair; 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const EnumNameValuePair ATTRIBUTE_NAME_[] = { 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_FRENCH_COLLATION, "UCOL_FRENCH_COLLATION"}, 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_ALTERNATE_HANDLING, "UCOL_ALTERNATE_HANDLING"}, 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_CASE_FIRST, "UCOL_CASE_FIRST"}, 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_CASE_LEVEL, "UCOL_CASE_LEVEL"}, 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_NORMALIZATION_MODE, 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "UCOL_NORMALIZATION_MODE|UCOL_DECOMPOSITION_MODE"}, 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_STRENGTH, "UCOL_STRENGTH"}, 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_HIRAGANA_QUATERNARY_MODE, "UCOL_HIRAGANA_QUATERNARY_MODE"}, 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_NUMERIC_COLLATION, "UCOL_NUMERIC_COLLATION"}, 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NULL 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const EnumNameValuePair ATTRIBUTE_VALUE_[] = { 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_PRIMARY, "UCOL_PRIMARY"}, 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_SECONDARY, "UCOL_SECONDARY"}, 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_TERTIARY, "UCOL_TERTIARY|UCOL_DEFAULT_STRENGTH"}, 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_QUATERNARY, "UCOL_QUATERNARY"}, 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_IDENTICAL, "UCOL_IDENTICAL"}, 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_OFF, "UCOL_OFF"}, 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_ON, "UCOL_ON"}, 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_SHIFTED, "UCOL_SHIFTED"}, 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_NON_IGNORABLE, "UCOL_NON_IGNORABLE"}, 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_LOWER_FIRST, "UCOL_LOWER_FIRST"}, 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {UCOL_UPPER_FIRST, "UCOL_UPPER_FIRST"}, 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NULL 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct { 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar ch[32]; 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count; // number of codepoint 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool tailored; 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} ScriptElement; 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Writes the hexadecimal of a null-terminated array of codepoints into a 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* file 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param f UFILE instance to store 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param c codepoints array 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid serialize(FILE *f, const UChar *c) 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar cp = *(c ++); 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, " %04x", cp); 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (*c != 0) { 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cp = *(c ++); 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, " %04x", cp); 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Writes the hexadecimal of a non-null-terminated array of codepoints into a 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* file 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param f UFILE instance to store 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param c codepoints array 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param l codepoints array length 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid serialize(FILE *f, const UChar *c, int l) 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 1; 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar cp = *(c ++); 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, " %04x", cp); 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (count < l) { 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cp = *(c ++); 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, " %04x", cp); 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Sets the iterator to the argument string and outputs the collation elements. 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param f file output stream 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param iter collation element iterator 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid serialize(FILE *f, UCollationElements *iter) { 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *codepoint = iter->iteratordata_.string; 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // unlikely that sortkeys will be over this size 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t sortkey[64]; 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t *psortkey = sortkey; 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int sortkeylength = 0; 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (iter->iteratordata_.flags & UCOL_ITER_HASLEN) { 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serialize(f, codepoint, iter->iteratordata_.endp - codepoint); 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sortkeylength = ucol_getSortKey(iter->iteratordata_.coll, codepoint, 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org iter->iteratordata_.endp - codepoint, sortkey, 64); 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serialize(f, codepoint); 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sortkeylength = ucol_getSortKey(iter->iteratordata_.coll, codepoint, 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org -1, sortkey, 64); 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[11].doesOccur) { 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serialize(stdout, codepoint); 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "\n"); 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, "; "); 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t ce = ucol_next(iter, &error); 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, "Error retrieving collation elements\n"); 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (TRUE) { 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, "["); 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (UCOL_PRIMARYORDER(ce) != 0) { 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, "%04x", UCOL_PRIMARYORDER(ce)); 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, ","); 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (UCOL_SECONDARYORDER(ce) != 0) { 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, " %02x", UCOL_SECONDARYORDER(ce)); 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, ","); 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (UCOL_TERTIARYORDER(ce) != 0) { 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, " %02x", UCOL_TERTIARYORDER(ce)); 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, "] "); 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ce = ucol_next(iter, &error); 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ce == UCOL_NULLORDER) { 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error retrieving collation elements"); 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (sortkeylength > 64) { 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, "Sortkey exceeds pre-allocated size"); 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, "["); 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (TRUE) { 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, "%02x", *psortkey); 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org psortkey ++; 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((*psortkey) == 0) { 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, " "); 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(f, "]\n"); 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Serializes the contraction within the given argument rule 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param f file output stream 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param r rule 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param rlen rule length 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param contractionsonly flag to indicate if only contractions are to be 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* output or all collation elements 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param iter iterator to iterate over collation elements 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid serialize(FILE *f, UChar *rule, int rlen, UBool contractiononly, 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *iter) { 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *current = NULL; 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t strength = 0; 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t chOffset = 0; 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t chLen = 0; 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t exOffset = 0; 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t exLen = 0; 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t prefixOffset = 0; 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t prefixLen = 0; 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t specs = 0; 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool rstart = TRUE; 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColTokenParser src; 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColOptionSet opts; 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError parseError; 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.opts = &opts; 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.source = rule; 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.current = rule; 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.end = rule + rlen; 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.extraCurrent = src.end; 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.extraEnd = src.end + UCOL_TOK_EXTRA_RULE_SPACE_SIZE; 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((current = ucol_tok_parseNextToken(&src, rstart, &parseError, 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &error)) != NULL) { 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chOffset = src.parsedToken.charsOffset; 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chLen = src.parsedToken.charsLen; 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // contractions handled here 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!contractiononly || chLen > 1) { 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setText(iter, rule + chOffset, chLen, &error); 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error setting text in iterator\n"); 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serialize(f, iter); 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rstart = FALSE; 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Prints the attribute values in the argument collator into the output stream 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param collator 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid outputAttribute(UCollator *collator, UErrorCode *error) 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColAttribute attribute = UCOL_FRENCH_COLLATION; 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (attribute < UCOL_ATTRIBUTE_COUNT) { 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (TRUE) { 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // getting attribute name 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ATTRIBUTE_NAME_[count].value == attribute) { 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "%s = ", ATTRIBUTE_NAME_[count].name); 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count = 0; 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int attributeval = ucol_getAttribute(collator, attribute, error); 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(*error)) { 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Failure in reading collator attribute\n"); 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (TRUE) { 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // getting attribute value 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ATTRIBUTE_VALUE_[count].value == attributeval) { 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "%s\n", ATTRIBUTE_VALUE_[count].name); 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org attribute = (UColAttribute)(attribute + 1); 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Prints the normalization mode in the argument collator into the output stream 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param collator 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid outputNormalization(UCollator *collator) 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int normmode = ucol_getAttribute(collator, UCOL_NORMALIZATION_MODE, &status); 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (TRUE) { 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // getting attribute name 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ATTRIBUTE_VALUE_[count].value == normmode) { 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "NORMALIZATION MODE = %s\n", 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ATTRIBUTE_VALUE_[count].name); 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Output the collation element belonging to the locale into a file 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param locale string 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param fullrules flag to indicate if only tailored collation elements are to 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* be output or all collation elements 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid serialize(const char *locale, UBool tailoredonly) { 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar str[128]; 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int strlen = 0; 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "# This file contains the serialized collation elements\n"); 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "# as of the collation version indicated below.\n"); 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "# Data format: xxxx xxxx..; [yyyy, yy, yy] [yyyy, yy, yy] ... [yyyy, yy, yy] [zz zz..\n"); 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "# where xxxx are codepoints in hexadecimals,\n"); 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "# yyyyyyyy are the corresponding\n"); 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "# collation elements in hexadecimals\n"); 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "# and zz are the sortkey values in hexadecimals\n"); 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "\n# Collator information\n"); 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "\nLocale: %s\n", locale); 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Locale: %s\n", locale); 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVersionInfo version; 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_getVersion(COLLATOR_, version); 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "Version number: %d.%d.%d.%d\n", 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org version[0], version[1], version[2], version[3]); 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outputAttribute(COLLATOR_, &error); 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outputNormalization(COLLATOR_); 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements *iter = ucol_openElements(COLLATOR_, str, strlen, 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &error); 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error creating iterator\n"); 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!tailoredonly) { 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "\n# Range of unicode characters\n\n"); 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 codepoint = 0; 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (codepoint <= UCHAR_MAX_VALUE) { 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (u_isdefined(codepoint)) { 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strlen = 0; 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_APPEND_CHAR_UNSAFE(str, strlen, codepoint); 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str[strlen] = 0; 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setText(iter, str, strlen, &error); 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error setting text in iterator\n"); 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serialize(OUTPUT_, iter); 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoint ++; 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar ucarules[0x10000]; 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *rules; 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t rulelength = 0; 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rules = ucarules; 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tailoredonly) { 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t rulelength = 0; 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *temp = ucol_getRules(COLLATOR_, &rulelength); 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (rulelength + UCOL_TOK_EXTRA_RULE_SPACE_SIZE > 0x10000) { 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rules = (UChar *)malloc(sizeof(UChar) * 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (rulelength + UCOL_TOK_EXTRA_RULE_SPACE_SIZE)); 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org memcpy(rules, temp, rulelength * sizeof(UChar)); 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rules[rulelength] = 0; 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "\n# Tailorings\n\n"); 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serialize(OUTPUT_, rules, rulelength, FALSE, iter); 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (rules != ucarules) { 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org free(rules); 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rulelength = ucol_getRulesEx(COLLATOR_, UCOL_FULL_RULES, ucarules, 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x10000); 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (rulelength + UCOL_TOK_EXTRA_RULE_SPACE_SIZE > 0x10000) { 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rules = (UChar *)malloc(sizeof(UChar) * 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (rulelength + UCOL_TOK_EXTRA_RULE_SPACE_SIZE)); 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rulelength = ucol_getRulesEx(COLLATOR_, UCOL_FULL_RULES, rules, 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rulelength); 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "\n# Contractions\n\n"); 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serialize(OUTPUT_, rules, rulelength, TRUE, iter); 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (rules != ucarules) { 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org free(rules); 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_closeElements(iter); 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Sets the collator with the attribute values 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param collator 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param error status 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid setAttributes(UCollator *collator, UErrorCode *error) 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (count < UCOL_ATTRIBUTE_COUNT) { 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ATTRIBUTE_[count] != UCOL_DEFAULT) { 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setAttribute(collator, (UColAttribute)count, 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ATTRIBUTE_[count], error); 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(*error)) { 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Appends directory path with an ending seperator if necessary. 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param path with enough space to append one seperator 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @return new directory path length 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint appendDirSeparator(char *dir) 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int dirlength = strlen(dir); 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char dirending = dir[dirlength - 1]; 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (dirending != U_FILE_SEP_CHAR) { 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir[dirlength] = U_FILE_SEP_CHAR; 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir[dirlength + 1] = 0; 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return dirlength + 1; 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return dirlength; 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Output the collation element into a file 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid serialize() { 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char filename[128]; 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int dirlength = 0; 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[4].doesOccur) { 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(filename, options[4].value); 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dirlength = appendDirSeparator(filename); 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[2].doesOccur) { 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *locale = (char *)options[2].value; 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t localeindex = 0; 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (strcmp(locale, "all") == 0) { 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[4].doesOccur) { 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(filename, "UCA.txt"); 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OUTPUT_ = fopen(filename, "w"); 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (OUTPUT_ == NULL) { 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Cannot open file:%s\n", filename); 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "UCA\n"); 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org COLLATOR_ = ucol_open("en_US", &error); 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Collator creation failed:"); 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, u_errorName(error)); 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto CLOSEUCA; 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setAttributes(COLLATOR_, &error); 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Collator attribute setting failed:"); 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, u_errorName(error)); 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto CLOSEUCA; 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serialize("UCA", FALSE); 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCLOSEUCA : 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[4].doesOccur) { 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org filename[dirlength] = 0; 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(OUTPUT_); 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(COLLATOR_); 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org localeindex = ucol_countAvailable() - 1; 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Number of locales: %d\n", localeindex + 1); 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org locale = ucol_getAvailable(localeindex); 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (TRUE) { 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org COLLATOR_ = ucol_open(locale, &error); 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Collator creation failed:"); 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, u_errorName(error)); 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto CLOSETAILOR; 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setAttributes(COLLATOR_, &error); 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Collator attribute setting failed:"); 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, u_errorName(error)); 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto CLOSETAILOR; 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[4].doesOccur) { 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(filename, locale); 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(filename, ".txt"); 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OUTPUT_ = fopen(filename, "w"); 5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (OUTPUT_ == NULL) { 5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Cannot open file:%s\n", filename); 5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[3].doesOccur) { 5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serialize(locale, TRUE); 5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(COLLATOR_); 5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCLOSETAILOR : 5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[4].doesOccur) { 5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org filename[dirlength] = 0; 5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(OUTPUT_); 5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org localeindex --; 5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (localeindex < 0) { 5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org locale = ucol_getAvailable(localeindex); 5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[7].doesOccur) { 5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char inputfilename[128] = ""; 5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // rules are to be used 5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[5].doesOccur) { 5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(inputfilename, options[5].value); 5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendDirSeparator(inputfilename); 5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(inputfilename, options[7].value); 5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FILE *input = fopen(inputfilename, "r"); 5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (input == NULL) { 5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Cannot open file:%s\n", filename); 5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char s[1024]; 5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar rule[1024]; 5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *prule = rule; 5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int size = 1024; 5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // synwee TODO: make this part dynamic 5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (fscanf(input, "%[^\n]s", s) != EOF) { 5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org size -= u_unescape(s, prule, size); 5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org prule = prule + u_strlen(prule); 5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(input); 5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[4].doesOccur) { 6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(filename, "Rules.txt"); 6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OUTPUT_ = fopen(filename, "w"); 6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (OUTPUT_ == NULL) { 6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Cannot open file:%s\n", filename); 6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Rules\n"); 6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError parseError; 6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org COLLATOR_ = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT, 6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCOL_DEFAULT_STRENGTH, &parseError, &error); 6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Collator creation failed:"); 6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, u_errorName(error)); 6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto CLOSERULES; 6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setAttributes(COLLATOR_, &error); 6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Collator attribute setting failed:"); 6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, u_errorName(error)); 6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto CLOSERULES; 6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serialize("Rule-based", TRUE); 6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(COLLATOR_); 6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCLOSERULES : 6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[4].doesOccur) { 6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org filename[dirlength] = 0; 6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(OUTPUT_); 6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Parse for enum values. 6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Note this only works for positive enum values. 6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param enumarray array containing names of the enum values in string and 6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* their corresponding value. 6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* declared enum value. 6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param str string to be parsed 6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @return corresponding integer enum value or -1 if value is not found. 6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint parseEnums(const EnumNameValuePair enumarray[], const char *str) 6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *enumname = enumarray[0].name; 6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int result = atoi(str); 6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result == 0 && str[0] != '0') { 6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (strcmp(enumname, str) != 0) { 6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // checking for multiple enum names sharing the same values 6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org enumname = strstr(enumname, str); 6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (enumname != NULL) { 6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int size = strchr(enumname, '|') - enumname; 6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (size < 0) { 6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org size = strlen(enumname); 6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (size == (int)strlen(str)) { 6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return enumarray[result].value; 6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result ++; 6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (&(enumarray[result]) == NULL) { 6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org enumname = enumarray[result].name; 6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Parser for attribute name value pair 6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid parseAttributes() { 6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char str[32]; 6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *pname = options[6].value; 6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *pend = options[6].value + strlen(options[6].value); 6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *pvalue; 6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (pname < pend) { 6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pvalue = strchr(pname, '='); 6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (pvalue == NULL) { 6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, 6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "No matching value found for attribute argument %s\n", 6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pname); 6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = pvalue - pname; 6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strncpy(str, pname, count); 6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str[count] = 0; 6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int name = parseEnums(ATTRIBUTE_NAME_, str); 6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (name == -1) { 6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Attribute name not found: %s\n", str); 6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pvalue ++; 7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // getting corresponding enum value 7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pname = strchr(pvalue, ','); 7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (pname == NULL) { 7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pname = pend; 7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count = pname - pvalue; 7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strncpy(str, pvalue, count); 7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str[count] = 0; 7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int value = parseEnums(ATTRIBUTE_VALUE_, str); 7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (value == -1) { 7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Attribute value not found: %s\n", str); 7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ATTRIBUTE_[name] = (UColAttributeValue)value; 7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pname ++; 7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Checks if the locale argument is a base language 7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param locale to be checked 7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @return TRUE if it is a base language 7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool checkLocaleForLanguage(const char *locale) 7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return strlen(locale) <= 2; 7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Converts a UChar array into its string form "xxxx xxxx" 7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param ch array of UChar characters 7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param count number of UChar characters 7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid outputUChar(UChar ch[], int count) 7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < count; i ++) { 7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "%04X ", ch[i]); 7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* If it is a primary difference returns -1 or 1. 7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* If it is a secondary difference returns -2 or 2. 7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* If it is a tertiary difference returns -3 or 3. 7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* If equals returns 0. 7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint compareSortKey(const void *elem1, const void *elem2) 7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // compare the 2 script element sort key 7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *ch1 = ((ScriptElement *)elem1)->ch; 7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *ch2 = ((ScriptElement *)elem2)->ch; 7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int size1 = ((ScriptElement *)elem1)->count; 7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int size2 = ((ScriptElement *)elem2)->count; 7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setStrength(COLLATOR_, UCOL_PRIMARY); 7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int result = ucol_strcoll(COLLATOR_, ch1, size1, ch2, size2); 7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result == 0) { 7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setStrength(COLLATOR_, UCOL_SECONDARY); 7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = ucol_strcoll(COLLATOR_, ch1, size1, ch2, size2); 7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result == 0) { 7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setStrength(COLLATOR_, UCOL_TERTIARY); 7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = ucol_strcoll(COLLATOR_, ch1, size1, ch2, size2); 7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result < 0) { 7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -3; 7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result > 0) { 7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 3; 7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result < 0) { 7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -2; 7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result > 0) { 7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 2; 7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Output serialized script elements 7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param element the element to output 7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param compare the comparison with the previous element 7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param expansion flags TRUE if element has an expansion 7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid outputScriptElem(ScriptElement &element, int compare, UBool expansion) 7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (compare) { 7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0: 7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (expansion) { 7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><td class='eq' title='["); 7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><td class='q' title='["); 7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case -1: 8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (expansion) { 8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><td class='ep' title='["); 8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><td class='p' title='["); 8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case -2: 8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (expansion) { 8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><td class='es' title='["); 8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><td class='s' title='["); 8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (expansion) { 8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><td class='et' title='["); 8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><td class='t' title='["); 8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t sortkey[32]; 8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setStrength(COLLATOR_, UCOL_TERTIARY); 8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_getSortKey(COLLATOR_, element.ch, element.count, sortkey, 32); 8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i = 0; 8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (sortkey[i] != 0) { 8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (sortkey[i] == 1) { 8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, " | "); 8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "%02x", sortkey[i]); 8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i ++; 8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "]'>"); 8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char utf8[64]; 8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar nfc[32]; 8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length = unorm_normalize(element.ch, element.count, UNORM_NFC, 0, nfc, 8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32, &error); 8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error normalizing contractions to NFC\n"); 8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_strToUTF8(utf8, 64, &length, nfc, length, &error); 8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error converting UChar to utf8\n"); 8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "%s<br>", utf8); 8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tt>"); 8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outputUChar(element.ch, element.count); 8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (compare == 0) { 8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "</tt></td><td> </td><td> </td><td> </td><td>Q</td><td>"); 8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else if (compare == -1) { 8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "</tt></td><td>P</td><td> </td><td> </td><td> </td><td>"); 8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else if (compare == -2) { 8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "</tt></td><td> </td><td>S</td><td> </td><td> </td><td>"); 8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else if (compare == -3) { 8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "</tt></td><td> </td><td> </td><td>T</td><td> </td><td>"); 8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i = 0; 8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (i < element.count) { 8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char str[128]; 8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 codepoint; 8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_NEXT(element.ch, i, element.count, codepoint); 8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t temp = u_charName(codepoint, U_UNICODE_CHAR_NAME, str, 128, 8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &error); 8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error getting character name\n"); 8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (element.tailored) { 8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<b>"); 8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "%s", str); 8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (element.tailored) { 8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, " *</b>"); 8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (i < element.count) { 8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<br>\n"); 8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "</td></tr>\n"); 8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Checks if codepoint belongs to scripts 9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param script list 9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param scriptcount number of scripts 9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param codepoint to test 9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @return TRUE if codepoint belongs to scripts 9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool checkInScripts(UScriptCode script[], int scriptcount, 9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 codepoint) 9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < scriptcount; i ++) { 9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (script[i] == USCRIPT_HAN && options[10].doesOccur) { 9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((codepoint >= 0x2E80 && codepoint <= 0x2EE4) || 9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (codepoint >= 0x2A672 && codepoint <= 0x2A6D6)) { 9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // reduce han 9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else if (uscript_getScript(codepoint, &error) == script[i]) { 9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error checking character in scripts\n"); 9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Checks if the set of codepoints belongs to the script 9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param script list 9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param scriptcount number of scripts 9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param scriptelem 9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @return TRUE if all codepoints belongs to the script 9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool checkInScripts(UScriptCode script[], int scriptcount, 9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ScriptElement scriptelem) 9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i = 0; 9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (i < scriptelem.count) { 9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 codepoint; 9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_NEXT(scriptelem.ch, i, scriptelem.count, codepoint); 9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (checkInScripts(script, scriptcount, codepoint)) { 9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Gets the script elements and contractions belonging to the script 9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param elems output list 9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param locale locale 9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @return number of script elements 9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Add by Richard 9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint getScriptElementsFromExemplars(ScriptElement scriptelem[], const char* locale) { 9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 codepoint = 0; 9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle* ures = ures_open(NULL, locale, &error); 9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Can not find resource bundle for locale: %s\n", locale); 9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar* exemplarChars = ures_getStringByKey(ures, "ExemplarCharacters", &length, &error); 9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Can not find ExemplarCharacters in resource bundle\n"); 9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar* upperChars = new UChar[length * 2]; 9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (upperChars == 0) { 9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Memory error\n"); 9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t destLength = u_strToUpper(upperChars, length * 2, exemplarChars, -1, locale, &error); 9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error when u_strToUpper() \n"); 9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar* pattern = new UChar[length + destLength + 10]; 9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar left[2] = {0x005b, 0x0}; 9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar right[2] = {0x005d, 0x0}; 9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pattern = u_strcpy(pattern, left); 9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pattern = u_strcat(pattern, exemplarChars); 9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pattern = u_strcat(pattern, upperChars); 9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pattern = u_strcat(pattern, right); 9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet * uniset = new UnicodeSet(UnicodeString(pattern), error); 9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Can not open USet \n"); 9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSetIterator* usetiter = new UnicodeSetIterator(*uniset); 10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t count = 0; 10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (usetiter -> next()) { 10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (usetiter -> isString()) { 10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString strItem = usetiter -> getString(); 10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptelem[count].count = 0; 10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < strItem.length(); i++) { 10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoint = strItem.char32At(i); 10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_APPEND_CHAR_UNSAFE(scriptelem[count].ch, scriptelem[count].count, codepoint); 10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptelem[count].tailored = FALSE; 10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoint = usetiter -> getCodepoint(); 10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptelem[count].count = 0; 10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_APPEND_CHAR_UNSAFE(scriptelem[count].ch, scriptelem[count].count, codepoint); 10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptelem[count].tailored = FALSE; 10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count++; 10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete []pattern; 10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return count; 10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Gets the script elements and contractions belonging to the script 10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param script list 10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param scriptcount number of scripts 10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param elems output list 10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @return number of script elements 10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint getScriptElements(UScriptCode script[], int scriptcount, 10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ScriptElement scriptelem[]) 10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 codepoint = 0; 10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (codepoint <= UCHAR_MAX_VALUE) { 10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (checkInScripts(script, scriptcount, codepoint)) { 10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptelem[count].count = 0; 10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_APPEND_CHAR_UNSAFE(scriptelem[count].ch, 10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptelem[count].count, codepoint); 10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptelem[count].tailored = FALSE; 10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error determining codepoint in script\n"); 10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepoint ++; 10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *current = NULL; 10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t strength = 0; 10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t chOffset = 0; 10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t chLen = 0; 10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t exOffset = 0; 10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t exLen = 0; 10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t prefixOffset = 0; 10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t prefixLen = 0; 10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t specs = 0; 10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool rstart = TRUE; 10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColTokenParser src; 10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColOptionSet opts; 10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError parseError; 10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t rulelength = ucol_getRulesEx(COLLATOR_, UCOL_FULL_RULES, NULL, 0); 10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.source = (UChar *)malloc(sizeof(UChar) * 10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (rulelength + UCOL_TOK_EXTRA_RULE_SPACE_SIZE)); 10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rulelength = ucol_getRulesEx(COLLATOR_, UCOL_FULL_RULES, src.source, 10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rulelength); 10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.current = src.source; 10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.end = src.source + rulelength; 10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.extraCurrent = src.end; 10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.extraEnd = src.end + UCOL_TOK_EXTRA_RULE_SPACE_SIZE; 10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.opts = &opts; 10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_tok_parseNextToken(&src, &strength, &chOffset, 10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &chLen, &exOffset, &exLen, 10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &prefixOffset, &prefixLen, 10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &specs, rstart, &parseError, 10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &error) 10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((current = ucol_tok_parseNextToken(&src, rstart, &parseError, 10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &error)) != NULL) { 10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // contractions handled here 10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (chLen > 1) { 10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_strncpy(scriptelem[count].ch, src.source + chOffset, chLen); 10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptelem[count].count = chLen; 10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (checkInScripts(script, scriptcount, scriptelem[count])) { 10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptelem[count].tailored = FALSE; 10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rstart = FALSE; 11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error parsing rules: %s\n", u_errorName(error)); 11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // rule might have been reallocated, so delete this instead 11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org free(src.source); 11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return count; 11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint compareCodepoints(const void *elem1, const void *elem2) 11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *ch1 = ((ScriptElement *)elem1)->ch; // key 11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *ch2 = ((ScriptElement *)elem2)->ch; 11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch1[((ScriptElement *)elem1)->count] = 0; 11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch2[((ScriptElement *)elem2)->count] = 0; 11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // compare the 2 codepoints 11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return u_strcmp(ch1, ch2); 11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool hasSubNFD(ScriptElement &se, ScriptElement &key) 11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *ch1 = se.ch; 11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *ch2 = key.ch; // key 11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch1[se.count] = 0; 11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch2[key.count] = 0; 11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // compare the 2 codepoints 11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (u_strstr(ch1, ch2) != NULL) { 11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // check the decomposition 11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar norm[32]; 11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int size = unorm_normalize(ch1, se.count, UNORM_NFD, 0, norm, 32, 11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &error); 11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error normalizing\n"); 11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (u_strstr(norm, ch2) != NULL) { 11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Marks tailored elements 11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param script list 11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param scriptcount number of scripts 11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param scriptelem script element list 11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param scriptelemlength size of the script element list 11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid markTailored(UScriptCode script[], int scriptcount, 11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ScriptElement scriptelem[], int scriptelemlength) 11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t rulelength; 11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *rule = ucol_getRules(COLLATOR_, &rulelength); 11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *current = NULL; 11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t strength = 0; 11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t chOffset = 0; 11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t chLen = 0; 11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t exOffset = 0; 11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t exLen = 0; 11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t prefixOffset = 0; 11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t prefixLen = 0; 11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t specs = 0; 11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool rstart = TRUE; 11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColTokenParser src; 11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColOptionSet opts; 11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError parseError; 11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.opts = &opts; 11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.source = (UChar *)malloc( 11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (rulelength + UCOL_TOK_EXTRA_RULE_SPACE_SIZE) * sizeof(UChar)); 11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org memcpy(src.source, rule, rulelength * sizeof(UChar)); 11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.current = src.source; 11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.end = (UChar *)src.source + rulelength; 11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.extraCurrent = src.end; 11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.extraEnd = src.end + UCOL_TOK_EXTRA_RULE_SPACE_SIZE; 11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((current = ucol_tok_parseNextToken(&src, rstart, &parseError, 11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &error)) != NULL) { 11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (chLen >= 1 && strength != UCOL_TOK_RESET) { 11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // skipping the reset characters and non useful stuff. 11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ScriptElement se; 11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_strncpy(se.ch, src.source + chOffset, chLen); 11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org se.count = chLen; 11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (checkInScripts(script, scriptcount, se)) { 11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ScriptElement *tse = (ScriptElement *)bsearch(&se, scriptelem, 11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptelemlength, 11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sizeof(ScriptElement), 11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org compareCodepoints); 11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < scriptelemlength; i ++) { 12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!scriptelem[i].tailored && 12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org hasSubNFD(scriptelem[i], se)) { 12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptelem[i].tailored = TRUE; 12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rstart = FALSE; 12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org free(src.source); 12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error parsing rules\n"); 12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Checks if the collation iterator has more than 1 collation element 12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @parem coleiter collation element iterator 12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @return TRUE if collation iterator has more than 1 collation element 12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool hasExpansions(UCollationElements *coleiter) 12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t ce = ucol_next(coleiter, &error); 12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error getting next collation element\n"); 12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (ce != UCOL_NULLORDER) { 12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((UCOL_PRIMARYORDER(ce) != 0) && !isContinuation(ce)) { 12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count ++; 12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (count == 2) { 12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ce = ucol_next(coleiter, &error); 12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error getting next collation element\n"); 12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Prints the footer for index.html 12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param file output file 12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid outputHTMLFooter() 12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "</table>\n"); 12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "</body>\n"); 12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "</html>\n"); 12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Serialize the codepoints from start to end into an html file. 12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Arranging them into ascending collation order. 12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param script code list 12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param scriptcount number of scripts 12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//void serializeScripts(UScriptCode script[], int scriptcount) 12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//Richard 12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid serializeScripts(UScriptCode script[], int scriptcount, const char* locale = NULL) 12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ScriptElement *scriptelem = 12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (ScriptElement *)malloc(sizeof(ScriptElement) * 0x20000); 12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (scriptelem == NULL) { 12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Memory error\n"); 12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int count = 0; 12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(locale) { 12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count = getScriptElementsFromExemplars(scriptelem, locale); 12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count = getScriptElements(script, scriptcount, scriptelem); 12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Sort script elements using Quicksort algorithm: 12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org qsort(scriptelem, count, sizeof(ScriptElement), compareCodepoints); 12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org markTailored(script, scriptcount, scriptelem, count); 12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Sort script elements using Quicksort algorithm: 12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org qsort(scriptelem, count, sizeof(ScriptElement), compareSortKey); 12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollationElements* coleiter = ucol_openElements(COLLATOR_, 12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptelem[0].ch, 12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scriptelem[0].count, 12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &error); 12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error creating collation element iterator\n"); 12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outputScriptElem(scriptelem[0], -1, hasExpansions(coleiter)); 12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < count - 1; i ++) { 12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_setText(coleiter, scriptelem[i + 1].ch, scriptelem[i + 1].count, 12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &error); 12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error setting text in collation element iterator\n"); 13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outputScriptElem(scriptelem[i + 1], 13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org compareSortKey(scriptelem + i, scriptelem + i + 1), 13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org hasExpansions(coleiter)); 13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org free(scriptelem); 13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outputHTMLFooter(); 13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Prints the header for the html 13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param locale name 13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param script 13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param scriptcount number of scripts 13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid outputHTMLHeader(const char *locale, UScriptCode script[], 13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int scriptcount) 13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<html>\n"); 13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<head>\n"); 13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n"); 13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<meta http-equiv=\"Content-Language\" content=\"en-us\">\n"); 13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<link rel=\"stylesheet\" href=\"charts.css\" type=\"text/css\">\n"); 13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<title>ICU Collation charts</title>\n"); 13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<base target=\"main\">\n"); 13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "</head>\n"); 13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<body bgcolor=#FFFFFF>\n"); 13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<!--\n"); 13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "This file contains sorted characters in ascending order according to the locale stated\n"); 13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "If the character is in red, it is tailored in the collation rules.\n"); 13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "Background colours have certain meanings:\n"); 13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "White - equals the previous character\n"); 13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "dark blue - primary greater than the previous character\n"); 13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "blue - secondary greater than the previous character\n"); 13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "light blue - tertiary greater than the previous character\n"); 13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "--!>\n"); 13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<table border=0>\n"); 13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar displayname[64]; 13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t size = uloc_getDisplayName(locale, "en_US", displayname, 64, &error); 13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char utf8displayname[128]; 13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org utf8displayname[0] = 0; 13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t utf8size = 0; 13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_strToUTF8(utf8displayname, 128, &utf8size, displayname, size, &error); 13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><th>Locale</th><td class='noborder'>%s</td></tr>\n", utf8displayname); 13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><th>Script(s)</th>"); 13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<td class='noborder'>"); 13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < scriptcount; i ++) { 13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "%s", uscript_getName(script[i])); 13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (i + 1 != scriptcount) { 13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, ", "); 13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "</td></tr>\n"); 13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><th>Rules</th><td class='noborder'><a href=\"http://dev.icu-project.org/cgi-bin/viewcvs.cgi/*checkout*/icu/source/data/coll/%s.txt\">%s.txt</a></td></tr>\n", locale, locale); 13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVersionInfo version; 13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_getVersion(COLLATOR_, version); 13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><th>Collator version</th><td class='noborder'>%d.%d.%d.%d</td></tr>\n", 13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org version[0], version[1], version[2], version[3]); 13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColAttribute attr = UCOL_FRENCH_COLLATION; 13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (attr < UCOL_ATTRIBUTE_COUNT) { 13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColAttributeValue value = ucol_getAttribute(COLLATOR_, attr, &error); 13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error getting attribute\n"); 13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (value != UCOL_DEFAULT) { 13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (attr == UCOL_FRENCH_COLLATION && value != UCOL_OFF) { 13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><th>French Collation</th><td class='noborder'>on, code %d</td></tr>\n", value); 13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (attr == UCOL_ALTERNATE_HANDLING && value != UCOL_NON_IGNORABLE) { 13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><th>Alternate Handling</th><td class='noborder'>shifted, code%d</td></tr>\n", value); 13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (attr == UCOL_CASE_FIRST && value != UCOL_OFF) { 13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><th>Case First</th><td class='noborder'>on, code %d</td></tr>\n", value); 13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (attr == UCOL_CASE_LEVEL && value != UCOL_OFF) { 13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><th>Case Level</th><td class='noborder'>on, code %d</td></tr>\n", value); 13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (attr == UCOL_NORMALIZATION_MODE && value != UCOL_OFF) { 13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><th>Normalization</th><td class='noborder'>on, code %d</td></tr>\n", value); 13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (attr == UCOL_STRENGTH && value != UCOL_TERTIARY) { 13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><th>Strength</th><td class='noborder'>code %d</td></tr>\n", value); 13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (attr == UCOL_HIRAGANA_QUATERNARY_MODE && value != UCOL_OFF) { 13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><th>Hiragana Quaternary</th><td class='noborder'>on, code %d</td></tr>\n", value); 13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org attr = (UColAttribute)(attr + 1); 14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Get UNIX-style time and display as number and string. 14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org time_t ltime; 14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org time( <ime ); 14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<tr><th>Date Generated</th><td class='noborder'>%s</td></tr>", ctime(<ime)); 14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "</table>\n"); 14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<p><a href=help.html>How to read the table</a><br>\n"); 14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "<a href=http://www.jtcsv.com/cgi-bin/icu-bugs/ target=new>Submit a bug</a></p>\n"); 14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "\n<table>\n"); 14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(OUTPUT_, "\n<tr><th>Codepoint</th><th>P</th><th>S</th><th>T</th><th>Q</th><th>Name</th></tr>\n"); 14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Prints the header for index.html 14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param file output file 14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid outputListHTMLHeader(FILE *file) 14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "<html>\n"); 14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "<head>\n"); 14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n"); 14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "<meta http-equiv=\"Content-Language\" content=\"en-us\">\n"); 14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "<title>ICU Collation Charts</title>\n"); 14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "<base target=\"main\">\n"); 14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "</head>\n"); 14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "<body bgcolor=#FFFFFF>\n"); 14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "<h2 align=center>ICU Collation Charts</h2>\n"); 14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "<p align=center>\n"); 14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "<a href=http://www.unicode.org/charts/collation/ target=new>UCA Charts</a><br>"); 14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Prints the footer for index.html 14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param file output file 14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid outputListHTMLFooter(FILE *file) 14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "</p>\n"); 14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //fprintf(file, "<center><image src=http://oss.software.ibm.com/icu/images/w24.gif></center>\n"); 14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "</body>\n"); 14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, "</html>\n"); 14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Gets all scripts and serialize their codepoints into an html file. 14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid serializeScripts() { 14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char filename[128]; 14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int dirlength = 0; 14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[4].doesOccur) { 14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(filename, options[4].value); 14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dirlength = appendDirSeparator(filename); 14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org filename[0] = 0; 14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *locale; 14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t localelist = 0; 14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t localesize; 14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org localesize = ucol_countAvailable(); 14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org locale = ucol_getAvailable(localelist); 14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(filename, "list.html"); 14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FILE *list = fopen(filename, "w"); 14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org filename[dirlength] = 0; 14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (list == NULL) { 14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Cannot open file: %s\n", filename); 14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outputListHTMLHeader(list); 14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(list, "<blockquote>\n"); 14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (TRUE) { 14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org COLLATOR_ = ucol_open(locale, &error); 14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Collator creation failed:"); 14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, u_errorName(error)); 14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((error != U_USING_FALLBACK_WARNING && // not tailored 14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error != U_USING_DEFAULT_WARNING) || 14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkLocaleForLanguage(locale)) { 14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(list, "<a href=%s.html>%s</a> ", locale, locale); 14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setAttributes(COLLATOR_, &error); 14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Collator attribute setting failed:"); 14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, u_errorName(error)); 14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UScriptCode scriptcode[32]; 14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t scriptcount = uscript_getCode(locale, scriptcode, 32, 15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &error); 15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(error)) { 15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Error getting lcale scripts\n"); 15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(filename, locale); 15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(filename, ".html"); 15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OUTPUT_ = fopen(filename, "w"); 15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (OUTPUT_ == NULL) { 15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Cannot open file:%s\n", filename); 15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outputHTMLHeader(locale, scriptcode, scriptcount); 15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "%s\n", locale); 15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(options[12].doesOccur) { 15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // use whole scripts 15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serializeScripts(scriptcode, scriptcount); 15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // use exemplar chars 15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serializeScripts(scriptcode, scriptcount, locale); 15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(OUTPUT_); 15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucol_close(COLLATOR_); 15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org filename[dirlength] = 0; 15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org localelist ++; 15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (localelist == localesize) { 15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org locale = ucol_getAvailable(localelist); 15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(list, "<br><a href=help.html>help</a><br>"); 15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(list, "</blockquote>\n"); 15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outputListHTMLFooter(list); 15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(list); 15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Main -- process command line, read in and pre-process the test file, 15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* call other functions to do the actual tests. 15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint main(int argc, char *argv[]) { 15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org argc = u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), 15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org options); 15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // error handling, printing usage message 15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (argc < 0) { 15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "error in command line argument: "); 15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, argv[-argc]); 15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "\n"); 15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (argc < 0 || options[0].doesOccur || options[1].doesOccur) { 15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Usage: dumpce options...\n" 15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "--help\n" 15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " Display this message.\n" 15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "--locale name|all\n" 15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " ICU locale to use. Default is en_US\n" 15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "--serialize\n" 15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " Serializes the collation elements in -locale or all locales available and outputs them into --outputdir/locale_ce.txt\n" 15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "--destdir dir_name\n" 15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " Path for outputing the serialized collation elements. Defaults to stdout if no defined\n" 15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "--sourcedir dir_name\n" 15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " Path for the input rule file for collation\n" 15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "--attribute name=value,name=value...\n" 15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " Pairs of attribute names and values for setting\n" 15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "--rule filename\n" 15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " Name of file containing the collation rules.\n" 15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "--normalizaton mode\n" 15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " UNormalizationMode mode to be used.\n" 15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "--scripts\n" 15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " Codepoints from all scripts are sorted and serialized.\n" 15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "--reducehan\n" 15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " Only 200 Han script characters will be displayed with the use of --scripts.\n" 15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "--wholescripts\n" 15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " Show collation order for whole scripts instead of just for exemplar characters of a locale\n\n"); 15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Example to generate *.txt files : dumpce --serialize --locale af --destdir /temp --attribute UCOL_STRENGTH=UCOL_DEFAULT_STRENGTH,4=17\n\n"); 15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "Example to generate *.html files for oss web display: dumpce --scripts --destdir /temp --reducehan\n"); 15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return argc < 0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; 15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OUTPUT_ = stdout; 15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[6].doesOccur) { 15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stdout, "attributes %s\n", options[6].value); 15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parseAttributes(); 15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[3].doesOccur) { 15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serialize(); 15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[9].doesOccur) { 15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org serializeScripts(); 15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1598