* src/glib.h: Rebase g_return_if_fail(), g_return_val_if_fail() in
authorJonathan Pryor <jpryor@novell.com>
Mon, 19 Apr 2010 20:56:15 +0000 (20:56 -0000)
committerJonathan Pryor <jpryor@novell.com>
Mon, 19 Apr 2010 20:56:15 +0000 (20:56 -0000)
  terms of g_critical() instead of printf, and turn g_printerr() into
  an actual function instead of a macro.
* src/goutput.c: Add Android support, sending g_print(), g_printerr(),
  and g_log() messages to the Android system log.

svn path=/trunk/mono/; revision=155763

eglib/ChangeLog
eglib/src/glib.h
eglib/src/goutput.c

index 65bb203185c99971393bfa72d6a84e3d3ed03002..ae13b72ebcb5c4face7801fec1ed3150e03f9ed4 100644 (file)
@@ -1,3 +1,11 @@
+2010-04-19  Jonathan Pryor  <jpryor@novell.com>
+
+       * src/glib.h: Rebase g_return_if_fail(), g_return_val_if_fail() in
+         terms of g_critical() instead of printf, and turn g_printerr() into
+         an actual function instead of a macro.
+       * src/goutput.c: Add Android support, sending g_print(), g_printerr(),
+         and g_log() messages to the Android system log.
+
 2010-04-16 Gonzalo Paniagua Javier <gonzalo@novell.com>
 
        * test/ptrarray.c: new tests
index ec78f6d2d080e532b74d1c81b6fe8a8e97e97353..8920d18f26b42a7f7ae46a617b774c1aab37eb07 100644 (file)
@@ -164,8 +164,8 @@ gchar*           g_win32_getlocale(void);
 /*
  * Precondition macros
  */
-#define g_return_if_fail(x)  G_STMT_START { if (!(x)) { printf ("%s:%d: assertion '%s' failed", __FILE__, __LINE__, #x); return; } } G_STMT_END
-#define g_return_val_if_fail(x,e)  G_STMT_START { if (!(x)) { printf ("%s:%d: assertion '%s' failed", __FILE__, __LINE__, #x); return (e); } } G_STMT_END
+#define g_return_if_fail(x)  G_STMT_START { if (!(x)) { g_critical ("%s:%d: assertion '%s' failed", __FILE__, __LINE__, #x); return; } } G_STMT_END
+#define g_return_val_if_fail(x,e)  G_STMT_START { if (!(x)) { g_critical ("%s:%d: assertion '%s' failed", __FILE__, __LINE__, #x); return (e); } } G_STMT_END
 
 /*
  * Hashtables
@@ -510,6 +510,7 @@ typedef enum {
 } GLogLevelFlags;
 
 void           g_print                (const gchar *format, ...);
+void           g_printerr             (const gchar *format, ...);
 GLogLevelFlags g_log_set_always_fatal (GLogLevelFlags fatal_mask);
 GLogLevelFlags 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);
@@ -522,17 +523,13 @@ void           g_assertion_message    (const gchar *format, ...) G_GNUC_NORETURN
 #define g_warning(format, ...)  g_log (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, format, __VA_ARGS__)
 #define g_message(format, ...)  g_log (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, format, __VA_ARGS__)
 #define g_debug(format, ...)    g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format, __VA_ARGS__)
-
-#define g_printerr(format, ...) fprintf (stderr, format, __VA_ARGS__)
-#else
+#else   /* HAVE_C99_SUPPORT */
 #define g_error(...)    g_log (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, __VA_ARGS__)
 #define g_critical(...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, __VA_ARGS__)
 #define g_warning(...)  g_log (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, __VA_ARGS__)
 #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__)
-
-#define g_printerr(...) fprintf (stderr, __VA_ARGS__)
-#endif
+#endif  /* ndef HAVE_C99_SUPPORT */
 #define g_log_set_handler(a,b,c,d)
 
 /*
index 3a12201735eaf0970bb52da4f23c730955a47c97..3ed6c91a27597811d457fea67a87642a7c6b301f 100644 (file)
 /* The current fatal levels, error is always fatal */
 static GLogLevelFlags fatal = G_LOG_LEVEL_ERROR;
 
+#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);
+}
+#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);
 }
 
@@ -68,10 +114,19 @@ g_logv (const gchar *log_domain, GLogLevelFlags log_level, const gchar *format,
        char *msg;
        
        vasprintf (&msg, format, args);
+#if PLATFORM_ANDROID
+       __android_log_print (to_android_priority (log_level), 
+               /* TODO: provide a proper app name */
+               "mono", "%s%s%s",
+               log_domain != NULL ? log_domain : "",
+               log_domain != NULL ? ": " : "",
+               msg);
+#else
        printf ("%s%s%s",
                log_domain != NULL ? log_domain : "",
                log_domain != NULL ? ": " : "",
                msg);
+#endif
        free (msg);
        if (log_level & fatal){
                fflush (stdout);