/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2014 Garrett D'Amore <garrett@damore.org>
 *
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_INT_FMTIO_H
#define	_SYS_INT_FMTIO_H

/*
 * This file, <sys/int_fmtio.h>, is part of the Sun Microsystems implementation
 * of <inttypes.h> as defined by the ISO C Standard, ISO/IEC 9899:1999
 * Programming language - C.
 *
 * ISO  International Organization for Standardization.
 *
 * Programs/Modules should not directly include this file.  Access to the
 * types defined in this file should be through the inclusion of one of the
 * following files:
 *
 *	<sys/inttypes.h>	Provides the Kernel and Driver appropriate
 *				components of <inttypes.h>.
 *
 *	<inttypes.h>		For use by applications.
 *
 * See these files for more details.
 */

#include <sys/feature_tests.h>

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Formatted I/O
 *
 * The following macros can be used even when an implementation has not
 * extended the printf/scanf family of functions.
 *
 * The form of the names of the macros is either "PRI" for printf specifiers
 * or "SCN" for scanf specifiers, followed by the conversion specifier letter
 * followed by the datatype size. For example, PRId32 is the macro for
 * the printf d conversion specifier with the flags for 32 bit datatype.
 *
 * An example using one of these macros:
 *
 *	uint64_t u;
 *	printf("u = %016" PRIx64 "\n", u);
 *
 * For the purpose of example, the definitions of the printf/scanf macros
 * below have the values appropriate for a machine with 8 bit shorts, 16
 * bit shorts, 32 bit ints, 32 or 64 bit longs depending on compilation
 * mode, and 64 bit long longs.
 */

/*
 * fprintf macros for signed integers
 */
#if defined(_KERNEL)
#define	_MODF8	""
#define	_MODF16	""
#else
#define	_MODF8	"hh"
#define	_MODF16	"h"
#endif

#define	_PRId	"d"
#define	_PRIi	"i"
#define	_PRIo	"o"
#define	_PRIu	"u"
#define	_PRIx	"x"
#define	_PRIX	"X"

#define	PRId8			_MODF8 _PRId
#define	PRIdLEAST8		PRId8
#define	PRIdFAST8		PRId8
#define	PRId16			_MODF16 _PRId
#define	PRIdLEAST16		PRId16
#define	PRId32			"d"
#define	PRIdFAST16		PRId32
#define	PRIdLEAST32		PRId32
#define	PRIdFAST32		PRId32
#ifdef  _LP64
#define	PRId64			"ld"
#else   /* _ILP32 */
#if defined(_LONGLONG_TYPE)
#define	PRId64			"lld"
#endif
#endif
#ifdef PRId64
#define	PRIdLEAST64		PRId64
#define	PRIdFAST64		PRId64
#endif

#define	PRIi8			_MODF8 _PRIi
#define	PRIiLEAST8		PRIi8
#define	PRIiFAST8		PRIi8
#define	PRIi16			_MODF16 _PRIi
#define	PRIiLEAST16		PRIi16
#define	PRIi32			"i"
#define	PRIiFAST16		PRIi32
#define	PRIiLEAST32		PRIi32
#define	PRIiFAST32		PRIi32
#ifdef  _LP64
#define	PRIi64			"li"
#else   /* _ILP32 */
#if defined(_LONGLONG_TYPE)
#define	PRIi64			"lli"
#endif
#endif
#ifdef PRIi64
#define	PRIiLEAST64		PRIi64
#define	PRIiFAST64		PRIi64
#endif

/*
 * fprintf macros for unsigned integers
 */

#define	PRIo8			_MODF8 _PRIo
#define	PRIoLEAST8		PRIo8
#define	PRIoFAST8		PRIo8
#define	PRIo16			_MODF16 _PRIo
#define	PRIoLEAST16		PRIo16
#define	PRIo32			"o"
#define	PRIoFAST16		PRIo32
#define	PRIoLEAST32		PRIo32
#define	PRIoFAST32		PRIo32
#ifdef  _LP64
#define	PRIo64			"lo"
#else	/* _ILP32 */
#if defined(_LONGLONG_TYPE)
#define	PRIo64			"llo"
#endif
#endif
#ifdef PRIo64
#define	PRIoLEAST64		PRIo64
#define	PRIoFAST64		PRIo64
#endif

