inttypes.h

/* Copyright (c) 2004,2005,2007 Joerg Wunsch
   Copyright (c) 2005, Carlos Lamas
   All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions are met:

   * Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.

   * Redistributions in binary form must reproduce the above copyright
     notice, this list of conditions and the following disclaimer in
     the documentation and/or other materials provided with the
     distribution.

   * Neither the name of the copyright holders nor the names of
     contributors may be used to endorse or promote products derived
     from this software without specific prior written permission.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE. */

/* $Id$ */

#ifndef __INTTYPES_H_
#define __INTTYPES_H_

#include <stdint.h>

/** \file */
/** \defgroup avr_inttypes <inttypes.h>: Integer Type conversions
    \code #include <inttypes.h> \endcode

    This header file includes the exact-width integer definitions from
    <tt><stdint.h></tt>, and extends them with additional facilities
    provided by the implementation.

    Currently, the extensions include two additional integer types
    that could hold a "far" pointer (i.e. a code pointer that can
    address more than 64 KB), as well as standard names for all printf
    and scanf formatting options that are supported by the \ref avr_stdio.
    As the library does not support the full range of conversion
    specifiers from ISO 9899:1999, only those conversions that are
    actually implemented will be listed here.

    The idea behind these conversion macros is that, for each of the
    types defined by <stdint.h>, a macro will be supplied that portably
    allows formatting an object of that type in printf() or scanf()
    operations.  Example:

    \code
    #include <inttypes.h>

    uint8_t smallval;
    int32_t longval;
    ...
    printf("The hexadecimal value of smallval is %" PRIx8
           ", the decimal value of longval is %" PRId32 ".\n",
           smallval, longval);
    \endcode
*/

/** \name Far pointers for memory access >64K */

/*@{*/
/** \ingroup avr_inttypes
    signed integer type that can hold a pointer > 64 KB */
typedef int32_t int_farptr_t;

/** \ingroup avr_inttypes
    unsigned integer type that can hold a pointer > 64 KB */
typedef uint32_t uint_farptr_t;
/*@}*/

#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS)


/** \name macros for printf and scanf format specifiers

    For C++, these are only included if __STDC_LIMIT_MACROS
    is defined before including <inttypes.h>.
 */

/*@{*/
/** \ingroup avr_inttypes
    decimal printf format for int8_t */
#define         PRId8                   "d"
/** \ingroup avr_inttypes
    decimal printf format for int_least8_t */
#define         PRIdLEAST8              "d"
/** \ingroup avr_inttypes
    decimal printf format for int_fast8_t */
#define         PRIdFAST8               "d"

/** \ingroup avr_inttypes
    integer printf format for int8_t */
#define         PRIi8                   "i"
/** \ingroup avr_inttypes
    integer printf format for int_least8_t */
#define         PRIiLEAST8              "i"
/** \ingroup avr_inttypes
    integer printf format for int_fast8_t */
#define         PRIiFAST8               "i"


/** \ingroup avr_inttypes
    decimal printf format for int16_t */
#define         PRId16                  "d"
/** \ingroup avr_inttypes
    decimal printf format for int_least16_t */
#define         PRIdLEAST16             "d"
/** \ingroup avr_inttypes
    decimal printf format for int_fast16_t */
#define         PRIdFAST16              "d"

/** \ingroup avr_inttypes
    integer printf format for int16_t */
#define         PRIi16                  "i"
/** \ingroup avr_inttypes
    integer printf format for int_least16_t */
#define         PRIiLEAST16             "i"
/** \ingroup avr_inttypes
    integer printf format for int_fast16_t */
#define         PRIiFAST16              "i"


/** \ingroup avr_inttypes
    decimal printf format for int32_t */
#define         PRId32                  "ld"
/** \ingroup avr_inttypes
    decimal printf format for int_least32_t */
#define         PRIdLEAST32             "ld"
/** \ingroup avr_inttypes
    decimal printf format for int_fast32_t */
#define         PRIdFAST32              "ld"

/** \ingroup avr_inttypes
    integer printf format for int32_t */
#define         PRIi32                  "li"
/** \ingroup avr_inttypes
    integer printf format for int_least32_t */
#define         PRIiLEAST32             "li"
/** \ingroup avr_inttypes
    integer printf format for int_fast32_t */
