Home | History | Annotate | Download | only in unicode
      1 /*
      2 ******************************************************************************
      3 *
      4 *   Copyright (C) 1997-2010, International Business Machines
      5 *   Corporation and others.  All Rights Reserved.
      6 *
      7 ******************************************************************************
      8 *
      9 * Note: autoconf creates platform.h from platform.h.in at configure time.
     10 *
     11 ******************************************************************************
     12 *
     13 *  FILE NAME : platform.h
     14 *
     15 *   Date        Name        Description
     16 *   05/13/98    nos         Creation (content moved here from ptypes.h).
     17 *   03/02/99    stephen     Added AS400 support.
     18 *   03/30/99    stephen     Added Linux support.
     19 *   04/13/99    stephen     Reworked for autoconf.
     20 ******************************************************************************
     21 */
     22 
     23 #ifndef _PLATFORM_H
     24 #define _PLATFORM_H
     25 
     26 /**
     27  * \file
     28  * \brief Basic types for the platform
     29  */
     30 
     31 /* This file should be included before uvernum.h. */
     32 #if defined(UVERNUM_H)
     33 # error Do not include unicode/uvernum.h before #including unicode/platform.h.  Instead of unicode/uvernum.h, #include unicode/uversion.h
     34 #endif
     35 
     36 /**
     37  * Determine wheter to enable auto cleanup of libraries.
     38  * @internal
     39  */
     40 #ifndef UCLN_NO_AUTO_CLEANUP
     41 #define UCLN_NO_AUTO_CLEANUP 1
     42 #endif
     43 
     44 /* Need platform.h when using CYGWINMSVC to get definitions above. Ignore everything else. */
     45 #ifndef CYGWINMSVC
     46 
     47 /** Define the platform we're on. */
     48 #ifndef U_DARWIN
     49 #define U_DARWIN
     50 #endif
     51 
     52 #include <AvailabilityMacros.h>
     53 #include <TargetConditionals.h>
     54 
     55 /**
     56  * Add a second platform define to handle differences between Mac OS X and iOS
     57  */
     58 #if TARGET_OS_IPHONE
     59 #ifndef U_IOS
     60 #define U_IOS
     61 #endif
     62 #endif
     63 
     64 /**
     65  * \def U_HAVE_DIRENT_H
     66  * Define whether dirent.h is available
     67  * @internal
     68  */
     69 #ifndef U_HAVE_DIRENT_H
     70 #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
     71 #define U_HAVE_DIRENT_H 0
     72 #else
     73 #define U_HAVE_DIRENT_H 1
     74 #endif
     75 #endif
     76 
     77 /** Define whether inttypes.h is available */
     78 #ifndef U_HAVE_INTTYPES_H
     79 #define U_HAVE_INTTYPES_H 1
     80 #endif
     81 
     82 /**
     83  * Define what support for C++ streams is available.
     84  *     If U_IOSTREAM_SOURCE is set to 199711, then &lt;iostream&gt; is available
     85  * (1997711 is the date the ISO/IEC C++ FDIS was published), and then
     86  * one should qualify streams using the std namespace in ICU header
     87  * files.
     88  *     If U_IOSTREAM_SOURCE is set to 198506, then &lt;iostream.h&gt; is
     89  * available instead (198506 is the date when Stroustrup published
     90  * "An Extensible I/O Facility for C++" at the summer USENIX conference).
     91  *     If U_IOSTREAM_SOURCE is 0, then C++ streams are not available and
     92  * support for them will be silently suppressed in ICU.
     93  *
     94  */
     95 
     96 #ifndef U_IOSTREAM_SOURCE
     97 #define U_IOSTREAM_SOURCE 199711
     98 #endif
     99 
    100 /**
    101  * \def U_HAVE_STD_STRING
    102  * Define whether the standard C++ (STL) &lt;string&gt; header is available.
    103  * For platforms that do not use platform.h and do not define this constant
    104  * in their platform-specific headers, std_string.h defaults
    105  * U_HAVE_STD_STRING to 1.
    106  * @internal
    107  */
    108 #ifndef U_HAVE_STD_STRING
    109 #define U_HAVE_STD_STRING 1
    110 #endif
    111 
    112 /** @{ Determines whether specific types are available */
    113 #ifndef U_HAVE_INT8_T
    114 #define U_HAVE_INT8_T 1
    115 #endif
    116 
    117 #ifndef U_HAVE_UINT8_T
    118 #define U_HAVE_UINT8_T 1
    119 #endif
    120 
    121 #ifndef U_HAVE_INT16_T
    122 #define U_HAVE_INT16_T 1
    123 #endif
    124 
    125 #ifndef U_HAVE_UINT16_T
    126 #define U_HAVE_UINT16_T 1
    127 #endif
    128 
    129 #ifndef U_HAVE_INT32_T
    130 #define U_HAVE_INT32_T 1
    131 #endif
    132 
    133 #ifndef U_HAVE_UINT32_T
    134 #define U_HAVE_UINT32_T 1
    135 #endif
    136 
    137 #ifndef U_HAVE_INT64_T
    138 #define U_HAVE_INT64_T 1
    139 #endif
    140 
    141 #ifndef U_HAVE_UINT64_T
    142 #define U_HAVE_UINT64_T 1
    143 #endif
    144 
    145 /** @} */
    146 
    147 /*===========================================================================*/
    148 /** @{ Compiler and environment features                                     */
    149 /*===========================================================================*/
    150 
    151 /* Define whether namespace is supported */
    152 #ifndef U_HAVE_NAMESPACE
    153 #define U_HAVE_NAMESPACE 1
    154 #endif
    155 
    156 /* Determines the endianness of the platform
    157    It's done this way in case multiple architectures are being built at once.
    158    For example, Darwin supports fat binaries, which can be both PPC and x86 based. */
    159 #if defined(BYTE_ORDER) && defined(BIG_ENDIAN)
    160 #define U_IS_BIG_ENDIAN (BYTE_ORDER == BIG_ENDIAN)
    161 #else
    162 #define U_IS_BIG_ENDIAN 0
    163 #endif
    164 
    165 /* 1 or 0 to enable or disable threads.  If undefined, default is: enable threads. */
    166 #ifndef ICU_USE_THREADS
    167 #define ICU_USE_THREADS 1
    168 #endif
    169 
    170 /* On strong memory model CPUs (e.g. x86 CPUs), we use a safe & quick double check lock. */
    171 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
    172 #define UMTX_STRONG_MEMORY_MODEL 1
    173 #endif
    174 
    175 #ifndef U_DEBUG
    176 #define U_DEBUG 0
    177 #endif
    178 
    179 #ifndef U_RELEASE
    180 #define U_RELEASE 1
    181 #endif
    182 
    183 /* Determine whether to disable renaming or not. This overrides the
    184    setting in umachine.h which is for all platforms. */
    185 #ifndef U_DISABLE_RENAMING
    186 #define U_DISABLE_RENAMING 0
    187 #endif
    188 
    189 /* Determine whether to override new and delete. */
    190 #ifndef U_OVERRIDE_CXX_ALLOCATION
    191 #define U_OVERRIDE_CXX_ALLOCATION 1
    192 #endif
    193 /* Determine whether to override placement new and delete for STL. */
    194 #ifndef U_HAVE_PLACEMENT_NEW
    195 #define U_HAVE_PLACEMENT_NEW 1
    196 #endif
    197 
    198 /* Determine whether to enable tracing. */
    199 #ifndef U_ENABLE_TRACING
    200 #define U_ENABLE_TRACING 0
    201 #endif
    202 
    203 /**
    204  * Whether to enable Dynamic loading in ICU
    205  * @internal
    206  */
    207 #ifndef U_ENABLE_DYLOAD
    208 #define U_ENABLE_DYLOAD 1
    209 #endif
    210 
    211 /**
    212  * Whether to test Dynamic loading as an OS capabilty
    213  * @internal
    214  */
    215 #ifndef U_CHECK_DYLOAD
    216 #define U_CHECK_DYLOAD 1
    217 #endif
    218 
    219 
    220 /** Do we allow ICU users to use the draft APIs by default? */
    221 #ifndef U_DEFAULT_SHOW_DRAFT
    222 #define U_DEFAULT_SHOW_DRAFT 1
    223 #endif
    224 
    225 /** @} */
    226 
    227 /*===========================================================================*/
    228 /** @{ Character data types                                                      */
    229 /*===========================================================================*/
    230 
    231 #if ((defined(OS390) && (!defined(__CHARSET_LIB) || !__CHARSET_LIB))) || defined(OS400)
    232 #   define U_CHARSET_FAMILY 1
    233 #endif
    234 
    235 /** @} */
    236 
    237 /*===========================================================================*/
    238 /** @{ Information about wchar support                                           */
    239 /*===========================================================================*/
    240 
    241 #ifndef U_HAVE_WCHAR_H
    242 #define U_HAVE_WCHAR_H      1
    243 #endif
    244 
    245 #ifndef U_SIZEOF_WCHAR_T
    246 #define U_SIZEOF_WCHAR_T    4
    247 #endif
    248 
    249 #ifndef U_HAVE_WCSCPY
    250 #define U_HAVE_WCSCPY       1
    251 #endif
    252 
    253 /** @} */
    254 
    255 /**
    256  * @{
    257  * \def U_DECLARE_UTF16
    258  * Do not use this macro. Use the UNICODE_STRING or U_STRING_DECL macros
    259  * instead.
    260  * @internal
    261  *
    262  * \def U_GNUC_UTF16_STRING
    263  * @internal
    264  */
    265 #ifndef U_GNUC_UTF16_STRING
    266 #define U_GNUC_UTF16_STRING 0
    267 #endif
    268 #if 1 || defined(U_CHECK_UTF16_STRING)
    269 #if (defined(__xlC__) && defined(__IBM_UTF_LITERAL) && U_SIZEOF_WCHAR_T != 2) \
    270     || (defined(__HP_aCC) && __HP_aCC >= 035000) \
    271     || (defined(__HP_cc) && __HP_cc >= 111106) \
    272     || U_GNUC_UTF16_STRING
    273 #define U_DECLARE_UTF16(string) u ## string
    274 #elif (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x550)
    275 /* || (defined(__SUNPRO_C) && __SUNPRO_C >= 0x580) */
    276 /* Sun's C compiler has issues with this notation, and it's unreliable. */
    277 #define U_DECLARE_UTF16(string) U ## string
    278 #elif U_SIZEOF_WCHAR_T == 2 \
    279     && (U_CHARSET_FAMILY == 0 || ((defined(OS390) || defined(OS400)) && defined(__UCS2__)))
    280 #define U_DECLARE_UTF16(string) L ## string
    281 #endif
    282 #endif
    283 
    284 /** @} */
    285 
    286 /*===========================================================================*/
    287 /** @{ Information about POSIX support                                           */
    288 /*===========================================================================*/
    289 
    290 #ifndef U_HAVE_NL_LANGINFO_CODESET
    291 #define U_HAVE_NL_LANGINFO_CODESET  1
    292 #endif
    293 
    294 #ifndef U_NL_LANGINFO_CODESET
    295 #define U_NL_LANGINFO_CODESET       CODESET
    296 #endif
    297 
    298 #if 1
    299 #define U_TZSET         tzset
    300 #endif
    301 #ifndef U_IOS
    302 /* The iOS version of timezone is busted (at least in the simulator, it is
    303    never set to anything useful). Leave it undefined to avoid a code path
    304    in putil.c. */
    305 #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
    306 #define U_TIMEZONE 0
    307 #else
    308 #define U_TIMEZONE timezone
    309 #endif
    310 #endif  // !U_IOS
    311 #if 1
    312 #define U_TZNAME        tzname
    313 #endif
    314 
    315 #define U_HAVE_MMAP     1
    316 #define U_HAVE_POPEN    1
    317 
    318 /** @} */
    319 
    320 /*===========================================================================*/
    321 /** @{ Symbol import-export control                                              */
    322 /*===========================================================================*/
    323 
    324 #ifdef U_STATIC_IMPLEMENTATION
    325 #define U_EXPORT
    326 #elif 1
    327 #define U_EXPORT __attribute__((visibility("default")))
    328 #elif (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x550) \
    329    || (defined(__SUNPRO_C) && __SUNPRO_C >= 0x550)
    330 #define U_EXPORT __global
    331 /*#elif defined(__HP_aCC) || defined(__HP_cc)
    332 #define U_EXPORT __declspec(dllexport)*/
    333 #else
    334 #define U_EXPORT
    335 #endif
    336 
    337 /* U_CALLCONV is releated to U_EXPORT2 */
    338 #define U_EXPORT2
    339 
    340 /* cygwin needs to export/import data */
    341 #if defined(U_CYGWIN) && !defined(__GNUC__)
    342 #define U_IMPORT __declspec(dllimport)
    343 #else
    344 #define U_IMPORT
    345 #endif
    346 
    347 /* @} */
    348 
    349 /*===========================================================================*/
    350 /** @{ Code alignment and C function inlining                                    */
    351 /*===========================================================================*/
    352 
    353 #ifndef U_INLINE
    354 #   ifdef __cplusplus
    355 #       define U_INLINE inline
    356 #   else
    357 #       define U_INLINE __inline__
    358 #   endif
    359 #endif
    360 
    361 #ifndef U_ALIGN_CODE
    362 #define U_ALIGN_CODE(n)
    363 #endif
    364 
    365 /** @} */
    366 
    367 /*===========================================================================*/
    368 /** @{ GCC built in functions for atomic memory operations                       */
    369 /*===========================================================================*/
    370 
    371 /**
    372  * \def U_HAVE_GCC_ATOMICS
    373  * @internal
    374  */
    375 #ifndef U_HAVE_GCC_ATOMICS
    376 #define U_HAVE_GCC_ATOMICS 1
    377 #endif
    378 
    379 /** @} */
    380 
    381 /*===========================================================================*/
    382 /** @{ Programs used by ICU code                                                 */
    383 /*===========================================================================*/
    384 
    385 /**
    386  * \def U_MAKE
    387  * What program to execute to run 'make'
    388  */
    389 #ifndef U_MAKE
    390 #define U_MAKE  "/usr/bin/gnumake"
    391 #endif
    392 
    393 /** @} */
    394 
    395 #endif /* CYGWINMSVC */
    396 
    397 /*===========================================================================*/
    398 /* Custom icu entry point renaming                                                  */
    399 /*===========================================================================*/
    400 
    401 /**
    402  * Define the library suffix with C syntax.
    403  * @internal
    404  */
    405 # define U_LIB_SUFFIX_C_NAME
    406 /**
    407  * Define the library suffix as a string with C syntax
    408  * @internal
    409  */
    410 # define U_LIB_SUFFIX_C_NAME_STRING ""
    411 /**
    412  * 1 if a custom library suffix is set
    413  * @internal
    414  */
    415 # define U_HAVE_LIB_SUFFIX 0
    416 
    417 #if U_HAVE_LIB_SUFFIX
    418 # ifndef U_ICU_ENTRY_POINT_RENAME
    419 /* Renaming pattern:    u_strcpy_41_suffix */
    420 #  define U_ICU_ENTRY_POINT_RENAME(x)    x ## _ ## 46 ##
    421 #  define U_DEF_ICUDATA_ENTRY_POINT(major, minor) icudt####major##minor##_dat
    422 
    423 # endif
    424 #endif
    425 
    426 /*===========================================================================*/
    427 /* Local defines                                                             */
    428 /*===========================================================================*/
    429 
    430 /* On the Mac, we define U_WCHAR_IS_UTF32 to treat wchar_t as though it
    431    contains UTF-32 at all times.  Strictly speaking, that's not entirely
    432    correct given Mac's libc (__STDC_ISO_10646__ is not defined) , but provided
    433    that we ignore libc's locale support (by not calling setlocale) and its
    434    multibyte string support, this should be fine.  Our codebase makes enough
    435    other assumptions about a UTF-8 locale and UTF-32 wchar_t strings for this
    436    to make sense. */
    437 #define U_WCHAR_IS_UTF32
    438 
    439 #endif
    440