#define	PRIu8			_MODF8 _PRIu
#define	PRIuLEAST8		PRIu8
#define	PRIuFAST8		PRIu8
#define	PRIu16			_MODF16 _PRIu
#define	PRIuLEAST16		PRIu16
#define	PRIu32			"u"
#define	PRIuFAST16		PRIu32
#define	PRIuLEAST32		PRIu32
#define	PRIuFAST32		PRIu32
#ifdef  _LP64
#define	PRIu64			"lu"
#else   /* _ILP32 */
#if defined(_LONGLONG_TYPE)
#define	PRIu64			"llu"
#endif
#endif
#ifdef PRIu64
#define	PRIuLEAST64		PRIu64
#define	PRIuFAST64		PRIu64
#endif

#define	PRIx8			_MODF8 _PRIx
#define	PRIxLEAST8		PRIx8
#define	PRIxFAST8		PRIx8
#define	PRIx16			_MODF16 _PRIx
#define	PRIxLEAST16		PRIx16
#define	PRIx32			"x"
#define	PRIxFAST16		PRIx32
#define	PRIxLEAST32		PRIx32
#define	PRIxFAST32		PRIx32
#ifdef  _LP64
#define	PRIx64			"lx"
#else   /* _ILP32 */
#if defined(_LONGLONG_TYPE)
#define	PRIx64			"llx"
#endif
#endif
#ifdef PRIx64
#define	PRIxLEAST64		PRIx64
#define	PRIxFAST64		PRIx64
#endif

#define	PRIX8			_MODF8 _PRIX
#define	PRIXLEAST8		PRIX8
#define	PRIXFAST8		PRIX8
#define	PRIX16			_MODF16 _PRIX
#define	PRIXLEAST16		PRIX16
#define	PRIX32			"X"
#define	PRIXFAST16		PRIX32
#define	PRIXLEAST32		PRIX32
#define	PRIXFAST32		PRIX32
#ifdef  _LP64
#define	PRIX64			"lX"
#else   /* _ILP32 */
#if defined(_LONGLONG_TYPE)
#define	PRIX64			"llX"
#endif
#endif
#ifdef PRIX64
#define	PRIXLEAST64		PRIX64
#define	PRIXFAST64		PRIX64
#endif

/*
 * fprintf macros for pointers
 */

#if defined(_LP64) || defined(_I32LPx)
#define	PRIdPTR			"ld"
#define	PRIiPTR			"li"
#define	PRIoPTR			"lo"
#define	PRIuPTR			"lu"
#define	PRIxPTR			"lx"
#define	PRIXPTR			"lX"
#else
#define	PRIdPTR			"d"
#define	PRIiPTR			"i"
#define	PRIoPTR			"o"
#define	PRIuPTR			"u"
#define	PRIxPTR			"x"
#define	PRIXPTR			"X"
#endif /* defined(_LP64) || defined(_I32LPx) */

/*
 * fscanf macros for signed integers
 */
#define	SCNd8			"hhd"
#define	SCNdLEAST8		SCNd8
#define	SCNdFAST8		SCNd8
#define	SCNd16			"hd"
#define	SCNdLEAST16		SCNd16
#define	SCNd32			"d"
#define	SCNdFAST16		SCNd32
#define	SCNdLEAST32		SCNd32
#define	SCNdFAST32		SCNd32
#ifdef PRId64
#define	SCNd64			PRId64
#define	SCNdLEAST64		PRId64
#define	SCNdFAST64		PRId64
#endif
#define	SCNdPTR			PRIdPTR

#define	SCNi8			"hhi"
#define	SCNiLEAST8		SCNi8
#define	SCNiFAST8		SCNi8
#define	SCNi16			"hi"
#define	SCNiLEAST16		SCNi16
#define	SCNi32			"i"
#define	SCNiFAST16		SCNi32
#define	SCNiLEAST32		SCNi32
#define	SCNiFAST32		SCNi32
#ifdef PRIi64
#define	SCNi64			PRIi64
#define	SCNiLEAST64		PRIi64
#define	SCNiFAST64		PRIi64
#endif
#define	SCNiPTR			PRIiPTR

/*
 * fscanf macros for unsigned integers
 */
#define	SCNo8			"hho"
#define	SCNoLEAST8		SCNo8
#define	SCNoFAST8		SCNo8
#define	SCNo16			"ho"
#define	SCNoLEAST16		SCNo16
#define	SCNo32			"o"
#define	SCNoFAST16		SCNo32
#define	SCNoLEAST32		SCNo32
#define	SCNoFAST32		SCNo32
#ifdef PRIo64
#define	SCNo64			PRIo64
#define	SCNoLEAST64		PRIo64
#define	SCNoFAST64		PRIo64
#endif
#define	SCNoPTR			PRIoPTR