#define         PRIiFAST32              "li"


#ifdef __avr_libc_does_not_implement_long_long_in_printf_or_scanf

#define         PRId64                  "lld"
#define         PRIdLEAST64             "lld"
#define         PRIdFAST64              "lld"

#define         PRIi64                  "lli"
#define         PRIiLEAST64             "lli"
#define         PRIiFAST64              "lli"


#define         PRIdMAX                 "lld"
#define         PRIiMAX                 "lli"

#endif

/** \ingroup avr_inttypes
    decimal printf format for intptr_t */
#define         PRIdPTR                 PRId16
/** \ingroup avr_inttypes
    integer printf format for intptr_t */
#define         PRIiPTR                 PRIi16

/** \ingroup avr_inttypes
    octal printf format for uint8_t */
#define         PRIo8                   "o"
/** \ingroup avr_inttypes
    octal printf format for uint_least8_t */
#define         PRIoLEAST8              "o"
/** \ingroup avr_inttypes
    octal printf format for uint_fast8_t */
#define         PRIoFAST8               "o"

/** \ingroup avr_inttypes
    decimal printf format for uint8_t */
#define         PRIu8                   "u"
/** \ingroup avr_inttypes
    decimal printf format for uint_least8_t */
#define         PRIuLEAST8              "u"
/** \ingroup avr_inttypes
    decimal printf format for uint_fast8_t */
#define         PRIuFAST8               "u"

/** \ingroup avr_inttypes
    hexadecimal printf format for uint8_t */
#define         PRIx8                   "x"
/** \ingroup avr_inttypes
    hexadecimal printf format for uint_least8_t */
#define         PRIxLEAST8              "x"
/** \ingroup avr_inttypes
    hexadecimal printf format for uint_fast8_t */
#define         PRIxFAST8               "x"

/** \ingroup avr_inttypes
    uppercase hexadecimal printf format for uint8_t */
#define         PRIX8                   "X"
/** \ingroup avr_inttypes
    uppercase hexadecimal printf format for uint_least8_t */
#define         PRIXLEAST8              "X"
/** \ingroup avr_inttypes
    uppercase hexadecimal printf format for uint_fast8_t */
#define         PRIXFAST8               "X"


/** \ingroup avr_inttypes
    octal printf format for uint16_t */
#define         PRIo16                  "o"
/** \ingroup avr_inttypes
    octal printf format for uint_least16_t */
#define         PRIoLEAST16             "o"
/** \ingroup avr_inttypes
    octal printf format for uint_fast16_t */
#define         PRIoFAST16              "o"

/** \ingroup avr_inttypes
    decimal printf format for uint16_t */
#define         PRIu16                  "u"
/** \ingroup avr_inttypes
    decimal printf format for uint_least16_t */
#define         PRIuLEAST16             "u"
/** \ingroup avr_inttypes
    decimal printf format for uint_fast16_t */
#define         PRIuFAST16              "u"

/** \ingroup avr_inttypes
    hexadecimal printf format for uint16_t */
#define         PRIx16                  "x"
/** \ingroup avr_inttypes
    hexadecimal printf format for uint_least16_t */
#define         PRIxLEAST16             "x"
/** \ingroup avr_inttypes
    hexadecimal printf format for uint_fast16_t */
#define         PRIxFAST16              "x"

/** \ingroup avr_inttypes
    uppercase hexadecimal printf format for uint16_t */
#define         PRIX16                  "X"
/** \ingroup avr_inttypes
    uppercase hexadecimal printf format for uint_least16_t */
#define         PRIXLEAST16             "X"
/** \ingroup avr_inttypes
    uppercase hexadecimal printf format for uint_fast16_t */
#define         PRIXFAST16              "X"


/** \ingroup avr_inttypes
    octal printf format for uint32_t */
#define         PRIo32                  "lo"
/** \ingroup avr_inttypes
    octal printf format for uint_least32_t */
#define         PRIoLEAST32             "lo"
/** \ingroup avr_inttypes
    octal printf format for uint_fast32_t */
#define         PRIoFAST32              "lo"

/** \ingroup avr_inttypes
    decimal printf format for uint32_t */
#define         PRIu32                  "lu"
/** \ingroup avr_inttypes
    decimal printf format for uint_least32_t */
