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>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</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>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>");
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else if (compare == -2) {
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(OUTPUT_, "</tt></td><td>&nbsp;</td><td>S</td><td>&nbsp;</td><td>&nbsp;</td><td>");
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else if (compare == -3) {
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(OUTPUT_, "</tt></td><td>&nbsp;</td><td>&nbsp;</td><td>T</td><td>&nbsp;</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( &ltime );
14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(OUTPUT_, "<tr><th>Date Generated</th><td class='noborder'>%s</td></tr>", ctime(&ltime));
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