1#pragma once
2
3#ifdef __cplusplus
4extern "C" {
5#endif
6
7#include <stdint.h>
8
9#define __NEED_wchar_t
10#include <bits/alltypes.h>
11
12typedef struct { intmax_t quot, rem; } imaxdiv_t;
13
14intmax_t imaxabs(intmax_t);
15imaxdiv_t imaxdiv(intmax_t, intmax_t);
16
17intmax_t strtoimax(const char* __restrict, char** __restrict, int);
18uintmax_t strtoumax(const char* __restrict, char** __restrict, int);
19
20intmax_t wcstoimax(const wchar_t* __restrict, wchar_t** __restrict, int);
21uintmax_t wcstoumax(const wchar_t* __restrict, wchar_t** __restrict, int);
22
23// Clang predefines macros __<type>_FMT<letter>__ for each type,
24// with <letter> being i and for signed types, and o, u, x, and X
25// for unsigned types.  That lets <inttypes.h> do its work without
26// any special knowledge of what the underlying types are.
27// Unfortunately, GCC does not define these macros.
28#ifndef __INTMAX_FMTd__
29
30#define __INT8_FMT_MODIFIER__ "hh"
31#define __INT16_FMT_MODIFIER__ "h"
32#define __INT32_FMT_MODIFIER__ ""
33
34#define __INT_LEAST8_FMT_MODIFIER__ __INT8_FMT_MODIFIER__
35#define __INT_LEAST16_FMT_MODIFIER__ __INT16_FMT_MODIFIER__
36#define __INT_LEAST32_FMT_MODIFIER__ __INT32_FMT_MODIFIER__
37#define __INT_LEAST64_FMT_MODIFIER__ __INT64_FMT_MODIFIER__
38
39// The *-elf and arm-eabi GCC targets use 'int' for the fast{8,16,32}
40// types. On LP64 systems, 'long' is used for the fast64 type.
41#define __INT_FAST8_FMT_MODIFIER__ ""
42#define __INT_FAST16_FMT_MODIFIER__ ""
43#define __INT_FAST32_FMT_MODIFIER__ ""
44#define __INT_FAST64_FMT_MODIFIER__ "l"
45
46// On machines where 'long' types are 64 bits, the compiler defines
47// __INT64_TYPE__ et al using 'long', not 'long long', though both are
48// 64-bit types.
49#define __INT64_FMT_MODIFIER__ "l"
50#define __INTPTR_FMT_MODIFIER__ "l"
51
52#define __INTMAX_FMT_MODIFIER__ __INT64_FMT_MODIFIER__
53
54#define __INTMAX_FMTd__ __INTMAX_FMT_MODIFIER__ "d"
55#define __INTMAX_FMTi__ __INTMAX_FMT_MODIFIER__ "i"
56#define __UINTMAX_FMTo__ __INTMAX_FMT_MODIFIER__ "o"
57#define __UINTMAX_FMTu__ __INTMAX_FMT_MODIFIER__ "u"
58#define __UINTMAX_FMTx__ __INTMAX_FMT_MODIFIER__ "x"
59#define __UINTMAX_FMTX__ __INTMAX_FMT_MODIFIER__ "X"
60#define __INTPTR_FMTd__ __INTPTR_FMT_MODIFIER__ "d"
61#define __INTPTR_FMTi__ __INTPTR_FMT_MODIFIER__ "i"
62#define __UINTPTR_FMTo__ __INTPTR_FMT_MODIFIER__ "o"
63#define __UINTPTR_FMTu__ __INTPTR_FMT_MODIFIER__ "u"
64#define __UINTPTR_FMTx__ __INTPTR_FMT_MODIFIER__ "x"
65#define __UINTPTR_FMTX__ __INTPTR_FMT_MODIFIER__ "X"
66#define __INT8_FMTd__ __INT8_FMT_MODIFIER__ "d"
67#define __INT8_FMTi__ __INT8_FMT_MODIFIER__ "i"
68#define __INT16_FMTd__ __INT16_FMT_MODIFIER__ "d"
69#define __INT16_FMTi__ __INT16_FMT_MODIFIER__ "i"
70#define __INT32_FMTd__ __INT32_FMT_MODIFIER__ "d"
71#define __INT32_FMTi__ __INT32_FMT_MODIFIER__ "i"
72#define __INT64_FMTd__ __INT64_FMT_MODIFIER__ "d"
73#define __INT64_FMTi__ __INT64_FMT_MODIFIER__ "i"
74#define __UINT8_FMTo__ __INT8_FMT_MODIFIER__ "o"
75#define __UINT8_FMTu__ __INT8_FMT_MODIFIER__ "u"
76#define __UINT8_FMTx__ __INT8_FMT_MODIFIER__ "x"
77#define __UINT8_FMTX__ __INT8_FMT_MODIFIER__ "X"
78#define __UINT16_FMTo__ __INT16_FMT_MODIFIER__ "o"
79#define __UINT16_FMTu__ __INT16_FMT_MODIFIER__ "u"
80#define __UINT16_FMTx__ __INT16_FMT_MODIFIER__ "x"
81#define __UINT16_FMTX__ __INT16_FMT_MODIFIER__ "X"
82#define __UINT32_FMTo__ __INT32_FMT_MODIFIER__ "o"
83#define __UINT32_FMTu__ __INT32_FMT_MODIFIER__ "u"
84#define __UINT32_FMTx__ __INT32_FMT_MODIFIER__ "x"
85#define __UINT32_FMTX__ __INT32_FMT_MODIFIER__ "X"
86#define __UINT64_FMTo__ __INT64_FMT_MODIFIER__ "o"
87#define __UINT64_FMTu__ __INT64_FMT_MODIFIER__ "u"
88#define __UINT64_FMTx__ __INT64_FMT_MODIFIER__ "x"
89#define __UINT64_FMTX__ __INT64_FMT_MODIFIER__ "X"
90#define __INT_LEAST8_FMTd__ __INT_LEAST8_FMT_MODIFIER__ "d"
91#define __INT_LEAST8_FMTi__ __INT_LEAST8_FMT_MODIFIER__ "i"
92#define __UINT_LEAST8_FMTo__ __INT_LEAST8_FMT_MODIFIER__ "o"
93#define __UINT_LEAST8_FMTu__ __INT_LEAST8_FMT_MODIFIER__ "u"
94#define __UINT_LEAST8_FMTx__ __INT_LEAST8_FMT_MODIFIER__ "x"
95#define __UINT_LEAST8_FMTX__ __INT_LEAST8_FMT_MODIFIER__ "X"
96#define __INT_LEAST16_FMTd__ __INT_LEAST16_FMT_MODIFIER__ "d"
97#define __INT_LEAST16_FMTi__ __INT_LEAST16_FMT_MODIFIER__ "i"
98#define __UINT_LEAST16_FMTo__ __INT_LEAST16_FMT_MODIFIER__ "o"
99#define __UINT_LEAST16_FMTu__ __INT_LEAST16_FMT_MODIFIER__ "u"
100#define __UINT_LEAST16_FMTx__ __INT_LEAST16_FMT_MODIFIER__ "x"
101#define __UINT_LEAST16_FMTX__ __INT_LEAST16_FMT_MODIFIER__ "X"
102#define __INT_LEAST32_FMTd__ __INT_LEAST32_FMT_MODIFIER__ "d"
103#define __INT_LEAST32_FMTi__ __INT_LEAST32_FMT_MODIFIER__ "i"
104#define __UINT_LEAST32_FMTo__ __INT_LEAST32_FMT_MODIFIER__ "o"
105#define __UINT_LEAST32_FMTu__ __INT_LEAST32_FMT_MODIFIER__ "u"
106#define __UINT_LEAST32_FMTx__ __INT_LEAST32_FMT_MODIFIER__ "x"
107#define __UINT_LEAST32_FMTX__ __INT_LEAST32_FMT_MODIFIER__ "X"
108#define __INT_LEAST64_FMTd__ __INT_LEAST64_FMT_MODIFIER__ "d"
109#define __INT_LEAST64_FMTi__ __INT_LEAST64_FMT_MODIFIER__ "i"
110#define __UINT_LEAST64_FMTo__ __INT_LEAST64_FMT_MODIFIER__ "o"
111#define __UINT_LEAST64_FMTu__ __INT_LEAST64_FMT_MODIFIER__ "u"
112#define __UINT_LEAST64_FMTx__ __INT_LEAST64_FMT_MODIFIER__ "x"
113#define __UINT_LEAST64_FMTX__ __INT_LEAST64_FMT_MODIFIER__ "X"
114#define __INT_FAST8_FMTd__ __INT_FAST8_FMT_MODIFIER__ "d"
115#define __INT_FAST8_FMTi__ __INT_FAST8_FMT_MODIFIER__ "i"
116#define __UINT_FAST8_FMTo__ __INT_FAST8_FMT_MODIFIER__ "o"
117#define __UINT_FAST8_FMTu__ __INT_FAST8_FMT_MODIFIER__ "u"
118#define __UINT_FAST8_FMTx__ __INT_FAST8_FMT_MODIFIER__ "x"
119#define __UINT_FAST8_FMTX__ __INT_FAST8_FMT_MODIFIER__ "X"
120#define __INT_FAST16_FMTd__ __INT_FAST16_FMT_MODIFIER__ "d"
121#define __INT_FAST16_FMTi__ __INT_FAST16_FMT_MODIFIER__ "i"
122#define __UINT_FAST16_FMTo__ __INT_FAST16_FMT_MODIFIER__ "o"
123#define __UINT_FAST16_FMTu__ __INT_FAST16_FMT_MODIFIER__ "u"
124#define __UINT_FAST16_FMTx__ __INT_FAST16_FMT_MODIFIER__ "x"
125#define __UINT_FAST16_FMTX__ __INT_FAST16_FMT_MODIFIER__ "X"
126#define __INT_FAST32_FMTd__ __INT_FAST32_FMT_MODIFIER__ "d"
127#define __INT_FAST32_FMTi__ __INT_FAST32_FMT_MODIFIER__ "i"
128#define __UINT_FAST32_FMTo__ __INT_FAST32_FMT_MODIFIER__ "o"
129#define __UINT_FAST32_FMTu__ __INT_FAST32_FMT_MODIFIER__ "u"
130#define __UINT_FAST32_FMTx__ __INT_FAST32_FMT_MODIFIER__ "x"
131#define __UINT_FAST32_FMTX__ __INT_FAST32_FMT_MODIFIER__ "X"
132#define __INT_FAST64_FMTd__ __INT_FAST64_FMT_MODIFIER__ "d"
133#define __INT_FAST64_FMTi__ __INT_FAST64_FMT_MODIFIER__ "i"
134#define __UINT_FAST64_FMTo__ __INT_FAST64_FMT_MODIFIER__ "o"
135#define __UINT_FAST64_FMTu__ __INT_FAST64_FMT_MODIFIER__ "u"
136#define __UINT_FAST64_FMTx__ __INT_FAST64_FMT_MODIFIER__ "x"
137#define __UINT_FAST64_FMTX__ __INT_FAST64_FMT_MODIFIER__ "X"
138
139#endif
140
141
142#define PRId8 __INT8_FMTd__
143#define PRId16 __INT16_FMTd__
144#define PRId32 __INT32_FMTd__
145#define PRId64 __INT64_FMTd__
146
147#define PRIdLEAST8 __INT_LEAST8_FMTd__
148#define PRIdLEAST16 __INT_LEAST16_FMTd__
149#define PRIdLEAST32 __INT_LEAST32_FMTd__
150#define PRIdLEAST64 __INT_LEAST64_FMTd__
151
152#define PRIdFAST8 __INT_FAST8_FMTd__
153#define PRIdFAST16 __INT_FAST16_FMTd__
154#define PRIdFAST32 __INT_FAST32_FMTd__
155#define PRIdFAST64 __INT_FAST64_FMTd__
156
157#define PRIi8 __INT8_FMTi__
158#define PRIi16 __INT16_FMTi__
159#define PRIi32 __INT32_FMTi__
160#define PRIi64 __INT64_FMTi__
161
162#define PRIiLEAST8 __INT_LEAST8_FMTi__
163#define PRIiLEAST16 __INT_LEAST16_FMTi__
164#define PRIiLEAST32 __INT_LEAST32_FMTi__
165#define PRIiLEAST64 __INT_LEAST64_FMTi__
166
167#define PRIiFAST8 __INT_FAST8_FMTi__
168#define PRIiFAST16 __INT_FAST16_FMTi__
169#define PRIiFAST32 __INT_FAST32_FMTi__
170#define PRIiFAST64 __INT_FAST64_FMTi__
171
172#define PRIo8 __UINT8_FMTo__
173#define PRIo16 __UINT16_FMTo__
174#define PRIo32 __UINT32_FMTo__
175#define PRIo64 __UINT64_FMTo__
176
177#define PRIoLEAST8 __UINT_LEAST8_FMTo__
178#define PRIoLEAST16 __UINT_LEAST16_FMTo__
179#define PRIoLEAST32 __UINT_LEAST32_FMTo__
180#define PRIoLEAST64 __UINT_LEAST64_FMTo__
181
182#define PRIoFAST8 __UINT_FAST8_FMTo__
183#define PRIoFAST16 __UINT_FAST16_FMTo__
184#define PRIoFAST32 __UINT_FAST32_FMTo__
185#define PRIoFAST64 __UINT_FAST64_FMTo__
186
187#define PRIu8 __UINT8_FMTu__
188#define PRIu16 __UINT16_FMTu__
189#define PRIu32 __UINT32_FMTu__
190#define PRIu64 __UINT64_FMTu__
191
192#define PRIuLEAST8 __UINT_LEAST8_FMTu__
193#define PRIuLEAST16 __UINT_LEAST16_FMTu__
194#define PRIuLEAST32 __UINT_LEAST32_FMTu__
195#define PRIuLEAST64 __UINT_LEAST64_FMTu__
196
197#define PRIuFAST8 __UINT_FAST8_FMTu__
198#define PRIuFAST16 __UINT_FAST16_FMTu__
199#define PRIuFAST32 __UINT_FAST32_FMTu__
200#define PRIuFAST64 __UINT_FAST64_FMTu__
201
202#define PRIx8 __UINT8_FMTx__
203#define PRIx16 __UINT16_FMTx__
204#define PRIx32 __UINT32_FMTx__
205#define PRIx64 __UINT64_FMTx__
206
207#define PRIxLEAST8 __UINT_LEAST8_FMTx__
208#define PRIxLEAST16 __UINT_LEAST16_FMTx__
209#define PRIxLEAST32 __UINT_LEAST32_FMTx__
210#define PRIxLEAST64 __UINT_LEAST64_FMTx__
211
212#define PRIxFAST8 __UINT_FAST8_FMTx__
213#define PRIxFAST16 __UINT_FAST16_FMTx__
214#define PRIxFAST32 __UINT_FAST32_FMTx__
215#define PRIxFAST64 __UINT_FAST64_FMTx__
216
217#define PRIX8 __UINT8_FMTX__
218#define PRIX16 __UINT16_FMTX__
219#define PRIX32 __UINT32_FMTX__
220#define PRIX64 __UINT64_FMTX__
221
222#define PRIXLEAST8 __UINT_LEAST8_FMTX__
223#define PRIXLEAST16 __UINT_LEAST16_FMTX__
224#define PRIXLEAST32 __UINT_LEAST32_FMTX__
225#define PRIXLEAST64 __UINT_LEAST64_FMTX__
226
227#define PRIXFAST8 __UINT_FAST8_FMTX__
228#define PRIXFAST16 __UINT_FAST16_FMTX__
229#define PRIXFAST32 __UINT_FAST32_FMTX__
230#define PRIXFAST64 __UINT_FAST64_FMTX__
231
232#define PRIdMAX __INTMAX_FMTd__
233#define PRIiMAX __INTMAX_FMTi__
234#define PRIoMAX __UINTMAX_FMTo__
235#define PRIuMAX __UINTMAX_FMTu__
236#define PRIxMAX __UINTMAX_FMTx__
237#define PRIXMAX __UINTMAX_FMTX__
238
239#define PRIdPTR __INTPTR_FMTd__
240#define PRIiPTR __INTPTR_FMTi__
241#define PRIoPTR __UINTPTR_FMTo__
242#define PRIuPTR __UINTPTR_FMTu__
243#define PRIxPTR __UINTPTR_FMTx__
244#define PRIXPTR __UINTPTR_FMTX__
245
246#define SCNd8 __INT8_FMTd__
247#define SCNd16 __INT16_FMTd__
248#define SCNd32 __INT32_FMTd__
249#define SCNd64 __INT64_FMTd__
250
251#define SCNdLEAST8 __INT_LEAST8_FMTd__
252#define SCNdLEAST16 __INT_LEAST16_FMTd__
253#define SCNdLEAST32 __INT_LEAST32_FMTd__
254#define SCNdLEAST64 __INT_LEAST64_FMTd__
255
256#define SCNdFAST8 __INT_FAST8_FMTd__
257#define SCNdFAST16 __INT_FAST16_FMTd__
258#define SCNdFAST32 __INT_FAST32_FMTd__
259#define SCNdFAST64 __INT_FAST64_FMTd__
260
261#define SCNi8 __INT8_FMTi__
262#define SCNi16 __INT16_FMTi__
263#define SCNi32 __INT32_FMTi__
264#define SCNi64 __INT64_FMTi__
265
266#define SCNiLEAST8 __INT_LEAST8_FMTi__
267#define SCNiLEAST16 __INT_LEAST16_FMTi__
268#define SCNiLEAST32 __INT_LEAST32_FMTi__
269#define SCNiLEAST64 __INT_LEAST64_FMTi__
270
271#define SCNiFAST8 __INT_FAST8_FMTi__
272#define SCNiFAST16 __INT_FAST16_FMTi__
273#define SCNiFAST32 __INT_FAST32_FMTi__
274#define SCNiFAST64 __INT_FAST64_FMTi__
275
276#define SCNo8 __UINT8_FMTo__
277#define SCNo16 __UINT16_FMTo__
278#define SCNo32 __UINT32_FMTo__
279#define SCNo64 __UINT64_FMTo__
280
281#define SCNoLEAST8 __UINT_LEAST8_FMTo__
282#define SCNoLEAST16 __UINT_LEAST16_FMTo__
283#define SCNoLEAST32 __UINT_LEAST32_FMTo__
284#define SCNoLEAST64 __UINT_LEAST64_FMTo__
285
286#define SCNoFAST8 __UINT_FAST8_FMTo__
287#define SCNoFAST16 __UINT_FAST16_FMTo__
288#define SCNoFAST32 __UINT_FAST32_FMTo__
289#define SCNoFAST64 __UINT_FAST64_FMTo__
290
291#define SCNu8 __UINT8_FMTu__
292#define SCNu16 __UINT16_FMTu__
293#define SCNu32 __UINT32_FMTu__
294#define SCNu64 __UINT64_FMTu__
295
296#define SCNuLEAST8 __UINT_LEAST8_FMTu__
297#define SCNuLEAST16 __UINT_LEAST16_FMTu__
298#define SCNuLEAST32 __UINT_LEAST32_FMTu__
299#define SCNuLEAST64 __UINT_LEAST64_FMTu__
300
301#define SCNuFAST8 __UINT_FAST8_FMTu__
302#define SCNuFAST16 __UINT_FAST16_FMTu__
303#define SCNuFAST32 __UINT_FAST32_FMTu__
304#define SCNuFAST64 __UINT_FAST64_FMTu__
305
306#define SCNx8 __UINT8_FMTx__
307#define SCNx16 __UINT16_FMTx__
308#define SCNx32 __UINT32_FMTx__
309#define SCNx64 __UINT64_FMTx__
310
311#define SCNxLEAST8 __UINT_LEAST8_FMTx__
312#define SCNxLEAST16 __UINT_LEAST16_FMTx__
313#define SCNxLEAST32 __UINT_LEAST32_FMTx__
314#define SCNxLEAST64 __UINT_LEAST64_FMTx__
315
316#define SCNxFAST8 __UINT_FAST8_FMTx__
317#define SCNxFAST16 __UINT_FAST16_FMTx__
318#define SCNxFAST32 __UINT_FAST32_FMTx__
319#define SCNxFAST64 __UINT_FAST64_FMTx__
320
321#define SCNX8 __UINT8_FMTX__
322#define SCNX16 __UINT16_FMTX__
323#define SCNX32 __UINT32_FMTX__
324#define SCNX64 __UINT64_FMTX__
325
326#define SCNXLEAST8 __UINT_LEAST8_FMTX__
327#define SCNXLEAST16 __UINT_LEAST16_FMTX__
328#define SCNXLEAST32 __UINT_LEAST32_FMTX__
329#define SCNXLEAST64 __UINT_LEAST64_FMTX__
330
331#define SCNXFAST8 __UINT_FAST8_FMTX__
332#define SCNXFAST16 __UINT_FAST16_FMTX__
333#define SCNXFAST32 __UINT_FAST32_FMTX__
334#define SCNXFAST64 __UINT_FAST64_FMTX__
335
336#define SCNdMAX __INTMAX_FMTd__
337#define SCNiMAX __INTMAX_FMTi__
338#define SCNoMAX __UINTMAX_FMTo__
339#define SCNuMAX __UINTMAX_FMTu__
340#define SCNxMAX __UINTMAX_FMTx__
341#define SCNXMAX __UINTMAX_FMTX__
342
343#define SCNdPTR __INTPTR_FMTd__
344#define SCNiPTR __INTPTR_FMTi__
345#define SCNoPTR __UINTPTR_FMTo__
346#define SCNuPTR __UINTPTR_FMTu__
347#define SCNxPTR __UINTPTR_FMTx__
348#define SCNXPTR __UINTPTR_FMTX__
349
350#ifdef __cplusplus
351}
352#endif
353