master
  1/* Copyright (C) 1997-2025 Free Software Foundation, Inc.
  2   This file is part of the GNU C Library.
  3
  4   The GNU C Library is free software; you can redistribute it and/or
  5   modify it under the terms of the GNU Lesser General Public
  6   License as published by the Free Software Foundation; either
  7   version 2.1 of the License, or (at your option) any later version.
  8
  9   The GNU C Library is distributed in the hope that it will be useful,
 10   but WITHOUT ANY WARRANTY; without even the implied warranty of
 11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 12   Lesser General Public License for more details.
 13
 14   You should have received a copy of the GNU Lesser General Public
 15   License along with the GNU C Library; if not, see
 16   <https://www.gnu.org/licenses/>.  */
 17
 18/*
 19 *	ISO C99: 7.8 Format conversion of integer types	<inttypes.h>
 20 */
 21
 22#ifndef _INTTYPES_H
 23#define _INTTYPES_H	1
 24
 25#include <features.h>
 26/* Get the type definitions.  */
 27#include <stdint.h>
 28
 29/* Get a definition for wchar_t.  But we must not define wchar_t itself.  */
 30#ifndef ____gwchar_t_defined
 31# ifdef __cplusplus
 32#  define __gwchar_t wchar_t
 33# elif defined __WCHAR_TYPE__
 34typedef __WCHAR_TYPE__ __gwchar_t;
 35# else
 36#  define __need_wchar_t
 37#  include <stddef.h>
 38typedef wchar_t __gwchar_t;
 39# endif
 40# define ____gwchar_t_defined	1
 41#endif
 42
 43# if __WORDSIZE == 64
 44#  define __PRI64_PREFIX	"l"
 45#  define __PRIPTR_PREFIX	"l"
 46# else
 47#  define __PRI64_PREFIX	"ll"
 48#  define __PRIPTR_PREFIX
 49# endif
 50
 51/* Macros for printing format specifiers.  */
 52
 53/* Decimal notation.  */
 54# define PRId8		"d"
 55# define PRId16		"d"
 56# define PRId32		"d"
 57# define PRId64		__PRI64_PREFIX "d"
 58
 59# define PRIdLEAST8	"d"
 60# define PRIdLEAST16	"d"
 61# define PRIdLEAST32	"d"
 62# define PRIdLEAST64	__PRI64_PREFIX "d"
 63
 64# define PRIdFAST8	"d"
 65# define PRIdFAST16	__PRIPTR_PREFIX "d"
 66# define PRIdFAST32	__PRIPTR_PREFIX "d"
 67# define PRIdFAST64	__PRI64_PREFIX "d"
 68
 69
 70# define PRIi8		"i"
 71# define PRIi16		"i"
 72# define PRIi32		"i"
 73# define PRIi64		__PRI64_PREFIX "i"
 74
 75# define PRIiLEAST8	"i"
 76# define PRIiLEAST16	"i"
 77# define PRIiLEAST32	"i"
 78# define PRIiLEAST64	__PRI64_PREFIX "i"
 79
 80# define PRIiFAST8	"i"
 81# define PRIiFAST16	__PRIPTR_PREFIX "i"
 82# define PRIiFAST32	__PRIPTR_PREFIX "i"
 83# define PRIiFAST64	__PRI64_PREFIX "i"
 84
 85/* Octal notation.  */
 86# define PRIo8		"o"
 87# define PRIo16		"o"
 88# define PRIo32		"o"
 89# define PRIo64		__PRI64_PREFIX "o"
 90
 91# define PRIoLEAST8	"o"
 92# define PRIoLEAST16	"o"
 93# define PRIoLEAST32	"o"
 94# define PRIoLEAST64	__PRI64_PREFIX "o"
 95
 96# define PRIoFAST8	"o"
 97# define PRIoFAST16	__PRIPTR_PREFIX "o"
 98# define PRIoFAST32	__PRIPTR_PREFIX "o"
 99# define PRIoFAST64	__PRI64_PREFIX "o"
