intl/icu/source/common/unicode/platform.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

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

mercurial