summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2024-06-12 10:39:26 -0300
committerEuAndreh <eu@euandre.org>2024-06-14 13:55:37 -0300
commitd4f58ba195470e180660cd551e9391af213327d7 (patch)
tree79ac2c9916afa11dac019d1ba1b6aeebe11e5669 /src
parentRevert "src/int.h: Add minimized stdint.h types" (diff)
downloadpindaiba-d4f58ba195470e180660cd551e9391af213327d7.tar.gz
pindaiba-d4f58ba195470e180660cd551e9391af213327d7.tar.xz
src/trace.h: Init tracing functions
Diffstat (limited to 'src')
-rw-r--r--src/trace.c73
-rw-r--r--src/trace.h30
2 files changed, 103 insertions, 0 deletions
diff --git a/src/trace.c b/src/trace.c
new file mode 100644
index 0000000..b37da2f
--- /dev/null
+++ b/src/trace.c
@@ -0,0 +1,73 @@
+#include "config.h"
+
+#include <assert.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <threads.h>
+
+#include "trace.h"
+
+
+
+thread_local enum TraceLevel
+TRACE_LEVEL = TraceLevel_INFO;
+
+thread_local FILE *
+TRACE_OUTPUT = NULL;
+
+
+
+void
+set_level(const enum TraceLevel level) {
+ assert(level >= TraceLevel_NONE);
+ assert(level <= TraceLevel_ERROR);
+ TRACE_LEVEL = level;
+}
+
+void
+set_output(FILE *stream) {
+ TRACE_OUTPUT = stream;
+}
+
+int
+vtrace(
+ const char *const file,
+ const char *const function,
+ const int lineno,
+ const enum TraceLevel level,
+ const char *restrict format,
+ ...
+) {
+ int rc = 0;
+
+ // FIXME: test
+ if (level < TRACE_LEVEL) {
+ return rc;
+ }
+
+ if (TRACE_OUTPUT == NULL) {
+ TRACE_OUTPUT = stderr;
+ }
+
+ // FIXME: weavify!
+ if (fprintf(TRACE_OUTPUT, "%s:%s:%d: ", file, function, lineno) < 0) {
+ perror(__FILE__ ":vtrace(): fprintf() < 0");
+ rc = -1;
+ }
+
+ va_list args;
+ va_start(args, format);
+ if (vfprintf(TRACE_OUTPUT, format, args) < 0) {
+ perror(__FILE__ ":vtrace(): vfprintf() < 0");
+ rc = -1;
+ }
+ va_end(args);
+
+ if (fprintf(TRACE_OUTPUT, "\n") < 0) {
+ perror(__FILE__ ":vtrace(): fprintf() < 0");
+ rc = -1;
+ }
+
+ return rc;
+}
diff --git a/src/trace.h b/src/trace.h
new file mode 100644
index 0000000..64e883a
--- /dev/null
+++ b/src/trace.h
@@ -0,0 +1,30 @@
+#define trace(level, ...) vtrace(__FILE__, __func__, __LINE__, level, __VA_ARGS__)
+#define debug(...) vtrace(__FILE__, __func__, __LINE__, TraceLevel_DEBUG, __VA_ARGS__)
+#define info(...) vtrace(__FILE__, __func__, __LINE__, TraceLevel_INFO, __VA_ARGS__)
+#define warning(...) vtrace(__FILE__, __func__, __LINE__, TraceLevel_WARNING, __VA_ARGS__)
+#define error(...) vtrace(__FILE__, __func__, __LINE__, TraceLevel_ERROR, __VA_ARGS__)
+
+
+
+enum TraceLevel {
+ TraceLevel_NONE = 1,
+ TraceLevel_DEBUG = 2,
+ TraceLevel_INFO = 3,
+ TraceLevel_WARNING = 4,
+ TraceLevel_ERROR = 5,
+};
+
+
+
+void
+set_level(const enum TraceLevel level);
+
+int
+vtrace(
+ const char *const file,
+ const char *const function,
+ const int lineno,
+ const enum TraceLevel level,
+ const char *restrict format,
+ ...
+);