#include "config.h" #include #include #include #include #include #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; }