]> git.proxmox.com Git - libgit2.git/blob - src/cc-compat.h
f701b2d9351912e6259e9ae8a4107915f597a896
[libgit2.git] / src / cc-compat.h
1 /*
2 * Copyright (C) the libgit2 contributors. All rights reserved.
3 *
4 * This file is part of libgit2, distributed under the GNU GPL v2 with
5 * a Linking Exception. For full terms see the included COPYING file.
6 */
7 #ifndef INCLUDE_cc_compat_h__
8 #define INCLUDE_cc_compat_h__
9
10 #include <stdarg.h>
11
12 /*
13 * See if our compiler is known to support flexible array members.
14 */
15 #ifndef GIT_FLEX_ARRAY
16 # if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
17 # define GIT_FLEX_ARRAY /* empty */
18 # elif defined(__GNUC__)
19 # if (__GNUC__ >= 3)
20 # define GIT_FLEX_ARRAY /* empty */
21 # else
22 # define GIT_FLEX_ARRAY 0 /* older GNU extension */
23 # endif
24 # endif
25
26 /* Default to safer but a bit wasteful traditional style */
27 # ifndef GIT_FLEX_ARRAY
28 # define GIT_FLEX_ARRAY 1
29 # endif
30 #endif
31
32 #if defined(__GNUC__)
33 # define GIT_ALIGN(x,size) x __attribute__ ((aligned(size)))
34 #elif defined(_MSC_VER)
35 # define GIT_ALIGN(x,size) __declspec(align(size)) x
36 #else
37 # define GIT_ALIGN(x,size) x
38 #endif
39
40 #if defined(__GNUC__)
41 # define GIT_UNUSED(x) \
42 do { \
43 __typeof__(x) _unused __attribute__((unused)); \
44 _unused = (x); \
45 } while (0)
46 #else
47 # define GIT_UNUSED(x) ((void)(x))
48 #endif
49
50 /* Define the printf format specifier to use for size_t output */
51 #if defined(_MSC_VER) || defined(__MINGW32__)
52
53 /* Visual Studio 2012 and prior lack PRId64 entirely */
54 # ifndef PRId64
55 # define PRId64 "I64d"
56 # endif
57
58 /* The first block is needed to avoid warnings on MingW amd64 */
59 # if (SIZE_MAX == ULLONG_MAX)
60 # define PRIuZ "I64u"
61 # define PRIxZ "I64x"
62 # define PRIXZ "I64X"
63 # define PRIdZ "I64d"
64 # else
65 # define PRIuZ "Iu"
66 # define PRIxZ "Ix"
67 # define PRIXZ "IX"
68 # define PRIdZ "Id"
69 # endif
70
71 #else
72 # define PRIuZ "zu"
73 # define PRIxZ "zx"
74 # define PRIXZ "zX"
75 # define PRIdZ "zd"
76 #endif
77
78 /* Micosoft Visual C/C++ */
79 #if defined(_MSC_VER)
80 /* disable "deprecated function" warnings */
81 # pragma warning ( disable : 4996 )
82 /* disable "conditional expression is constant" level 4 warnings */
83 # pragma warning ( disable : 4127 )
84 #endif
85
86 #if defined (_MSC_VER)
87 typedef unsigned char bool;
88 # ifndef true
89 # define true 1
90 # endif
91 # ifndef false
92 # define false 0
93 # endif
94 #else
95 # include <stdbool.h>
96 #endif
97
98 #ifndef va_copy
99 # ifdef __va_copy
100 # define va_copy(dst, src) __va_copy(dst, src)
101 # else
102 # define va_copy(dst, src) ((dst) = (src))
103 # endif
104 #endif
105
106 #endif