OLD | NEW |
| (Empty) |
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 | |
OLD | NEW |