#ifndef _debug_h #define _debug_h //#define ALWAYS_ASSERT // Define this to always process ASSERT even on release builds. /* Check the header files have been included from frame.h if they * are used outside of the framework library. */ #include #if !defined(_frame_h) && !defined(FRAME_LIB_INCLUDE) #error Framework header files MUST be included from Frame.h ONLY. #endif #include #include #include "types.h" /**************************************************************************************** * * Basic debugging macro's * */ #ifdef _MSC_VER #ifdef _DEBUG #define DEBUG #endif #endif /* DBMB used to be 'show message box' */ #ifndef _MSC_VER #define DBMB(x) _db_debug x #define DBPRINTF(x) _db_debug x #define _db_debug(...) debug(LOG_NEVER, __VA_ARGS__) #else #define DBMB(x) #define DBPRINTF(x) #endif /* * * ASSERT * * Rewritten version of assert that allows a printf format text string to be passed * to ASSERT along with the condition. * * Arguments: ASSERT((condition, "Format string with variables: %d, %d", var1, var2)); */ #define ASSERT(x) #ifdef DEBUG #ifndef _MSC_VER #undef ASSERT #define ASSERT(x) wz_assert x #define wz_assert(x, ...) \ do { \ if (!(x)) { \ debug(LOG_ERROR, "Fatal error in Warzone file %s, function %s, line %d", \ __FILE__, __FUNCTION__, __LINE__); \ debug(LOG_ERROR, __VA_ARGS__); \ assert(x); \ } \ } while (FALSE) #endif #endif /* * * DBERROR * * Error message macro - use this if the error should be reported even in * production code (i.e. out of memory errors, file not found etc.) * * Arguments as for printf */ #ifndef _MSC_VER #define DBERROR(x) _debug_error x #define _debug_error(...) \ do { \ debug(LOG_ERROR, __VA_ARGS__); \ abort(); \ } while (FALSE); #else #define DBERROR(x) #endif /**************************************************************************************** * * Conditional debugging macro's that can be selectively turned on or off on a file * by file basis. * */ /* #define DEBUG_GROUP0 #define DEBUG_GROUP1 #define DEBUG_GROUP2 #define DEBUG_GROUP3 #define DEBUG_GROUP4 #define DEBUG_GROUP5 #define DEBUG_GROUP6 #define DEBUG_GROUP7 #define DEBUG_GROUP8 #define DEBUG_GROUP9 */ #ifdef DEBUG_GROUP0 #define DBP0(x) DBPRINTF(x) #define DBMB0(x) DBMB(x) #else #define DBP0(x) #define DBMB0(x) #endif #ifdef DEBUG_GROUP1 #define DBP1(x) DBPRINTF(x) #define DBMB1(x) DBMB(x) #else #define DBP1(x) #define DBMB1(x) #endif #ifdef DEBUG_GROUP2 #define DBP2(x) DBPRINTF(x) #define DBMB2(x) DBMB(x) #else #define DBP2(x) #define DBMB2(x) #endif #ifdef DEBUG_GROUP3 #define DBP3(x) DBPRINTF(x) #define DBMB3(x) DBMB(x) #else #define DBP3(x) #define DBMB3(x) #endif #ifdef DEBUG_GROUP4 #define DBP4(x) DBPRINTF(x) #define DBMB4(x) DBMB(x) #else #define DBP4(x) #define DBMB4(x) #endif #ifdef DEBUG_GROUP5 #define DBP5(x) DBPRINTF(x) #define DBMB5(x) DBMB(x) #else #define DBP5(x) #define DBMB5(x) #endif #ifdef DEBUG_GROUP6 #define DBP6(x) DBPRINTF(x) #define DBMB6(x) DBMB(x) #else #define DBP6(x) #define DBMB6(x) #endif #ifdef DEBUG_GROUP7 #define DBP7(x) DBPRINTF(x) #define DBMB7(x) DBMB(x) #else #define DBP7(x) #define DBMB7(x) #endif #ifdef DEBUG_GROUP8 #define DBP8(x) DBPRINTF(x) #define DBMB8(x) DBMB(x) #else #define DBP8(x) #define DBMB8(x) #endif #ifdef DEBUG_GROUP9 #define DBP9(x) DBPRINTF(x) #define DBMB9(x) DBMB(x) #else #define DBP9(x) #define DBMB9(x) #endif /*** *** *** New debug logging output interface below. Heavily inspired *** by similar code in Freeciv. Parts ripped directly. *** ***/ /* Want to use GCC's __attribute__ keyword to check variadic * parameters to printf-like functions, without upsetting other * compilers: put any required defines magic here. * If other compilers have something equivalent, could also * work that out here. Should this use configure stuff somehow? * --dwp */ #if defined(__GNUC__) #define wz__attribute(x) __attribute__(x) #else #define wz__attribute(x) #endif enum code_part { LOG_ALL, /* special: sets all to on */ LOG_MAIN, LOG_SOUND, LOG_VIDEO, LOG_WZ, LOG_3D, LOG_TEXTURE, LOG_NET, LOG_MEMORY, LOG_ERROR, /* special; on by default */ LOG_NEVER, /* if too verbose for anything but dedicated debugging... */ LOG_LAST /* _must_ be last! */ }; typedef void (*log_callback_fn)(const char*); void debug_init(void); void debug_to_file(char *file); void debug_use_callback(log_callback_fn use_callback); BOOL debug_enable_switch(const char *str); void debug(enum code_part part, const char *str, ...) wz__attribute((format (printf, 2, 3))); #endif