#define	SCNu8			"hhu"
#define	SCNuLEAST8		SCNu8
#define	SCNuFAST8		SCNu8
#define	SCNu16			"hu"
#define	SCNuLEAST16		SCNu16
#define	SCNu32			"u"
#define	SCNuFAST16		SCNu32
#define	SCNuLEAST32		SCNu32
#define	SCNuFAST32		SCNu32
#ifdef PRIu64
#define	SCNu64			PRIu64
#define	SCNuLEAST64		PRIu64
#define	SCNuFAST64		PRIu64
#endif
#define	SCNuPTR			PRIuPTR

#define	SCNx8			"hhx"
#define	SCNxLEAST8		SCNx8
#define	SCNxFAST8		SCNx8
#define	SCNx16			"hx"
#define	SCNxLEAST16		SCNx16
#define	SCNx32			"x"
#define	SCNxFAST16		SCNx32
#define	SCNxLEAST32		SCNx32
#define	SCNxFAST32		SCNx32
#ifdef PRIx64
#define	SCNx64			PRIx64
#define	SCNxLEAST64		PRIx64
#define	SCNxFAST64		PRIx64
#endif
#define	SCNxPTR			PRIxPTR

#define	SCNX8			"hhX"
#define	SCNXLEAST8		SCNX8
#define	SCNXFAST8		SCNX8
#define	SCNX16			"hX"
#define	SCNXLEAST16		SCNX16
#define	SCNX32			"X"
#define	SCNXFAST16		SCNX32
#define	SCNXLEAST32		SCNX32
#define	SCNXFAST32		SCNX32
#ifdef PRIX64
#define	SCNX64			PRIX64
#define	SCNXLEAST64		PRIX64
#define	SCNXFAST64		PRIX64
#endif
#define	SCNXPTR			PRIXPTR

/*
 * The following macros define I/O formats for intmax_t and uintmax_t.
 */
#if !defined(_LP64) && defined(_LONGLONG_TYPE)
#define	PRIdMAX			"lld"
#define	PRIiMAX			"lli"
#define	PRIoMAX			"llo"
#define	PRIxMAX			"llx"
#define	PRIuMAX			"llu"
#define	PRIXMAX			"llX"
#else
#define	PRIdMAX			"ld"
#define	PRIiMAX			"li"
#define	PRIoMAX			"lo"
#define	PRIxMAX			"lx"
#define	PRIuMAX			"lu"
#define	PRIXMAX			"lX"
#endif	/* !defined(_LP64) && defined(_LONGLONG_TYPE) */

#define	SCNdMAX			PRIdMAX
#define	SCNiMAX			PRIiMAX
#define	SCNoMAX			PRIoMAX
#define	SCNxMAX			PRIxMAX
#define	SCNuMAX			PRIuMAX
#define	SCNXMAX			PRIXMAX

/*
 * Non-standard formatters and scanners, which are protected namespace-wise
 * lest they become standard.  There are few good reasons to add to these,
 * luckily.
 *
 * We define the full suite of formats per type, even in cases where that's
 * not exactly useful.
 */
#if !defined(_STRICT_SYMBOLS)

/*
 * The following macros define I/O formats for id_t, which is always 32bit but
 * for historical reasons a real pain to format.
 */
#if !defined(_LP64)
#define	_PRIdID			"ld"
#define	_PRIiID			"li"
#define	_PRIoID			"lo"
#define	_PRIxID			"lx"
#define	_PRIuID			"lu"
#define	_PRIXID			"lX"
#else
#define	_PRIdID			"d"
#define	_PRIiID			"i"
#define	_PRIoID			"o"
#define	_PRIxID			"x"
#define	_PRIuID			"u"
#define	_PRIXID			"X"
#endif

#define	_SCNdID			_PRIdID
#define	_SCNiID			_PRIiID
#define	_SCNoID			_PRIoID
#define	_SCNxID			_PRIxID
#define	_SCNuID			_PRIuID
#define	_SCNXID			_PRIXID

/*
 * The following are set up for the wint_t and wchar_t which have the same
 * general problem. They have the same types as above, but we use unique macros
 * to help readers.
 */
#define	_PRIdWC			_PRIdID
#define	_PRIiWC			_PRIiID
#define	_PRIoWC			_PRIoID
#define	_PRIxWC			_PRIxID
#define	_PRIuWC			_PRIuID
#define	_PRIXWC			_PRIXID
#define	_SCNdWC			_PRIdID
#define	_SCNiWC			_PRIiID
#define	_SCNoWC			_PRIoID
#define	_SCNxWC			_PRIxID
#define	_SCNuWC			_PRIuID
#define	_SCNXWC			_PRIXID


#endif	/* _STRICT_SYMBOLS */

#ifdef __cplusplus
}
#endif

#endif /* _SYS_INT_FMTIO_H */