dbus-macros.h 6.6 KB
Newer Older
1
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2 3 4 5
/* dbus-macros.h  generic macros
 *
 * Copyright (C) 2002  Red Hat Inc.
 *
6
 * Licensed under the Academic Free License version 2.1
7 8 9 10 11 12 13 14 15 16 17 18 19
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * 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 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
 *
 */
#if !defined (DBUS_INSIDE_DBUS_H) && !defined (DBUS_COMPILATION)
#error "Only <dbus/dbus.h> can be included directly, this file may disappear or change contents."
#endif

#ifndef DBUS_MACROS_H
#define DBUS_MACROS_H

#ifdef  __cplusplus
#  define DBUS_BEGIN_DECLS  extern "C" {
#  define DBUS_END_DECLS    }
#else
#  define DBUS_BEGIN_DECLS
#  define DBUS_END_DECLS
#endif

#ifndef TRUE
#  define TRUE 1
#endif
#ifndef FALSE
#  define FALSE 0
#endif

#ifndef NULL
#  ifdef __cplusplus
#    define NULL        (0L)
#  else /* !__cplusplus */
#    define NULL        ((void*) 0)
#  endif /* !__cplusplus */
#endif

53
#if  __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
54 55 56
#  define DBUS_DEPRECATED __attribute__ ((__deprecated__))
#elif defined(_MSC_VER) && (_MSC_VER >= 1300)
#  define DBUS_DEPRECATED __declspec(deprecated)
57
#else
58
#  define DBUS_DEPRECATED
59 60
#endif

61
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)
62
#  define _DBUS_GNUC_EXTENSION __extension__
63
#else
64
#  define _DBUS_GNUC_EXTENSION
65 66
#endif

67 68
#if     (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)) || \
         defined(__clang__)
69 70 71 72
#define _DBUS_GNUC_PRINTF( format_idx, arg_idx )    \
  __attribute__((__format__ (__printf__, format_idx, arg_idx)))
#define _DBUS_GNUC_NORETURN                         \
  __attribute__((__noreturn__))
73 74
#define _DBUS_GNUC_UNUSED                           \
  __attribute__((__unused__))
75 76 77
#else   /* !__GNUC__ */
#define _DBUS_GNUC_PRINTF( format_idx, arg_idx )
#define _DBUS_GNUC_NORETURN
78
#define _DBUS_GNUC_UNUSED
79 80
#endif  /* !__GNUC__ */

81 82 83 84 85 86 87 88 89 90 91 92 93 94
#if    __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
#define DBUS_MALLOC     __attribute__((__malloc__))
#else
#define DBUS_MALLOC
#endif

#if     (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
#define DBUS_ALLOC_SIZE(x) __attribute__((__alloc_size__(x)))
#define DBUS_ALLOC_SIZE2(x,y) __attribute__((__alloc_size__(x,y)))
#else
#define DBUS_ALLOC_SIZE(x)
#define DBUS_ALLOC_SIZE2(x,y)
#endif

95 96 97 98 99 100
#if    (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
#define _DBUS_GNUC_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
#else
#define _DBUS_GNUC_WARN_UNUSED_RESULT
#endif

101 102 103 104 105 106
/** @def _DBUS_GNUC_PRINTF
 * used to tell gcc about printf format strings
 */
/** @def _DBUS_GNUC_NORETURN
 * used to tell gcc about functions that never return, such as _dbus_abort()
 */
107 108 109
/** @def _DBUS_GNUC_WARN_UNUSED_RESULT
 * used to tell gcc about functions whose result must be used
 */
110

111 112 113 114 115 116 117 118 119 120 121 122 123 124
/* Normally docs are in .c files, but there isn't a .c file for this. */
/**
 * @defgroup DBusMacros Utility macros
 * @ingroup  DBus
 * @brief #TRUE, #FALSE, #NULL, and so on
 *
 * Utility macros.
 *
 * @{
 */

