summaryrefslogtreecommitdiff
path: root/src/trace.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/trace.c')
-rw-r--r--src/trace.c94
1 files changed, 58 insertions, 36 deletions
diff --git a/src/trace.c b/src/trace.c
index b37da2f..335ee43 100644
--- a/src/trace.c
+++ b/src/trace.c
@@ -1,73 +1,95 @@
-#include "config.h"
+#include <s.h>
#include <assert.h>
+#include <errno.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <threads.h>
+#include "logerr.h"
#include "trace.h"
-thread_local enum TraceLevel
-TRACE_LEVEL = TraceLevel_INFO;
+static thread_local enum TraceLevel
+LEVEL = TraceLevel_INFO;
-thread_local FILE *
-TRACE_OUTPUT = NULL;
+static thread_local FILE *
+STREAM = 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(
+vftracef(
const char *const file,
const char *const function,
const int lineno,
+ FILE *restrict stream,
const enum TraceLevel level,
const char *restrict format,
- ...
+ va_list args
) {
- int rc = 0;
+ if (level > LEVEL) {
+ return;
+ }
- // FIXME: test
- if (level < TRACE_LEVEL) {
- return rc;
+ if (fprintf(stream, "%s:%s:%d: ", file, function, lineno) < 0) {
+ logerr("fprintf() < 0: %s", strerror(errno));
}
- if (TRACE_OUTPUT == NULL) {
- TRACE_OUTPUT = stderr;
+ if (vfprintf(stream, format, args) < 0) {
+ perror(__FILE__ ":vtrace(): vfprintf() < 0");
}
- // FIXME: weavify!
- if (fprintf(TRACE_OUTPUT, "%s:%s:%d: ", file, function, lineno) < 0) {
+ if (fprintf(stream, "\n") < 0) {
perror(__FILE__ ":vtrace(): fprintf() < 0");
- rc = -1;
}
+}
+void
+ftracef(
+ const char *const file,
+ const char *const function,
+ const int lineno,
+ FILE *restrict stream,
+ const enum TraceLevel level,
+ const char *restrict format,
+ ...
+) {
va_list args;
va_start(args, format);
- if (vfprintf(TRACE_OUTPUT, format, args) < 0) {
- perror(__FILE__ ":vtrace(): vfprintf() < 0");
- rc = -1;
- }
+ vftracef(file, function, lineno, stream, level, format, args);
va_end(args);
+}
- if (fprintf(TRACE_OUTPUT, "\n") < 0) {
- perror(__FILE__ ":vtrace(): fprintf() < 0");
- rc = -1;
+void
+tracef(
+ const char *const file,
+ const char *const function,
+ const int lineno,
+ const enum TraceLevel level,
+ const char *restrict format,
+ ...
+) {
+ if (STREAM == NULL) {
+ STREAM = stderr;
}
+ va_list args;
+ va_start(args, format);
+ vftracef(file, function, lineno, STREAM, level, format, args);
+ va_end(args);
+}
- return rc;
+void
+trace_set_stream(FILE *stream) {
+ STREAM = stream;
+}
+
+void
+trace_set_level(const enum TraceLevel level) {
+ assert(level >= TraceLevel_NONE);
+ assert(level <= TraceLevel_DEBUG);
+ LEVEL = level;
}