1 // ISO C9x compliant inttypes.h for Microsoft Visual Studio 2 // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 3 // 4 // Copyright (c) 2006 Alexander Chemeris 5 // 6 // Redistribution and use in source and binary forms, with or without 7 // modification, are permitted provided that the following conditions are met: 8 // 9 // 1. Redistributions of source code must retain the above copyright notice, 10 // this list of conditions and the following disclaimer. 11 // 12 // 2. Redistributions in binary form must reproduce the above copyright 13 // notice, this list of conditions and the following disclaimer in the 14 // documentation and/or other materials provided with the distribution. 15 // 16 // 3. The name of the author may be used to endorse or promote products 17 // derived from this software without specific prior written permission. 18 // 19 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 20 // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 21 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 22 // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 25 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 27 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 28 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 // 30 /////////////////////////////////////////////////////////////////////////////// 31 32 #ifndef _MSC_VER // [ 33 #error "Use this header only with Microsoft Visual C++ compilers!" 34 #endif // _MSC_VER ] 35 36 #ifndef _MSC_INTTYPES_H_ // [ 37 #define _MSC_INTTYPES_H_ 38 39 #if _MSC_VER > 1000 40 #pragma once 41 #endif 42 43 #include "stdint.h" 44 45 // 7.8 Format conversion of integer types 46 47 typedef struct { 48 intmax_t quot; 49 intmax_t rem; 50 } imaxdiv_t; 51 52 // 7.8.1 Macros for format specifiers 53 54 #if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 55 56 // The fprintf macros for signed integers are: 57 #define PRId8 "d" 58 #define PRIi8 "i" 59 #define PRIdLEAST8 "d" 60 #define PRIiLEAST8 "i" 61 #define PRIdFAST8 "d" 62 #define PRIiFAST8 "i" 63 64 #define PRId16 "hd" 65 #define PRIi16 "hi" 66 #define PRIdLEAST16 "hd" 67 #define PRIiLEAST16 "hi" 68 #define PRIdFAST16 "hd" 69 #define PRIiFAST16 "hi" 70 71 #define PRId32 "I32d" 72 #define PRIi32 "I32i" 73 #define PRIdLEAST32 "I32d" 74 #define PRIiLEAST32 "I32i" 75 #define PRIdFAST32 "I32d" 76 #define PRIiFAST32 "I32i" 77 78 #define PRId64 "I64d" 79 #define PRIi64 "I64i" 80 #define PRIdLEAST64 "I64d" 81 #define PRIiLEAST64 "I64i" 82 #define PRIdFAST64 "I64d" 83 #define PRIiFAST64 "I64i" 84 85 #define PRIdMAX "I64d" 86 #define PRIiMAX "I64i" 87 88 #define PRIdPTR "Id" 89 #define PRIiPTR "Ii" 90 91 // The fprintf macros for unsigned integers are: 92 #define PRIo8 "o" 93 #define PRIu8 "u" 94 #define PRIx8 "x" 95 #define PRIX8 "X" 96 #define PRIoLEAST8 "o" 97 #define PRIuLEAST8 "u" 98 #define PRIxLEAST8 "x" 99 #define PRIXLEAST8 "X" 100 #define PRIoFAST8 "o" 101 #define PRIuFAST8 "u" 102 #define PRIxFAST8 "x" 103 #define PRIXFAST8 "X" 104 105 #define PRIo16 "ho" 106 #define PRIu16 "hu" 107 #define PRIx16 "hx" 108 #define PRIX16 "hX" 109 #define PRIoLEAST16 "ho" 110 #define PRIuLEAST16 "hu" 111 #define PRIxLEAST16 "hx" 112 #define PRIXLEAST16 "hX" 113 #define PRIoFAST16 "ho" 114 #define PRIuFAST16 "hu" 115 #define PRIxFAST16 "hx" 116 #define PRIXFAST16 "hX" 117 118 #define PRIo32 "I32o" 119 #define PRIu32 "I32u" 120 #define PRIx32 "I32x" 121 #define PRIX32 "I32X" 122 #define PRIoLEAST32 "I32o" 123 #define PRIuLEAST32 "I32u" 124 #define PRIxLEAST32 "I32x" 125 #define PRIXLEAST32 "I32X" 126 #define PRIoFAST32 "I32o" 127 #define PRIuFAST32 "I32u" 128 #define PRIxFAST32 "I32x" 129 #define PRIXFAST32 "I32X" 130 131 #define PRIo64 "I64o" 132 #define PRIu64 "I64u" 133 #define PRIx64 "I64x" 134 #define PRIX64 "I64X" 135 #define PRIoLEAST64 "I64o" 136 #define PRIuLEAST64 "I64u" 137 #define PRIxLEAST64 "I64x" 138 #define PRIXLEAST64 "I64X" 139 #define PRIoFAST64 "I64o" 140 #define PRIuFAST64 "I64u" 141 #define PRIxFAST64 "I64x" 142 #define PRIXFAST64 "I64X" 143 144 #define PRIoMAX "I64o" 145 #define PRIuMAX "I64u" 146 #define PRIxMAX "I64x" 147 #define PRIXMAX "I64X" 148 149 #define PRIoPTR "Io" 150 #define PRIuPTR "Iu" 151 #define PRIxPTR "Ix" 152 #define PRIXPTR "IX" 153 154 // The fscanf macros for signed integers are: 155 #define SCNd8 "d" 156 #define SCNi8 "i" 157 #define SCNdLEAST8 "d" 158 #define SCNiLEAST8 "i" 159 #define SCNdFAST8 "d" 160 #define SCNiFAST8 "i" 161 162 #define SCNd16 "hd" 163 #define SCNi16 "hi" 164 #define SCNdLEAST16 "hd" 165 #define SCNiLEAST16 "hi" 166 #define SCNdFAST16 "hd" 167 #define SCNiFAST16 "hi" 168 169 #define SCNd32 "ld" 170 #define SCNi32 "li" 171 #define SCNdLEAST32 "ld" 172 #define SCNiLEAST32 "li" 173 #define SCNdFAST32 "ld" 174 #define SCNiFAST32 "li" 175 176 #define SCNd64 "I64d" 177 #define SCNi64 "I64i" 178 #define SCNdLEAST64 "I64d" 179 #define SCNiLEAST64 "I64i" 180 #define SCNdFAST64 "I64d" 181 #define SCNiFAST64 "I64i" 182 183 #define SCNdMAX "I64d" 184 #define SCNiMAX "I64i" 185 186 #ifdef _WIN64 // [ 187 # define SCNdPTR "I64d" 188 # define SCNiPTR "I64i" 189 #else // _WIN64 ][ 190 # define SCNdPTR "ld" 191 # define SCNiPTR "li" 192 #endif // _WIN64 ] 193 194 // The fscanf macros for unsigned integers are: 195 #define SCNo8 "o" 196 #define SCNu8 "u" 197 #define SCNx8 "x" 198 #define SCNX8 "X" 199 #define SCNoLEAST8 "o" 200 #define SCNuLEAST8 "u" 201 #define SCNxLEAST8 "x" 202 #define SCNXLEAST8 "X" 203 #define SCNoFAST8 "o" 204 #define SCNuFAST8 "u" 205 #define SCNxFAST8 "x" 206 #define SCNXFAST8 "X" 207 208 #define SCNo16 "ho" 209 #define SCNu16 "hu" 210 #define SCNx16 "hx" 211 #define SCNX16 "hX" 212 #define SCNoLEAST16 "ho" 213 #define SCNuLEAST16 "hu" 214 #define SCNxLEAST16 "hx" 215 #define SCNXLEAST16 "hX" 216 #define SCNoFAST16 "ho" 217 #define SCNuFAST16 "hu" 218 #define SCNxFAST16 "hx" 219 #define SCNXFAST16 "hX" 220 221 #define SCNo32 "lo" 222 #define SCNu32 "lu" 223 #define SCNx32 "lx" 224 #define SCNX32 "lX" 225 #define SCNoLEAST32 "lo" 226 #define SCNuLEAST32 "lu" 227 #define SCNxLEAST32 "lx" 228 #define SCNXLEAST32 "lX" 229 #define SCNoFAST32 "lo" 230 #define SCNuFAST32 "lu" 231 #define SCNxFAST32 "lx" 232 #define SCNXFAST32 "lX" 233 234 #define SCNo64 "I64o" 235 #define SCNu64 "I64u" 236 #define SCNx64 "I64x" 237 #define SCNX64 "I64X" 238 #define SCNoLEAST64 "I64o" 239 #define SCNuLEAST64 "I64u" 240 #define SCNxLEAST64 "I64x" 241 #define SCNXLEAST64 "I64X" 242 #define SCNoFAST64 "I64o" 243 #define SCNuFAST64 "I64u" 244 #define SCNxFAST64 "I64x" 245 #define SCNXFAST64 "I64X" 246 247 #define SCNoMAX "I64o" 248 #define SCNuMAX "I64u" 249 #define SCNxMAX "I64x" 250 #define SCNXMAX "I64X" 251 252 #ifdef _WIN64 // [ 253 # define SCNoPTR "I64o" 254 # define SCNuPTR "I64u" 255 # define SCNxPTR "I64x" 256 # define SCNXPTR "I64X" 257 #else // _WIN64 ][ 258 # define SCNoPTR "lo" 259 # define SCNuPTR "lu" 260 # define SCNxPTR "lx" 261 # define SCNXPTR "lX" 262 #endif // _WIN64 ] 263 264 #endif // __STDC_FORMAT_MACROS ] 265 266 // 7.8.2 Functions for greatest-width integer types 267 268 // 7.8.2.1 The imaxabs function 269 #define imaxabs _abs64 270 271 // 7.8.2.2 The imaxdiv function 272 273 // This is modified version of div() function from Microsoft's div.c found 274 // in %MSVC.NET%\crt\src\div.c 275 #ifdef STATIC_IMAXDIV // [ 276 static 277 #else // STATIC_IMAXDIV ][ 278 _inline 279 #endif // STATIC_IMAXDIV ] 280 imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) 281 { 282 imaxdiv_t result; 283 284 result.quot = numer / denom; 285 result.rem = numer % denom; 286 287 if (numer < 0 && result.rem > 0) { 288 // did division wrong; must fix up 289 ++result.quot; 290 result.rem -= denom; 291 } 292 293 return result; 294 } 295 296 // 7.8.2.3 The strtoimax and strtoumax functions 297 #define strtoimax _strtoi64 298 #define strtoumax _strtoui64 299 300 // 7.8.2.4 The wcstoimax and wcstoumax functions 301 #define wcstoimax _wcstoi64 302 #define wcstoumax _wcstoui64 303 304 305 #endif // _MSC_INTTYPES_H_ ] 306