diff options
Diffstat (limited to 'debug.c')
-rw-r--r-- | debug.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/debug.c b/debug.c new file mode 100644 index 000000000..6639f0426 --- /dev/null +++ b/debug.c @@ -0,0 +1,93 @@ +#include <stdarg.h> +#include "stdafx.h" +#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; + + +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) + }; + #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; + } + } +} |