150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/*
250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*******************************************************************************
350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*
4103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius*   Copyright (C) 1999-2012, International Business Machines
550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   Corporation and others.  All Rights Reserved.
650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*
750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*******************************************************************************
850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   file name:  icuinfo.cpp
950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   encoding:   US-ASCII
1050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   tab size:   8 (not used)
1150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   indentation:4
1250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*
1350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   created on: 2009-2010
1450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   created by: Steven R. Loomis
1550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*
1650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   This program shows some basic info about the current ICU.
1750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*/
1850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include <stdio.h>
2050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include <stdlib.h>
2150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/utypes.h"
2250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/putil.h"
2350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/uclean.h"
2427f654740f2a26ad62a5c155af9199af9e69b889claireho#include "udbgutil.h"
2550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unewdata.h"
2650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cmemory.h"
2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cstring.h"
2850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "uoptions.h"
2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "toolutil.h"
3050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "icuplugimp.h"
3150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include <unicode/uloc.h>
3250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include <unicode/ucnv.h>
3350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/ucal.h"
3450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include <unicode/ulocdata.h>
3550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "putilimp.h"
3650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/uchar.h"
3750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UOption options[]={
3950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  /*0*/ UOPTION_HELP_H,
4050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  /*1*/ UOPTION_HELP_QUESTION_MARK,
4150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  /*2*/ UOPTION_ICUDATADIR,
4250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  /*3*/ UOPTION_VERBOSE,
4350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  /*4*/ UOPTION_DEF("list-plugins", 'L', UOPT_NO_ARG),
4450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  /*5*/ UOPTION_DEF("milisecond-time", 'm', UOPT_NO_ARG),
4550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  /*6*/ UOPTION_DEF("cleanup", 'K', UOPT_NO_ARG),
46103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  /*7*/ UOPTION_DEF("xml", 'x', UOPT_REQUIRES_ARG),
4750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho};
4850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
4950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UErrorCode initStatus = U_ZERO_ERROR;
5050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UBool icuInitted = FALSE;
5150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
5250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void do_init() {
5350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(!icuInitted) {
5450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      u_init(&initStatus);
5550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      icuInitted = TRUE;
5650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
5750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
5850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
5950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
6050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid cmd_millis()
6150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  printf("Milliseconds since Epoch: %.0f\n", uprv_getUTCtime());
6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
6450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
65103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid cmd_version(UBool /* noLoad */, UErrorCode &errorCode)
6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
67103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    do_init();
69103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
70103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    udbg_writeIcuInfo(stdout); /* print the XML format */
7150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
72103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    union {
73103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        uint8_t byte;
74103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        uint16_t word;
75103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } u;
76103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    u.word=0x0100;
77103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_IS_BIG_ENDIAN==u.byte) {
78103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      //printf("U_IS_BIG_ENDIAN: %d\n", U_IS_BIG_ENDIAN);
79103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } else {
80103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        fprintf(stderr, "  error: U_IS_BIG_ENDIAN=%d != %d=actual 'is big endian'\n",
81103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                U_IS_BIG_ENDIAN, u.byte);
82103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errorCode=U_INTERNAL_PROGRAM_ERROR;
8350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
8450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
85103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_SIZEOF_WCHAR_T==sizeof(wchar_t)) {
86103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      //printf("U_SIZEOF_WCHAR_T: %d\n", U_SIZEOF_WCHAR_T);
87103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } else {
88103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        fprintf(stderr, "  error: U_SIZEOF_WCHAR_T=%d != %d=sizeof(wchar_t)\n",
89103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                U_SIZEOF_WCHAR_T, (int)sizeof(wchar_t));
90103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errorCode=U_INTERNAL_PROGRAM_ERROR;
9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
92103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
93103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int charsetFamily;
94103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if('A'==0x41) {
95103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        charsetFamily=U_ASCII_FAMILY;
96103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } else if('A'==0xc1) {
97103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        charsetFamily=U_EBCDIC_FAMILY;
98103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } else {
99103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        charsetFamily=-1;  // unknown
10050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
101103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_CHARSET_FAMILY==charsetFamily) {
102103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      //printf("U_CHARSET_FAMILY: %d\n", U_CHARSET_FAMILY);
103103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } else {
104103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        fprintf(stderr, "  error: U_CHARSET_FAMILY=%d != %d=actual charset family\n",
105103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                U_CHARSET_FAMILY, charsetFamily);
106103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errorCode=U_INTERNAL_PROGRAM_ERROR;
107103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
108103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
109103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    printf("\n\nICU Initialization returned: %s\n", u_errorName(initStatus));
110103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
11150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
11250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if U_ENABLE_DYLOAD
11350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *pluginFile = uplug_getPluginFile();
11450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    printf("Plugin file is: %s\n", (pluginFile&&*pluginFile)?pluginFile:"(not set. try setting ICU_PLUGINS to a directory.)");
11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else
11650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fprintf(stderr, "Dynamic Loading: is disabled. No plugins will be loaded at start-up.\n");
11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
12050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid cmd_cleanup()
12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    u_cleanup();
12354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    fprintf(stdout, "ICU u_cleanup() called.\n");
12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
12750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid cmd_listplugins() {
12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t i;
12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UPlugData *plug;
13050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
13150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    do_init();
13250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    printf("ICU Initialized: u_init() returned %s\n", u_errorName(initStatus));
13350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    printf("Plugins: \n");
13550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    printf(    "# %6s   %s \n",
13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       "Level",
13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       "Name" );
13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    printf(    "    %10s:%-10s\n",
13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       "Library",
14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       "Symbol"
14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            );
14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    printf(    "       config| (configuration string)\n");
14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    printf(    " >>>   Error          | Explanation \n");
14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    printf(    "-----------------------------------\n");
14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    for(i=0;(plug=uplug_getPlugInternal(i))!=NULL;i++) {
14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UErrorCode libStatus = U_ZERO_ERROR;
15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char *name = uplug_getPlugName(plug);
15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char *sym = uplug_getSymbolName(plug);
15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char *lib = uplug_getLibraryName(plug, &libStatus);
15350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char *config = uplug_getConfiguration(plug);
15450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UErrorCode loadStatus = uplug_getPlugLoadStatus(plug);
15550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char *message = NULL;
15650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
15750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        printf("\n#%d  %-6s %s \n",
15850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            i+1,
15950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            udbg_enumName(UDBG_UPlugLevel,(int32_t)uplug_getPlugLevel(plug)),
16050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            name!=NULL?(*name?name:"this plugin did not call uplug_setPlugName()"):"(null)"
16150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        );
16250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        printf("    plugin| %10s:%-10s\n",
16350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            (U_SUCCESS(libStatus)?(lib!=NULL?lib:"(null)"):u_errorName(libStatus)),
16450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            sym!=NULL?sym:"(null)"
16550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        );
16650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
16750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(config!=NULL&&*config) {
16850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            printf("    config| %s\n", config);
16950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
17050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
17150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        switch(loadStatus) {
17250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            case U_PLUGIN_CHANGED_LEVEL_WARNING:
17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                message = "Note: This plugin changed the system level (by allocating memory or calling something which does). Later plugins may not load.";
17450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                break;
17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
17650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            case U_PLUGIN_DIDNT_SET_LEVEL:
17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                message = "Error: This plugin did not call uplug_setPlugLevel during QUERY.";
17850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                break;
17950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
18050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            case U_PLUGIN_TOO_HIGH:
18150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                message = "Error: This plugin couldn't load because the system level was too high. Try loading this plugin earlier.";
18250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                break;
18350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
18450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            case U_ZERO_ERROR:
18550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                message = NULL; /* no message */
18650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                break;
18750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            default:
18850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                if(U_FAILURE(loadStatus)) {
18950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    message = "error loading:";
19050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                } else {
19150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    message = "warning during load:";
19250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                }
19350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
19450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
19550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(message!=NULL) {
19650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            printf("\\\\\\ status| %s\n"
19750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   "/// %s\n", u_errorName(loadStatus), message);
19850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
19950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
20050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
20150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho	if(i==0) {
20250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho		printf("No plugins loaded.\n");
20350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho	}
20450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
20550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
20650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
20750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
20850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
20950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoextern int
21050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehomain(int argc, char* argv[]) {
21150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode errorCode = U_ZERO_ERROR;
21250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UBool didSomething = FALSE;
21350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
21450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* preset then read command line options */
21550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options);
21650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
21750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* error handling, printing usage message */
21850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(argc<0) {
21950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fprintf(stderr,
22050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            "error in command line argument \"%s\"\n",
22150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            argv[-argc]);
22250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
22350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if( options[0].doesOccur || options[1].doesOccur) {
22450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      fprintf(stderr, "%s: Output information about the current ICU\n", argv[0]);
22550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      fprintf(stderr, "Options:\n"
22650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              " -h     or  --help                 - Print this help message.\n"
22750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              " -m     or  --millisecond-time     - Print the current UTC time in milliseconds.\n"
22850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              " -d <dir>   or  --icudatadir <dir> - Set the ICU Data Directory\n"
22950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              " -v                                - Print version and configuration information about ICU\n"
23050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              " -L         or  --list-plugins     - List and diagnose issues with ICU Plugins\n"
23150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              " -K         or  --cleanup          - Call u_cleanup() before exitting (will attempt to unload plugins)\n"
23250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              "\n"
23350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              "If no arguments are given, the tool will print ICU version and configuration information.\n"
23450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              );
23550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      fprintf(stderr, "International Components for Unicode %s\n%s\n", U_ICU_VERSION, U_COPYRIGHT_STRING );
23650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
23750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
23850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
23950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(options[2].doesOccur) {
24050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      u_setDataDirectory(options[2].value);
24150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
24250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
24350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(options[5].doesOccur) {
24450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      cmd_millis();
24550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      didSomething=TRUE;
24650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
24750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(options[4].doesOccur) {
24850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      cmd_listplugins();
24950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      didSomething = TRUE;
25050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
251103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
25250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(options[3].doesOccur) {
253103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      cmd_version(FALSE, errorCode);
25450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      didSomething = TRUE;
25550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
256103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
257103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(options[7].doesOccur) {  /* 2nd part of version: cleanup */
258103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      FILE *out = fopen(options[7].value, "w");
259103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      if(out==NULL) {
260103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        fprintf(stderr,"ERR: can't write to XML file %s\n", options[7].value);
261103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return 1;
262103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      }
263103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      /* todo: API for writing DTD? */
264103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
265103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      udbg_writeIcuInfo(out);
266103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      fclose(out);
267103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      didSomething = TRUE;
268103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
269103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
27050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(options[6].doesOccur) {  /* 2nd part of version: cleanup */
27150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      cmd_cleanup();
27250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      didSomething = TRUE;
27350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
274103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
27550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(!didSomething) {
276103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      cmd_version(FALSE, errorCode);  /* at least print the version # */
27750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
27850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
27950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return U_FAILURE(errorCode);
28050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
281