Home | History | Annotate | Download | only in unicode
      1 /*
      2 ******************************************************************************
      3 *
      4 *   Copyright (C) 1997-2009, 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 */
     18 
     19 #ifndef _PLATFORM_H
     20 #define _PLATFORM_H
     21 
     22 /**
     23  * \file
     24  * \brief Basic types for the platform
     25  */
     26 
     27 /* Define the platform we're on. */
     28 #ifndef U_LINUX
     29 #define U_LINUX
     30 #endif
     31 
     32 /**
     33  * \def U_HAVE_DIRENT_H
     34  * Define whether dirent.h is available */
     35 #ifndef U_HAVE_DIRENT_H
     36 #define U_HAVE_DIRENT_H 1
     37 #endif
     38 
     39 /** Define whether inttypes.h is available */
     40 #ifndef U_HAVE_INTTYPES_H
     41 #define U_HAVE_INTTYPES_H 1
     42 #endif
     43 
     44 /**
     45  * Define what support for C++ streams is available.
     46  *     If U_IOSTREAM_SOURCE is set to 199711, then <iostream> is available
     47  * (1997711 is the date the ISO/IEC C++ FDIS was published), and then
     48  * one should qualify streams using the std namespace in ICU header
     49  * files.
     50  *     If U_IOSTREAM_SOURCE is set to 198506, then <iostream.h> is
     51  * available instead (198506 is the date when Stroustrup published
     52  * "An Extensible I/O Facility for C++" at the summer USENIX conference).
     53  *     If U_IOSTREAM_SOURCE is 0, then C++ streams are not available and
     54  * support for them will be silently suppressed in ICU.
     55  *
     56  */
     57 
     58 #ifndef U_IOSTREAM_SOURCE
     59 #define U_IOSTREAM_SOURCE 199711
     60 #endif
     61 
     62 /**
     63  * \def U_HAVE_STD_STRING
     64  * Define whether the standard C++ (STL) <string> header is available.
     65  * For platforms that do not use platform.h and do not define this constant
     66  * in their platform-specific headers, std_string.h defaults
     67  * U_HAVE_STD_STRING to 1.
     68  * @draft ICU 4.2
     69  */
     70 #ifdef HAVE_ANDROID_OS
     71 #define U_HAVE_STD_STRING 0
     72 #else
     73 #ifndef U_HAVE_STD_STRING
     74 #define U_HAVE_STD_STRING 1
     75 #endif
     76 #endif
     77 
     78 /** @{ Determines whether specific types are available */
     79 #ifndef U_HAVE_INT8_T
     80 #define U_HAVE_INT8_T 1
     81 #endif
     82 
     83 #ifndef U_HAVE_UINT8_T
     84 #define U_HAVE_UINT8_T 1
     85 #endif
     86 
     87 #ifndef U_HAVE_INT16_T
     88 #define U_HAVE_INT16_T 1
     89 #endif
     90 
     91 #ifndef U_HAVE_UINT16_T
     92 #define U_HAVE_UINT16_T 1
     93 #endif
     94 
     95 #ifndef U_HAVE_INT32_T
     96 #define U_HAVE_INT32_T 1
     97 #endif
     98 
     99 #ifndef U_HAVE_UINT32_T
    100 #define U_HAVE_UINT32_T 1
    101 #endif
    102 
    103 #ifndef U_HAVE_INT64_T
    104 #define U_HAVE_INT64_T 1
    105 #endif
    106 
    107 #ifndef U_HAVE_UINT64_T
    108 #define U_HAVE_UINT64_T 1
    109 #endif
    110 
    111 /** @} */
    112 
    113 /*===========================================================================*/
    114 /** @{ Generic data types                                                        */
    115 /*===========================================================================*/
    116 
    117 #include <sys/types.h>
    118 
    119 /* If your platform does not have the <inttypes.h> header, you may
    120    need to edit the typedefs below. */
    121 #if U_HAVE_INTTYPES_H
    122 
    123 /* autoconf 2.13 sometimes can't properly find the data types in <inttypes.h> */
    124 /* os/390 needs <inttypes.h>, but it doesn't have int8_t, and it sometimes */
    125 /* doesn't have uint8_t depending on the OS version. */
    126 /* So we have this work around. */
    127 #ifdef OS390
    128 /* The features header is needed to get (u)int64_t sometimes. */
    129 #include <features.h>
    130 #if ! U_HAVE_INT8_T
    131 typedef signed char int8_t;
    132 #endif
    133 #if !defined(__uint8_t)
    134 #define __uint8_t 1
    135 typedef unsigned char uint8_t;
    136 #endif
    137 #endif /* OS390 */
    138 
    139 #include <inttypes.h>
    140 
    141 #else /* U_HAVE_INTTYPES_H */
    142 
    143 #if ! U_HAVE_INT8_T
    144 typedef signed char int8_t;
    145 #endif
    146 
    147 #if ! U_HAVE_UINT8_T
    148 typedef unsigned char uint8_t;
    149 #endif
    150 
    151 #if ! U_HAVE_INT16_T
    152 typedef signed short int16_t;
    153 #endif
    154 
    155 #if ! U_HAVE_UINT16_T
    156 typedef unsigned short uint16_t;
    157 #endif
    158 
    159 #if ! U_HAVE_INT32_T
    160 typedef signed int int32_t;
    161 #endif
    162 
    163 #if ! U_HAVE_UINT32_T
    164 typedef unsigned int uint32_t;
    165 #endif
    166 
    167 #if ! U_HAVE_INT64_T
    168     typedef signed long long int64_t;
    169 /* else we may not have a 64-bit type */
    170 #endif
    171 
    172 #if ! U_HAVE_UINT64_T
    173     typedef unsigned long long uint64_t;
    174 /* else we may not have a 64-bit type */
    175 #endif
    176 
    177 #endif
    178 
    179 /** @} */
    180 
    181 /*===========================================================================*/
    182 /** @{ Compiler and environment features                                         */
    183 /*===========================================================================*/
    184 
    185 /* Define whether namespace is supported */
    186 #ifndef U_HAVE_NAMESPACE
    187 #define U_HAVE_NAMESPACE 1
    188 #endif
    189 
    190 /* Determines the endianness of the platform
    191    It's done this way in case multiple architectures are being built at once.
    192    For example, Darwin supports fat binaries, which can be both PPC and x86 based. */
    193 #if defined(BYTE_ORDER) && defined(BIG_ENDIAN)
    194 #define U_IS_BIG_ENDIAN (BYTE_ORDER == BIG_ENDIAN)
    195 #else
    196 #define U_IS_BIG_ENDIAN 0
    197 #endif
    198 
    199 /* 1 or 0 to enable or disable threads.  If undefined, default is: enable threads. */
    200 #define ICU_USE_THREADS 1
    201 
    202 /* On strong memory model CPUs (e.g. x86 CPUs), we use a safe & quick double check lock. */
    203 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
    204 #define UMTX_STRONG_MEMORY_MODEL 1
    205 #endif
    206 
    207 #ifndef U_DEBUG
    208 #define U_DEBUG 0
    209 #endif
    210 
    211 #ifndef U_RELEASE
    212 #define U_RELEASE 1
    213 #endif
    214 
    215 /* Determine whether to disable renaming or not. This overrides the
    216    setting in umachine.h which is for all platforms. */
    217 #ifndef U_DISABLE_RENAMING
    218 #define U_DISABLE_RENAMING 0
    219 #endif
    220 
    221 /* Determine whether to override new and delete. */
    222 #ifndef U_OVERRIDE_CXX_ALLOCATION
    223 #define U_OVERRIDE_CXX_ALLOCATION 1
    224 #endif
    225 /* Determine whether to override placement new and delete for STL. */
    226 #ifndef U_HAVE_PLACEMENT_NEW
    227 #define U_HAVE_PLACEMENT_NEW 1
    228 #endif
    229 
    230 /* Determine whether to enable tracing. */
    231 #ifndef U_ENABLE_TRACING
    232 #define U_ENABLE_TRACING 0
    233 #endif
    234 
    235 /* Do we allow ICU users to use the draft APIs by default? */
    236 #ifndef U_DEFAULT_SHOW_DRAFT
    237 #define U_DEFAULT_SHOW_DRAFT 1
    238 #endif
    239 
    240 /* Define the library suffix in a C syntax. */
    241 #define U_HAVE_LIB_SUFFIX 0
    242 #define U_LIB_SUFFIX_C_NAME
    243 #define U_LIB_SUFFIX_C_NAME_STRING ""
    244 
    245 /** @} */
    246 
    247 /*===========================================================================*/
    248 /** @{ Character data types                                                      */
    249 /*===========================================================================*/
    250 
    251 #if ((defined(OS390) && (!defined(__CHARSET_LIB) || !__CHARSET_LIB))) || defined(OS400)
    252 #   define U_CHARSET_FAMILY 1
    253 #endif
    254 
    255 /** @} */
    256 
    257 /*===========================================================================*/
    258 /** @{ Information about wchar support                                           */
    259 /*===========================================================================*/
    260 // BEGIN android-note
    261 // We changed "ARM_FLAG" to "HAVE_ANDROID_OS" immediately below.
    262 // Consensus seems to be that the intent of ARM_FLAG is actually that
    263 // it represent whether we are compiling for Android, and if that's
    264 // the case then we might as well use the standard definition instead.
    265 // END android-note
    266 #if HAVE_ANDROID_OS
    267 #define U_HAVE_WCHAR_H      0
    268 #define U_SIZEOF_WCHAR_T    1
    269 
    270 #define U_HAVE_WCSCPY       0
    271 
    272 #else
    273 
    274 #ifndef U_HAVE_WCHAR_H
    275 #define U_HAVE_WCHAR_H      1
    276 #endif
    277 
    278 #ifndef U_SIZEOF_WCHAR_T
    279 #define U_SIZEOF_WCHAR_T    4
    280 #endif
    281 
    282 #ifndef U_HAVE_WCSCPY
    283 #define U_HAVE_WCSCPY       1
    284 #endif
    285 
    286 #endif
    287 
    288 /** @} */
    289 
    290 /**
    291  * @{
    292  * \def U_DECLARE_UTF16
    293  * Do not use this macro. Use the UNICODE_STRING or U_STRING_DECL macros
    294  * instead.
    295  * @internal
    296  */
    297 #if 1 || defined(U_CHECK_UTF16_STRING)
    298 #if (defined(__xlC__) && defined(__IBM_UTF_LITERAL) && U_SIZEOF_WCHAR_T != 2) \
    299     || (defined(__HP_aCC) && __HP_aCC >= 035000) \
    300     || (defined(__HP_cc) && __HP_cc >= 111106)
    301 #define U_DECLARE_UTF16(string) u ## string
    302 #elif (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x550)
    303 /* || (defined(__SUNPRO_C) && __SUNPRO_C >= 0x580) */
    304 /* Sun's C compiler has issues with this notation, and it's unreliable. */
    305 #define U_DECLARE_UTF16(string) U ## string
    306 #elif U_SIZEOF_WCHAR_T == 2 \
    307     && (U_CHARSET_FAMILY == 0 || ((defined(OS390) || defined(OS400)) && defined(__UCS2__)))
    308 #define U_DECLARE_UTF16(string) L ## string
    309 #endif
    310 #endif
    311 
    312 /** @} */
    313 
    314 /*===========================================================================*/
    315 /** @{ Information about POSIX support                                           */
    316 /*===========================================================================*/
    317 // BEGIN android-note
    318 // See Android comment above.
    319 // END android-note
    320 #if !HAVE_ANDROID_OS
    321 #define U_HAVE_NL_LANGINFO          1
    322 
    323 #ifndef U_HAVE_NL_LANGINFO_CODESET
    324 #define U_HAVE_NL_LANGINFO_CODESET  1
    325 #endif
    326 
    327 #endif
    328 
    329 #ifndef U_NL_LANGINFO_CODESET
    330 #define U_NL_LANGINFO_CODESET       CODESET
    331 #endif
    332 
    333 #if !HAVE_ANDROID_OS
    334 #if 1
    335 #define U_TZSET         tzset
    336 #endif
    337 #if 1
    338 #define U_TIMEZONE      timezone
    339 #endif
    340 #if 1
    341 #define U_TZNAME        tzname
    342 #endif
    343 #endif
    344 
    345 #define U_HAVE_MMAP     1
    346 #define U_HAVE_POPEN    1
    347 
    348 /** @} */
    349 
    350 /*===========================================================================*/
    351 /** @{ Symbol import-export control                                              */
    352 /*===========================================================================*/
    353 
    354 #if 1
    355 #define U_EXPORT __attribute__((visibility("default")))
    356 #elif (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x550) \
    357    || (defined(__SUNPRO_C) && __SUNPRO_C >= 0x550)
    358 #define U_EXPORT __global
    359 /*#elif defined(__HP_aCC) || defined(__HP_cc)
    360 #define U_EXPORT __declspec(dllexport)*/
    361 #else
    362 #define U_EXPORT
    363 #endif
    364 
    365 /* U_CALLCONV is releated to U_EXPORT2 */
    366 #define U_EXPORT2
    367 
    368 /* cygwin needs to export/import data */
    369 #ifdef U_CYGWIN
    370 #define U_IMPORT __declspec(dllimport)
    371 #else
    372 #define U_IMPORT
    373 #endif
    374 
    375 /* @} */
    376 
    377 /*===========================================================================*/
    378 /** @{ Code alignment and C function inlining                                    */
    379 /*===========================================================================*/
    380 
    381 #ifndef U_INLINE
    382 #   ifdef __cplusplus
    383 #       define U_INLINE inline
    384 #   else
    385 #       define U_INLINE inline
    386 #   endif
    387 #endif
    388 
    389 #ifndef U_ALIGN_CODE
    390 #define U_ALIGN_CODE(n)
    391 #endif
    392 
    393 /** @} */
    394 
    395 /*===========================================================================*/
    396 /** @{ Programs used by ICU code                                                 */
    397 /*===========================================================================*/
    398 
    399 /**
    400  * \def U_MAKE
    401  * What program to execute to run 'make'
    402  */
    403 #ifndef U_MAKE
    404 #define U_MAKE  "make"
    405 #endif
    406 
    407 /** @} */
    408 #endif
    409