xref: /aosp_15_r20/external/icu/libandroidicu/include/unicode/platform.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker /*
4*0e209d39SAndroid Build Coastguard Worker ******************************************************************************
5*0e209d39SAndroid Build Coastguard Worker *
6*0e209d39SAndroid Build Coastguard Worker *   Copyright (C) 1997-2016, International Business Machines
7*0e209d39SAndroid Build Coastguard Worker *   Corporation and others.  All Rights Reserved.
8*0e209d39SAndroid Build Coastguard Worker *
9*0e209d39SAndroid Build Coastguard Worker ******************************************************************************
10*0e209d39SAndroid Build Coastguard Worker *
11*0e209d39SAndroid Build Coastguard Worker *  FILE NAME : platform.h
12*0e209d39SAndroid Build Coastguard Worker *
13*0e209d39SAndroid Build Coastguard Worker *   Date        Name        Description
14*0e209d39SAndroid Build Coastguard Worker *   05/13/98    nos         Creation (content moved here from ptypes.h).
15*0e209d39SAndroid Build Coastguard Worker *   03/02/99    stephen     Added AS400 support.
16*0e209d39SAndroid Build Coastguard Worker *   03/30/99    stephen     Added Linux support.
17*0e209d39SAndroid Build Coastguard Worker *   04/13/99    stephen     Reworked for autoconf.
18*0e209d39SAndroid Build Coastguard Worker ******************************************************************************
19*0e209d39SAndroid Build Coastguard Worker */
20*0e209d39SAndroid Build Coastguard Worker 
21*0e209d39SAndroid Build Coastguard Worker #ifndef _PLATFORM_H
22*0e209d39SAndroid Build Coastguard Worker #define _PLATFORM_H
23*0e209d39SAndroid Build Coastguard Worker 
24*0e209d39SAndroid Build Coastguard Worker #include "unicode/uconfig.h"
25*0e209d39SAndroid Build Coastguard Worker #include "unicode/uvernum.h"
26*0e209d39SAndroid Build Coastguard Worker 
27*0e209d39SAndroid Build Coastguard Worker /**
28*0e209d39SAndroid Build Coastguard Worker  * \file
29*0e209d39SAndroid Build Coastguard Worker  * \brief Basic types for the platform.
30*0e209d39SAndroid Build Coastguard Worker  *
31*0e209d39SAndroid Build Coastguard Worker  * This file used to be generated by autoconf/configure.
32*0e209d39SAndroid Build Coastguard Worker  * Starting with ICU 49, platform.h is a normal source file,
33*0e209d39SAndroid Build Coastguard Worker  * to simplify cross-compiling and working with non-autoconf/make build systems.
34*0e209d39SAndroid Build Coastguard Worker  *
35*0e209d39SAndroid Build Coastguard Worker  * When a value in this file does not work on a platform, then please
36*0e209d39SAndroid Build Coastguard Worker  * try to derive it from the U_PLATFORM value
37*0e209d39SAndroid Build Coastguard Worker  * (for which we might need a new value constant in rare cases)
38*0e209d39SAndroid Build Coastguard Worker  * and/or from other macros that are predefined by the compiler
39*0e209d39SAndroid Build Coastguard Worker  * or defined in standard (POSIX or platform or compiler) headers.
40*0e209d39SAndroid Build Coastguard Worker  *
41*0e209d39SAndroid Build Coastguard Worker  * As a temporary workaround, you can add an explicit \#define for some macros
42*0e209d39SAndroid Build Coastguard Worker  * before it is first tested, or add an equivalent -D macro definition
43*0e209d39SAndroid Build Coastguard Worker  * to the compiler's command line.
44*0e209d39SAndroid Build Coastguard Worker  *
45*0e209d39SAndroid Build Coastguard Worker  * Note: Some compilers provide ways to show the predefined macros.
46*0e209d39SAndroid Build Coastguard Worker  * For example, with gcc you can compile an empty .c file and have the compiler
47*0e209d39SAndroid Build Coastguard Worker  * print the predefined macros with
48*0e209d39SAndroid Build Coastguard Worker  * \code
49*0e209d39SAndroid Build Coastguard Worker  * gcc -E -dM -x c /dev/null | sort
50*0e209d39SAndroid Build Coastguard Worker  * \endcode
51*0e209d39SAndroid Build Coastguard Worker  * (You can provide an actual empty .c file rather than /dev/null.
52*0e209d39SAndroid Build Coastguard Worker  * <code>-x c++</code> is for C++.)
53*0e209d39SAndroid Build Coastguard Worker  */
54*0e209d39SAndroid Build Coastguard Worker 
55*0e209d39SAndroid Build Coastguard Worker /**
56*0e209d39SAndroid Build Coastguard Worker  * Define some things so that they can be documented.
57*0e209d39SAndroid Build Coastguard Worker  * @internal
58*0e209d39SAndroid Build Coastguard Worker  */
59*0e209d39SAndroid Build Coastguard Worker #ifdef U_IN_DOXYGEN
60*0e209d39SAndroid Build Coastguard Worker /*
61*0e209d39SAndroid Build Coastguard Worker  * Problem: "platform.h:335: warning: documentation for unknown define U_HAVE_STD_STRING found." means that U_HAVE_STD_STRING is not documented.
62*0e209d39SAndroid Build Coastguard Worker  * Solution: #define any defines for non @internal API here, so that they are visible in the docs.  If you just set PREDEFINED in Doxyfile.in,  they won't be documented.
63*0e209d39SAndroid Build Coastguard Worker  */
64*0e209d39SAndroid Build Coastguard Worker 
65*0e209d39SAndroid Build Coastguard Worker /* None for now. */
66*0e209d39SAndroid Build Coastguard Worker #endif
67*0e209d39SAndroid Build Coastguard Worker 
68*0e209d39SAndroid Build Coastguard Worker /**
69*0e209d39SAndroid Build Coastguard Worker  * \def U_PLATFORM
70*0e209d39SAndroid Build Coastguard Worker  * The U_PLATFORM macro defines the platform we're on.
71*0e209d39SAndroid Build Coastguard Worker  *
72*0e209d39SAndroid Build Coastguard Worker  * We used to define one different, value-less macro per platform.
73*0e209d39SAndroid Build Coastguard Worker  * That made it hard to know the set of relevant platforms and macros,
74*0e209d39SAndroid Build Coastguard Worker  * and hard to deal with variants of platforms.
75*0e209d39SAndroid Build Coastguard Worker  *
76*0e209d39SAndroid Build Coastguard Worker  * Starting with ICU 49, we define platforms as numeric macros,
77*0e209d39SAndroid Build Coastguard Worker  * with ranges of values for related platforms and their variants.
78*0e209d39SAndroid Build Coastguard Worker  * The U_PLATFORM macro is set to one of these values.
79*0e209d39SAndroid Build Coastguard Worker  *
80*0e209d39SAndroid Build Coastguard Worker  * Historical note from the Solaris Wikipedia article:
81*0e209d39SAndroid Build Coastguard Worker  * AT&T and Sun collaborated on a project to merge the most popular Unix variants
82*0e209d39SAndroid Build Coastguard Worker  * on the market at that time: BSD, System V, and Xenix.
83*0e209d39SAndroid Build Coastguard Worker  * This became Unix System V Release 4 (SVR4).
84*0e209d39SAndroid Build Coastguard Worker  *
85*0e209d39SAndroid Build Coastguard Worker  * @internal
86*0e209d39SAndroid Build Coastguard Worker  */
87*0e209d39SAndroid Build Coastguard Worker 
88*0e209d39SAndroid Build Coastguard Worker /** Unknown platform. @internal */
89*0e209d39SAndroid Build Coastguard Worker #define U_PF_UNKNOWN 0
90*0e209d39SAndroid Build Coastguard Worker /** Windows @internal */
91*0e209d39SAndroid Build Coastguard Worker #define U_PF_WINDOWS 1000
92*0e209d39SAndroid Build Coastguard Worker /** MinGW. Windows, calls to Win32 API, but using GNU gcc and binutils. @internal */
93*0e209d39SAndroid Build Coastguard Worker #define U_PF_MINGW 1800
94*0e209d39SAndroid Build Coastguard Worker /**
95*0e209d39SAndroid Build Coastguard Worker  * Cygwin. Windows, calls to cygwin1.dll for Posix functions,
96*0e209d39SAndroid Build Coastguard Worker  * using MSVC or GNU gcc and binutils.
97*0e209d39SAndroid Build Coastguard Worker  * @internal
98*0e209d39SAndroid Build Coastguard Worker  */
99*0e209d39SAndroid Build Coastguard Worker #define U_PF_CYGWIN 1900
100*0e209d39SAndroid Build Coastguard Worker /* Reserve 2000 for U_PF_UNIX? */
101*0e209d39SAndroid Build Coastguard Worker /** HP-UX is based on UNIX System V. @internal */
102*0e209d39SAndroid Build Coastguard Worker #define U_PF_HPUX 2100
103*0e209d39SAndroid Build Coastguard Worker /** Solaris is a Unix operating system based on SVR4. @internal */
104*0e209d39SAndroid Build Coastguard Worker #define U_PF_SOLARIS 2600
105*0e209d39SAndroid Build Coastguard Worker /** BSD is a UNIX operating system derivative. @internal */
106*0e209d39SAndroid Build Coastguard Worker #define U_PF_BSD 3000
107*0e209d39SAndroid Build Coastguard Worker /** AIX is based on UNIX System V Releases and 4.3 BSD. @internal */
108*0e209d39SAndroid Build Coastguard Worker #define U_PF_AIX 3100
109*0e209d39SAndroid Build Coastguard Worker /** IRIX is based on UNIX System V with BSD extensions. @internal */
110*0e209d39SAndroid Build Coastguard Worker #define U_PF_IRIX 3200
111*0e209d39SAndroid Build Coastguard Worker /**
112*0e209d39SAndroid Build Coastguard Worker  * Darwin is a POSIX-compliant operating system, composed of code developed by Apple,
113*0e209d39SAndroid Build Coastguard Worker  * as well as code derived from NeXTSTEP, BSD, and other projects,
114*0e209d39SAndroid Build Coastguard Worker  * built around the Mach kernel.
115*0e209d39SAndroid Build Coastguard Worker  * Darwin forms the core set of components upon which Mac OS X, Apple TV, and iOS are based.
116*0e209d39SAndroid Build Coastguard Worker  * (Original description modified from WikiPedia.)
117*0e209d39SAndroid Build Coastguard Worker  * @internal
118*0e209d39SAndroid Build Coastguard Worker  */
119*0e209d39SAndroid Build Coastguard Worker #define U_PF_DARWIN 3500
120*0e209d39SAndroid Build Coastguard Worker /** iPhone OS (iOS) is a derivative of Mac OS X. @internal */
121*0e209d39SAndroid Build Coastguard Worker #define U_PF_IPHONE 3550
122*0e209d39SAndroid Build Coastguard Worker /** QNX is a commercial Unix-like real-time operating system related to BSD. @internal */
123*0e209d39SAndroid Build Coastguard Worker #define U_PF_QNX 3700
124*0e209d39SAndroid Build Coastguard Worker /** Linux is a Unix-like operating system. @internal */
125*0e209d39SAndroid Build Coastguard Worker #define U_PF_LINUX 4000
126*0e209d39SAndroid Build Coastguard Worker /**
127*0e209d39SAndroid Build Coastguard Worker  * Native Client is pretty close to Linux.
128*0e209d39SAndroid Build Coastguard Worker  * See https://developer.chrome.com/native-client and
129*0e209d39SAndroid Build Coastguard Worker  *  http://www.chromium.org/nativeclient
130*0e209d39SAndroid Build Coastguard Worker  *  @internal
131*0e209d39SAndroid Build Coastguard Worker  */
132*0e209d39SAndroid Build Coastguard Worker #define U_PF_BROWSER_NATIVE_CLIENT 4020
133*0e209d39SAndroid Build Coastguard Worker /** Android is based on Linux. @internal */
134*0e209d39SAndroid Build Coastguard Worker #define U_PF_ANDROID 4050
135*0e209d39SAndroid Build Coastguard Worker /** Fuchsia is a POSIX-ish platform. @internal */
136*0e209d39SAndroid Build Coastguard Worker #define U_PF_FUCHSIA 4100
137*0e209d39SAndroid Build Coastguard Worker /* Maximum value for Linux-based platform is 4499 */
138*0e209d39SAndroid Build Coastguard Worker /**
139*0e209d39SAndroid Build Coastguard Worker  * Emscripten is a C++ transpiler for the Web that can target asm.js or
140*0e209d39SAndroid Build Coastguard Worker  * WebAssembly. It provides some POSIX-compatible wrappers and stubs and
141*0e209d39SAndroid Build Coastguard Worker  * some Linux-like functionality, but is not fully compatible with
142*0e209d39SAndroid Build Coastguard Worker  * either.
143*0e209d39SAndroid Build Coastguard Worker  * @internal
144*0e209d39SAndroid Build Coastguard Worker  */
145*0e209d39SAndroid Build Coastguard Worker #define U_PF_EMSCRIPTEN 5010
146*0e209d39SAndroid Build Coastguard Worker /** z/OS is the successor to OS/390 which was the successor to MVS. @internal */
147*0e209d39SAndroid Build Coastguard Worker #define U_PF_OS390 9000
148*0e209d39SAndroid Build Coastguard Worker /** "IBM i" is the current name of what used to be i5/OS and earlier OS/400. @internal */
149*0e209d39SAndroid Build Coastguard Worker #define U_PF_OS400 9400
150*0e209d39SAndroid Build Coastguard Worker 
151*0e209d39SAndroid Build Coastguard Worker #ifdef U_PLATFORM
152*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
153*0e209d39SAndroid Build Coastguard Worker #elif defined(__MINGW32__)
154*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_MINGW
155*0e209d39SAndroid Build Coastguard Worker #elif defined(__CYGWIN__)
156*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_CYGWIN
157*0e209d39SAndroid Build Coastguard Worker #elif defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
158*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_WINDOWS
159*0e209d39SAndroid Build Coastguard Worker #elif defined(__ANDROID__)
160*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_ANDROID
161*0e209d39SAndroid Build Coastguard Worker     /* Android wchar_t support depends on the API level. */
162*0e209d39SAndroid Build Coastguard Worker #   include <android/api-level.h>
163*0e209d39SAndroid Build Coastguard Worker #elif defined(__pnacl__) || defined(__native_client__)
164*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_BROWSER_NATIVE_CLIENT
165*0e209d39SAndroid Build Coastguard Worker #elif defined(__Fuchsia__)
166*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_FUCHSIA
167*0e209d39SAndroid Build Coastguard Worker #elif defined(linux) || defined(__linux__) || defined(__linux)
168*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_LINUX
169*0e209d39SAndroid Build Coastguard Worker #elif defined(__APPLE__) && defined(__MACH__)
170*0e209d39SAndroid Build Coastguard Worker #   include <TargetConditionals.h>
171*0e209d39SAndroid Build Coastguard Worker #   if (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) && (defined(TARGET_OS_MACCATALYST) && !TARGET_OS_MACCATALYST)   /* variant of TARGET_OS_MAC */
172*0e209d39SAndroid Build Coastguard Worker #       define U_PLATFORM U_PF_IPHONE
173*0e209d39SAndroid Build Coastguard Worker #   else
174*0e209d39SAndroid Build Coastguard Worker #       define U_PLATFORM U_PF_DARWIN
175*0e209d39SAndroid Build Coastguard Worker #   endif
176*0e209d39SAndroid Build Coastguard Worker #elif defined(BSD) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__MirBSD__)
177*0e209d39SAndroid Build Coastguard Worker #   if defined(__FreeBSD__)
178*0e209d39SAndroid Build Coastguard Worker #       include <sys/endian.h>
179*0e209d39SAndroid Build Coastguard Worker #   endif
180*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_BSD
181*0e209d39SAndroid Build Coastguard Worker #elif defined(sun) || defined(__sun)
182*0e209d39SAndroid Build Coastguard Worker     /* Check defined(__SVR4) || defined(__svr4__) to distinguish Solaris from SunOS? */
183*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_SOLARIS
184*0e209d39SAndroid Build Coastguard Worker #   if defined(__GNUC__)
185*0e209d39SAndroid Build Coastguard Worker         /* Solaris/GCC needs this header file to get the proper endianness. Normally, this
186*0e209d39SAndroid Build Coastguard Worker          * header file is included with stddef.h but on Solairs/GCC, the GCC version of stddef.h
187*0e209d39SAndroid Build Coastguard Worker          *  is included which does not include this header file.
188*0e209d39SAndroid Build Coastguard Worker          */
189*0e209d39SAndroid Build Coastguard Worker #       include <sys/isa_defs.h>
190*0e209d39SAndroid Build Coastguard Worker #   endif
191*0e209d39SAndroid Build Coastguard Worker #elif defined(_AIX) || defined(__TOS_AIX__)
192*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_AIX
193*0e209d39SAndroid Build Coastguard Worker #elif defined(_hpux) || defined(hpux) || defined(__hpux)
194*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_HPUX
195*0e209d39SAndroid Build Coastguard Worker #elif defined(sgi) || defined(__sgi)
196*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_IRIX
197*0e209d39SAndroid Build Coastguard Worker #elif defined(__QNX__) || defined(__QNXNTO__)
198*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_QNX
199*0e209d39SAndroid Build Coastguard Worker #elif defined(__TOS_MVS__)
200*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_OS390
201*0e209d39SAndroid Build Coastguard Worker #elif defined(__OS400__) || defined(__TOS_OS400__)
202*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_OS400
203*0e209d39SAndroid Build Coastguard Worker #elif defined(__EMSCRIPTEN__)
204*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_EMSCRIPTEN
205*0e209d39SAndroid Build Coastguard Worker #else
206*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM U_PF_UNKNOWN
207*0e209d39SAndroid Build Coastguard Worker #endif
208*0e209d39SAndroid Build Coastguard Worker 
209*0e209d39SAndroid Build Coastguard Worker /**
210*0e209d39SAndroid Build Coastguard Worker  * \def U_REAL_MSVC
211*0e209d39SAndroid Build Coastguard Worker  * Defined if the compiler is the real MSVC compiler (and not something like
212*0e209d39SAndroid Build Coastguard Worker  * Clang setting _MSC_VER in order to compile Windows code that requires it).
213*0e209d39SAndroid Build Coastguard Worker  * Otherwise undefined.
214*0e209d39SAndroid Build Coastguard Worker  * @internal
215*0e209d39SAndroid Build Coastguard Worker  */
216*0e209d39SAndroid Build Coastguard Worker #if (defined(_MSC_VER) && !(defined(__clang__) && __clang__)) || defined(U_IN_DOXYGEN)
217*0e209d39SAndroid Build Coastguard Worker #   define U_REAL_MSVC
218*0e209d39SAndroid Build Coastguard Worker #endif
219*0e209d39SAndroid Build Coastguard Worker 
220*0e209d39SAndroid Build Coastguard Worker /**
221*0e209d39SAndroid Build Coastguard Worker  * \def CYGWINMSVC
222*0e209d39SAndroid Build Coastguard Worker  * Defined if this is Windows with Cygwin, but using MSVC rather than gcc.
223*0e209d39SAndroid Build Coastguard Worker  * Otherwise undefined.
224*0e209d39SAndroid Build Coastguard Worker  * @internal
225*0e209d39SAndroid Build Coastguard Worker  */
226*0e209d39SAndroid Build Coastguard Worker /* Commented out because this is already set in mh-cygwin-msvc
227*0e209d39SAndroid Build Coastguard Worker #if U_PLATFORM == U_PF_CYGWIN && defined(_MSC_VER)
228*0e209d39SAndroid Build Coastguard Worker #   define CYGWINMSVC
229*0e209d39SAndroid Build Coastguard Worker #endif
230*0e209d39SAndroid Build Coastguard Worker */
231*0e209d39SAndroid Build Coastguard Worker #ifdef U_IN_DOXYGEN
232*0e209d39SAndroid Build Coastguard Worker #   define CYGWINMSVC
233*0e209d39SAndroid Build Coastguard Worker #endif
234*0e209d39SAndroid Build Coastguard Worker 
235*0e209d39SAndroid Build Coastguard Worker /**
236*0e209d39SAndroid Build Coastguard Worker  * \def U_PLATFORM_USES_ONLY_WIN32_API
237*0e209d39SAndroid Build Coastguard Worker  * Defines whether the platform uses only the Win32 API.
238*0e209d39SAndroid Build Coastguard Worker  * Set to 1 for Windows/MSVC and MinGW but not Cygwin.
239*0e209d39SAndroid Build Coastguard Worker  * @internal
240*0e209d39SAndroid Build Coastguard Worker  */
241*0e209d39SAndroid Build Coastguard Worker #ifdef U_PLATFORM_USES_ONLY_WIN32_API
242*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
243*0e209d39SAndroid Build Coastguard Worker #elif (U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_MINGW) || defined(CYGWINMSVC)
244*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM_USES_ONLY_WIN32_API 1
245*0e209d39SAndroid Build Coastguard Worker #else
246*0e209d39SAndroid Build Coastguard Worker     /* Cygwin implements POSIX. */
247*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM_USES_ONLY_WIN32_API 0
248*0e209d39SAndroid Build Coastguard Worker #endif
249*0e209d39SAndroid Build Coastguard Worker 
250*0e209d39SAndroid Build Coastguard Worker /**
251*0e209d39SAndroid Build Coastguard Worker  * \def U_PLATFORM_HAS_WIN32_API
252*0e209d39SAndroid Build Coastguard Worker  * Defines whether the Win32 API is available on the platform.
253*0e209d39SAndroid Build Coastguard Worker  * Set to 1 for Windows/MSVC, MinGW and Cygwin.
254*0e209d39SAndroid Build Coastguard Worker  * @internal
255*0e209d39SAndroid Build Coastguard Worker  */
256*0e209d39SAndroid Build Coastguard Worker #ifdef U_PLATFORM_HAS_WIN32_API
257*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
258*0e209d39SAndroid Build Coastguard Worker #elif U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
259*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM_HAS_WIN32_API 1
260*0e209d39SAndroid Build Coastguard Worker #else
261*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM_HAS_WIN32_API 0
262*0e209d39SAndroid Build Coastguard Worker #endif
263*0e209d39SAndroid Build Coastguard Worker 
264*0e209d39SAndroid Build Coastguard Worker /**
265*0e209d39SAndroid Build Coastguard Worker  * \def U_PLATFORM_HAS_WINUWP_API
266*0e209d39SAndroid Build Coastguard Worker  * Defines whether target is intended for Universal Windows Platform API
267*0e209d39SAndroid Build Coastguard Worker  * Set to 1 for Windows10 Release Solution Configuration
268*0e209d39SAndroid Build Coastguard Worker  * @internal
269*0e209d39SAndroid Build Coastguard Worker  */
270*0e209d39SAndroid Build Coastguard Worker #ifdef U_PLATFORM_HAS_WINUWP_API
271*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
272*0e209d39SAndroid Build Coastguard Worker #else
273*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM_HAS_WINUWP_API 0
274*0e209d39SAndroid Build Coastguard Worker #endif
275*0e209d39SAndroid Build Coastguard Worker 
276*0e209d39SAndroid Build Coastguard Worker /**
277*0e209d39SAndroid Build Coastguard Worker  * \def U_PLATFORM_IMPLEMENTS_POSIX
278*0e209d39SAndroid Build Coastguard Worker  * Defines whether the platform implements (most of) the POSIX API.
279*0e209d39SAndroid Build Coastguard Worker  * Set to 1 for Cygwin and most other platforms.
280*0e209d39SAndroid Build Coastguard Worker  * @internal
281*0e209d39SAndroid Build Coastguard Worker  */
282*0e209d39SAndroid Build Coastguard Worker #ifdef U_PLATFORM_IMPLEMENTS_POSIX
283*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
284*0e209d39SAndroid Build Coastguard Worker #elif U_PLATFORM_USES_ONLY_WIN32_API
285*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM_IMPLEMENTS_POSIX 0
286*0e209d39SAndroid Build Coastguard Worker #else
287*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM_IMPLEMENTS_POSIX 1
288*0e209d39SAndroid Build Coastguard Worker #endif
289*0e209d39SAndroid Build Coastguard Worker 
290*0e209d39SAndroid Build Coastguard Worker /**
291*0e209d39SAndroid Build Coastguard Worker  * \def U_PLATFORM_IS_LINUX_BASED
292*0e209d39SAndroid Build Coastguard Worker  * Defines whether the platform is Linux or one of its derivatives.
293*0e209d39SAndroid Build Coastguard Worker  * @internal
294*0e209d39SAndroid Build Coastguard Worker  */
295*0e209d39SAndroid Build Coastguard Worker #ifdef U_PLATFORM_IS_LINUX_BASED
296*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
297*0e209d39SAndroid Build Coastguard Worker #elif U_PF_LINUX <= U_PLATFORM && U_PLATFORM <= 4499
298*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM_IS_LINUX_BASED 1
299*0e209d39SAndroid Build Coastguard Worker #else
300*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM_IS_LINUX_BASED 0
301*0e209d39SAndroid Build Coastguard Worker #endif
302*0e209d39SAndroid Build Coastguard Worker 
303*0e209d39SAndroid Build Coastguard Worker /**
304*0e209d39SAndroid Build Coastguard Worker  * \def U_PLATFORM_IS_DARWIN_BASED
305*0e209d39SAndroid Build Coastguard Worker  * Defines whether the platform is Darwin or one of its derivatives.
306*0e209d39SAndroid Build Coastguard Worker  * @internal
307*0e209d39SAndroid Build Coastguard Worker  */
308*0e209d39SAndroid Build Coastguard Worker #ifdef U_PLATFORM_IS_DARWIN_BASED
309*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
310*0e209d39SAndroid Build Coastguard Worker #elif U_PF_DARWIN <= U_PLATFORM && U_PLATFORM <= U_PF_IPHONE
311*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM_IS_DARWIN_BASED 1
312*0e209d39SAndroid Build Coastguard Worker #else
313*0e209d39SAndroid Build Coastguard Worker #   define U_PLATFORM_IS_DARWIN_BASED 0
314*0e209d39SAndroid Build Coastguard Worker #endif
315*0e209d39SAndroid Build Coastguard Worker 
316*0e209d39SAndroid Build Coastguard Worker /*===========================================================================*/
317*0e209d39SAndroid Build Coastguard Worker /** @{ Compiler and environment features                                     */
318*0e209d39SAndroid Build Coastguard Worker /*===========================================================================*/
319*0e209d39SAndroid Build Coastguard Worker 
320*0e209d39SAndroid Build Coastguard Worker /**
321*0e209d39SAndroid Build Coastguard Worker  * \def U_GCC_MAJOR_MINOR
322*0e209d39SAndroid Build Coastguard Worker  * Indicates whether the compiler is gcc (test for != 0),
323*0e209d39SAndroid Build Coastguard Worker  * and if so, contains its major (times 100) and minor version numbers.
324*0e209d39SAndroid Build Coastguard Worker  * If the compiler is not gcc, then U_GCC_MAJOR_MINOR == 0.
325*0e209d39SAndroid Build Coastguard Worker  *
326*0e209d39SAndroid Build Coastguard Worker  * For example, for testing for whether we have gcc, and whether it's 4.6 or higher,
327*0e209d39SAndroid Build Coastguard Worker  * use "#if U_GCC_MAJOR_MINOR >= 406".
328*0e209d39SAndroid Build Coastguard Worker  * @internal
329*0e209d39SAndroid Build Coastguard Worker  */
330*0e209d39SAndroid Build Coastguard Worker #ifdef __GNUC__
331*0e209d39SAndroid Build Coastguard Worker #   define U_GCC_MAJOR_MINOR (__GNUC__ * 100 + __GNUC_MINOR__)
332*0e209d39SAndroid Build Coastguard Worker #else
333*0e209d39SAndroid Build Coastguard Worker #   define U_GCC_MAJOR_MINOR 0
334*0e209d39SAndroid Build Coastguard Worker #endif
335*0e209d39SAndroid Build Coastguard Worker 
336*0e209d39SAndroid Build Coastguard Worker /**
337*0e209d39SAndroid Build Coastguard Worker  * \def U_IS_BIG_ENDIAN
338*0e209d39SAndroid Build Coastguard Worker  * Determines the endianness of the platform.
339*0e209d39SAndroid Build Coastguard Worker  * @internal
340*0e209d39SAndroid Build Coastguard Worker  */
341*0e209d39SAndroid Build Coastguard Worker #ifdef U_IS_BIG_ENDIAN
342*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
343*0e209d39SAndroid Build Coastguard Worker #elif defined(BYTE_ORDER) && defined(BIG_ENDIAN)
344*0e209d39SAndroid Build Coastguard Worker #   define U_IS_BIG_ENDIAN (BYTE_ORDER == BIG_ENDIAN)
345*0e209d39SAndroid Build Coastguard Worker #elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__)
346*0e209d39SAndroid Build Coastguard Worker     /* gcc */
347*0e209d39SAndroid Build Coastguard Worker #   define U_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
348*0e209d39SAndroid Build Coastguard Worker #elif defined(__BIG_ENDIAN__) || defined(_BIG_ENDIAN)
349*0e209d39SAndroid Build Coastguard Worker #   define U_IS_BIG_ENDIAN 1
350*0e209d39SAndroid Build Coastguard Worker #elif defined(__LITTLE_ENDIAN__) || defined(_LITTLE_ENDIAN)
351*0e209d39SAndroid Build Coastguard Worker #   define U_IS_BIG_ENDIAN 0
352*0e209d39SAndroid Build Coastguard Worker #elif U_PLATFORM == U_PF_OS390 || U_PLATFORM == U_PF_OS400 || defined(__s390__) || defined(__s390x__)
353*0e209d39SAndroid Build Coastguard Worker     /* These platforms do not appear to predefine any endianness macros. */
354*0e209d39SAndroid Build Coastguard Worker #   define U_IS_BIG_ENDIAN 1
355*0e209d39SAndroid Build Coastguard Worker #elif defined(_PA_RISC1_0) || defined(_PA_RISC1_1) || defined(_PA_RISC2_0)
356*0e209d39SAndroid Build Coastguard Worker     /* HPPA do not appear to predefine any endianness macros. */
357*0e209d39SAndroid Build Coastguard Worker #   define U_IS_BIG_ENDIAN 1
358*0e209d39SAndroid Build Coastguard Worker #elif defined(sparc) || defined(__sparc) || defined(__sparc__)
359*0e209d39SAndroid Build Coastguard Worker     /* Some sparc based systems (e.g. Linux) do not predefine any endianness macros. */
360*0e209d39SAndroid Build Coastguard Worker #   define U_IS_BIG_ENDIAN 1
361*0e209d39SAndroid Build Coastguard Worker #else
362*0e209d39SAndroid Build Coastguard Worker #   define U_IS_BIG_ENDIAN 0
363*0e209d39SAndroid Build Coastguard Worker #endif
364*0e209d39SAndroid Build Coastguard Worker 
365*0e209d39SAndroid Build Coastguard Worker /**
366*0e209d39SAndroid Build Coastguard Worker  * \def U_HAVE_PLACEMENT_NEW
367*0e209d39SAndroid Build Coastguard Worker  * Determines whether to override placement new and delete for STL.
368*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 2.6
369*0e209d39SAndroid Build Coastguard Worker  */
370*0e209d39SAndroid Build Coastguard Worker #ifdef U_HAVE_PLACEMENT_NEW
371*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
372*0e209d39SAndroid Build Coastguard Worker #elif defined(__BORLANDC__)
373*0e209d39SAndroid Build Coastguard Worker #   define U_HAVE_PLACEMENT_NEW 0
374*0e209d39SAndroid Build Coastguard Worker #else
375*0e209d39SAndroid Build Coastguard Worker #   define U_HAVE_PLACEMENT_NEW 1
376*0e209d39SAndroid Build Coastguard Worker #endif
377*0e209d39SAndroid Build Coastguard Worker 
378*0e209d39SAndroid Build Coastguard Worker /**
379*0e209d39SAndroid Build Coastguard Worker  * \def U_HAVE_DEBUG_LOCATION_NEW
380*0e209d39SAndroid Build Coastguard Worker  * Define this to define the MFC debug version of the operator new.
381*0e209d39SAndroid Build Coastguard Worker  *
382*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 3.4
383*0e209d39SAndroid Build Coastguard Worker  */
384*0e209d39SAndroid Build Coastguard Worker #ifdef U_HAVE_DEBUG_LOCATION_NEW
385*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
386*0e209d39SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
387*0e209d39SAndroid Build Coastguard Worker #   define U_HAVE_DEBUG_LOCATION_NEW 1
388*0e209d39SAndroid Build Coastguard Worker #else
389*0e209d39SAndroid Build Coastguard Worker #   define U_HAVE_DEBUG_LOCATION_NEW 0
390*0e209d39SAndroid Build Coastguard Worker #endif
391*0e209d39SAndroid Build Coastguard Worker 
392*0e209d39SAndroid Build Coastguard Worker /* Compatibility with compilers other than clang: http://clang.llvm.org/docs/LanguageExtensions.html */
393*0e209d39SAndroid Build Coastguard Worker #ifdef __has_attribute
394*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_ATTRIBUTE(x) __has_attribute(x)
395*0e209d39SAndroid Build Coastguard Worker #else
396*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_ATTRIBUTE(x) 0
397*0e209d39SAndroid Build Coastguard Worker #endif
398*0e209d39SAndroid Build Coastguard Worker #ifdef __has_cpp_attribute
399*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
400*0e209d39SAndroid Build Coastguard Worker #else
401*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_CPP_ATTRIBUTE(x) 0
402*0e209d39SAndroid Build Coastguard Worker #endif
403*0e209d39SAndroid Build Coastguard Worker #ifdef __has_declspec_attribute
404*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_DECLSPEC_ATTRIBUTE(x) __has_declspec_attribute(x)
405*0e209d39SAndroid Build Coastguard Worker #else
406*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_DECLSPEC_ATTRIBUTE(x) 0
407*0e209d39SAndroid Build Coastguard Worker #endif
408*0e209d39SAndroid Build Coastguard Worker #ifdef __has_builtin
409*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_BUILTIN(x) __has_builtin(x)
410*0e209d39SAndroid Build Coastguard Worker #else
411*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_BUILTIN(x) 0
412*0e209d39SAndroid Build Coastguard Worker #endif
413*0e209d39SAndroid Build Coastguard Worker #ifdef __has_feature
414*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_FEATURE(x) __has_feature(x)
415*0e209d39SAndroid Build Coastguard Worker #else
416*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_FEATURE(x) 0
417*0e209d39SAndroid Build Coastguard Worker #endif
418*0e209d39SAndroid Build Coastguard Worker #ifdef __has_extension
419*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_EXTENSION(x) __has_extension(x)
420*0e209d39SAndroid Build Coastguard Worker #else
421*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_EXTENSION(x) 0
422*0e209d39SAndroid Build Coastguard Worker #endif
423*0e209d39SAndroid Build Coastguard Worker #ifdef __has_warning
424*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_WARNING(x) __has_warning(x)
425*0e209d39SAndroid Build Coastguard Worker #else
426*0e209d39SAndroid Build Coastguard Worker #   define UPRV_HAS_WARNING(x) 0
427*0e209d39SAndroid Build Coastguard Worker #endif
428*0e209d39SAndroid Build Coastguard Worker 
429*0e209d39SAndroid Build Coastguard Worker 
430*0e209d39SAndroid Build Coastguard Worker #if defined(__clang__)
431*0e209d39SAndroid Build Coastguard Worker #define UPRV_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize("undefined")))
432*0e209d39SAndroid Build Coastguard Worker #else
433*0e209d39SAndroid Build Coastguard Worker #define UPRV_NO_SANITIZE_UNDEFINED
434*0e209d39SAndroid Build Coastguard Worker #endif
435*0e209d39SAndroid Build Coastguard Worker 
436*0e209d39SAndroid Build Coastguard Worker /**
437*0e209d39SAndroid Build Coastguard Worker  * \def U_MALLOC_ATTR
438*0e209d39SAndroid Build Coastguard Worker  * Attribute to mark functions as malloc-like
439*0e209d39SAndroid Build Coastguard Worker  * @internal
440*0e209d39SAndroid Build Coastguard Worker  */
441*0e209d39SAndroid Build Coastguard Worker #if defined(__GNUC__) && __GNUC__>=3
442*0e209d39SAndroid Build Coastguard Worker #    define U_MALLOC_ATTR __attribute__ ((__malloc__))
443*0e209d39SAndroid Build Coastguard Worker #else
444*0e209d39SAndroid Build Coastguard Worker #    define U_MALLOC_ATTR
445*0e209d39SAndroid Build Coastguard Worker #endif
446*0e209d39SAndroid Build Coastguard Worker 
447*0e209d39SAndroid Build Coastguard Worker /**
448*0e209d39SAndroid Build Coastguard Worker  * \def U_ALLOC_SIZE_ATTR
449*0e209d39SAndroid Build Coastguard Worker  * Attribute to specify the size of the allocated buffer for malloc-like functions
450*0e209d39SAndroid Build Coastguard Worker  * @internal
451*0e209d39SAndroid Build Coastguard Worker  */
452*0e209d39SAndroid Build Coastguard Worker #if (defined(__GNUC__) &&                                            \
453*0e209d39SAndroid Build Coastguard Worker         (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) || \
454*0e209d39SAndroid Build Coastguard Worker         UPRV_HAS_ATTRIBUTE(alloc_size)
455*0e209d39SAndroid Build Coastguard Worker #   define U_ALLOC_SIZE_ATTR(X) __attribute__ ((alloc_size(X)))
456*0e209d39SAndroid Build Coastguard Worker #   define U_ALLOC_SIZE_ATTR2(X,Y) __attribute__ ((alloc_size(X,Y)))
457*0e209d39SAndroid Build Coastguard Worker #else
458*0e209d39SAndroid Build Coastguard Worker #   define U_ALLOC_SIZE_ATTR(X)
459*0e209d39SAndroid Build Coastguard Worker #   define U_ALLOC_SIZE_ATTR2(X,Y)
460*0e209d39SAndroid Build Coastguard Worker #endif
461*0e209d39SAndroid Build Coastguard Worker 
462*0e209d39SAndroid Build Coastguard Worker /**
463*0e209d39SAndroid Build Coastguard Worker  * \def U_CPLUSPLUS_VERSION
464*0e209d39SAndroid Build Coastguard Worker  * 0 if no C++; 1, 11, 14, ... if C++.
465*0e209d39SAndroid Build Coastguard Worker  * Support for specific features cannot always be determined by the C++ version alone.
466*0e209d39SAndroid Build Coastguard Worker  * @internal
467*0e209d39SAndroid Build Coastguard Worker  */
468*0e209d39SAndroid Build Coastguard Worker #ifdef U_CPLUSPLUS_VERSION
469*0e209d39SAndroid Build Coastguard Worker #   if U_CPLUSPLUS_VERSION != 0 && !defined(__cplusplus)
470*0e209d39SAndroid Build Coastguard Worker #       undef U_CPLUSPLUS_VERSION
471*0e209d39SAndroid Build Coastguard Worker #       define U_CPLUSPLUS_VERSION 0
472*0e209d39SAndroid Build Coastguard Worker #   endif
473*0e209d39SAndroid Build Coastguard Worker     /* Otherwise use the predefined value. */
474*0e209d39SAndroid Build Coastguard Worker #elif !defined(__cplusplus)
475*0e209d39SAndroid Build Coastguard Worker #   define U_CPLUSPLUS_VERSION 0
476*0e209d39SAndroid Build Coastguard Worker #elif __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
477*0e209d39SAndroid Build Coastguard Worker #   define U_CPLUSPLUS_VERSION 17
478*0e209d39SAndroid Build Coastguard Worker #elif __cplusplus >= 201402L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L)
479*0e209d39SAndroid Build Coastguard Worker #   define U_CPLUSPLUS_VERSION 14
480*0e209d39SAndroid Build Coastguard Worker #elif __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L)
481*0e209d39SAndroid Build Coastguard Worker #   define U_CPLUSPLUS_VERSION 11
482*0e209d39SAndroid Build Coastguard Worker #else
483*0e209d39SAndroid Build Coastguard Worker     // C++98 or C++03
484*0e209d39SAndroid Build Coastguard Worker #   define U_CPLUSPLUS_VERSION 1
485*0e209d39SAndroid Build Coastguard Worker #endif
486*0e209d39SAndroid Build Coastguard Worker 
487*0e209d39SAndroid Build Coastguard Worker /**
488*0e209d39SAndroid Build Coastguard Worker  * \def U_FALLTHROUGH
489*0e209d39SAndroid Build Coastguard Worker  * Annotate intentional fall-through between switch labels.
490*0e209d39SAndroid Build Coastguard Worker  * http://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough
491*0e209d39SAndroid Build Coastguard Worker  * @internal
492*0e209d39SAndroid Build Coastguard Worker  */
493*0e209d39SAndroid Build Coastguard Worker #ifndef __cplusplus
494*0e209d39SAndroid Build Coastguard Worker     // Not for C.
495*0e209d39SAndroid Build Coastguard Worker #elif defined(U_FALLTHROUGH)
496*0e209d39SAndroid Build Coastguard Worker     // Use the predefined value.
497*0e209d39SAndroid Build Coastguard Worker #elif defined(__clang__)
498*0e209d39SAndroid Build Coastguard Worker     // Test for compiler vs. feature separately.
499*0e209d39SAndroid Build Coastguard Worker     // Other compilers might choke on the feature test.
500*0e209d39SAndroid Build Coastguard Worker #    if UPRV_HAS_CPP_ATTRIBUTE(clang::fallthrough) || \
501*0e209d39SAndroid Build Coastguard Worker              (UPRV_HAS_FEATURE(cxx_attributes) &&     \
502*0e209d39SAndroid Build Coastguard Worker              UPRV_HAS_WARNING("-Wimplicit-fallthrough"))
503*0e209d39SAndroid Build Coastguard Worker #       define U_FALLTHROUGH [[clang::fallthrough]]
504*0e209d39SAndroid Build Coastguard Worker #   endif
505*0e209d39SAndroid Build Coastguard Worker #elif defined(__GNUC__) && (__GNUC__ >= 7)
506*0e209d39SAndroid Build Coastguard Worker #   define U_FALLTHROUGH __attribute__((fallthrough))
507*0e209d39SAndroid Build Coastguard Worker #endif
508*0e209d39SAndroid Build Coastguard Worker 
509*0e209d39SAndroid Build Coastguard Worker #ifndef U_FALLTHROUGH
510*0e209d39SAndroid Build Coastguard Worker #   define U_FALLTHROUGH
511*0e209d39SAndroid Build Coastguard Worker #endif
512*0e209d39SAndroid Build Coastguard Worker 
513*0e209d39SAndroid Build Coastguard Worker /** @} */
514*0e209d39SAndroid Build Coastguard Worker 
515*0e209d39SAndroid Build Coastguard Worker /*===========================================================================*/
516*0e209d39SAndroid Build Coastguard Worker /** @{ Character data types                                                  */
517*0e209d39SAndroid Build Coastguard Worker /*===========================================================================*/
518*0e209d39SAndroid Build Coastguard Worker 
519*0e209d39SAndroid Build Coastguard Worker /**
520*0e209d39SAndroid Build Coastguard Worker  * U_CHARSET_FAMILY is equal to this value when the platform is an ASCII based platform.
521*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 2.0
522*0e209d39SAndroid Build Coastguard Worker  */
523*0e209d39SAndroid Build Coastguard Worker #define U_ASCII_FAMILY 0
524*0e209d39SAndroid Build Coastguard Worker 
525*0e209d39SAndroid Build Coastguard Worker /**
526*0e209d39SAndroid Build Coastguard Worker  * U_CHARSET_FAMILY is equal to this value when the platform is an EBCDIC based platform.
527*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 2.0
528*0e209d39SAndroid Build Coastguard Worker  */
529*0e209d39SAndroid Build Coastguard Worker #define U_EBCDIC_FAMILY 1
530*0e209d39SAndroid Build Coastguard Worker 
531*0e209d39SAndroid Build Coastguard Worker /**
532*0e209d39SAndroid Build Coastguard Worker  * \def U_CHARSET_FAMILY
533*0e209d39SAndroid Build Coastguard Worker  *
534*0e209d39SAndroid Build Coastguard Worker  * <p>These definitions allow to specify the encoding of text
535*0e209d39SAndroid Build Coastguard Worker  * in the char data type as defined by the platform and the compiler.
536*0e209d39SAndroid Build Coastguard Worker  * It is enough to determine the code point values of "invariant characters",
537*0e209d39SAndroid Build Coastguard Worker  * which are the ones shared by all encodings that are in use
538*0e209d39SAndroid Build Coastguard Worker  * on a given platform.</p>
539*0e209d39SAndroid Build Coastguard Worker  *
540*0e209d39SAndroid Build Coastguard Worker  * <p>Those "invariant characters" should be all the uppercase and lowercase
541*0e209d39SAndroid Build Coastguard Worker  * latin letters, the digits, the space, and "basic punctuation".
542*0e209d39SAndroid Build Coastguard Worker  * Also, '\\n', '\\r', '\\t' should be available.</p>
543*0e209d39SAndroid Build Coastguard Worker  *
544*0e209d39SAndroid Build Coastguard Worker  * <p>The list of "invariant characters" is:<br>
545*0e209d39SAndroid Build Coastguard Worker  * \code
546*0e209d39SAndroid Build Coastguard Worker  *    A-Z  a-z  0-9  SPACE  "  %  &amp;  '  (  )  *  +  ,  -  .  /  :  ;  <  =  >  ?  _
547*0e209d39SAndroid Build Coastguard Worker  * \endcode
548*0e209d39SAndroid Build Coastguard Worker  * <br>
549*0e209d39SAndroid Build Coastguard Worker  * (52 letters + 10 numbers + 20 punc/sym/space = 82 total)</p>
550*0e209d39SAndroid Build Coastguard Worker  *
551*0e209d39SAndroid Build Coastguard Worker  * <p>This matches the IBM Syntactic Character Set (CS 640).</p>
552*0e209d39SAndroid Build Coastguard Worker  *
553*0e209d39SAndroid Build Coastguard Worker  * <p>In other words, all the graphic characters in 7-bit ASCII should
554*0e209d39SAndroid Build Coastguard Worker  * be safely accessible except the following:</p>
555*0e209d39SAndroid Build Coastguard Worker  *
556*0e209d39SAndroid Build Coastguard Worker  * \code
557*0e209d39SAndroid Build Coastguard Worker  *    '\' <backslash>
558*0e209d39SAndroid Build Coastguard Worker  *    '[' <left bracket>
559*0e209d39SAndroid Build Coastguard Worker  *    ']' <right bracket>
560*0e209d39SAndroid Build Coastguard Worker  *    '{' <left brace>
561*0e209d39SAndroid Build Coastguard Worker  *    '}' <right brace>
562*0e209d39SAndroid Build Coastguard Worker  *    '^' <circumflex>
563*0e209d39SAndroid Build Coastguard Worker  *    '~' <tilde>
564*0e209d39SAndroid Build Coastguard Worker  *    '!' <exclamation mark>
565*0e209d39SAndroid Build Coastguard Worker  *    '#' <number sign>
566*0e209d39SAndroid Build Coastguard Worker  *    '|' <vertical line>
567*0e209d39SAndroid Build Coastguard Worker  *    '$' <dollar sign>
568*0e209d39SAndroid Build Coastguard Worker  *    '@' <commercial at>
569*0e209d39SAndroid Build Coastguard Worker  *    '`' <grave accent>
570*0e209d39SAndroid Build Coastguard Worker  * \endcode
571*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 2.0
572*0e209d39SAndroid Build Coastguard Worker  */
573*0e209d39SAndroid Build Coastguard Worker #ifdef U_CHARSET_FAMILY
574*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
575*0e209d39SAndroid Build Coastguard Worker #elif U_PLATFORM == U_PF_OS390 && (!defined(__CHARSET_LIB) || !__CHARSET_LIB)
576*0e209d39SAndroid Build Coastguard Worker #   define U_CHARSET_FAMILY U_EBCDIC_FAMILY
577*0e209d39SAndroid Build Coastguard Worker #elif U_PLATFORM == U_PF_OS400 && !defined(__UTF32__)
578*0e209d39SAndroid Build Coastguard Worker #   define U_CHARSET_FAMILY U_EBCDIC_FAMILY
579*0e209d39SAndroid Build Coastguard Worker #else
580*0e209d39SAndroid Build Coastguard Worker #   define U_CHARSET_FAMILY U_ASCII_FAMILY
581*0e209d39SAndroid Build Coastguard Worker #endif
582*0e209d39SAndroid Build Coastguard Worker 
583*0e209d39SAndroid Build Coastguard Worker /**
584*0e209d39SAndroid Build Coastguard Worker  * \def U_CHARSET_IS_UTF8
585*0e209d39SAndroid Build Coastguard Worker  *
586*0e209d39SAndroid Build Coastguard Worker  * Hardcode the default charset to UTF-8.
587*0e209d39SAndroid Build Coastguard Worker  *
588*0e209d39SAndroid Build Coastguard Worker  * If this is set to 1, then
589*0e209d39SAndroid Build Coastguard Worker  * - ICU will assume that all non-invariant char*, StringPiece, std::string etc.
590*0e209d39SAndroid Build Coastguard Worker  *   contain UTF-8 text, regardless of what the system API uses
591*0e209d39SAndroid Build Coastguard Worker  * - some ICU code will use fast functions like u_strFromUTF8()
592*0e209d39SAndroid Build Coastguard Worker  *   rather than the more general and more heavy-weight conversion API (ucnv.h)
593*0e209d39SAndroid Build Coastguard Worker  * - ucnv_getDefaultName() always returns "UTF-8"
594*0e209d39SAndroid Build Coastguard Worker  * - ucnv_setDefaultName() is disabled and will not change the default charset
595*0e209d39SAndroid Build Coastguard Worker  * - static builds of ICU are smaller
596*0e209d39SAndroid Build Coastguard Worker  * - more functionality is available with the UCONFIG_NO_CONVERSION build-time
597*0e209d39SAndroid Build Coastguard Worker  *   configuration option (see unicode/uconfig.h)
598*0e209d39SAndroid Build Coastguard Worker  * - the UCONFIG_NO_CONVERSION build option in uconfig.h is more usable
599*0e209d39SAndroid Build Coastguard Worker  *
600*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 4.2
601*0e209d39SAndroid Build Coastguard Worker  * @see UCONFIG_NO_CONVERSION
602*0e209d39SAndroid Build Coastguard Worker  */
603*0e209d39SAndroid Build Coastguard Worker #ifdef U_CHARSET_IS_UTF8
604*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
605*0e209d39SAndroid Build Coastguard Worker #elif U_PLATFORM_IS_LINUX_BASED || U_PLATFORM_IS_DARWIN_BASED || \
606*0e209d39SAndroid Build Coastguard Worker         U_PLATFORM == U_PF_EMSCRIPTEN
607*0e209d39SAndroid Build Coastguard Worker #   define U_CHARSET_IS_UTF8 1
608*0e209d39SAndroid Build Coastguard Worker #else
609*0e209d39SAndroid Build Coastguard Worker #   define U_CHARSET_IS_UTF8 0
610*0e209d39SAndroid Build Coastguard Worker #endif
611*0e209d39SAndroid Build Coastguard Worker 
612*0e209d39SAndroid Build Coastguard Worker /** @} */
613*0e209d39SAndroid Build Coastguard Worker 
614*0e209d39SAndroid Build Coastguard Worker /*===========================================================================*/
615*0e209d39SAndroid Build Coastguard Worker /** @{ Information about wchar support                                       */
616*0e209d39SAndroid Build Coastguard Worker /*===========================================================================*/
617*0e209d39SAndroid Build Coastguard Worker 
618*0e209d39SAndroid Build Coastguard Worker /**
619*0e209d39SAndroid Build Coastguard Worker  * \def U_HAVE_WCHAR_H
620*0e209d39SAndroid Build Coastguard Worker  * Indicates whether <wchar.h> is available (1) or not (0). Set to 1 by default.
621*0e209d39SAndroid Build Coastguard Worker  *
622*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 2.0
623*0e209d39SAndroid Build Coastguard Worker  */
624*0e209d39SAndroid Build Coastguard Worker #ifdef U_HAVE_WCHAR_H
625*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
626*0e209d39SAndroid Build Coastguard Worker #elif U_PLATFORM == U_PF_ANDROID && __ANDROID_API__ < 9
627*0e209d39SAndroid Build Coastguard Worker     /*
628*0e209d39SAndroid Build Coastguard Worker      * Android before Gingerbread (Android 2.3, API level 9) did not support wchar_t.
629*0e209d39SAndroid Build Coastguard Worker      * The type and header existed, but the library functions did not work as expected.
630*0e209d39SAndroid Build Coastguard Worker      * The size of wchar_t was 1 but L"xyz" string literals had 32-bit units anyway.
631*0e209d39SAndroid Build Coastguard Worker      */
632*0e209d39SAndroid Build Coastguard Worker #   define U_HAVE_WCHAR_H 0
633*0e209d39SAndroid Build Coastguard Worker #else
634*0e209d39SAndroid Build Coastguard Worker #   define U_HAVE_WCHAR_H 1
635*0e209d39SAndroid Build Coastguard Worker #endif
636*0e209d39SAndroid Build Coastguard Worker 
637*0e209d39SAndroid Build Coastguard Worker /**
638*0e209d39SAndroid Build Coastguard Worker  * \def U_SIZEOF_WCHAR_T
639*0e209d39SAndroid Build Coastguard Worker  * U_SIZEOF_WCHAR_T==sizeof(wchar_t)
640*0e209d39SAndroid Build Coastguard Worker  *
641*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 2.0
642*0e209d39SAndroid Build Coastguard Worker  */
643*0e209d39SAndroid Build Coastguard Worker #ifdef U_SIZEOF_WCHAR_T
644*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
645*0e209d39SAndroid Build Coastguard Worker #elif (U_PLATFORM == U_PF_ANDROID && __ANDROID_API__ < 9)
646*0e209d39SAndroid Build Coastguard Worker     /*
647*0e209d39SAndroid Build Coastguard Worker      * Classic Mac OS and Mac OS X before 10.3 (Panther) did not support wchar_t or wstring.
648*0e209d39SAndroid Build Coastguard Worker      * Newer Mac OS X has size 4.
649*0e209d39SAndroid Build Coastguard Worker      */
650*0e209d39SAndroid Build Coastguard Worker #   define U_SIZEOF_WCHAR_T 1
651*0e209d39SAndroid Build Coastguard Worker #elif U_PLATFORM_HAS_WIN32_API || U_PLATFORM == U_PF_CYGWIN
652*0e209d39SAndroid Build Coastguard Worker #   define U_SIZEOF_WCHAR_T 2
653*0e209d39SAndroid Build Coastguard Worker #elif U_PLATFORM == U_PF_AIX
654*0e209d39SAndroid Build Coastguard Worker     /*
655*0e209d39SAndroid Build Coastguard Worker      * AIX 6.1 information, section "Wide character data representation":
656*0e209d39SAndroid Build Coastguard Worker      * "... the wchar_t datatype is 32-bit in the 64-bit environment and
657*0e209d39SAndroid Build Coastguard Worker      * 16-bit in the 32-bit environment."
658*0e209d39SAndroid Build Coastguard Worker      * and
659*0e209d39SAndroid Build Coastguard Worker      * "All locales use Unicode for their wide character code values (process code),
660*0e209d39SAndroid Build Coastguard Worker      * except the IBM-eucTW codeset."
661*0e209d39SAndroid Build Coastguard Worker      */
662*0e209d39SAndroid Build Coastguard Worker #   ifdef __64BIT__
663*0e209d39SAndroid Build Coastguard Worker #       define U_SIZEOF_WCHAR_T 4
664*0e209d39SAndroid Build Coastguard Worker #   else
665*0e209d39SAndroid Build Coastguard Worker #       define U_SIZEOF_WCHAR_T 2
666*0e209d39SAndroid Build Coastguard Worker #   endif
667*0e209d39SAndroid Build Coastguard Worker #elif U_PLATFORM == U_PF_OS390
668*0e209d39SAndroid Build Coastguard Worker     /*
669*0e209d39SAndroid Build Coastguard Worker      * z/OS V1R11 information center, section "LP64 | ILP32":
670*0e209d39SAndroid Build Coastguard Worker      * "In 31-bit mode, the size of long and pointers is 4 bytes and the size of wchar_t is 2 bytes.
671*0e209d39SAndroid Build Coastguard Worker      * Under LP64, the size of long and pointer is 8 bytes and the size of wchar_t is 4 bytes."
672*0e209d39SAndroid Build Coastguard Worker      */
673*0e209d39SAndroid Build Coastguard Worker #   ifdef _LP64
674*0e209d39SAndroid Build Coastguard Worker #       define U_SIZEOF_WCHAR_T 4
675*0e209d39SAndroid Build Coastguard Worker #   else
676*0e209d39SAndroid Build Coastguard Worker #       define U_SIZEOF_WCHAR_T 2
677*0e209d39SAndroid Build Coastguard Worker #   endif
678*0e209d39SAndroid Build Coastguard Worker #elif U_PLATFORM == U_PF_OS400
679*0e209d39SAndroid Build Coastguard Worker #   if defined(__UTF32__)
680*0e209d39SAndroid Build Coastguard Worker         /*
681*0e209d39SAndroid Build Coastguard Worker          * LOCALETYPE(*LOCALEUTF) is specified.
682*0e209d39SAndroid Build Coastguard Worker          * Wide-character strings are in UTF-32,
683*0e209d39SAndroid Build Coastguard Worker          * narrow-character strings are in UTF-8.
684*0e209d39SAndroid Build Coastguard Worker          */
685*0e209d39SAndroid Build Coastguard Worker #       define U_SIZEOF_WCHAR_T 4
686*0e209d39SAndroid Build Coastguard Worker #   elif defined(__UCS2__)
687*0e209d39SAndroid Build Coastguard Worker         /*
688*0e209d39SAndroid Build Coastguard Worker          * LOCALETYPE(*LOCALEUCS2) is specified.
689*0e209d39SAndroid Build Coastguard Worker          * Wide-character strings are in UCS-2,
690*0e209d39SAndroid Build Coastguard Worker          * narrow-character strings are in EBCDIC.
691*0e209d39SAndroid Build Coastguard Worker          */
692*0e209d39SAndroid Build Coastguard Worker #       define U_SIZEOF_WCHAR_T 2
693*0e209d39SAndroid Build Coastguard Worker #   else
694*0e209d39SAndroid Build Coastguard Worker         /*
695*0e209d39SAndroid Build Coastguard Worker          * LOCALETYPE(*CLD) or LOCALETYPE(*LOCALE) is specified.
696*0e209d39SAndroid Build Coastguard Worker          * Wide-character strings are in 16-bit EBCDIC,
697*0e209d39SAndroid Build Coastguard Worker          * narrow-character strings are in EBCDIC.
698*0e209d39SAndroid Build Coastguard Worker          */
699*0e209d39SAndroid Build Coastguard Worker #       define U_SIZEOF_WCHAR_T 2
700*0e209d39SAndroid Build Coastguard Worker #   endif
701*0e209d39SAndroid Build Coastguard Worker #else
702*0e209d39SAndroid Build Coastguard Worker #   define U_SIZEOF_WCHAR_T 4
703*0e209d39SAndroid Build Coastguard Worker #endif
704*0e209d39SAndroid Build Coastguard Worker 
705*0e209d39SAndroid Build Coastguard Worker #ifndef U_HAVE_WCSCPY
706*0e209d39SAndroid Build Coastguard Worker #define U_HAVE_WCSCPY U_HAVE_WCHAR_H
707*0e209d39SAndroid Build Coastguard Worker #endif
708*0e209d39SAndroid Build Coastguard Worker 
709*0e209d39SAndroid Build Coastguard Worker /** @} */
710*0e209d39SAndroid Build Coastguard Worker 
711*0e209d39SAndroid Build Coastguard Worker /**
712*0e209d39SAndroid Build Coastguard Worker  * \def U_HAVE_CHAR16_T
713*0e209d39SAndroid Build Coastguard Worker  * Defines whether the char16_t type is available for UTF-16
714*0e209d39SAndroid Build Coastguard Worker  * and u"abc" UTF-16 string literals are supported.
715*0e209d39SAndroid Build Coastguard Worker  * This is a new standard type and standard string literal syntax in C++11
716*0e209d39SAndroid Build Coastguard Worker  * but has been available in some compilers before.
717*0e209d39SAndroid Build Coastguard Worker  * @internal
718*0e209d39SAndroid Build Coastguard Worker  */
719*0e209d39SAndroid Build Coastguard Worker #ifdef U_HAVE_CHAR16_T
720*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
721*0e209d39SAndroid Build Coastguard Worker #else
722*0e209d39SAndroid Build Coastguard Worker     /*
723*0e209d39SAndroid Build Coastguard Worker      * Notes:
724*0e209d39SAndroid Build Coastguard Worker      * C++11 and C11 require support for UTF-16 literals
725*0e209d39SAndroid Build Coastguard Worker      * Doesn't work on Mac C11 (see workaround in ptypes.h).
726*0e209d39SAndroid Build Coastguard Worker      */
727*0e209d39SAndroid Build Coastguard Worker #   if defined(__cplusplus) || !U_PLATFORM_IS_DARWIN_BASED
728*0e209d39SAndroid Build Coastguard Worker #       define U_HAVE_CHAR16_T 1
729*0e209d39SAndroid Build Coastguard Worker #   else
730*0e209d39SAndroid Build Coastguard Worker #       define U_HAVE_CHAR16_T 0
731*0e209d39SAndroid Build Coastguard Worker #   endif
732*0e209d39SAndroid Build Coastguard Worker #endif
733*0e209d39SAndroid Build Coastguard Worker 
734*0e209d39SAndroid Build Coastguard Worker /**
735*0e209d39SAndroid Build Coastguard Worker  * @{
736*0e209d39SAndroid Build Coastguard Worker  * \def U_DECLARE_UTF16
737*0e209d39SAndroid Build Coastguard Worker  * Do not use this macro because it is not defined on all platforms.
738*0e209d39SAndroid Build Coastguard Worker  * Use the UNICODE_STRING or U_STRING_DECL macros instead.
739*0e209d39SAndroid Build Coastguard Worker  * @internal
740*0e209d39SAndroid Build Coastguard Worker  */
741*0e209d39SAndroid Build Coastguard Worker #ifdef U_DECLARE_UTF16
742*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
743*0e209d39SAndroid Build Coastguard Worker #elif U_HAVE_CHAR16_T \
744*0e209d39SAndroid Build Coastguard Worker     || (defined(__xlC__) && defined(__IBM_UTF_LITERAL) && U_SIZEOF_WCHAR_T != 2) \
745*0e209d39SAndroid Build Coastguard Worker     || (defined(__HP_aCC) && __HP_aCC >= 035000) \
746*0e209d39SAndroid Build Coastguard Worker     || (defined(__HP_cc) && __HP_cc >= 111106) \
747*0e209d39SAndroid Build Coastguard Worker     || (defined(U_IN_DOXYGEN))
748*0e209d39SAndroid Build Coastguard Worker #   define U_DECLARE_UTF16(string) u ## string
749*0e209d39SAndroid Build Coastguard Worker #elif U_SIZEOF_WCHAR_T == 2 \
750*0e209d39SAndroid Build Coastguard Worker     && (U_CHARSET_FAMILY == 0 || (U_PF_OS390 <= U_PLATFORM && U_PLATFORM <= U_PF_OS400 && defined(__UCS2__)))
751*0e209d39SAndroid Build Coastguard Worker #   define U_DECLARE_UTF16(string) L ## string
752*0e209d39SAndroid Build Coastguard Worker #else
753*0e209d39SAndroid Build Coastguard Worker     /* Leave U_DECLARE_UTF16 undefined. See unistr.h. */
754*0e209d39SAndroid Build Coastguard Worker #endif
755*0e209d39SAndroid Build Coastguard Worker 
756*0e209d39SAndroid Build Coastguard Worker /** @} */
757*0e209d39SAndroid Build Coastguard Worker 
758*0e209d39SAndroid Build Coastguard Worker /*===========================================================================*/
759*0e209d39SAndroid Build Coastguard Worker /** @{ Symbol import-export control                                          */
760*0e209d39SAndroid Build Coastguard Worker /*===========================================================================*/
761*0e209d39SAndroid Build Coastguard Worker 
762*0e209d39SAndroid Build Coastguard Worker #ifdef U_EXPORT
763*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
764*0e209d39SAndroid Build Coastguard Worker #elif defined(U_STATIC_IMPLEMENTATION)
765*0e209d39SAndroid Build Coastguard Worker #   define U_EXPORT
766*0e209d39SAndroid Build Coastguard Worker #elif defined(_MSC_VER) || (UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllexport__) && \
767*0e209d39SAndroid Build Coastguard Worker                             UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllimport__))
768*0e209d39SAndroid Build Coastguard Worker #   define U_EXPORT __declspec(dllexport)
769*0e209d39SAndroid Build Coastguard Worker #elif defined(__GNUC__)
770*0e209d39SAndroid Build Coastguard Worker #   define U_EXPORT __attribute__((visibility("default")))
771*0e209d39SAndroid Build Coastguard Worker #elif (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x550) \
772*0e209d39SAndroid Build Coastguard Worker    || (defined(__SUNPRO_C) && __SUNPRO_C >= 0x550)
773*0e209d39SAndroid Build Coastguard Worker #   define U_EXPORT __global
774*0e209d39SAndroid Build Coastguard Worker /*#elif defined(__HP_aCC) || defined(__HP_cc)
775*0e209d39SAndroid Build Coastguard Worker #   define U_EXPORT __declspec(dllexport)*/
776*0e209d39SAndroid Build Coastguard Worker #else
777*0e209d39SAndroid Build Coastguard Worker #   define U_EXPORT
778*0e209d39SAndroid Build Coastguard Worker #endif
779*0e209d39SAndroid Build Coastguard Worker 
780*0e209d39SAndroid Build Coastguard Worker /* U_CALLCONV is related to U_EXPORT2 */
781*0e209d39SAndroid Build Coastguard Worker #ifdef U_EXPORT2
782*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
783*0e209d39SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
784*0e209d39SAndroid Build Coastguard Worker #   define U_EXPORT2 __cdecl
785*0e209d39SAndroid Build Coastguard Worker #else
786*0e209d39SAndroid Build Coastguard Worker #   define U_EXPORT2
787*0e209d39SAndroid Build Coastguard Worker #endif
788*0e209d39SAndroid Build Coastguard Worker 
789*0e209d39SAndroid Build Coastguard Worker #ifdef U_IMPORT
790*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
791*0e209d39SAndroid Build Coastguard Worker #elif defined(_MSC_VER) || (UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllexport__) && \
792*0e209d39SAndroid Build Coastguard Worker                             UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllimport__))
793*0e209d39SAndroid Build Coastguard Worker     /* Windows needs to export/import data. */
794*0e209d39SAndroid Build Coastguard Worker #   define U_IMPORT __declspec(dllimport)
795*0e209d39SAndroid Build Coastguard Worker #else
796*0e209d39SAndroid Build Coastguard Worker #   define U_IMPORT
797*0e209d39SAndroid Build Coastguard Worker #endif
798*0e209d39SAndroid Build Coastguard Worker 
799*0e209d39SAndroid Build Coastguard Worker /**
800*0e209d39SAndroid Build Coastguard Worker  * \def U_HIDDEN
801*0e209d39SAndroid Build Coastguard Worker  * This is used to mark internal structs declared within external classes,
802*0e209d39SAndroid Build Coastguard Worker  * to prevent the internal structs from having the same visibility as the
803*0e209d39SAndroid Build Coastguard Worker  * class within which they are declared.
804*0e209d39SAndroid Build Coastguard Worker  * @internal
805*0e209d39SAndroid Build Coastguard Worker  */
806*0e209d39SAndroid Build Coastguard Worker #ifdef U_HIDDEN
807*0e209d39SAndroid Build Coastguard Worker     /* Use the predefined value. */
808*0e209d39SAndroid Build Coastguard Worker #elif defined(__GNUC__)
809*0e209d39SAndroid Build Coastguard Worker #   define U_HIDDEN __attribute__((visibility("hidden")))
810*0e209d39SAndroid Build Coastguard Worker #else
811*0e209d39SAndroid Build Coastguard Worker #   define U_HIDDEN
812*0e209d39SAndroid Build Coastguard Worker #endif
813*0e209d39SAndroid Build Coastguard Worker 
814*0e209d39SAndroid Build Coastguard Worker /**
815*0e209d39SAndroid Build Coastguard Worker  * \def U_CALLCONV
816*0e209d39SAndroid Build Coastguard Worker  * Similar to U_CDECL_BEGIN/U_CDECL_END, this qualifier is necessary
817*0e209d39SAndroid Build Coastguard Worker  * in callback function typedefs to make sure that the calling convention
818*0e209d39SAndroid Build Coastguard Worker  * is compatible.
819*0e209d39SAndroid Build Coastguard Worker  *
820*0e209d39SAndroid Build Coastguard Worker  * This is only used for non-ICU-API functions.
821*0e209d39SAndroid Build Coastguard Worker  * When a function is a public ICU API,
822*0e209d39SAndroid Build Coastguard Worker  * you must use the U_CAPI and U_EXPORT2 qualifiers.
823*0e209d39SAndroid Build Coastguard Worker  *
824*0e209d39SAndroid Build Coastguard Worker  * Please note, you need to use U_CALLCONV after the *.
825*0e209d39SAndroid Build Coastguard Worker  *
826*0e209d39SAndroid Build Coastguard Worker  * NO : "static const char U_CALLCONV *func( . . . )"
827*0e209d39SAndroid Build Coastguard Worker  * YES: "static const char* U_CALLCONV func( . . . )"
828*0e209d39SAndroid Build Coastguard Worker  *
829*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 2.0
830*0e209d39SAndroid Build Coastguard Worker  */
831*0e209d39SAndroid Build Coastguard Worker #if U_PLATFORM == U_PF_OS390 && defined(__cplusplus)
832*0e209d39SAndroid Build Coastguard Worker #    define U_CALLCONV __cdecl
833*0e209d39SAndroid Build Coastguard Worker #else
834*0e209d39SAndroid Build Coastguard Worker #    define U_CALLCONV U_EXPORT2
835*0e209d39SAndroid Build Coastguard Worker #endif
836*0e209d39SAndroid Build Coastguard Worker 
837*0e209d39SAndroid Build Coastguard Worker /**
838*0e209d39SAndroid Build Coastguard Worker  * \def U_CALLCONV_FPTR
839*0e209d39SAndroid Build Coastguard Worker  * Similar to U_CALLCONV, but only used on function pointers.
840*0e209d39SAndroid Build Coastguard Worker  * @internal
841*0e209d39SAndroid Build Coastguard Worker  */
842*0e209d39SAndroid Build Coastguard Worker #if U_PLATFORM == U_PF_OS390 && defined(__cplusplus)
843*0e209d39SAndroid Build Coastguard Worker #    define U_CALLCONV_FPTR U_CALLCONV
844*0e209d39SAndroid Build Coastguard Worker #else
845*0e209d39SAndroid Build Coastguard Worker #    define U_CALLCONV_FPTR
846*0e209d39SAndroid Build Coastguard Worker #endif
847*0e209d39SAndroid Build Coastguard Worker /** @} */
848*0e209d39SAndroid Build Coastguard Worker 
849*0e209d39SAndroid Build Coastguard Worker #endif  // _PLATFORM_H
850