From a4d2a47820ad7ce26de1f52a9a11f6d466ed9610 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 26 Oct 2003 21:30:52 +0000 Subject: factor out common debugger code svn-id: r10984 --- sword2/console.cpp | 393 +++++++++++++---------------------------------------- 1 file changed, 93 insertions(+), 300 deletions(-) (limited to 'sword2/console.cpp') diff --git a/sword2/console.cpp b/sword2/console.cpp index f75b2e628f..08dbf3b9e4 100644 --- a/sword2/console.cpp +++ b/sword2/console.cpp @@ -31,12 +31,7 @@ #include "bs2/save_rest.h" #include "bs2/startup.h" -// FIXME: Much of this is copied from scumm/debugger.cpp which is a pretty -// lousy form of code reuse. - -#ifdef _WIN32_WCE -extern void force_keyboard(bool); -#endif +#include "common/debugger.cpp" namespace Sword2 { @@ -52,14 +47,9 @@ static void Var_set(int var, int val) { Debug_Printf("now %d\n", VAR(var)); } -Debugger::Debugger(Sword2Engine *s) { +Debugger::Debugger(Sword2Engine *s) + : Common::Debugger(s->_newgui) { _vm = s; - _frame_countdown = 0; - _dcmd_count = 0; - _detach_now = false; - _isAttached = false; - _errStr = NULL; - _debuggerDialog = NULL; // Register commands @@ -113,174 +103,28 @@ Debugger::Debugger(Sword2Engine *s) { DCmd_Register("polish", &Debugger::Cmd_Polish); } -void Debugger::attach(const char *entry) { - -#ifdef _WIN32_WCE - force_keyboard(true); -#endif - - if (entry) { - _errStr = strdup(entry); - } - - _frame_countdown = 1; - _detach_now = false; - _isAttached = true; +void Debugger::preEnter() { + // Pause sound output + g_sound->pauseFx(); + g_sound->pauseSpeech(); + g_sound->pauseMusic(); } -void Debugger::detach() { -#if USE_CONSOLE - if (_debuggerDialog) { - _debuggerDialog->setInputCallback(0, 0); - _debuggerDialog->setCompletionCallback(0, 0); - } -#endif +void Debugger::postEnter() { + // Resume previous sound state + g_sound->unpauseFx(); + g_sound->unpauseSpeech(); + g_sound->unpauseMusic(); -#ifdef _WIN32_WCE - force_keyboard(false); -#endif + // Restore old mouse cursor + g_display->drawMouse(); - _detach_now = false; - _isAttached = false; } -// Temporary execution handler -void Debugger::onFrame() { - if (_frame_countdown == 0) - return; - --_frame_countdown; - - if (!_frame_countdown) { - // Pause sound output - - g_sound->pauseFx(); - g_sound->pauseSpeech(); - g_sound->pauseMusic(); - - // Enter debugger - enter(); - - // Resume previous sound state - - g_sound->unpauseFx(); - g_sound->unpauseSpeech(); - g_sound->unpauseMusic(); - - // Restore old mouse cursor - g_display->drawMouse(); - - // Detach if we're finished with the debugger - if (_detach_now) - detach(); - } -} - -// Console handler -#if USE_CONSOLE -bool Debugger::debuggerInputCallback(ConsoleDialog *console, const char *input, void *refCon) { - Debugger *debugger = (Debugger *) refCon; - - return debugger->RunCommand(input); -} - -bool Debugger::debuggerCompletionCallback(ConsoleDialog *console, const char *input, char*& completion, void *refCon) { - Debugger *debugger = (Debugger *) refCon; - - return debugger->TabComplete(input, completion); -} -#endif /////////////////////////////////////////////////// // Now the fun stuff: -void Debugger::DCmd_Register(const char *cmdname, DebugProc pointer) { - assert(_dcmd_count < (int) sizeof(_dcmds)); - strcpy(_dcmds[_dcmd_count].name, cmdname); - _dcmds[_dcmd_count].function = pointer; - - _dcmd_count++; -} - -// Main Debugger Loop -void Debugger::enter() { -#if USE_CONSOLE - if (!_debuggerDialog) { - _debuggerDialog = new ConsoleDialog(_vm->_newgui, 1.0, 0.67F); - - Debug_Printf("Debugger started, type 'exit' to return to the game.\n"); - Debug_Printf("Type 'help' to see a little list of commands and variables.\n"); - } - - if (_errStr) { - Debug_Printf("ERROR: %s\n\n", _errStr); - free(_errStr); - _errStr = NULL; - } - - _debuggerDialog->setInputCallback(debuggerInputCallback, this); - _debuggerDialog->setCompletionCallback(debuggerCompletionCallback, this); - _debuggerDialog->runModal(); -#else - // TODO: compared to the console input, this here is very bare bone. - // For example, no support for tab completion and no history. At least - // we should re-add (optional) support for the readline library. - // Or maybe instead of choosing between a console dialog and stdio, - // we should move that choice into the ConsoleDialog class - that is, - // the console dialog code could be #ifdef'ed to not print to the dialog - // but rather to stdio. This way, we could also reuse the command history - // and tab completion of the console. It would still require a lot of - // work, but at least no dependency on a 3rd party library... - - printf("Debugger entered, please switch to this console for input.\n"); - - int i; - char buf[256]; - - do { - printf("debug> "); - if (!fgets(buf, sizeof(buf), stdin)) - return; - - i = strlen(buf); - while (i > 0 && buf[i - 1] == '\n') - buf[--i] = 0; - - if (i == 0) - continue; - } while (RunCommand(buf)); - -#endif -} - -// Command execution loop -bool Debugger::RunCommand(const char *inputOrig) { - int i = 0, num_params = 0; - const char *param[256]; - char *input = strdup(inputOrig); // One of the rare occasions using strdup is OK (although avoiding strtok might be more elegant here). - - // Parse out any params - char *tok = strtok(input, " "); - if (tok) { - do { - param[num_params++] = tok; - } while ((tok = strtok(NULL, " ")) != NULL); - } else { - param[num_params++] = input; - } - - for (i = 0; i < _dcmd_count; i++) { - if (!strcmp(_dcmds[i].name, param[0])) { - bool result = (this->*_dcmds[i].function)(num_params, param); - free(input); - return result; - } - } - - Debug_Printf("Unknown command\n"); - free(input); - return true; -} - // Commands bool Debugger::Cmd_Exit(int argc, const char **argv) { @@ -293,20 +137,20 @@ bool Debugger::Cmd_Help(int argc, const char **argv) { // wrap around nicely int width = 0, size, i; - Debug_Printf("Commands are:\n"); + DebugPrintf("Commands are:\n"); for (i = 0 ; i < _dcmd_count ; i++) { size = strlen(_dcmds[i].name) + 1; if ((width + size) >= 39) { - Debug_Printf("\n"); + DebugPrintf("\n"); width = size; } else width += size; - Debug_Printf("%s ", _dcmds[i].name); + DebugPrintf("%s ", _dcmds[i].name); } - Debug_Printf("\n"); + DebugPrintf("\n"); return true; } @@ -316,7 +160,7 @@ bool Debugger::Cmd_Mem(int argc, const char **argv) { } bool Debugger::Cmd_Tony(int argc, const char **argv) { - Debug_Printf("What about him?\n"); + DebugPrintf("What about him?\n"); return true; } @@ -334,7 +178,7 @@ bool Debugger::Cmd_Start(int argc, const char **argv) { uint8 pal[4] = { 255, 255, 255, 0 }; if (argc != 2) { - Debug_Printf("Usage: %s number\n", argv[0]); + DebugPrintf("Usage: %s number\n", argv[0]); return true; } @@ -347,9 +191,9 @@ bool Debugger::Cmd_Info(int argc, const char **argv) { displayDebugText = !displayDebugText; if (displayDebugText) - Debug_Printf("Info text on\n"); + DebugPrintf("Info text on\n"); else - Debug_Printf("Info Text off\n"); + DebugPrintf("Info Text off\n"); return true; } @@ -358,9 +202,9 @@ bool Debugger::Cmd_WalkGrid(int argc, const char **argv) { displayWalkGrid = !displayWalkGrid; if (displayWalkGrid) - Debug_Printf("Walk-grid display on\n"); + DebugPrintf("Walk-grid display on\n"); else - Debug_Printf("Walk-grid display off\n"); + DebugPrintf("Walk-grid display off\n"); return true; } @@ -369,9 +213,9 @@ bool Debugger::Cmd_Mouse(int argc, const char **argv) { displayMouseMarker = !displayMouseMarker; if (displayMouseMarker) - Debug_Printf("Mouse marker on\n"); + DebugPrintf("Mouse marker on\n"); else - Debug_Printf("Mouse marker off\n"); + DebugPrintf("Mouse marker off\n"); return true; } @@ -380,16 +224,16 @@ bool Debugger::Cmd_Player(int argc, const char **argv) { displayPlayerMarker = !displayPlayerMarker; if (displayPlayerMarker) - Debug_Printf("Player feet marker on\n"); + DebugPrintf("Player feet marker on\n"); else - Debug_Printf("Player feet marker off\n"); + DebugPrintf("Player feet marker off\n"); return true; } bool Debugger::Cmd_ResLook(int argc, const char **argv) { if (argc != 2) - Debug_Printf("Usage: %s number\n", argv[0]); + DebugPrintf("Usage: %s number\n", argv[0]); else res_man.examine(atoi(argv[1])); return true; @@ -407,14 +251,14 @@ bool Debugger::Cmd_RunList(int argc, const char **argv) { bool Debugger::Cmd_Kill(int argc, const char **argv) { if (argc != 2) - Debug_Printf("Usage: %s number\n", argv[0]); + DebugPrintf("Usage: %s number\n", argv[0]); else res_man.kill(atoi(argv[1])); return true; } bool Debugger::Cmd_Nuke(int argc, const char **argv) { - Debug_Printf("Killing all resources except variable file and player object\n"); + DebugPrintf("Killing all resources except variable file and player object\n"); res_man.killAll(true); return true; } @@ -428,7 +272,7 @@ bool Debugger::Cmd_Var(int argc, const char **argv) { Var_set(atoi(argv[1]), atoi(argv[2])); break; default: - Debug_Printf("Usage: %s number value\n", argv[0]); + DebugPrintf("Usage: %s number value\n", argv[0]); break; } @@ -439,9 +283,9 @@ bool Debugger::Cmd_Rect(int argc, const char **argv) { definingRectangles = !definingRectangles; if (definingRectangles) - Debug_Printf("Mouse rectangles enabled\n"); + DebugPrintf("Mouse rectangles enabled\n"); else - Debug_Printf("Mouse rectangles disabled\n"); + DebugPrintf("Mouse rectangles disabled\n"); draggingRectangle = 0; return true; @@ -458,7 +302,7 @@ bool Debugger::Cmd_DebugOn(int argc, const char **argv) { displayMouseMarker = true; displayPlayerMarker = true; displayTextNumbers = true; - Debug_Printf("Enabled all on-screen debug info\n"); + DebugPrintf("Enabled all on-screen debug info\n"); return true; } @@ -468,7 +312,7 @@ bool Debugger::Cmd_DebugOff(int argc, const char **argv) { displayMouseMarker = false; displayPlayerMarker = false; displayTextNumbers = false; - Debug_Printf("Disabled all on-screen debug info\n"); + DebugPrintf("Disabled all on-screen debug info\n"); return true; } @@ -476,22 +320,22 @@ bool Debugger::Cmd_SaveRest(int argc, const char **argv) { testingSnR = !testingSnR; if (testingSnR) - Debug_Printf("Enabled S&R logic_script stability checking\n"); + DebugPrintf("Enabled S&R logic_script stability checking\n"); else - Debug_Printf("Disabled S&R logic_script stability checking\n"); + DebugPrintf("Disabled S&R logic_script stability checking\n"); return true; } bool Debugger::Cmd_ListSaveGames(int argc, const char **argv) { - Debug_Printf("Savegames:\n"); + DebugPrintf("Savegames:\n"); for (int i = 0; i < 100; i++) { uint8 description[SAVE_DESCRIPTION_LEN]; // if there is a save game print the name if (GetSaveDescription(i, description) == SR_OK) - Debug_Printf("%d: \"%s\"\n", i, description); + DebugPrintf("%d: \"%s\"\n", i, description); } return true; @@ -504,13 +348,13 @@ bool Debugger::Cmd_SaveGame(int argc, const char **argv) { uint32 rv; if (argc < 3) { - Debug_Printf("Usage: %s slot description\n", argv[0]); + DebugPrintf("Usage: %s slot description\n", argv[0]); return true; } // if mouse if off, or system menu is locked off if (mouse_status || mouse_mode_locked) { - Debug_Printf("WARNING: Cannot save game while control menu unavailable!\n"); + DebugPrintf("WARNING: Cannot save game while control menu unavailable!\n"); return true; } @@ -537,11 +381,11 @@ bool Debugger::Cmd_SaveGame(int argc, const char **argv) { rv = SaveGame(slotNo, (uint8 *) description); if (rv == SR_OK) - Debug_Printf("Saved game \"%s\" to file \"savegame.%.3d\"\n", description, slotNo); + DebugPrintf("Saved game \"%s\" to file \"savegame.%.3d\"\n", description, slotNo); else if (rv == SR_ERR_FILEOPEN) - Debug_Printf("ERROR: Cannot open file \"savegame.%.3d\"\n", slotNo); + DebugPrintf("ERROR: Cannot open file \"savegame.%.3d\"\n", slotNo); else // SR_ERR_WRITEFAIL - Debug_Printf("ERROR: Write error on file \"savegame.%.3d\"\n", slotNo); + DebugPrintf("ERROR: Write error on file \"savegame.%.3d\"\n", slotNo); return true; } @@ -552,13 +396,13 @@ bool Debugger::Cmd_RestoreGame(int argc, const char **argv) { uint32 rv; if (argc != 2) { - Debug_Printf("Usage: %s slot\n", argv[0]); + DebugPrintf("Usage: %s slot\n", argv[0]); return true; } // if mouse if off, or system menu is locked off if (mouse_status || mouse_mode_locked) { - Debug_Printf("WARNING: Cannot restore game while control menu unavailable!\n"); + DebugPrintf("WARNING: Cannot restore game while control menu unavailable!\n"); return true; } @@ -567,13 +411,13 @@ bool Debugger::Cmd_RestoreGame(int argc, const char **argv) { if (rv == SR_OK) { GetSaveDescription(slotNo, description); - Debug_Printf("Restored game \"%s\" from file \"savegame.%.3d\"\n", description, slotNo); + DebugPrintf("Restored game \"%s\" from file \"savegame.%.3d\"\n", description, slotNo); } else if (rv == SR_ERR_FILEOPEN) - Debug_Printf("ERROR: Cannot open file \"savegame.%.3d\"\n", slotNo); + DebugPrintf("ERROR: Cannot open file \"savegame.%.3d\"\n", slotNo); else if (rv == SR_ERR_INCOMPATIBLE) - Debug_Printf("ERROR: \"savegame.%.3d\" is no longer compatible with current player/variable resources\n", slotNo); + DebugPrintf("ERROR: \"savegame.%.3d\" is no longer compatible with current player/variable resources\n", slotNo); else // SR_ERR_READFAIL - Debug_Printf("ERROR: Read error on file \"savegame.%.3d\"\n", slotNo); + DebugPrintf("ERROR: Read error on file \"savegame.%.3d\"\n", slotNo); return true; } @@ -582,15 +426,15 @@ bool Debugger::Cmd_RestoreGame(int argc, const char **argv) { bool Debugger::Cmd_BltFxOn(int argc, const char **argv) { // g_display->setBltFx(); - // Debug_Printf("Blit fx enabled\n"); - Debug_Printf("FIXME: The setBltFx() function no longer exists\n"); + // DebugPrintf("Blit fx enabled\n"); + DebugPrintf("FIXME: The setBltFx() function no longer exists\n"); return true; } bool Debugger::Cmd_BltFxOff(int argc, const char **argv) { // g_display->clearBltFx(); - // Debug_Printf("Blit fx disabled\n"); - Debug_Printf("FIXME: The clearBltFx() function no longer exists\n"); + // DebugPrintf("Blit fx disabled\n"); + DebugPrintf("FIXME: The clearBltFx() function no longer exists\n"); return true; } @@ -600,13 +444,13 @@ bool Debugger::Cmd_TimeOn(int argc, const char **argv) { else if (startTime == 0) startTime = SVM_timeGetTime(); displayTime = true; - Debug_Printf("Timer display on\n"); + DebugPrintf("Timer display on\n"); return true; } bool Debugger::Cmd_TimeOff(int argc, const char **argv) { displayTime = false; - Debug_Printf("Timer display off\n"); + DebugPrintf("Timer display off\n"); return true; } @@ -614,9 +458,9 @@ bool Debugger::Cmd_Text(int argc, const char **argv) { displayTextNumbers = !displayTextNumbers; if (displayTextNumbers) - Debug_Printf("Text numbers on\n"); + DebugPrintf("Text numbers on\n"); else - Debug_Printf("Text numbers off\n"); + DebugPrintf("Text numbers off\n"); return true; } @@ -626,7 +470,7 @@ bool Debugger::Cmd_ShowVar(int argc, const char **argv) { int32 varNo; if (argc != 2) { - Debug_Printf("Usage: %s number\n", argv[0]); + DebugPrintf("Usage: %s number\n", argv[0]); return true; } @@ -643,11 +487,11 @@ bool Debugger::Cmd_ShowVar(int argc, const char **argv) { if (showVar[showVarNo] == 0) { // empty slot - add it to the list at this slot showVar[showVarNo] = varNo; - Debug_Printf("var(%d) added to the watch-list\n", varNo); + DebugPrintf("var(%d) added to the watch-list\n", varNo); } else - Debug_Printf("var(%d) already in the watch-list!\n", varNo); + DebugPrintf("var(%d) already in the watch-list!\n", varNo); } else - Debug_Printf("Sorry - no more allowed - hide one or extend the system watch-list\n"); + DebugPrintf("Sorry - no more allowed - hide one or extend the system watch-list\n"); return true; } @@ -657,7 +501,7 @@ bool Debugger::Cmd_HideVar(int argc, const char **argv) { int32 varNo; if (argc != 2) { - Debug_Printf("Usage: %s number\n", argv[0]); + DebugPrintf("Usage: %s number\n", argv[0]); return true; } @@ -670,9 +514,9 @@ bool Debugger::Cmd_HideVar(int argc, const char **argv) { if (showVarNo < MAX_SHOWVARS) { // We've found 'varNo' in the list - clear this slot showVar[showVarNo] = 0; - Debug_Printf("var(%d) removed from watch-list\n", varNo); + DebugPrintf("var(%d) removed from watch-list\n", varNo); } else - Debug_Printf("Sorry - can't find var(%d) in the list\n", varNo); + DebugPrintf("Sorry - can't find var(%d) in the list\n", varNo); return true; } @@ -713,30 +557,30 @@ bool Debugger::Cmd_Version(int argc, const char **argv) { dateStamp[24] = 0; // fudge over the newline character! #endif - Debug_Printf("\"Broken Sword II\" (c) Revolution Software 1997.\n"); + DebugPrintf("\"Broken Sword II\" (c) Revolution Software 1997.\n"); #if 0 - Debug_Printf("v%s created on %s for %s\n", version, dateStamp, unencoded_name + HEAD_LEN); + DebugPrintf("v%s created on %s for %s\n", version, dateStamp, unencoded_name + HEAD_LEN); #endif #if 0 // THE FOLLOWING LINES ARE TO BE COMMENTED OUT OF THE FINAL VERSION - Debug_Printf("This program has a personalised fingerprint encrypted into the code.\n"); - Debug_Printf("If this CD was not sent directly to you by Virgin Interactive or Revolution Software\n"); - Debug_Printf("then please contact James Long at Revolution on (+44) 1904 639698.\n"); + DebugPrintf("This program has a personalised fingerprint encrypted into the code.\n"); + DebugPrintf("If this CD was not sent directly to you by Virgin Interactive or Revolution Software\n"); + DebugPrintf("then please contact James Long at Revolution on (+44) 1904 639698.\n"); #endif return true; } bool Debugger::Cmd_SoftHard(int argc, const char **argv) { - Debug_Printf("ScummVM doesn't distinguish between software and hardware rendering.\n"); + DebugPrintf("ScummVM doesn't distinguish between software and hardware rendering.\n"); return true; } bool Debugger::Cmd_AnimTest(int argc, const char **argv) { if (argc != 2) { - Debug_Printf("Usage: %s value\n", argv[0]); + DebugPrintf("Usage: %s value\n", argv[0]); return true; } @@ -746,13 +590,13 @@ bool Debugger::Cmd_AnimTest(int argc, const char **argv) { // Same as typing "VAR 912 " at the console Var_set(912, atoi(argv[1])); - Debug_Printf("Setting flag 'system_testing_anims'\n"); + DebugPrintf("Setting flag 'system_testing_anims'\n"); return true; } bool Debugger::Cmd_TextTest(int argc, const char **argv) { if (argc != 2) { - Debug_Printf("Usage: %s value\n", argv[0]); + DebugPrintf("Usage: %s value\n", argv[0]); return true; } @@ -764,14 +608,14 @@ bool Debugger::Cmd_TextTest(int argc, const char **argv) { displayTextNumbers = true; - Debug_Printf("Setting flag 'system_testing_text'\n"); - Debug_Printf("Text numbers on\n"); + DebugPrintf("Setting flag 'system_testing_text'\n"); + DebugPrintf("Text numbers on\n"); return true; } bool Debugger::Cmd_LineTest(int argc, const char **argv) { if (argc != 3) { - Debug_Printf("Usage: %s value1 value2\n", argv[0]); + DebugPrintf("Usage: %s value1 value2\n", argv[0]); return true; } @@ -786,37 +630,37 @@ bool Debugger::Cmd_LineTest(int argc, const char **argv) { displayTextNumbers = true; - Debug_Printf("Setting flag 'system_testing_text'\n"); - Debug_Printf("Setting flag 'system_test_line_no'\n"); - Debug_Printf("Text numbers on\n"); + DebugPrintf("Setting flag 'system_testing_text'\n"); + DebugPrintf("Setting flag 'system_test_line_no'\n"); + DebugPrintf("Text numbers on\n"); return true; } bool Debugger::Cmd_Grab(int argc, const char **argv) { - Debug_Printf("FIXME: Continuous screen-grabbing not implemented\n"); + DebugPrintf("FIXME: Continuous screen-grabbing not implemented\n"); #if 0 grabbingSequences = !grabbingSequences; if (grabbingSequences) - Debug_Printf("PCX-grabbing enabled\n"); + DebugPrintf("PCX-grabbing enabled\n"); else - Debug_Printf("PCX-grabbing disabled\n"); + DebugPrintf("PCX-grabbing disabled\n"); #endif return true; } bool Debugger::Cmd_Events(int argc, const char **argv) { - Debug_Printf("EVENT LIST:\n"); + DebugPrintf("EVENT LIST:\n"); for (uint32 i = 0; i < MAX_events; i++) { if (event_list[i].id) { uint32 target = event_list[i].id; uint32 script = event_list[i].interact_id; - Debug_Printf("slot %d: id = %s (%d)\n", i, FetchObjectName(target), target); - Debug_Printf(" script = %s (%d) pos %d\n", FetchObjectName(script / 65536), script / 65536, script % 65536); + DebugPrintf("slot %d: id = %s (%d)\n", i, FetchObjectName(target), target); + DebugPrintf(" script = %s (%d) pos %d\n", FetchObjectName(script / 65536), script / 65536, script % 65536); } } @@ -827,79 +671,28 @@ bool Debugger::Cmd_Sfx(int argc, const char **argv) { wantSfxDebug = !wantSfxDebug; if (wantSfxDebug) - Debug_Printf("SFX logging activated\n"); + DebugPrintf("SFX logging activated\n"); else - Debug_Printf("SFX logging deactivated\n"); + DebugPrintf("SFX logging deactivated\n"); return true; } bool Debugger::Cmd_English(int argc, const char **argv) { g_sword2->initialiseFontResourceFlags(DEFAULT_TEXT); - Debug_Printf("Default fonts selected\n"); + DebugPrintf("Default fonts selected\n"); return true; } bool Debugger::Cmd_Finnish(int argc, const char **argv) { g_sword2->initialiseFontResourceFlags(FINNISH_TEXT); - Debug_Printf("Finnish fonts selected\n"); + DebugPrintf("Finnish fonts selected\n"); return true; } bool Debugger::Cmd_Polish(int argc, const char **argv) { g_sword2->initialiseFontResourceFlags(POLISH_TEXT); - Debug_Printf("Polish fonts selected\n"); - return true; -} - -// returns true if something has been completed -// completion has to be delete[]-ed then -bool Debugger::TabComplete(const char *input, char*& completion) { - // very basic tab completion - // for now it just supports command completions - - // adding completions of command parameters would be nice (but hard) :-) - // maybe also give a list of possible command completions? - // (but this will require changes to console) - - if (strchr(input, ' ')) - return false; // already finished the first word - - unsigned int inputlen = strlen(input); - - unsigned int matchlen = 0; - char match[30]; // the max. command name is 30 chars - - for (int i = 0; i < _dcmd_count; i++) { - if (!strncmp(_dcmds[i].name, input, inputlen)) { - unsigned int commandlen = strlen(_dcmds[i].name); - if (commandlen == inputlen) { // perfect match - return false; - } - if (commandlen > inputlen) { // possible match - // no previous match - if (matchlen == 0) { - strcpy(match, _dcmds[i].name + inputlen); - matchlen = commandlen - inputlen; - } else { - // take common prefix of previous match and this command - unsigned int j; - for (j = 0; j < matchlen; j++) { - if (match[j] != _dcmds[i].name[inputlen + j]) break; - } - matchlen = j; - } - if (matchlen == 0) - return false; - } - } - } - if (matchlen == 0) - return false; - - completion = new char[matchlen + 1]; - memcpy(completion, match, matchlen); - completion[matchlen] = 0; + DebugPrintf("Polish fonts selected\n"); return true; } -- cgit v1.2.3