diff options
author | EuAndreh <eu@euandre.org> | 2024-06-12 10:39:26 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2024-06-14 13:55:37 -0300 |
commit | d4f58ba195470e180660cd551e9391af213327d7 (patch) | |
tree | 79ac2c9916afa11dac019d1ba1b6aeebe11e5669 /src | |
parent | Revert "src/int.h: Add minimized stdint.h types" (diff) | |
download | pindaiba-d4f58ba195470e180660cd551e9391af213327d7.tar.gz pindaiba-d4f58ba195470e180660cd551e9391af213327d7.tar.xz |
src/trace.h: Init tracing functions
Diffstat (limited to 'src')
-rw-r--r-- | src/trace.c | 73 | ||||
-rw-r--r-- | src/trace.h | 30 |
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, + ... +); |