#include "verbose.h" #include #include #include static bool g_verbose = false; static void (*g_sink)(const char *, void *) = NULL; static void *g_sink_ud = NULL; void verbose_set(bool on) { g_verbose = on; } bool verbose_enabled(void) { return g_verbose; } void verbose_set_sink(void (*sink)(const char *line, void *ud), void *ud) { g_sink = sink; g_sink_ud = ud; } void verbose_log(const char *event, const vlog_kv *kvs, size_t n) { if (!g_verbose) return; cJSON *obj = cJSON_CreateObject(); cJSON_AddStringToObject(obj, "event", event); for (size_t i = 0; i < n && kvs; i++) { const vlog_kv *kv = &kvs[i]; switch (kv->kind) { case VLOG_STR: cJSON_AddStringToObject(obj, kv->key, kv->s ? kv->s : ""); break; case VLOG_INT: cJSON_AddNumberToObject(obj, kv->key, kv->i); break; case VLOG_BOOL: cJSON_AddBoolToObject(obj, kv->key, kv->b); break; case VLOG_DBL: cJSON_AddNumberToObject(obj, kv->key, kv->d); break; } } char *line = cJSON_PrintUnformatted(obj); if (line) { if (g_sink) g_sink(line, g_sink_ud); else fprintf(stderr, "%s\n", line); free(line); } cJSON_Delete(obj); }