src/debug.cpp
changeset 5584 1111b4d36e35
parent 5475 2e6990a8c7c4
child 5664 846a93238ca1
equal deleted inserted replaced
5583:136d8764c7e6 5584:1111b4d36e35
       
     1 /* $Id$ */
       
     2 
       
     3 #include "stdafx.h"
       
     4 #include <stdio.h>
       
     5 #include <stdarg.h>
       
     6 #include "openttd.h"
       
     7 #include "console.h"
       
     8 #include "debug.h"
       
     9 #include "functions.h"
       
    10 #include "string.h"
       
    11 
       
    12 int _debug_ai_level;
       
    13 int _debug_driver_level;
       
    14 int _debug_grf_level;
       
    15 int _debug_map_level;
       
    16 int _debug_misc_level;
       
    17 int _debug_ms_level;
       
    18 int _debug_net_level;
       
    19 int _debug_sprite_level;
       
    20 int _debug_oldloader_level;
       
    21 int _debug_ntp_level;
       
    22 int _debug_npf_level;
       
    23 int _debug_yapf_level;
       
    24 int _debug_freetype_level;
       
    25 int _debug_sl_level;
       
    26 
       
    27 
       
    28 typedef struct DebugLevel {
       
    29 	const char *name;
       
    30 	int *level;
       
    31 } DebugLevel;
       
    32 
       
    33 #define DEBUG_LEVEL(x) { #x, &_debug_##x##_level }
       
    34 	static const DebugLevel debug_level[] = {
       
    35 	DEBUG_LEVEL(ai),
       
    36 	DEBUG_LEVEL(driver),
       
    37 	DEBUG_LEVEL(grf),
       
    38 	DEBUG_LEVEL(map),
       
    39 	DEBUG_LEVEL(misc),
       
    40 	DEBUG_LEVEL(ms),
       
    41 	DEBUG_LEVEL(net),
       
    42 	DEBUG_LEVEL(sprite),
       
    43 	DEBUG_LEVEL(oldloader),
       
    44 	DEBUG_LEVEL(ntp),
       
    45 	DEBUG_LEVEL(npf),
       
    46 	DEBUG_LEVEL(yapf),
       
    47 	DEBUG_LEVEL(freetype),
       
    48 	DEBUG_LEVEL(sl),
       
    49 	};
       
    50 #undef DEBUG_LEVEL
       
    51 
       
    52 #if !defined(NO_DEBUG_MESSAGES)
       
    53 
       
    54 /** Functionized DEBUG macro for compilers that don't support
       
    55  * variadic macros (__VA_ARGS__) such as...yes MSVC2003 and lower */
       
    56 #if defined(NO_VARARG_MACRO)
       
    57 void CDECL DEBUG(int name, int level, ...)
       
    58 {
       
    59 	va_list va;
       
    60 	const char *dbg;
       
    61 	const DebugLevel *dl = &debug_level[name];
       
    62 
       
    63 	if (level != 0 && *dl->level < level) return;
       
    64 	dbg = dl->name;
       
    65 	va_start(va, level);
       
    66 #else
       
    67 void CDECL debug(const char *dbg, ...)
       
    68 {
       
    69 	va_list va;
       
    70 	va_start(va, dbg);
       
    71 #endif /* NO_VARARG_MACRO */
       
    72 	{
       
    73 		const char *s;
       
    74 		char buf[1024];
       
    75 
       
    76 		s = va_arg(va, const char*);
       
    77 		vsnprintf(buf, lengthof(buf), s, va);
       
    78 		va_end(va);
       
    79 		fprintf(stderr, "dbg: [%s] %s\n", dbg, buf);
       
    80 		IConsoleDebug(dbg, buf);
       
    81 	}
       
    82 }
       
    83 #endif /* NO_DEBUG_MESSAGES */
       
    84 
       
    85 void SetDebugString(const char *s)
       
    86 {
       
    87 	int v;
       
    88 	char *end;
       
    89 	const char *t;
       
    90 
       
    91 	// global debugging level?
       
    92 	if (*s >= '0' && *s <= '9') {
       
    93 		const DebugLevel *i;
       
    94 
       
    95 		v = strtoul(s, &end, 0);
       
    96 		s = end;
       
    97 
       
    98 		for (i = debug_level; i != endof(debug_level); ++i) *i->level = v;
       
    99 	}
       
   100 
       
   101 	// individual levels
       
   102 	for (;;) {
       
   103 		const DebugLevel *i;
       
   104 		int *p;
       
   105 
       
   106 		// skip delimiters
       
   107 		while (*s == ' ' || *s == ',' || *s == '\t') s++;
       
   108 		if (*s == '\0') break;
       
   109 
       
   110 		t = s;
       
   111 		while (*s >= 'a' && *s <= 'z') s++;
       
   112 
       
   113 		// check debugging levels
       
   114 		p = NULL;
       
   115 		for (i = debug_level; i != endof(debug_level); ++i)
       
   116 			if (s == t + strlen(i->name) && strncmp(t, i->name, s - t) == 0) {
       
   117 				p = i->level;
       
   118 				break;
       
   119 			}
       
   120 
       
   121 		if (*s == '=') s++;
       
   122 		v = strtoul(s, &end, 0);
       
   123 		s = end;
       
   124 		if (p != NULL) {
       
   125 			*p = v;
       
   126 		} else {
       
   127 			ShowInfoF("Unknown debug level '%.*s'", s - t, t);
       
   128 			return;
       
   129 		}
       
   130 	}
       
   131 }
       
   132 
       
   133 /** Print out the current debug-level
       
   134  * Just return a string with the values of all the debug categorites
       
   135  * @return string with debug-levels
       
   136  */
       
   137 const char *GetDebugString(void)
       
   138 {
       
   139 	const DebugLevel *i;
       
   140 	static char dbgstr[100];
       
   141 	char dbgval[20];
       
   142 
       
   143 	memset(dbgstr, 0, sizeof(dbgstr));
       
   144 	i = debug_level;
       
   145 	snprintf(dbgstr, sizeof(dbgstr), "%s=%d", i->name, *i->level);
       
   146 
       
   147 	for (i++; i != endof(debug_level); i++) {
       
   148 		snprintf(dbgval, sizeof(dbgval), ", %s=%d", i->name, *i->level);
       
   149 		ttd_strlcat(dbgstr, dbgval, sizeof(dbgstr));
       
   150 	}
       
   151 
       
   152 	return dbgstr;
       
   153 }