diff options
Diffstat (limited to 'src/trace.c')
-rw-r--r-- | src/trace.c | 94 |
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; } |