Use "if (expr) { } else" as I meant to in the first place. The other form
[platform/upstream/glib.git] / glib / gmessages.h
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 #ifndef __G_MESSAGES_H__
28 #define __G_MESSAGES_H__
29
30 #include <stdarg.h>
31 #include <glib/gtypes.h>
32
33 /* Suppress warnings when GCC is in -pedantic mode and not -std=c99
34  */
35 #if (__GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
36 #pragma GCC system_header
37 #endif
38
39 G_BEGIN_DECLS
40
41 /* calculate a string size, guarranteed to fit format + args.
42  */
43 gsize   g_printf_string_upper_bound (const gchar* format,
44                                      va_list      args);
45
46 /* Log level shift offset for user defined
47  * log levels (0-7 are used by GLib).
48  */
49 #define G_LOG_LEVEL_USER_SHIFT  (8)
50
51 /* Glib log levels and flags.
52  */
53 typedef enum
54 {
55   /* log flags */
56   G_LOG_FLAG_RECURSION          = 1 << 0,
57   G_LOG_FLAG_FATAL              = 1 << 1,
58
59   /* GLib log levels */
60   G_LOG_LEVEL_ERROR             = 1 << 2,       /* always fatal */
61   G_LOG_LEVEL_CRITICAL          = 1 << 3,
62   G_LOG_LEVEL_WARNING           = 1 << 4,
63   G_LOG_LEVEL_MESSAGE           = 1 << 5,
64   G_LOG_LEVEL_INFO              = 1 << 6,
65   G_LOG_LEVEL_DEBUG             = 1 << 7,
66
67   G_LOG_LEVEL_MASK              = ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL)
68 } GLogLevelFlags;
69
70 /* GLib log levels that are considered fatal by default */
71 #define G_LOG_FATAL_MASK        (G_LOG_FLAG_RECURSION | G_LOG_LEVEL_ERROR)
72
73 typedef void            (*GLogFunc)             (const gchar   *log_domain,
74                                                  GLogLevelFlags log_level,
75                                                  const gchar   *message,
76                                                  gpointer       user_data);
77
78 /* Logging mechanism
79  */
80 guint           g_log_set_handler       (const gchar    *log_domain,
81                                          GLogLevelFlags  log_levels,
82                                          GLogFunc        log_func,
83                                          gpointer        user_data);
84 void            g_log_remove_handler    (const gchar    *log_domain,
85                                          guint           handler_id);
86 void            g_log_default_handler   (const gchar    *log_domain,
87                                          GLogLevelFlags  log_level,
88                                          const gchar    *message,
89                                          gpointer        unused_data);
90 void            g_log                   (const gchar    *log_domain,
91                                          GLogLevelFlags  log_level,
92                                          const gchar    *format,
93                                          ...) G_GNUC_PRINTF (3, 4);
94 void            g_logv                  (const gchar    *log_domain,
95                                          GLogLevelFlags  log_level,
96                                          const gchar    *format,
97                                          va_list         args);
98 GLogLevelFlags  g_log_set_fatal_mask    (const gchar    *log_domain,
99                                          GLogLevelFlags  fatal_mask);
100 GLogLevelFlags  g_log_set_always_fatal  (GLogLevelFlags  fatal_mask);
101
102 #ifndef G_LOG_DOMAIN
103 #define G_LOG_DOMAIN    ((gchar*) 0)
104 #endif  /* G_LOG_DOMAIN */
105 #ifdef G_HAVE_ISO_VARARGS
106 #define g_error(...)    g_log (G_LOG_DOMAIN,         \
107                                G_LOG_LEVEL_ERROR,    \
108                                __VA_ARGS__)
109 #define g_message(...)  g_log (G_LOG_DOMAIN,         \
110                                G_LOG_LEVEL_MESSAGE,  \
111                                __VA_ARGS__)
112 #define g_critical(...) g_log (G_LOG_DOMAIN,         \
113                                G_LOG_LEVEL_CRITICAL, \
114                                __VA_ARGS__)
115 #define g_warning(...)  g_log (G_LOG_DOMAIN,         \
116                                G_LOG_LEVEL_WARNING,  \
117                                __VA_ARGS__)
118 #elif defined(G_HAVE_GNUC_VARARGS)
119 #define g_error(format...)      g_log (G_LOG_DOMAIN,         \
120                                        G_LOG_LEVEL_ERROR,    \
121                                        format)
122 #define g_message(format...)    g_log (G_LOG_DOMAIN,         \
123                                        G_LOG_LEVEL_MESSAGE,  \
124                                        format)
125 #define g_critical(format...)   g_log (G_LOG_DOMAIN,         \
126                                        G_LOG_LEVEL_CRITICAL, \
127                                        format)
128 #define g_warning(format...)    g_log (G_LOG_DOMAIN,         \
129                                        G_LOG_LEVEL_WARNING,  \
130                                        format)
131 #else   /* no varargs macros */
132 static void
133 g_error (const gchar *format,
134          ...)
135 {
136   va_list args;
137   va_start (args, format);
138   g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, format, args);
139   va_end (args);
140 }
141 static void
142 g_message (const gchar *format,
143            ...)
144 {
145   va_list args;
146   va_start (args, format);
147   g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, format, args);
148   va_end (args);
149 }
150 static void
151 g_critical (const gchar *format,
152             ...)
153 {
154   va_list args;
155   va_start (args, format);
156   g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, format, args);
157   va_end (args);
158 }
159 static void
160 g_warning (const gchar *format,
161            ...)
162 {
163   va_list args;
164   va_start (args, format);
165   g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, format, args);
166   va_end (args);
167 }
168 #endif  /* !__GNUC__ */
169
170 typedef void    (*GPrintFunc)           (const gchar    *string);
171 void            g_print                 (const gchar    *format,
172                                          ...) G_GNUC_PRINTF (1, 2);
173 GPrintFunc      g_set_print_handler     (GPrintFunc      func);
174 void            g_printerr              (const gchar    *format,
175                                          ...) G_GNUC_PRINTF (1, 2);
176 GPrintFunc      g_set_printerr_handler  (GPrintFunc      func);
177
178
179 /* Provide macros for error handling. The "assert" macros will
180  *  exit on failure. The "return" macros will exit the current
181  *  function. Two different definitions are given for the macros
182  *  if G_DISABLE_ASSERT is not defined, in order to support gcc's
183  *  __PRETTY_FUNCTION__ capability.
184  */
185
186 #ifdef G_DISABLE_ASSERT
187
188 #define g_assert(expr)          G_STMT_START{ }G_STMT_END
189 #define g_assert_not_reached()  G_STMT_START{ }G_STMT_END
190
191 #else /* !G_DISABLE_ASSERT */
192
193 #ifdef __GNUC__
194
195 #define g_assert(expr)                  G_STMT_START{           \
196      if (expr) { } else                                         \
197        g_log (G_LOG_DOMAIN,                                     \
198               G_LOG_LEVEL_ERROR,                                \
199               "file %s: line %d (%s): assertion failed: (%s)",  \
200               __FILE__,                                         \
201               __LINE__,                                         \
202               __PRETTY_FUNCTION__,                              \
203               #expr);                   }G_STMT_END
204
205 #define g_assert_not_reached()          G_STMT_START{           \
206      g_log (G_LOG_DOMAIN,                                       \
207             G_LOG_LEVEL_ERROR,                                  \
208             "file %s: line %d (%s): should not be reached",     \
209             __FILE__,                                           \
210             __LINE__,                                           \
211             __PRETTY_FUNCTION__);       }G_STMT_END
212
213 #else /* !__GNUC__ */
214
215 #define g_assert(expr)                  G_STMT_START{           \
216      if (expr) { } else                                         \
217        g_log (G_LOG_DOMAIN,                                     \
218               G_LOG_LEVEL_ERROR,                                \
219               "file %s: line %d: assertion failed: (%s)",       \
220               __FILE__,                                         \
221               __LINE__,                                         \
222               #expr);                   }G_STMT_END
223
224 #define g_assert_not_reached()          G_STMT_START{   \
225      g_log (G_LOG_DOMAIN,                               \
226             G_LOG_LEVEL_ERROR,                          \
227             "file %s: line %d: should not be reached",  \
228             __FILE__,                                   \
229             __LINE__);          }G_STMT_END
230
231 #endif /* __GNUC__ */
232
233 #endif /* !G_DISABLE_ASSERT */
234
235
236 #ifdef G_DISABLE_CHECKS
237
238 #define g_return_if_fail(expr)                  G_STMT_START{ }G_STMT_END
239 #define g_return_val_if_fail(expr,val)          G_STMT_START{ }G_STMT_END
240 #define g_return_if_reached()                   G_STMT_START{ return; }G_STMT_END
241 #define g_return_val_if_reached(val)            G_STMT_START{ return (val); }G_STMT_END
242
243 #else /* !G_DISABLE_CHECKS */
244
245 #ifdef __GNUC__
246
247 #define g_return_if_fail(expr)          G_STMT_START{                   \
248      if (expr) { } else                                                 \
249        {                                                                \
250          g_log (G_LOG_DOMAIN,                                           \
251                 G_LOG_LEVEL_CRITICAL,                                   \
252                 "file %s: line %d (%s): assertion `%s' failed",         \
253                 __FILE__,                                               \
254                 __LINE__,                                               \
255                 __PRETTY_FUNCTION__,                                    \
256                 #expr);                                                 \
257          return;                                                        \
258        };                               }G_STMT_END
259
260 #define g_return_val_if_fail(expr,val)  G_STMT_START{                   \
261      if (expr) { } else                                                 \
262        {                                                                \
263          g_log (G_LOG_DOMAIN,                                           \
264                 G_LOG_LEVEL_CRITICAL,                                   \
265                 "file %s: line %d (%s): assertion `%s' failed",         \
266                 __FILE__,                                               \
267                 __LINE__,                                               \
268                 __PRETTY_FUNCTION__,                                    \
269                 #expr);                                                 \
270          return (val);                                                  \
271        };                               }G_STMT_END
272
273 #define g_return_if_reached()           G_STMT_START{                   \
274      g_log (G_LOG_DOMAIN,                                               \
275             G_LOG_LEVEL_CRITICAL,                                       \
276             "file %s: line %d (%s): should not be reached",             \
277             __FILE__,                                                   \
278             __LINE__,                                                   \
279             __PRETTY_FUNCTION__);                                       \
280      return;                            }G_STMT_END
281
282 #define g_return_val_if_reached(val)    G_STMT_START{                   \
283      g_log (G_LOG_DOMAIN,                                               \
284             G_LOG_LEVEL_CRITICAL,                                       \
285             "file %s: line %d (%s): should not be reached",             \
286             __FILE__,                                                   \
287             __LINE__,                                                   \
288             __PRETTY_FUNCTION__);                                       \
289      return (val);                      }G_STMT_END
290
291 #else /* !__GNUC__ */
292
293 #define g_return_if_fail(expr)          G_STMT_START{           \
294      if (expr) { } else                                         \
295        {                                                        \
296          g_log (G_LOG_DOMAIN,                                   \
297                 G_LOG_LEVEL_CRITICAL,                           \
298                 "file %s: line %d: assertion `%s' failed",      \
299                 __FILE__,                                       \
300                 __LINE__,                                       \
301                 #expr);                                         \
302          return;                                                \
303        };                               }G_STMT_END
304
305 #define g_return_val_if_fail(expr, val) G_STMT_START{           \
306      if (expr) { } else                                         \
307        {                                                        \
308          g_log (G_LOG_DOMAIN,                                   \
309                 G_LOG_LEVEL_CRITICAL,                           \
310                 "file %s: line %d: assertion `%s' failed",      \
311                 __FILE__,                                       \
312                 __LINE__,                                       \
313                 #expr);                                         \
314          return (val);                                          \
315        };                               }G_STMT_END
316
317 #define g_return_if_reached()           G_STMT_START{           \
318      g_log (G_LOG_DOMAIN,                                       \
319             G_LOG_LEVEL_CRITICAL,                               \
320             "file %s: line %d: should not be reached",          \
321             __FILE__,                                           \
322             __LINE__);                                          \
323      return;                            }G_STMT_END
324
325 #define g_return_val_if_reached(val)    G_STMT_START{           \
326      g_log (G_LOG_DOMAIN,                                       \
327             G_LOG_LEVEL_CRITICAL,                               \
328             "file %s: line %d: should not be reached",          \
329             __FILE__,                                           \
330             __LINE__);                                          \
331      return (val);                      }G_STMT_END
332
333 #endif /* !__GNUC__ */
334
335 #endif /* !G_DISABLE_CHECKS */
336
337 G_END_DECLS
338
339 #endif /* __G_MESSAGES_H__ */
340