100
101/* Unsigned integers.  */
102# define PRIu8		"u"
103# define PRIu16		"u"
104# define PRIu32		"u"
105# define PRIu64		__PRI64_PREFIX "u"
106
107# define PRIuLEAST8	"u"
108# define PRIuLEAST16	"u"
109# define PRIuLEAST32	"u"
110# define PRIuLEAST64	__PRI64_PREFIX "u"
111
112# define PRIuFAST8	"u"
113# define PRIuFAST16	__PRIPTR_PREFIX "u"
114# define PRIuFAST32	__PRIPTR_PREFIX "u"
115# define PRIuFAST64	__PRI64_PREFIX "u"
116
117/* lowercase hexadecimal notation.  */
118# define PRIx8		"x"
119# define PRIx16		"x"
120# define PRIx32		"x"
121# define PRIx64		__PRI64_PREFIX "x"
122
123# define PRIxLEAST8	"x"
124# define PRIxLEAST16	"x"
125# define PRIxLEAST32	"x"
126# define PRIxLEAST64	__PRI64_PREFIX "x"
127
128# define PRIxFAST8	"x"
129# define PRIxFAST16	__PRIPTR_PREFIX "x"
130# define PRIxFAST32	__PRIPTR_PREFIX "x"
131# define PRIxFAST64	__PRI64_PREFIX "x"
132
133/* UPPERCASE hexadecimal notation.  */
134# define PRIX8		"X"
135# define PRIX16		"X"
136# define PRIX32		"X"
137# define PRIX64		__PRI64_PREFIX "X"
138
139# define PRIXLEAST8	"X"
140# define PRIXLEAST16	"X"
141# define PRIXLEAST32	"X"
142# define PRIXLEAST64	__PRI64_PREFIX "X"
143
144# define PRIXFAST8	"X"
145# define PRIXFAST16	__PRIPTR_PREFIX "X"
146# define PRIXFAST32	__PRIPTR_PREFIX "X"
147# define PRIXFAST64	__PRI64_PREFIX "X"
148
149
150/* Macros for printing `intmax_t' and `uintmax_t'.  */
151# define PRIdMAX	__PRI64_PREFIX "d"
152# define PRIiMAX	__PRI64_PREFIX "i"
153# define PRIoMAX	__PRI64_PREFIX "o"
154# define PRIuMAX	__PRI64_PREFIX "u"
155# define PRIxMAX	__PRI64_PREFIX "x"
156# define PRIXMAX	__PRI64_PREFIX "X"
157
158
159/* Macros for printing `intptr_t' and `uintptr_t'.  */
160# define PRIdPTR	__PRIPTR_PREFIX "d"
161# define PRIiPTR	__PRIPTR_PREFIX "i"
162# define PRIoPTR	__PRIPTR_PREFIX "o"
163# define PRIuPTR	__PRIPTR_PREFIX "u"
164# define PRIxPTR	__PRIPTR_PREFIX "x"
165# define PRIXPTR	__PRIPTR_PREFIX "X"
166
167/* Binary notation.  */
168# if __GLIBC_USE (ISOC23)
169#  define PRIb8		"b"
170#  define PRIb16	"b"
171#  define PRIb32	"b"
172#  define PRIb64	__PRI64_PREFIX "b"
173
174#  define PRIbLEAST8	"b"
175#  define PRIbLEAST16	"b"
176#  define PRIbLEAST32	"b"
177#  define PRIbLEAST64	__PRI64_PREFIX "b"
178
179#  define PRIbFAST8	"b"
180#  define PRIbFAST16	__PRIPTR_PREFIX "b"
181#  define PRIbFAST32	__PRIPTR_PREFIX "b"
182#  define PRIbFAST64	__PRI64_PREFIX "b"
183
184#  define PRIbMAX	__PRI64_PREFIX "b"
185#  define PRIbPTR	__PRIPTR_PREFIX "b"
186
187#  define PRIB8		"B"
188#  define PRIB16	"B"
189#  define PRIB32	"B"
190#  define PRIB64	__PRI64_PREFIX "B"
191
192#  define PRIBLEAST8	"B"
193#  define PRIBLEAST16	"B"
194#  define PRIBLEAST32	"B"
195#  define PRIBLEAST64	__PRI64_PREFIX "B"
196
197#  define PRIBFAST8	"B"
198#  define PRIBFAST16	__PRIPTR_PREFIX "B"
199#  define PRIBFAST32	__PRIPTR_PREFIX "B"
200#  define PRIBFAST64	__PRI64_PREFIX "B"
201
202#  define PRIBMAX	__PRI64_PREFIX "B"
203#  define PRIBPTR	__PRIPTR_PREFIX "B"
204# endif
205
206
207/* Macros for scanning format specifiers.  */
208
209/* Signed decimal notation.  */
210# define SCNd8		"hhd"
211# define SCNd16		"hd"
212# define SCNd32		"d"
213# define SCNd64		__PRI64_PREFIX "d"
214
215# define SCNdLEAST8	"hhd"
216# define SCNdLEAST16	"hd"
217# define SCNdLEAST32	"d"
218# define SCNdLEAST64	__PRI64_PREFIX "d"
219
220# define SCNdFAST8	"hhd"
221# define SCNdFAST16	__PRIPTR_PREFIX "d"
222# define SCNdFAST32	__PRIPTR_PREFIX "d"
223# define SCNdFAST64	__PRI64_PREFIX "d"
224
225/* Signed decimal notation.  */
226# define SCNi8		"hhi"
227# define SCNi16		"hi"
228# define SCNi32		"i"
229# define SCNi64		__PRI64_PREFIX "i"
230
231# define SCNiLEAST8	"hhi"
232# define SCNiLEAST16	"hi"
233# define SCNiLEAST32	"i"
234# define SCNiLEAST64	__PRI64_PREFIX "i"
235
236# define SCNiFAST8	"hhi"
237# define SCNiFAST16	__PRIPTR_PREFIX "i"
238# define SCNiFAST32	__PRIPTR_PREFIX "i"
239# define SCNiFAST64	__PRI64_PREFIX "i"
240
241/* Unsigned decimal notation.  */
242# define SCNu8		"hhu"
243# define SCNu16		"hu"
244# define SCNu32		"u"
245# define SCNu64		__PRI64_PREFIX "u"
246
247# define SCNuLEAST8	"hhu"
248# define SCNuLEAST16	"hu"
249# define SCNuLEAST32	"u"
250# define SCNuLEAST64	__PRI64_PREFIX "u"
251
252# define SCNuFAST8	"hhu"
253# define SCNuFAST16	__PRIPTR_PREFIX "u"
254# define SCNuFAST32	__PRIPTR_PREFIX "u"
255# define SCNuFAST64	__PRI64_PREFIX "u"
256
257/* Octal notation.  */
258# define SCNo8		"hho"
259# define SCNo16		"ho"
260# define SCNo32		"o"
261# define SCNo64		__PRI64_PREFIX "o"
262
263# define SCNoLEAST8	"hho"
264# define SCNoLEAST16	"ho"
265# define SCNoLEAST32	"o"
266# define SCNoLEAST64	__PRI64_PREFIX "o"
267
268# define SCNoFAST8	"hho"
269# define SCNoFAST16	__PRIPTR_PREFIX "o"
270# define SCNoFAST32	__PRIPTR_PREFIX "o"
271# define SCNoFAST64	__PRI64_PREFIX "o"
272
273/* Hexadecimal notation.  */
274# define SCNx8		"hhx"
275# define SCNx16		"hx"
276# define SCNx32		"x"
277# define SCNx64		__PRI64_PREFIX "x"
278
279# define SCNxLEAST8	"hhx"
280# define SCNxLEAST16	"hx"
281# define SCNxLEAST32	"x"
282# define SCNxLEAST64	__PRI64_PREFIX "x"
283
284# define SCNxFAST8	"hhx"
285# define SCNxFAST16	__PRIPTR_PREFIX "x"
286# define SCNxFAST32	__PRIPTR_PREFIX "x"
287# define SCNxFAST64	__PRI64_PREFIX "x"
288
289
290/* Macros for scanning `intmax_t' and `uintmax_t'.  */
291# define SCNdMAX	__PRI64_PREFIX "d"
292# define SCNiMAX	__PRI64_PREFIX "i"
293# define SCNoMAX	__PRI64_PREFIX "o"
294# define SCNuMAX	__PRI64_PREFIX "u"
295# define SCNxMAX	__PRI64_PREFIX "x"
296
297/* Macros for scanning `intptr_t' and `uintptr_t'.  */
298# define SCNdPTR	__PRIPTR_PREFIX "d"
299# define SCNiPTR	__PRIPTR_PREFIX "i"
300# define SCNoPTR	__PRIPTR_PREFIX "o"
301# define SCNuPTR	__PRIPTR_PREFIX "u"
302# define SCNxPTR	__PRIPTR_PREFIX "x"
303
304
305/* Binary notation.  */
306# if __GLIBC_USE (ISOC23)
307#  define SCNb8		"hhb"
308#  define SCNb16	"hb"
309#  define SCNb32	"b"
310#  define SCNb64	__PRI64_PREFIX "b"
311
312#  define SCNbLEAST8	"hhb"
313#  define SCNbLEAST16	"hb"
314#  define SCNbLEAST32	"b"
315#  define SCNbLEAST64	__PRI64_PREFIX "b"
316
317#  define SCNbFAST8	"hhb"
318#  define SCNbFAST16	__PRIPTR_PREFIX "b"
319#  define SCNbFAST32	__PRIPTR_PREFIX "b"
320#  define SCNbFAST64	__PRI64_PREFIX "b"
321
322#  define SCNbMAX	__PRI64_PREFIX "b"
323#  define SCNbPTR	__PRIPTR_PREFIX "b"
324# endif
325
326
327__BEGIN_DECLS
328
329#if __WORDSIZE == 64
330
331/* We have to define the `uintmax_t' type using `ldiv_t'.  */
332typedef struct
333  {
334    long int quot;		/* Quotient.  */
335    long int rem;		/* Remainder.  */
336  } imaxdiv_t;
337
338#else
339
340/* We have to define the `uintmax_t' type using `lldiv_t'.  */
341typedef struct
342  {
343    __extension__ long long int quot;	/* Quotient.  */
344    __extension__ long long int rem;	/* Remainder.  */
345  } imaxdiv_t;
346
347#endif
348
349
350/* Compute absolute value of N.  */
351extern intmax_t imaxabs (intmax_t __n) __THROW __attribute__ ((__const__));
352
353
354#if __GLIBC_USE (ISOC2Y)
355extern uintmax_t uimaxabs (intmax_t __n) __THROW __attribute__ ((__const__));
356#endif
357
358/* Return the `imaxdiv_t' representation of the value of NUMER over DENOM. */
359extern imaxdiv_t imaxdiv (intmax_t __numer, intmax_t __denom)
360      __THROW __attribute__ ((__const__));
361
362/* Like `strtol' but convert to `intmax_t'.  */
363extern intmax_t strtoimax (const char *__restrict __nptr,
364			   char **__restrict __endptr, int __base) __THROW;
365
366/* Like `strtoul' but convert to `uintmax_t'.  */
367extern uintmax_t strtoumax (const char *__restrict __nptr,
368			    char ** __restrict __endptr, int __base) __THROW;
369
370/* Like `wcstol' but convert to `intmax_t'.  */
371extern intmax_t wcstoimax (const __gwchar_t *__restrict __nptr,
372			   __gwchar_t **__restrict __endptr, int __base)
373     __THROW;
374
375/* Like `wcstoul' but convert to `uintmax_t'.  */
376extern uintmax_t wcstoumax (const __gwchar_t *__restrict __nptr,
377			    __gwchar_t ** __restrict __endptr, int __base)
378     __THROW;
379
380/* Versions of the above functions that handle '0b' and '0B' prefixes
381   in base 0 or 2.  */
382#if __GLIBC_USE (C23_STRTOL)
383# ifdef __REDIRECT
384extern intmax_t __REDIRECT_NTH (strtoimax, (const char *__restrict __nptr,
385					    char **__restrict __endptr,
386					    int __base), __isoc23_strtoimax);
387extern uintmax_t __REDIRECT_NTH (strtoumax, (const char *__restrict __nptr,
388					     char **__restrict __endptr,
389					     int __base), __isoc23_strtoumax);
390extern intmax_t __REDIRECT_NTH (wcstoimax,
391				(const __gwchar_t *__restrict __nptr,
392				 __gwchar_t **__restrict __endptr, int __base),
393				__isoc23_wcstoimax);
394extern uintmax_t __REDIRECT_NTH (wcstoumax,
395				 (const __gwchar_t *__restrict __nptr,
396				  __gwchar_t **__restrict __endptr, int __base),
397				 __isoc23_wcstoumax);
398# else
399extern intmax_t __isoc23_strtoimax (const char *__restrict __nptr,
400				    char **__restrict __endptr, int __base)
401     __THROW;
402extern uintmax_t __isoc23_strtoumax (const char *__restrict __nptr,
403				     char ** __restrict __endptr, int __base)
404     __THROW;
405extern intmax_t __isoc23_wcstoimax (const __gwchar_t *__restrict __nptr,
406				    __gwchar_t **__restrict __endptr,
407				    int __base)
408     __THROW;
409extern uintmax_t __isoc23_wcstoumax (const __gwchar_t *__restrict __nptr,
410				     __gwchar_t ** __restrict __endptr,
411				     int __base)
412     __THROW;
413# define strtoimax __isoc23_strtoimax
414# define strtoumax __isoc23_strtoumax
415# define wcstoimax __isoc23_wcstoimax
416# define wcstoumax __isoc23_wcstoumax
417# endif
418#endif
419
420__END_DECLS
421
422#endif /* inttypes.h */