#define         PRIuLEAST32             "lu"
/** \ingroup avr_inttypes
    decimal printf format for uint_fast32_t */
#define         PRIuFAST32              "lu"

/** \ingroup avr_inttypes
    hexadecimal printf format for uint32_t */
#define         PRIx32                  "lx"
/** \ingroup avr_inttypes
    hexadecimal printf format for uint_least32_t */
#define         PRIxLEAST32             "lx"
/** \ingroup avr_inttypes
    hexadecimal printf format for uint_fast32_t */
#define         PRIxFAST32              "lx"

/** \ingroup avr_inttypes
    uppercase hexadecimal printf format for uint32_t */
#define         PRIX32                  "lX"
/** \ingroup avr_inttypes
    uppercase hexadecimal printf format for uint_least32_t */
#define         PRIXLEAST32             "lX"
/** \ingroup avr_inttypes
    uppercase hexadecimal printf format for uint_fast32_t */
#define         PRIXFAST32              "lX"


#ifdef __avr_libc_does_not_implement_long_long_in_printf_or_scanf

#define         PRIo64                  "llo"
#define         PRIoLEAST64             "llo"
#define         PRIoFAST64              "llo"

#define         PRIu64                  "llu"
#define         PRIuLEAST64             "llu"
#define         PRIuFAST64              "llu"

#define         PRIx64                  "llx"
#define         PRIxLEAST64             "llx"
#define         PRIxFAST64              "llx"

#define         PRIX64                  "llX"
#define         PRIXLEAST64             "llX"
#define         PRIXFAST64              "llX"

#define         PRIoMAX                 "llo"
#define         PRIuMAX                 "llu"
#define         PRIxMAX                 "llx"
#define         PRIXMAX                 "llX"

#endif

/** \ingroup avr_inttypes
    octal printf format for uintptr_t */
#define         PRIoPTR                 PRIo16
/** \ingroup avr_inttypes
    decimal printf format for uintptr_t */
#define         PRIuPTR                 PRIu16
/** \ingroup avr_inttypes
    hexadecimal printf format for uintptr_t */
#define         PRIxPTR                 PRIx16
/** \ingroup avr_inttypes
    uppercase hexadecimal printf format for uintptr_t */
#define         PRIXPTR                 PRIX16


#ifdef __avr_libc_does_not_implement_hh_in_scanf

#define         SCNd8                   "hhd"
#define         SCNdLEAST8              "hhd"
#define         SCNdFAST8               "hhd"

#define         SCNi8                   "hhi"
#define         SCNiLEAST8              "hhi"
#define         SCNiFAST8               "hhi"

#endif


/** \ingroup avr_inttypes
    decimal scanf format for int16_t */
#define         SCNd16                  "d"
/** \ingroup avr_inttypes
    decimal scanf format for int_least16_t */
#define         SCNdLEAST16             "d"
/** \ingroup avr_inttypes
    decimal scanf format for int_fast16_t */
#define         SCNdFAST16              "d"

/** \ingroup avr_inttypes
    generic-integer scanf format for int16_t */
#define         SCNi16                  "i"
/** \ingroup avr_inttypes
    generic-integer scanf format for int_least16_t */
#define         SCNiLEAST16             "i"
/** \ingroup avr_inttypes
    generic-integer scanf format for int_fast16_t */
#define         SCNiFAST16              "i"


/** \ingroup avr_inttypes
    decimal scanf format for int32_t */
#define         SCNd32                  "ld"
/** \ingroup avr_inttypes
    decimal scanf format for int_least32_t */
#define         SCNdLEAST32             "ld"
/** \ingroup avr_inttypes
    decimal scanf format for int_fast32_t */
#define         SCNdFAST32              "ld"

/** \ingroup avr_inttypes
    generic-integer scanf format for int32_t */
#define         SCNi32                  "li"
/** \ingroup avr_inttypes
    generic-integer scanf format for int_least32_t */
#define         SCNiLEAST32             "li"
/** \ingroup avr_inttypes
    generic-integer scanf format for int_fast32_t */
#define         SCNiFAST32              "li"


#ifdef __avr_libc_does_not_implement_long_long_in_printf_or_scanf

#define         SCNd64                  "lld"
#define         SCNdLEAST64             "lld"
#define         SCNdFAST64              "lld"

