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 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. The name of the author may be used to endorse or promote products 17 // derived from this software without specific prior written permission. 18 // 19 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 20 // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 21 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 22 // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 25 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 27 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 28 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 // 30 /////////////////////////////////////////////////////////////////////////////// 31 32 #ifndef _MSC_STDINT_H_ // [ 33 #define _MSC_STDINT_H_ 34 35 #ifndef _MSC_VER // [ 36 #include <stdint.h> 37 #else 38 39 // Exclude this file for Visual Studio > 2010 (_MSC_VER == 1600 for Visual Studio 2010) 40 //#if _MSC_VER <= 1600 // [ 41 42 #if (_MSC_VER > 1000) 43 #pragma once 44 #endif 45 46 #include <limits.h> 47 48 // For Visual Studio 6 in C++ mode wrap <wchar.h> include with 'extern "C++" {}' 49 // or compiler give many errors like this: 50 // error C2733: second C linkage of overloaded function 'wmemchr' not allowed 51 #if (_MSC_VER < 1300) && defined(__cplusplus) 52 extern "C++" { 53 #endif 54 #include <wchar.h> 55 #if (_MSC_VER < 1300) && defined(__cplusplus) 56 } 57 #endif 58 59 // 7.18.1 Integer types 60 61 // 7.18.1.1 Exact-width integer types 62 #ifndef U_HAVE_INT8_T 63 #if (_MSC_VER < 1600) // Visual Studio 10 already defines this type 64 typedef __int8 int8_t; 65 #endif //_MSC_VER < 1600 66 #define U_HAVE_INT8_T 1 67 #endif 68 69 typedef __int16 int16_t; 70 typedef __int32 int32_t; 71 typedef __int64 int64_t; 72 typedef unsigned __int8 uint8_t; 73 typedef unsigned __int16 uint16_t; 74 typedef unsigned __int32 uint32_t; 75 typedef unsigned __int64 uint64_t; 76 77 // 7.18.1.2 Minimum-width integer types 78 #if (_MSC_VER < 1600) // Visual Studio 10 already defines this type 79 typedef int8_t int_least8_t; 80 #endif 81 typedef int16_t int_least16_t; 82 typedef int32_t int_least32_t; 83 typedef int64_t int_least64_t; 84 typedef uint8_t uint_least8_t; 85 typedef uint16_t uint_least16_t; 86 typedef uint32_t uint_least32_t; 87 typedef uint64_t uint_least64_t; 88 89 // 7.18.1.3 Fastest minimum-width integer types 90 #if _MSC_VER < 1600 // Visual Studio 10 already defines this type 91 typedef int8_t int_fast8_t; 92 typedef int16_t int_fast16_t; 93 #endif 94 typedef int32_t int_fast32_t; 95 typedef int64_t int_fast64_t; 96 typedef uint8_t uint_fast8_t; 97 #if _MSC_VER < 1600 // Visual Studio 10 already defines this type 98 typedef uint16_t uint_fast16_t; 99 #endif 100 typedef uint32_t uint_fast32_t; 101 typedef uint64_t uint_fast64_t; 102 103 // 7.18.1.4 Integer types capable of holding object pointers 104 #ifdef _WIN64 // [ 105 typedef __int64 intptr_t; 106 typedef unsigned __int64 uintptr_t; 107 #else // _WIN64 ][ 108 typedef int intptr_t; 109 typedef unsigned int uintptr_t; 110 #endif // _WIN64 ] 111 112 // 7.18.1.5 Greatest-width integer types 113 typedef int64_t intmax_t; 114 typedef uint64_t uintmax_t; 115 116 117 // 7.18.2 Limits of specified-width integer types 118 119 #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 120 121 #if _MSC_VER < 1600 // Visual Studio 10 already defines this type 122 123 // 7.18.2.1 Limits of exact-width integer types 124 #define INT8_MIN ((int8_t)_I8_MIN) 125 #define INT8_MAX _I8_MAX 126 #define INT16_MIN ((int16_t)_I16_MIN) 127 #define INT16_MAX _I16_MAX 128 #define INT32_MIN ((int32_t)_I32_MIN) 129 #define INT32_MAX _I32_MAX 130 #define INT64_MIN ((int64_t)_I64_MIN) 131 #define INT64_MAX _I64_MAX 132 #define UINT8_MAX _UI8_MAX 133 #define UINT16_MAX _UI16_MAX 134 #define UINT32_MAX _UI32_MAX 135 #define UINT64_MAX _UI64_MAX 136 137 // 7.18.2.2 Limits of minimum-width integer types 138 #define INT_LEAST8_MIN INT8_MIN 139 #define INT_LEAST8_MAX INT8_MAX 140 #define INT_LEAST16_MIN INT16_MIN 141 #define INT_LEAST16_MAX INT16_MAX 142 #define INT_LEAST32_MIN INT32_MIN 143 #define INT_LEAST32_MAX INT32_MAX 144 #define INT_LEAST64_MIN INT64_MIN 145 #define INT_LEAST64_MAX INT64_MAX 146 #define UINT_LEAST8_MAX UINT8_MAX 147 #define UINT_LEAST16_MAX UINT16_MAX 148 #define UINT_LEAST32_MAX UINT32_MAX 149 #define UINT_LEAST64_MAX UINT64_MAX 150 151 // 7.18.2.3 Limits of fastest minimum-width integer types 152 #define INT_FAST8_MIN INT8_MIN 153 #define INT_FAST8_MAX INT8_MAX 154 #define INT_FAST16_MIN INT16_MIN 155 #define INT_FAST16_MAX INT16_MAX 156 #define INT_FAST32_MIN INT32_MIN 157 #define INT_FAST32_MAX INT32_MAX 158 #define INT_FAST64_MIN INT64_MIN 159 #define INT_FAST64_MAX INT64_MAX 160 #define UINT_FAST8_MAX UINT8_MAX 161 #define UINT_FAST16_MAX UINT16_MAX 162 #define UINT_FAST32_MAX UINT32_MAX 163 #define UINT_FAST64_MAX UINT64_MAX 164 165 // 7.18.2.4 Limits of integer types capable of holding object pointers 166 #ifdef _WIN64 // [ 167 # define INTPTR_MIN INT64_MIN 168 # define INTPTR_MAX INT64_MAX 169 # define UINTPTR_MAX UINT64_MAX 170 #else // _WIN64 ][ 171 # define INTPTR_MIN INT32_MIN 172 # define INTPTR_MAX INT32_MAX 173 # define UINTPTR_MAX UINT32_MAX 174 #endif // _WIN64 ] 175 176 // 7.18.2.5 Limits of greatest-width integer types 177 #define INTMAX_MIN INT64_MIN 178 #define INTMAX_MAX INT64_MAX 179 #define UINTMAX_MAX UINT64_MAX 180 181 // 7.18.3 Limits of other integer types 182 183 #ifdef _WIN64 // [ 184 # define PTRDIFF_MIN _I64_MIN 185 # define PTRDIFF_MAX _I64_MAX 186 #else // _WIN64 ][ 187 # define PTRDIFF_MIN _I32_MIN 188 # define PTRDIFF_MAX _I32_MAX 189 #endif // _WIN64 ] 190 191 #define SIG_ATOMIC_MIN INT_MIN 192 #define SIG_ATOMIC_MAX INT_MAX 193 194 #endif //_MSC_VER < 1600 195 196 #ifndef SIZE_MAX // [ 197 # ifdef _WIN64 // [ 198 # define SIZE_MAX _UI64_MAX 199 # else // _WIN64 ][ 200 # define SIZE_MAX _UI32_MAX 201 # endif // _WIN64 ] 202 #endif // SIZE_MAX ] 203 204 // WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h> 205 #ifndef WCHAR_MIN // [ 206 # define WCHAR_MIN 0 207 #endif // WCHAR_MIN ] 208 #ifndef WCHAR_MAX // [ 209 # define WCHAR_MAX _UI16_MAX 210 #endif // WCHAR_MAX ] 211 212 #ifndef WINT_MIN 213 # define WINT_MIN 0 214 #endif 215 #ifndef WINT_MAX 216 # define WINT_MAX _UI16_MAX 217 #endif 218 219 #endif // __STDC_LIMIT_MACROS ] 220 221 222 // 7.18.4 Limits of other integer types 223 224 #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 225 226 // 7.18.4.1 Macros for minimum-width integer constants 227 228 #define INT8_C(val) val##i8 229 #define INT16_C(val) val##i16 230 #define INT32_C(val) val##i32 231 #define INT64_C(val) val##i64 232 233 #define UINT8_C(val) val##ui8 234 #define UINT16_C(val) val##ui16 235 #define UINT32_C(val) val##ui32 236 #define UINT64_C(val) val##ui64 237 238 // 7.18.4.2 Macros for greatest-width integer constants 239 #define INTMAX_C INT64_C 240 #define UINTMAX_C UINT64_C 241 242 #endif // __STDC_CONSTANT_MACROS ] 243 244 //#endif // _MSC_VER < 1600 ] 245 246 #endif // _MSC_STDINT_H_ ] 247 248 #endif // _MSC_VER ] 249 /* vim:set et sw=2 ts=2: */ 250