16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 1999-2012, International Business Machines
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Corporation and others.  All Rights Reserved.
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*******************************************************************************
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   file name:  icuinfo.cpp
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   encoding:   US-ASCII
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   tab size:   8 (not used)
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   indentation:4
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   created on: 2009-2010
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   created by: Steven R. Loomis
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   This program shows some basic info about the current ICU.
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h>
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/putil.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uclean.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "udbgutil.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unewdata.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uoptions.h"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "toolutil.h"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "icuplugimp.h"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/uloc.h>
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/ucnv.h>
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucal.h"
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unicode/ulocdata.h>
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "putilimp.h"
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h"
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UOption options[]={
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*0*/ UOPTION_HELP_H,
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*1*/ UOPTION_HELP_QUESTION_MARK,
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*2*/ UOPTION_ICUDATADIR,
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*3*/ UOPTION_VERBOSE,
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*4*/ UOPTION_DEF("list-plugins", 'L', UOPT_NO_ARG),
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*5*/ UOPTION_DEF("milisecond-time", 'm', UOPT_NO_ARG),
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*6*/ UOPTION_DEF("cleanup", 'K', UOPT_NO_ARG),
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*7*/ UOPTION_DEF("xml", 'x', UOPT_REQUIRES_ARG),
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UErrorCode initStatus = U_ZERO_ERROR;
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool icuInitted = FALSE;
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void do_init() {
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!icuInitted) {
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      u_init(&initStatus);
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      icuInitted = TRUE;
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid cmd_millis()
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  printf("Milliseconds since Epoch: %.0f\n", uprv_getUTCtime());
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid cmd_version(UBool /* noLoad */, UErrorCode &errorCode)
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    do_init();
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    udbg_writeIcuInfo(stdout); /* print the XML format */
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    union {
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uint8_t byte;
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uint16_t word;
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } u;
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u.word=0x0100;
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_IS_BIG_ENDIAN==u.byte) {
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      //printf("U_IS_BIG_ENDIAN: %d\n", U_IS_BIG_ENDIAN);
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "  error: U_IS_BIG_ENDIAN=%d != %d=actual 'is big endian'\n",
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                U_IS_BIG_ENDIAN, u.byte);
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_INTERNAL_PROGRAM_ERROR;
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_SIZEOF_WCHAR_T==sizeof(wchar_t)) {
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      //printf("U_SIZEOF_WCHAR_T: %d\n", U_SIZEOF_WCHAR_T);
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "  error: U_SIZEOF_WCHAR_T=%d != %d=sizeof(wchar_t)\n",
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                U_SIZEOF_WCHAR_T, (int)sizeof(wchar_t));
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_INTERNAL_PROGRAM_ERROR;
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int charsetFamily;
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if('A'==0x41) {
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        charsetFamily=U_ASCII_FAMILY;
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if('A'==0xc1) {
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        charsetFamily=U_EBCDIC_FAMILY;
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        charsetFamily=-1;  // unknown
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_CHARSET_FAMILY==charsetFamily) {
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      //printf("U_CHARSET_FAMILY: %d\n", U_CHARSET_FAMILY);
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "  error: U_CHARSET_FAMILY=%d != %d=actual charset family\n",
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                U_CHARSET_FAMILY, charsetFamily);
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_INTERNAL_PROGRAM_ERROR;
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("\n\nICU Initialization returned: %s\n", u_errorName(initStatus));
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_ENABLE_DYLOAD
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *pluginFile = uplug_getPluginFile();
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("Plugin file is: %s\n", (pluginFile&&*pluginFile)?pluginFile:"(not set. try setting ICU_PLUGINS to a directory.)");
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr, "Dynamic Loading: is disabled. No plugins will be loaded at start-up.\n");
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid cmd_cleanup()
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_cleanup();
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stdout, "ICU u_cleanup() called.\n");
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid cmd_listplugins() {
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UPlugData *plug;
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    do_init();
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("ICU Initialized: u_init() returned %s\n", u_errorName(initStatus));
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("Plugins: \n");
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf(    "# %6s   %s \n",
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       "Level",
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       "Name" );
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf(    "    %10s:%-10s\n",
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       "Library",
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       "Symbol"
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            );
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf(    "       config| (configuration string)\n");
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf(    " >>>   Error          | Explanation \n");
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf(    "-----------------------------------\n");
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0;(plug=uplug_getPlugInternal(i))!=NULL;i++) {
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode libStatus = U_ZERO_ERROR;
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char *name = uplug_getPlugName(plug);
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char *sym = uplug_getSymbolName(plug);
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char *lib = uplug_getLibraryName(plug, &libStatus);
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char *config = uplug_getConfiguration(plug);
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode loadStatus = uplug_getPlugLoadStatus(plug);
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char *message = NULL;
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        printf("\n#%d  %-6s %s \n",
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            i+1,
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            udbg_enumName(UDBG_UPlugLevel,(int32_t)uplug_getPlugLevel(plug)),
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            name!=NULL?(*name?name:"this plugin did not call uplug_setPlugName()"):"(null)"
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        );
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        printf("    plugin| %10s:%-10s\n",
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (U_SUCCESS(libStatus)?(lib!=NULL?lib:"(null)"):u_errorName(libStatus)),
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sym!=NULL?sym:"(null)"
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        );
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(config!=NULL&&*config) {
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printf("    config| %s\n", config);
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        switch(loadStatus) {
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            case U_PLUGIN_CHANGED_LEVEL_WARNING:
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                message = "Note: This plugin changed the system level (by allocating memory or calling something which does). Later plugins may not load.";
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            case U_PLUGIN_DIDNT_SET_LEVEL:
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                message = "Error: This plugin did not call uplug_setPlugLevel during QUERY.";
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            case U_PLUGIN_TOO_HIGH:
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                message = "Error: This plugin couldn't load because the system level was too high. Try loading this plugin earlier.";
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            case U_ZERO_ERROR:
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                message = NULL; /* no message */
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            default:
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(U_FAILURE(loadStatus)) {
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    message = "error loading:";
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else {
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    message = "warning during load:";
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(message!=NULL) {
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printf("\\\\\\ status| %s\n"
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   "/// %s\n", u_errorName(loadStatus), message);
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	if(i==0) {
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org		printf("No plugins loaded.\n");
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	}
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgextern int
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgmain(int argc, char* argv[]) {
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool didSomething = FALSE;
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* preset then read command line options */
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options);
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* error handling, printing usage message */
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(argc<0) {
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr,
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "error in command line argument \"%s\"\n",
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            argv[-argc]);
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( options[0].doesOccur || options[1].doesOccur) {
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      fprintf(stderr, "%s: Output information about the current ICU\n", argv[0]);
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      fprintf(stderr, "Options:\n"
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              " -h     or  --help                 - Print this help message.\n"
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              " -m     or  --millisecond-time     - Print the current UTC time in milliseconds.\n"
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              " -d <dir>   or  --icudatadir <dir> - Set the ICU Data Directory\n"
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              " -v                                - Print version and configuration information about ICU\n"
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              " -L         or  --list-plugins     - List and diagnose issues with ICU Plugins\n"
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              " -K         or  --cleanup          - Call u_cleanup() before exitting (will attempt to unload plugins)\n"
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "\n"
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "If no arguments are given, the tool will print ICU version and configuration information.\n"
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              );
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      fprintf(stderr, "International Components for Unicode %s\n%s\n", U_ICU_VERSION, U_COPYRIGHT_STRING );
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[2].doesOccur) {
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      u_setDataDirectory(options[2].value);
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[5].doesOccur) {
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      cmd_millis();
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      didSomething=TRUE;
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[4].doesOccur) {
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      cmd_listplugins();
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      didSomething = TRUE;
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[3].doesOccur) {
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      cmd_version(FALSE, errorCode);
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      didSomething = TRUE;
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[7].doesOccur) {  /* 2nd part of version: cleanup */
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      FILE *out = fopen(options[7].value, "w");
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if(out==NULL) {
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr,"ERR: can't write to XML file %s\n", options[7].value);
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 1;
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      }
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      /* todo: API for writing DTD? */
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      udbg_writeIcuInfo(out);
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      fclose(out);
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      didSomething = TRUE;
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[6].doesOccur) {  /* 2nd part of version: cleanup */
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      cmd_cleanup();
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      didSomething = TRUE;
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!didSomething) {
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      cmd_version(FALSE, errorCode);  /* at least print the version # */
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return U_FAILURE(errorCode);
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
281