Merge with modular_map
[navit-package] / src / debug.c
1 #include <signal.h>
2 #include <stdarg.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <time.h>
7 #include <glib.h>
8 #include "file.h"
9 #include "debug.h"
10
11
12 int debug_level=0;
13 static GHashTable *debug_hash;
14
15 static void sigsegv(int sig)
16 {
17         FILE *f;
18         time_t t;
19         printf("segmentation fault received\n");
20         f=fopen("crash.txt","a");
21         setvbuf(f, NULL, _IONBF, 0);
22         fprintf(f,"segmentation fault received\n");
23         t=time(NULL);
24         fprintf(f,"Time: %s", ctime(&t));
25         file_unmap_all();
26         fprintf(f,"dumping core\n");
27         fclose(f);      
28         abort();
29 }
30
31 void
32 debug_init(void)
33 {
34 #if 0
35         signal(SIGSEGV, sigsegv);
36 #endif
37         debug_hash=g_hash_table_new(g_str_hash, g_str_equal);
38 }
39
40
41 static void
42 debug_update_level(gpointer key, gpointer value, gpointer user_data)
43 {
44         if (debug_level < (int) value)
45                 debug_level=(int) value;
46 }
47
48 void
49 debug_level_set(char *name, int level)
50 {
51         debug_level=0;
52         g_hash_table_insert(debug_hash, name, (gpointer) level);
53         g_hash_table_foreach(debug_hash, debug_update_level, NULL);     
54         debug_level_get(name);
55 }
56
57 int
58 debug_level_get(const char *name)
59 {
60         return (int)(g_hash_table_lookup(debug_hash, name));
61 }
62
63 void
64 debug_print(int level, const char *module, const char *function, const char *fmt, ...)
65 {
66         va_list ap;
67         int module_len=strlen(module);
68         int function_len=strlen(function);
69         char buffer[module_len+function_len+3];
70
71         strcpy(buffer, module);
72         buffer[module_len]=':';
73         strcpy(buffer+module_len+1, function);
74
75         if (debug_level_get(module) >= level || debug_level_get(buffer) >= level) {
76                 strcpy(buffer+module_len+function_len+1, ":");
77                 printf("%s",buffer);
78                 va_start(ap, fmt);
79                 vprintf(fmt, ap);
80                 va_end(ap);
81         }
82 }