tron@2186: /* $Id$ */ tron@2186: 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: celestar@5592: /* Of course MSVC 2003 and lower has no support for variadic macros celestar@5592: * so we need to work around this... *sigh* */ celestar@5592: #if defined(_MSC_VER) && (_MSC_VER < 1400) celestar@5592: #define NO_VARARG_MACRO celestar@5592: #endif celestar@5592: celestar@5592: #if defined(NO_VARARG_MACRO) celestar@5592: enum DebugLevelType { celestar@5592: ai, celestar@5592: driver, celestar@5592: grf, celestar@5592: map, celestar@5592: misc, celestar@5592: ms, celestar@5592: net, celestar@5592: sprite, celestar@5592: oldloader, celestar@5592: ntp, celestar@5592: npf, celestar@5592: yapf, celestar@5592: freetype, celestar@5592: sl, celestar@5592: }; celestar@5592: #endif /* NO_VARARG_MACRO */ celestar@5592: tron@1299: #ifdef NO_DEBUG_MESSAGES celestar@5592: #if defined(NO_VARARG_MACRO) celestar@5592: static inline void DEBUG(int name, int level, ...) {} celestar@5592: #elif defined(__GNUC__) && (__GNUC__ < 3) celestar@5592: #define DEBUG(name, level, args...) celestar@5592: #else celestar@5592: #define DEBUG(name, level, ...) celestar@5592: #endif celestar@5592: #else /* NO_DEBUG_MESSAGES */ celestar@5592: #if defined(NO_VARARG_MACRO) celestar@5592: void CDECL DEBUG(int name, int level, ...); celestar@5592: #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; tron@1299: celestar@5592: #if !defined(NO_VARARG_MACRO) celestar@5592: void CDECL debug(const char *dbg, ...); celestar@5592: #endif /* NO_VARARG_MACRO */ celestar@5592: #endif /* NO_DEBUG_MESSAGES */ tron@1299: tron@1299: void SetDebugString(const char *s); Darkvater@1847: const char *GetDebugString(void); 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__) celestar@5592: #define OTTD_PRINTF64 "I64" Darkvater@3341: #else celestar@5592: #define OTTD_PRINTF64 "ll" Darkvater@3341: #endif Darkvater@3341: Darkvater@3341: // Used for profiling Darkvater@3341: #define TIC() {\ Darkvater@3341: extern uint64 _rdtsc(void);\ 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 */