1 /**
2  * D header file for C99.
3  *
4  * $(C_HEADER_DESCRIPTION pubs.opengroup.org/onlinepubs/009695399/basedefs/_stdint.h.html, _stdint.h)
5  *
6  * Copyright: Copyright Sean Kelly 2005 - 2018
7  * License: Distributed under the
8  *      $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
9  *    (See accompanying file LICENSE)
10  * Authors:   Sean Kelly
11  * Source:    $(DRUNTIMESRC core/stdc/_stdint.d)
12  * Standards: ISO/IEC 9899:1999 (E)
13  */
14 
15 module core.stdc.stdint;
16 
17 import core.stdc.config;
18 import core.stdc.stddef; // for wchar_t
19 import core.stdc.signal; // for sig_atomic_t
20 import core.stdc.wchar_; // for wint_t
21 
22 version (OSX)
23     version = Darwin;
24 else version (iOS)
25     version = Darwin;
26 else version (TVOS)
27     version = Darwin;
28 else version (WatchOS)
29     version = Darwin;
30 
31 // Can't be `private` because of @@@BUG11173@@@.
_typify(T)32 T _typify(T)(T val) @safe pure nothrow { return val; }
33 
34 extern (C):
35 @trusted: // Types and constants only.
36 nothrow:
37 @nogc:
38 
39 
40 static if (is(ucent))
41 {
42     alias int128_t = cent;   ///
43     alias uint128_t = ucent; ///
44 }
45 
version(Windows)46 version (Windows)
47 {
48     alias int8_t   = byte;   ///
49     alias int16_t  = short;  ///
50     alias uint8_t  = ubyte;  ///
51     alias uint16_t = ushort; ///
52     version (CRuntime_DigitalMars)
53     {
54         alias int32_t  = cpp_long;  ///
55         alias uint32_t = cpp_ulong; ///
56     }
57     else
58     {
59         alias int32_t  = int;  ///
60         alias uint32_t = uint; ///
61     }
62     alias int64_t  = long;   ///
63     alias uint64_t = ulong;  ///
64 
65     alias int_least8_t   = byte;     ///
66     alias uint_least8_t  = ubyte;    ///
67     alias int_least16_t  = short;    ///
68     alias uint_least16_t = ushort;   ///
69     alias int_least32_t  = int32_t;  ///
70     alias uint_least32_t = uint32_t; ///
71     alias int_least64_t  = long;     ///
72     alias uint_least64_t = ulong;    ///
73 
74     alias int_fast8_t   = byte;     ///
75     alias uint_fast8_t  = ubyte;    ///
76     alias int_fast16_t  = int;      ///
77     alias uint_fast16_t = uint;     ///
78     alias int_fast32_t  = int32_t;  ///
79     alias uint_fast32_t = uint32_t; ///
80     alias int_fast64_t  = long;     ///
81     alias uint_fast64_t = ulong;    ///
82 
83     alias intptr_t  = ptrdiff_t; ///
84     alias uintptr_t = size_t;    ///
85     alias intmax_t  = long;      ///
86     alias uintmax_t = ulong;     ///
87 }
version(Darwin)88 else version (Darwin)
89 {
90     alias int8_t   = byte;          ///
91     alias int16_t  = short;         ///
92     alias uint8_t  = ubyte;         ///
93     alias uint16_t = ushort;        ///
94     alias int32_t  = int;           ///
95     alias uint32_t = uint;          ///
96     alias int64_t  = cpp_longlong;  ///
97     alias uint64_t = cpp_ulonglong; ///
98 
99     alias int_least8_t   = byte;     ///
100     alias uint_least8_t  = ubyte;    ///
101     alias int_least16_t  = short;    ///
102     alias uint_least16_t = ushort;   ///
103     alias int_least32_t  = int;      ///
104     alias uint_least32_t = uint;     ///
105     alias int_least64_t  = int64_t;  ///
106     alias uint_least64_t = uint64_t; ///
107 
108     alias int_fast8_t   = byte;     ///
109     alias uint_fast8_t  = ubyte;    ///
110     alias int_fast16_t  = short;    ///
111     alias uint_fast16_t = ushort;   ///
112     alias int_fast32_t  = int;      ///
113     alias uint_fast32_t = uint;     ///
114     alias int_fast64_t  = int64_t;  ///
115     alias uint_fast64_t = uint64_t; ///
116 
117     alias intptr_t  = cpp_long;  ///
118     alias uintptr_t = cpp_ulong; ///
119     alias intmax_t  = long;      ///
120     alias uintmax_t = ulong;     ///
121 }
version(Posix)122 else version (Posix)
123 {
124     alias int8_t   = byte;   ///
125     alias int16_t  = short;  ///
126     alias uint8_t  = ubyte;  ///
127     alias uint16_t = ushort; ///
128     alias int32_t  = int;    ///
129     alias uint32_t = uint;   ///
130     alias int64_t  = long;   ///
131     alias uint64_t = ulong;  ///
132 
133     alias int_least8_t   = byte;   ///
134     alias uint_least8_t  = ubyte;  ///
135     alias int_least16_t  = short;  ///
136     alias uint_least16_t = ushort; ///
137     alias int_least32_t  = int;    ///
138     alias uint_least32_t = uint;   ///
139     alias int_least64_t  = long;   ///
140     alias uint_least64_t = ulong;  ///
141 
142     version (FreeBSD)
143     {
144         alias int_fast8_t   = int;  ///
145         alias uint_fast8_t  = uint; ///
146         alias int_fast16_t  = int;  ///
147         alias uint_fast16_t = uint; ///
148         alias int_fast32_t  = int;  ///
149         alias uint_fast32_t = uint; ///
150     }
151     else version (CRuntime_Musl)
152     {
153         alias int_fast8_t   = byte;  ///
154         alias uint_fast8_t  = ubyte; ///
155         alias int_fast16_t  = int;   ///
156         alias uint_fast16_t = uint;  ///
157         alias int_fast32_t  = int;   ///
158         alias uint_fast32_t = uint;  ///
159     }
160     else
161     {
162         alias int_fast8_t   = byte;      ///
163         alias uint_fast8_t  = ubyte;     ///
164         alias int_fast16_t  = ptrdiff_t; ///
165         alias uint_fast16_t = size_t;    ///
166         alias int_fast32_t  = ptrdiff_t; ///
167         alias uint_fast32_t = size_t;    ///
168     }
169     alias int_fast64_t  = long;      ///
170     alias uint_fast64_t = ulong;     ///
171 
172     alias intptr_t  = ptrdiff_t; ///
173     alias uintptr_t = size_t;    ///
174     alias intmax_t  = long;      ///
175     alias uintmax_t = ulong;     ///
176 }
177 else
178 {
179     static assert(0);
180 }
181 
182 
183 
184 ///
185 enum int8_t   INT8_MIN  = int8_t.min;
186 ///
187 enum int8_t   INT8_MAX  = int8_t.max;
188 ///
189 enum int16_t  INT16_MIN = int16_t.min;
190 ///
191 enum int16_t  INT16_MAX = int16_t.max;
192 ///
193 enum int32_t  INT32_MIN = int32_t.min;
194 ///
195 enum int32_t  INT32_MAX = int32_t.max;
196 ///
197 enum int64_t  INT64_MIN = int64_t.min;
198 ///
199 enum int64_t  INT64_MAX = int64_t.max;
200 
201 ///
202 enum uint8_t  UINT8_MAX  = uint8_t.max;
203 ///
204 enum uint16_t UINT16_MAX = uint16_t.max;
205 ///
206 enum uint32_t UINT32_MAX = uint32_t.max;
207 ///
208 enum uint64_t UINT64_MAX = uint64_t.max;
209 
210 ///
211 enum int_least8_t    INT_LEAST8_MIN   = int_least8_t.min;
212 ///
213 enum int_least8_t    INT_LEAST8_MAX   = int_least8_t.max;
214 ///
215 enum int_least16_t   INT_LEAST16_MIN  = int_least16_t.min;
216 ///
217 enum int_least16_t   INT_LEAST16_MAX  = int_least16_t.max;
218 ///
219 enum int_least32_t   INT_LEAST32_MIN  = int_least32_t.min;
220 ///
221 enum int_least32_t   INT_LEAST32_MAX  = int_least32_t.max;
222 ///
223 enum int_least64_t   INT_LEAST64_MIN  = int_least64_t.min;
224 ///
225 enum int_least64_t   INT_LEAST64_MAX  = int_least64_t.max;
226 
227 ///
228 enum uint_least8_t   UINT_LEAST8_MAX  = uint_least8_t.max;
229 ///
230 enum uint_least16_t  UINT_LEAST16_MAX = uint_least16_t.max;
231 ///
232 enum uint_least32_t  UINT_LEAST32_MAX = uint_least32_t.max;
233 ///
234 enum uint_least64_t  UINT_LEAST64_MAX = uint_least64_t.max;
235 
236 ///
237 enum int_fast8_t   INT_FAST8_MIN   = int_fast8_t.min;
238 ///
239 enum int_fast8_t   INT_FAST8_MAX   = int_fast8_t.max;
240 ///
241 enum int_fast16_t  INT_FAST16_MIN  = int_fast16_t.min;
242 ///
243 enum int_fast16_t  INT_FAST16_MAX  = int_fast16_t.max;
244 ///
245 enum int_fast32_t  INT_FAST32_MIN  = int_fast32_t.min;
246 ///
247 enum int_fast32_t  INT_FAST32_MAX  = int_fast32_t.max;
248 ///
249 enum int_fast64_t  INT_FAST64_MIN  = int_fast64_t.min;
250 ///
251 enum int_fast64_t  INT_FAST64_MAX  = int_fast64_t.max;
252 
253 ///
254 enum uint_fast8_t  UINT_FAST8_MAX  = uint_fast8_t.max;
255 ///
256 enum uint_fast16_t UINT_FAST16_MAX = uint_fast16_t.max;
257 ///
258 enum uint_fast32_t UINT_FAST32_MAX = uint_fast32_t.max;
259 ///
260 enum uint_fast64_t UINT_FAST64_MAX = uint_fast64_t.max;
261 
262 ///
263 enum intptr_t  INTPTR_MIN  = intptr_t.min;
264 ///
265 enum intptr_t  INTPTR_MAX  = intptr_t.max;
266 
267 ///
268 enum uintptr_t UINTPTR_MIN = uintptr_t.min;
269 ///
270 enum uintptr_t UINTPTR_MAX = uintptr_t.max;
271 
272 ///
273 enum intmax_t  INTMAX_MIN  = intmax_t.min;
274 ///
275 enum intmax_t  INTMAX_MAX  = intmax_t.max;
276 
277 ///
278 enum uintmax_t UINTMAX_MAX = uintmax_t.max;
279 
280 ///
281 enum ptrdiff_t PTRDIFF_MIN = ptrdiff_t.min;
282 ///
283 enum ptrdiff_t PTRDIFF_MAX = ptrdiff_t.max;
284 
285 ///
286 enum sig_atomic_t SIG_ATOMIC_MIN = sig_atomic_t.min;
287 ///
288 enum sig_atomic_t SIG_ATOMIC_MAX = sig_atomic_t.max;
289 
290 ///
291 enum size_t  SIZE_MAX  = size_t.max;
292 
293 ///
294 enum wchar_t WCHAR_MIN = wchar_t.min;
295 ///
296 enum wchar_t WCHAR_MAX = wchar_t.max;
297 
298 ///
299 enum wint_t  WINT_MIN  = wint_t.min;
300 ///
301 enum wint_t  WINT_MAX  = wint_t.max;
302 
303 ///
304 alias INT8_C  = _typify!int8_t ;
305 ///
306 alias INT16_C = _typify!int16_t;
307 ///
308 alias INT32_C = _typify!int32_t;
309 ///
310 alias INT64_C = _typify!int64_t;
311 
312 ///
313 alias UINT8_C  = _typify!uint8_t ;
314 ///
315 alias UINT16_C = _typify!uint16_t;
316 ///
317 alias UINT32_C = _typify!uint32_t;
318 ///
319 alias UINT64_C = _typify!uint64_t;
320 
321 ///
322 alias INTMAX_C  = _typify!intmax_t ;
323 ///
324 alias UINTMAX_C = _typify!uintmax_t;
325