williamr@2: /* GLIB - Library of useful routines for C programming williamr@2: * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald williamr@2: * Portions copyright (c) 2006 Nokia Corporation. All rights reserved. williamr@2: * williamr@2: * This library is free software; you can redistribute it and/or williamr@2: * modify it under the terms of the GNU Lesser General Public williamr@2: * License as published by the Free Software Foundation; either williamr@2: * version 2 of the License, or (at your option) any later version. williamr@2: * williamr@2: * This library is distributed in the hope that it will be useful, williamr@2: * but WITHOUT ANY WARRANTY; without even the implied warranty of williamr@2: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU williamr@2: * Lesser General Public License for more details. williamr@2: * williamr@2: * You should have received a copy of the GNU Lesser General Public williamr@2: * License along with this library; if not, write to the williamr@2: * Free Software Foundation, Inc., 59 Temple Place - Suite 330, williamr@2: * Boston, MA 02111-1307, USA. williamr@2: */ williamr@2: williamr@2: /* williamr@2: * Modified by the GLib Team and others 1997-2000. See the AUTHORS williamr@2: * file for a list of people on the GLib Team. See the ChangeLog williamr@2: * files for a list of changes. These files are distributed with williamr@2: * GLib at ftp://ftp.gtk.org/pub/gtk/. williamr@2: */ williamr@2: williamr@2: #ifndef __G_MESSAGES_H__ williamr@2: #define __G_MESSAGES_H__ williamr@2: williamr@2: #include <_ansi.h> williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: /* Suppress warnings when GCC is in -pedantic mode and not -std=c99 williamr@2: */ williamr@2: #if (__GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)) williamr@2: #pragma GCC system_header williamr@2: #endif williamr@2: williamr@2: G_BEGIN_DECLS williamr@2: williamr@2: /* calculate a string size, guaranteed to fit format + args. williamr@2: */ williamr@2: IMPORT_C gsize g_printf_string_upper_bound (const gchar* format, williamr@2: va_list args); williamr@2: williamr@2: /* Log level shift offset for user defined williamr@2: * log levels (0-7 are used by GLib). williamr@2: */ williamr@2: #define G_LOG_LEVEL_USER_SHIFT (8) williamr@2: williamr@2: /* Glib log levels and flags. williamr@2: */ williamr@2: typedef enum williamr@2: { williamr@2: /* log flags */ williamr@2: G_LOG_FLAG_RECURSION = 1 << 0, williamr@2: G_LOG_FLAG_FATAL = 1 << 1, williamr@2: williamr@2: /* GLib log levels */ williamr@2: G_LOG_LEVEL_ERROR = 1 << 2, /* always fatal */ williamr@2: G_LOG_LEVEL_CRITICAL = 1 << 3, williamr@2: G_LOG_LEVEL_WARNING = 1 << 4, williamr@2: G_LOG_LEVEL_MESSAGE = 1 << 5, williamr@2: G_LOG_LEVEL_INFO = 1 << 6, williamr@2: G_LOG_LEVEL_DEBUG = 1 << 7, williamr@2: williamr@2: G_LOG_LEVEL_MASK = ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL) williamr@2: } GLogLevelFlags; williamr@2: williamr@2: /* GLib log levels that are considered fatal by default */ williamr@2: #define G_LOG_FATAL_MASK (G_LOG_FLAG_RECURSION | G_LOG_LEVEL_ERROR) williamr@2: williamr@2: typedef void (*GLogFunc) (const gchar *log_domain, williamr@2: GLogLevelFlags log_level, williamr@2: const gchar *message, williamr@2: gpointer user_data); williamr@2: williamr@2: /* Logging mechanism williamr@2: */ williamr@2: IMPORT_C guint g_log_set_handler (const gchar *log_domain, williamr@2: GLogLevelFlags log_levels, williamr@2: GLogFunc log_func, williamr@2: gpointer user_data); williamr@2: IMPORT_C void g_log_remove_handler (const gchar *log_domain, williamr@2: guint handler_id); williamr@2: IMPORT_C void g_log_default_handler (const gchar *log_domain, williamr@2: GLogLevelFlags log_level, williamr@2: const gchar *message, williamr@2: gpointer unused_data); williamr@2: IMPORT_C GLogFunc g_log_set_default_handler (GLogFunc log_func, williamr@2: gpointer user_data); williamr@2: IMPORT_C void g_log (const gchar *log_domain, williamr@2: GLogLevelFlags log_level, williamr@2: const gchar *format, williamr@2: ...) G_GNUC_PRINTF (3, 4); williamr@2: IMPORT_C void g_logv (const gchar *log_domain, williamr@2: GLogLevelFlags log_level, williamr@2: const gchar *format, williamr@2: va_list args); williamr@2: IMPORT_C GLogLevelFlags g_log_set_fatal_mask (const gchar *log_domain, williamr@2: GLogLevelFlags fatal_mask); williamr@2: IMPORT_C GLogLevelFlags g_log_set_always_fatal (GLogLevelFlags fatal_mask); williamr@2: williamr@2: /* internal */ williamr@2: void _g_log_fallback_handler (const gchar *log_domain, williamr@2: GLogLevelFlags log_level, williamr@2: const gchar *message, williamr@2: gpointer unused_data) G_GNUC_INTERNAL; williamr@2: williamr@2: /* Internal functions, used to implement the following macros */ williamr@2: IMPORT_C void g_return_if_fail_warning (const char *log_domain, williamr@2: const char *pretty_function, williamr@2: const char *expression); williamr@2: IMPORT_C void g_assert_warning (const char *log_domain, williamr@2: const char *file, williamr@2: const int line, williamr@2: const char *pretty_function, williamr@2: const char *expression) G_GNUC_NORETURN; williamr@2: williamr@2: williamr@2: #ifndef G_LOG_DOMAIN williamr@2: #define G_LOG_DOMAIN ((gchar*) 0) williamr@2: #endif /* G_LOG_DOMAIN */ williamr@2: #ifdef G_HAVE_ISO_VARARGS williamr@2: #define g_error(...) g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_ERROR, \ williamr@2: __VA_ARGS__) williamr@2: #define g_message(...) g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_MESSAGE, \ williamr@2: __VA_ARGS__) williamr@2: #define g_critical(...) g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_CRITICAL, \ williamr@2: __VA_ARGS__) williamr@2: #define g_warning(...) g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_WARNING, \ williamr@2: __VA_ARGS__) williamr@2: #define g_debug(...) g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_DEBUG, \ williamr@2: __VA_ARGS__) williamr@2: #elif defined(G_HAVE_GNUC_VARARGS) williamr@2: #define g_error(format...) g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_ERROR, \ williamr@2: format) williamr@2: #define g_message(format...) g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_MESSAGE, \ williamr@2: format) williamr@2: #define g_critical(format...) g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_CRITICAL, \ williamr@2: format) williamr@2: #define g_warning(format...) g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_WARNING, \ williamr@2: format) williamr@2: #define g_debug(format...) g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_DEBUG, \ williamr@2: format) williamr@2: #else /* no varargs macros */ williamr@2: static void williamr@2: g_error (const gchar *format, williamr@2: ...) williamr@2: { williamr@2: va_list args; williamr@2: va_start (args, format); williamr@2: g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, format, args); williamr@2: va_end (args); williamr@2: } williamr@2: static void williamr@2: g_message (const gchar *format, williamr@2: ...) williamr@2: { williamr@2: va_list args; williamr@2: va_start (args, format); williamr@2: g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, format, args); williamr@2: va_end (args); williamr@2: } williamr@2: static void williamr@2: g_critical (const gchar *format, williamr@2: ...) williamr@2: { williamr@2: va_list args; williamr@2: va_start (args, format); williamr@2: g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, format, args); williamr@2: va_end (args); williamr@2: } williamr@2: static void williamr@2: g_warning (const gchar *format, williamr@2: ...) williamr@2: { williamr@2: va_list args; williamr@2: va_start (args, format); williamr@2: g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, format, args); williamr@2: va_end (args); williamr@2: } williamr@2: static void williamr@2: g_debug (const gchar *format, williamr@2: ...) williamr@2: { williamr@2: va_list args; williamr@2: va_start (args, format); williamr@2: g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format, args); williamr@2: va_end (args); williamr@2: } williamr@2: #endif /* !__GNUC__ */ williamr@2: williamr@2: typedef void (*GPrintFunc) (const gchar *string); williamr@2: IMPORT_C void g_print (const gchar *format, williamr@2: ...) G_GNUC_PRINTF (1, 2); williamr@2: IMPORT_C GPrintFunc g_set_print_handler (GPrintFunc func); williamr@2: IMPORT_C void g_printerr (const gchar *format, williamr@2: ...) G_GNUC_PRINTF (1, 2); williamr@2: IMPORT_C GPrintFunc g_set_printerr_handler (GPrintFunc func); williamr@2: williamr@2: williamr@2: /* Provide macros for error handling. The "assert" macros will williamr@2: * exit on failure. The "return" macros will exit the current williamr@2: * function. Two different definitions are given for the macros williamr@2: * if G_DISABLE_ASSERT is not defined, in order to support gcc's williamr@2: * __PRETTY_FUNCTION__ capability. williamr@2: */ williamr@2: williamr@2: #ifdef G_DISABLE_ASSERT williamr@2: williamr@2: #define g_assert(expr) G_STMT_START{ (void)0; }G_STMT_END williamr@2: #define g_assert_not_reached() G_STMT_START{ (void)0; }G_STMT_END williamr@2: williamr@2: #else /* !G_DISABLE_ASSERT */ williamr@2: williamr@2: #ifdef __GNUC__ williamr@2: williamr@2: #define g_assert(expr) G_STMT_START{ \ williamr@2: if G_LIKELY(expr) { } else \ williamr@2: g_assert_warning (G_LOG_DOMAIN, \ williamr@2: __FILE__, \ williamr@2: __LINE__, \ williamr@2: __PRETTY_FUNCTION__, \ williamr@2: #expr); }G_STMT_END williamr@2: williamr@2: #define g_assert_not_reached() G_STMT_START{ \ williamr@2: g_assert_warning (G_LOG_DOMAIN, \ williamr@2: __FILE__, \ williamr@2: __LINE__, \ williamr@2: __PRETTY_FUNCTION__, \ williamr@2: NULL); }G_STMT_END williamr@2: williamr@2: #else /* !__GNUC__ */ williamr@2: williamr@2: #define g_assert(expr) G_STMT_START{ \ williamr@2: if (expr) { } else \ williamr@2: g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_ERROR, \ williamr@2: "file %s: line %d: assertion failed: (%s)", \ williamr@2: __FILE__, \ williamr@2: __LINE__, \ williamr@2: #expr); }G_STMT_END williamr@2: williamr@2: #define g_assert_not_reached() G_STMT_START{ \ williamr@2: g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_ERROR, \ williamr@2: "file %s: line %d: should not be reached", \ williamr@2: __FILE__, \ williamr@2: __LINE__); }G_STMT_END williamr@2: williamr@2: #endif /* __GNUC__ */ williamr@2: williamr@2: #endif /* !G_DISABLE_ASSERT */ williamr@2: williamr@2: williamr@2: #ifdef G_DISABLE_CHECKS williamr@2: williamr@2: #define g_return_if_fail(expr) G_STMT_START{ (void)0; }G_STMT_END williamr@2: #define g_return_val_if_fail(expr,val) G_STMT_START{ (void)0; }G_STMT_END williamr@2: #define g_return_if_reached() G_STMT_START{ return; }G_STMT_END williamr@2: #define g_return_val_if_reached(val) G_STMT_START{ return (val); }G_STMT_END williamr@2: williamr@2: #else /* !G_DISABLE_CHECKS */ williamr@2: williamr@2: #ifdef __GNUC__ williamr@2: williamr@2: #define g_return_if_fail(expr) G_STMT_START{ \ williamr@2: if G_LIKELY(expr) { } else \ williamr@2: { \ williamr@2: g_return_if_fail_warning (G_LOG_DOMAIN, \ williamr@2: __PRETTY_FUNCTION__, \ williamr@2: #expr); \ williamr@2: return; \ williamr@2: }; }G_STMT_END williamr@2: williamr@2: #define g_return_val_if_fail(expr,val) G_STMT_START{ \ williamr@2: if G_LIKELY(expr) { } else \ williamr@2: { \ williamr@2: g_return_if_fail_warning (G_LOG_DOMAIN, \ williamr@2: __PRETTY_FUNCTION__, \ williamr@2: #expr); \ williamr@2: return (val); \ williamr@2: }; }G_STMT_END williamr@2: williamr@2: #define g_return_if_reached() G_STMT_START{ \ williamr@2: g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_CRITICAL, \ williamr@2: "file %s: line %d (%s): should not be reached", \ williamr@2: __FILE__, \ williamr@2: __LINE__, \ williamr@2: __PRETTY_FUNCTION__); \ williamr@2: return; }G_STMT_END williamr@2: williamr@2: #define g_return_val_if_reached(val) G_STMT_START{ \ williamr@2: g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_CRITICAL, \ williamr@2: "file %s: line %d (%s): should not be reached", \ williamr@2: __FILE__, \ williamr@2: __LINE__, \ williamr@2: __PRETTY_FUNCTION__); \ williamr@2: return (val); }G_STMT_END williamr@2: williamr@2: #else /* !__GNUC__ */ williamr@2: williamr@2: #define g_return_if_fail(expr) G_STMT_START{ \ williamr@2: if (expr) { } else \ williamr@2: { \ williamr@2: g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_CRITICAL, \ williamr@2: "file %s: line %d: assertion `%s' failed", \ williamr@2: __FILE__, \ williamr@2: __LINE__, \ williamr@2: #expr); \ williamr@2: return; \ williamr@2: }; }G_STMT_END williamr@2: williamr@2: #define g_return_val_if_fail(expr, val) G_STMT_START{ \ williamr@2: if (expr) { } else \ williamr@2: { \ williamr@2: g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_CRITICAL, \ williamr@2: "file %s: line %d: assertion `%s' failed", \ williamr@2: __FILE__, \ williamr@2: __LINE__, \ williamr@2: #expr); \ williamr@2: return (val); \ williamr@2: }; }G_STMT_END williamr@2: williamr@2: #define g_return_if_reached() G_STMT_START{ \ williamr@2: g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_CRITICAL, \ williamr@2: "file %s: line %d: should not be reached", \ williamr@2: __FILE__, \ williamr@2: __LINE__); \ williamr@2: return; }G_STMT_END williamr@2: williamr@2: #define g_return_val_if_reached(val) G_STMT_START{ \ williamr@2: g_log (G_LOG_DOMAIN, \ williamr@2: G_LOG_LEVEL_CRITICAL, \ williamr@2: "file %s: line %d: should not be reached", \ williamr@2: __FILE__, \ williamr@2: __LINE__); \ williamr@2: return (val); }G_STMT_END williamr@2: williamr@2: #endif /* !__GNUC__ */ williamr@2: williamr@2: #endif /* !G_DISABLE_CHECKS */ williamr@2: williamr@2: G_END_DECLS williamr@2: williamr@2: #endif /* __G_MESSAGES_H__ */ williamr@2: