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)
188 uint64_t elapsed_us, minutes;
189 unsigned int rest_us, seconds, microseconds;
190 char *raw_output, *output, c;
202 ret = fputs(
"sr: ", stderr);
205 if (cur_loglevel >= LOGLEVEL_TIMESTAMP) {
206 elapsed_us = g_get_monotonic_time() - sr_log_start_time;
208 minutes = elapsed_us / G_TIME_SPAN_MINUTE;
209 rest_us = elapsed_us % G_TIME_SPAN_MINUTE;
210 seconds = rest_us / G_TIME_SPAN_SECOND;
211 microseconds = rest_us % G_TIME_SPAN_SECOND;
213 ret = g_fprintf(stderr,
"[%.2" PRIu64
":%.2u.%.6u] ",
214 minutes, seconds, microseconds);
221 print_len = g_vasprintf(&raw_output, format, args);
226 raw_len = (size_t)print_len;
229 output = g_malloc(raw_len + 1);
235 raw_ptr = raw_output;
238 if (c ==
'\r' || c ==
'\n')
246 g_fprintf(stderr,
"%s\n", output);
254 SR_PRIV int sr_log(
int loglevel,
const char *format, ...)
260 if (loglevel > cur_loglevel)
267 va_start(args, format);
268 ret = sr_log_cb(sr_log_cb_data, loglevel, format, args);
Output very noisy debug messages.
int sr_log_loglevel_get(void)
Get the libsigrok loglevel.
typedef void(__LZO_CDECL *lzo_free_func_t)(lzo_callback_p self
Generic/unspecified error.
int sr_log_callback_set_default(void)
Set the libsigrok log callback to the default built-in one.
int sr_log_callback_set(sr_log_callback cb, void *cb_data)
Set the libsigrok log callback to the specified function.
int sr_log_loglevel_set(int loglevel)
Set the libsigrok loglevel.
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_callback)(void *cb_data, int loglevel, const char *format, va_list args)