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@@@.
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 
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     version (MinGW)
77     {
78         alias int_fast16_t  = short;  ///
79         alias uint_fast16_t = ushort; ///
80     }
81     else
82     {
83         alias int_fast16_t  = int;  ///
84         alias uint_fast16_t = uint; ///
85     }
86     alias int_fast32_t  = int32_t;  ///
87     alias uint_fast32_t = uint32_t; ///
88     alias int_fast64_t  = long;     ///
89     alias uint_fast64_t = ulong;    ///
90 
91     alias intptr_t  = ptrdiff_t; ///
92     alias uintptr_t = size_t;    ///
93     alias intmax_t  = long;      ///
94     alias uintmax_t = ulong;     ///
95 }
96 else version (Darwin)
97 {
98     alias int8_t   = byte;          ///
99     alias int16_t  = short;         ///
100     alias uint8_t  = ubyte;         ///
101     alias uint16_t = ushort;        ///
102     alias int32_t  = int;           ///
103     alias uint32_t = uint;          ///
104     alias int64_t  = cpp_longlong;  ///
105     alias uint64_t = cpp_ulonglong; ///
106 
107     alias int_least8_t   = byte;     ///
108     alias uint_least8_t  = ubyte;    ///
109     alias int_least16_t  = short;    ///
110     alias uint_least16_t = ushort;   ///
111     alias int_least32_t  = int;      ///
112     alias uint_least32_t = uint;     ///
113     alias int_least64_t  = int64_t;  ///
114     alias uint_least64_t = uint64_t; ///
115 
116     alias int_fast8_t   = byte;     ///
117     alias uint_fast8_t  = ubyte;    ///
118     alias int_fast16_t  = short;    ///
119     alias uint_fast16_t = ushort;   ///
120     alias int_fast32_t  = int;      ///
121     alias uint_fast32_t = uint;     ///
122     alias int_fast64_t  = int64_t;  ///
123     alias uint_fast64_t = uint64_t; ///
124 
125     alias intptr_t  = cpp_long;  ///
126     alias uintptr_t = cpp_ulong; ///
127     alias intmax_t  = long;      ///
128     alias uintmax_t = ulong;     ///
129 }
130 else version (linux)
131 {
132     alias int8_t   = byte;   ///
133     alias int16_t  = short;  ///
134     alias uint8_t  = ubyte;  ///
135     alias uint16_t = ushort; ///
136     alias int32_t  = int;    ///
137     alias uint32_t = uint;   ///
138     alias int64_t  = long;   ///
139     alias uint64_t = ulong;  ///
140 
141     alias int_least8_t   = byte;   ///
142     alias uint_least8_t  = ubyte;  ///
143     alias int_least16_t  = short;  ///
144     alias uint_least16_t = ushort; ///
145     alias int_least32_t  = int;    ///
146     alias uint_least32_t = uint;   ///
147     alias int_least64_t  = long;   ///
148     alias uint_least64_t = ulong;  ///
149 
150     version (CRuntime_Musl)
151     {
152         alias int_fast8_t   = byte;  ///
153         alias uint_fast8_t  = ubyte; ///
154         alias int_fast16_t  = int;   ///
155         alias uint_fast16_t = uint;  ///
156         alias int_fast32_t  = int;   ///
157         alias uint_fast32_t = uint;  ///
158     }
159     else
160     {
161         alias int_fast8_t   = byte;      ///
162         alias uint_fast8_t  = ubyte;     ///
163         alias int_fast16_t  = ptrdiff_t; ///
164         alias uint_fast16_t = size_t;    ///
165         alias int_fast32_t  = ptrdiff_t; ///
166         alias uint_fast32_t = size_t;    ///
167     }
168     alias int_fast64_t  = long;      ///
169     alias uint_fast64_t = ulong;     ///
170 
171     alias intptr_t  = ptrdiff_t; ///
172     alias uintptr_t = size_t;    ///
173     alias intmax_t  = long;      ///
174     alias uintmax_t = ulong;     ///
175 }
176 else version (CRuntime_Glibc)
177 {
178     alias int8_t   = byte;   ///
179     alias int16_t  = short;  ///
180     alias uint8_t  = ubyte;  ///
181     alias uint16_t = ushort; ///
182     alias int32_t  = int;    ///
183     alias uint32_t = uint;   ///
184     alias int64_t  = long;   ///
185     alias uint64_t = ulong;  ///
186 
187     alias int_least8_t   = byte;   ///
188     alias uint_least8_t  = ubyte;  ///
189     alias int_least16_t  = short;  ///
190     alias uint_least16_t = ushort; ///
191     alias int_least32_t  = int;    ///
192     alias uint_least32_t = uint;   ///
193     alias int_least64_t  = long;   ///
194     alias uint_least64_t = ulong;  ///
195 
196     alias int_fast8_t   = byte;      ///
197     alias uint_fast8_t  = ubyte;     ///
198     alias int_fast16_t  = ptrdiff_t; ///
199     alias uint_fast16_t = size_t;    ///
200     alias int_fast32_t  = ptrdiff_t; ///
201     alias uint_fast32_t = size_t;    ///
202     alias int_fast64_t  = long;      ///
203     alias uint_fast64_t = ulong;     ///
204 
205     alias intptr_t  = ptrdiff_t; ///
206     alias uintptr_t = size_t;    ///
207     alias intmax_t  = long;      ///
208     alias uintmax_t = ulong;     ///
209 }
210 else version (DragonFlyBSD)
211 {
212     alias int8_t   = byte;   ///
213     alias int16_t  = short;  ///
214     alias uint8_t  = ubyte;  ///
215     alias uint16_t = ushort; ///
216     alias int32_t  = int;    ///
217     alias uint32_t = uint;   ///
218     alias int64_t  = long;   ///
219     alias uint64_t = ulong;  ///
220 
221     alias int_least8_t   = int8_t;   ///
222     alias uint_least8_t  = uint8_t;  ///
223     alias int_least16_t  = int16_t;  ///
224     alias uint_least16_t = uint16_t; ///
225     alias int_least32_t  = int32_t;  ///
226     alias uint_least32_t = uint32_t; ///
227     alias int_least64_t  = int64_t;  ///
228     alias uint_least64_t = uint64_t; ///
229 
230     alias int_fast8_t   = int32_t;   ///
231     alias uint_fast8_t  = uint32_t;  ///
232     alias int_fast16_t  = int32_t;   ///
233     alias uint_fast16_t = uint32_t;  ///
234     alias int_fast32_t  = int32_t;   ///
235     alias uint_fast32_t = uint32_t;  ///
236     alias int_fast64_t  = int64_t;   ///
237     alias uint_fast64_t = uint64_t;  ///
238 
239     alias intptr_t  = ptrdiff_t; ///
240     alias uintptr_t = size_t;    ///
241     alias intmax_t  = long;      ///
242     alias uintmax_t = ulong;     ///
243 }
244 else version (FreeBSD)
245 {
246     alias int8_t   = byte;   ///
247     alias int16_t  = short;  ///
248     alias uint8_t  = ubyte;  ///
249     alias uint16_t = ushort; ///
250     alias int32_t  = int;    ///
251     alias uint32_t = uint;   ///
252     alias int64_t  = long;   ///
253     alias uint64_t = ulong;  ///
254 
255     alias int_least8_t   = byte;   ///
256     alias uint_least8_t  = ubyte;  ///
257     alias int_least16_t  = short;  ///
258     alias uint_least16_t = ushort; ///
259     alias int_least32_t  = int;    ///
260     alias uint_least32_t = uint;   ///
261     alias int_least64_t  = long;   ///
262     alias uint_least64_t = ulong;  ///
263 
264     alias int_fast8_t   = int;   ///
265     alias uint_fast8_t  = uint;  ///
266     alias int_fast16_t  = int;   ///
267     alias uint_fast16_t = uint;  ///
268     alias int_fast32_t  = int;   ///
269     alias uint_fast32_t = uint;  ///
270     alias int_fast64_t  = long;  ///
271     alias uint_fast64_t = ulong; ///
272 
273     alias intptr_t  = ptrdiff_t; ///
274     alias uintptr_t = size_t;    ///
275     alias intmax_t  = long;      ///
276     alias uintmax_t = ulong;     ///
277 }
278 else version (NetBSD)
279 {
280     alias int8_t   = byte;   ///
281     alias int16_t  = short;  ///
282     alias uint8_t  = ubyte;  ///
283     alias uint16_t = ushort; ///
284     alias int32_t  = int;    ///
285     alias uint32_t = uint;   ///
286     alias int64_t  = long;   ///
287     alias uint64_t = ulong;  ///
288 
289     alias int_least8_t   = int8_t;   ///
290     alias uint_least8_t  = uint8_t;  ///
291     alias int_least16_t  = int16_t;  ///
292     alias uint_least16_t = uint16_t; ///
293     alias int_least32_t  = int32_t;  ///
294     alias uint_least32_t = uint32_t; ///
295     alias int_least64_t  = int64_t;  ///
296     alias uint_least64_t = uint64_t; ///
297 
298     alias int_fast8_t   = int32_t;   ///
299     alias uint_fast8_t  = uint32_t;  ///
300     alias int_fast16_t  = int32_t;   ///
301     alias uint_fast16_t = uint32_t;  ///
302     alias int_fast32_t  = int32_t;   ///
303     alias uint_fast32_t = uint32_t;  ///
304     alias int_fast64_t  = int64_t;   ///
305     alias uint_fast64_t = uint64_t;  ///
306 
307     alias intptr_t  = ptrdiff_t; ///
308     alias uintptr_t = size_t;    ///
309     alias intmax_t  = long;      ///
310     alias uintmax_t = ulong;     ///
311 }
312 else version (OpenBSD)
313 {
314     alias int8_t   = byte;          ///
315     alias int16_t  = short;         ///
316     alias uint8_t  = ubyte;         ///
317     alias uint16_t = ushort;        ///
318     alias int32_t  = int;           ///
319     alias uint32_t = uint;          ///
320     alias int64_t  = cpp_longlong;  ///
321     alias uint64_t = cpp_ulonglong; ///
322 
323     alias int_least8_t   = byte;          ///
324     alias uint_least8_t  = ubyte;         ///
325     alias int_least16_t  = short;         ///
326     alias uint_least16_t = ushort;        ///
327     alias int_least32_t  = int;           ///
328     alias uint_least32_t = uint;          ///
329     alias int_least64_t  = cpp_longlong;  ///
330     alias uint_least64_t = cpp_ulonglong; ///
331 
332     alias int_fast8_t   = int;           ///
333     alias uint_fast8_t  = uint;          ///
334     alias int_fast16_t  = int;           ///
335     alias uint_fast16_t = uint;          ///
336     alias int_fast32_t  = int;           ///
337     alias uint_fast32_t = uint;          ///
338     alias int_fast64_t  = cpp_longlong;  ///
339     alias uint_fast64_t = cpp_ulonglong; ///
340 
341     alias intptr_t  = cpp_long;      ///
342     alias uintptr_t = cpp_ulong;     ///
343     alias intmax_t  = cpp_longlong;  ///
344     alias uintmax_t = cpp_ulonglong; ///
345 }
346 else version (Solaris)
347 {
348     alias int8_t   = char;   ///
349     alias int16_t  = short;  ///
350     alias uint8_t  = ubyte;  ///
351     alias uint16_t = ushort; ///
352     alias int32_t  = int;    ///
353     alias uint32_t = uint;   ///
354     alias int64_t  = long;   ///
355     alias uint64_t = ulong;  ///
356 
357     alias int_least8_t   = char;   ///
358     alias uint_least8_t  = ubyte;  ///
359     alias int_least16_t  = short;  ///
360     alias uint_least16_t = ushort; ///
361     alias int_least32_t  = int;    ///
362     alias uint_least32_t = uint;   ///
363     alias int_least64_t  = long;   ///
364     alias uint_least64_t = ulong;  ///
365 
366     alias int_fast8_t   = char;  ///
367     alias uint_fast8_t  = ubyte; ///
368     alias int_fast16_t  = int;   ///
369     alias uint_fast16_t = uint;  ///
370     alias int_fast32_t  = int;   ///
371     alias uint_fast32_t = uint;  ///
372     alias int_fast64_t  = long;  ///
373     alias uint_fast64_t = ulong; ///
374 
375     alias intptr_t  = ptrdiff_t; ///
376     alias uintptr_t = size_t;    ///
377     alias intmax_t  = long;      ///
378     alias uintmax_t = ulong;     ///
379 }
380 else version (WASI)
381 {
382     alias int8_t   = byte;   ///
383     alias int16_t  = short;  ///
384     alias uint8_t  = ubyte;  ///
385     alias uint16_t = ushort; ///
386     alias int32_t  = int;    ///
387     alias uint32_t = uint;   ///
388     alias int64_t  = long;   ///
389     alias uint64_t = ulong;  ///
390 
391     alias int_least8_t   = byte;   ///
392     alias uint_least8_t  = ubyte;  ///
393     alias int_least16_t  = short;  ///
394     alias uint_least16_t = ushort; ///
395     alias int_least32_t  = int;    ///
396     alias uint_least32_t = uint;   ///
397     alias int_least64_t  = long;   ///
398     alias uint_least64_t = ulong;  ///
399 
400     alias int_fast8_t   = byte;      ///
401     alias uint_fast8_t  = ubyte;     ///
402     alias int_fast16_t  = ptrdiff_t; ///
403     alias uint_fast16_t = size_t;    ///
404     alias int_fast32_t  = ptrdiff_t; ///
405     alias uint_fast32_t = size_t;    ///
406 
407     alias int_fast64_t  = long;      ///
408     alias uint_fast64_t = ulong;     ///
409 
410     alias intptr_t  = ptrdiff_t; ///
411     alias uintptr_t = size_t;    ///
412     alias intmax_t  = long;      ///
413     alias uintmax_t = ulong;     ///
414 }
415 else
416 {
417     static assert(false, "Unsupported architecture.");
418 }
419 
420 
421 
422 ///
423 enum int8_t   INT8_MIN  = int8_t.min;
424 ///
425 enum int8_t   INT8_MAX  = int8_t.max;
426 ///
427 enum int16_t  INT16_MIN = int16_t.min;
428 ///
429 enum int16_t  INT16_MAX = int16_t.max;
430 ///
431 enum int32_t  INT32_MIN = int32_t.min;
432 ///
433 enum int32_t  INT32_MAX = int32_t.max;
434 ///
435 enum int64_t  INT64_MIN = int64_t.min;
436 ///
437 enum int64_t  INT64_MAX = int64_t.max;
438 
439 ///
440 enum uint8_t  UINT8_MAX  = uint8_t.max;
441 ///
442 enum uint16_t UINT16_MAX = uint16_t.max;
443 ///
444 enum uint32_t UINT32_MAX = uint32_t.max;
445 ///
446 enum uint64_t UINT64_MAX = uint64_t.max;
447 
448 ///
449 enum int_least8_t    INT_LEAST8_MIN   = int_least8_t.min;
450 ///
451 enum int_least8_t    INT_LEAST8_MAX   = int_least8_t.max;
452 ///
453 enum int_least16_t   INT_LEAST16_MIN  = int_least16_t.min;
454 ///
455 enum int_least16_t   INT_LEAST16_MAX  = int_least16_t.max;
456 ///
457 enum int_least32_t   INT_LEAST32_MIN  = int_least32_t.min;
458 ///
459 enum int_least32_t   INT_LEAST32_MAX  = int_least32_t.max;
460 ///
461 enum int_least64_t   INT_LEAST64_MIN  = int_least64_t.min;
462 ///
463 enum int_least64_t   INT_LEAST64_MAX  = int_least64_t.max;
464 
465 ///
466 enum uint_least8_t   UINT_LEAST8_MAX  = uint_least8_t.max;
467 ///
468 enum uint_least16_t  UINT_LEAST16_MAX = uint_least16_t.max;
469 ///
470 enum uint_least32_t  UINT_LEAST32_MAX = uint_least32_t.max;
471 ///
472 enum uint_least64_t  UINT_LEAST64_MAX = uint_least64_t.max;
473 
474 ///
475 enum int_fast8_t   INT_FAST8_MIN   = int_fast8_t.min;
476 ///
477 enum int_fast8_t   INT_FAST8_MAX   = int_fast8_t.max;
478 ///
479 enum int_fast16_t  INT_FAST16_MIN  = int_fast16_t.min;
480 ///
481 enum int_fast16_t  INT_FAST16_MAX  = int_fast16_t.max;
482 ///
483 enum int_fast32_t  INT_FAST32_MIN  = int_fast32_t.min;
484 ///
485 enum int_fast32_t  INT_FAST32_MAX  = int_fast32_t.max;
486 ///
487 enum int_fast64_t  INT_FAST64_MIN  = int_fast64_t.min;
488 ///
489 enum int_fast64_t  INT_FAST64_MAX  = int_fast64_t.max;
490 
491 ///
492 enum uint_fast8_t  UINT_FAST8_MAX  = uint_fast8_t.max;
493 ///
494 enum uint_fast16_t UINT_FAST16_MAX = uint_fast16_t.max;
495 ///
496 enum uint_fast32_t UINT_FAST32_MAX = uint_fast32_t.max;
497 ///
498 enum uint_fast64_t UINT_FAST64_MAX = uint_fast64_t.max;
499 
500 ///
501 enum intptr_t  INTPTR_MIN  = intptr_t.min;
502 ///
503 enum intptr_t  INTPTR_MAX  = intptr_t.max;
504 
505 ///
506 enum uintptr_t UINTPTR_MIN = uintptr_t.min;
507 ///
508 enum uintptr_t UINTPTR_MAX = uintptr_t.max;
509 
510 ///
511 enum intmax_t  INTMAX_MIN  = intmax_t.min;
512 ///
513 enum intmax_t  INTMAX_MAX  = intmax_t.max;
514 
515 ///
516 enum uintmax_t UINTMAX_MAX = uintmax_t.max;
517 
518 ///
519 enum ptrdiff_t PTRDIFF_MIN = ptrdiff_t.min;
520 ///
521 enum ptrdiff_t PTRDIFF_MAX = ptrdiff_t.max;
522 
523 ///
524 enum sig_atomic_t SIG_ATOMIC_MIN = sig_atomic_t.min;
525 ///
526 enum sig_atomic_t SIG_ATOMIC_MAX = sig_atomic_t.max;
527 
528 ///
529 enum size_t  SIZE_MAX  = size_t.max;
530 
531 ///
532 enum wchar_t WCHAR_MIN = wchar_t.min;
533 ///
534 enum wchar_t WCHAR_MAX = wchar_t.max;
535 
536 ///
537 enum wint_t  WINT_MIN  = wint_t.min;
538 ///
539 enum wint_t  WINT_MAX  = wint_t.max;
540 
541 ///
542 alias INT8_C  = _typify!int8_t ;
543 ///
544 alias INT16_C = _typify!int16_t;
545 ///
546 alias INT32_C = _typify!int32_t;
547 ///
548 alias INT64_C = _typify!int64_t;
549 
550 ///
551 alias UINT8_C  = _typify!uint8_t ;
552 ///
553 alias UINT16_C = _typify!uint16_t;
554 ///
555 alias UINT32_C = _typify!uint32_t;
556 ///
557 alias UINT64_C = _typify!uint64_t;
558 
559 ///
560 alias INTMAX_C  = _typify!intmax_t ;
561 ///
562 alias UINTMAX_C = _typify!uintmax_t;