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 " % & ' ( ) * + , - . / : ; < = > ? _ 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