1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * COPYRIGHT:
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Copyright (C) 2002-2006 IBM, Inc.   All Rights Reserved.
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This program demos string collation
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char gHelpString[] =
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "usage: coll [options*] -source source_string -target target_string\n"
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "-help            Display this message.\n"
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "-locale name     ICU locale to use.  Default is en_US\n"
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "-rules rule      Collation rules file (overrides locale)\n"
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "-french          French accent ordering\n"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "-norm            Normalizing mode on\n"
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "-shifted         Shifted mode\n"
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "-lower           Lower case first\n"
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "-upper           Upper case first\n"
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "-case            Enable separate case level\n"
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "-level n         Sort level, 1 to 5, for Primary, Secndary, Tertiary, Quaternary, Identical\n"
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	"-source string   Source string for comparison\n"
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	"-target string   Target string for comparison\n"
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "Example coll -rules \\u0026b\\u003ca -source a -target b\n"
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	"The format \\uXXXX is supported for the rules and comparison strings\n"
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	;
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h>
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <string.h>
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h>
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <unicode/utypes.h>
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <unicode/ucol.h>
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <unicode/ustring.h>
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Command line option variables
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *    These global variables are set according to the options specified
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *    on the command line by the user.
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruchar * opt_locale     = "en_US";
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruchar * opt_rules      = 0;
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool  opt_help       = FALSE;
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool  opt_norm       = FALSE;
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool  opt_french     = FALSE;
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool  opt_shifted    = FALSE;
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool  opt_lower      = FALSE;
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool  opt_upper      = FALSE;
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool  opt_case       = FALSE;
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint    opt_level      = 0;
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruchar * opt_source     = "abc";
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruchar * opt_target     = "abd";
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUCollator * collator  = 0;
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Definitions for the command line options
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct OptSpec {
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *name;
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    enum {FLAG, NUM, STRING} type;
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void *pVar;
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruOptSpec opts[] = {
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {"-locale",      OptSpec::STRING, &opt_locale},
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {"-rules",       OptSpec::STRING, &opt_rules},
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	{"-source",      OptSpec::STRING, &opt_source},
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {"-target",      OptSpec::STRING, &opt_target},
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {"-norm",        OptSpec::FLAG,   &opt_norm},
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {"-french",      OptSpec::FLAG,   &opt_french},
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {"-shifted",     OptSpec::FLAG,   &opt_shifted},
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {"-lower",       OptSpec::FLAG,   &opt_lower},
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {"-upper",       OptSpec::FLAG,   &opt_upper},
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {"-case",        OptSpec::FLAG,   &opt_case},
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {"-level",       OptSpec::NUM,    &opt_level},
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {"-help",        OptSpec::FLAG,   &opt_help},
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {"-?",           OptSpec::FLAG,   &opt_help},
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {0, OptSpec::FLAG, 0}
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * processOptions()  Function to read the command line options.
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool processOptions(int argc, const char **argv, OptSpec opts[])
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (int argNum = 1; argNum < argc; argNum ++) {
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char *pArgName = argv[argNum];
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        OptSpec *pOpt;
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (pOpt = opts;  pOpt->name != 0; pOpt ++) {
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (strcmp(pOpt->name, pArgName) == 0) {
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                switch (pOpt->type) {
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case OptSpec::FLAG:
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    *(UBool *)(pOpt->pVar) = TRUE;
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    break;
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case OptSpec::STRING:
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    argNum ++;
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    if (argNum >= argc) {
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        fprintf(stderr, "value expected for \"%s\" option.\n",
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru							    pOpt->name);
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        return FALSE;
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    *(const char **)(pOpt->pVar) = argv[argNum];
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    break;
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case OptSpec::NUM:
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    argNum ++;
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    if (argNum >= argc) {
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        fprintf(stderr, "value expected for \"%s\" option.\n",
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru							    pOpt->name);
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        return FALSE;
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    char *endp;
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    int i = strtol(argv[argNum], &endp, 0);
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    if (endp == argv[argNum]) {
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        fprintf(stderr,
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru							    "integer value expected for \"%s\" option.\n",
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru								pOpt->name);
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        return FALSE;
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    *(int *)(pOpt->pVar) = i;
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                break;
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (pOpt->name == 0)
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fprintf(stderr, "Unrecognized option \"%s\"\n", pArgName);
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return FALSE;
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	return TRUE;
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * ICU string comparison
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint strcmp()
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	UChar source[100];
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	UChar target[100];
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	u_unescape(opt_source, source, 100);
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	u_unescape(opt_target, target, 100);
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollationResult result = ucol_strcoll(collator, source, -1, target, -1);
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (result == UCOL_LESS) {
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		return -1;
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else if (result == UCOL_GREATER) {
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		return 1;
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	return 0;
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Creates a collator
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool processCollator()
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	// Set up an ICU collator
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	UChar rules[100];
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (opt_rules != 0) {
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		u_unescape(opt_rules, rules, 100);
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        collator = ucol_openRules(rules, -1, UCOL_OFF, UCOL_TERTIARY,
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			                  NULL, &status);
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else {
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        collator = ucol_open(opt_locale, &status);
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (U_FAILURE(status)) {
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr, "Collator creation failed.: %d\n", status);
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return FALSE;
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (status == U_USING_DEFAULT_WARNING) {
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr, "Warning, U_USING_DEFAULT_WARNING for %s\n",
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			    opt_locale);
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (status == U_USING_FALLBACK_WARNING) {
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr, "Warning, U_USING_FALLBACK_ERROR for %s\n",
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			    opt_locale);
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (opt_norm) {
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (opt_french) {
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(collator, UCOL_FRENCH_COLLATION, UCOL_ON, &status);
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (opt_lower) {
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(collator, UCOL_CASE_FIRST, UCOL_LOWER_FIRST,
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			              &status);
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (opt_upper) {
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(collator, UCOL_CASE_FIRST, UCOL_UPPER_FIRST,
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			              &status);
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (opt_case) {
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(collator, UCOL_CASE_LEVEL, UCOL_ON, &status);
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (opt_shifted) {
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucol_setAttribute(collator, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED,
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			              &status);
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (opt_level != 0) {
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        switch (opt_level) {
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case 1:
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_setAttribute(collator, UCOL_STRENGTH, UCOL_PRIMARY, &status);
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case 2:
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_setAttribute(collator, UCOL_STRENGTH, UCOL_SECONDARY,
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				              &status);
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case 3:
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_setAttribute(collator, UCOL_STRENGTH, UCOL_TERTIARY, &status);
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case 4:
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_setAttribute(collator, UCOL_STRENGTH, UCOL_QUATERNARY,
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				              &status);
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case 5:
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucol_setAttribute(collator, UCOL_STRENGTH, UCOL_IDENTICAL,
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				              &status);
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        default:
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fprintf(stderr, "-level param must be between 1 and 5\n");
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return FALSE;
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr, "Collator attribute setting failed.: %d\n", status);
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return FALSE;
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	return TRUE;
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Main   --  process command line, read in and pre-process the test file,
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *            call other functions to do the actual tests.
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint main(int argc, const char** argv)
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (processOptions(argc, argv, opts) != TRUE || opt_help) {
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        printf(gHelpString);
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return -1;
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (processCollator() != TRUE) {
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		fprintf(stderr, "Error creating collator for comparison\n");
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		return -1;
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	fprintf(stdout, "Comparing source=%s and target=%s\n", opt_source,
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			opt_target);
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	int result = strcmp();
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (result == 0) {
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		fprintf(stdout, "source is equals to target\n");
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	else if (result < 0) {
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		fprintf(stdout, "source is less than target\n");
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	else {
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		fprintf(stdout, "source is greater than target\n");
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	ucol_close(collator);
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	return 0;
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
267