intl/icu/source/tools/icuinfo/icuinfo.cpp

Wed, 31 Dec 2014 07:22:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:22:50 +0100
branch
TOR_BUG_3246
changeset 4
fc2d59ddac77
permissions
-rw-r--r--

Correct previous dual key logic pending first delivery installment.

     1 /*
     2 *******************************************************************************
     3 *
     4 *   Copyright (C) 1999-2012, International Business Machines
     5 *   Corporation and others.  All Rights Reserved.
     6 *
     7 *******************************************************************************
     8 *   file name:  icuinfo.cpp
     9 *   encoding:   US-ASCII
    10 *   tab size:   8 (not used)
    11 *   indentation:4
    12 *
    13 *   created on: 2009-2010
    14 *   created by: Steven R. Loomis
    15 *
    16 *   This program shows some basic info about the current ICU.
    17 */
    19 #include <stdio.h>
    20 #include <stdlib.h>
    21 #include "unicode/utypes.h"
    22 #include "unicode/putil.h"
    23 #include "unicode/uclean.h"
    24 #include "udbgutil.h"
    25 #include "unewdata.h"
    26 #include "cmemory.h"
    27 #include "cstring.h"
    28 #include "uoptions.h"
    29 #include "toolutil.h"
    30 #include "icuplugimp.h"
    31 #include <unicode/uloc.h>
    32 #include <unicode/ucnv.h>
    33 #include "unicode/ucal.h"
    34 #include <unicode/ulocdata.h>
    35 #include "putilimp.h"
    36 #include "unicode/uchar.h"
    38 static UOption options[]={
    39   /*0*/ UOPTION_HELP_H,
    40   /*1*/ UOPTION_HELP_QUESTION_MARK,
    41   /*2*/ UOPTION_ICUDATADIR,
    42   /*3*/ UOPTION_VERBOSE,
    43   /*4*/ UOPTION_DEF("list-plugins", 'L', UOPT_NO_ARG),
    44   /*5*/ UOPTION_DEF("milisecond-time", 'm', UOPT_NO_ARG),
    45   /*6*/ UOPTION_DEF("cleanup", 'K', UOPT_NO_ARG),
    46   /*7*/ UOPTION_DEF("xml", 'x', UOPT_REQUIRES_ARG),
    47 };
    49 static UErrorCode initStatus = U_ZERO_ERROR;
    50 static UBool icuInitted = FALSE;
    52 static void do_init() {
    53     if(!icuInitted) {
    54       u_init(&initStatus);
    55       icuInitted = TRUE;
    56     }
    57 }
    60 void cmd_millis()
    61 {
    62   printf("Milliseconds since Epoch: %.0f\n", uprv_getUTCtime());
    63 }
    65 void cmd_version(UBool /* noLoad */, UErrorCode &errorCode)
    66 {
    68     do_init();
    70     udbg_writeIcuInfo(stdout); /* print the XML format */
    72     union {
    73         uint8_t byte;
    74         uint16_t word;
    75     } u;
    76     u.word=0x0100;
    77     if(U_IS_BIG_ENDIAN==u.byte) {
    78       //printf("U_IS_BIG_ENDIAN: %d\n", U_IS_BIG_ENDIAN);
    79     } else {
    80         fprintf(stderr, "  error: U_IS_BIG_ENDIAN=%d != %d=actual 'is big endian'\n",
    81                 U_IS_BIG_ENDIAN, u.byte);
    82         errorCode=U_INTERNAL_PROGRAM_ERROR;
    83     }
    85     if(U_SIZEOF_WCHAR_T==sizeof(wchar_t)) {
    86       //printf("U_SIZEOF_WCHAR_T: %d\n", U_SIZEOF_WCHAR_T);
    87     } else {
    88         fprintf(stderr, "  error: U_SIZEOF_WCHAR_T=%d != %d=sizeof(wchar_t)\n",
    89                 U_SIZEOF_WCHAR_T, (int)sizeof(wchar_t));
    90         errorCode=U_INTERNAL_PROGRAM_ERROR;
    91     }
    93     int charsetFamily;
    94     if('A'==0x41) {
    95         charsetFamily=U_ASCII_FAMILY;
    96     } else if('A'==0xc1) {
    97         charsetFamily=U_EBCDIC_FAMILY;
    98     } else {
    99         charsetFamily=-1;  // unknown
   100     }
   101     if(U_CHARSET_FAMILY==charsetFamily) {
   102       //printf("U_CHARSET_FAMILY: %d\n", U_CHARSET_FAMILY);
   103     } else {
   104         fprintf(stderr, "  error: U_CHARSET_FAMILY=%d != %d=actual charset family\n",
   105                 U_CHARSET_FAMILY, charsetFamily);
   106         errorCode=U_INTERNAL_PROGRAM_ERROR;
   107     }
   109     printf("\n\nICU Initialization returned: %s\n", u_errorName(initStatus));
   112 #if U_ENABLE_DYLOAD
   113     const char *pluginFile = uplug_getPluginFile();
   114     printf("Plugin file is: %s\n", (pluginFile&&*pluginFile)?pluginFile:"(not set. try setting ICU_PLUGINS to a directory.)");
   115 #else
   116     fprintf(stderr, "Dynamic Loading: is disabled. No plugins will be loaded at start-up.\n");
   117 #endif
   118 }
   120 void cmd_cleanup()
   121 {
   122     u_cleanup();
   123     fprintf(stdout, "ICU u_cleanup() called.\n");
   124 }
   127 void cmd_listplugins() {
   128     int32_t i;
   129     UPlugData *plug;
   131     do_init();
   132     printf("ICU Initialized: u_init() returned %s\n", u_errorName(initStatus));
   134     printf("Plugins: \n");
   135     printf(    "# %6s   %s \n",
   136                        "Level",
   137                        "Name" );
   138     printf(    "    %10s:%-10s\n",
   139                        "Library",
   140                        "Symbol"
   141             );
   144     printf(    "       config| (configuration string)\n");
   145     printf(    " >>>   Error          | Explanation \n");
   146     printf(    "-----------------------------------\n");
   148     for(i=0;(plug=uplug_getPlugInternal(i))!=NULL;i++) {
   149         UErrorCode libStatus = U_ZERO_ERROR;
   150         const char *name = uplug_getPlugName(plug);
   151         const char *sym = uplug_getSymbolName(plug);
   152         const char *lib = uplug_getLibraryName(plug, &libStatus);
   153         const char *config = uplug_getConfiguration(plug);
   154         UErrorCode loadStatus = uplug_getPlugLoadStatus(plug);
   155         const char *message = NULL;
   157         printf("\n#%d  %-6s %s \n",
   158             i+1,
   159             udbg_enumName(UDBG_UPlugLevel,(int32_t)uplug_getPlugLevel(plug)),
   160             name!=NULL?(*name?name:"this plugin did not call uplug_setPlugName()"):"(null)"
   161         );
   162         printf("    plugin| %10s:%-10s\n",
   163             (U_SUCCESS(libStatus)?(lib!=NULL?lib:"(null)"):u_errorName(libStatus)),
   164             sym!=NULL?sym:"(null)"
   165         );
   167         if(config!=NULL&&*config) {
   168             printf("    config| %s\n", config);
   169         }
   171         switch(loadStatus) {
   172             case U_PLUGIN_CHANGED_LEVEL_WARNING:
   173                 message = "Note: This plugin changed the system level (by allocating memory or calling something which does). Later plugins may not load.";
   174                 break;
   176             case U_PLUGIN_DIDNT_SET_LEVEL:
   177                 message = "Error: This plugin did not call uplug_setPlugLevel during QUERY.";
   178                 break;
   180             case U_PLUGIN_TOO_HIGH:
   181                 message = "Error: This plugin couldn't load because the system level was too high. Try loading this plugin earlier.";
   182                 break;
   184             case U_ZERO_ERROR: 
   185                 message = NULL; /* no message */
   186                 break;
   187             default:
   188                 if(U_FAILURE(loadStatus)) {
   189                     message = "error loading:";
   190                 } else {
   191                     message = "warning during load:";
   192                 }            
   193         }
   195         if(message!=NULL) {
   196             printf("\\\\\\ status| %s\n"
   197                    "/// %s\n", u_errorName(loadStatus), message);
   198         }
   200     }
   201 	if(i==0) {
   202 		printf("No plugins loaded.\n");
   203 	}
   205 }
   209 extern int
   210 main(int argc, char* argv[]) {
   211     UErrorCode errorCode = U_ZERO_ERROR;
   212     UBool didSomething = FALSE;
   214     /* preset then read command line options */
   215     argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options);
   217     /* error handling, printing usage message */
   218     if(argc<0) {
   219         fprintf(stderr,
   220             "error in command line argument \"%s\"\n",
   221             argv[-argc]);
   222     }
   223     if( options[0].doesOccur || options[1].doesOccur) {
   224       fprintf(stderr, "%s: Output information about the current ICU\n", argv[0]);
   225       fprintf(stderr, "Options:\n"
   226               " -h     or  --help                 - Print this help message.\n"
   227               " -m     or  --millisecond-time     - Print the current UTC time in milliseconds.\n"
   228               " -d <dir>   or  --icudatadir <dir> - Set the ICU Data Directory\n"
   229               " -v                                - Print version and configuration information about ICU\n"
   230               " -L         or  --list-plugins     - List and diagnose issues with ICU Plugins\n"
   231               " -K         or  --cleanup          - Call u_cleanup() before exitting (will attempt to unload plugins)\n"
   232               "\n"
   233               "If no arguments are given, the tool will print ICU version and configuration information.\n"
   234               );
   235       fprintf(stderr, "International Components for Unicode %s\n%s\n", U_ICU_VERSION, U_COPYRIGHT_STRING );
   236       return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
   237     }
   239     if(options[2].doesOccur) {
   240       u_setDataDirectory(options[2].value);
   241     }
   243     if(options[5].doesOccur) {
   244       cmd_millis();
   245       didSomething=TRUE;
   246     } 
   247     if(options[4].doesOccur) {
   248       cmd_listplugins();
   249       didSomething = TRUE;
   250     }
   252     if(options[3].doesOccur) {
   253       cmd_version(FALSE, errorCode);
   254       didSomething = TRUE;
   255     }
   257     if(options[7].doesOccur) {  /* 2nd part of version: cleanup */
   258       FILE *out = fopen(options[7].value, "w");
   259       if(out==NULL) {
   260         fprintf(stderr,"ERR: can't write to XML file %s\n", options[7].value);
   261         return 1;
   262       }
   263       /* todo: API for writing DTD? */
   264       fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
   265       udbg_writeIcuInfo(out);
   266       fclose(out);
   267       didSomething = TRUE;
   268     }
   270     if(options[6].doesOccur) {  /* 2nd part of version: cleanup */
   271       cmd_cleanup();
   272       didSomething = TRUE;
   273     }
   275     if(!didSomething) {
   276       cmd_version(FALSE, errorCode);  /* at least print the version # */
   277     }
   279     return U_FAILURE(errorCode);
   280 }

mercurial