Update copyright
[dyninst.git] / external / stdint-win.h
1 /*
2  * Copyright (c) 1996-2011 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31 // ISO C9x  compliant stdint.h for Microsoft Visual Studio\r
32 // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 \r
33 // \r
34 //  Copyright (c) 2006-2008 Alexander Chemeris\r
35 // \r
36 // Redistribution and use in source and binary forms, with or without\r
37 // modification, are permitted provided that the following conditions are met:\r
38 // \r
39 //   1. Redistributions of source code must retain the above copyright notice,\r
40 //      this list of conditions and the following disclaimer.\r
41 // \r
42 //   2. Redistributions in binary form must reproduce the above copyright\r
43 //      notice, this list of conditions and the following disclaimer in the\r
44 //      documentation and/or other materials provided with the distribution.\r
45 // \r
46 //   3. The name of the author may be used to endorse or promote products\r
47 //      derived from this software without specific prior written permission.\r
48 // \r
49 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\r
50 // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
51 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\r
52 // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
53 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
54 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\r
55 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \r
56 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r
57 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\r
58 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
59 // \r
60 ///////////////////////////////////////////////////////////////////////////////\r
61 \r
62 #ifndef _MSC_VER // [\r
63 #error "Use this header only with Microsoft Visual C++ compilers!"\r
64 #endif // _MSC_VER ]\r
65 \r
66 #ifndef _MSC_STDINT_H_ // [\r
67 #define _MSC_STDINT_H_\r
68 \r
69 #if _MSC_VER > 1000\r
70 #pragma once\r
71 #endif\r
72 \r
73 #include <limits.h>\r
74 \r
75 // For Visual Studio 6 in C++ mode and for many Visual Studio versions when\r
76 // compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'\r
77 // or compiler give many errors like this:\r
78 //   error C2733: second C linkage of overloaded function 'wmemchr' not allowed\r
79 #ifdef __cplusplus\r
80 extern "C" {\r
81 #endif\r
82 #  include <wchar.h>\r
83 #ifdef __cplusplus\r
84 }\r
85 #endif\r
86 \r
87 // Define _W64 macros to mark types changing their size, like intptr_t.\r
88 #ifndef _W64\r
89 #  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300\r
90 #     define _W64 __w64\r
91 #  else\r
92 #     define _W64\r
93 #  endif\r
94 #endif\r
95 \r
96 \r
97 // 7.18.1 Integer types\r
98 \r
99 // 7.18.1.1 Exact-width integer types\r
100 \r
101 // Visual Studio 6 and Embedded Visual C++ 4 doesn't\r
102 // realize that, e.g. char has the same size as __int8\r
103 // so we give up on __intX for them.\r
104 #if (_MSC_VER < 1300)\r
105    typedef signed char       int8_t;\r
106    typedef signed short      int16_t;\r
107    typedef signed int        int32_t;\r
108    typedef unsigned char     uint8_t;\r
109    typedef unsigned short    uint16_t;\r
110    typedef unsigned int      uint32_t;\r
111 #else\r
112    typedef signed __int8     int8_t;\r
113    typedef signed __int16    int16_t;\r
114    typedef signed __int32    int32_t;\r
115    typedef unsigned __int8   uint8_t;\r
116    typedef unsigned __int16  uint16_t;\r
117    typedef unsigned __int32  uint32_t;\r
118 #endif\r
119 typedef signed __int64       int64_t;\r
120 typedef unsigned __int64     uint64_t;\r
121 \r
122 \r
123 // 7.18.1.2 Minimum-width integer types\r
124 typedef int8_t    int_least8_t;\r
125 typedef int16_t   int_least16_t;\r
126 typedef int32_t   int_least32_t;\r
127 typedef int64_t   int_least64_t;\r
128 typedef uint8_t   uint_least8_t;\r
129 typedef uint16_t  uint_least16_t;\r
130 typedef uint32_t  uint_least32_t;\r
131 typedef uint64_t  uint_least64_t;\r
132 \r
133 // 7.18.1.3 Fastest minimum-width integer types\r
134 typedef int8_t    int_fast8_t;\r
135 typedef int16_t   int_fast16_t;\r
136 typedef int32_t   int_fast32_t;\r
137 typedef int64_t   int_fast64_t;\r
138 typedef uint8_t   uint_fast8_t;\r
139 typedef uint16_t  uint_fast16_t;\r
140 typedef uint32_t  uint_fast32_t;\r
141 typedef uint64_t  uint_fast64_t;\r
142 \r
143 // 7.18.1.4 Integer types capable of holding object pointers\r
144 #ifdef _WIN64 // [\r
145    typedef signed __int64    intptr_t;\r
146    typedef unsigned __int64  uintptr_t;\r
147 #else // _WIN64 ][\r
148    typedef _W64 signed int   intptr_t;\r
149    typedef _W64 unsigned int uintptr_t;\r
150 #endif // _WIN64 ]\r
151 \r
152 // 7.18.1.5 Greatest-width integer types\r
153 typedef int64_t   intmax_t;\r
154 typedef uint64_t  uintmax_t;\r
155 \r
156 \r
157 // 7.18.2 Limits of specified-width integer types\r
158 \r
159 #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259\r
160 \r
161 // 7.18.2.1 Limits of exact-width integer types\r
162 #define INT8_MIN     ((int8_t)_I8_MIN)\r
163 #define INT8_MAX     _I8_MAX\r
164 #define INT16_MIN    ((int16_t)_I16_MIN)\r
165 #define INT16_MAX    _I16_MAX\r
166 #define INT32_MIN    ((int32_t)_I32_MIN)\r
167 #define INT32_MAX    _I32_MAX\r
168 #define INT64_MIN    ((int64_t)_I64_MIN)\r
169 #define INT64_MAX    _I64_MAX\r
170 #define UINT8_MAX    _UI8_MAX\r
171 #define UINT16_MAX   _UI16_MAX\r
172 #define UINT32_MAX   _UI32_MAX\r
173 #define UINT64_MAX   _UI64_MAX\r
174 \r
175 // 7.18.2.2 Limits of minimum-width integer types\r
176 #define INT_LEAST8_MIN    INT8_MIN\r
177 #define INT_LEAST8_MAX    INT8_MAX\r
178 #define INT_LEAST16_MIN   INT16_MIN\r
179 #define INT_LEAST16_MAX   INT16_MAX\r
180 #define INT_LEAST32_MIN   INT32_MIN\r
181 #define INT_LEAST32_MAX   INT32_MAX\r
182 #define INT_LEAST64_MIN   INT64_MIN\r
183 #define INT_LEAST64_MAX   INT64_MAX\r
184 #define UINT_LEAST8_MAX   UINT8_MAX\r
185 #define UINT_LEAST16_MAX  UINT16_MAX\r
186 #define UINT_LEAST32_MAX  UINT32_MAX\r
187 #define UINT_LEAST64_MAX  UINT64_MAX\r
188 \r
189 // 7.18.2.3 Limits of fastest minimum-width integer types\r
190 #define INT_FAST8_MIN    INT8_MIN\r
191 #define INT_FAST8_MAX    INT8_MAX\r
192 #define INT_FAST16_MIN   INT16_MIN\r
193 #define INT_FAST16_MAX   INT16_MAX\r
194 #define INT_FAST32_MIN   INT32_MIN\r
195 #define INT_FAST32_MAX   INT32_MAX\r
196 #define INT_FAST64_MIN   INT64_MIN\r
197 #define INT_FAST64_MAX   INT64_MAX\r
198 #define UINT_FAST8_MAX   UINT8_MAX\r
199 #define UINT_FAST16_MAX  UINT16_MAX\r
200 #define UINT_FAST32_MAX  UINT32_MAX\r
201 #define UINT_FAST64_MAX  UINT64_MAX\r
202 \r
203 // 7.18.2.4 Limits of integer types capable of holding object pointers\r
204 #ifdef _WIN64 // [\r
205 #  define INTPTR_MIN   INT64_MIN\r
206 #  define INTPTR_MAX   INT64_MAX\r
207 #  define UINTPTR_MAX  UINT64_MAX\r
208 #else // _WIN64 ][\r
209 #  define INTPTR_MIN   INT32_MIN\r
210 #  define INTPTR_MAX   INT32_MAX\r
211 #  define UINTPTR_MAX  UINT32_MAX\r
212 #endif // _WIN64 ]\r
213 \r
214 // 7.18.2.5 Limits of greatest-width integer types\r
215 #define INTMAX_MIN   INT64_MIN\r
216 #define INTMAX_MAX   INT64_MAX\r
217 #define UINTMAX_MAX  UINT64_MAX\r
218 \r
219 // 7.18.3 Limits of other integer types\r
220 \r
221 #ifdef _WIN64 // [\r
222 #  define PTRDIFF_MIN  _I64_MIN\r
223 #  define PTRDIFF_MAX  _I64_MAX\r
224 #else  // _WIN64 ][\r
225 #  define PTRDIFF_MIN  _I32_MIN\r
226 #  define PTRDIFF_MAX  _I32_MAX\r
227 #endif  // _WIN64 ]\r
228 \r
229 #define SIG_ATOMIC_MIN  INT_MIN\r
230 #define SIG_ATOMIC_MAX  INT_MAX\r
231 \r
232 #ifndef SIZE_MAX // [\r
233 #  ifdef _WIN64 // [\r
234 #     define SIZE_MAX  _UI64_MAX\r
235 #  else // _WIN64 ][\r
236 #     define SIZE_MAX  _UI32_MAX\r
237 #  endif // _WIN64 ]\r
238 #endif // SIZE_MAX ]\r
239 \r
240 // WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>\r
241 #ifndef WCHAR_MIN // [\r
242 #  define WCHAR_MIN  0\r
243 #endif  // WCHAR_MIN ]\r
244 #ifndef WCHAR_MAX // [\r
245 #  define WCHAR_MAX  _UI16_MAX\r
246 #endif  // WCHAR_MAX ]\r
247 \r
248 #define WINT_MIN  0\r
249 #define WINT_MAX  _UI16_MAX\r
250 \r
251 #endif // __STDC_LIMIT_MACROS ]\r
252 \r
253 \r
254 // 7.18.4 Limits of other integer types\r
255 \r
256 #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260\r
257 \r
258 // 7.18.4.1 Macros for minimum-width integer constants\r
259 \r
260 #define INT8_C(val)  val##i8\r
261 #define INT16_C(val) val##i16\r
262 #define INT32_C(val) val##i32\r
263 #define INT64_C(val) val##i64\r
264 \r
265 #define UINT8_C(val)  val##ui8\r
266 #define UINT16_C(val) val##ui16\r
267 #define UINT32_C(val) val##ui32\r
268 #define UINT64_C(val) val##ui64\r
269 \r
270 // 7.18.4.2 Macros for greatest-width integer constants\r
271 #define INTMAX_C   INT64_C\r
272 #define UINTMAX_C  UINT64_C\r
273 \r
274 #endif // __STDC_CONSTANT_MACROS ]\r
275 \r
276 \r
277 #endif // _MSC_STDINT_H_ ]\r