1 | /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ |
2 | /* dbus-macros.h generic macros |
3 | * |
4 | * Copyright (C) 2002 Red Hat Inc. |
5 | * |
6 | * Licensed under the Academic Free License version 2.1 |
7 | * |
8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by |
10 | * the Free Software Foundation; either version 2 of the License, or |
11 | * (at your option) any later version. |
12 | * |
13 | * This program is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * GNU General Public License for more details. |
17 | * |
18 | * You should have received a copy of the GNU General Public License |
19 | * along with this program; if not, write to the Free Software |
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 | * |
22 | */ |
23 | #if !defined (DBUS_INSIDE_DBUS_H) && !defined (DBUS_COMPILATION) |
24 | #error "Only <dbus/dbus.h> can be included directly, this file may disappear or change contents." |
25 | #endif |
26 | |
27 | #ifndef DBUS_MACROS_H |
28 | #define DBUS_MACROS_H |
29 | |
30 | #ifdef __cplusplus |
31 | # define DBUS_BEGIN_DECLS extern "C" { |
32 | # define DBUS_END_DECLS } |
33 | #else |
34 | # define DBUS_BEGIN_DECLS |
35 | # define DBUS_END_DECLS |
36 | #endif |
37 | |
38 | #ifndef TRUE |
39 | # define TRUE 1 |
40 | #endif |
41 | #ifndef FALSE |
42 | # define FALSE 0 |
43 | #endif |
44 | |
45 | #ifndef NULL |
46 | # ifdef __cplusplus |
47 | # define NULL (0L) |
48 | # else /* !__cplusplus */ |
49 | # define NULL ((void*) 0) |
50 | # endif /* !__cplusplus */ |
51 | #endif |
52 | |
53 | #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) |
54 | # define DBUS_DEPRECATED __attribute__ ((__deprecated__)) |
55 | #elif defined(_MSC_VER) && (_MSC_VER >= 1300) |
56 | # define DBUS_DEPRECATED __declspec(deprecated) |
57 | #else |
58 | # define DBUS_DEPRECATED |
59 | #endif |
60 | |
61 | #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8) |
62 | # define _DBUS_GNUC_EXTENSION __extension__ |
63 | #else |
64 | # define _DBUS_GNUC_EXTENSION |
65 | #endif |
66 | |
67 | #if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)) || \ |
68 | defined(__clang__) |
69 | #define _DBUS_GNUC_PRINTF( format_idx, arg_idx ) \ |
70 | __attribute__((__format__ (__printf__, format_idx, arg_idx))) |
71 | #define _DBUS_GNUC_NORETURN \ |
72 | __attribute__((__noreturn__)) |
73 | #define _DBUS_GNUC_UNUSED \ |
74 | __attribute__((__unused__)) |
75 | #else /* !__GNUC__ */ |
76 | #define _DBUS_GNUC_PRINTF( format_idx, arg_idx ) |
77 | #define _DBUS_GNUC_NORETURN |
78 | #define _DBUS_GNUC_UNUSED |
79 | #endif /* !__GNUC__ */ |
80 | |
81 | #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) |
82 | #define DBUS_MALLOC __attribute__((__malloc__)) |
83 | #else |
84 | #define DBUS_MALLOC |
85 | #endif |
86 | |
87 | #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) |
88 | #define DBUS_ALLOC_SIZE(x) __attribute__((__alloc_size__(x))) |
89 | #define DBUS_ALLOC_SIZE2(x,y) __attribute__((__alloc_size__(x,y))) |
90 | #else |
91 | #define DBUS_ALLOC_SIZE(x) |
92 | #define DBUS_ALLOC_SIZE2(x,y) |
93 | #endif |
94 | |
95 | #if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) |
96 | #define _DBUS_GNUC_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) |
97 | #else |
98 | #define _DBUS_GNUC_WARN_UNUSED_RESULT |
99 | #endif |
100 | |
101 | /** @def _DBUS_GNUC_PRINTF |
102 | * used to tell gcc about printf format strings |
103 | */ |
104 | /** @def _DBUS_GNUC_NORETURN |
105 | * used to tell gcc about functions that never return, such as _dbus_abort() |
106 | */ |
107 | /** @def _DBUS_GNUC_WARN_UNUSED_RESULT |
108 | * used to tell gcc about functions whose result must be used |
109 | */ |
110 | |
111 | /* Normally docs are in .c files, but there isn't a .c file for this. */ |
112 | /** |
113 | * @defgroup DBusMacros Utility macros |
114 | * @ingroup DBus |
115 | * @brief #TRUE, #FALSE, #NULL, and so on |
116 | * |
117 | * Utility macros. |
118 | * |
119 | * @{ |
120 | */ |
121 | |
122 | /** |
123 | * @def DBUS_BEGIN_DECLS |
124 | * |
125 | * Macro used prior to declaring functions in the D-Bus header |
126 | * files. Expands to "extern "C"" when using a C++ compiler, |
127 | * and expands to nothing when using a C compiler. |
128 | * |
129 | * Please don't use this in your own code, consider it |
130 | * D-Bus internal. |
131 | */ |
132 | /** |
133 | * @def DBUS_END_DECLS |
134 | * |
135 | * Macro used after declaring functions in the D-Bus header |
136 | * files. Expands to "}" when using a C++ compiler, |
137 | * and expands to nothing when using a C compiler. |
138 | * |
139 | * Please don't use this in your own code, consider it |
140 | * D-Bus internal. |
141 | */ |
142 | /** |
143 | * @def TRUE |
144 | * |
145 | * Expands to "1" |
146 | */ |
147 | /** |
148 | * @def FALSE |
149 | * |
150 | * Expands to "0" |
151 | */ |
152 | /** |
153 | * @def NULL |
154 | * |
155 | * A null pointer, defined appropriately for C or C++. |
156 | */ |
157 | /** |
158 | * @def DBUS_DEPRECATED |
159 | * |
160 | * Tells the compiler to warn about a function or type if it's used. |
161 | * Code marked in this way should also be enclosed in |
162 | * @code |
163 | * #ifndef DBUS_DISABLE_DEPRECATED |
164 | * deprecated stuff here |
165 | * #endif |
166 | * @endcode |
167 | * |
168 | * Please don't use this in your own code, consider it |
169 | * D-Bus internal. |
170 | */ |
171 | /** |
172 | * @def _DBUS_GNUC_EXTENSION |
173 | * |
174 | * Tells gcc not to warn about extensions to the C standard in the |
175 | * following expression, even if compiling with -pedantic. Do not use |
176 | * this macro in your own code; please consider it to be internal to libdbus. |
177 | */ |
178 | |
179 | /* |
180 | * @def DBUS_EXPORT |
181 | * |
182 | * Declare the following symbol as public. This is currently a noop on |
183 | * platforms other than Windows. |
184 | */ |
185 | |
186 | #if defined(DBUS_EXPORT) |
187 | /* value forced by compiler command line, don't redefine */ |
188 | #elif defined(_WIN32) |
189 | # if defined(DBUS_STATIC_BUILD) |
190 | # define DBUS_EXPORT |
191 | # elif defined(dbus_1_EXPORTS) |
192 | # define DBUS_EXPORT __declspec(dllexport) |
193 | # else |
194 | # define DBUS_EXPORT __declspec(dllimport) |
195 | # endif |
196 | #elif defined(__GNUC__) && __GNUC__ >= 4 |
197 | # define DBUS_EXPORT __attribute__ ((__visibility__ ("default"))) |
198 | #else |
199 | #define DBUS_EXPORT |
200 | #endif |
201 | |
202 | #if defined(DBUS_PRIVATE_EXPORT) |
203 | /* value forced by compiler command line, don't redefine */ |
204 | #elif defined(_WIN32) |
205 | # if defined(DBUS_STATIC_BUILD) |
206 | # define DBUS_PRIVATE_EXPORT /* no decoration */ |
207 | # elif defined(dbus_1_EXPORTS) |
208 | # define DBUS_PRIVATE_EXPORT __declspec(dllexport) |
209 | # else |
210 | # define DBUS_PRIVATE_EXPORT __declspec(dllimport) |
211 | # endif |
212 | #elif defined(__GNUC__) && __GNUC__ >= 4 |
213 | # define DBUS_PRIVATE_EXPORT __attribute__ ((__visibility__ ("default"))) |
214 | #else |
215 | # define DBUS_PRIVATE_EXPORT /* no decoration */ |
216 | #endif |
217 | |
218 | /* Implementation for dbus_clear_message() etc. This is not API, |
219 | * do not use it directly. |
220 | * |
221 | * We're using a specific type (T ** and T *) instead of void ** and |
222 | * void * partly for type-safety, partly to be strict-aliasing-compliant, |
223 | * and partly to keep C++ compilers happy. This code is inlined into |
224 | * users of libdbus, so we can't rely on it having dbus' own compiler |
225 | * settings. */ |
226 | #define _dbus_clear_pointer_impl(T, pointer_to_pointer, destroy) \ |
227 | do { \ |
228 | T **_pp = (pointer_to_pointer); \ |
229 | T *_value = *_pp; \ |
230 | \ |
231 | *_pp = NULL; \ |
232 | \ |
233 | if (_value != NULL) \ |
234 | destroy (_value); \ |
235 | } while (0) |
236 | /* Not (destroy) (_value) in case destroy() is a function-like macro */ |
237 | |
238 | /** @} */ |
239 | |
240 | #endif /* DBUS_MACROS_H */ |
241 | |