#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, ... );