tron@2186: /* $Id$ */ tron@2186: KUDr@6285: /** @file debug.h */ KUDr@6285: tron@1299: #ifndef DEBUG_H tron@1299: #define DEBUG_H tron@1299: Darkvater@5568: /* Debugging messages policy: Darkvater@5568: * These should be the severities used for direct DEBUG() calls Darkvater@5568: * maximum debugging level should be 10 if really deep, deep Darkvater@5568: * debugging is needed. Darkvater@5568: * (there is room for exceptions, but you have to have a good cause): Darkvater@5568: * 0 - errors or severe warnings Darkvater@5568: * 1 - other non-fatal, non-severe warnings Darkvater@5568: * 2 - crude progress indicator of functionality Darkvater@5568: * 3 - important debugging messages (function entry) Darkvater@5568: * 4 - debugging messages (crude loop status, etc.) Darkvater@5568: * 5 - detailed debugging information Darkvater@5568: * 6.. - extremely detailed spamming Darkvater@5568: */ Darkvater@5568: Darkvater@5657: /* Of course MSVC 2003 and lower has no support for variadic macros Darkvater@5657: * so we need to work around this... *sigh* */ Darkvater@5657: #if defined(_MSC_VER) && (_MSC_VER < 1400) Darkvater@5657: #define NO_VARARG_MACRO Darkvater@5657: #endif Darkvater@5657: Darkvater@5657: #if defined(NO_VARARG_MACRO) Darkvater@5657: enum DebugLevelType { Darkvater@5657: ai, Darkvater@5657: driver, Darkvater@5657: grf, Darkvater@5657: map, Darkvater@5657: misc, Darkvater@5657: ms, Darkvater@5657: net, Darkvater@5657: sprite, Darkvater@5657: oldloader, Darkvater@5657: ntp, Darkvater@5657: npf, Darkvater@5657: yapf, Darkvater@5657: freetype, Darkvater@5657: sl, KUDr@5915: station, Darkvater@5657: }; Darkvater@5657: #endif /* NO_VARARG_MACRO */ Darkvater@5657: tron@1299: #ifdef NO_DEBUG_MESSAGES Darkvater@5657: #if defined(NO_VARARG_MACRO) Darkvater@5657: static inline void DEBUG(int name, int level, ...) {} Darkvater@5657: #elif defined(__GNUC__) && (__GNUC__ < 3) Darkvater@5657: #define DEBUG(name, level, args...) Darkvater@5657: #else Darkvater@5657: #define DEBUG(name, level, ...) Darkvater@5657: #endif Darkvater@5657: #else /* NO_DEBUG_MESSAGES */ Darkvater@5657: #if defined(NO_VARARG_MACRO) Darkvater@5657: void CDECL DEBUG(int name, int level, ...); Darkvater@5657: #elif defined(__GNUC__) && (__GNUC__ < 3) celestar@5578: #define DEBUG(name, level, args...) if ((level == 0) || ( _debug_ ## name ## _level >= level)) debug(#name, args) celestar@5578: #else celestar@5578: #define DEBUG(name, level, ...) if (level == 0 || _debug_ ## name ## _level >= level) debug(#name, __VA_ARGS__) celestar@5578: #endif tron@1299: tron@1299: extern int _debug_ai_level; tron@2210: extern int _debug_driver_level; tron@1299: extern int _debug_grf_level; tron@1299: extern int _debug_map_level; tron@1299: extern int _debug_misc_level; tron@1299: extern int _debug_ms_level; tron@1299: extern int _debug_net_level; Darkvater@5568: extern int _debug_sprite_level; truelight@1322: extern int _debug_oldloader_level; ludde@2125: extern int _debug_ntp_level; matthijs@1678: extern int _debug_npf_level; KUDr@3900: extern int _debug_yapf_level; peter1138@5108: extern int _debug_freetype_level; Darkvater@5568: extern int _debug_sl_level; KUDr@5915: extern int _debug_station_level; tron@1299: Darkvater@5657: #if !defined(NO_VARARG_MACRO) Darkvater@5657: void CDECL debug(const char *dbg, ...); Darkvater@5657: #endif /* NO_VARARG_MACRO */ Darkvater@5657: #endif /* NO_DEBUG_MESSAGES */ tron@1299: tron@1299: void SetDebugString(const char *s); bjarni@6298: const char *GetDebugString(); tron@1299: glx@3851: /* MSVCRT of course has to have a different syntax for long long *sigh* */ glx@3851: #if defined(_MSC_VER) || defined(__MINGW32__) Darkvater@5657: #define OTTD_PRINTF64 "I64" Darkvater@3341: #else Darkvater@5657: #define OTTD_PRINTF64 "ll" Darkvater@3341: #endif Darkvater@3341: KUDr@6285: /* Used for profiling */ Darkvater@3341: #define TIC() {\ bjarni@6298: extern uint64 _rdtsc();\ Darkvater@3341: uint64 _xxx_ = _rdtsc();\ Darkvater@3341: static uint64 __sum__ = 0;\ Darkvater@3341: static uint32 __i__ = 0; Darkvater@3341: Darkvater@3341: #define TOC(str, count)\ Darkvater@3341: __sum__ += _rdtsc() - _xxx_;\ Darkvater@3341: if (++__i__ == count) {\ Darkvater@5568: DEBUG(misc, 0, "[%s] %" OTTD_PRINTF64 "u [avg: %.1f]\n", str, __sum__, __sum__/(double)__i__);\ Darkvater@3341: __i__ = 0;\ Darkvater@3341: __sum__ = 0;\ Darkvater@3341: }\ Darkvater@3341: } Darkvater@3341: Darkvater@2436: #endif /* DEBUG_H */