#include "stdafx.h" #include #include #include "ttd.h" #include "console.h" #include "debug.h" int _debug_ai_level; int _debug_grf_level; int _debug_map_level; int _debug_misc_level; int _debug_ms_level; int _debug_net_level; int _debug_spritecache_level; int _debug_oldloader_level; void CDECL debug(const char *s, ...) { va_list va; char buf[1024]; va_start(va, s); vsnprintf(buf, lengthof(buf), s, va); va_end(va); fprintf(stderr, "dbg: %s\n", buf); IConsoleDebug(buf); } void SetDebugString(const char *s) { int v; char *end; const char *t; typedef struct DebugLevel { const char* name; int* level; } DebugLevel; #define DEBUG_LEVEL(x) { #x, &_debug_##x##_level } static const DebugLevel debug_level[] = { DEBUG_LEVEL(ai), DEBUG_LEVEL(grf), DEBUG_LEVEL(map), DEBUG_LEVEL(misc), DEBUG_LEVEL(ms), DEBUG_LEVEL(net), DEBUG_LEVEL(spritecache), DEBUG_LEVEL(oldloader) }; #undef DEBUG_LEVEL // global debugging level? if (*s >= '0' && *s <= '9') { const DebugLevel *i; v = strtoul(s, &end, 0); s = end; for (i = debug_level; i != endof(debug_level); ++i) *i->level = v; } // individual levels for(;;) { const DebugLevel *i; int *p; // skip delimiters while (*s == ' ' || *s == ',' || *s == '\t') s++; if (*s == '\0') break; t = s; while (*s >= 'a' && *s <= 'z') s++; // check debugging levels p = NULL; for (i = debug_level; i != endof(debug_level); ++i) if (s == t + strlen(i->name) && strncmp(t, i->name, s - t) == 0) { p = i->level; break; } if (*s == '=') s++; v = strtoul(s, &end, 0); s = end; if (p != NULL) *p = v; else { ShowInfoF("Unknown debug level '%.*s'", s - t, t); return; } } }