root/include/inttypes.h
/*      $OpenBSD: inttypes.h,v 1.14 2022/07/31 01:27:31 guenther Exp $  */

/*
 * Copyright (c) 1997, 2005 Todd C. Miller <millert@openbsd.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef _INTTYPES_H_
#define _INTTYPES_H_

#include <sys/stdint.h>

#ifdef __cplusplus
#define __wchar_t       wchar_t
#elif __POSIX_VISIBLE >= 200809 && !defined(_WCHAR_T_DEFINED_)
#define _WCHAR_T_DEFINED_
typedef __wchar_t       wchar_t;
#endif

/*
 * 7.8.1 Macros for format specifiers
 *
 * Each of the following object-like macros expands to a string
 * literal containing a conversion specifier, possibly modified by
 * a prefix such as hh, h, l, or ll, suitable for use within the
 * format argument of a formatted input/output function when
 * converting the corresponding integer type.  These macro names
 * have the general form of PRI (character string literals for the
 * fprintf family) or SCN (character string literals for the fscanf
 * family), followed by the conversion specifier, followed by a
 * name corresponding to a similar typedef name.  For example,
 * PRIdFAST32 can be used in a format string to print the value of
 * an integer of type int_fast32_t.
 */

/* fprintf macros for signed integers */
#define PRId8                   "d"             /* int8_t */
#define PRId16                  "d"             /* int16_t */
#define PRId32                  "d"             /* int32_t */
#define PRId64                  "lld"           /* int64_t */

#define PRIdLEAST8              "d"             /* int_least8_t */
#define PRIdLEAST16             "d"             /* int_least16_t */
#define PRIdLEAST32             "d"             /* int_least32_t */
#define PRIdLEAST64             "lld"           /* int_least64_t */

#define PRIdFAST8               "d"             /* int_fast8_t */
#define PRIdFAST16              "d"             /* int_fast16_t */
#define PRIdFAST32              "d"             /* int_fast32_t */
#define PRIdFAST64              "lld"           /* int_fast64_t */

#define PRIdMAX                 "jd"            /* intmax_t */
#define PRIdPTR                 "ld"            /* intptr_t */

#define PRIi8                   "i"             /* int8_t */
#define PRIi16                  "i"             /* int16_t */
#define PRIi32                  "i"             /* int32_t */
#define PRIi64                  "lli"           /* int64_t */

#define PRIiLEAST8              "i"             /* int_least8_t */
#define PRIiLEAST16             "i"             /* int_least16_t */
#define PRIiLEAST32             "i"             /* int_least32_t */
#define PRIiLEAST64             "lli"           /* int_least64_t */

#define PRIiFAST8               "i"             /* int_fast8_t */
#define PRIiFAST16              "i"             /* int_fast16_t */
#define PRIiFAST32              "i"             /* int_fast32_t */
#define PRIiFAST64              "lli"           /* int_fast64_t */

#define PRIiMAX                 "ji"            /* intmax_t */
#define PRIiPTR                 "li"            /* intptr_t */

/* fprintf macros for unsigned integers */
#define PRIo8                   "o"             /* int8_t */
#define PRIo16                  "o"             /* int16_t */
#define PRIo32                  "o"             /* int32_t */
#define PRIo64                  "llo"           /* int64_t */

#define PRIoLEAST8              "o"             /* int_least8_t */
#define PRIoLEAST16             "o"             /* int_least16_t */
#define PRIoLEAST32             "o"             /* int_least32_t */
#define PRIoLEAST64             "llo"           /* int_least64_t */

#define PRIoFAST8               "o"             /* int_fast8_t */
#define PRIoFAST16              "o"             /* int_fast16_t */
#define PRIoFAST32              "o"             /* int_fast32_t */
#define PRIoFAST64              "llo"           /* int_fast64_t */

#define PRIoMAX                 "jo"            /* intmax_t */
#define PRIoPTR                 "lo"            /* intptr_t */

