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