ac749e0c5fbf352ddf5682e048737cb714773705
[pazpar2-moved-to-github.git] / src / icu_chain_test.c
1 /**
2  gcc -I/usr/include/libxml2 -lxml2 -o icu-xml-convert icu-xml-convert.c
3  */
4
5 #include <stdio.h>
6 #include <string.h>
7
8 #include "icu_I18N.h"
9
10 /* commando line parameters */
11 static struct config_t { 
12   //char infile[1024];
13   //char locale[128];
14   char conffile[1024];
15   //char outfile[1024];
16   int verbatim;
17   int print;
18 } config;
19
20
21   
22 void print_option_error(const struct config_t *p_config)
23 {  
24   fprintf(stderr, "Calling error, valid options are :\n");
25   fprintf(stderr, "icu_chain_test\n"
26           "   [-c (path/to/config/file.xml)]\n"
27           "   [-p (c|l|t)] print available info \n"
28           "   [-v] verbouse output\n"
29           "\n");
30   exit(1);
31 }
32
33 void read_params(int argc, char **argv, struct config_t *p_config){    
34   char *arg;
35   int ret;
36   
37   /* set default parameters */
38   p_config->conffile[0] = 0;
39   
40   /* set up command line parameters */
41   
42   while ((ret = options("c:p:v", argv, argc, &arg)) != -2)
43     {
44       switch (ret)
45         {
46         case 'c':
47           strcpy(p_config->conffile, arg);
48           break;
49         case 'p':
50           strcpy(p_config->print, arg);
51           break;
52         case 'v':
53           if (arg)  
54             p_config->verbatim = atoi(arg);
55           else  
56             p_config->verbatim = 1;
57           break;
58         default:
59           print_option_error(p_config);
60         }
61     }
62
63
64   if (! strlen(p_config->conffile))
65     print_option_error();
66 }
67
68 /*     UConverter *conv; */
69 /*     conv = ucnv_open("utf-8", &status); */
70 /*     assert(U_SUCCESS(status)); */
71
72 /*     *ustr16_len  */
73 /*       = ucnv_toUChars(conv, ustr16, 1024,  */
74 /*                       (const char *) *xstr8, strlen((const char *) *xstr8), */
75 /*                       &status); */
76   
77
78
79 /*      ucnv_fromUChars(conv, */
80 /*                      (char *) *xstr8, strlen((const char *) *xstr8), */
81 /*                      ustr16, *ustr16_len, */
82 /*                      &status); */
83 /*      ucnv_close(conv); */
84
85
86 static void print_icu_converters(const struct config_t *p_config)
87 {
88   int32_t count;
89   int32_t i;
90
91   count = ucnv_countAvailable();
92   printf("Available ICU converters: %d\n", count);
93   
94   for(i=0;i<count;i++) 
95   {
96     printf("%s ", ucnv_getAvailableName(i));
97   }
98   printf("\n");
99   printf("Default ICU Converter is: '%s'\n", ucnv_getDefaultName());
100
101   exit(0);
102 }
103
104 static void print_icu_transliterators(const struct config_t *p_config)
105 {
106   int32_t count;
107   int32_t i;
108
109   count = utrans_countAvailableIDs();
110
111   int32_t buf_cap = 128;
112   char buf[buf_cap];
113
114   if (1 < p_config->verbatim){
115     printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
116     printf("<icu>\n<transliterators actions=\"%d\">\n",  count);
117   } else 
118     printf("Available ICU transliterators: %d\n", count);
119
120   for(i=0;i<count;i++)
121     {
122       utrans_getAvailableID(i, buf, buf_cap);
123        if (1 < p_config->verbatim)
124          printf("<transliterator action=\"%s\"/>\n", buf);
125        else
126          printf(" %s", buf);
127     }
128
129   if (1 < p_config->verbatim){
130     printf("</transliterators>\n</icu>\n");
131   }
132   else
133     {
134       printf("\n\nUnicode Set Patterns:\n"
135              "   Pattern         Description\n"
136              "   Ranges          [a-z]  The lower case letters a through z\n"
137              "   Named Chars     [abc123] The six characters a,b,c,1,2 and 3\n"
138              "   String          [abc{def}] chars a, b and c, and string 'def'\n"
139              "   Categories      [\\p{Letter}] Perl General Category 'Letter'.\n"
140              "   Categories      [:Letter:] Posix General Category 'Letter'.\n"
141              "\n"
142              "   Combination     Example\n"
143              "   Union           [[:Greek:] [:letter:]]\n"
144              "   Intersection    [[:Greek:] & [:letter:]]\n"
145              "   Set Complement  [[:Greek:] - [:letter:]]\n"
146              "   Complement      [^[:Greek:] [:letter:]]\n"
147              "\n"
148              "see: http://icu.sourceforge.net/userguide/unicodeSet.html\n"
149              "\n"
150              "Examples:\n"
151              "   [:Punctuation:] Any-Remove\n"
152              "   [:Cased-Letter:] Any-Upper\n"
153              "   [:Control:] Any-Remove\n"
154              "   [:Decimal_Number:] Any-Remove\n"
155              "   [:Final_Punctuation:] Any-Remove\n"
156              "   [:Georgian:] Any-Upper\n"
157              "   [:Katakana:] Any-Remove\n"
158              "   [:Arabic:] Any-Remove\n"
159              "   [:Punctuation:] Remove\n"
160              "   [[:Punctuation:]-[.,]] Remove\n"
161              "   [:Line_Separator:] Any-Remove\n"
162              "   [:Math_Symbol:] Any-Remove\n"
163              "   Lower; [:^Letter:] Remove (word tokenization)\n"
164              "   [:^Number:] Remove (numeric tokenization)\n"
165              "   [:^Katagana:] Remove (remove everything except Katagana)\n"
166              "   Lower;[[:WhiteSpace:][:Punctuation:]] Remove (word tokenization)\n"
167              "   NFD; [:Nonspacing Mark:] Remove; NFC   (removes accents from characters)\n"
168              "   [A-Za-z]; Lower(); Latin-Katakana; Katakana-Hiragana (transforms latin and katagana to hiragana)\n"
169              "   [[:separator:][:start punctuation:][:initial punctuation:]] Remove \n"
170              "\n"
171              "see http://icu.sourceforge.net/userguide/Transform.html\n"
172              "    http://www.unicode.org/Public/UNIDATA/UCD.html\n"
173              "    http://icu.sourceforge.net/userguide/Transform.html\n"
174              "    http://icu.sourceforge.net/userguide/TransformRule.html\n"
175              );
176     }
177
178
179   printf("\n\n");
180
181
182   exit(0);
183 }
184
185 static void print_icu_xml_locales(const struct config_t *p_config)
186 {
187   int32_t count;
188   int32_t i;
189   UErrorCode status = U_ZERO_ERROR;
190
191   UChar keyword[64];
192   int32_t keyword_len = 0;
193   char keyword_str[128];
194   int32_t keyword_str_len = 0;
195
196   UChar language[64];
197   int32_t language_len = 0;
198   char lang_str[128];
199   int32_t lang_str_len = 0;
200
201   UChar script[64];
202   int32_t script_len = 0;
203   char script_str[128];
204   int32_t script_str_len = 0;
205
206   UChar location[64];
207   int32_t location_len = 0;
208   char location_str[128];
209   int32_t location_str_len = 0;
210
211   UChar variant[64];
212   int32_t variant_len = 0;
213   char variant_str[128];
214   int32_t variant_str_len = 0;
215
216   UChar name[64];
217   int32_t name_len = 0;
218   char name_str[128];
219   int32_t name_str_len = 0;
220
221   UChar localname[64];
222   int32_t localname_len = 0;
223   char localname_str[128];
224   int32_t localname_str_len = 0;
225
226   count = uloc_countAvailable() ;
227
228   if (1 < p_config->verbatim){
229     printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
230     printf("<icu>\n<locales count=\"%d\" default=\"%s\" collations=\"%d\">\n", 
231            count, uloc_getDefault(), ucol_countAvailable());
232   }
233   
234   for(i=0;i<count;i++) 
235   {
236
237     keyword_len 
238       = uloc_getDisplayKeyword(uloc_getAvailable(i), "en", 
239                                 keyword, 64, 
240                                 &status);
241
242     u_strToUTF8(keyword_str, 128, &keyword_str_len,
243                 keyword, keyword_len,
244                 &status);
245     
246     
247     language_len 
248       = uloc_getDisplayLanguage(uloc_getAvailable(i), "en", 
249                                 language, 64, 
250                                 &status);
251
252     u_strToUTF8(lang_str, 128, &lang_str_len,
253                 language, language_len,
254                 &status);
255
256
257     script_len 
258       = uloc_getDisplayScript(uloc_getAvailable(i), "en", 
259                                 script, 64, 
260                                 &status);
261
262     u_strToUTF8(script_str, 128, &script_str_len,
263                 script, script_len,
264                 &status);
265
266     location_len 
267       = uloc_getDisplayCountry(uloc_getAvailable(i), "en", 
268                                 location, 64, 
269                                 &status);
270
271     u_strToUTF8(location_str, 128, &location_str_len,
272                 location, location_len,
273                 &status);
274
275     variant_len 
276       = uloc_getDisplayVariant(uloc_getAvailable(i), "en", 
277                                 variant, 64, 
278                                 &status);
279
280     u_strToUTF8(variant_str, 128, &variant_str_len,
281                 variant, variant_len,
282                 &status);
283
284     name_len 
285       = uloc_getDisplayName(uloc_getAvailable(i), "en", 
286                                 name, 64, 
287                                 &status);
288
289     u_strToUTF8(name_str, 128, &name_str_len,
290                 name, name_len,
291                 &status);
292
293     localname_len 
294       = uloc_getDisplayName(uloc_getAvailable(i), uloc_getAvailable(i), 
295                                 localname, 64, 
296                                 &status);
297
298     u_strToUTF8(localname_str, 128, &localname_str_len,
299                 localname, localname_len,
300                 &status);
301
302
303     if (1 < p_config->verbatim){
304       printf("<locale");
305       printf(" xml:lang=\"%s\"", uloc_getAvailable(i)); 
306       /* printf(" locale=\"%s\"", uloc_getAvailable(i)); */
307       /* if (strlen(keyword_str)) */
308       /*   printf(" keyword=\"%s\"", keyword_str); */
309       /* if (ucol_getAvailable(i)) */
310       /*   printf(" collation=\"1\""); */
311       if (strlen(lang_str))
312         printf(" language=\"%s\"", lang_str);
313       if (strlen(script_str))
314         printf(" script=\"%s\"", script_str);
315       if (strlen(location_str))
316         printf(" location=\"%s\"", location_str);
317       if (strlen(variant_str))
318         printf(" variant=\"%s\"", variant_str);
319       if (strlen(name_str))
320         printf(" name=\"%s\"", name_str);
321       if (strlen(localname_str))
322         printf(" localname=\"%s\"", localname_str);
323       printf(">");
324       if (strlen(localname_str))
325         printf("%s", localname_str);
326       printf("</locale>\n"); 
327     }
328     else if (1 == p_config->verbatim){
329       printf("%s", uloc_getAvailable(i)); 
330       printf(" | ");
331       if (strlen(name_str))
332         printf("%s", name_str);
333       printf(" | ");
334       if (strlen(localname_str))
335         printf("%s", localname_str);
336       printf("\n");
337     }
338     else
339       printf("%s ", uloc_getAvailable(i));
340   }
341   if (1 < p_config->verbatim)
342     printf("</locales>\n</icu>\n");
343   else
344     printf("\n");
345
346   if(U_FAILURE(status)) {
347     fprintf(stderr, "ICU Error: %d %s\n", status, u_errorName(status));
348     exit(status);
349   }
350   exit(0);
351 }
352
353
354 int main(int argc, char **argv) {
355
356   //LIBXML_TEST_VERSION;
357
358   read_params(argc, argv, &config);
359
360   if (config.debug)
361     print_options(&config);
362
363   if ('c' == config.print[0])
364     print_icu_converters(&config);
365
366   if ('l' == config.print[0])
367     print_icu_xml_locales(&config);
368
369   if ('t' == config.print[0])
370     print_icu_transliterators(&config);
371   
372   //xmlCleanupParser();
373   //xmlMemoryDump();
374   return(0);
375 }
376
377