23 #include <glib/gprintf.h>
25 #include "libsigrok-internal.h"
28 #define LOG_PREFIX "log"
49 static int sr_logv(
void *cb_data,
int loglevel,
const char *format,
59 static void *sr_log_cb_data = NULL;
62 #define LOGLEVEL_TIMESTAMP SR_LOG_DBG
64 static int64_t sr_log_start_time = 0;
85 if (loglevel < SR_LOG_NONE || loglevel >
SR_LOG_SPEW) {
86 sr_err(
"Invalid loglevel %d.", loglevel);
90 if (loglevel >= LOGLEVEL_TIMESTAMP && sr_log_start_time == 0)
91 sr_log_start_time = g_get_monotonic_time();
93 cur_loglevel = loglevel;
95 sr_dbg(
"libsigrok loglevel set to %d.", loglevel);
130 sr_err(
"%s: cb was NULL", __func__);
137 sr_log_cb_data = cb_data;
158 sr_log_cb_data = NULL;
180 *cb_data = sr_log_cb_data;
185 static int sr_logv(
void *cb_data,
int loglevel,
const char *format, va_list args)
187 uint64_t elapsed_us, minutes;
188 unsigned int rest_us, seconds, microseconds;
189 char *raw_output, *output;
190 int raw_len, raw_idx, idx, ret;
197 if (cur_loglevel >= LOGLEVEL_TIMESTAMP) {
198 elapsed_us = g_get_monotonic_time() - sr_log_start_time;
200 minutes = elapsed_us / G_TIME_SPAN_MINUTE;
201 rest_us = elapsed_us % G_TIME_SPAN_MINUTE;
202 seconds = rest_us / G_TIME_SPAN_SECOND;
203 microseconds = rest_us % G_TIME_SPAN_SECOND;
205 ret = g_fprintf(stderr,
"sr: [%.2" PRIu64
":%.2u.%.6u] ",
206 minutes, seconds, microseconds);
208 ret = fputs(
"sr: ", stderr);
211 if (ret < 0 || (raw_len = g_vasprintf(&raw_output, format, args)) < 0)
214 output = g_malloc0(raw_len + 1);
218 while (raw_idx < raw_len) {
219 if (raw_output[raw_idx] !=
'\n') {
220 output[idx] = raw_output[raw_idx];
226 g_fprintf(stderr,
"%s\n", output);
235 SR_PRIV int sr_log(
int loglevel,
const char *format, ...)
241 if (loglevel > cur_loglevel)
244 va_start(args, format);
245 ret = sr_log_cb(sr_log_cb_data, loglevel, format, args);
Generic/unspecified error.
int sr_log_callback_set(sr_log_callback cb, void *cb_data)
Set the libsigrok log callback to the specified function.
Output very noisy debug messages.
int(* sr_log_callback)(void *cb_data, int loglevel, const char *format, va_list args)
The public libsigrok header file to be used by frontends.
int sr_log_callback_get(sr_log_callback *cb, void **cb_data)
Get the libsigrok log callback routine and callback data.
int sr_log_loglevel_set(int loglevel)
Set the libsigrok loglevel.
int sr_log_loglevel_get(void)
Get the libsigrok loglevel.
int sr_log_callback_set_default(void)
Set the libsigrok log callback to the default built-in one.