/**
 * @def DBUS_BEGIN_DECLS
 *
John Palmieri's avatar
John Palmieri committed
125
 * Macro used prior to declaring functions in the D-Bus header
126 127
 * files. Expands to "extern "C"" when using a C++ compiler,
 * and expands to nothing when using a C compiler.
128 129 130
 *
 * Please don't use this in your own code, consider it
 * D-Bus internal.
131 132 133 134
 */
/**
 * @def DBUS_END_DECLS
 *
John Palmieri's avatar
John Palmieri committed
135
 * Macro used after declaring functions in the D-Bus header
136 137
 * files. Expands to "}" when using a C++ compiler,
 * and expands to nothing when using a C compiler.
138 139 140
 *
 * Please don't use this in your own code, consider it
 * D-Bus internal.
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
 */
/**
 * @def TRUE
 *
 * Expands to "1"
 */
/**
 * @def FALSE
 *
 * Expands to "0"
 */
/**
 * @def NULL
 *
 * A null pointer, defined appropriately for C or C++.
 */
157
/**
158
 * @def DBUS_DEPRECATED
159
 *
160
 * Tells the compiler to warn about a function or type if it's used.
161 162 163 164 165 166 167 168 169 170
 * Code marked in this way should also be enclosed in
 * @code
 * #ifndef DBUS_DISABLE_DEPRECATED
 *  deprecated stuff here
 * #endif
 * @endcode
 *
 * Please don't use this in your own code, consider it
 * D-Bus internal.
 */
171
/**
172
 * @def _DBUS_GNUC_EXTENSION
173 174
 *
 * Tells gcc not to warn about extensions to the C standard in the
175 176
 * following expression, even if compiling with -pedantic. Do not use
 * this macro in your own code; please consider it to be internal to libdbus.
177
 */
178

179 180 181 182 183 184 185
/*
 * @def DBUS_EXPORT
 *
 * Declare the following symbol as public.  This is currently a noop on
 * platforms other than Windows.
 */

186 187 188
#if defined(DBUS_EXPORT)
  /* value forced by compiler command line, don't redefine */
#elif defined(_WIN32)
189 190 191
#  if defined(DBUS_STATIC_BUILD)
#  define DBUS_EXPORT
#  elif defined(dbus_1_EXPORTS)
192 193 194 195
#  define DBUS_EXPORT __declspec(dllexport)
#  else
#  define DBUS_EXPORT __declspec(dllimport)
#  endif
196 197
#elif defined(__GNUC__) && __GNUC__ >= 4
#  define DBUS_EXPORT __attribute__ ((__visibility__ ("default")))
198 199 200 201
#else
#define DBUS_EXPORT
#endif

202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
#if defined(DBUS_PRIVATE_EXPORT)
  /* value forced by compiler command line, don't redefine */
#elif defined(_WIN32)
#  if defined(DBUS_STATIC_BUILD)
#    define DBUS_PRIVATE_EXPORT /* no decoration */
#  elif defined(dbus_1_EXPORTS)
#    define DBUS_PRIVATE_EXPORT __declspec(dllexport)
#  else
#    define DBUS_PRIVATE_EXPORT __declspec(dllimport)
#  endif
#elif defined(__GNUC__) && __GNUC__ >= 4
#  define DBUS_PRIVATE_EXPORT __attribute__ ((__visibility__ ("default")))
#else
#  define DBUS_PRIVATE_EXPORT /* no decoration */
#endif

218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
/* Implementation for dbus_clear_message() etc. This is not API,
 * do not use it directly.
 *
 * We're using a specific type (T ** and T *) instead of void ** and
 * void * partly for type-safety, partly to be strict-aliasing-compliant,
 * and partly to keep C++ compilers happy. This code is inlined into
 * users of libdbus, so we can't rely on it having dbus' own compiler
 * settings. */
#define _dbus_clear_pointer_impl(T, pointer_to_pointer, destroy) \
  do { \
    T **_pp = (pointer_to_pointer); \
    T *_value = *_pp; \
    \
    *_pp = NULL; \
    \
    if (_value != NULL) \
      destroy (_value); \
  } while (0)
/* Not (destroy) (_value) in case destroy() is a function-like macro */

238
/** @} */
239

240
#endif /* DBUS_MACROS_H */