Files @ r5427:5c600ac28c4a
Branch filter:

Location: cpp/openttd-patchpack/source/debug.h - annotation

rubidium
(svn r7631) -Fix (r1): some pointer arithmetic gave the number of entries instead of the number of bytes to move when removing the animated state from a tile. This caused desyncs between Little and Big Endian machines. Thanks to pv2b for helping me in locating the bug and to Darkvater for figuring out that the arithmetic returned the number of entries instead of bytes.
r2186:5ee653b1b5e1
r2186:5ee653b1b5e1
r1299:07d5483b3f76
r1299:07d5483b3f76
r1299:07d5483b3f76
r5380:f5fecf6b34ff
r5380:f5fecf6b34ff
r5380:f5fecf6b34ff
r5380:f5fecf6b34ff
r5380:f5fecf6b34ff
r5380:f5fecf6b34ff
r5380:f5fecf6b34ff
r5380:f5fecf6b34ff
r5380:f5fecf6b34ff
r5380:f5fecf6b34ff
r5380:f5fecf6b34ff
r5380:f5fecf6b34ff
r5380:f5fecf6b34ff
r5380:f5fecf6b34ff
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r1299:07d5483b3f76
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5390:6ade5b2a57c6
r5390:6ade5b2a57c6
r5390:6ade5b2a57c6
r5390:6ade5b2a57c6
r1299:07d5483b3f76
r1299:07d5483b3f76
r2210:ed1be54700ae
r1299:07d5483b3f76
r1299:07d5483b3f76
r1299:07d5483b3f76
r1299:07d5483b3f76
r1299:07d5483b3f76
r5380:f5fecf6b34ff
r1322:ac830d6af496
r2125:87ebf6378cb6
r1678:650b403b6981
r3900:1c2675abec23
r5108:28640689af54
r5380:f5fecf6b34ff
r1299:07d5483b3f76
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r5406:c6fe43d7e590
r1299:07d5483b3f76
r1299:07d5483b3f76
r1847:b42491f4b815
r1299:07d5483b3f76
r3851:fd05b4f9daad
r3851:fd05b4f9daad
r5406:c6fe43d7e590
r3341:9e6b46ee7ba7
r5406:c6fe43d7e590
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r5380:f5fecf6b34ff
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r3341:9e6b46ee7ba7
r2436:963efe8b84cc
/* $Id$ */

#ifndef DEBUG_H
#define DEBUG_H

/* Debugging messages policy:
 * These should be the severities used for direct DEBUG() calls
 * maximum debugging level should be 10 if really deep, deep
 * debugging is needed.
 * (there is room for exceptions, but you have to have a good cause):
 * 0   - errors or severe warnings
 * 1   - other non-fatal, non-severe warnings
 * 2   - crude progress indicator of functionality
 * 3   - important debugging messages (function entry)
 * 4   - debugging messages (crude loop status, etc.)
 * 5   - detailed debugging information
 * 6.. - extremely detailed spamming
 */

/* Of course MSVC 2003 and lower has no support for variadic macros
 * so we need to work around this... *sigh* */
#if defined(_MSC_VER) && (_MSC_VER < 1400)
	#define NO_VARARG_MACRO
#endif

#if defined(NO_VARARG_MACRO)
	enum DebugLevelType {
		ai,
		driver,
		grf,
		map,
		misc,
		ms,
		net,
		sprite,
		oldloader,
		ntp,
		npf,
		yapf,
		freetype,
		sl,
	};
#endif /* NO_VARARG_MACRO */

#ifdef NO_DEBUG_MESSAGES
	#if defined(NO_VARARG_MACRO)
		static inline void DEBUG(int name, int level, ...) {}
	#elif defined(__GNUC__) && (__GNUC__ < 3)
		#define DEBUG(name, level, args...)
	#else
		#define DEBUG(name, level, ...)
	#endif
#else /* NO_DEBUG_MESSAGES */
	#if defined(NO_VARARG_MACRO)
		void CDECL DEBUG(int name, int level, ...);
	#elif defined(__GNUC__) && (__GNUC__ < 3)
		#define DEBUG(name, level, args...) if ((level == 0) || ( _debug_ ## name ## _level >= level)) debug(#name, args)
	#else
		#define DEBUG(name, level, ...) if (level == 0 || _debug_ ## name ## _level >= level) debug(#name, __VA_ARGS__)
	#endif

	extern int _debug_ai_level;
	extern int _debug_driver_level;
	extern int _debug_grf_level;
	extern int _debug_map_level;
	extern int _debug_misc_level;
	extern int _debug_ms_level;
	extern int _debug_net_level;
	extern int _debug_sprite_level;
	extern int _debug_oldloader_level;
	extern int _debug_ntp_level;
	extern int _debug_npf_level;
	extern int _debug_yapf_level;
	extern int _debug_freetype_level;
	extern int _debug_sl_level;

	#if !defined(NO_VARARG_MACRO)
		void CDECL debug(const char *dbg, ...);
	#endif /* NO_VARARG_MACRO */
#endif /* NO_DEBUG_MESSAGES */

void SetDebugString(const char *s);
const char *GetDebugString(void);

/* MSVCRT of course has to have a different syntax for long long *sigh* */
#if defined(_MSC_VER) || defined(__MINGW32__)
	#define OTTD_PRINTF64 "I64"
#else
	#define OTTD_PRINTF64 "ll"
#endif

// Used for profiling
#define TIC() {\
	extern uint64 _rdtsc(void);\
	uint64 _xxx_ = _rdtsc();\
	static uint64 __sum__ = 0;\
	static uint32 __i__ = 0;

#define TOC(str, count)\
	__sum__ += _rdtsc() - _xxx_;\
	if (++__i__ == count) {\
		DEBUG(misc, 0, "[%s] %" OTTD_PRINTF64 "u [avg: %.1f]\n", str, __sum__, __sum__/(double)__i__);\
		__i__ = 0;\
		__sum__ = 0;\
	}\
}

#endif /* DEBUG_H */