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 <msc_stdint.h>
44
45// 7.8 Format conversion of integer types
46
47typedef struct {
48   intmax_t quot;
49   intmax_t rem;
50} imaxdiv_t;
51
52// 7.8.1 Macros for format specifiers
53
54// The fprintf macros for signed integers are:
55#define PRId8       "d"
56#define PRIi8       "i"
57#define PRIdLEAST8  "d"
58#define PRIiLEAST8  "i"
59#define PRIdFAST8   "d"
60#define PRIiFAST8   "i"
61
62#define PRId16       "hd"
63#define PRIi16       "hi"
64#define PRIdLEAST16  "hd"
65#define PRIiLEAST16  "hi"
66#define PRIdFAST16   "hd"
67#define PRIiFAST16   "hi"
68
69#define PRId32       "I32d"
70#define PRIi32       "I32i"
71#define PRIdLEAST32  "I32d"
72#define PRIiLEAST32  "I32i"
73#define PRIdFAST32   "I32d"
74#define PRIiFAST32   "I32i"
75
76#define PRId64       "I64d"
77#define PRIi64       "I64i"
78#define PRIdLEAST64  "I64d"
79#define PRIiLEAST64  "I64i"
80#define PRIdFAST64   "I64d"
81#define PRIiFAST64   "I64i"
82
83#define PRIdMAX     "I64d"
84#define PRIiMAX     "I64i"
85
86#define PRIdPTR     "Id"
87#define PRIiPTR     "Ii"
88
89// The fprintf macros for unsigned integers are:
90#define PRIo8       "o"
91#define PRIu8       "u"
92#define PRIx8       "x"
93#define PRIX8       "X"
94#define PRIoLEAST8  "o"
95#define PRIuLEAST8  "u"
96#define PRIxLEAST8  "x"
97#define PRIXLEAST8  "X"
98#define PRIoFAST8   "o"
99#define PRIuFAST8   "u"
100#define PRIxFAST8   "x"
101#define PRIXFAST8   "X"
102
103#define PRIo16       "ho"
104#define PRIu16       "hu"
105#define PRIx16       "hx"
106#define PRIX16       "hX"
107#define PRIoLEAST16  "ho"
108#define PRIuLEAST16  "hu"
109#define PRIxLEAST16  "hx"
110#define PRIXLEAST16  "hX"
111#define PRIoFAST16   "ho"
112#define PRIuFAST16   "hu"
113#define PRIxFAST16   "hx"
114#define PRIXFAST16   "hX"
115
116#define PRIo32       "I32o"
117#define PRIu32       "I32u"
118#define PRIx32       "I32x"
119#define PRIX32       "I32X"
120#define PRIoLEAST32  "I32o"
121#define PRIuLEAST32  "I32u"
122#define PRIxLEAST32  "I32x"
123#define PRIXLEAST32  "I32X"
124#define PRIoFAST32   "I32o"
125#define PRIuFAST32   "I32u"
126#define PRIxFAST32   "I32x"
127#define PRIXFAST32   "I32X"
128
129#define PRIo64       "I64o"
130#define PRIu64       "I64u"
131#define PRIx64       "I64x"
132#define PRIX64       "I64X"
133#define PRIoLEAST64  "I64o"
134#define PRIuLEAST64  "I64u"
135#define PRIxLEAST64  "I64x"
136#define PRIXLEAST64  "I64X"
137#define PRIoFAST64   "I64o"
138#define PRIuFAST64   "I64u"
139#define PRIxFAST64   "I64x"
140#define PRIXFAST64   "I64X"
141
142#define PRIoMAX     "I64o"
143#define PRIuMAX     "I64u"
144#define PRIxMAX     "I64x"
145#define PRIXMAX     "I64X"
146
147#define PRIoPTR     "Io"
148#define PRIuPTR     "Iu"
149#define PRIxPTR     "Ix"
150#define PRIXPTR     "IX"
151
152// The fscanf macros for signed integers are:
153#define SCNd8       "d"
154#define SCNi8       "i"
155#define SCNdLEAST8  "d"
156#define SCNiLEAST8  "i"
157#define SCNdFAST8   "d"
158#define SCNiFAST8   "i"
159
160#define SCNd16       "hd"
161#define SCNi16       "hi"
162#define SCNdLEAST16  "hd"
163#define SCNiLEAST16  "hi"
164#define SCNdFAST16   "hd"
165#define SCNiFAST16   "hi"
166
167#define SCNd32       "ld"
168#define SCNi32       "li"
169#define SCNdLEAST32  "ld"
170#define SCNiLEAST32  "li"
171#define SCNdFAST32   "ld"
172#define SCNiFAST32   "li"
173
174#define SCNd64       "I64d"
175#define SCNi64       "I64i"
176#define SCNdLEAST64  "I64d"
177#define SCNiLEAST64  "I64i"
178#define SCNdFAST64   "I64d"
179#define SCNiFAST64   "I64i"
180
181#define SCNdMAX     "I64d"
182#define SCNiMAX     "I64i"
183
184#ifdef _WIN64 // [
185#  define SCNdPTR     "I64d"
186#  define SCNiPTR     "I64i"
187#else  // _WIN64 ][
188#  define SCNdPTR     "ld"
189#  define SCNiPTR     "li"
190#endif  // _WIN64 ]
191
192// The fscanf macros for unsigned integers are:
193#define SCNo8       "o"
194#define SCNu8       "u"
195#define SCNx8       "x"
196#define SCNX8       "X"
197#define SCNoLEAST8  "o"
198#define SCNuLEAST8  "u"
199#define SCNxLEAST8  "x"
200#define SCNXLEAST8  "X"
201#define SCNoFAST8   "o"
202#define SCNuFAST8   "u"
203#define SCNxFAST8   "x"
204#define SCNXFAST8   "X"
205
206#define SCNo16       "ho"
207#define SCNu16       "hu"
208#define SCNx16       "hx"
209#define SCNX16       "hX"
210#define SCNoLEAST16  "ho"
211#define SCNuLEAST16  "hu"
212#define SCNxLEAST16  "hx"
213#define SCNXLEAST16  "hX"
214#define SCNoFAST16   "ho"
215#define SCNuFAST16   "hu"
216#define SCNxFAST16   "hx"
217#define SCNXFAST16   "hX"
218
219#define SCNo32       "lo"
220#define SCNu32       "lu"
221#define SCNx32       "lx"
222#define SCNX32       "lX"
223#define SCNoLEAST32  "lo"
224#define SCNuLEAST32  "lu"
225#define SCNxLEAST32  "lx"
226#define SCNXLEAST32  "lX"
227#define SCNoFAST32   "lo"
228#define SCNuFAST32   "lu"
229#define SCNxFAST32   "lx"
230#define SCNXFAST32   "lX"
231
232#define SCNo64       "I64o"
233#define SCNu64       "I64u"
234#define SCNx64       "I64x"
235#define SCNX64       "I64X"
236#define SCNoLEAST64  "I64o"
237#define SCNuLEAST64  "I64u"
238#define SCNxLEAST64  "I64x"
239#define SCNXLEAST64  "I64X"
240#define SCNoFAST64   "I64o"
241#define SCNuFAST64   "I64u"
242#define SCNxFAST64   "I64x"
243#define SCNXFAST64   "I64X"
244
245#define SCNoMAX     "I64o"
246#define SCNuMAX     "I64u"
247#define SCNxMAX     "I64x"
248#define SCNXMAX     "I64X"
249
250#ifdef _WIN64 // [
251#  define SCNoPTR     "I64o"
252#  define SCNuPTR     "I64u"
253#  define SCNxPTR     "I64x"
254#  define SCNXPTR     "I64X"
255#else  // _WIN64 ][
256#  define SCNoPTR     "lo"
257#  define SCNuPTR     "lu"
258#  define SCNxPTR     "lx"
259#  define SCNXPTR     "lX"
260#endif  // _WIN64 ]
261
262// 7.8.2 Functions for greatest-width integer types
263
264// 7.8.2.1 The imaxabs function
265#define imaxabs _abs64
266
267// 7.8.2.2 The imaxdiv function
268
269// This is modified version of div() function from Microsoft's div.c found
270// in %MSVC.NET%\crt\src\div.c
271#ifdef STATIC_IMAXDIV // [
272static
273#else // STATIC_IMAXDIV ][
274_inline
275#endif // STATIC_IMAXDIV ]
276imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom)
277{
278   imaxdiv_t result;
279
280   result.quot = numer / denom;
281   result.rem = numer % denom;
282
283   if (numer < 0 && result.rem > 0) {
284      // did division wrong; must fix up
285      ++result.quot;
286      result.rem -= denom;
287   }
288
289   return result;
290}
291
292// 7.8.2.3 The strtoimax and strtoumax functions
293#define strtoimax _strtoi64
294#define strtoumax _strtoui64
295
296// 7.8.2.4 The wcstoimax and wcstoumax functions
297#define wcstoimax _wcstoi64
298#define wcstoumax _wcstoui64
299
300
301#endif // _MSC_INTTYPES_H_ ]
302