]>
Commit | Line | Data |
---|---|---|
b75a7d8f A |
1 | /* |
2 | ********************************************************************** | |
73c04bcf | 3 | * Copyright (C) 1996-2006, International Business Machines |
b75a7d8f A |
4 | * Corporation and others. All Rights Reserved. |
5 | ********************************************************************** | |
6 | * | |
7 | * FILE NAME : UTYPES.H (formerly ptypes.h) | |
8 | * | |
9 | * Date Name Description | |
10 | * 12/11/96 helena Creation. | |
11 | * 02/27/97 aliu Added typedefs for UClassID, int8, int16, int32, | |
12 | * uint8, uint16, and uint32. | |
13 | * 04/01/97 aliu Added XP_CPLUSPLUS and modified to work under C as | |
14 | * well as C++. | |
15 | * Modified to use memcpy() for uprv_arrayCopy() fns. | |
16 | * 04/14/97 aliu Added TPlatformUtilities. | |
17 | * 05/07/97 aliu Added import/export specifiers (replacing the old | |
18 | * broken EXT_CLASS). Added version number for our | |
19 | * code. Cleaned up header. | |
20 | * 6/20/97 helena Java class name change. | |
21 | * 08/11/98 stephen UErrorCode changed from typedef to enum | |
22 | * 08/12/98 erm Changed T_ANALYTIC_PACKAGE_VERSION to 3 | |
23 | * 08/14/98 stephen Added uprv_arrayCopy() for int8_t, int16_t, int32_t | |
24 | * 12/09/98 jfitz Added BUFFER_OVERFLOW_ERROR (bug 1100066) | |
25 | * 04/20/99 stephen Cleaned up & reworked for autoconf. | |
26 | * Renamed to utypes.h. | |
27 | * 05/05/99 stephen Changed to use <inttypes.h> | |
28 | * 12/07/99 helena Moved copyright notice string from ucnv_bld.h here. | |
29 | ******************************************************************************* | |
30 | */ | |
31 | ||
32 | #ifndef UTYPES_H | |
33 | #define UTYPES_H | |
34 | ||
35 | ||
36 | #include "unicode/umachine.h" | |
37 | #include "unicode/utf.h" | |
38 | #include "unicode/uversion.h" | |
39 | #include "unicode/uconfig.h" | |
40 | ||
73c04bcf A |
41 | #if !U_DEFAULT_SHOW_DRAFT && !defined(U_SHOW_DRAFT_API) |
42 | #define U_HIDE_DRAFT_API 1 | |
43 | #endif | |
44 | ||
374ca955 A |
45 | #ifdef U_HIDE_DRAFT_API |
46 | #include "unicode/udraft.h" | |
47 | #endif | |
48 | ||
49 | #ifdef U_HIDE_DEPRECATED_API | |
50 | #include "unicode/udeprctd.h" | |
51 | #endif | |
52 | ||
53 | #ifdef U_HIDE_DEPRECATED_API | |
54 | #include "unicode/uobslete.h" | |
55 | #endif | |
56 | ||
73c04bcf A |
57 | #ifdef U_HIDE_INTERNAL_API |
58 | #include "unicode/uintrnal.h" | |
59 | #endif | |
60 | ||
61 | #ifdef U_HIDE_SYSTEM_API | |
62 | #include "unicode/usystem.h" | |
63 | #endif | |
374ca955 | 64 | |
b75a7d8f A |
65 | /*! |
66 | * \file | |
67 | * \brief Basic definitions for ICU, for both C and C++ APIs | |
68 | * | |
69 | * This file defines basic types, constants, and enumerations directly or | |
70 | * indirectly by including other header files, especially utf.h for the | |
71 | * basic character and string definitions and umachine.h for consistent | |
72 | * integer and other types. | |
73 | */ | |
74 | ||
75 | /*===========================================================================*/ | |
76 | /* char Character set family */ | |
77 | /*===========================================================================*/ | |
78 | ||
79 | /** | |
80 | * U_CHARSET_FAMILY is equal to this value when the platform is an ASCII based platform. | |
81 | * @stable ICU 2.0 | |
82 | */ | |
83 | #define U_ASCII_FAMILY 0 | |
84 | ||
85 | /** | |
86 | * U_CHARSET_FAMILY is equal to this value when the platform is an EBCDIC based platform. | |
87 | * @stable ICU 2.0 | |
88 | */ | |
89 | #define U_EBCDIC_FAMILY 1 | |
90 | ||
91 | /** | |
92 | * \def U_CHARSET_FAMILY | |
93 | * | |
94 | * <p>These definitions allow to specify the encoding of text | |
95 | * in the char data type as defined by the platform and the compiler. | |
96 | * It is enough to determine the code point values of "invariant characters", | |
97 | * which are the ones shared by all encodings that are in use | |
98 | * on a given platform.</p> | |
99 | * | |
100 | * <p>Those "invariant characters" should be all the uppercase and lowercase | |
101 | * latin letters, the digits, the space, and "basic punctuation". | |
374ca955 | 102 | * Also, '\\n', '\\r', '\\t' should be available.</p> |
b75a7d8f A |
103 | * |
104 | * <p>The list of "invariant characters" is:<br> | |
105 | * \code | |
106 | * A-Z a-z 0-9 SPACE " % & ' ( ) * + , - . / : ; < = > ? _ | |
107 | * \endcode | |
108 | * <br> | |
109 | * (52 letters + 10 numbers + 20 punc/sym/space = 82 total)</p> | |
110 | * | |
111 | * <p>This matches the IBM Syntactic Character Set (CS 640).</p> | |
112 | * | |
113 | * <p>In other words, all the graphic characters in 7-bit ASCII should | |
114 | * be safely accessible except the following:</p> | |
115 | * | |
116 | * \code | |
117 | * '\' <backslash> | |
118 | * '[' <left bracket> | |
119 | * ']' <right bracket> | |
120 | * '{' <left brace> | |
121 | * '}' <right brace> | |
122 | * '^' <circumflex> | |
123 | * '~' <tilde> | |
124 | * '!' <exclamation mark> | |
125 | * '#' <number sign> | |
126 | * '|' <vertical line> | |
127 | * '$' <dollar sign> | |
128 | * '@' <commercial at> | |
129 | * '`' <grave accent> | |
130 | * \endcode | |
131 | * @stable ICU 2.0 | |
132 | */ | |
133 | ||
134 | #ifndef U_CHARSET_FAMILY | |
135 | # define U_CHARSET_FAMILY 0 | |
136 | #endif | |
137 | ||
138 | /*===========================================================================*/ | |
139 | /* ICUDATA naming scheme */ | |
140 | /*===========================================================================*/ | |
141 | ||
142 | /** | |
143 | * \def U_ICUDATA_TYPE_LETTER | |
144 | * | |
145 | * This is a platform-dependent string containing one letter: | |
146 | * - b for big-endian, ASCII-family platforms | |
147 | * - l for little-endian, ASCII-family platforms | |
148 | * - e for big-endian, EBCDIC-family platforms | |
149 | * This letter is part of the common data file name. | |
150 | * @stable ICU 2.0 | |
151 | */ | |
152 | ||
b75a7d8f A |
153 | /** |
154 | * \def U_ICUDATA_TYPE_LITLETTER | |
155 | * The non-string form of U_ICUDATA_TYPE_LETTER | |
156 | * @stable ICU 2.0 | |
157 | */ | |
158 | #if U_CHARSET_FAMILY | |
159 | # if U_IS_BIG_ENDIAN | |
160 | /* EBCDIC - should always be BE */ | |
161 | # define U_ICUDATA_TYPE_LETTER "e" | |
162 | # define U_ICUDATA_TYPE_LITLETTER e | |
163 | # else | |
164 | # error "Don't know what to do with little endian EBCDIC!" | |
165 | # define U_ICUDATA_TYPE_LETTER "x" | |
166 | # define U_ICUDATA_TYPE_LITLETTER x | |
167 | # endif | |
168 | #else | |
169 | # if U_IS_BIG_ENDIAN | |
170 | /* Big-endian ASCII */ | |
171 | # define U_ICUDATA_TYPE_LETTER "b" | |
172 | # define U_ICUDATA_TYPE_LITLETTER b | |
173 | # else | |
174 | /* Little-endian ASCII */ | |
175 | # define U_ICUDATA_TYPE_LETTER "l" | |
176 | # define U_ICUDATA_TYPE_LITLETTER l | |
177 | # endif | |
178 | #endif | |
179 | ||
180 | /** | |
181 | * A single string literal containing the icudata stub name. i.e. 'icudt18e' for | |
182 | * ICU 1.8.x on EBCDIC, etc.. | |
183 | * @stable ICU 2.0 | |
184 | */ | |
185 | #define U_ICUDATA_NAME "icudt" U_ICU_VERSION_SHORT U_ICUDATA_TYPE_LETTER | |
186 | ||
187 | ||
188 | /** | |
189 | * U_ICU_ENTRY_POINT is the name of the DLL entry point to the ICU data library. | |
190 | * Defined as a literal, not a string. | |
191 | * Tricky Preprocessor use - ## operator replaces macro paramters with the literal string | |
192 | * from the corresponding macro invocation, _before_ other macro substitutions. | |
193 | * Need a nested #defines to get the actual version numbers rather than | |
194 | * the literal text U_ICU_VERSION_MAJOR_NUM into the name. | |
195 | * The net result will be something of the form | |
196 | * #define U_ICU_ENTRY_POINT icudt19_dat | |
197 | * @stable ICU 2.4 | |
198 | */ | |
199 | #define U_ICUDATA_ENTRY_POINT U_DEF2_ICUDATA_ENTRY_POINT(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM) | |
73c04bcf | 200 | |
b75a7d8f | 201 | /** |
73c04bcf | 202 | * Do not use. |
b75a7d8f A |
203 | * @internal |
204 | */ | |
205 | #define U_DEF2_ICUDATA_ENTRY_POINT(major, minor) U_DEF_ICUDATA_ENTRY_POINT(major, minor) | |
206 | /** | |
73c04bcf | 207 | * Do not use. |
b75a7d8f A |
208 | * @internal |
209 | */ | |
210 | #define U_DEF_ICUDATA_ENTRY_POINT(major, minor) icudt##major##minor##_dat | |
211 | ||
212 | /** | |
213 | * \def U_CALLCONV | |
214 | * Similar to U_CDECL_BEGIN/U_CDECL_END, this qualifier is necessary | |
215 | * in callback function typedefs to make sure that the calling convention | |
216 | * is compatible. | |
217 | * | |
218 | * This is only used for non-ICU-API functions. | |
219 | * When a function is a public ICU API, | |
220 | * you must use the U_CAPI and U_EXPORT2 qualifiers. | |
221 | * @stable ICU 2.0 | |
222 | */ | |
223 | #if defined(OS390) && (__COMPILER_VER__ < 0x41020000) && defined(XP_CPLUSPLUS) | |
224 | # define U_CALLCONV __cdecl | |
225 | #else | |
226 | # define U_CALLCONV U_EXPORT2 | |
227 | #endif | |
228 | ||
229 | /** | |
230 | * \def NULL | |
231 | * Define NULL if necessary, to 0 for C++ and to ((void *)0) for C. | |
232 | * @stable ICU 2.0 | |
233 | */ | |
234 | #ifndef NULL | |
235 | #ifdef XP_CPLUSPLUS | |
236 | #define NULL 0 | |
237 | #else | |
238 | #define NULL ((void *)0) | |
239 | #endif | |
240 | #endif | |
241 | ||
242 | /*===========================================================================*/ | |
243 | /* Calendar/TimeZone data types */ | |
244 | /*===========================================================================*/ | |
245 | ||
246 | /** | |
247 | * Date and Time data type. | |
248 | * This is a primitive data type that holds the date and time | |
249 | * as the number of milliseconds since 1970-jan-01, 00:00 UTC. | |
250 | * UTC leap seconds are ignored. | |
251 | * @stable ICU 2.0 | |
252 | */ | |
253 | typedef double UDate; | |
254 | ||
255 | /** The number of milliseconds per second @stable ICU 2.0 */ | |
256 | #define U_MILLIS_PER_SECOND (1000) | |
257 | /** The number of milliseconds per minute @stable ICU 2.0 */ | |
258 | #define U_MILLIS_PER_MINUTE (60000) | |
259 | /** The number of milliseconds per hour @stable ICU 2.0 */ | |
260 | #define U_MILLIS_PER_HOUR (3600000) | |
261 | /** The number of milliseconds per day @stable ICU 2.0 */ | |
262 | #define U_MILLIS_PER_DAY (86400000) | |
263 | ||
264 | ||
265 | /*===========================================================================*/ | |
266 | /* UClassID-based RTTI */ | |
267 | /*===========================================================================*/ | |
268 | ||
269 | /** | |
270 | * UClassID is used to identify classes without using RTTI, since RTTI | |
271 | * is not yet supported by all C++ compilers. Each class hierarchy which needs | |
272 | * to implement polymorphic clone() or operator==() defines two methods, | |
273 | * described in detail below. UClassID values can be compared using | |
274 | * operator==(). Nothing else should be done with them. | |
275 | * | |
276 | * \par | |
277 | * getDynamicClassID() is declared in the base class of the hierarchy as | |
278 | * a pure virtual. Each concrete subclass implements it in the same way: | |
279 | * | |
280 | * \code | |
281 | * class Base { | |
282 | * public: | |
283 | * virtual UClassID getDynamicClassID() const = 0; | |
284 | * } | |
285 | * | |
286 | * class Derived { | |
287 | * public: | |
288 | * virtual UClassID getDynamicClassID() const | |
289 | * { return Derived::getStaticClassID(); } | |
290 | * } | |
291 | * \endcode | |
292 | * | |
293 | * Each concrete class implements getStaticClassID() as well, which allows | |
294 | * clients to test for a specific type. | |
295 | * | |
296 | * \code | |
297 | * class Derived { | |
298 | * public: | |
374ca955 | 299 | * static UClassID U_EXPORT2 getStaticClassID(); |
b75a7d8f A |
300 | * private: |
301 | * static char fgClassID; | |
302 | * } | |
303 | * | |
304 | * // In Derived.cpp: | |
305 | * UClassID Derived::getStaticClassID() | |
306 | * { return (UClassID)&Derived::fgClassID; } | |
307 | * char Derived::fgClassID = 0; // Value is irrelevant | |
308 | * \endcode | |
309 | * @stable ICU 2.0 | |
310 | */ | |
311 | typedef void* UClassID; | |
312 | ||
313 | /*===========================================================================*/ | |
314 | /* Shared library/DLL import-export API control */ | |
315 | /*===========================================================================*/ | |
316 | ||
317 | /* | |
318 | * Control of symbol import/export. | |
319 | * ICU is separated into three libraries. | |
320 | */ | |
321 | ||
322 | /* | |
323 | * \def U_COMBINED_IMPLEMENTATION | |
324 | * Set to export library symbols from inside the ICU library | |
325 | * when all of ICU is in a single library. | |
326 | * This can be set as a compiler option while building ICU, and it | |
327 | * needs to be the first one tested to override U_COMMON_API, U_I18N_API, etc. | |
328 | * @stable ICU 2.0 | |
329 | */ | |
330 | ||
374ca955 A |
331 | /** |
332 | * \def U_DATA_API | |
333 | * Set to export library symbols from inside the stubdata library, | |
334 | * and to import them from outside. | |
73c04bcf | 335 | * @stable ICU 3.0 |
374ca955 A |
336 | */ |
337 | ||
b75a7d8f A |
338 | /** |
339 | * \def U_COMMON_API | |
340 | * Set to export library symbols from inside the common library, | |
341 | * and to import them from outside. | |
342 | * @stable ICU 2.0 | |
343 | */ | |
344 | ||
345 | /** | |
346 | * \def U_I18N_API | |
347 | * Set to export library symbols from inside the i18n library, | |
348 | * and to import them from outside. | |
349 | * @stable ICU 2.0 | |
350 | */ | |
351 | ||
352 | /** | |
353 | * \def U_LAYOUT_API | |
354 | * Set to export library symbols from inside the layout engine library, | |
355 | * and to import them from outside. | |
356 | * @stable ICU 2.0 | |
357 | */ | |
358 | ||
359 | /** | |
360 | * \def U_LAYOUTEX_API | |
361 | * Set to export library symbols from inside the layout extensions library, | |
362 | * and to import them from outside. | |
374ca955 | 363 | * @stable ICU 2.6 |
b75a7d8f A |
364 | */ |
365 | ||
366 | /** | |
374ca955 | 367 | * \def U_IO_API |
b75a7d8f A |
368 | * Set to export library symbols from inside the ustdio library, |
369 | * and to import them from outside. | |
370 | * @stable ICU 2.0 | |
371 | */ | |
372 | ||
73c04bcf A |
373 | /** |
374 | * \def U_TOOLUTIL_API | |
375 | * Set to export library symbols from inside the toolutil library, | |
376 | * and to import them from outside. | |
377 | * @draft ICU 3.4 | |
378 | */ | |
379 | ||
b75a7d8f | 380 | #if defined(U_COMBINED_IMPLEMENTATION) |
374ca955 | 381 | #define U_DATA_API U_EXPORT |
b75a7d8f A |
382 | #define U_COMMON_API U_EXPORT |
383 | #define U_I18N_API U_EXPORT | |
384 | #define U_LAYOUT_API U_EXPORT | |
385 | #define U_LAYOUTEX_API U_EXPORT | |
374ca955 | 386 | #define U_IO_API U_EXPORT |
73c04bcf | 387 | #define U_TOOLUTIL_API U_EXPORT |
b75a7d8f | 388 | #elif defined(U_STATIC_IMPLEMENTATION) |
374ca955 | 389 | #define U_DATA_API |
b75a7d8f A |
390 | #define U_COMMON_API |
391 | #define U_I18N_API | |
392 | #define U_LAYOUT_API | |
393 | #define U_LAYOUTEX_API | |
374ca955 | 394 | #define U_IO_API |
73c04bcf | 395 | #define U_TOOLUTIL_API |
b75a7d8f | 396 | #elif defined(U_COMMON_IMPLEMENTATION) |
374ca955 | 397 | #define U_DATA_API U_IMPORT |
b75a7d8f A |
398 | #define U_COMMON_API U_EXPORT |
399 | #define U_I18N_API U_IMPORT | |
400 | #define U_LAYOUT_API U_IMPORT | |
401 | #define U_LAYOUTEX_API U_IMPORT | |
374ca955 | 402 | #define U_IO_API U_IMPORT |
73c04bcf | 403 | #define U_TOOLUTIL_API U_IMPORT |
b75a7d8f | 404 | #elif defined(U_I18N_IMPLEMENTATION) |
374ca955 | 405 | #define U_DATA_API U_IMPORT |
b75a7d8f A |
406 | #define U_COMMON_API U_IMPORT |
407 | #define U_I18N_API U_EXPORT | |
408 | #define U_LAYOUT_API U_IMPORT | |
409 | #define U_LAYOUTEX_API U_IMPORT | |
374ca955 | 410 | #define U_IO_API U_IMPORT |
73c04bcf | 411 | #define U_TOOLUTIL_API U_IMPORT |
b75a7d8f | 412 | #elif defined(U_LAYOUT_IMPLEMENTATION) |
374ca955 | 413 | #define U_DATA_API U_IMPORT |
b75a7d8f A |
414 | #define U_COMMON_API U_IMPORT |
415 | #define U_I18N_API U_IMPORT | |
416 | #define U_LAYOUT_API U_EXPORT | |
417 | #define U_LAYOUTEX_API U_IMPORT | |
374ca955 | 418 | #define U_IO_API U_IMPORT |
73c04bcf | 419 | #define U_TOOLUTIL_API U_IMPORT |
b75a7d8f | 420 | #elif defined(U_LAYOUTEX_IMPLEMENTATION) |
374ca955 | 421 | #define U_DATA_API U_IMPORT |
b75a7d8f A |
422 | #define U_COMMON_API U_IMPORT |
423 | #define U_I18N_API U_IMPORT | |
424 | #define U_LAYOUT_API U_IMPORT | |
425 | #define U_LAYOUTEX_API U_EXPORT | |
374ca955 | 426 | #define U_IO_API U_IMPORT |
73c04bcf | 427 | #define U_TOOLUTIL_API U_IMPORT |
374ca955 A |
428 | #elif defined(U_IO_IMPLEMENTATION) |
429 | #define U_DATA_API U_IMPORT | |
b75a7d8f A |
430 | #define U_COMMON_API U_IMPORT |
431 | #define U_I18N_API U_IMPORT | |
432 | #define U_LAYOUT_API U_IMPORT | |
433 | #define U_LAYOUTEX_API U_IMPORT | |
374ca955 | 434 | #define U_IO_API U_EXPORT |
73c04bcf A |
435 | #define U_TOOLUTIL_API U_IMPORT |
436 | #elif defined(U_TOOLUTIL_IMPLEMENTATION) | |
437 | #define U_DATA_API U_IMPORT | |
438 | #define U_COMMON_API U_IMPORT | |
439 | #define U_I18N_API U_IMPORT | |
440 | #define U_LAYOUT_API U_IMPORT | |
441 | #define U_LAYOUTEX_API U_IMPORT | |
442 | #define U_IO_API U_IMPORT | |
443 | #define U_TOOLUTIL_API U_EXPORT | |
b75a7d8f | 444 | #else |
374ca955 | 445 | #define U_DATA_API U_IMPORT |
b75a7d8f A |
446 | #define U_COMMON_API U_IMPORT |
447 | #define U_I18N_API U_IMPORT | |
448 | #define U_LAYOUT_API U_IMPORT | |
449 | #define U_LAYOUTEX_API U_IMPORT | |
374ca955 | 450 | #define U_IO_API U_IMPORT |
73c04bcf | 451 | #define U_TOOLUTIL_API U_IMPORT |
b75a7d8f A |
452 | #endif |
453 | ||
454 | /** | |
455 | * \def U_STANDARD_CPP_NAMESPACE | |
456 | * Control of C++ Namespace | |
457 | * @stable ICU 2.0 | |
458 | */ | |
459 | #ifdef __cplusplus | |
460 | #define U_STANDARD_CPP_NAMESPACE :: | |
461 | #else | |
462 | #define U_STANDARD_CPP_NAMESPACE | |
463 | #endif | |
464 | ||
374ca955 | 465 | |
b75a7d8f A |
466 | /*===========================================================================*/ |
467 | /* Global delete operator */ | |
468 | /*===========================================================================*/ | |
469 | ||
470 | /* | |
471 | * The ICU4C library must not use the global new and delete operators. | |
472 | * These operators here are defined to enable testing for this. | |
473 | * See Jitterbug 2581 for details of why this is necessary. | |
474 | * | |
475 | * Verification that ICU4C's memory usage is correct, i.e., | |
476 | * that global new/delete are not used: | |
477 | * | |
478 | * a) Check for imports of global new/delete (see uobject.cpp for details) | |
479 | * b) Verify that new is never imported. | |
480 | * c) Verify that delete is only imported from object code for interface/mixin classes. | |
481 | * d) Add global delete and delete[] only for the ICU4C library itself | |
482 | * and define them in a way that crashes or otherwise easily shows a problem. | |
483 | * | |
484 | * The following implements d). | |
485 | * The operator implementations crash; this is intentional and used for library debugging. | |
486 | * | |
487 | * Note: This is currently only done on Windows because | |
488 | * some Linux/Unix compilers have problems with defining global new/delete. | |
73c04bcf | 489 | * On Windows, WIN32 is defined, and it is _MSC_VER>=1200 for MSVC 6.0 and higher. |
b75a7d8f | 490 | */ |
73c04bcf | 491 | #if defined(XP_CPLUSPLUS) && defined(U_WINDOWS) && (_MSC_VER>=1200) && U_DEBUG && (defined(U_COMMON_IMPLEMENTATION) || defined(U_I18N_IMPLEMENTATION) || defined(U_LAYOUT_IMPLEMENTATION) || defined(U_USTDIO_IMPLEMENTATION)) |
b75a7d8f | 492 | |
73c04bcf | 493 | #ifndef U_HIDE_INTERNAL_API |
b75a7d8f A |
494 | /** |
495 | * Global operator new, defined only inside ICU4C, must not be used. | |
496 | * Crashes intentionally. | |
497 | * @internal | |
498 | */ | |
499 | inline void * | |
500 | operator new(size_t /*size*/) { | |
501 | char *q=NULL; | |
502 | *q=5; /* break it */ | |
503 | return q; | |
504 | } | |
505 | ||
506 | /** | |
507 | * Global operator new[], defined only inside ICU4C, must not be used. | |
508 | * Crashes intentionally. | |
509 | * @internal | |
510 | */ | |
511 | inline void * | |
512 | operator new[](size_t /*size*/) { | |
513 | char *q=NULL; | |
514 | *q=5; /* break it */ | |
515 | return q; | |
516 | } | |
517 | ||
518 | /** | |
519 | * Global operator delete, defined only inside ICU4C, must not be used. | |
520 | * Crashes intentionally. | |
521 | * @internal | |
522 | */ | |
523 | inline void | |
524 | operator delete(void * /*p*/) { | |
525 | char *q=NULL; | |
526 | *q=5; /* break it */ | |
527 | } | |
528 | ||
529 | /** | |
530 | * Global operator delete[], defined only inside ICU4C, must not be used. | |
531 | * Crashes intentionally. | |
532 | * @internal | |
533 | */ | |
534 | inline void | |
535 | operator delete[](void * /*p*/) { | |
536 | char *q=NULL; | |
537 | *q=5; /* break it */ | |
538 | } | |
539 | ||
73c04bcf | 540 | #endif /* U_HIDE_INTERNAL_API */ |
b75a7d8f A |
541 | #endif |
542 | ||
543 | /*===========================================================================*/ | |
544 | /* UErrorCode */ | |
545 | /*===========================================================================*/ | |
546 | ||
547 | /** | |
548 | * Error code to replace exception handling, so that the code is compatible with all C++ compilers, | |
549 | * and to use the same mechanism for C and C++. | |
550 | * | |
551 | * \par | |
552 | * ICU functions that take a reference (C++) or a pointer (C) to a UErrorCode | |
553 | * first test if(U_FAILURE(errorCode)) { return immediately; } | |
554 | * so that in a chain of such functions the first one that sets an error code | |
555 | * causes the following ones to not perform any operations. | |
556 | * | |
557 | * \par | |
558 | * Error codes should be tested using U_FAILURE() and U_SUCCESS(). | |
559 | * @stable ICU 2.0 | |
560 | */ | |
561 | typedef enum UErrorCode { | |
562 | /* The ordering of U_ERROR_INFO_START Vs U_USING_FALLBACK_WARNING looks weird | |
563 | * and is that way because VC++ debugger displays first encountered constant, | |
564 | * which is not the what the code is used for | |
565 | */ | |
566 | ||
567 | U_USING_FALLBACK_WARNING = -128, /**< A resource bundle lookup returned a fallback result (not an error) */ | |
568 | ||
569 | U_ERROR_WARNING_START = -128, /**< Start of information results (semantically successful) */ | |
570 | ||
571 | U_USING_DEFAULT_WARNING = -127, /**< A resource bundle lookup returned a result from the root locale (not an error) */ | |
572 | ||
573 | U_SAFECLONE_ALLOCATED_WARNING = -126, /**< A SafeClone operation required allocating memory (informational only) */ | |
574 | ||
575 | U_STATE_OLD_WARNING = -125, /**< ICU has to use compatibility layer to construct the service. Expect performance/memory usage degradation. Consider upgrading */ | |
576 | ||
577 | U_STRING_NOT_TERMINATED_WARNING = -124,/**< An output string could not be NUL-terminated because output length==destCapacity. */ | |
578 | ||
579 | U_SORT_KEY_TOO_SHORT_WARNING = -123, /**< Number of levels requested in getBound is higher than the number of levels in the sort key */ | |
580 | ||
581 | U_AMBIGUOUS_ALIAS_WARNING = -122, /**< This converter alias can go to different converter implementations */ | |
582 | ||
583 | U_DIFFERENT_UCA_VERSION = -121, /**< ucol_open encountered a mismatch between UCA version and collator image version, so the collator was constructed from rules. No impact to further function */ | |
584 | ||
585 | U_ERROR_WARNING_LIMIT, /**< This must always be the last warning value to indicate the limit for UErrorCode warnings (last warning code +1) */ | |
586 | ||
587 | ||
588 | U_ZERO_ERROR = 0, /**< No error, no warning. */ | |
589 | ||
590 | U_ILLEGAL_ARGUMENT_ERROR = 1, /**< Start of codes indicating failure */ | |
591 | U_MISSING_RESOURCE_ERROR = 2, /**< The requested resource cannot be found */ | |
592 | U_INVALID_FORMAT_ERROR = 3, /**< Data format is not what is expected */ | |
593 | U_FILE_ACCESS_ERROR = 4, /**< The requested file cannot be found */ | |
594 | U_INTERNAL_PROGRAM_ERROR = 5, /**< Indicates a bug in the library code */ | |
595 | U_MESSAGE_PARSE_ERROR = 6, /**< Unable to parse a message (message format) */ | |
596 | U_MEMORY_ALLOCATION_ERROR = 7, /**< Memory allocation error */ | |
597 | U_INDEX_OUTOFBOUNDS_ERROR = 8, /**< Trying to access the index that is out of bounds */ | |
598 | U_PARSE_ERROR = 9, /**< Equivalent to Java ParseException */ | |
374ca955 A |
599 | U_INVALID_CHAR_FOUND = 10, /**< Character conversion: Unmappable input sequence. In other APIs: Invalid character. */ |
600 | U_TRUNCATED_CHAR_FOUND = 11, /**< Character conversion: Incomplete input sequence. */ | |
73c04bcf | 601 | U_ILLEGAL_CHAR_FOUND = 12, /**< Character conversion: Illegal input sequence/combination of input units. */ |
b75a7d8f A |
602 | U_INVALID_TABLE_FORMAT = 13, /**< Conversion table file found, but corrupted */ |
603 | U_INVALID_TABLE_FILE = 14, /**< Conversion table file not found */ | |
604 | U_BUFFER_OVERFLOW_ERROR = 15, /**< A result would not fit in the supplied buffer */ | |
605 | U_UNSUPPORTED_ERROR = 16, /**< Requested operation not supported in current context */ | |
606 | U_RESOURCE_TYPE_MISMATCH = 17, /**< an operation is requested over a resource that does not support it */ | |
607 | U_ILLEGAL_ESCAPE_SEQUENCE = 18, /**< ISO-2022 illlegal escape sequence */ | |
608 | U_UNSUPPORTED_ESCAPE_SEQUENCE = 19, /**< ISO-2022 unsupported escape sequence */ | |
609 | U_NO_SPACE_AVAILABLE = 20, /**< No space available for in-buffer expansion for Arabic shaping */ | |
610 | U_CE_NOT_FOUND_ERROR = 21, /**< Currently used only while setting variable top, but can be used generally */ | |
611 | U_PRIMARY_TOO_LONG_ERROR = 22, /**< User tried to set variable top to a primary that is longer than two bytes */ | |
612 | U_STATE_TOO_OLD_ERROR = 23, /**< ICU cannot construct a service from this state, as it is no longer supported */ | |
613 | U_TOO_MANY_ALIASES_ERROR = 24, /**< There are too many aliases in the path to the requested resource. | |
614 | It is very possible that a circular alias definition has occured */ | |
615 | U_ENUM_OUT_OF_SYNC_ERROR = 25, /**< UEnumeration out of sync with underlying collection */ | |
616 | U_INVARIANT_CONVERSION_ERROR = 26, /**< Unable to convert a UChar* string to char* with the invariant converter. */ | |
374ca955 A |
617 | U_INVALID_STATE_ERROR = 27, /**< Requested operation can not be completed with ICU in its current state */ |
618 | U_COLLATOR_VERSION_MISMATCH = 28, /**< Collator version is not compatible with the base version */ | |
619 | U_USELESS_COLLATOR_ERROR = 29, /**< Collator is options only and no base is specified */ | |
73c04bcf | 620 | U_NO_WRITE_PERMISSION = 30, /**< Attempt to modify read-only or constant data. */ |
b75a7d8f A |
621 | |
622 | U_STANDARD_ERROR_LIMIT, /**< This must always be the last value to indicate the limit for standard errors */ | |
623 | /* | |
624 | * the error code range 0x10000 0x10100 are reserved for Transliterator | |
625 | */ | |
626 | U_BAD_VARIABLE_DEFINITION=0x10000,/**< Missing '$' or duplicate variable name */ | |
627 | U_PARSE_ERROR_START = 0x10000, /**< Start of Transliterator errors */ | |
628 | U_MALFORMED_RULE, /**< Elements of a rule are misplaced */ | |
629 | U_MALFORMED_SET, /**< A UnicodeSet pattern is invalid*/ | |
630 | U_MALFORMED_SYMBOL_REFERENCE, /**< UNUSED as of ICU 2.4 */ | |
631 | U_MALFORMED_UNICODE_ESCAPE, /**< A Unicode escape pattern is invalid*/ | |
632 | U_MALFORMED_VARIABLE_DEFINITION, /**< A variable definition is invalid */ | |
633 | U_MALFORMED_VARIABLE_REFERENCE, /**< A variable reference is invalid */ | |
634 | U_MISMATCHED_SEGMENT_DELIMITERS, /**< UNUSED as of ICU 2.4 */ | |
635 | U_MISPLACED_ANCHOR_START, /**< A start anchor appears at an illegal position */ | |
636 | U_MISPLACED_CURSOR_OFFSET, /**< A cursor offset occurs at an illegal position */ | |
637 | U_MISPLACED_QUANTIFIER, /**< A quantifier appears after a segment close delimiter */ | |
638 | U_MISSING_OPERATOR, /**< A rule contains no operator */ | |
639 | U_MISSING_SEGMENT_CLOSE, /**< UNUSED as of ICU 2.4 */ | |
640 | U_MULTIPLE_ANTE_CONTEXTS, /**< More than one ante context */ | |
641 | U_MULTIPLE_CURSORS, /**< More than one cursor */ | |
642 | U_MULTIPLE_POST_CONTEXTS, /**< More than one post context */ | |
643 | U_TRAILING_BACKSLASH, /**< A dangling backslash */ | |
644 | U_UNDEFINED_SEGMENT_REFERENCE, /**< A segment reference does not correspond to a defined segment */ | |
645 | U_UNDEFINED_VARIABLE, /**< A variable reference does not correspond to a defined variable */ | |
646 | U_UNQUOTED_SPECIAL, /**< A special character was not quoted or escaped */ | |
647 | U_UNTERMINATED_QUOTE, /**< A closing single quote is missing */ | |
648 | U_RULE_MASK_ERROR, /**< A rule is hidden by an earlier more general rule */ | |
649 | U_MISPLACED_COMPOUND_FILTER, /**< A compound filter is in an invalid location */ | |
650 | U_MULTIPLE_COMPOUND_FILTERS, /**< More than one compound filter */ | |
651 | U_INVALID_RBT_SYNTAX, /**< A "::id" rule was passed to the RuleBasedTransliterator parser */ | |
652 | U_INVALID_PROPERTY_PATTERN, /**< UNUSED as of ICU 2.4 */ | |
653 | U_MALFORMED_PRAGMA, /**< A 'use' pragma is invlalid */ | |
654 | U_UNCLOSED_SEGMENT, /**< A closing ')' is missing */ | |
655 | U_ILLEGAL_CHAR_IN_SEGMENT, /**< UNUSED as of ICU 2.4 */ | |
656 | U_VARIABLE_RANGE_EXHAUSTED, /**< Too many stand-ins generated for the given variable range */ | |
657 | U_VARIABLE_RANGE_OVERLAP, /**< The variable range overlaps characters used in rules */ | |
658 | U_ILLEGAL_CHARACTER, /**< A special character is outside its allowed context */ | |
659 | U_INTERNAL_TRANSLITERATOR_ERROR, /**< Internal transliterator system error */ | |
660 | U_INVALID_ID, /**< A "::id" rule specifies an unknown transliterator */ | |
661 | U_INVALID_FUNCTION, /**< A "&fn()" rule specifies an unknown transliterator */ | |
662 | U_PARSE_ERROR_LIMIT, /**< The limit for Transliterator errors */ | |
663 | ||
664 | /* | |
665 | * the error code range 0x10100 0x10200 are reserved for formatting API parsing error | |
666 | */ | |
667 | U_UNEXPECTED_TOKEN=0x10100, /**< Syntax error in format pattern */ | |
668 | U_FMT_PARSE_ERROR_START=0x10100, /**< Start of format library errors */ | |
669 | U_MULTIPLE_DECIMAL_SEPARATORS, /**< More than one decimal separator in number pattern */ | |
670 | U_MULTIPLE_DECIMAL_SEPERATORS = U_MULTIPLE_DECIMAL_SEPARATORS, /**< Typo: kept for backward compatibility. Use U_MULTIPLE_DECIMAL_SEPARATORS */ | |
671 | U_MULTIPLE_EXPONENTIAL_SYMBOLS, /**< More than one exponent symbol in number pattern */ | |
672 | U_MALFORMED_EXPONENTIAL_PATTERN, /**< Grouping symbol in exponent pattern */ | |
673 | U_MULTIPLE_PERCENT_SYMBOLS, /**< More than one percent symbol in number pattern */ | |
674 | U_MULTIPLE_PERMILL_SYMBOLS, /**< More than one permill symbol in number pattern */ | |
675 | U_MULTIPLE_PAD_SPECIFIERS, /**< More than one pad symbol in number pattern */ | |
676 | U_PATTERN_SYNTAX_ERROR, /**< Syntax error in format pattern */ | |
677 | U_ILLEGAL_PAD_POSITION, /**< Pad symbol misplaced in number pattern */ | |
678 | U_UNMATCHED_BRACES, /**< Braces do not match in message pattern */ | |
679 | U_UNSUPPORTED_PROPERTY, /**< UNUSED as of ICU 2.4 */ | |
680 | U_UNSUPPORTED_ATTRIBUTE, /**< UNUSED as of ICU 2.4 */ | |
681 | U_FMT_PARSE_ERROR_LIMIT, /**< The limit for format library errors */ | |
682 | ||
683 | /* | |
684 | * the error code range 0x10200 0x102ff are reserved for Break Iterator related error | |
685 | */ | |
73c04bcf | 686 | U_BRK_INTERNAL_ERROR=0x10200, /**< An internal error (bug) was detected. */ |
b75a7d8f | 687 | U_BRK_ERROR_START=0x10200, /**< Start of codes indicating Break Iterator failures */ |
b75a7d8f A |
688 | U_BRK_HEX_DIGITS_EXPECTED, /**< Hex digits expected as part of a escaped char in a rule. */ |
689 | U_BRK_SEMICOLON_EXPECTED, /**< Missing ';' at the end of a RBBI rule. */ | |
690 | U_BRK_RULE_SYNTAX, /**< Syntax error in RBBI rule. */ | |
691 | U_BRK_UNCLOSED_SET, /**< UnicodeSet witing an RBBI rule missing a closing ']'. */ | |
692 | U_BRK_ASSIGN_ERROR, /**< Syntax error in RBBI rule assignment statement. */ | |
693 | U_BRK_VARIABLE_REDFINITION, /**< RBBI rule $Variable redefined. */ | |
694 | U_BRK_MISMATCHED_PAREN, /**< Mis-matched parentheses in an RBBI rule. */ | |
695 | U_BRK_NEW_LINE_IN_QUOTED_STRING, /**< Missing closing quote in an RBBI rule. */ | |
696 | U_BRK_UNDEFINED_VARIABLE, /**< Use of an undefined $Variable in an RBBI rule. */ | |
697 | U_BRK_INIT_ERROR, /**< Initialization failure. Probable missing ICU Data. */ | |
698 | U_BRK_RULE_EMPTY_SET, /**< Rule contains an empty Unicode Set. */ | |
374ca955 A |
699 | U_BRK_UNRECOGNIZED_OPTION, /**< !!option in RBBI rules not recognized. */ |
700 | U_BRK_MALFORMED_RULE_TAG, /**< The {nnn} tag on a rule is mal formed */ | |
b75a7d8f A |
701 | U_BRK_ERROR_LIMIT, /**< This must always be the last value to indicate the limit for Break Iterator failures */ |
702 | ||
703 | /* | |
704 | * The error codes in the range 0x10300-0x103ff are reserved for regular expression related errrs | |
705 | */ | |
73c04bcf | 706 | U_REGEX_INTERNAL_ERROR=0x10300, /**< An internal error (bug) was detected. */ |
374ca955 | 707 | U_REGEX_ERROR_START=0x10300, /**< Start of codes indicating Regexp failures */ |
374ca955 A |
708 | U_REGEX_RULE_SYNTAX, /**< Syntax error in regexp pattern. */ |
709 | U_REGEX_INVALID_STATE, /**< RegexMatcher in invalid state for requested operation */ | |
710 | U_REGEX_BAD_ESCAPE_SEQUENCE, /**< Unrecognized backslash escape sequence in pattern */ | |
711 | U_REGEX_PROPERTY_SYNTAX, /**< Incorrect Unicode property */ | |
712 | U_REGEX_UNIMPLEMENTED, /**< Use of regexp feature that is not yet implemented. */ | |
713 | U_REGEX_MISMATCHED_PAREN, /**< Incorrectly nested parentheses in regexp pattern. */ | |
714 | U_REGEX_NUMBER_TOO_BIG, /**< Decimal number is too large. */ | |
715 | U_REGEX_BAD_INTERVAL, /**< Error in {min,max} interval */ | |
716 | U_REGEX_MAX_LT_MIN, /**< In {min,max}, max is less than min. */ | |
717 | U_REGEX_INVALID_BACK_REF, /**< Back-reference to a non-existent capture group. */ | |
718 | U_REGEX_INVALID_FLAG, /**< Invalid value for match mode flags. */ | |
719 | U_REGEX_LOOK_BEHIND_LIMIT, /**< Look-Behind pattern matches must have a bounded maximum length. */ | |
720 | U_REGEX_SET_CONTAINS_STRING, /**< Regexps cannot have UnicodeSets containing strings.*/ | |
721 | U_REGEX_ERROR_LIMIT, /**< This must always be the last value to indicate the limit for regexp errors */ | |
722 | ||
723 | /* | |
724 | * The error code in the range 0x10400-0x104ff are reserved for IDNA related error codes | |
725 | */ | |
73c04bcf | 726 | U_IDNA_PROHIBITED_ERROR=0x10400, |
374ca955 | 727 | U_IDNA_ERROR_START=0x10400, |
374ca955 A |
728 | U_IDNA_UNASSIGNED_ERROR, |
729 | U_IDNA_CHECK_BIDI_ERROR, | |
730 | U_IDNA_STD3_ASCII_RULES_ERROR, | |
731 | U_IDNA_ACE_PREFIX_ERROR, | |
732 | U_IDNA_VERIFICATION_ERROR, | |
733 | U_IDNA_LABEL_TOO_LONG_ERROR, | |
73c04bcf | 734 | U_IDNA_ZERO_LENGTH_LABEL_ERROR, |
374ca955 A |
735 | U_IDNA_ERROR_LIMIT, |
736 | /* | |
737 | * Aliases for StringPrep | |
738 | */ | |
739 | U_STRINGPREP_PROHIBITED_ERROR = U_IDNA_PROHIBITED_ERROR, | |
740 | U_STRINGPREP_UNASSIGNED_ERROR = U_IDNA_UNASSIGNED_ERROR, | |
741 | U_STRINGPREP_CHECK_BIDI_ERROR = U_IDNA_CHECK_BIDI_ERROR, | |
742 | ||
b75a7d8f A |
743 | |
744 | U_ERROR_LIMIT=U_IDNA_ERROR_LIMIT /**< This must always be the last value to indicate the limit for UErrorCode (last error code +1) */ | |
745 | } UErrorCode; | |
746 | ||
747 | /* Use the following to determine if an UErrorCode represents */ | |
748 | /* operational success or failure. */ | |
749 | ||
750 | #ifdef XP_CPLUSPLUS | |
751 | /** | |
752 | * Does the error code indicate success? | |
753 | * @stable ICU 2.0 | |
754 | */ | |
755 | static | |
756 | inline UBool U_SUCCESS(UErrorCode code) { return (UBool)(code<=U_ZERO_ERROR); } | |
757 | /** | |
758 | * Does the error code indicate a failure? | |
759 | * @stable ICU 2.0 | |
760 | */ | |
761 | static | |
762 | inline UBool U_FAILURE(UErrorCode code) { return (UBool)(code>U_ZERO_ERROR); } | |
763 | #else | |
764 | /** | |
765 | * Does the error code indicate success? | |
766 | * @stable ICU 2.0 | |
767 | */ | |
768 | # define U_SUCCESS(x) ((x)<=U_ZERO_ERROR) | |
769 | /** | |
770 | * Does the error code indicate a failure? | |
771 | * @stable ICU 2.0 | |
772 | */ | |
773 | # define U_FAILURE(x) ((x)>U_ZERO_ERROR) | |
774 | #endif | |
775 | ||
776 | /** | |
777 | * Return a string for a UErrorCode value. | |
778 | * The string will be the same as the name of the error code constant | |
779 | * in the UErrorCode enum above. | |
780 | * @stable ICU 2.0 | |
781 | */ | |
374ca955 | 782 | U_STABLE const char * U_EXPORT2 |
b75a7d8f A |
783 | u_errorName(UErrorCode code); |
784 | ||
785 | ||
b75a7d8f | 786 | #endif /* _UTYPES */ |