#ifndef DEBUG_H #define DEBUG_H #include #include // Debug levels typedef enum { DEBUG_LEVEL_NONE = 0, DEBUG_LEVEL_ERROR = 1, DEBUG_LEVEL_WARN = 2, DEBUG_LEVEL_INFO = 3, DEBUG_LEVEL_DEBUG = 4, DEBUG_LEVEL_TRACE = 5 } debug_level_t; // Global debug level (set at runtime via CLI) extern debug_level_t g_debug_level; // Initialize debug system void debug_init(int level); // Core logging function void debug_log(debug_level_t level, const char* file, int line, const char* format, ...); // Convenience macros that check level before calling // Note: TRACE level (5) and above include file:line information for ALL messages #define DEBUG_ERROR(...) \ do { if (g_debug_level >= DEBUG_LEVEL_ERROR) debug_log(DEBUG_LEVEL_ERROR, __FILE__, __LINE__, __VA_ARGS__); } while(0) #define DEBUG_WARN(...) \ do { if (g_debug_level >= DEBUG_LEVEL_WARN) debug_log(DEBUG_LEVEL_WARN, __FILE__, __LINE__, __VA_ARGS__); } while(0) #define DEBUG_INFO(...) \ do { if (g_debug_level >= DEBUG_LEVEL_INFO) debug_log(DEBUG_LEVEL_INFO, __FILE__, __LINE__, __VA_ARGS__); } while(0) #define DEBUG_LOG(...) \ do { if (g_debug_level >= DEBUG_LEVEL_DEBUG) debug_log(DEBUG_LEVEL_DEBUG, __FILE__, __LINE__, __VA_ARGS__); } while(0) #define DEBUG_TRACE(...) \ do { if (g_debug_level >= DEBUG_LEVEL_TRACE) debug_log(DEBUG_LEVEL_TRACE, __FILE__, __LINE__, __VA_ARGS__); } while(0) #endif /* DEBUG_H */