debug.c
changeset 1299 0a6510cc889b
child 1302 1e4e3e7e23aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debug.c	Sat Feb 05 15:58:59 2005 +0000
@@ -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;
+		}
+	}
+}