xref: /xnu-11417.140.69/EXTERNAL_HEADERS/stdint.h (revision 43a90889846e00bfb5cf1d255cdc0a701a1e05a4)
1 /*
2  * Copyright (c) 2000-2010 Apple Inc.
3  * All rights reserved.
4  */
5 #if (defined(__has_include) && __has_include(<__xnu_libcxx_sentinel.h>) && !defined(XNU_LIBCXX_SDKROOT))
6 
7 #if !__has_include_next(<stdint.h>)
8 #error Do not build with -nostdinc (use GCC_USE_STANDARD_INCLUDE_SEARCHING=NO)
9 #endif /* __has_include_next */
10 
11 #include_next <stdint.h>
12 
13 #else /* (defined(__has_include) && __has_include(<__xnu_libcxx_sentinel.h>) && !defined(XNU_LIBCXX_SDKROOT)) */
14 
15 #ifndef _KERNEL_STDINT_H_
16 #define _KERNEL_STDINT_H_
17 
18 #ifndef KERNEL
19 /* For user-space code that may include this header */
20 #include_next <stdint.h>
21 #else /* KERNEL */
22 
23 #include <machine/types.h>
24 
25 #if __LP64__
26 #define __WORDSIZE 64
27 #else
28 #define __WORDSIZE 32
29 #endif
30 
31 /* from ISO/IEC 988:1999 spec */
32 
33 /* 7.18.1.1 Exact-width integer types */
34 /* int8_t is defined in <machine/types.h> */
35 /* int16_t is defined in <machine/types.h> */
36 /* int32_t is defined in <machine/types.h> */
37 /* int64_t is defined in <machine/types.h> */
38 typedef u_int8_t              uint8_t;   /* u_int8_t is defined in <machine/types.h> */
39 typedef u_int16_t            uint16_t;   /* u_int16_t is defined in <machine/types.h> */
40 typedef u_int32_t            uint32_t;   /* u_int32_t is defined in <machine/types.h> */
41 typedef u_int64_t            uint64_t;   /* u_int64_t is defined in <machine/types.h> */
42 
43 
44 /* 7.18.1.2 Minimum-width integer types */
45 typedef int8_t           int_least8_t;
46 typedef int16_t         int_least16_t;
47 typedef int32_t         int_least32_t;
48 typedef int64_t         int_least64_t;
49 typedef uint8_t         uint_least8_t;
50 typedef uint16_t       uint_least16_t;
51 typedef uint32_t       uint_least32_t;
52 typedef uint64_t       uint_least64_t;
53 
54 
55 /* 7.18.1.3 Fastest-width integer types */
56 typedef int8_t            int_fast8_t;
57 typedef int16_t          int_fast16_t;
58 typedef int32_t          int_fast32_t;
59 typedef int64_t          int_fast64_t;
60 typedef uint8_t          uint_fast8_t;
61 typedef uint16_t        uint_fast16_t;
62 typedef uint32_t        uint_fast32_t;
63 typedef uint64_t        uint_fast64_t;
64 
65 
66 /* 7.18.1.4 Integer types capable of holding object pointers */
67 /* intptr_t is defined in <machine/types.h> */
68 /* uintptr_t is defined in <machine/types.h> */
69 
70 
71 /* 7.18.1.5 Greatest-width integer types */
72 #ifdef __INTMAX_TYPE__
73 typedef __INTMAX_TYPE__ intmax_t;
74 #else
75 #ifdef __LP64__
76 typedef long int intmax_t;
77 #else
78 typedef long long int intmax_t;
79 #endif /* __LP64__ */
80 #endif /* __INTMAX_TYPE__ */
81 #ifdef __UINTMAX_TYPE__
82 typedef __UINTMAX_TYPE__ uintmax_t;
83 #else
84 #ifdef __LP64__
85 typedef long unsigned int uintmax_t;
86 #else
87 typedef long long unsigned int uintmax_t;
88 #endif /* __LP64__ */
89 #endif /* __UINTMAX_TYPE__ */
90 
91 /* 7.18.4 Macros for integer constants */
92 #define INT8_C(v)    (v)
93 #define INT16_C(v)   (v)
94 #define INT32_C(v)   (v)
95 #define INT64_C(v)   (v ## LL)
96 
97 #define UINT8_C(v)   (v)
98 #define UINT16_C(v)  (v)
99 #define UINT32_C(v)  (v ## U)
100 #define UINT64_C(v)  (v ## ULL)
101 
102 #ifdef __LP64__
103 #define INTMAX_C(v)  (v ## L)
104 #define UINTMAX_C(v) (v ## UL)
105 #else
106 #define INTMAX_C(v)  (v ## LL)
107 #define UINTMAX_C(v) (v ## ULL)
108 #endif
109 
110 /* 7.18.2 Limits of specified-width integer types:
111  *   These #defines specify the minimum and maximum limits
112  *   of each of the types declared above.
113  *
114  *   They must have "the same type as would an expression that is an
115  *   object of the corresponding type converted according to the integer
116  *   promotion".
117  */
118 
119 
120 /* 7.18.2.1 Limits of exact-width integer types */
121 #define INT8_MAX         127
122 #define INT16_MAX        32767
123 #define INT32_MAX        2147483647
124 #define INT64_MAX        9223372036854775807LL
125 
126 #define INT8_MIN          -128
127 #define INT16_MIN         -32768
128 /*
129  *  Note:  the literal "most negative int" cannot be written in C --
130  *  the rules in the standard (section 6.4.4.1 in C99) will give it
131  *  an unsigned type, so INT32_MIN (and the most negative member of
132  *  any larger signed type) must be written via a constant expression.
133  */
134 #define INT32_MIN        (-INT32_MAX-1)
135 #define INT64_MIN        (-INT64_MAX-1)
136 
137 #define UINT8_MAX         255
138 #define UINT16_MAX        65535
139 #define UINT32_MAX        4294967295U
140 #define UINT64_MAX        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 object pointers */
175 
176 #if __WORDSIZE == 64
177 #define INTPTR_MAX        9223372036854775807L
178 #else
179 #define INTPTR_MAX        2147483647L
180 #endif
181 #define INTPTR_MIN        (-INTPTR_MAX-1)
182 
183 #if __WORDSIZE == 64
184 #define UINTPTR_MAX       18446744073709551615UL
185 #else
186 #define UINTPTR_MAX       4294967295UL
187 #endif
188 
189 /* 7.18.2.5 Limits of greatest-width integer types */
190 #define INTMAX_MAX        INTMAX_C(9223372036854775807)
191 #define UINTMAX_MAX       UINTMAX_C(18446744073709551615)
192 #define INTMAX_MIN        (-INTMAX_MAX-1)
193 
194 /* 7.18.3 "Other" */
195 #if __WORDSIZE == 64
196 #define PTRDIFF_MIN       INTMAX_MIN
197 #define PTRDIFF_MAX       INTMAX_MAX
198 #else
199 #define PTRDIFF_MIN       INT32_MIN
200 #define PTRDIFF_MAX       INT32_MAX
201 #endif
202 
203 #define SIZE_MAX          UINTPTR_MAX
204 
205 #if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1
206 #define RSIZE_MAX         (SIZE_MAX >> 1)
207 #endif
208 
209 #ifndef WCHAR_MAX
210 #  ifdef __WCHAR_MAX__
211 #    define WCHAR_MAX     __WCHAR_MAX__
212 #  else
213 #    define WCHAR_MAX     0x7fffffff
214 #  endif
215 #endif
216 
217 /* WCHAR_MIN should be 0 if wchar_t is an unsigned type and
218  *  (-WCHAR_MAX-1) if wchar_t is a signed type.  Unfortunately,
219  *  it turns out that -fshort-wchar changes the signedness of
220  *  the type. */
221 #ifndef WCHAR_MIN
222 #  if WCHAR_MAX == 0xffff
223 #    define WCHAR_MIN       0
224 #  else
225 #    define WCHAR_MIN       (-WCHAR_MAX-1)
226 #  endif
227 #endif
228 
229 #define WINT_MIN          INT32_MIN
230 #define WINT_MAX          INT32_MAX
231 
232 #define SIG_ATOMIC_MIN    INT32_MIN
233 #define SIG_ATOMIC_MAX    INT32_MAX
234 
235 #endif /* KERNEL */
236 
237 #endif /* _KERNEL_STDINT_H_ */
238 
239 #endif
240