1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
6 
7 #ifndef BASE_PORT_H_
8 #define BASE_PORT_H_
9 
10 #include <stdarg.h>
11 #include "build/build_config.h"
12 
13 #ifdef COMPILER_MSVC
14 #define GG_LONGLONG(x) x##I64
15 #define GG_ULONGLONG(x) x##UI64
16 #else
17 #define GG_LONGLONG(x) x##LL
18 #define GG_ULONGLONG(x) x##ULL
19 #endif
20 
21 // Per C99 7.8.14, define __STDC_CONSTANT_MACROS before including <stdint.h>
22 // to get the INTn_C and UINTn_C macros for integer constants.  It's difficult
23 // to guarantee any specific ordering of header includes, so it's difficult to
24 // guarantee that the INTn_C macros can be defined by including <stdint.h> at
25 // any specific point.  Provide GG_INTn_C macros instead.
26 
27 #define GG_INT8_C(x)    (x)
28 #define GG_INT16_C(x)   (x)
29 #define GG_INT32_C(x)   (x)
30 #define GG_INT64_C(x)   GG_LONGLONG(x)
31 
32 #define GG_UINT8_C(x)   (x ## U)
33 #define GG_UINT16_C(x)  (x ## U)
34 #define GG_UINT32_C(x)  (x ## U)
35 #define GG_UINT64_C(x)  GG_ULONGLONG(x)
36 
37 namespace base {
38 
39 // It's possible for functions that use a va_list, such as StringPrintf, to
40 // invalidate the data in it upon use.  The fix is to make a copy of the
41 // structure before using it and use that copy instead.  va_copy is provided
42 // for this purpose.  MSVC does not provide va_copy, so define an
43 // implementation here.  It is not guaranteed that assignment is a copy, so the
44 // StringUtil.VariableArgsFunc unit test tests this capability.
45 
46 // The C standard says that va_copy is a "macro", not a function.  Trying to
47 // use va_list as ref args to a function, as above, breaks some machines.
48 #  if defined(COMPILER_GCC)
49 #    define base_va_copy(_a, _b) ::va_copy(_a, _b)
50 #  elif defined(COMPILER_MSVC)
51 #    define base_va_copy(_a, _b) (_a = _b)
52 #  else
53 #    error No va_copy for your compiler
54 #  endif
55 
56 }  // namespace base
57 
58 // Define an OS-neutral wrapper for shared library entry points
59 #if defined(OS_WIN)
60 #define API_CALL __stdcall
61 #elif defined(OS_LINUX) || defined(OS_MACOSX)
62 #define API_CALL
63 #endif
64 
65 #endif  // BASE_PORT_H_
66