1 // © 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 /* 4 ****************************************************************************** 5 * 6 * Copyright (C) 1999-2015, International Business Machines 7 * Corporation and others. All Rights Reserved. 8 * 9 ****************************************************************************** 10 * file name: umachine.h 11 * encoding: UTF-8 12 * tab size: 8 (not used) 13 * indentation:4 14 * 15 * created on: 1999sep13 16 * created by: Markus W. Scherer 17 * 18 * This file defines basic types and constants for ICU to be 19 * platform-independent. umachine.h and utf.h are included into 20 * utypes.h to provide all the general definitions for ICU. 21 * All of these definitions used to be in utypes.h before 22 * the UTF-handling macros made this unmaintainable. 23 */ 24 25 #ifndef __UMACHINE_H__ 26 #define __UMACHINE_H__ 27 28 29 /** 30 * \file 31 * \brief Basic types and constants for UTF 32 * 33 * <h2> Basic types and constants for UTF </h2> 34 * This file defines basic types and constants for utf.h to be 35 * platform-independent. umachine.h and utf.h are included into 36 * utypes.h to provide all the general definitions for ICU. 37 * All of these definitions used to be in utypes.h before 38 * the UTF-handling macros made this unmaintainable. 39 * 40 */ 41 /*==========================================================================*/ 42 /* Include platform-dependent definitions */ 43 /* which are contained in the platform-specific file platform.h */ 44 /*==========================================================================*/ 45 46 #include "unicode/ptypes.h" /* platform.h is included in ptypes.h */ 47 48 /* 49 * ANSI C headers: 50 * stddef.h defines wchar_t 51 */ 52 #include <stddef.h> 53 54 /*==========================================================================*/ 55 /* For C wrappers, we use the symbol U_STABLE. */ 56 /* This works properly if the includer is C or C++. */ 57 /* Functions are declared U_STABLE return-type U_EXPORT2 function-name()... */ 58 /*==========================================================================*/ 59 60 /** 61 * \def U_CFUNC 62 * This is used in a declaration of a library private ICU C function. 63 * @stable ICU 2.4 64 */ 65 66 /** 67 * \def U_CDECL_BEGIN 68 * This is used to begin a declaration of a library private ICU C API. 69 * @stable ICU 2.4 70 */ 71 72 /** 73 * \def U_CDECL_END 74 * This is used to end a declaration of a library private ICU C API 75 * @stable ICU 2.4 76 */ 77 78 #ifdef __cplusplus 79 # define U_CFUNC extern "C" 80 # define U_CDECL_BEGIN extern "C" { 81 # define U_CDECL_END } 82 #else 83 # define U_CFUNC extern 84 # define U_CDECL_BEGIN 85 # define U_CDECL_END 86 #endif 87 88 #ifndef U_ATTRIBUTE_DEPRECATED 89 /** 90 * \def U_ATTRIBUTE_DEPRECATED 91 * This is used for GCC specific attributes 92 * @internal 93 */ 94 #if U_GCC_MAJOR_MINOR >= 302 95 # define U_ATTRIBUTE_DEPRECATED __attribute__ ((deprecated)) 96 /** 97 * \def U_ATTRIBUTE_DEPRECATED 98 * This is used for Visual C++ specific attributes 99 * @internal 100 */ 101 #elif defined(_MSC_VER) && (_MSC_VER >= 1400) 102 # define U_ATTRIBUTE_DEPRECATED __declspec(deprecated) 103 #else 104 # define U_ATTRIBUTE_DEPRECATED 105 #endif 106 #endif 107 108 /** This is used to declare a function as a public ICU C API @stable ICU 2.0*/ 109 #define U_CAPI U_CFUNC U_EXPORT 110 /** This is used to declare a function as a stable public ICU C API*/ 111 #define U_STABLE U_CAPI 112 /** This is used to declare a function as a draft public ICU C API */ 113 #define U_DRAFT U_CAPI 114 /** This is used to declare a function as a deprecated public ICU C API */ 115 #define U_DEPRECATED U_CAPI U_ATTRIBUTE_DEPRECATED 116 /** This is used to declare a function as an obsolete public ICU C API */ 117 #define U_OBSOLETE U_CAPI 118 /** This is used to declare a function as an internal ICU C API */ 119 #define U_INTERNAL U_CAPI 120 121 /** 122 * \def U_OVERRIDE 123 * Defined to the C++11 "override" keyword if available. 124 * Denotes a class or member which is an override of the base class. 125 * May result in an error if it applied to something not an override. 126 * @internal 127 */ 128 #ifndef U_OVERRIDE 129 #define U_OVERRIDE override 130 #endif 131 132 /** 133 * \def U_FINAL 134 * Defined to the C++11 "final" keyword if available. 135 * Denotes a class or member which may not be overridden in subclasses. 136 * May result in an error if subclasses attempt to override. 137 * @internal 138 */ 139 #if !defined(U_FINAL) || defined(U_IN_DOXYGEN) 140 #define U_FINAL final 141 #endif 142 143 144 /*==========================================================================*/ 145 /* limits for int32_t etc., like in POSIX inttypes.h */ 146 /*==========================================================================*/ 147 148 #ifndef INT8_MIN 149 /** The smallest value an 8 bit signed integer can hold @stable ICU 2.0 */ 150 # define INT8_MIN ((int8_t)(-128)) 151 #endif 152 #ifndef INT16_MIN 153 /** The smallest value a 16 bit signed integer can hold @stable ICU 2.0 */ 154 # define INT16_MIN ((int16_t)(-32767-1)) 155 #endif 156 #ifndef INT32_MIN 157 /** The smallest value a 32 bit signed integer can hold @stable ICU 2.0 */ 158 # define INT32_MIN ((int32_t)(-2147483647-1)) 159 #endif 160 161 #ifndef INT8_MAX 162 /** The largest value an 8 bit signed integer can hold @stable ICU 2.0 */ 163 # define INT8_MAX ((int8_t)(127)) 164 #endif 165 #ifndef INT16_MAX 166 /** The largest value a 16 bit signed integer can hold @stable ICU 2.0 */ 167 # define INT16_MAX ((int16_t)(32767)) 168 #endif 169 #ifndef INT32_MAX 170 /** The largest value a 32 bit signed integer can hold @stable ICU 2.0 */ 171 # define INT32_MAX ((int32_t)(2147483647)) 172 #endif 173 174 #ifndef UINT8_MAX 175 /** The largest value an 8 bit unsigned integer can hold @stable ICU 2.0 */ 176 # define UINT8_MAX ((uint8_t)(255U)) 177 #endif 178 #ifndef UINT16_MAX 179 /** The largest value a 16 bit unsigned integer can hold @stable ICU 2.0 */ 180 # define UINT16_MAX ((uint16_t)(65535U)) 181 #endif 182 #ifndef UINT32_MAX 183 /** The largest value a 32 bit unsigned integer can hold @stable ICU 2.0 */ 184 # define UINT32_MAX ((uint32_t)(4294967295U)) 185 #endif 186 187 #if defined(U_INT64_T_UNAVAILABLE) 188 # error int64_t is required for decimal format and rule-based number format. 189 #else 190 # ifndef INT64_C 191 /** 192 * Provides a platform independent way to specify a signed 64-bit integer constant. 193 * note: may be wrong for some 64 bit platforms - ensure your compiler provides INT64_C 194 * @stable ICU 2.8 195 */ 196 # define INT64_C(c) c ## LL 197 # endif 198 # ifndef UINT64_C 199 /** 200 * Provides a platform independent way to specify an unsigned 64-bit integer constant. 201 * note: may be wrong for some 64 bit platforms - ensure your compiler provides UINT64_C 202 * @stable ICU 2.8 203 */ 204 # define UINT64_C(c) c ## ULL 205 # endif 206 # ifndef U_INT64_MIN 207 /** The smallest value a 64 bit signed integer can hold @stable ICU 2.8 */ 208 # define U_INT64_MIN ((int64_t)(INT64_C(-9223372036854775807)-1)) 209 # endif 210 # ifndef U_INT64_MAX 211 /** The largest value a 64 bit signed integer can hold @stable ICU 2.8 */ 212 # define U_INT64_MAX ((int64_t)(INT64_C(9223372036854775807))) 213 # endif 214 # ifndef U_UINT64_MAX 215 /** The largest value a 64 bit unsigned integer can hold @stable ICU 2.8 */ 216 # define U_UINT64_MAX ((uint64_t)(UINT64_C(18446744073709551615))) 217 # endif 218 #endif 219 220 /*==========================================================================*/ 221 /* Boolean data type */ 222 /*==========================================================================*/ 223 224 /** The ICU boolean type @stable ICU 2.0 */ 225 typedef int8_t UBool; 226 227 #ifndef TRUE 228 /** The TRUE value of a UBool @stable ICU 2.0 */ 229 # define TRUE 1 230 #endif 231 #ifndef FALSE 232 /** The FALSE value of a UBool @stable ICU 2.0 */ 233 # define FALSE 0 234 #endif 235 236 237 /*==========================================================================*/ 238 /* Unicode data types */ 239 /*==========================================================================*/ 240 241 /* wchar_t-related definitions -------------------------------------------- */ 242 243 /* 244 * \def U_WCHAR_IS_UTF16 245 * Defined if wchar_t uses UTF-16. 246 * 247 * @stable ICU 2.0 248 */ 249 /* 250 * \def U_WCHAR_IS_UTF32 251 * Defined if wchar_t uses UTF-32. 252 * 253 * @stable ICU 2.0 254 */ 255 #if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32) 256 # ifdef __STDC_ISO_10646__ 257 # if (U_SIZEOF_WCHAR_T==2) 258 # define U_WCHAR_IS_UTF16 259 # elif (U_SIZEOF_WCHAR_T==4) 260 # define U_WCHAR_IS_UTF32 261 # endif 262 # elif defined __UCS2__ 263 # if (U_PF_OS390 <= U_PLATFORM && U_PLATFORM <= U_PF_OS400) && (U_SIZEOF_WCHAR_T==2) 264 # define U_WCHAR_IS_UTF16 265 # endif 266 # elif defined(__UCS4__) || (U_PLATFORM == U_PF_OS400 && defined(__UTF32__)) 267 # if (U_SIZEOF_WCHAR_T==4) 268 # define U_WCHAR_IS_UTF32 269 # endif 270 # elif U_PLATFORM_IS_DARWIN_BASED || (U_SIZEOF_WCHAR_T==4 && U_PLATFORM_IS_LINUX_BASED) 271 # define U_WCHAR_IS_UTF32 272 # elif U_PLATFORM_HAS_WIN32_API 273 # define U_WCHAR_IS_UTF16 274 # endif 275 #endif 276 277 /* UChar and UChar32 definitions -------------------------------------------- */ 278 279 /** Number of bytes in a UChar. @stable ICU 2.0 */ 280 #define U_SIZEOF_UCHAR 2 281 282 /** 283 * \def U_CHAR16_IS_TYPEDEF 284 * If 1, then char16_t is a typedef and not a real type (yet) 285 * @internal 286 */ 287 #if (U_PLATFORM == U_PF_AIX) && defined(__cplusplus) &&(U_CPLUSPLUS_VERSION < 11) 288 // for AIX, uchar.h needs to be included 289 # include <uchar.h> 290 # define U_CHAR16_IS_TYPEDEF 1 291 #elif defined(_MSC_VER) && (_MSC_VER < 1900) 292 // Versions of Visual Studio/MSVC below 2015 do not support char16_t as a real type, 293 // and instead use a typedef. https://msdn.microsoft.com/library/bb531344.aspx 294 # define U_CHAR16_IS_TYPEDEF 1 295 #else 296 # define U_CHAR16_IS_TYPEDEF 0 297 #endif 298 299 300 /** 301 * \var UChar 302 * 303 * The base type for UTF-16 code units and pointers. 304 * Unsigned 16-bit integer. 305 * Starting with ICU 59, C++ API uses char16_t directly, while C API continues to use UChar. 306 * 307 * UChar is configurable by defining the macro UCHAR_TYPE 308 * on the preprocessor or compiler command line: 309 * -DUCHAR_TYPE=uint16_t or -DUCHAR_TYPE=wchar_t (if U_SIZEOF_WCHAR_T==2) etc. 310 * (The UCHAR_TYPE can also be \#defined earlier in this file, for outside the ICU library code.) 311 * This is for transitional use from application code that uses uint16_t or wchar_t for UTF-16. 312 * 313 * The default is UChar=char16_t. 314 * 315 * C++11 defines char16_t as bit-compatible with uint16_t, but as a distinct type. 316 * 317 * In C, char16_t is a simple typedef of uint_least16_t. 318 * ICU requires uint_least16_t=uint16_t for data memory mapping. 319 * On macOS, char16_t is not available because the uchar.h standard header is missing. 320 * 321 * @stable ICU 4.4 322 */ 323 324 #if 1 325 // #if 1 is normal. UChar defaults to char16_t in C++. 326 // For configuration testing of UChar=uint16_t temporarily change this to #if 0. 327 // The intltest Makefile #defines UCHAR_TYPE=char16_t, 328 // so we only #define it to uint16_t if it is undefined so far. 329 #elif !defined(UCHAR_TYPE) 330 # define UCHAR_TYPE uint16_t 331 #endif 332 333 #if defined(U_COMBINED_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) || \ 334 defined(U_I18N_IMPLEMENTATION) || defined(U_IO_IMPLEMENTATION) 335 // Inside the ICU library code, never configurable. 336 typedef char16_t UChar; 337 #elif defined(UCHAR_TYPE) 338 typedef UCHAR_TYPE UChar; 339 #elif defined(__cplusplus) 340 typedef char16_t UChar; 341 #else 342 typedef uint16_t UChar; 343 #endif 344 345 /** 346 * \var OldUChar 347 * Default ICU 58 definition of UChar. 348 * A base type for UTF-16 code units and pointers. 349 * Unsigned 16-bit integer. 350 * 351 * Define OldUChar to be wchar_t if that is 16 bits wide. 352 * If wchar_t is not 16 bits wide, then define UChar to be uint16_t. 353 * 354 * This makes the definition of OldUChar platform-dependent 355 * but allows direct string type compatibility with platforms with 356 * 16-bit wchar_t types. 357 * 358 * This is how UChar was defined in ICU 58, for transition convenience. 359 * Exception: ICU 58 UChar was defined to UCHAR_TYPE if that macro was defined. 360 * The current UChar responds to UCHAR_TYPE but OldUChar does not. 361 * 362 * @stable ICU 59 363 */ 364 #if U_SIZEOF_WCHAR_T==2 365 typedef wchar_t OldUChar; 366 #elif defined(__CHAR16_TYPE__) 367 typedef __CHAR16_TYPE__ OldUChar; 368 #else 369 typedef uint16_t OldUChar; 370 #endif 371 372 /** 373 * Define UChar32 as a type for single Unicode code points. 374 * UChar32 is a signed 32-bit integer (same as int32_t). 375 * 376 * The Unicode code point range is 0..0x10ffff. 377 * All other values (negative or >=0x110000) are illegal as Unicode code points. 378 * They may be used as sentinel values to indicate "done", "error" 379 * or similar non-code point conditions. 380 * 381 * Before ICU 2.4 (Jitterbug 2146), UChar32 was defined 382 * to be wchar_t if that is 32 bits wide (wchar_t may be signed or unsigned) 383 * or else to be uint32_t. 384 * That is, the definition of UChar32 was platform-dependent. 385 * 386 * @see U_SENTINEL 387 * @stable ICU 2.4 388 */ 389 typedef int32_t UChar32; 390 391 /** 392 * This value is intended for sentinel values for APIs that 393 * (take or) return single code points (UChar32). 394 * It is outside of the Unicode code point range 0..0x10ffff. 395 * 396 * For example, a "done" or "error" value in a new API 397 * could be indicated with U_SENTINEL. 398 * 399 * ICU APIs designed before ICU 2.4 usually define service-specific "done" 400 * values, mostly 0xffff. 401 * Those may need to be distinguished from 402 * actual U+ffff text contents by calling functions like 403 * CharacterIterator::hasNext() or UnicodeString::length(). 404 * 405 * @return -1 406 * @see UChar32 407 * @stable ICU 2.4 408 */ 409 #define U_SENTINEL (-1) 410 411 #include "unicode/urename.h" 412 413 #endif 414