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
15module core.stdc.stdint;
16
17import core.stdc.config;
18import core.stdc.stddef; // for wchar_t
19import core.stdc.signal; // for sig_atomic_t
20import core.stdc.wchar_; // for wint_t
21
22version (OSX)
23    version = Darwin;
24else version (iOS)
25    version = Darwin;
26else version (TVOS)
27    version = Darwin;
28else version (WatchOS)
29    version = Darwin;
30
31// Can't be `private` because of @@@BUG11173@@@.
32T _typify(T)(T val) @safe pure nothrow { return val; }
33
34extern (C):
35@trusted: // Types and constants only.
36nothrow:
37@nogc:
38
39
40static if (is(ucent))
41{
42    alias int128_t = cent;   ///
43    alias uint128_t = ucent; ///
44}
45
46version (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}
96else 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}
130else 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}
176else 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}
210else 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}
244else 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}
278else 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}
312else 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}
346else 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}
380else
381{
382    static assert(false, "Unsupported architecture.");
383}
384
385
386
387///
388enum int8_t   INT8_MIN  = int8_t.min;
389///
390enum int8_t   INT8_MAX  = int8_t.max;
391///
392enum int16_t  INT16_MIN = int16_t.min;
393///
394enum int16_t  INT16_MAX = int16_t.max;
395///
396enum int32_t  INT32_MIN = int32_t.min;
397///
398enum int32_t  INT32_MAX = int32_t.max;
399///
400enum int64_t  INT64_MIN = int64_t.min;
401///
402enum int64_t  INT64_MAX = int64_t.max;
403
404///
405enum uint8_t  UINT8_MAX  = uint8_t.max;
406///
407enum uint16_t UINT16_MAX = uint16_t.max;
408///
409enum uint32_t UINT32_MAX = uint32_t.max;
410///
411enum uint64_t UINT64_MAX = uint64_t.max;
412
413///
414enum int_least8_t    INT_LEAST8_MIN   = int_least8_t.min;
415///
416enum int_least8_t    INT_LEAST8_MAX   = int_least8_t.max;
417///
418enum int_least16_t   INT_LEAST16_MIN  = int_least16_t.min;
419///
420enum int_least16_t   INT_LEAST16_MAX  = int_least16_t.max;
421///
422enum int_least32_t   INT_LEAST32_MIN  = int_least32_t.min;
423///
424enum int_least32_t   INT_LEAST32_MAX  = int_least32_t.max;
425///
426enum int_least64_t   INT_LEAST64_MIN  = int_least64_t.min;
427///
428enum int_least64_t   INT_LEAST64_MAX  = int_least64_t.max;
429
430///
431enum uint_least8_t   UINT_LEAST8_MAX  = uint_least8_t.max;
432///
433enum uint_least16_t  UINT_LEAST16_MAX = uint_least16_t.max;
434///
435enum uint_least32_t  UINT_LEAST32_MAX = uint_least32_t.max;
436///
437enum uint_least64_t  UINT_LEAST64_MAX = uint_least64_t.max;
438
439///
440enum int_fast8_t   INT_FAST8_MIN   = int_fast8_t.min;
441///
442enum int_fast8_t   INT_FAST8_MAX   = int_fast8_t.max;
443///
444enum int_fast16_t  INT_FAST16_MIN  = int_fast16_t.min;
445///
446enum int_fast16_t  INT_FAST16_MAX  = int_fast16_t.max;
447///
448enum int_fast32_t  INT_FAST32_MIN  = int_fast32_t.min;
449///
450enum int_fast32_t  INT_FAST32_MAX  = int_fast32_t.max;
451///
452enum int_fast64_t  INT_FAST64_MIN  = int_fast64_t.min;
453///
454enum int_fast64_t  INT_FAST64_MAX  = int_fast64_t.max;
455
456///
457enum uint_fast8_t  UINT_FAST8_MAX  = uint_fast8_t.max;
458///
459enum uint_fast16_t UINT_FAST16_MAX = uint_fast16_t.max;
460///
461enum uint_fast32_t UINT_FAST32_MAX = uint_fast32_t.max;
462///
463enum uint_fast64_t UINT_FAST64_MAX = uint_fast64_t.max;
464
465///
466enum intptr_t  INTPTR_MIN  = intptr_t.min;
467///
468enum intptr_t  INTPTR_MAX  = intptr_t.max;
469
470///
471enum uintptr_t UINTPTR_MIN = uintptr_t.min;
472///
473enum uintptr_t UINTPTR_MAX = uintptr_t.max;
474
475///
476enum intmax_t  INTMAX_MIN  = intmax_t.min;
477///
478enum intmax_t  INTMAX_MAX  = intmax_t.max;
479
480///
481enum uintmax_t UINTMAX_MAX = uintmax_t.max;
482
483///
484enum ptrdiff_t PTRDIFF_MIN = ptrdiff_t.min;
485///
486enum ptrdiff_t PTRDIFF_MAX = ptrdiff_t.max;
487
488///
489enum sig_atomic_t SIG_ATOMIC_MIN = sig_atomic_t.min;
490///
491enum sig_atomic_t SIG_ATOMIC_MAX = sig_atomic_t.max;
492
493///
494enum size_t  SIZE_MAX  = size_t.max;
495
496///
497enum wchar_t WCHAR_MIN = wchar_t.min;
498///
499enum wchar_t WCHAR_MAX = wchar_t.max;
500
501///
502enum wint_t  WINT_MIN  = wint_t.min;
503///
504enum wint_t  WINT_MAX  = wint_t.max;
505
506///
507alias INT8_C  = _typify!int8_t ;
508///
509alias INT16_C = _typify!int16_t;
510///
511alias INT32_C = _typify!int32_t;
512///
513alias INT64_C = _typify!int64_t;
514
515///
516alias UINT8_C  = _typify!uint8_t ;
517///
518alias UINT16_C = _typify!uint16_t;
519///
520alias UINT32_C = _typify!uint32_t;
521///
522alias UINT64_C = _typify!uint64_t;
523
524///
525alias INTMAX_C  = _typify!intmax_t ;
526///
527alias UINTMAX_C = _typify!uintmax_t;
528