#define PRIu8                   "u"             /* uint8_t */
#define PRIu16                  "u"             /* uint16_t */
#define PRIu32                  "u"             /* uint32_t */
#define PRIu64                  "llu"           /* uint64_t */

#define PRIuLEAST8              "u"             /* uint_least8_t */
#define PRIuLEAST16             "u"             /* uint_least16_t */
#define PRIuLEAST32             "u"             /* uint_least32_t */
#define PRIuLEAST64             "llu"           /* uint_least64_t */

#define PRIuFAST8               "u"             /* uint_fast8_t */
#define PRIuFAST16              "u"             /* uint_fast16_t */
#define PRIuFAST32              "u"             /* uint_fast32_t */
#define PRIuFAST64              "llu"           /* uint_fast64_t */

#define PRIuMAX                 "ju"            /* uintmax_t */
#define PRIuPTR                 "lu"            /* uintptr_t */

#define PRIx8                   "x"             /* uint8_t */
#define PRIx16                  "x"             /* uint16_t */
#define PRIx32                  "x"             /* uint32_t */
#define PRIx64                  "llx"           /* uint64_t */

#define PRIxLEAST8              "x"             /* uint_least8_t */
#define PRIxLEAST16             "x"             /* uint_least16_t */
#define PRIxLEAST32             "x"             /* uint_least32_t */
#define PRIxLEAST64             "llx"           /* uint_least64_t */

#define PRIxFAST8               "x"             /* uint_fast8_t */
#define PRIxFAST16              "x"             /* uint_fast16_t */
#define PRIxFAST32              "x"             /* uint_fast32_t */
#define PRIxFAST64              "llx"           /* uint_fast64_t */

#define PRIxMAX                 "jx"            /* uintmax_t */
#define PRIxPTR                 "lx"            /* uintptr_t */

#define PRIX8                   "X"             /* uint8_t */
#define PRIX16                  "X"             /* uint16_t */
#define PRIX32                  "X"             /* uint32_t */
#define PRIX64                  "llX"           /* uint64_t */

#define PRIXLEAST8              "X"             /* uint_least8_t */
#define PRIXLEAST16             "X"             /* uint_least16_t */
#define PRIXLEAST32             "X"             /* uint_least32_t */
#define PRIXLEAST64             "llX"           /* uint_least64_t */

#define PRIXFAST8               "X"             /* uint_fast8_t */
#define PRIXFAST16              "X"             /* uint_fast16_t */
#define PRIXFAST32              "X"             /* uint_fast32_t */
#define PRIXFAST64              "llX"           /* uint_fast64_t */

#define PRIXMAX                 "jX"            /* uintmax_t */
#define PRIXPTR                 "lX"            /* uintptr_t */

/* fscanf macros for signed integers */
#define SCNd8                   "hhd"           /* int8_t */
#define SCNd16                  "hd"            /* int16_t */
#define SCNd32                  "d"             /* int32_t */
#define SCNd64                  "lld"           /* int64_t */

#define SCNdLEAST8              "hhd"           /* int_least8_t */
#define SCNdLEAST16             "hd"            /* int_least16_t */
#define SCNdLEAST32             "d"             /* int_least32_t */
#define SCNdLEAST64             "lld"           /* int_least64_t */

#define SCNdFAST8               "d"             /* int_fast8_t */
#define SCNdFAST16              "d"             /* int_fast16_t */
#define SCNdFAST32              "d"             /* int_fast32_t */
#define SCNdFAST64              "lld"           /* int_fast64_t */

#define SCNdMAX                 "jd"            /* intmax_t */
#define SCNdPTR                 "ld"            /* intptr_t */

#define SCNi8                   "hhi"           /* int8_t */
#define SCNi16                  "hi"            /* int16_t */
#define SCNi32                  "i"             /* int32_t */
#define SCNi64                  "lli"           /* int64_t */

#define SCNiLEAST8              "hhi"           /* int_least8_t */
#define SCNiLEAST16             "hi"            /* int_least16_t */
#define SCNiLEAST32             "i"             /* int_least32_t */
#define SCNiLEAST64             "lli"           /* int_least64_t */

