summaryrefslogtreecommitdiffstats
path: root/src/verbose.cpp
diff options
context:
space:
mode:
authorEthan Werner <mail@ethanwerner.com>2026-10-10 20:55:33 +0000
committerEthan Werner <mail@ethanwerner.com>2026-10-10 20:56:50 +0000
commitf8423ebea413605b42de23f5dd06c5479d3fa1dd (patch)
tree2612a5eb026c59e7aae01f10a1cf62f2ee43042c /src/verbose.cpp
initial commitHEADmaster
Diffstat (limited to 'src/verbose.cpp')
-rw-r--r--src/verbose.cpp55
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);
+}