]>
Commit | Line | Data |
---|---|---|
729e4ab9 A |
1 | /* |
2 | ******************************************************************************* | |
3 | * | |
2ca993e8 | 4 | * Copyright (C) 1999-2016, International Business Machines |
729e4ab9 A |
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 | */ | |
18 | ||
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" | |
37 | ||
38 | static UOption options[]={ | |
39 | /*0*/ UOPTION_HELP_H, | |
40 | /*1*/ UOPTION_HELP_QUESTION_MARK, | |
41 | /*2*/ UOPTION_ICUDATADIR, | |
42 | /*3*/ UOPTION_VERBOSE, | |
2ca993e8 | 43 | /*4*/ UOPTION_DEF("list-plugins", 'L', UOPT_NO_ARG), // may be a no-op if disabled |
729e4ab9 A |
44 | /*5*/ UOPTION_DEF("milisecond-time", 'm', UOPT_NO_ARG), |
45 | /*6*/ UOPTION_DEF("cleanup", 'K', UOPT_NO_ARG), | |
4388f060 | 46 | /*7*/ UOPTION_DEF("xml", 'x', UOPT_REQUIRES_ARG), |
729e4ab9 A |
47 | }; |
48 | ||
49 | static UErrorCode initStatus = U_ZERO_ERROR; | |
50 | static UBool icuInitted = FALSE; | |
51 | ||
52 | static void do_init() { | |
53 | if(!icuInitted) { | |
54 | u_init(&initStatus); | |
55 | icuInitted = TRUE; | |
56 | } | |
57 | } | |
58 | ||
729e4ab9 A |
59 | |
60 | void cmd_millis() | |
61 | { | |
62 | printf("Milliseconds since Epoch: %.0f\n", uprv_getUTCtime()); | |
63 | } | |
64 | ||
4388f060 | 65 | void cmd_version(UBool /* noLoad */, UErrorCode &errorCode) |
729e4ab9 | 66 | { |
4388f060 | 67 | |
729e4ab9 | 68 | do_init(); |
4388f060 A |
69 | |
70 | udbg_writeIcuInfo(stdout); /* print the XML format */ | |
729e4ab9 | 71 | |
4388f060 A |
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; | |
729e4ab9 | 83 | } |
729e4ab9 | 84 | |
4388f060 A |
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; | |
729e4ab9 | 91 | } |
4388f060 A |
92 | |
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 | |
729e4ab9 | 100 | } |
4388f060 A |
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 | } | |
108 | ||
109 | printf("\n\nICU Initialization returned: %s\n", u_errorName(initStatus)); | |
110 | ||
2ca993e8 A |
111 | |
112 | #if UCONFIG_ENABLE_PLUGINS | |
729e4ab9 A |
113 | #if U_ENABLE_DYLOAD |
114 | const char *pluginFile = uplug_getPluginFile(); | |
115 | printf("Plugin file is: %s\n", (pluginFile&&*pluginFile)?pluginFile:"(not set. try setting ICU_PLUGINS to a directory.)"); | |
116 | #else | |
117 | fprintf(stderr, "Dynamic Loading: is disabled. No plugins will be loaded at start-up.\n"); | |
118 | #endif | |
2ca993e8 A |
119 | #else |
120 | fprintf(stderr, "Plugins are disabled.\n"); | |
121 | #endif | |
729e4ab9 A |
122 | } |
123 | ||
124 | void cmd_cleanup() | |
125 | { | |
126 | u_cleanup(); | |
51004dcb | 127 | fprintf(stdout, "ICU u_cleanup() called.\n"); |
729e4ab9 A |
128 | } |
129 | ||
130 | ||
131 | void cmd_listplugins() { | |
2ca993e8 | 132 | #if UCONFIG_ENABLE_PLUGINS |
729e4ab9 A |
133 | int32_t i; |
134 | UPlugData *plug; | |
135 | ||
136 | do_init(); | |
137 | printf("ICU Initialized: u_init() returned %s\n", u_errorName(initStatus)); | |
138 | ||
139 | printf("Plugins: \n"); | |
140 | printf( "# %6s %s \n", | |
141 | "Level", | |
142 | "Name" ); | |
143 | printf( " %10s:%-10s\n", | |
144 | "Library", | |
145 | "Symbol" | |
146 | ); | |
147 | ||
148 | ||
149 | printf( " config| (configuration string)\n"); | |
150 | printf( " >>> Error | Explanation \n"); | |
151 | printf( "-----------------------------------\n"); | |
152 | ||
153 | for(i=0;(plug=uplug_getPlugInternal(i))!=NULL;i++) { | |
154 | UErrorCode libStatus = U_ZERO_ERROR; | |
155 | const char *name = uplug_getPlugName(plug); | |
156 | const char *sym = uplug_getSymbolName(plug); | |
157 | const char *lib = uplug_getLibraryName(plug, &libStatus); | |
158 | const char *config = uplug_getConfiguration(plug); | |
159 | UErrorCode loadStatus = uplug_getPlugLoadStatus(plug); | |
160 | const char *message = NULL; | |
161 | ||
162 | printf("\n#%d %-6s %s \n", | |
163 | i+1, | |
164 | udbg_enumName(UDBG_UPlugLevel,(int32_t)uplug_getPlugLevel(plug)), | |
165 | name!=NULL?(*name?name:"this plugin did not call uplug_setPlugName()"):"(null)" | |
166 | ); | |
167 | printf(" plugin| %10s:%-10s\n", | |
168 | (U_SUCCESS(libStatus)?(lib!=NULL?lib:"(null)"):u_errorName(libStatus)), | |
169 | sym!=NULL?sym:"(null)" | |
170 | ); | |
171 | ||
172 | if(config!=NULL&&*config) { | |
173 | printf(" config| %s\n", config); | |
174 | } | |
175 | ||
176 | switch(loadStatus) { | |
177 | case U_PLUGIN_CHANGED_LEVEL_WARNING: | |
178 | message = "Note: This plugin changed the system level (by allocating memory or calling something which does). Later plugins may not load."; | |
179 | break; | |
180 | ||
181 | case U_PLUGIN_DIDNT_SET_LEVEL: | |
182 | message = "Error: This plugin did not call uplug_setPlugLevel during QUERY."; | |
183 | break; | |
184 | ||
185 | case U_PLUGIN_TOO_HIGH: | |
186 | message = "Error: This plugin couldn't load because the system level was too high. Try loading this plugin earlier."; | |
187 | break; | |
188 | ||
189 | case U_ZERO_ERROR: | |
190 | message = NULL; /* no message */ | |
191 | break; | |
192 | default: | |
193 | if(U_FAILURE(loadStatus)) { | |
194 | message = "error loading:"; | |
195 | } else { | |
196 | message = "warning during load:"; | |
197 | } | |
198 | } | |
199 | ||
200 | if(message!=NULL) { | |
201 | printf("\\\\\\ status| %s\n" | |
202 | "/// %s\n", u_errorName(loadStatus), message); | |
203 | } | |
204 | ||
205 | } | |
206 | if(i==0) { | |
207 | printf("No plugins loaded.\n"); | |
208 | } | |
2ca993e8 | 209 | #endif |
729e4ab9 A |
210 | } |
211 | ||
212 | ||
213 | ||
214 | extern int | |
215 | main(int argc, char* argv[]) { | |
216 | UErrorCode errorCode = U_ZERO_ERROR; | |
217 | UBool didSomething = FALSE; | |
218 | ||
219 | /* preset then read command line options */ | |
2ca993e8 | 220 | argc=u_parseArgs(argc, argv, UPRV_LENGTHOF(options), options); |
729e4ab9 A |
221 | |
222 | /* error handling, printing usage message */ | |
223 | if(argc<0) { | |
224 | fprintf(stderr, | |
225 | "error in command line argument \"%s\"\n", | |
226 | argv[-argc]); | |
227 | } | |
228 | if( options[0].doesOccur || options[1].doesOccur) { | |
229 | fprintf(stderr, "%s: Output information about the current ICU\n", argv[0]); | |
230 | fprintf(stderr, "Options:\n" | |
231 | " -h or --help - Print this help message.\n" | |
232 | " -m or --millisecond-time - Print the current UTC time in milliseconds.\n" | |
233 | " -d <dir> or --icudatadir <dir> - Set the ICU Data Directory\n" | |
234 | " -v - Print version and configuration information about ICU\n" | |
2ca993e8 | 235 | #if UCONFIG_ENABLE_PLUGINS |
729e4ab9 | 236 | " -L or --list-plugins - List and diagnose issues with ICU Plugins\n" |
2ca993e8 | 237 | #endif |
729e4ab9 A |
238 | " -K or --cleanup - Call u_cleanup() before exitting (will attempt to unload plugins)\n" |
239 | "\n" | |
240 | "If no arguments are given, the tool will print ICU version and configuration information.\n" | |
241 | ); | |
242 | fprintf(stderr, "International Components for Unicode %s\n%s\n", U_ICU_VERSION, U_COPYRIGHT_STRING ); | |
243 | return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; | |
244 | } | |
245 | ||
246 | if(options[2].doesOccur) { | |
247 | u_setDataDirectory(options[2].value); | |
248 | } | |
249 | ||
250 | if(options[5].doesOccur) { | |
251 | cmd_millis(); | |
252 | didSomething=TRUE; | |
253 | } | |
254 | if(options[4].doesOccur) { | |
255 | cmd_listplugins(); | |
256 | didSomething = TRUE; | |
257 | } | |
4388f060 | 258 | |
729e4ab9 | 259 | if(options[3].doesOccur) { |
4388f060 | 260 | cmd_version(FALSE, errorCode); |
729e4ab9 A |
261 | didSomething = TRUE; |
262 | } | |
4388f060 A |
263 | |
264 | if(options[7].doesOccur) { /* 2nd part of version: cleanup */ | |
265 | FILE *out = fopen(options[7].value, "w"); | |
266 | if(out==NULL) { | |
267 | fprintf(stderr,"ERR: can't write to XML file %s\n", options[7].value); | |
268 | return 1; | |
269 | } | |
270 | /* todo: API for writing DTD? */ | |
271 | fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); | |
272 | udbg_writeIcuInfo(out); | |
273 | fclose(out); | |
274 | didSomething = TRUE; | |
275 | } | |
276 | ||
729e4ab9 A |
277 | if(options[6].doesOccur) { /* 2nd part of version: cleanup */ |
278 | cmd_cleanup(); | |
279 | didSomething = TRUE; | |
280 | } | |
4388f060 | 281 | |
729e4ab9 | 282 | if(!didSomething) { |
4388f060 | 283 | cmd_version(FALSE, errorCode); /* at least print the version # */ |
729e4ab9 A |
284 | } |
285 | ||
286 | return U_FAILURE(errorCode); | |
287 | } |