+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
/*
* 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
} 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);
#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)
/*
/* 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);
}
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);