1 /* GLIB - Library of useful routines for C programming 2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library; if not, write to the 16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 * Boston, MA 02111-1307, USA. 18 */ 19 20 /* 21 * Modified by the GLib Team and others 1997-2000. See the AUTHORS 22 * file for a list of people on the GLib Team. See the ChangeLog 23 * files for a list of changes. These files are distributed with 24 * GLib at ftp://ftp.gtk.org/pub/gtk/. 25 */ 26 27 /* This file must not include any other glib header file and must thus 28 * not refer to variables from glibconfig.h 29 */ 30 31 #if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) 32 #error "Only <glib.h> can be included directly." 33 #endif 34 35 #ifndef __G_MACROS_H__ 36 #define __G_MACROS_H__ 37 38 /* We include stddef.h to get the system's definition of NULL 39 */ 40 #include <stddef.h> 41 42 /* Here we provide G_GNUC_EXTENSION as an alias for __extension__, 43 * where this is valid. This allows for warningless compilation of 44 * "long long" types even in the presence of '-ansi -pedantic'. 45 */ 46 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8) 47 # define G_GNUC_EXTENSION __extension__ 48 #else 49 # define G_GNUC_EXTENSION 50 #endif 51 52 /* Provide macros to feature the GCC function attribute. 53 */ 54 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) 55 #define G_GNUC_PURE \ 56 __attribute__((__pure__)) 57 #define G_GNUC_MALLOC \ 58 __attribute__((__malloc__)) 59 #else 60 #define G_GNUC_PURE 61 #define G_GNUC_MALLOC 62 #endif 63 64 #if __GNUC__ >= 4 65 #define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__)) 66 #else 67 #define G_GNUC_NULL_TERMINATED 68 #endif 69 70 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 71 #define G_GNUC_ALLOC_SIZE(x) __attribute__((__alloc_size__(x))) 72 #define G_GNUC_ALLOC_SIZE2(x,y) __attribute__((__alloc_size__(x,y))) 73 #else 74 #define G_GNUC_ALLOC_SIZE(x) 75 #define G_GNUC_ALLOC_SIZE2(x,y) 76 #endif 77 78 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) 79 #define G_GNUC_PRINTF( format_idx, arg_idx ) \ 80 __attribute__((__format__ (__printf__, format_idx, arg_idx))) 81 #define G_GNUC_SCANF( format_idx, arg_idx ) \ 82 __attribute__((__format__ (__scanf__, format_idx, arg_idx))) 83 #define G_GNUC_FORMAT( arg_idx ) \ 84 __attribute__((__format_arg__ (arg_idx))) 85 #define G_GNUC_NORETURN \ 86 __attribute__((__noreturn__)) 87 #define G_GNUC_CONST \ 88 __attribute__((__const__)) 89 #define G_GNUC_UNUSED \ 90 __attribute__((__unused__)) 91 #define G_GNUC_NO_INSTRUMENT \ 92 __attribute__((__no_instrument_function__)) 93 #else /* !__GNUC__ */ 94 #define G_GNUC_PRINTF( format_idx, arg_idx ) 95 #define G_GNUC_SCANF( format_idx, arg_idx ) 96 #define G_GNUC_FORMAT( arg_idx ) 97 #define G_GNUC_NORETURN 98 #define G_GNUC_CONST 99 #define G_GNUC_UNUSED 100 #define G_GNUC_NO_INSTRUMENT 101 #endif /* !__GNUC__ */ 102 103 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) 104 #define G_GNUC_DEPRECATED \ 105 __attribute__((__deprecated__)) 106 #else 107 #define G_GNUC_DEPRECATED 108 #endif /* __GNUC__ */ 109 110 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) 111 # define G_GNUC_MAY_ALIAS __attribute__((may_alias)) 112 #else 113 # define G_GNUC_MAY_ALIAS 114 #endif 115 116 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) 117 #define G_GNUC_WARN_UNUSED_RESULT \ 118 __attribute__((warn_unused_result)) 119 #else 120 #define G_GNUC_WARN_UNUSED_RESULT 121 #endif /* __GNUC__ */ 122 123 #ifndef G_DISABLE_DEPRECATED 124 /* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with 125 * macros, so we can refer to them as strings unconditionally. 126 * usage not-recommended since gcc-3.0 127 */ 128 #if defined (__GNUC__) && (__GNUC__ < 3) 129 #define G_GNUC_FUNCTION __FUNCTION__ 130 #define G_GNUC_PRETTY_FUNCTION __PRETTY_FUNCTION__ 131 #else /* !__GNUC__ */ 132 #define G_GNUC_FUNCTION "" 133 #define G_GNUC_PRETTY_FUNCTION "" 134 #endif /* !__GNUC__ */ 135 #endif /* !G_DISABLE_DEPRECATED */ 136 137 #define G_STRINGIFY(macro_or_string) G_STRINGIFY_ARG (macro_or_string) 138 #define G_STRINGIFY_ARG(contents) #contents 139 140 #define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2 141 #define G_PASTE(identifier1,identifier2) G_PASTE_ARGS (identifier1, identifier2) 142 #define G_STATIC_ASSERT(expr) typedef struct { char Compile_Time_Assertion[(expr) ? 1 : -1]; } G_PASTE (_GStaticAssert_, __LINE__) 143 144 /* Provide a string identifying the current code position */ 145 #if defined(__GNUC__) && (__GNUC__ < 3) && !defined(__cplusplus) 146 # define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) ":" __PRETTY_FUNCTION__ "()" 147 #else 148 # define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) 149 #endif 150 151 /* Provide a string identifying the current function, non-concatenatable */ 152 #if defined (__GNUC__) 153 # define G_STRFUNC ((const char*) (__PRETTY_FUNCTION__)) 154 #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 19901L 155 # define G_STRFUNC ((const char*) (__func__)) 156 #else 157 # define G_STRFUNC ((const char*) ("???")) 158 #endif 159 160 /* Guard C code in headers, while including them from C++ */ 161 #ifdef __cplusplus 162 # define G_BEGIN_DECLS extern "C" { 163 # define G_END_DECLS } 164 #else 165 # define G_BEGIN_DECLS 166 # define G_END_DECLS 167 #endif 168 169 /* Provide definitions for some commonly used macros. 170 * Some of them are only provided if they haven't already 171 * been defined. It is assumed that if they are already 172 * defined then the current definition is correct. 173 */ 174 #ifndef NULL 175 # ifdef __cplusplus 176 # define NULL (0L) 177 # else /* !__cplusplus */ 178 # define NULL ((void*) 0) 179 # endif /* !__cplusplus */ 180 #endif 181 182 #ifndef FALSE 183 #define FALSE (0) 184 #endif 185 186 #ifndef TRUE 187 #define TRUE (!FALSE) 188 #endif 189 190 #undef MAX 191 #define MAX(a, b) (((a) > (b)) ? (a) : (b)) 192 193 #undef MIN 194 #define MIN(a, b) (((a) < (b)) ? (a) : (b)) 195 196 #undef ABS 197 #define ABS(a) (((a) < 0) ? -(a) : (a)) 198 199 #undef CLAMP 200 #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) 201 202 /* Count the number of elements in an array. The array must be defined 203 * as such; using this with a dynamically allocated array will give 204 * incorrect results. 205 */ 206 #define G_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0])) 207 208 /* Macros by analogy to GINT_TO_POINTER, GPOINTER_TO_INT 209 */ 210 #define GPOINTER_TO_SIZE(p) ((gsize) (p)) 211 #define GSIZE_TO_POINTER(s) ((gpointer) (gsize) (s)) 212 213 /* Provide convenience macros for handling structure 214 * fields through their offsets. 215 */ 216 217 #if defined(__GNUC__) && __GNUC__ >= 4 218 # define G_STRUCT_OFFSET(struct_type, member) \ 219 ((glong) offsetof (struct_type, member)) 220 #else 221 # define G_STRUCT_OFFSET(struct_type, member) \ 222 ((glong) ((guint8*) &((struct_type*) 0)->member)) 223 #endif 224 225 #define G_STRUCT_MEMBER_P(struct_p, struct_offset) \ 226 ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset))) 227 #define G_STRUCT_MEMBER(member_type, struct_p, struct_offset) \ 228 (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset))) 229 230 /* Provide simple macro statement wrappers: 231 * G_STMT_START { statements; } G_STMT_END; 232 * This can be used as a single statement, like: 233 * if (x) G_STMT_START { ... } G_STMT_END; else ... 234 * This intentionally does not use compiler extensions like GCC's '({...})' to 235 * avoid portability issue or side effects when compiled with different compilers. 236 */ 237 #if !(defined (G_STMT_START) && defined (G_STMT_END)) 238 # define G_STMT_START do 239 # define G_STMT_END while (0) 240 #endif 241 242 /* Allow the app programmer to select whether or not return values 243 * (usually char*) are const or not. Don't try using this feature for 244 * functions with C++ linkage. 245 */ 246 #ifdef G_DISABLE_CONST_RETURNS 247 #define G_CONST_RETURN 248 #else 249 #define G_CONST_RETURN const 250 #endif 251 252 /* 253 * The G_LIKELY and G_UNLIKELY macros let the programmer give hints to 254 * the compiler about the expected result of an expression. Some compilers 255 * can use this information for optimizations. 256 * 257 * The _G_BOOLEAN_EXPR macro is intended to trigger a gcc warning when 258 * putting assignments in g_return_if_fail (). 259 */ 260 #if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) 261 #define _G_BOOLEAN_EXPR(expr) \ 262 __extension__ ({ \ 263 int _g_boolean_var_; \ 264 if (expr) \ 265 _g_boolean_var_ = 1; \ 266 else \ 267 _g_boolean_var_ = 0; \ 268 _g_boolean_var_; \ 269 }) 270 #define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 1)) 271 #define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0)) 272 #else 273 #define G_LIKELY(expr) (expr) 274 #define G_UNLIKELY(expr) (expr) 275 #endif 276 277 #endif /* __G_MACROS_H__ */ 278