X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=eglib%2Fsrc%2Fgoutput.c;h=69122ddda62b8fe188ccc3f6473e8d68a1a37683;hb=e2b2d181084848f3c5dde2788370db1b79893c69;hp=346eab0d774cb8969a8e0a8bb7438b33cff50e84;hpb=16f514dfc806296b257aec36bae8cfe6d94e7fcd;p=mono.git diff --git a/eglib/src/goutput.c b/eglib/src/goutput.c index 346eab0d774..69122ddda62 100644 --- a/eglib/src/goutput.c +++ b/eglib/src/goutput.c @@ -5,6 +5,8 @@ * Miguel de Icaza (miguel@novell.com) * * (C) 2006 Novell, Inc. + * Copyright 2011 Xamarin Inc. + * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including @@ -24,7 +26,7 @@ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#define _GNU_SOURCE +#include #include #include #include @@ -32,13 +34,83 @@ /* The current fatal levels, error is always fatal */ static GLogLevelFlags fatal = G_LOG_LEVEL_ERROR; +#if PLATFORM_ANDROID +#include + +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 + +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 + void g_print (const gchar *format, ...) { va_list args; va_start (args, format); - vprintf (format, args); + + out_vfprintf (stdout, format, args); + + va_end (args); +} + +void +g_printerr (const gchar *format, ...) +{ + va_list args; + + va_start (args, format); + + out_vfprintf (stderr, format, args); + va_end (args); } @@ -66,27 +138,49 @@ 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; - vasprintf (&msg, format, args); - printf ("%s%s%s", + if (vasprintf (&msg, format, args) < 0) + return; + + printf ("%s%s%s\n", log_domain != NULL ? log_domain : "", log_domain != NULL ? ": " : "", msg); free (msg); - if (log_level & fatal) + if (log_level & fatal){ + fflush (stdout); + fflush (stderr); + } +#endif + if (log_level & fatal){ abort (); + } } void g_log (const gchar *log_domain, GLogLevelFlags log_level, const gchar *format, ...) { - char *fmt; va_list args; va_start (args, format); g_logv (log_domain, log_level, format, args); - fmt = g_strdup_printf (format, args); va_end (args); } +void +g_assertion_message (const gchar *format, ...) +{ + va_list args; + + va_start (args, format); + g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, format, args); + va_end (args); + abort (); +} +