Use print_term() instead of printf(), since it handles charset conversion
[geeqie.git] / src / debug.c
1 /*
2  * Geeqie
3  * Copyright (C) 2008 The Geeqie Team
4  *
5  * Authors: Vladimir Nadvornik, Laurent Monin
6  *
7  * This software is released under the GNU General Public License (GNU GPL).
8  * Please read the included file COPYING for more information.
9  * This software comes with no warranty of any kind, use at your own risk!
10  */
11
12 #include "main.h"
13 #include "debug.h"
14
15 #include "logwindow.h"
16 #include "ui_fileops.h"
17
18 /*
19  * Logging functions
20  */
21
22 gint log_domain_printf(const char *domain, const gchar *format, ...)
23 {
24         va_list ap;
25         gchar buf[4096];
26         gint ret;
27
28         va_start(ap, format);
29         ret = vsnprintf(buf, sizeof(buf), format, ap);
30         va_end(ap);
31
32         print_term(buf);
33         if (strcmp(domain, DOMAIN_INFO) == 0)
34                 log_window_append(buf, LOG_NORMAL);
35         else
36                 log_window_append(buf, LOG_MSG);
37
38         return ret;
39 }
40
41
42 /*
43  * Debugging only functions
44  */
45
46 #ifdef DEBUG
47
48 static gint debug_level = DEBUG_LEVEL_MIN;
49
50
51 gint get_debug_level(void)
52 {
53         return debug_level;
54 }
55
56 void set_debug_level(gint new_level)
57 {
58         debug_level = CLAMP(new_level, DEBUG_LEVEL_MIN, DEBUG_LEVEL_MAX);       
59 }
60
61 void debug_level_add(gint delta)
62 {
63         set_debug_level(debug_level + delta);
64 }
65
66 gint required_debug_level(gint level)
67 {
68         return (debug_level >= level);
69 }
70
71 static gint timeval_delta(struct timeval *result, struct timeval *x, struct timeval *y)
72 {
73         if (x->tv_usec < y->tv_usec)
74                 {
75                 gint nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
76                 y->tv_usec -= 1000000 * nsec;
77                 y->tv_sec += nsec;
78                 }
79
80         if (x->tv_usec - y->tv_usec > 1000000)
81                 {
82                 gint nsec = (x->tv_usec - y->tv_usec) / 1000000;
83                 y->tv_usec += 1000000 * nsec;
84                 y->tv_sec -= nsec;
85         }
86
87         result->tv_sec = x->tv_sec - y->tv_sec;
88         result->tv_usec = x->tv_usec - y->tv_usec;
89
90         return x->tv_sec < y->tv_sec;
91 }
92
93 const gchar *get_exec_time(void)
94 {
95         static gchar timestr[30];
96         static struct timeval start_tv = {0, 0};
97         static struct timeval previous = {0, 0};
98         static gint started = 0;
99
100         struct timeval tv = {0, 0};
101         static struct timeval delta = {0, 0};
102
103         gettimeofday(&tv, NULL);
104
105         if (start_tv.tv_sec == 0) start_tv = tv;
106
107         tv.tv_sec -= start_tv.tv_sec;
108         if (tv.tv_usec >= start_tv.tv_usec)
109                 tv.tv_usec -= start_tv.tv_usec;
110         else
111                 {
112                 tv.tv_usec += 1000000 - start_tv.tv_usec;
113                 tv.tv_sec -= 1;
114                 }
115
116         if (started) timeval_delta(&delta, &tv, &previous);
117
118         previous = tv;
119         started = 1;
120
121         g_snprintf(timestr, sizeof(timestr), "%5d.%06d (+%05d.%06d)", (int)tv.tv_sec, (int)tv.tv_usec, (int)delta.tv_sec, (int)delta.tv_usec);
122
123         return timestr;
124 }
125
126 void init_exec_time(void)
127 {
128         get_exec_time();
129 }
130
131 #endif /* DEBUG */