1 /** 2 * This file has no copyright assigned and is placed in the Public Domain. 3 * This file was originally part of the w64 mingw-runtime package. 4 */ 5 6 /* ISO C9x 7.18 Integer types <stdint.h> 7 * Based on ISO/IEC SC22/WG14 9899 Committee draft (SC22 N2794) 8 * 9 * THIS SOFTWARE IS NOT COPYRIGHTED 10 * 11 * Contributor: Danny Smith <danny_r_smith_2001@yahoo.co.nz> 12 * Modified for libusb/MSVC: Pete Batard <pbatard@gmail.com> 13 * 14 * This source code is offered for use in the public domain. You may 15 * use, modify or distribute it freely. 16 * 17 * This code is distributed in the hope that it will be useful but 18 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY 19 * DISCLAIMED. This includes but is not limited to warranties of 20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 21 * 22 * Date: 2010-04-02 23 */ 24 25 #ifndef _MSC_VER 26 #error This header should only be used with Microsoft compilers 27 #endif 28 29 #ifndef _STDINT_H 30 #define _STDINT_H 31 32 #ifndef _INTPTR_T_DEFINED 33 #define _INTPTR_T_DEFINED 34 #ifndef __intptr_t_defined 35 #define __intptr_t_defined 36 #undef intptr_t 37 #ifdef _WIN64 38 typedef __int64 intptr_t; 39 #else 40 typedef int intptr_t; 41 #endif /* _WIN64 */ 42 #endif /* __intptr_t_defined */ 43 #endif /* _INTPTR_T_DEFINED */ 44 45 #ifndef _UINTPTR_T_DEFINED 46 #define _UINTPTR_T_DEFINED 47 #ifndef __uintptr_t_defined 48 #define __uintptr_t_defined 49 #undef uintptr_t 50 #ifdef _WIN64 51 typedef unsigned __int64 uintptr_t; 52 #else 53 typedef unsigned int uintptr_t; 54 #endif /* _WIN64 */ 55 #endif /* __uintptr_t_defined */ 56 #endif /* _UINTPTR_T_DEFINED */ 57 58 #ifndef _PTRDIFF_T_DEFINED 59 #define _PTRDIFF_T_DEFINED 60 #ifndef _PTRDIFF_T_ 61 #define _PTRDIFF_T_ 62 #undef ptrdiff_t 63 #ifdef _WIN64 64 typedef __int64 ptrdiff_t; 65 #else 66 typedef int ptrdiff_t; 67 #endif /* _WIN64 */ 68 #endif /* _PTRDIFF_T_ */ 69 #endif /* _PTRDIFF_T_DEFINED */ 70 71 #ifndef _WCHAR_T_DEFINED 72 #define _WCHAR_T_DEFINED 73 #ifndef __cplusplus 74 typedef unsigned short wchar_t; 75 #endif /* C++ */ 76 #endif /* _WCHAR_T_DEFINED */ 77 78 #ifndef _WCTYPE_T_DEFINED 79 #define _WCTYPE_T_DEFINED 80 #ifndef _WINT_T 81 #define _WINT_T 82 typedef unsigned short wint_t; 83 typedef unsigned short wctype_t; 84 #endif /* _WINT_T */ 85 #endif /* _WCTYPE_T_DEFINED */ 86 87 /* 7.18.1.1 Exact-width integer types */ 88 typedef __int8 int8_t; 89 typedef unsigned __int8 uint8_t; 90 typedef __int16 int16_t; 91 typedef unsigned __int16 uint16_t; 92 typedef __int32 int32_t; 93 typedef unsigned __int32 uint32_t; 94 typedef __int64 int64_t; 95 typedef unsigned __int64 uint64_t; 96 97 /* 7.18.1.2 Minimum-width integer types */ 98 typedef signed char int_least8_t; 99 typedef unsigned char uint_least8_t; 100 typedef short int_least16_t; 101 typedef unsigned short uint_least16_t; 102 typedef int int_least32_t; 103 typedef unsigned uint_least32_t; 104 typedef __int64 int_least64_t; 105 typedef unsigned __int64 uint_least64_t; 106 107 /* 7.18.1.3 Fastest minimum-width integer types 108 * Not actually guaranteed to be fastest for all purposes 109 * Here we use the exact-width types for 8 and 16-bit ints. 110 */ 111 typedef __int8 int_fast8_t; 112 typedef unsigned __int8 uint_fast8_t; 113 typedef __int16 int_fast16_t; 114 typedef unsigned __int16 uint_fast16_t; 115 typedef __int32 int_fast32_t; 116 typedef unsigned __int32 uint_fast32_t; 117 typedef __int64 int_fast64_t; 118 typedef unsigned __int64 uint_fast64_t; 119 120 /* 7.18.1.5 Greatest-width integer types */ 121 typedef __int64 intmax_t; 122 typedef unsigned __int64 uintmax_t; 123 124 /* 7.18.2 Limits of specified-width integer types */ 125 126 /* 7.18.2.1 Limits of exact-width integer types */ 127 #define INT8_MIN (-128) 128 #define INT16_MIN (-32768) 129 #define INT32_MIN (-2147483647 - 1) 130 #define INT64_MIN (-9223372036854775807LL - 1) 131 132 #define INT8_MAX 127 133 #define INT16_MAX 32767 134 #define INT32_MAX 2147483647 135 #define INT64_MAX 9223372036854775807LL 136 137 #define UINT8_MAX 255 138 #define UINT16_MAX 65535 139 #define UINT32_MAX 0xffffffffU /* 4294967295U */ 140 #define UINT64_MAX 0xffffffffffffffffULL /* 18446744073709551615ULL */ 141 142 /* 7.18.2.2 Limits of minimum-width integer types */ 143 #define INT_LEAST8_MIN INT8_MIN 144 #define INT_LEAST16_MIN INT16_MIN 145 #define INT_LEAST32_MIN INT32_MIN 146 #define INT_LEAST64_MIN INT64_MIN 147 148 #define INT_LEAST8_MAX INT8_MAX 149 #define INT_LEAST16_MAX INT16_MAX 150 #define INT_LEAST32_MAX INT32_MAX 151 #define INT_LEAST64_MAX INT64_MAX 152 153 #define UINT_LEAST8_MAX UINT8_MAX 154 #define UINT_LEAST16_MAX UINT16_MAX 155 #define UINT_LEAST32_MAX UINT32_MAX 156 #define UINT_LEAST64_MAX UINT64_MAX 157 158 /* 7.18.2.3 Limits of fastest minimum-width integer types */ 159 #define INT_FAST8_MIN INT8_MIN 160 #define INT_FAST16_MIN INT16_MIN 161 #define INT_FAST32_MIN INT32_MIN 162 #define INT_FAST64_MIN INT64_MIN 163 164 #define INT_FAST8_MAX INT8_MAX 165 #define INT_FAST16_MAX INT16_MAX 166 #define INT_FAST32_MAX INT32_MAX 167 #define INT_FAST64_MAX INT64_MAX 168 169 #define UINT_FAST8_MAX UINT8_MAX 170 #define UINT_FAST16_MAX UINT16_MAX 171 #define UINT_FAST32_MAX UINT32_MAX 172 #define UINT_FAST64_MAX UINT64_MAX 173 174 /* 7.18.2.4 Limits of integer types capable of holding 175 object pointers */ 176 #ifdef _WIN64 177 #define INTPTR_MIN INT64_MIN 178 #define INTPTR_MAX INT64_MAX 179 #define UINTPTR_MAX UINT64_MAX 180 #else 181 #define INTPTR_MIN INT32_MIN 182 #define INTPTR_MAX INT32_MAX 183 #define UINTPTR_MAX UINT32_MAX 184 #endif 185 186 /* 7.18.2.5 Limits of greatest-width integer types */ 187 #define INTMAX_MIN INT64_MIN 188 #define INTMAX_MAX INT64_MAX 189 #define UINTMAX_MAX UINT64_MAX 190 191 /* 7.18.3 Limits of other integer types */ 192 #ifdef _WIN64 193 #define PTRDIFF_MIN INT64_MIN 194 #define PTRDIFF_MAX INT64_MAX 195 #else 196 #define PTRDIFF_MIN INT32_MIN 197 #define PTRDIFF_MAX INT32_MAX 198 #endif 199 200 #define SIG_ATOMIC_MIN INT32_MIN 201 #define SIG_ATOMIC_MAX INT32_MAX 202 203 #ifndef SIZE_MAX 204 #ifdef _WIN64 205 #define SIZE_MAX UINT64_MAX 206 #else 207 #define SIZE_MAX UINT32_MAX 208 #endif 209 #endif 210 211 #ifndef WCHAR_MIN /* also in wchar.h */ 212 #define WCHAR_MIN 0U 213 #define WCHAR_MAX 0xffffU 214 #endif 215 216 /* 217 * wint_t is unsigned short for compatibility with MS runtime 218 */ 219 #define WINT_MIN 0U 220 #define WINT_MAX 0xffffU 221 222 223 /* 7.18.4 Macros for integer constants */ 224 225 /* 7.18.4.1 Macros for minimum-width integer constants 226 227 Accoding to Douglas Gwyn <gwyn@arl.mil>: 228 "This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC 229 9899:1999 as initially published, the expansion was required 230 to be an integer constant of precisely matching type, which 231 is impossible to accomplish for the shorter types on most 232 platforms, because C99 provides no standard way to designate 233 an integer constant with width less than that of type int. 234 TC1 changed this to require just an integer constant 235 *expression* with *promoted* type." 236 237 The trick used here is from Clive D W Feather. 238 */ 239 240 #define INT8_C(val) (INT_LEAST8_MAX-INT_LEAST8_MAX+(val)) 241 #define INT16_C(val) (INT_LEAST16_MAX-INT_LEAST16_MAX+(val)) 242 #define INT32_C(val) (INT_LEAST32_MAX-INT_LEAST32_MAX+(val)) 243 /* The 'trick' doesn't work in C89 for long long because, without 244 suffix, (val) will be evaluated as int, not intmax_t */ 245 #define INT64_C(val) val##i64 246 247 #define UINT8_C(val) (val) 248 #define UINT16_C(val) (val) 249 #define UINT32_C(val) (val##i32) 250 #define UINT64_C(val) val##ui64 251 252 /* 7.18.4.2 Macros for greatest-width integer constants */ 253 #define INTMAX_C(val) val##i64 254 #define UINTMAX_C(val) val##ui64 255 256 #endif 257