diff options
| author | Ethan Werner <mail@ethanwerner.com> | 2026-10-10 20:55:33 +0000 |
|---|---|---|
| committer | Ethan Werner <mail@ethanwerner.com> | 2026-10-10 20:56:50 +0000 |
| commit | f8423ebea413605b42de23f5dd06c5479d3fa1dd (patch) | |
| tree | 2612a5eb026c59e7aae01f10a1cf62f2ee43042c /src/verbose.cpp | |
Diffstat (limited to 'src/verbose.cpp')
| -rw-r--r-- | src/verbose.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/verbose.cpp b/src/verbose.cpp new file mode 100644 index 0000000..5de886f --- /dev/null +++ b/src/verbose.cpp @@ -0,0 +1,55 @@ +#include "verbose.h" + +#include <cjson/cJSON.h> +#include <stdio.h> +#include <stdlib.h> + +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); +} |