#define SCNiFAST8               "i"             /* int_fast8_t */
#define SCNiFAST16              "i"             /* int_fast16_t */
#define SCNiFAST32              "i"             /* int_fast32_t */
#define SCNiFAST64              "lli"           /* int_fast64_t */

#define SCNiMAX                 "ji"            /* intmax_t */
#define SCNiPTR                 "li"            /* intptr_t */

/* fscanf macros for unsigned integers */
#define SCNo8                   "hho"           /* uint8_t */
#define SCNo16                  "ho"            /* uint16_t */
#define SCNo32                  "o"             /* uint32_t */
#define SCNo64                  "llo"           /* uint64_t */

#define SCNoLEAST8              "hho"           /* uint_least8_t */
#define SCNoLEAST16             "ho"            /* uint_least16_t */
#define SCNoLEAST32             "o"             /* uint_least32_t */
#define SCNoLEAST64             "llo"           /* uint_least64_t */

#define SCNoFAST8               "o"             /* uint_fast8_t */
#define SCNoFAST16              "o"             /* uint_fast16_t */
#define SCNoFAST32              "o"             /* uint_fast32_t */
#define SCNoFAST64              "llo"           /* uint_fast64_t */

#define SCNoMAX                 "jo"            /* uintmax_t */
#define SCNoPTR                 "lo"            /* uintptr_t */

#define SCNu8                   "hhu"           /* uint8_t */
#define SCNu16                  "hu"            /* uint16_t */
#define SCNu32                  "u"             /* uint32_t */
#define SCNu64                  "llu"           /* uint64_t */

#define SCNuLEAST8              "hhu"           /* uint_least8_t */
#define SCNuLEAST16             "hu"            /* uint_least16_t */
#define SCNuLEAST32             "u"             /* uint_least32_t */
#define SCNuLEAST64             "llu"           /* uint_least64_t */

#define SCNuFAST8               "u"             /* uint_fast8_t */
#define SCNuFAST16              "u"             /* uint_fast16_t */
#define SCNuFAST32              "u"             /* uint_fast32_t */
#define SCNuFAST64              "llu"           /* uint_fast64_t */

#define SCNuMAX                 "ju"            /* uintmax_t */
#define SCNuPTR                 "lu"            /* uintptr_t */

#define SCNx8                   "hhx"           /* uint8_t */
#define SCNx16                  "hx"            /* uint16_t */
#define SCNx32                  "x"             /* uint32_t */
#define SCNx64                  "llx"           /* uint64_t */

#define SCNxLEAST8              "hhx"           /* uint_least8_t */
#define SCNxLEAST16             "hx"            /* uint_least16_t */
#define SCNxLEAST32             "x"             /* uint_least32_t */
#define SCNxLEAST64             "llx"           /* uint_least64_t */

#define SCNxFAST8               "x"             /* uint_fast8_t */
#define SCNxFAST16              "x"             /* uint_fast16_t */
#define SCNxFAST32              "x"             /* uint_fast32_t */
#define SCNxFAST64              "llx"           /* uint_fast64_t */

#define SCNxMAX                 "jx"            /* uintmax_t */
#define SCNxPTR                 "lx"            /* uintptr_t */

typedef struct {
        intmax_t quot;          /* quotient */
        intmax_t rem;           /* remainder */
} imaxdiv_t;

__BEGIN_DECLS
intmax_t        imaxabs(intmax_t);
imaxdiv_t       imaxdiv(intmax_t, intmax_t);
intmax_t        strtoimax(const char *, char **, int);
uintmax_t       strtoumax(const char *, char **, int);
intmax_t        wcstoimax(const __wchar_t * __restrict,
                    __wchar_t ** __restrict, int);
uintmax_t       wcstoumax(const __wchar_t * __restrict,
                    __wchar_t ** __restrict, int);
__END_DECLS

#endif /* _INTTYPES_H_ */