diff options
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, + ... +); |