Home | History | Annotate | Download | only in msinttypes
      1 // ISO C9x  compliant stdint.h for Microsoft Visual Studio
      2 // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
      3 //
      4 //  Copyright (c) 2006-2013 Alexander Chemeris
      5 //
      6 // Redistribution and use in source and binary forms, with or without
      7 // modification, are permitted provided that the following conditions are met:
      8 //
      9 //   1. Redistributions of source code must retain the above copyright notice,
     10 //      this list of conditions and the following disclaimer.
     11 //
     12 //   2. Redistributions in binary form must reproduce the above copyright
     13 //      notice, this list of conditions and the following disclaimer in the
     14 //      documentation and/or other materials provided with the distribution.
     15 //
     16 //   3. Neither the name of the product nor the names of its contributors may
     17 //      be used to endorse or promote products derived from this software
     18 //      without specific prior written permission.
     19 //
     20 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
     21 // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     22 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     23 // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     25 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     26 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     27 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     28 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     29 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 //
     31 ///////////////////////////////////////////////////////////////////////////////
     32 
     33 // The above software in this distribution may have been modified by
     34 // THL A29 Limited ("Tencent Modifications").
     35 // All Tencent Modifications are Copyright (C) 2015 THL A29 Limited.
     36 
     37 #ifndef _MSC_VER // [
     38 #error "Use this header only with Microsoft Visual C++ compilers!"
     39 #endif // _MSC_VER ]
     40 
     41 #ifndef _MSC_STDINT_H_ // [
     42 #define _MSC_STDINT_H_
     43 
     44 #if _MSC_VER > 1000
     45 #pragma once
     46 #endif
     47 
     48 // miloyip: Originally Visual Studio 2010 uses its own stdint.h. However it generates warning with INT64_C(), so change to use this file for vs2010.
     49 #if _MSC_VER >= 1600 // [
     50 #include <stdint.h>
     51 
     52 #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260
     53 
     54 #undef INT8_C
     55 #undef INT16_C
     56 #undef INT32_C
     57 #undef INT64_C
     58 #undef UINT8_C
     59 #undef UINT16_C
     60 #undef UINT32_C
     61 #undef UINT64_C
     62 
     63 // 7.18.4.1 Macros for minimum-width integer constants
     64 
     65 #define INT8_C(val)  val##i8
     66 #define INT16_C(val) val##i16
     67 #define INT32_C(val) val##i32
     68 #define INT64_C(val) val##i64
     69 
     70 #define UINT8_C(val)  val##ui8
     71 #define UINT16_C(val) val##ui16
     72 #define UINT32_C(val) val##ui32
     73 #define UINT64_C(val) val##ui64
     74 
     75 // 7.18.4.2 Macros for greatest-width integer constants
     76 // These #ifndef's are needed to prevent collisions with <boost/cstdint.hpp>.
     77 // Check out Issue 9 for the details.
     78 #ifndef INTMAX_C //   [
     79 #  define INTMAX_C   INT64_C
     80 #endif // INTMAX_C    ]
     81 #ifndef UINTMAX_C //  [
     82 #  define UINTMAX_C  UINT64_C
     83 #endif // UINTMAX_C   ]
     84 
     85 #endif // __STDC_CONSTANT_MACROS ]
     86 
     87 #else // ] _MSC_VER >= 1700 [
     88 
     89 #include <limits.h>
     90 
     91 // For Visual Studio 6 in C++ mode and for many Visual Studio versions when
     92 // compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
     93 // or compiler give many errors like this:
     94 //   error C2733: second C linkage of overloaded function 'wmemchr' not allowed
     95 #ifdef __cplusplus
     96 extern "C" {
     97 #endif
     98 #  include <wchar.h>
     99 #ifdef __cplusplus
    100 }
    101 #endif
    102 
    103 // Define _W64 macros to mark types changing their size, like intptr_t.
    104 #ifndef _W64
    105 #  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
    106 #     define _W64 __w64
    107 #  else
    108 #     define _W64
    109 #  endif
    110 #endif
    111 
    112 
    113 // 7.18.1 Integer types
    114 
    115 // 7.18.1.1 Exact-width integer types
    116 
    117 // Visual Studio 6 and Embedded Visual C++ 4 doesn't
    118 // realize that, e.g. char has the same size as __int8
    119 // so we give up on __intX for them.
    120 #if (_MSC_VER < 1300)
    121    typedef signed char       int8_t;
    122    typedef signed short      int16_t;
    123    typedef signed int        int32_t;
    124    typedef unsigned char     uint8_t;
    125    typedef unsigned short    uint16_t;
    126    typedef unsigned int      uint32_t;
    127 #else
    128    typedef signed __int8     int8_t;
    129    typedef signed __int16    int16_t;
    130    typedef signed __int32    int32_t;
    131    typedef unsigned __int8   uint8_t;
    132    typedef unsigned __int16  uint16_t;
    133    typedef unsigned __int32  uint32_t;
    134 #endif
    135 typedef signed __int64       int64_t;
    136 typedef unsigned __int64     uint64_t;
    137 
    138 
    139 // 7.18.1.2 Minimum-width integer types
    140 typedef int8_t    int_least8_t;
    141 typedef int16_t   int_least16_t;
    142 typedef int32_t   int_least32_t;
    143 typedef int64_t   int_least64_t;
    144 typedef uint8_t   uint_least8_t;
    145 typedef uint16_t  uint_least16_t;
    146 typedef uint32_t  uint_least32_t;
    147 typedef uint64_t  uint_least64_t;
    148 
    149 // 7.18.1.3 Fastest minimum-width integer types
    150 typedef int8_t    int_fast8_t;
    151 typedef int16_t   int_fast16_t;
    152 typedef int32_t   int_fast32_t;
    153 typedef int64_t   int_fast64_t;
    154 typedef uint8_t   uint_fast8_t;
    155 typedef uint16_t  uint_fast16_t;
    156 typedef uint32_t  uint_fast32_t;
    157 typedef uint64_t  uint_fast64_t;
    158 
    159 // 7.18.1.4 Integer types capable of holding object pointers
    160 #ifdef _WIN64 // [
    161    typedef signed __int64    intptr_t;
    162    typedef unsigned __int64  uintptr_t;
    163 #else // _WIN64 ][
    164    typedef _W64 signed int   intptr_t;
    165    typedef _W64 unsigned int uintptr_t;
    166 #endif // _WIN64 ]
    167 
    168 // 7.18.1.5 Greatest-width integer types
    169 typedef int64_t   intmax_t;
    170 typedef uint64_t  uintmax_t;
    171 
    172 
    173 // 7.18.2 Limits of specified-width integer types
    174 
    175 #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259
    176 
    177 // 7.18.2.1 Limits of exact-width integer types
    178 #define INT8_MIN     ((int8_t)_I8_MIN)
    179 #define INT8_MAX     _I8_MAX
    180 #define INT16_MIN    ((int16_t)_I16_MIN)
    181 #define INT16_MAX    _I16_MAX
    182 #define INT32_MIN    ((int32_t)_I32_MIN)
    183 #define INT32_MAX    _I32_MAX
    184 #define INT64_MIN    ((int64_t)_I64_MIN)
    185 #define INT64_MAX    _I64_MAX
    186 #define UINT8_MAX    _UI8_MAX
    187 #define UINT16_MAX   _UI16_MAX
    188 #define UINT32_MAX   _UI32_MAX
    189 #define UINT64_MAX   _UI64_MAX
    190 
    191 // 7.18.2.2 Limits of minimum-width integer types
    192 #define INT_LEAST8_MIN    INT8_MIN
    193 #define INT_LEAST8_MAX    INT8_MAX
    194 #define INT_LEAST16_MIN   INT16_MIN
    195 #define INT_LEAST16_MAX   INT16_MAX
    196 #define INT_LEAST32_MIN   INT32_MIN
    197 #define INT_LEAST32_MAX   INT32_MAX
    198 #define INT_LEAST64_MIN   INT64_MIN
    199 #define INT_LEAST64_MAX   INT64_MAX
    200 #define UINT_LEAST8_MAX   UINT8_MAX
    201 #define UINT_LEAST16_MAX  UINT16_MAX
    202 #define UINT_LEAST32_MAX  UINT32_MAX
    203 #define UINT_LEAST64_MAX  UINT64_MAX
    204 
    205 // 7.18.2.3 Limits of fastest minimum-width integer types
    206 #define INT_FAST8_MIN    INT8_MIN
    207 #define INT_FAST8_MAX    INT8_MAX
    208 #define INT_FAST16_MIN   INT16_MIN
    209 #define INT_FAST16_MAX   INT16_MAX
    210 #define INT_FAST32_MIN   INT32_MIN
    211 #define INT_FAST32_MAX   INT32_MAX
    212 #define INT_FAST64_MIN   INT64_MIN
    213 #define INT_FAST64_MAX   INT64_MAX
    214 #define UINT_FAST8_MAX   UINT8_MAX
    215 #define UINT_FAST16_MAX  UINT16_MAX
    216 #define UINT_FAST32_MAX  UINT32_MAX
    217 #define UINT_FAST64_MAX  UINT64_MAX
    218 
    219 // 7.18.2.4 Limits of integer types capable of holding object pointers
    220 #ifdef _WIN64 // [
    221 #  define INTPTR_MIN   INT64_MIN
    222 #  define INTPTR_MAX   INT64_MAX
    223 #  define UINTPTR_MAX  UINT64_MAX
    224 #else // _WIN64 ][
    225 #  define INTPTR_MIN   INT32_MIN
    226 #  define INTPTR_MAX   INT32_MAX
    227 #  define UINTPTR_MAX  UINT32_MAX
    228 #endif // _WIN64 ]
    229 
    230 // 7.18.2.5 Limits of greatest-width integer types
    231 #define INTMAX_MIN   INT64_MIN
    232 #define INTMAX_MAX   INT64_MAX
    233 #define UINTMAX_MAX  UINT64_MAX
    234 
    235 // 7.18.3 Limits of other integer types
    236 
    237 #ifdef _WIN64 // [
    238 #  define PTRDIFF_MIN  _I64_MIN
    239 #  define PTRDIFF_MAX  _I64_MAX
    240 #else  // _WIN64 ][
    241 #  define PTRDIFF_MIN  _I32_MIN
    242 #  define PTRDIFF_MAX  _I32_MAX
    243 #endif  // _WIN64 ]
    244 
    245 #define SIG_ATOMIC_MIN  INT_MIN
    246 #define SIG_ATOMIC_MAX  INT_MAX
    247 
    248 #ifndef SIZE_MAX // [
    249 #  ifdef _WIN64 // [
    250 #     define SIZE_MAX  _UI64_MAX
    251 #  else // _WIN64 ][
    252 #     define SIZE_MAX  _UI32_MAX
    253 #  endif // _WIN64 ]
    254 #endif // SIZE_MAX ]
    255 
    256 // WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
    257 #ifndef WCHAR_MIN // [
    258 #  define WCHAR_MIN  0
    259 #endif  // WCHAR_MIN ]
    260 #ifndef WCHAR_MAX // [
    261 #  define WCHAR_MAX  _UI16_MAX
    262 #endif  // WCHAR_MAX ]
    263 
    264 #define WINT_MIN  0
    265 #define WINT_MAX  _UI16_MAX
    266 
    267 #endif // __STDC_LIMIT_MACROS ]
    268 
    269 
    270 // 7.18.4 Limits of other integer types
    271 
    272 #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260
    273 
    274 // 7.18.4.1 Macros for minimum-width integer constants
    275 
    276 #define INT8_C(val)  val##i8
    277 #define INT16_C(val) val##i16
    278 #define INT32_C(val) val##i32
    279 #define INT64_C(val) val##i64
    280 
    281 #define UINT8_C(val)  val##ui8
    282 #define UINT16_C(val) val##ui16
    283 #define UINT32_C(val) val##ui32
    284 #define UINT64_C(val) val##ui64
    285 
    286 // 7.18.4.2 Macros for greatest-width integer constants
    287 // These #ifndef's are needed to prevent collisions with <boost/cstdint.hpp>.
    288 // Check out Issue 9 for the details.
    289 #ifndef INTMAX_C //   [
    290 #  define INTMAX_C   INT64_C
    291 #endif // INTMAX_C    ]
    292 #ifndef UINTMAX_C //  [
    293 #  define UINTMAX_C  UINT64_C
    294 #endif // UINTMAX_C   ]
    295 
    296 #endif // __STDC_CONSTANT_MACROS ]
    297 
    298 #endif // _MSC_VER >= 1600 ]
    299 
    300 #endif // _MSC_STDINT_H_ ]
    301