1 | // Copyright 2016 the V8 project authors. All rights reserved. |
2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. |
4 | |
5 | #ifndef V8_BASE_FORMAT_MACROS_H_ |
6 | #define V8_BASE_FORMAT_MACROS_H_ |
7 | |
8 | // This file defines the format macros for some integer types. |
9 | |
10 | // To print a 64-bit value in a portable way: |
11 | // int64_t value; |
12 | // printf("xyz:%" PRId64, value); |
13 | // The "d" in the macro corresponds to %d; you can also use PRIu64 etc. |
14 | // |
15 | // For wide strings, prepend "Wide" to the macro: |
16 | // int64_t value; |
17 | // StringPrintf(L"xyz: %" WidePRId64, value); |
18 | // |
19 | // To print a size_t value in a portable way: |
20 | // size_t size; |
21 | // printf("xyz: %" PRIuS, size); |
22 | // The "u" in the macro corresponds to %u, and S is for "size". |
23 | |
24 | #include <stddef.h> |
25 | #include <stdint.h> |
26 | |
27 | #include "src/base/build_config.h" |
28 | |
29 | #if defined(V8_OS_POSIX) && (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && \ |
30 | !defined(PRId64) |
31 | #error "inttypes.h has already been included before this header file, but " |
32 | #error "without __STDC_FORMAT_MACROS defined." |
33 | #endif |
34 | |
35 | #if defined(V8_OS_POSIX) && !defined(__STDC_FORMAT_MACROS) |
36 | #define __STDC_FORMAT_MACROS |
37 | #endif |
38 | |
39 | #include <inttypes.h> |
40 | |
41 | #if defined(V8_OS_POSIX) |
42 | |
43 | // GCC will concatenate wide and narrow strings correctly, so nothing needs to |
44 | // be done here. |
45 | #define WidePRId64 PRId64 |
46 | #define WidePRIu64 PRIu64 |
47 | #define WidePRIx64 PRIx64 |
48 | |
49 | #if !defined(PRIuS) |
50 | #define PRIuS "zu" |
51 | #endif |
52 | |
53 | // The size of NSInteger and NSUInteger varies between 32-bit and 64-bit |
54 | // architectures and Apple does not provides standard format macros and |
55 | // recommends casting. This has many drawbacks, so instead define macros |
56 | // for formatting those types. |
57 | #if defined(V8_OS_MACOSX) |
58 | #if defined(V8_HOST_ARCH_64_BIT) |
59 | #if !defined(PRIdNS) |
60 | #define PRIdNS "ld" |
61 | #endif |
62 | #if !defined(PRIuNS) |
63 | #define PRIuNS "lu" |
64 | #endif |
65 | #if !defined(PRIxNS) |
66 | #define PRIxNS "lx" |
67 | #endif |
68 | #else // defined(V8_HOST_ARCH_64_BIT) |
69 | #if !defined(PRIdNS) |
70 | #define PRIdNS "d" |
71 | #endif |
72 | #if !defined(PRIuNS) |
73 | #define PRIuNS "u" |
74 | #endif |
75 | #if !defined(PRIxNS) |
76 | #define PRIxNS "x" |
77 | #endif |
78 | #endif |
79 | #endif // defined(V8_OS_MACOSX) |
80 | |
81 | #else // V8_OS_WIN |
82 | |
83 | #if !defined(PRId64) || !defined(PRIu64) || !defined(PRIx64) |
84 | #error "inttypes.h provided by win toolchain should define these." |
85 | #endif |
86 | |
87 | #define WidePRId64 L"I64d" |
88 | #define WidePRIu64 L"I64u" |
89 | #define WidePRIx64 L"I64x" |
90 | |
91 | #if !defined(PRIuS) |
92 | #define PRIuS "Iu" |
93 | #endif |
94 | |
95 | #endif |
96 | |
97 | #endif // V8_BASE_FORMAT_MACROS_H_ |
98 | |