2 * Copyright (C) 2008 - 2016 The Geeqie Team
4 * Authors: Vladimir Nadvornik, Laurent Monin
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include "logwindow.h"
25 #include "ui_fileops.h"
27 #include <glib/gprintf.h>
33 static gchar *regexp = NULL;
35 static gboolean log_msg_cb(gpointer data)
38 log_window_append(buf, LOG_MSG);
44 * @brief Appends a user information message to the log window queue
45 * @param data The message
48 * If the first word of the message is either "error" or "warning"
49 * (case insensitive) the message is color-coded appropriately
51 static gboolean log_normal_cb(gpointer data)
54 gchar *buf_casefold = g_utf8_casefold(buf, -1);
55 gchar *error_casefold = g_utf8_casefold(_("error"), -1);
56 gchar *warning_casefold = g_utf8_casefold(_("warning"), -1);
58 if (buf_casefold == g_strstr_len(buf_casefold, -1, error_casefold))
60 log_window_append(buf, LOG_ERROR);
62 else if (buf_casefold == g_strstr_len(buf_casefold, -1, warning_casefold))
64 log_window_append(buf, LOG_WARN);
68 log_window_append(buf, LOG_NORMAL);
73 g_free(error_casefold);
74 g_free(warning_casefold);
78 void log_domain_print_message(const gchar *domain, gchar *buf)
82 gint ret_comp, ret_exec;
84 buf_nl = g_strconcat(buf, "\n", NULL);
86 if (regexp && command_line)
88 ret_comp = regcomp(®ex, regexp, 0);
91 ret_exec = regexec(®ex, buf_nl, 0, NULL, 0);
95 print_term(FALSE, buf_nl);
96 if (strcmp(domain, DOMAIN_INFO) == 0)
97 g_idle_add(log_normal_cb, buf_nl);
99 g_idle_add(log_msg_cb, buf_nl);
106 print_term(FALSE, buf_nl);
107 if (strcmp(domain, DOMAIN_INFO) == 0)
108 g_idle_add(log_normal_cb, buf_nl);
110 g_idle_add(log_msg_cb, buf_nl);
115 void log_domain_print_debug(const gchar *domain, const gchar *file_name, const gchar *function_name,
116 int line_number, const gchar *format, ...)
123 va_start(ap, format);
124 message = g_strdup_vprintf(format, ap);
127 if (options && options->log_window.timer_data)
129 location = g_strdup_printf("%s:%s:%s:%d:", get_exec_time(), file_name,
130 function_name, line_number);
134 location = g_strdup_printf("%s:%s:%d:", file_name, function_name, line_number);
137 buf = g_strconcat(location, message, NULL);
138 log_domain_print_message(domain,buf);
143 void log_domain_printf(const gchar *domain, const gchar *format, ...)
148 va_start(ap, format);
149 buf = g_strdup_vprintf(format, ap);
152 log_domain_print_message(domain, buf);
156 * Debugging only functions
161 static gint debug_level = DEBUG_LEVEL_MIN;
164 gint get_debug_level(void)
169 void set_debug_level(gint new_level)
171 debug_level = CLAMP(new_level, DEBUG_LEVEL_MIN, DEBUG_LEVEL_MAX);
174 void debug_level_add(gint delta)
176 set_debug_level(debug_level + delta);
179 gint required_debug_level(gint level)
181 return (debug_level >= level);
184 static gint timeval_delta(struct timeval *result, struct timeval *x, struct timeval *y)
186 if (x->tv_usec < y->tv_usec)
188 gint nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
189 y->tv_usec -= 1000000 * nsec;
193 if (x->tv_usec - y->tv_usec > 1000000)
195 gint nsec = (x->tv_usec - y->tv_usec) / 1000000;
196 y->tv_usec += 1000000 * nsec;
200 result->tv_sec = x->tv_sec - y->tv_sec;
201 result->tv_usec = x->tv_usec - y->tv_usec;
203 return x->tv_sec < y->tv_sec;
206 const gchar *get_exec_time(void)
208 static gchar timestr[30];
209 static struct timeval start_tv = {0, 0};
210 static struct timeval previous = {0, 0};
211 static gint started = 0;
213 struct timeval tv = {0, 0};
214 static struct timeval delta = {0, 0};
216 gettimeofday(&tv, NULL);
218 if (start_tv.tv_sec == 0) start_tv = tv;
220 tv.tv_sec -= start_tv.tv_sec;
221 if (tv.tv_usec >= start_tv.tv_usec)
222 tv.tv_usec -= start_tv.tv_usec;
225 tv.tv_usec += 1000000 - start_tv.tv_usec;
229 if (started) timeval_delta(&delta, &tv, &previous);
234 g_snprintf(timestr, sizeof(timestr), "%5d.%06d (+%05d.%06d)", (gint)tv.tv_sec, (gint)tv.tv_usec, (gint)delta.tv_sec, (gint)delta.tv_usec);
239 void init_exec_time(void)
244 void set_regexp(gchar *cmd_regexp)
246 regexp = g_strdup(cmd_regexp);
249 gchar *get_regexp(void)
251 return g_strdup(regexp);
255 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */