25
25
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
26
26
* Clara, CA 95054 USA or visit http://www.sun.com if you need
27
27
* additional information or have any questions.
28
* --------------------------------------------------------------------
30
* This code is based on:
32
* Based on various FreeBSD 5.2 headers.
36
#ifndef ___iprt_stdint_h
37
#define ___iprt_stdint_h
39
#ifndef __STDC_CONSTANT_MACROS
40
# define __STDC_CONSTANT_MACROS
42
#ifndef __STDC_LIMIT_MACROS
43
# define __STDC_LIMIT_MACROS
30
#ifndef __iprt_stdint_h
31
#define __iprt_stdint_h
46
33
#include <iprt/cdefs.h>
37
* Use the stdint.h on systems that have one.
48
39
#if !(defined(RT_OS_LINUX) && defined(__KERNEL__)) \
40
&& !(defined(RT_OS_FREEBSD) && defined(_KERNEL)) \
49
41
&& !defined(_MSC_VER) \
50
42
&& !defined(__IBMC__) \
51
43
&& !defined(__IBMCPP__) \
52
44
&& !defined(IPRT_NO_CRT) \
53
45
&& !defined(IPRT_DONT_USE_SYSTEM_STDINT_H) \
54
46
&& !defined(DOXYGEN_RUNNING)
48
# ifndef __STDC_CONSTANT_MACROS
49
# define __STDC_CONSTANT_MACROS
51
# ifndef __STDC_LIMIT_MACROS
52
# define __STDC_LIMIT_MACROS
55
54
# include <stdint.h>
57
56
# if defined(RT_OS_DARWIN) && defined(KERNEL) && defined(RT_ARCH_AMD64)
58
/* Kludge to fix the incorrect 32-bit constant macros in
59
Kernel.framework/Headers/stdin.h. uint32_t and int32_t are
60
int not long as these macros use, which is significant when
61
targeting AMD64. (10a222) */
58
* Kludge to fix the incorrect 32-bit constant macros in
59
* Kernel.framework/Headers/stdin.h. uint32_t and int32_t are
60
* int not long as these macros use, which is significant when
61
* targeting AMD64. (10a222)
63
# define INT32_C(c) (c)
64
# define INT32_C(Value) (Value)
65
# define UINT32_C(c) (c ## U)
66
# define UINT32_C(Value) (Value ## U)
66
67
# endif /* 64-bit darwin kludge. */
70
#if !(defined(RT_OS_LINUX) && defined(__KERNEL__)) || defined(IPRT_NO_CRT) || defined(IPRT_DONT_USE_SYSTEM_STDINT_H) || defined(DOXGEN_RUNNING)
71
/* machine specific */
72
typedef signed char __int8_t;
73
typedef unsigned char __uint8_t;
74
typedef short __int16_t;
75
typedef unsigned short __uint16_t;
76
typedef int __int32_t;
77
typedef unsigned int __uint32_t;
80
typedef _int64 __int64_t;
81
typedef unsigned _int64 __uint64_t;
83
# if defined(__IBMC__) || defined(__IBMCPP__) /* assume VAC308 without long long. */
84
typedef struct { __uint32_t lo,hi; } __int64_t, __uint64_t;
86
typedef long long __int64_t;
87
typedef unsigned long long __uint64_t;
90
#endif /* !linux kernel and more */
92
#if ARCH_BITS == 32 || defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD)
93
typedef signed long __intptr_t;
94
typedef unsigned long __uintptr_t;
96
typedef __int64_t __intptr_t;
97
typedef __uint64_t __uintptr_t;
101
/* the stuff we use */
102
#if (!defined(RT_OS_LINUX) && !defined(__KERNEL__)) || defined(IPRT_NO_CRT)
103
#ifndef _INT8_T_DECLARED
104
typedef __int8_t int8_t;
105
#define _INT8_T_DECLARED
108
#ifndef _INT16_T_DECLARED
109
typedef __int16_t int16_t;
110
#define _INT16_T_DECLARED
113
#ifndef _INT32_T_DECLARED
114
typedef __int32_t int32_t;
115
#define _INT32_T_DECLARED
118
#ifndef _INT64_T_DECLARED
119
typedef __int64_t int64_t;
120
#define _INT64_T_DECLARED
123
#ifndef _UINT8_T_DECLARED
124
typedef __uint8_t uint8_t;
125
#define _UINT8_T_DECLARED
128
#ifndef _UINT16_T_DECLARED
129
typedef __uint16_t uint16_t;
130
#define _UINT16_T_DECLARED
133
#ifndef _UINT32_T_DECLARED
134
typedef __uint32_t uint32_t;
135
#define _UINT32_T_DECLARED
138
#ifndef _UINT64_T_DECLARED
139
typedef __uint64_t uint64_t;
140
#define _UINT64_T_DECLARED
143
#endif /* !linux kernel || no-crt */
145
#if !defined(_MSC_VER) || defined(DOXYGEN_RUNNING)
146
#ifndef _INTPTR_T_DECLARED
147
/** Signed interger type capable of holding a pointer value, very useful for casting. */
148
typedef __intptr_t intptr_t;
149
/** Unsigned interger type capable of holding a pointer value, very useful for casting. */
150
typedef __uintptr_t uintptr_t;
151
#define _INTPTR_T_DECLARED
153
#endif /* !_MSC_VER || DOXYGEN_RUNNING */
155
#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS)
157
#define INT8_C(c) (c)
158
#define INT16_C(c) (c)
159
#define INT32_C(c) (c)
160
#define INT64_C(c) (c ## LL)
162
#define UINT8_C(c) (c)
163
#define UINT16_C(c) (c)
164
#define UINT32_C(c) (c ## U)
165
#define UINT64_C(c) (c ## ULL)
167
#define INTMAX_C(c) (c ## LL)
168
#define UINTMAX_C(c) (c ## ULL)
170
#define INT8_MIN (-0x7f-1)
171
#define INT16_MIN (-0x7fff-1)
172
#define INT32_MIN (-0x7fffffff-1)
173
#define INT64_MIN (-0x7fffffffffffffffLL-1)
175
#define INT8_MAX 0x7f
176
#define INT16_MAX 0x7fff
177
#define INT32_MAX 0x7fffffff
178
#define INT64_MAX 0x7fffffffffffffffLL
180
#define UINT8_MAX 0xff
181
#define UINT16_MAX 0xffff
182
#define UINT32_MAX 0xffffffffU
183
#define UINT64_MAX 0xffffffffffffffffULL
185
#endif /* !C++ || __STDC_CONSTANT_MACROS */
187
#if defined(RT_OS_FREEBSD) && defined(IPRT_DONT_USE_SYSTEM_STDINT_H)
188
/* This is a hack to get tstVMStructGC.cpp building on FreeBSD. */
189
# define __uintptr_t __bad_uintptr_t
190
# define __uint64_t __bad_uint64_t
191
# define __uint32_t __bad_uint32_t
192
# define __uint16_t __bad_uint16_t
193
# define __uint8_t __bad_uint8_t
194
# define __intptr_t __bad_intptr_t
195
# define __int64_t __bad_int64_t
196
# define __int32_t __bad_int32_t
197
# define __int16_t __bad_int16_t
198
# define __int8_t __bad_int8_t
201
#endif /* ! have usable stdint.h */
69
#elif defined(RT_OS_FREEBSD) && defined(_KERNEL) \
71
# ifndef __STDC_CONSTANT_MACROS
72
# define __STDC_CONSTANT_MACROS
74
# ifndef __STDC_LIMIT_MACROS
75
# define __STDC_LIMIT_MACROS
77
# include <sys/stdint.h>
79
#else /* No system stdint.h */
82
* Define the types we use.
83
* The linux kernel defines all these in linux/types.h, so skip it.
85
# if !(defined(RT_OS_LINUX) && defined(__KERNEL__)) \
86
|| defined(IPRT_NO_CRT) \
87
|| defined(IPRT_DONT_USE_SYSTEM_STDINT_H) \
88
|| defined(DOXGEN_RUNNING)
90
/* Simplify the [u]int64_t type detection mess. */
91
# undef IPRT_STDINT_USE_STRUCT_FOR_64_BIT_TYPES
93
# if __IBMCPP__ < 350 && (defined(__WINDOWS__) || defined(_AIX) || defined(__OS2__))
94
# defined IPRT_STDINT_USE_STRUCT_FOR_64_BIT_TYPES
98
# if __IBMC__ < 350 && (defined(__WINDOWS__) || defined(_AIX) || defined(__OS2__))
99
# defined IPRT_STDINT_USE_STRUCT_FOR_64_BIT_TYPES
104
# if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
105
# if !defined(_INT8_T_DECLARED) && !defined(_INT8_T)
106
typedef signed char int8_t;
108
# if !defined(_UINT8_T_DECLARED) && !defined(_UINT8_T)
109
typedef unsigned char uint8_t;
111
# if !defined(_INT16_T_DECLARED) && !defined(_INT16_T)
112
typedef signed short int16_t;
114
# if !defined(_UINT16_T_DECLARED) && !defined(_UINT16_T)
115
typedef unsigned short uint16_t;
117
# if !defined(_INT32_T_DECLARED) && !defined(_INT32_T)
118
typedef signed int int32_t;
120
# if !defined(_UINT32_T_DECLARED) && !defined(_UINT32_T)
121
typedef unsigned int uint32_t;
123
# if defined(_MSC_VER)
124
# if !defined(_INT64_T_DECLARED) && !defined(_INT64_T)
125
typedef signed _int64 int64_t;
127
# if !defined(_UINT64_T_DECLARED) && !defined(_UINT64_T)
128
typedef unsigned _int64 uint64_t;
130
# elif defined(IPRT_STDINT_USE_STRUCT_FOR_64_BIT_TYPES)
131
# if !defined(_INT64_T_DECLARED) && !defined(_INT64_T)
132
typedef struct { uint32_t lo; int32_t hi; } int64_t;
134
# if !defined(_UINT64_T_DECLARED) && !defined(_UINT64_T)
135
typedef struct { uint32_t lo; uint32_t hi; } uint64_t;
137
# else /* Use long long for 64-bit types */
138
# if !defined(_INT64_T_DECLARED) && !defined(_INT64_T)
139
typedef signed long long int64_t;
141
# if !defined(_UINT64_T_DECLARED) && !defined(_UINT64_T)
142
typedef unsigned long long uint64_t;
146
/* max integer types */
147
# if !defined(_INTMAX_T_DECLARED) && !defined(_INTMAX_T)
148
typedef int64_t intmax_t;
150
# if !defined(_UINTMAX_T_DECLARED) && !defined(_UINTMAX_T)
151
typedef uint64_t uintmax_t;
155
# error "PORTME: Add architecture. Don't forget to check the [U]INTx_C() and [U]INTMAX_MIN/MAX macros."
158
# endif /* !linux kernel or stuff */
160
/* pointer <-> integer types */
161
# if !defined(_MSC_VER) || defined(DOXYGEN_RUNNING)
162
# if ARCH_BITS == 32 \
163
|| defined(RT_OS_LINUX) \
164
|| defined(RT_OS_FREEBSD)
165
# if !defined(_INTPTR_T_DECLARED) && !defined(_INTPTR_T)
166
typedef signed long intptr_t;
168
# if !defined(_UINTPTR_T_DECLARED) && !defined(_UINTPTR_T)
169
typedef unsigned long uintptr_t;
172
# if !defined(_INTPTR_T_DECLARED) && !defined(_INTPTR_T)
173
typedef int64_t intptr_t;
175
# if !defined(_UINTPTR_T_DECLARED) && !defined(_UINTPTR_T)
176
typedef uint64_t uintptr_t;
179
# endif /* !_MSC_VER */
181
#endif /* no system stdint.h */
185
* Make sure the [U]INTx_C(c) macros are present.
186
* For In C++ source the system stdint.h may have skipped these if it was
187
* included before we managed to define __STDC_CONSTANT_MACROS. (Kludge alert!)
189
#if !defined(INT8_C) \
190
|| !defined(INT16_C) \
191
|| !defined(INT32_C) \
192
|| !defined(INT64_C) \
193
|| !defined(INTMAX_C) \
194
|| !defined(UINT8_C) \
195
|| !defined(UINT16_C) \
196
|| !defined(UINT32_C) \
197
|| !defined(UINT64_C) \
198
|| !defined(UINTMAX_C)
199
# define INT8_C(Value) (Value)
200
# define INT16_C(Value) (Value)
201
# define INT32_C(Value) (Value)
202
# define INT64_C(Value) (Value ## LL)
203
# define UINT8_C(Value) (Value)
204
# define UINT16_C(Value) (Value)
205
# define UINT32_C(Value) (Value ## U)
206
# define UINT64_C(Value) (Value ## ULL)
207
# define INTMAX_C(Value) INT64_C(Value)
208
# define UINTMAX_C(Value) UINT64_C(Value)
213
* Make sure the INTx_MIN and [U]INTx_MAX macros are present.
214
* For In C++ source the system stdint.h may have skipped these if it was
215
* included before we managed to define __STDC_LIMIT_MACROS. (Kludge alert!)
217
#if !defined(INT8_MIN) \
218
|| !defined(INT16_MIN) \
219
|| !defined(INT32_MIN) \
220
|| !defined(INT64_MIN) \
221
|| !defined(INT8_MAX) \
222
|| !defined(INT16_MAX) \
223
|| !defined(INT32_MAX) \
224
|| !defined(INT64_MAX) \
225
|| !defined(UINT8_MAX) \
226
|| !defined(UINT16_MAX) \
227
|| !defined(UINT32_MAX) \
228
|| !defined(UINT64_MAX)
229
# define INT8_MIN (INT8_C(-0x7f) - 1)
230
# define INT16_MIN (INT16_C(-0x7fff) - 1)
231
# define INT32_MIN (INT32_C(-0x7fffffff) - 1)
232
# define INT64_MIN (INT64_C(-0x7fffffffffffffff) - 1)
233
# define INT8_MAX INT8_C(0x7f)
234
# define INT16_MAX INT16_C(0x7fff)
235
# define INT32_MAX INT32_C(0x7fffffff)
236
# define INT64_MAX INT64_C(0x7fffffffffffffff)
237
# define UINT8_MAX UINT8_C(0xff)
238
# define UINT16_MAX UINT16_C(0xffff)
239
# define UINT32_MAX UINT32_C(0xffffffff)
240
# define UINT64_MAX UINT64_C(0xffffffffffffffff)
242
# define INTMAX_MIN INT64_MIN
243
# define INTMAX_MAX INT64_MAX
244
# define UINTMAX_MAX UINT64_MAX