15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2009 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_FORMAT_MACROS_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_FORMAT_MACROS_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file defines the format macros for some integer types.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To print a 64-bit value in a portable way:
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   int64_t value;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   printf("xyz:%" PRId64, value);
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The "d" in the macro corresponds to %d; you can also use PRIu64 etc.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For wide strings, prepend "Wide" to the macro:
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   int64_t value;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   StringPrintf(L"xyz: %" WidePRId64, value);
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To print a size_t value in a portable way:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   size_t size;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   printf("xyz: %" PRIuS, size);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The "u" in the macro corresponds to %u, and S is for "size".
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && !defined(PRId64)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error "inttypes.h has already been included before this header file, but "
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error "without __STDC_FORMAT_MACROS defined."
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(__STDC_FORMAT_MACROS)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __STDC_FORMAT_MACROS
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <inttypes.h>
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC will concatenate wide and narrow strings correctly, so nothing needs to
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be done here.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WidePRId64 PRId64
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WidePRIu64 PRIu64
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WidePRIx64 PRIx64
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PRIuS)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRIuS "zu"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// The size of NSInteger and NSUInteger varies between 32-bit and 64-bit
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// architectures and Apple does not provides standard format macros and
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// recommends casting. This has many drawbacks, so instead define macros
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// for formatting those types.
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_MACOSX)
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(ARCH_CPU_64_BITS)
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if !defined(PRIdNS)
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define PRIdNS "ld"
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if !defined(PRIuNS)
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define PRIuNS "lu"
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if !defined(PRIxNS)
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define PRIxNS "lx"
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else  // defined(ARCH_CPU_64_BITS)
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if !defined(PRIdNS)
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define PRIdNS "d"
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if !defined(PRIuNS)
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define PRIuNS "u"
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if !defined(PRIxNS)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define PRIxNS "x"
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // defined(OS_MACOSX)
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else  // OS_WIN
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PRId64)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRId64 "I64d"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PRIu64)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRIu64 "I64u"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PRIx64)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRIx64 "I64x"
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WidePRId64 L"I64d"
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WidePRIu64 L"I64u"
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WidePRIx64 L"I64x"
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PRIuS)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRIuS "Iu"
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // BASE_FORMAT_MACROS_H_
102