#include #include #include "common.h" #include "debug.h" enum { DEBUG_NOISE_LEVEL = 5, DEBUG_INFO_LEVEL = 4, DEBUG_WARNING_LEVEL = 3, DEBUG_ERROR_LEVEL = 2, DEBUG_FATAL_LEVEL = 1 }; enum { DEBUG_DEBUG = true, DEBUG_OUTPUT_FD = 2, DEBUG_DEFAULT_LEVEL = DEBUG_WARNING_LEVEL }; typedef struct Debug { uint level; } Debug; static Debug debugInstance = { .level = DEBUG_WARNING_LEVEL }; static Debug *debug_instance(void) { return &debugInstance; } void debug_init(void) { debug_set_level(DEBUG_DEFAULT_LEVEL); } void debug_set_level(uint level) { if(level > DEBUG_NOISE_LEVEL) { ERROR(DEBUG_DEBUG, "debug_set_level out of range: %ud (%ud-%ud)", level, DEBUG_FATAL_LEVEL, DEBUG_NOISE_LEVEL); level = DEBUG_NOISE_LEVEL; } debug_instance()->level = level; } #define return_not_flagged() if(!flag) return #define debug_function(level) \ va_list args; \ return_not_flagged(); \ assert_valid(format); \ va_start(args, format); \ debug_vprint(level, format, args); \ va_end(args) static char *debugLevels[] = { [DEBUG_NOISE_LEVEL] = "NOISE", [DEBUG_INFO_LEVEL] = "INFO", [DEBUG_WARNING_LEVEL] = "WARNING", [DEBUG_ERROR_LEVEL] = "ERROR", [DEBUG_FATAL_LEVEL] = "FATAL" }; static void debug_vprint(uint level, char *format, va_list args) { if(level <= debug_instance()->level) { fprint(DEBUG_OUTPUT_FD, "fs: %s: ", debugLevels[level]); vfprint(DEBUG_OUTPUT_FD, format, args); fprint(DEBUG_OUTPUT_FD, "\n"); } } void debug_print(char *level, char *format, ...) { va_list args; assert_valid(level); assert_valid(format); va_start(args, format); fprint(DEBUG_OUTPUT_FD, "%s: ", level); vfprint(DEBUG_OUTPUT_FD, format, args); fprint(DEBUG_OUTPUT_FD, "\n"); va_end(args); } void debug_noise(bool flag, char *format, ...) { debug_function(DEBUG_NOISE_LEVEL); } void debug_info(bool flag, char *format, ...) { debug_function(DEBUG_INFO_LEVEL); } void debug_warning(bool flag, char *format, ...) { debug_function(DEBUG_WARNING_LEVEL); } void debug_error(bool flag, char *format, ...) { debug_function(DEBUG_ERROR_LEVEL); } void debug_fatal(bool flag, char *format, ...) { debug_function(DEBUG_FATAL_LEVEL); }