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