Fix:Core:Correct layering of android surfaces
[navit-package] / navit / debug.c
index 6bb5b2d..05fd753 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 #include <time.h>
+#include <sys/time.h>
 #include <glib.h>
+#include "config.h"
 #include "file.h"
 #include "item.h"
 #include "debug.h"
 
+#ifdef HAVE_API_ANDROID
+#include <android/log.h>
+#endif
+
+#ifdef DEBUG_WIN32_CE_MESSAGEBOX
+#include <windows.h>
+#include <windowsx.h>
+#endif
+
+int debug_level=0;
+int segv_level=0;
+int timestamp_prefix=0;
 
-int debug_level=0,segv_level=0;
 static int dummy;
 static GHashTable *debug_hash;
-static char *gdb_program;
+static const char *gdb_program;
 
 static FILE *debug_fp;
 
+#if defined(_WIN32) || defined(__CEGCC__)
+
 static void sigsegv(int sig)
 {
-#if defined(_WIN32) || defined(__CEGCC__)
+}
+
 #else
+#include <unistd.h>
+static void sigsegv(int sig)
+{
        char buffer[256];
        if (segv_level > 1)
                sprintf(buffer, "gdb -ex bt %s %d", gdb_program, getpid());
@@ -47,8 +66,8 @@ static void sigsegv(int sig)
                sprintf(buffer, "gdb -ex bt -ex detach -ex quit %s %d", gdb_program, getpid());
        system(buffer);
        exit(1);
-#endif
 }
+#endif
 
 void
 debug_init(const char *program_name)
@@ -63,23 +82,25 @@ debug_init(const char *program_name)
 static void
 debug_update_level(gpointer key, gpointer value, gpointer user_data)
 {
-       if (debug_level < (int) value)
-               debug_level=(int) value;
+       if (debug_level < GPOINTER_TO_INT(value))
+               debug_level = GPOINTER_TO_INT(value);
 }
 
 void
-debug_level_set(const char *name, int level)
+debug_level_set(const char *name, gint level)
 {
-       debug_level=0;
-       if (strcmp(name,"segv")) {
-               g_hash_table_insert(debug_hash, g_strdup(name), (gpointer) level);
-               g_hash_table_foreach(debug_hash, debug_update_level, NULL);     
-       } else {
+       if (!strcmp(name, "segv")) {
                segv_level=level;
                if (segv_level)
                        signal(SIGSEGV, sigsegv);
                else
                        signal(SIGSEGV, NULL);
+       } else if (!strcmp(name, "timestamps")) {
+               timestamp_prefix=level;
+       } else {
+               debug_level=0;
+               g_hash_table_insert(debug_hash, g_strdup(name), GINT_TO_POINTER(level));
+               g_hash_table_foreach(debug_hash, debug_update_level, NULL);
        }
 }
 
@@ -99,20 +120,66 @@ debug_new(struct attr *parent, struct attr **attrs)
 int
 debug_level_get(const char *name)
 {
-       return (int)(g_hash_table_lookup(debug_hash, name));
+       if (!debug_hash)
+               return 0;
+       return GPOINTER_TO_INT(g_hash_table_lookup(debug_hash, name));
+}
+
+static void debug_timestamp(FILE *fp)
+{
+       struct timeval tv;
+
+       if (gettimeofday(&tv, NULL) == -1)
+               return;
+       /* Timestamps are UTC */
+       fprintf(fp,
+               "%02d:%02d:%02d.%03d|",
+               (int)(tv.tv_sec/3600)%24,
+               (int)(tv.tv_sec/60)%60,
+               (int)tv.tv_sec % 60,
+               (int)tv.tv_usec/1000);
 }
 
 void
 debug_vprintf(int level, const char *module, const int mlen, const char *function, const int flen, int prefix, const char *fmt, va_list ap)
 {
+#ifdef HAVE_API_WIN32_CE
+       char buffer[4096];
+#else
        char buffer[mlen+flen+3];
+#endif
+       FILE *fp=debug_fp;
 
        sprintf(buffer, "%s:%s", module, function);
        if (debug_level_get(module) >= level || debug_level_get(buffer) >= level) {
+#if defined(DEBUG_WIN32_CE_MESSAGEBOX) || defined(HAVE_API_ANDROID)
+               char xbuffer[4096];
+               wchar_t muni[4096];
+               int len=0;
+               if (prefix) {
+                       strcpy(xbuffer,buffer);
+                       len=strlen(buffer);
+                       xbuffer[len++]=':';
+               }
+               vsprintf(xbuffer+len,fmt,ap);
+#endif
+#ifdef DEBUG_WIN32_CE_MESSAGEBOX
+               mbstowcs(muni, xbuffer, strlen(xbuffer)+1);
+               MessageBoxW(NULL, muni, TEXT("Navit - Error"), MB_APPLMODAL|MB_OK|MB_ICONERROR);
+#else
+#ifdef HAVE_API_ANDROID
+               __android_log_print(ANDROID_LOG_ERROR,"navit", "%s", xbuffer);
+#else
+               if (! fp)
+                       fp = stderr;
+               if (timestamp_prefix)
+                       debug_timestamp(fp);
                if (prefix)
-                       fprintf(debug_fp,"%s:",buffer);
-               vfprintf(debug_fp,fmt, ap);
-               fflush(debug_fp);
+                       fprintf(fp,"%s:",buffer);
+               vfprintf(fp,fmt, ap);
+               fflush(fp);
+#endif
+#endif
        }
 }