#define         SCNi64                  "lli"
#define         SCNiLEAST64             "lli"
#define         SCNiFAST64              "lli"

#define         SCNdMAX                 "lld"
#define         SCNiMAX                 "lli"

#endif

/** \ingroup avr_inttypes
    decimal scanf format for intptr_t */
#define         SCNdPTR                 SCNd16
/** \ingroup avr_inttypes
    generic-integer scanf format for intptr_t */
#define         SCNiPTR                 SCNi16

#ifdef __avr_libc_does_not_implement_hh_in_scanf

#define         SCNo8                   "hho"
#define         SCNoLEAST8              "hho"
#define         SCNoFAST8               "hho"

#define         SCNu8                   "hhu"
#define         SCNuLEAST8              "hhu"
#define         SCNuFAST8               "hhu"

#define         SCNx8                   "hhx"
#define         SCNxLEAST8              "hhx"
#define         SCNxFAST8               "hhx"

#endif

/** \ingroup avr_inttypes
    octal scanf format for uint16_t */
#define         SCNo16                  "o"
/** \ingroup avr_inttypes
    octal scanf format for uint_least16_t */
#define         SCNoLEAST16             "o"
/** \ingroup avr_inttypes
    octal scanf format for uint_fast16_t */
#define         SCNoFAST16              "o"

/** \ingroup avr_inttypes
    decimal scanf format for uint16_t */
#define         SCNu16                  "u"
/** \ingroup avr_inttypes
    decimal scanf format for uint_least16_t */
#define         SCNuLEAST16             "u"
/** \ingroup avr_inttypes
    decimal scanf format for uint_fast16_t */
#define         SCNuFAST16              "u"

/** \ingroup avr_inttypes
    hexadecimal scanf format for uint16_t */
#define         SCNx16                  "x"
/** \ingroup avr_inttypes
    hexadecimal scanf format for uint_least16_t */
#define         SCNxLEAST16             "x"
/** \ingroup avr_inttypes
    hexadecimal scanf format for uint_fast16_t */
#define         SCNxFAST16              "x"


/** \ingroup avr_inttypes
    octal scanf format for uint32_t */
#define         SCNo32                  "lo"
/** \ingroup avr_inttypes
    octal scanf format for uint_least32_t */
#define         SCNoLEAST32             "lo"
/** \ingroup avr_inttypes
    octal scanf format for uint_fast32_t */
#define         SCNoFAST32              "lo"

/** \ingroup avr_inttypes
    decimal scanf format for uint32_t */
#define         SCNu32                  "lu"
/** \ingroup avr_inttypes
    decimal scanf format for uint_least32_t */
#define         SCNuLEAST32             "lu"
/** \ingroup avr_inttypes
    decimal scanf format for uint_fast32_t */
#define         SCNuFAST32              "lu"

/** \ingroup avr_inttypes
    hexadecimal scanf format for uint32_t */
#define         SCNx32                  "lx"
/** \ingroup avr_inttypes
    hexadecimal scanf format for uint_least32_t */
#define         SCNxLEAST32             "lx"
/** \ingroup avr_inttypes
    hexadecimal scanf format for uint_fast32_t */
#define         SCNxFAST32              "lx"


#ifdef __avr_libc_does_not_implement_long_long_in_printf_or_scanf

#define         SCNo64                  "llo"
#define         SCNoLEAST64             "llo"
#define         SCNoFAST64              "llo"

#define         SCNu64                  "llu"
#define         SCNuLEAST64             "llu"
#define         SCNuFAST64              "llu"

#define         SCNx64                  "llx"
#define         SCNxLEAST64             "llx"
#define         SCNxFAST64              "llx"

#define         SCNoMAX                 "llo"
#define         SCNuMAX                 "llu"
#define         SCNxMAX                 "llx"

#endif

/** \ingroup avr_inttypes
    octal scanf format for uintptr_t */
#define         SCNoPTR                 SCNo16
/** \ingroup avr_inttypes
    decimal scanf format for uintptr_t */
#define         SCNuPTR                 SCNu16
/** \ingroup avr_inttypes
    hexadecimal scanf format for uintptr_t */
#define         SCNxPTR                 SCNx16

/*@}*/


#endif  /* !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) */


#endif /* __INTTYPES_H_ */