1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * Copyright (C) 1997-2001, 2004, 2007 Free Software Foundation, Inc.
4 *
5 * This file is taken from the GNU C Library v2.15, with the unimplemented
6 * functions removed and a few style fixes.
7 */
8
9/*
10 *	ISO C99: 7.8 Format conversion of integer types	<inttypes.h>
11 */
12
13#ifndef _INTTYPES_H
14#define _INTTYPES_H	1
15
16#include <linux/compiler.h>
17
18/* Get a definition for wchar_t.  But we must not define wchar_t itself.  */
19#ifndef ____gwchar_t_defined
20# ifdef __cplusplus
21#  define __gwchar_t wchar_t
22# elif defined __WCHAR_TYPE__
23typedef __WCHAR_TYPE__ __gwchar_t;
24# else
25#  define __need_wchar_t
26#  include <linux/stddef.h>
27typedef wchar_t __gwchar_t;
28# endif
29# define ____gwchar_t_defined	1
30#endif
31
32/*
33 * The ISO C99 standard specifies that these macros must only be defined if
34 * explicitly requested
35 */
36#if !defined __cplusplus || defined __STDC_FORMAT_MACROS
37
38/* linux/types.h always uses long long for 64-bit and long for uintptr_t */
39# define __PRI64_PREFIX	"ll"
40# define __PRIPTR_PREFIX	"l"
41
42/* Macros for printing format specifiers.  */
43
44/* Decimal notation.  */
45# define PRId8		"d"
46# define PRId16		"d"
47# define PRId32		"d"
48# define PRId64		__PRI64_PREFIX "d"
49
50# define PRIdLEAST8	"d"
51# define PRIdLEAST16	"d"
52# define PRIdLEAST32	"d"
53# define PRIdLEAST64	__PRI64_PREFIX "d"
54
55# define PRIdFAST8	"d"
56# define PRIdFAST16	__PRIPTR_PREFIX "d"
57# define PRIdFAST32	__PRIPTR_PREFIX "d"
58# define PRIdFAST64	__PRI64_PREFIX "d"
59
60# define PRIi8		"i"
61# define PRIi16		"i"
62# define PRIi32		"i"
63# define PRIi64		__PRI64_PREFIX "i"
64
65# define PRIiLEAST8	"i"
66# define PRIiLEAST16	"i"
67# define PRIiLEAST32	"i"
68# define PRIiLEAST64	__PRI64_PREFIX "i"
69
70# define PRIiFAST8	"i"
71# define PRIiFAST16	__PRIPTR_PREFIX "i"
72# define PRIiFAST32	__PRIPTR_PREFIX "i"
73# define PRIiFAST64	__PRI64_PREFIX "i"
74
75/* Octal notation.  */
76# define PRIo8		"o"
77# define PRIo16		"o"
78# define PRIo32		"o"
79# define PRIo64		__PRI64_PREFIX "o"
80
81# define PRIoLEAST8	"o"
82# define PRIoLEAST16	"o"
83# define PRIoLEAST32	"o"
84# define PRIoLEAST64	__PRI64_PREFIX "o"
85
86# define PRIoFAST8	"o"
87# define PRIoFAST16	__PRIPTR_PREFIX "o"
88# define PRIoFAST32	__PRIPTR_PREFIX "o"
89# define PRIoFAST64	__PRI64_PREFIX "o"
90
91/* Unsigned integers.  */
92# define PRIu8		"u"
93# define PRIu16		"u"
94# define PRIu32		"u"
95# define PRIu64		__PRI64_PREFIX "u"
96
97# define PRIuLEAST8	"u"
98# define PRIuLEAST16	"u"
99# define PRIuLEAST32	"u"
100# define PRIuLEAST64	__PRI64_PREFIX "u"
101
102# define PRIuFAST8	"u"
103# define PRIuFAST16	__PRIPTR_PREFIX "u"
104# define PRIuFAST32	__PRIPTR_PREFIX "u"
105# define PRIuFAST64	__PRI64_PREFIX "u"
106
107/* lowercase hexadecimal notation.  */
108# define PRIx8		"x"
109# define PRIx16		"x"
110# define PRIx32		"x"
111# define PRIx64		__PRI64_PREFIX "x"
112
113# define PRIxLEAST8	"x"
114# define PRIxLEAST16	"x"
115# define PRIxLEAST32	"x"
116# define PRIxLEAST64	__PRI64_PREFIX "x"
117
118# define PRIxFAST8	"x"
119# define PRIxFAST16	__PRIPTR_PREFIX "x"
120# define PRIxFAST32	__PRIPTR_PREFIX "x"
121# define PRIxFAST64	__PRI64_PREFIX "x"
122
123/* UPPERCASE hexadecimal notation.  */
124# define PRIX8		"X"
125# define PRIX16		"X"
126# define PRIX32		"X"
127# define PRIX64		__PRI64_PREFIX "X"
128
129# define PRIXLEAST8	"X"
130# define PRIXLEAST16	"X"
131# define PRIXLEAST32	"X"
132# define PRIXLEAST64	__PRI64_PREFIX "X"
133
134# define PRIXFAST8	"X"
135# define PRIXFAST16	__PRIPTR_PREFIX "X"
136# define PRIXFAST32	__PRIPTR_PREFIX "X"
137# define PRIXFAST64	__PRI64_PREFIX "X"
138
139/* Macros for printing `intmax_t' and `uintmax_t'.  */
140# define PRIdMAX	__PRI64_PREFIX "d"
141# define PRIiMAX	__PRI64_PREFIX "i"
142# define PRIoMAX	__PRI64_PREFIX "o"
143# define PRIuMAX	__PRI64_PREFIX "u"
144# define PRIxMAX	__PRI64_PREFIX "x"
145# define PRIXMAX	__PRI64_PREFIX "X"
146
147/* Macros for printing `intptr_t' and `uintptr_t'.  */
148# define PRIdPTR	__PRIPTR_PREFIX "d"
149# define PRIiPTR	__PRIPTR_PREFIX "i"
150# define PRIoPTR	__PRIPTR_PREFIX "o"
151# define PRIuPTR	__PRIPTR_PREFIX "u"
152# define PRIxPTR	__PRIPTR_PREFIX "x"
153# define PRIXPTR	__PRIPTR_PREFIX "X"
154
155/* Macros for scanning format specifiers.  */
156
157/* Signed decimal notation.  */
158# define SCNd8		"hhd"
159# define SCNd16		"hd"
160# define SCNd32		"d"
161# define SCNd64		__PRI64_PREFIX "d"
162
163# define SCNdLEAST8	"hhd"
164# define SCNdLEAST16	"hd"
165# define SCNdLEAST32	"d"
166# define SCNdLEAST64	__PRI64_PREFIX "d"
167
168# define SCNdFAST8	"hhd"
169# define SCNdFAST16	__PRIPTR_PREFIX "d"
170# define SCNdFAST32	__PRIPTR_PREFIX "d"
171# define SCNdFAST64	__PRI64_PREFIX "d"
172
173/* Signed decimal notation.  */
174# define SCNi8		"hhi"
175# define SCNi16		"hi"
176# define SCNi32		"i"
177# define SCNi64		__PRI64_PREFIX "i"
178
179# define SCNiLEAST8	"hhi"
180# define SCNiLEAST16	"hi"
181# define SCNiLEAST32	"i"
182# define SCNiLEAST64	__PRI64_PREFIX "i"
183
184# define SCNiFAST8	"hhi"
185# define SCNiFAST16	__PRIPTR_PREFIX "i"
186# define SCNiFAST32	__PRIPTR_PREFIX "i"
187# define SCNiFAST64	__PRI64_PREFIX "i"
188
189/* Unsigned decimal notation.  */
190# define SCNu8		"hhu"
191# define SCNu16		"hu"
192# define SCNu32		"u"
193# define SCNu64		__PRI64_PREFIX "u"
194
195# define SCNuLEAST8	"hhu"
196# define SCNuLEAST16	"hu"
197# define SCNuLEAST32	"u"
198# define SCNuLEAST64	__PRI64_PREFIX "u"
199
200# define SCNuFAST8	"hhu"
201# define SCNuFAST16	__PRIPTR_PREFIX "u"
202# define SCNuFAST32	__PRIPTR_PREFIX "u"
203# define SCNuFAST64	__PRI64_PREFIX "u"
204
205/* Octal notation.  */
206# define SCNo8		"hho"
207# define SCNo16		"ho"
208# define SCNo32		"o"
209# define SCNo64		__PRI64_PREFIX "o"
210
211# define SCNoLEAST8	"hho"
212# define SCNoLEAST16	"ho"
213# define SCNoLEAST32	"o"
214# define SCNoLEAST64	__PRI64_PREFIX "o"
215
216# define SCNoFAST8	"hho"
217# define SCNoFAST16	__PRIPTR_PREFIX "o"
218# define SCNoFAST32	__PRIPTR_PREFIX "o"
219# define SCNoFAST64	__PRI64_PREFIX "o"
220
221/* Hexadecimal notation.  */
222# define SCNx8		"hhx"
223# define SCNx16		"hx"
224# define SCNx32		"x"
225# define SCNx64		__PRI64_PREFIX "x"
226
227# define SCNxLEAST8	"hhx"
228# define SCNxLEAST16	"hx"
229# define SCNxLEAST32	"x"
230# define SCNxLEAST64	__PRI64_PREFIX "x"
231
232# define SCNxFAST8	"hhx"
233# define SCNxFAST16	__PRIPTR_PREFIX "x"
234# define SCNxFAST32	__PRIPTR_PREFIX "x"
235# define SCNxFAST64	__PRI64_PREFIX "x"
236
237/* Macros for scanning `intmax_t' and `uintmax_t'.  */
238# define SCNdMAX	__PRI64_PREFIX "d"
239# define SCNiMAX	__PRI64_PREFIX "i"
240# define SCNoMAX	__PRI64_PREFIX "o"
241# define SCNuMAX	__PRI64_PREFIX "u"
242# define SCNxMAX	__PRI64_PREFIX "x"
243
244/* Macros for scanning `intptr_t' and `uintptr_t'.  */
245# define SCNdPTR	__PRIPTR_PREFIX "d"
246# define SCNiPTR	__PRIPTR_PREFIX "i"
247# define SCNoPTR	__PRIPTR_PREFIX "o"
248# define SCNuPTR	__PRIPTR_PREFIX "u"
249# define SCNxPTR	__PRIPTR_PREFIX "x"
250
251#endif	/* C++ && format macros */
252
253#if __WORDSIZE == 64
254
255/* We have to define the `uintmax_t' type using `ldiv_t'.  */
256typedef struct {
257	long int quot;		/* Quotient.  */
258	long int rem;		/* Remainder.  */
259} imaxdiv_t;
260
261#else
262
263/* We have to define the `uintmax_t' type using `lldiv_t'.  */
264typedef struct {
265	long long int quot;		/* Quotient.  */
266	long long int rem;		/* Remainder.  */
267} imaxdiv_t;
268
269#endif
270
271#endif /* inttypes.h */
272