tron@2186: /* $Id$ */ tron@2186: rubidium@10429: /** @file debug.cpp Handling of printing debug messages. */ belugas@6451: tron@1302: #include "stdafx.h" tron@1302: #include tron@1299: #include Darkvater@1891: #include "openttd.h" rubidium@10684: #include "console_func.h" tron@1299: #include "debug.h" rubidium@8710: #include "string_func.h" truelight@6210: #include "network/core/core.h" truelight@6210: truelight@6210: #if defined(ENABLE_NETWORK) truelight@6210: SOCKET _debug_socket = INVALID_SOCKET; truelight@6210: #endif /* ENABLE_NETWORK */ tron@1299: tron@1299: int _debug_ai_level; tron@2210: int _debug_driver_level; tron@1299: int _debug_grf_level; tron@1299: int _debug_map_level; tron@1299: int _debug_misc_level; tron@1299: int _debug_ms_level; tron@1299: int _debug_net_level; Darkvater@5568: int _debug_sprite_level; truelight@1322: int _debug_oldloader_level; ludde@2125: int _debug_ntp_level; matthijs@1678: int _debug_npf_level; KUDr@3900: int _debug_yapf_level; peter1138@5108: int _debug_freetype_level; Darkvater@5568: int _debug_sl_level; KUDr@5915: int _debug_station_level; smatz@10824: int _debug_gamelog_level; tron@1299: tron@1299: rubidium@6574: struct DebugLevel { Darkvater@1847: const char *name; Darkvater@1847: int *level; rubidium@6574: }; Darkvater@1847: Darkvater@1847: #define DEBUG_LEVEL(x) { #x, &_debug_##x##_level } Darkvater@1847: static const DebugLevel debug_level[] = { Darkvater@1847: DEBUG_LEVEL(ai), tron@2210: DEBUG_LEVEL(driver), Darkvater@1847: DEBUG_LEVEL(grf), Darkvater@1847: DEBUG_LEVEL(map), Darkvater@1847: DEBUG_LEVEL(misc), Darkvater@1847: DEBUG_LEVEL(ms), Darkvater@1847: DEBUG_LEVEL(net), Darkvater@5568: DEBUG_LEVEL(sprite), Darkvater@1847: DEBUG_LEVEL(oldloader), ludde@2125: DEBUG_LEVEL(ntp), KUDr@3900: DEBUG_LEVEL(npf), peter1138@5108: DEBUG_LEVEL(yapf), Darkvater@5568: DEBUG_LEVEL(freetype), Darkvater@5568: DEBUG_LEVEL(sl), KUDr@5915: DEBUG_LEVEL(station), smatz@10824: DEBUG_LEVEL(gamelog), Darkvater@1847: }; Darkvater@1847: #undef DEBUG_LEVEL tron@1299: Darkvater@5657: #if !defined(NO_DEBUG_MESSAGES) Darkvater@5657: smatz@10824: void CDECL debug_print(const char *dbg, const char *buf) Darkvater@5657: { rubidium@8905: #if defined(ENABLE_NETWORK) rubidium@8905: if (_debug_socket != INVALID_SOCKET) { smatz@10824: char buf2[1024 + 32]; rubidium@8905: rubidium@8905: snprintf(buf2, lengthof(buf2), "dbg: [%s] %s\n", dbg, buf); rubidium@10751: send(_debug_socket, buf2, (int)strlen(buf2), 0); rubidium@8905: } else truelight@6210: #endif /* ENABLE_NETWORK */ rubidium@8905: { truelight@7901: #if defined(WINCE) rubidium@8905: /* We need to do OTTD2FS twice, but as it uses a static buffer, we need to store one temporary */ rubidium@8905: TCHAR tbuf[512]; rubidium@8905: _sntprintf(tbuf, sizeof(tbuf), _T("%s"), OTTD2FS(dbg)); rubidium@8905: NKDbgPrintfW(_T("dbg: [%s] %s\n"), tbuf, OTTD2FS(buf)); truelight@7901: #else rubidium@8905: fprintf(stderr, "dbg: [%s] %s\n", dbg, buf); truelight@7901: #endif rubidium@8905: IConsoleDebug(dbg, buf); Darkvater@5657: } Darkvater@5657: } smatz@10824: smatz@10824: void CDECL debug(const char *dbg, ...) smatz@10824: { smatz@10824: va_list va; smatz@10824: va_start(va, dbg); smatz@10824: const char *s; smatz@10824: char buf[1024]; smatz@10824: smatz@10824: s = va_arg(va, const char*); smatz@10824: vsnprintf(buf, lengthof(buf), s, va); smatz@10824: va_end(va); smatz@10824: smatz@10824: debug_print(dbg, buf); smatz@10824: } Darkvater@5657: #endif /* NO_DEBUG_MESSAGES */ Darkvater@5657: tron@1299: void SetDebugString(const char *s) tron@1299: { tron@1299: int v; tron@1299: char *end; tron@1299: const char *t; tron@1299: belugas@6451: /* global debugging level? */ tron@1299: if (*s >= '0' && *s <= '9') { tron@1299: const DebugLevel *i; tron@1299: tron@1299: v = strtoul(s, &end, 0); tron@1299: s = end; tron@1299: tron@2639: for (i = debug_level; i != endof(debug_level); ++i) *i->level = v; tron@1299: } tron@1299: belugas@6451: /* individual levels */ tron@2639: for (;;) { tron@1299: const DebugLevel *i; tron@1299: int *p; tron@1299: belugas@6451: /* skip delimiters */ tron@1299: while (*s == ' ' || *s == ',' || *s == '\t') s++; tron@1299: if (*s == '\0') break; tron@1299: tron@1299: t = s; tron@1299: while (*s >= 'a' && *s <= 'z') s++; tron@1299: belugas@6451: /* check debugging levels */ tron@1299: p = NULL; tron@1299: for (i = debug_level; i != endof(debug_level); ++i) tron@1299: if (s == t + strlen(i->name) && strncmp(t, i->name, s - t) == 0) { tron@1299: p = i->level; tron@1299: break; tron@1299: } tron@1299: tron@1299: if (*s == '=') s++; tron@1299: v = strtoul(s, &end, 0); tron@1299: s = end; tron@2639: if (p != NULL) { tron@1299: *p = v; tron@2639: } else { tron@1299: ShowInfoF("Unknown debug level '%.*s'", s - t, t); tron@1299: return; tron@1299: } tron@1299: } tron@1299: } Darkvater@1847: Darkvater@1847: /** Print out the current debug-level Darkvater@1847: * Just return a string with the values of all the debug categorites Darkvater@1847: * @return string with debug-levels Darkvater@1847: */ rubidium@6573: const char *GetDebugString() Darkvater@1847: { Darkvater@1847: const DebugLevel *i; peter1138@8688: static char dbgstr[150]; Darkvater@1847: char dbgval[20]; Darkvater@1847: Darkvater@1847: memset(dbgstr, 0, sizeof(dbgstr)); Darkvater@1847: i = debug_level; Darkvater@1847: snprintf(dbgstr, sizeof(dbgstr), "%s=%d", i->name, *i->level); Darkvater@1847: Darkvater@1847: for (i++; i != endof(debug_level); i++) { Darkvater@1847: snprintf(dbgval, sizeof(dbgval), ", %s=%d", i->name, *i->level); Darkvater@1847: ttd_strlcat(dbgstr, dbgval, sizeof(dbgstr)); Darkvater@1847: } Darkvater@1847: Darkvater@1847: return dbgstr; Darkvater@1847: } rubidium@8743: rubidium@8743: #ifdef DEBUG_DUMP_COMMANDS rubidium@8743: #include "fileio.h" rubidium@8743: rubidium@8743: void CDECL DebugDumpCommands(const char *s, ...) rubidium@8743: { rubidium@8743: static FILE *f = FioFOpenFile("commands-out.log", "wb", AUTOSAVE_DIR); rubidium@8743: if (f == NULL) return; rubidium@8743: rubidium@8743: va_list va; rubidium@8743: va_start(va, s); rubidium@8743: vfprintf(f, s, va); rubidium@8743: va_end(va); rubidium@8743: rubidium@8743: fflush(f); rubidium@8743: } rubidium@8743: #endif /* DEBUG_DUMP_COMMANDS */