diff options
author | Rodrigo Kumpera <kumpera@gmail.com> | 2014-08-23 00:55:18 +0400 |
---|---|---|
committer | Rodrigo Kumpera <kumpera@gmail.com> | 2014-08-25 22:42:22 +0400 |
commit | 989165e12fd2f260ebe1d24836675b24b3edbebd (patch) | |
tree | 95d8d1d2967058335d975f1cf8462c0d328c349f /eglib | |
parent | 7d8798c15d96acbc9c7f8d42140d1edc065ebc94 (diff) |
[eglib] Add log/print redirection functions to eglib.
Diffstat (limited to 'eglib')
-rw-r--r-- | eglib/src/eglib-remap.h | 6 | ||||
-rw-r--r-- | eglib/src/glib.h | 8 | ||||
-rw-r--r-- | eglib/src/goutput.c | 170 |
3 files changed, 93 insertions, 91 deletions
diff --git a/eglib/src/eglib-remap.h b/eglib/src/eglib-remap.h index 9b4ecf1aebc..5c918d25dab 100644 --- a/eglib/src/eglib-remap.h +++ b/eglib/src/eglib-remap.h @@ -273,3 +273,9 @@ #define g_utf8_get_char_validated monoeg_utf8_get_char_validated #define g_utf8_prev_char monoeg_utf8_prev_char #define g_utf8_to_ucs4 monoeg_utf8_to_ucs4 + + +#define g_log_default_handler monoeg_log_default_handler +#define g_log_set_default_handler monoeg_log_set_default_handler +#define g_set_print_handler monoeg_set_print_handler +#define g_set_printerr_handler monoeg_set_printerr_handler diff --git a/eglib/src/glib.h b/eglib/src/glib.h index 7cb8e6179c0..533c84116c3 100644 --- a/eglib/src/glib.h +++ b/eglib/src/glib.h @@ -603,10 +603,14 @@ void g_assertion_message (const gchar *format, ...) G_GNUC_NORETURN #define g_message(...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, __VA_ARGS__) #define g_debug(...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, __VA_ARGS__) #endif /* ndef HAVE_C99_SUPPORT */ -#define g_log_set_handler(a,b,c,d) -#define G_GNUC_INTERNAL +typedef void (*GLogFunc) (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data); +typedef void (*GPrintFunc) (const gchar *string); +void g_log_default_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer unused_data); +GLogFunc g_log_set_default_handler (GLogFunc log_func, gpointer user_data); +GPrintFunc g_set_print_handler (GPrintFunc func); +GPrintFunc g_set_printerr_handler (GPrintFunc func); /* * Conversions */ diff --git a/eglib/src/goutput.c b/eglib/src/goutput.c index 73ef1f383de..5be47852c68 100644 --- a/eglib/src/goutput.c +++ b/eglib/src/goutput.c @@ -35,85 +35,47 @@ /* The current fatal levels, error is always fatal */ static GLogLevelFlags fatal = G_LOG_LEVEL_ERROR; +static GLogFunc default_log_func; +static gpointer default_log_func_user_data; +static GPrintFunc stdout_handler, stderr_handler; -#if PLATFORM_ANDROID -#include <android/log.h> - -static android_LogPriority -to_android_priority (GLogLevelFlags log_level) -{ - switch (log_level & G_LOG_LEVEL_MASK) - { - case G_LOG_LEVEL_ERROR: return ANDROID_LOG_FATAL; - case G_LOG_LEVEL_CRITICAL: return ANDROID_LOG_ERROR; - case G_LOG_LEVEL_WARNING: return ANDROID_LOG_WARN; - case G_LOG_LEVEL_MESSAGE: return ANDROID_LOG_INFO; - case G_LOG_LEVEL_INFO: return ANDROID_LOG_DEBUG; - case G_LOG_LEVEL_DEBUG: return ANDROID_LOG_VERBOSE; - } - return ANDROID_LOG_UNKNOWN; -} - -static void -out_vfprintf (FILE *ignore, const gchar *format, va_list args) -{ - /* TODO: provide a proper app name */ - __android_log_vprint (ANDROID_LOG_ERROR, "mono", format, args); -} -#elif MONOTOUCH && defined(__arm__) -#include <asl.h> - -static int -to_asl_priority (GLogLevelFlags log_level) -{ - switch (log_level & G_LOG_LEVEL_MASK) - { - case G_LOG_LEVEL_ERROR: return ASL_LEVEL_CRIT; - case G_LOG_LEVEL_CRITICAL: return ASL_LEVEL_ERR; - case G_LOG_LEVEL_WARNING: return ASL_LEVEL_WARNING; - case G_LOG_LEVEL_MESSAGE: return ASL_LEVEL_NOTICE; - case G_LOG_LEVEL_INFO: return ASL_LEVEL_INFO; - case G_LOG_LEVEL_DEBUG: return ASL_LEVEL_DEBUG; - } - return ASL_LEVEL_ERR; -} - -static void -out_vfprintf (FILE *ignore, const gchar *format, va_list args) -{ - asl_vlog (NULL, NULL, ASL_LEVEL_WARNING, format, args); -} - -#else -static void -out_vfprintf (FILE *file, const gchar *format, va_list args) -{ - vfprintf (file, format, args); -} -#endif +static void default_stdout_handler (const gchar *string); +static void default_stderr_handler (const gchar *string); void g_print (const gchar *format, ...) { + char *msg; va_list args; va_start (args, format); + if (vasprintf (&msg, format, args) < 0) + return; + va_end (args); - out_vfprintf (stdout, format, args); + if (!stdout_handler) + stdout_handler = default_stdout_handler; - va_end (args); + stdout_handler (msg); + free (msg); } void g_printerr (const gchar *format, ...) { + char *msg; va_list args; va_start (args, format); + if (vasprintf (&msg, format, args) < 0) + return; + va_end (args); - out_vfprintf (stderr, format, args); + if (!stderr_handler) + stderr_handler = default_stderr_handler; - va_end (args); + stdout_handler (msg); + free (msg); } GLogLevelFlags @@ -140,42 +102,16 @@ g_log_set_fatal_mask (const gchar *log_domain, GLogLevelFlags fatal_mask) void g_logv (const gchar *log_domain, GLogLevelFlags log_level, const gchar *format, va_list args) { -#if PLATFORM_ANDROID - __android_log_vprint (to_android_priority (log_level), log_domain, format, args); -#elif MONOTOUCH && defined(__arm__) - asl_vlog (NULL, NULL, to_asl_priority (log_level), format, args); -#else char *msg; + + if (!default_log_func) + default_log_func = g_log_default_handler; if (vasprintf (&msg, format, args) < 0) return; -#ifdef G_OS_WIN32 - printf ("%s%s%s\n", - log_domain != NULL ? log_domain : "", - log_domain != NULL ? ": " : "", - msg); -#else -#if MONOTOUCH - FILE *target = stderr; -#else - FILE *target = stdout; -#endif - - fprintf (target, "%s%s%s\n", - log_domain != NULL ? log_domain : "", - log_domain != NULL ? ": " : "", - msg); -#endif + default_log_func (log_domain, log_level, msg, default_log_func_user_data); free (msg); - if (log_level & fatal){ - fflush (stdout); - fflush (stderr); - } -#endif - if (log_level & fatal){ - abort (); - } } void @@ -199,3 +135,59 @@ g_assertion_message (const gchar *format, ...) abort (); } + +void +g_log_default_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer unused_data) +{ + FILE *target = stdout; + + fprintf (target, "%s%s%s\n", + log_domain != NULL ? log_domain : "", + log_domain != NULL ? ": " : "", + message); + + if (log_level & fatal) { + fflush (stdout); + fflush (stderr); + abort (); + } +} + +static void +default_stdout_handler (const gchar *string) +{ + fprintf (stdout, "%s", string); +} + +static void +default_stderr_handler (const gchar *string) +{ + fprintf (stderr, "%s", string); +} + + +GLogFunc +g_log_set_default_handler (GLogFunc log_func, gpointer user_data) +{ + GLogFunc old = default_log_func; + default_log_func = log_func; + default_log_func_user_data = user_data; + return old; +} + +GPrintFunc +g_set_print_handler (GPrintFunc func) +{ + GPrintFunc old = stdout_handler; + stdout_handler = func; + return old; +} + +GPrintFunc +g_set_printerr_handler (GPrintFunc func) +{ + GPrintFunc old = stderr_handler; + stdout_handler = func; + return old; +} + |