universe@102: // ISO C9x compliant inttypes.h for Microsoft Visual Studio universe@102: // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 universe@102: // universe@102: // Copyright (c) 2006 Alexander Chemeris universe@102: // universe@102: // Redistribution and use in source and binary forms, with or without universe@102: // modification, are permitted provided that the following conditions are met: universe@102: // universe@102: // 1. Redistributions of source code must retain the above copyright notice, universe@102: // this list of conditions and the following disclaimer. universe@102: // universe@102: // 2. Redistributions in binary form must reproduce the above copyright universe@102: // notice, this list of conditions and the following disclaimer in the universe@102: // documentation and/or other materials provided with the distribution. universe@102: // universe@102: // 3. The name of the author may be used to endorse or promote products universe@102: // derived from this software without specific prior written permission. universe@102: // universe@102: // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED universe@102: // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF universe@102: // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO universe@102: // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, universe@102: // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, universe@102: // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; universe@102: // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, universe@102: // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR universe@102: // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF universe@102: // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. universe@102: // universe@102: /////////////////////////////////////////////////////////////////////////////// universe@102: universe@102: #ifndef _MSC_VER // [ universe@102: #error "Use this header only with Microsoft Visual C++ compilers!" universe@102: #endif // _MSC_VER ] universe@102: universe@102: #ifndef _MSC_INTTYPES_H_ // [ universe@102: #define _MSC_INTTYPES_H_ universe@102: universe@102: #if _MSC_VER > 1000 universe@102: #pragma once universe@102: #endif universe@102: universe@102: #include "stdint.h" universe@102: universe@102: // 7.8 Format conversion of integer types universe@102: universe@102: typedef struct { universe@102: intmax_t quot; universe@102: intmax_t rem; universe@102: } imaxdiv_t; universe@102: universe@102: // 7.8.1 Macros for format specifiers universe@102: universe@102: #if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 universe@102: universe@102: // The fprintf macros for signed integers are: universe@102: #define PRId8 "d" universe@102: #define PRIi8 "i" universe@102: #define PRIdLEAST8 "d" universe@102: #define PRIiLEAST8 "i" universe@102: #define PRIdFAST8 "d" universe@102: #define PRIiFAST8 "i" universe@102: universe@102: #define PRId16 "hd" universe@102: #define PRIi16 "hi" universe@102: #define PRIdLEAST16 "hd" universe@102: #define PRIiLEAST16 "hi" universe@102: #define PRIdFAST16 "hd" universe@102: #define PRIiFAST16 "hi" universe@102: universe@102: #define PRId32 "I32d" universe@102: #define PRIi32 "I32i" universe@102: #define PRIdLEAST32 "I32d" universe@102: #define PRIiLEAST32 "I32i" universe@102: #define PRIdFAST32 "I32d" universe@102: #define PRIiFAST32 "I32i" universe@102: universe@102: #define PRId64 "I64d" universe@102: #define PRIi64 "I64i" universe@102: #define PRIdLEAST64 "I64d" universe@102: #define PRIiLEAST64 "I64i" universe@102: #define PRIdFAST64 "I64d" universe@102: #define PRIiFAST64 "I64i" universe@102: universe@102: #define PRIdMAX "I64d" universe@102: #define PRIiMAX "I64i" universe@102: universe@102: #define PRIdPTR "Id" universe@102: #define PRIiPTR "Ii" universe@102: universe@102: // The fprintf macros for unsigned integers are: universe@102: #define PRIo8 "o" universe@102: #define PRIu8 "u" universe@102: #define PRIx8 "x" universe@102: #define PRIX8 "X" universe@102: #define PRIoLEAST8 "o" universe@102: #define PRIuLEAST8 "u" universe@102: #define PRIxLEAST8 "x" universe@102: #define PRIXLEAST8 "X" universe@102: #define PRIoFAST8 "o" universe@102: #define PRIuFAST8 "u" universe@102: #define PRIxFAST8 "x" universe@102: #define PRIXFAST8 "X" universe@102: universe@102: #define PRIo16 "ho" universe@102: #define PRIu16 "hu" universe@102: #define PRIx16 "hx" universe@102: #define PRIX16 "hX" universe@102: #define PRIoLEAST16 "ho" universe@102: #define PRIuLEAST16 "hu" universe@102: #define PRIxLEAST16 "hx" universe@102: #define PRIXLEAST16 "hX" universe@102: #define PRIoFAST16 "ho" universe@102: #define PRIuFAST16 "hu" universe@102: #define PRIxFAST16 "hx" universe@102: #define PRIXFAST16 "hX" universe@102: universe@102: #define PRIo32 "I32o" universe@102: #define PRIu32 "I32u" universe@102: #define PRIx32 "I32x" universe@102: #define PRIX32 "I32X" universe@102: #define PRIoLEAST32 "I32o" universe@102: #define PRIuLEAST32 "I32u" universe@102: #define PRIxLEAST32 "I32x" universe@102: #define PRIXLEAST32 "I32X" universe@102: #define PRIoFAST32 "I32o" universe@102: #define PRIuFAST32 "I32u" universe@102: #define PRIxFAST32 "I32x" universe@102: #define PRIXFAST32 "I32X" universe@102: universe@102: #define PRIo64 "I64o" universe@102: #define PRIu64 "I64u" universe@102: #define PRIx64 "I64x" universe@102: #define PRIX64 "I64X" universe@102: #define PRIoLEAST64 "I64o" universe@102: #define PRIuLEAST64 "I64u" universe@102: #define PRIxLEAST64 "I64x" universe@102: #define PRIXLEAST64 "I64X" universe@102: #define PRIoFAST64 "I64o" universe@102: #define PRIuFAST64 "I64u" universe@102: #define PRIxFAST64 "I64x" universe@102: #define PRIXFAST64 "I64X" universe@102: universe@102: #define PRIoMAX "I64o" universe@102: #define PRIuMAX "I64u" universe@102: #define PRIxMAX "I64x" universe@102: #define PRIXMAX "I64X" universe@102: universe@102: #define PRIoPTR "Io" universe@102: #define PRIuPTR "Iu" universe@102: #define PRIxPTR "Ix" universe@102: #define PRIXPTR "IX" universe@102: universe@102: // The fscanf macros for signed integers are: universe@102: #define SCNd8 "d" universe@102: #define SCNi8 "i" universe@102: #define SCNdLEAST8 "d" universe@102: #define SCNiLEAST8 "i" universe@102: #define SCNdFAST8 "d" universe@102: #define SCNiFAST8 "i" universe@102: universe@102: #define SCNd16 "hd" universe@102: #define SCNi16 "hi" universe@102: #define SCNdLEAST16 "hd" universe@102: #define SCNiLEAST16 "hi" universe@102: #define SCNdFAST16 "hd" universe@102: #define SCNiFAST16 "hi" universe@102: universe@102: #define SCNd32 "ld" universe@102: #define SCNi32 "li" universe@102: #define SCNdLEAST32 "ld" universe@102: #define SCNiLEAST32 "li" universe@102: #define SCNdFAST32 "ld" universe@102: #define SCNiFAST32 "li" universe@102: universe@102: #define SCNd64 "I64d" universe@102: #define SCNi64 "I64i" universe@102: #define SCNdLEAST64 "I64d" universe@102: #define SCNiLEAST64 "I64i" universe@102: #define SCNdFAST64 "I64d" universe@102: #define SCNiFAST64 "I64i" universe@102: universe@102: #define SCNdMAX "I64d" universe@102: #define SCNiMAX "I64i" universe@102: universe@102: #ifdef _WIN64 // [ universe@102: # define SCNdPTR "I64d" universe@102: # define SCNiPTR "I64i" universe@102: #else // _WIN64 ][ universe@102: # define SCNdPTR "ld" universe@102: # define SCNiPTR "li" universe@102: #endif // _WIN64 ] universe@102: universe@102: // The fscanf macros for unsigned integers are: universe@102: #define SCNo8 "o" universe@102: #define SCNu8 "u" universe@102: #define SCNx8 "x" universe@102: #define SCNX8 "X" universe@102: #define SCNoLEAST8 "o" universe@102: #define SCNuLEAST8 "u" universe@102: #define SCNxLEAST8 "x" universe@102: #define SCNXLEAST8 "X" universe@102: #define SCNoFAST8 "o" universe@102: #define SCNuFAST8 "u" universe@102: #define SCNxFAST8 "x" universe@102: #define SCNXFAST8 "X" universe@102: universe@102: #define SCNo16 "ho" universe@102: #define SCNu16 "hu" universe@102: #define SCNx16 "hx" universe@102: #define SCNX16 "hX" universe@102: #define SCNoLEAST16 "ho" universe@102: #define SCNuLEAST16 "hu" universe@102: #define SCNxLEAST16 "hx" universe@102: #define SCNXLEAST16 "hX" universe@102: #define SCNoFAST16 "ho" universe@102: #define SCNuFAST16 "hu" universe@102: #define SCNxFAST16 "hx" universe@102: #define SCNXFAST16 "hX" universe@102: universe@102: #define SCNo32 "lo" universe@102: #define SCNu32 "lu" universe@102: #define SCNx32 "lx" universe@102: #define SCNX32 "lX" universe@102: #define SCNoLEAST32 "lo" universe@102: #define SCNuLEAST32 "lu" universe@102: #define SCNxLEAST32 "lx" universe@102: #define SCNXLEAST32 "lX" universe@102: #define SCNoFAST32 "lo" universe@102: #define SCNuFAST32 "lu" universe@102: #define SCNxFAST32 "lx" universe@102: #define SCNXFAST32 "lX" universe@102: universe@102: #define SCNo64 "I64o" universe@102: #define SCNu64 "I64u" universe@102: #define SCNx64 "I64x" universe@102: #define SCNX64 "I64X" universe@102: #define SCNoLEAST64 "I64o" universe@102: #define SCNuLEAST64 "I64u" universe@102: #define SCNxLEAST64 "I64x" universe@102: #define SCNXLEAST64 "I64X" universe@102: #define SCNoFAST64 "I64o" universe@102: #define SCNuFAST64 "I64u" universe@102: #define SCNxFAST64 "I64x" universe@102: #define SCNXFAST64 "I64X" universe@102: universe@102: #define SCNoMAX "I64o" universe@102: #define SCNuMAX "I64u" universe@102: #define SCNxMAX "I64x" universe@102: #define SCNXMAX "I64X" universe@102: universe@102: #ifdef _WIN64 // [ universe@102: # define SCNoPTR "I64o" universe@102: # define SCNuPTR "I64u" universe@102: # define SCNxPTR "I64x" universe@102: # define SCNXPTR "I64X" universe@102: #else // _WIN64 ][ universe@102: # define SCNoPTR "lo" universe@102: # define SCNuPTR "lu" universe@102: # define SCNxPTR "lx" universe@102: # define SCNXPTR "lX" universe@102: #endif // _WIN64 ] universe@102: universe@102: #endif // __STDC_FORMAT_MACROS ] universe@102: universe@102: // 7.8.2 Functions for greatest-width integer types universe@102: universe@102: // 7.8.2.1 The imaxabs function universe@102: #define imaxabs _abs64 universe@102: universe@102: // 7.8.2.2 The imaxdiv function universe@102: universe@102: // This is modified version of div() function from Microsoft's div.c found universe@102: // in %MSVC.NET%\crt\src\div.c universe@102: #ifdef STATIC_IMAXDIV // [ universe@102: static universe@102: #else // STATIC_IMAXDIV ][ universe@102: _inline universe@102: #endif // STATIC_IMAXDIV ] universe@102: imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) universe@102: { universe@102: imaxdiv_t result; universe@102: universe@102: result.quot = numer / denom; universe@102: result.rem = numer % denom; universe@102: universe@102: if (numer < 0 && result.rem > 0) { universe@102: // did division wrong; must fix up universe@102: ++result.quot; universe@102: result.rem -= denom; universe@102: } universe@102: universe@102: return result; universe@102: } universe@102: universe@102: // 7.8.2.3 The strtoimax and strtoumax functions universe@102: #define strtoimax _strtoi64 universe@102: #define strtoumax _strtoui64 universe@102: universe@102: // 7.8.2.4 The wcstoimax and wcstoumax functions universe@102: #define wcstoimax _wcstoi64 universe@102: #define wcstoumax _wcstoui64 universe@102: universe@102: universe@102: #endif // _MSC_INTTYPES_H_ ]