#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());
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)
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);
}
}
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
}
}