[Scummvm-cvs-logs] SF.net SVN: scummvm: [23890] scummvm/trunk
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Sat Sep 16 18:59:10 CEST 2006
Revision: 23890
http://svn.sourceforge.net/scummvm/?rev=23890&view=rev
Author: fingolfin
Date: 2006-09-16 09:58:27 -0700 (Sat, 16 Sep 2006)
Log Message:
-----------
Overhaul of the debugger code
* Moved Common::Debuggger to GUI::Debugger (mainly to satisfy linker
restrictions)
* Change the base Debugger class to *not* be a template class anymore;
instead, a thin (template based) wrapper class is used to hook up
debugger commands
* Removed duplicate Cmd_Exit and Cmd_Help methods in favor of a single
version of each in GUI::Debugger
* New Cmd_Help doesn't word wrap after 39/78 chars, but rather queries
the console to determine when to wrap
* Debugger::preEnter and postEnter aren't pure virtual anymore
Modified Paths:
--------------
scummvm/trunk/engines/agi/console.cpp
scummvm/trunk/engines/agi/console.h
scummvm/trunk/engines/kyra/debugger.cpp
scummvm/trunk/engines/kyra/debugger.h
scummvm/trunk/engines/lure/debugger.cpp
scummvm/trunk/engines/lure/debugger.h
scummvm/trunk/engines/queen/debug.cpp
scummvm/trunk/engines/queen/debug.h
scummvm/trunk/engines/saga/console.cpp
scummvm/trunk/engines/saga/console.h
scummvm/trunk/engines/scumm/debugger.cpp
scummvm/trunk/engines/scumm/debugger.h
scummvm/trunk/engines/simon/debugger.cpp
scummvm/trunk/engines/simon/debugger.h
scummvm/trunk/engines/sky/debug.cpp
scummvm/trunk/engines/sky/debug.h
scummvm/trunk/engines/sword2/console.cpp
scummvm/trunk/engines/sword2/console.h
scummvm/trunk/gui/console.h
scummvm/trunk/gui/module.mk
Added Paths:
-----------
scummvm/trunk/gui/debugger.cpp
scummvm/trunk/gui/debugger.h
Removed Paths:
-------------
scummvm/trunk/common/debugger.cpp
scummvm/trunk/common/debugger.h
Deleted: scummvm/trunk/common/debugger.cpp
===================================================================
--- scummvm/trunk/common/debugger.cpp 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/common/debugger.cpp 2006-09-16 16:58:27 UTC (rev 23890)
@@ -1,411 +0,0 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2001-2006 The ScummVM project
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "common/stdafx.h"
-
-#include "common/debugger.h"
-#include "common/system.h"
-
-#if USE_CONSOLE
- #include "gui/console.h"
-#endif
-
-namespace Common {
-
-template <class T>
-Debugger<T>::Debugger() {
- _frame_countdown = 0;
- _dvar_count = 0;
- _dcmd_count = 0;
- _detach_now = false;
- _isAttached = false;
- _errStr = NULL;
- _firstTime = true;
- _debuggerDialog = new GUI::ConsoleDialog(1.0, 0.67F);
- _debuggerDialog->setInputCallback(debuggerInputCallback, this);
- _debuggerDialog->setCompletionCallback(debuggerCompletionCallback, this);
-
- DCmd_Register("debugflag_list", &Debugger<T>::Cmd_DebugFlagsList);
- DCmd_Register("debugflag_enable", &Debugger<T>::Cmd_DebugFlagEnable);
- DCmd_Register("debugflag_disable", &Debugger<T>::Cmd_DebugFlagDisable);
-}
-
-template <class T>
-Debugger<T>::~Debugger() {
- delete _debuggerDialog;
-}
-
-
-// Initialisation Functions
-template <class T>
-int Debugger<T>::DebugPrintf(const char *format, ...) {
- va_list argptr;
-
- va_start(argptr, format);
- int count;
-#if USE_CONSOLE
- count = _debuggerDialog->vprintf(format, argptr);
-#else
- count = ::vprintf(format, argptr);
-#endif
- va_end (argptr);
- return count;
-}
-
-#ifndef __SYMBIAN32__ // gcc/UIQ doesn't like the debugger code for some reason? Actually get a cc1plus core dump here :)
-template <class T>
-void Debugger<T>::attach(const char *entry) {
-
- g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
-
- if (entry) {
- _errStr = strdup(entry);
- }
-
- _frame_countdown = 1;
- _detach_now = false;
- _isAttached = true;
-}
-
-template <class T>
-void Debugger<T>::detach() {
- g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
-
- _detach_now = false;
- _isAttached = false;
-}
-
-// Temporary execution handler
-template <class T>
-void Debugger<T>::onFrame() {
- if (_frame_countdown == 0)
- return;
- --_frame_countdown;
-
- if (!_frame_countdown) {
-
- preEnter();
- enter();
- postEnter();
-
- // Detach if we're finished with the debugger
- if (_detach_now)
- detach();
- }
-}
-#endif // of ifndef __SYMBIAN32__ // gcc/UIQ doesn't like the debugger code for some reason? Actually get a cc1plus core dump here :)
-
-// Main Debugger Loop
-template <class T>
-void Debugger<T>::enter() {
-#if USE_CONSOLE
- if (_firstTime) {
- DebugPrintf("Debugger started, type 'exit' to return to the game.\n");
- DebugPrintf("Type 'help' to see a little list of commands and variables.\n");
- _firstTime = false;
- }
-
- if (_errStr) {
- DebugPrintf("ERROR: %s\n\n", _errStr);
- free(_errStr);
- _errStr = NULL;
- }
-
- _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
-template <class T>
-bool Debugger<T>::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 = (((T *)this)->*_dcmds[i].function)(num_params, param);
- free(input);
- return result;
- }
- }
-
- // It's not a command, so things get a little tricky for variables. Do fuzzy matching to ignore things like subscripts.
- for (i = 0; i < _dvar_count; i++) {
- if (!strncmp(_dvars[i].name, param[0], strlen(_dvars[i].name))) {
- if (num_params > 1) {
- // Alright, we need to check the TYPE of the variable to deref and stuff... the array stuff is a bit ugly :)
- switch (_dvars[i].type) {
- // Integer
- case DVAR_BYTE:
- *(byte *)_dvars[i].variable = atoi(param[1]);
- DebugPrintf("byte%s = %d\n", param[0], *(byte *)_dvars[i].variable);
- break;
- case DVAR_INT:
- *(int32 *)_dvars[i].variable = atoi(param[1]);
- DebugPrintf("(int)%s = %d\n", param[0], *(int32 *)_dvars[i].variable);
- break;
- // Integer Array
- case DVAR_INTARRAY: {
- char *chr = (char *)strchr(param[0], '[');
- if (!chr) {
- DebugPrintf("You must access this array as %s[element]\n", param[0]);
- } else {
- int element = atoi(chr+1);
- int32 *var = *(int32 **)_dvars[i].variable;
- if (element >= _dvars[i].optional) {
- DebugPrintf("%s is out of range (array is %d elements big)\n", param[0], _dvars[i].optional);
- } else {
- var[element] = atoi(param[1]);
- DebugPrintf("(int)%s = %d\n", param[0], var[element]);
- }
- }
- }
- break;
- default:
- DebugPrintf("Failed to set variable %s to %s - unknown type\n", _dvars[i].name, param[1]);
- break;
- }
- } else {
- // And again, type-dependent prints/defrefs. The array one is still ugly.
- switch (_dvars[i].type) {
- // Integer
- case DVAR_BYTE:
- DebugPrintf("(byte)%s = %d\n", param[0], *(const byte *)_dvars[i].variable);
- break;
- case DVAR_INT:
- DebugPrintf("(int)%s = %d\n", param[0], *(const int32 *)_dvars[i].variable);
- break;
- // Integer array
- case DVAR_INTARRAY: {
- const char *chr = strchr(param[0], '[');
- if (!chr) {
- DebugPrintf("You must access this array as %s[element]\n", param[0]);
- } else {
- int element = atoi(chr+1);
- const int32 *var = *(const int32 **)_dvars[i].variable;
- if (element >= _dvars[i].optional) {
- DebugPrintf("%s is out of range (array is %d elements big)\n", param[0], _dvars[i].optional);
- } else {
- DebugPrintf("(int)%s = %d\n", param[0], var[element]);
- }
- }
- }
- break;
- // String
- case DVAR_STRING:
- DebugPrintf("(string)%s = %s\n", param[0], ((Common::String *)_dvars[i].variable)->c_str());
- break;
- default:
- DebugPrintf("%s = (unknown type)\n", param[0]);
- break;
- }
- }
-
- free(input);
- return true;
- }
- }
-
- DebugPrintf("Unknown command or variable\n");
- free(input);
- return true;
-}
-
-// returns true if something has been completed
-// completion has to be delete[]-ed then
-template <class T>
-bool Debugger<T>::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;
- return true;
-}
-
-// Variable registration function
-template <class T>
-void Debugger<T>::DVar_Register(const char *varname, void *pointer, int type, int optional) {
- assert(_dvar_count < ARRAYSIZE(_dvars));
- strcpy(_dvars[_dvar_count].name, varname);
- _dvars[_dvar_count].type = type;
- _dvars[_dvar_count].variable = pointer;
- _dvars[_dvar_count].optional = optional;
-
- _dvar_count++;
-}
-
-// Command registration function
-template <class T>
-void Debugger<T>::DCmd_Register(const char *cmdname, DebugProc pointer) {
- assert(_dcmd_count < ARRAYSIZE(_dcmds));
- strcpy(_dcmds[_dcmd_count].name, cmdname);
- _dcmds[_dcmd_count].function = pointer;
-
- _dcmd_count++;
-}
-
-template <class T>
-bool Debugger<T>::Cmd_DebugFlagsList(int argc, const char **argv) {
- const Common::Array<Common::EngineDebugLevel> &debugLevels = Common::listSpecialDebugLevels();
-
- DebugPrintf("Engine debug levels:\n");
- DebugPrintf("--------------------\n");
- if (!debugLevels.size()) {
- DebugPrintf("No engine debug levels\n");
- return true;
- }
- for (uint i = 0; i < debugLevels.size(); ++i) {
- DebugPrintf("'%s' - Description: %s\n", debugLevels[i].option.c_str(), debugLevels[i].description.c_str());
- }
- DebugPrintf("\n");
- return true;
-}
-
-template <class T>
-bool Debugger<T>::Cmd_DebugFlagEnable(int argc, const char **argv) {
- if (argc < 2) {
- DebugPrintf("debugflag_enable <flag>\n");
- } else {
- if (Common::enableSpecialDebugLevel(argv[1])) {
- DebugPrintf("Enabled debug flag '%s'\n", argv[1]);
- } else {
- DebugPrintf("Failed to enable debug flag '%s'\n", argv[1]);
- }
- }
- return true;
-}
-
-template <class T>
-bool Debugger<T>::Cmd_DebugFlagDisable(int argc, const char **argv) {
- if (argc < 2) {
- DebugPrintf("debugflag_disable <flag>\n");
- } else {
- if (Common::disableSpecialDebugLevel(argv[1])) {
- DebugPrintf("Disabled debug flag '%s'\n", argv[1]);
- } else {
- DebugPrintf("Failed to disable debug flag '%s'\n", argv[1]);
- }
- }
- return true;
-}
-
-// Console handler
-#if USE_CONSOLE
-template <class T>
-bool Debugger<T>::debuggerInputCallback(GUI::ConsoleDialog *console, const char *input, void *refCon) {
- Debugger *debugger = (Debugger *)refCon;
-
- return debugger->RunCommand(input);
-}
-
-
-template <class T>
-bool Debugger<T>::debuggerCompletionCallback(GUI::ConsoleDialog *console, const char *input, char*& completion, void *refCon) {
- Debugger *debugger = (Debugger *)refCon;
-
- return debugger->TabComplete(input, completion);
-}
-
-#endif
-
-} // End of namespace Common
Deleted: scummvm/trunk/common/debugger.h
===================================================================
--- scummvm/trunk/common/debugger.h 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/common/debugger.h 2006-09-16 16:58:27 UTC (rev 23890)
@@ -1,110 +0,0 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2002-2006 The ScummVM project
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- */
-
-#ifndef COMMON_DEBUGGER_H
-#define COMMON_DEBUGGER_H
-
-namespace GUI {
- class ConsoleDialog;
-}
-
-namespace Common {
-
-// Choose between text console or ScummConsole
-#define USE_CONSOLE 1
-
-template <class T>
-class Debugger {
-public:
- Debugger();
- virtual ~Debugger();
-
- int DebugPrintf(const char *format, ...);
-
-#ifndef __SYMBIAN32__ // gcc/UIQ doesn't like the debugger code for some reason? Actually get a cc1plus core dump here :)
- virtual void onFrame();
-
- virtual void attach(const char *entry = 0);
-#else
- void onFrame() {}
- void attach(const char *entry = 0) {}
-#endif
- bool isAttached() const { return _isAttached; }
-
-protected:
- typedef bool (T::*DebugProc)(int argc, const char **argv);
-
- enum {
- DVAR_BYTE,
- DVAR_INT,
- DVAR_BOOL,
- DVAR_INTARRAY,
- DVAR_STRING
- };
-
- struct DVar {
- char name[30];
- void *variable;
- int type, optional;
- };
-
- struct DCmd {
- char name[30];
- DebugProc function;
- };
-
- int _frame_countdown, _dvar_count, _dcmd_count;
- DVar _dvars[256];
- DCmd _dcmds[256];
- bool _detach_now;
-
-private:
- bool _isAttached;
- char *_errStr;
- bool _firstTime;
- GUI::ConsoleDialog *_debuggerDialog;
-
-protected:
- void detach();
- void enter();
-
- virtual void preEnter() = 0;
- virtual void postEnter() = 0;
-
- bool RunCommand(const char *input);
- bool TabComplete(const char *input, char*& completion);
-
- void DVar_Register(const char *varname, void *pointer, int type, int optional);
- void DCmd_Register(const char *cmdname, DebugProc pointer);
-
- bool Cmd_DebugFlagsList(int argc, const char **argv);
- bool Cmd_DebugFlagEnable(int argc, const char **argv);
- bool Cmd_DebugFlagDisable(int argc, const char **argv);
-
-#if USE_CONSOLE
- static bool debuggerInputCallback(GUI::ConsoleDialog *console, const char *input, void *refCon);
- static bool debuggerCompletionCallback(GUI::ConsoleDialog *console, const char *input, char*& completion, void *refCon);
-#endif
-};
-
-} // End of namespace Common
-
-#endif
Modified: scummvm/trunk/engines/agi/console.cpp
===================================================================
--- scummvm/trunk/engines/agi/console.cpp 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/agi/console.cpp 2006-09-16 16:58:27 UTC (rev 23890)
@@ -32,33 +32,28 @@
#include "agi/opcodes.h"
#include "agi/console.h"
-#include "common/debugger.cpp"
-
namespace Agi {
struct agi_debug debug_;
-Console::Console(AgiEngine *vm) : Common::Debugger<Console>() {
+Console::Console(AgiEngine *vm) : GUI::Debugger() {
_vm = vm;
- DCmd_Register("debug", &Console::Cmd_Debug);
- DCmd_Register("cont", &Console::Cmd_Cont);
- DCmd_Register("exit", &Console::Cmd_Exit);
- DCmd_Register("quit", &Console::Cmd_Exit);
- DCmd_Register("help", &Console::Cmd_Help);
- DCmd_Register("agiver", &Console::Cmd_Agiver);
- DCmd_Register("crc", &Console::Cmd_Crc);
- DCmd_Register("flags", &Console::Cmd_Flags);
- DCmd_Register("logic0", &Console::Cmd_Logic0);
- DCmd_Register("objs", &Console::Cmd_Objs);
- DCmd_Register("runopcode", &Console::Cmd_RunOpcode);
- DCmd_Register("opcode", &Console::Cmd_Opcode);
- DCmd_Register("step", &Console::Cmd_Step);
- DCmd_Register("trigger", &Console::Cmd_Trigger);
- DCmd_Register("vars", &Console::Cmd_Vars);
- DCmd_Register("setvar", &Console::Cmd_SetVar);
- DCmd_Register("setflag", &Console::Cmd_SetFlag);
- DCmd_Register("setobj", &Console::Cmd_SetObj);
+ DCmd_Register("debug", WRAP_METHOD(Console, Cmd_Debug));
+ DCmd_Register("cont", WRAP_METHOD(Console, Cmd_Cont));
+ DCmd_Register("agiver", WRAP_METHOD(Console, Cmd_Agiver));
+ DCmd_Register("crc", WRAP_METHOD(Console, Cmd_Crc));
+ DCmd_Register("flags", WRAP_METHOD(Console, Cmd_Flags));
+ DCmd_Register("logic0", WRAP_METHOD(Console, Cmd_Logic0));
+ DCmd_Register("objs", WRAP_METHOD(Console, Cmd_Objs));
+ DCmd_Register("runopcode", WRAP_METHOD(Console, Cmd_RunOpcode));
+ DCmd_Register("opcode", WRAP_METHOD(Console, Cmd_Opcode));
+ DCmd_Register("step", WRAP_METHOD(Console, Cmd_Step));
+ DCmd_Register("trigger", WRAP_METHOD(Console, Cmd_Trigger));
+ DCmd_Register("vars", WRAP_METHOD(Console, Cmd_Vars));
+ DCmd_Register("setvar", WRAP_METHOD(Console, Cmd_SetVar));
+ DCmd_Register("setflag", WRAP_METHOD(Console, Cmd_SetFlag));
+ DCmd_Register("setobj", WRAP_METHOD(Console, Cmd_SetObj));
}
Console::~Console() {
@@ -70,34 +65,6 @@
void Console::postEnter() {
}
-bool Console::Cmd_Exit(int argc, const char **argv) {
- _detach_now = true;
- return false;
-}
-
-bool Console::Cmd_Help(int argc, const char **argv) {
- // console normally has 39 line width
- // wrap around nicely
- int width = 0, size, i;
-
- DebugPrintf("Commands are:\n");
- for (i = 0 ; i < _dcmd_count ; i++) {
- size = strlen(_dcmds[i].name) + 1;
-
- if ((width + size) >= 39) {
- DebugPrintf("\n");
- width = size;
- } else
- width += size;
-
- DebugPrintf("%s ", _dcmds[i].name);
- }
-
- DebugPrintf("\n");
-
- return true;
-}
-
bool Console::Cmd_SetVar(int argc, const char **argv) {
if (argc != 3) {
DebugPrintf("Usage: setvar <varnum> <value>");
Modified: scummvm/trunk/engines/agi/console.h
===================================================================
--- scummvm/trunk/engines/agi/console.h 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/agi/console.h 2006-09-16 16:58:27 UTC (rev 23890)
@@ -25,7 +25,7 @@
#ifndef AGI_CONSOLE_H
#define AGI_CONSOLE_H
-#include "common/debugger.h"
+#include "gui/debugger.h"
namespace Agi {
@@ -41,7 +41,7 @@
int ignoretriggers;
};
-class Console : public Common::Debugger<Console> {
+class Console : public GUI::Debugger {
public:
Console(AgiEngine *vm);
virtual ~Console(void);
@@ -51,8 +51,6 @@
virtual void postEnter();
private:
- bool Cmd_Exit(int argc, const char **argv);
- bool Cmd_Help(int argc, const char **argv);
bool Cmd_SetVar(int argc, const char **argv);
bool Cmd_SetFlag(int argc, const char **argv);
bool Cmd_SetObj(int argc, const char **argv);
Modified: scummvm/trunk/engines/kyra/debugger.cpp
===================================================================
--- scummvm/trunk/engines/kyra/debugger.cpp 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/kyra/debugger.cpp 2006-09-16 16:58:27 UTC (rev 23890)
@@ -22,7 +22,7 @@
#include "common/stdafx.h"
#include "common/config-manager.h"
-#include "common/debugger.cpp"
+#include "common/system.h"
#include "kyra/debugger.h"
#include "kyra/kyra.h"
#include "kyra/screen.h"
@@ -30,21 +30,18 @@
namespace Kyra {
Debugger::Debugger(KyraEngine *vm)
- : Common::Debugger<Debugger>() {
+ : GUI::Debugger() {
_vm = vm;
- DCmd_Register("continue", &Debugger::cmd_exit);
- DCmd_Register("exit", &Debugger::cmd_exit);
- DCmd_Register("help", &Debugger::cmd_help);
- DCmd_Register("quit", &Debugger::cmd_exit);
- DCmd_Register("enter", &Debugger::cmd_enterRoom);
- DCmd_Register("rooms", &Debugger::cmd_listRooms);
- DCmd_Register("flags", &Debugger::cmd_listFlags);
- DCmd_Register("toggleflag", &Debugger::cmd_toggleFlag);
- DCmd_Register("queryflag", &Debugger::cmd_queryFlag);
- DCmd_Register("timers", &Debugger::cmd_listTimers);
- DCmd_Register("settimercountdown", &Debugger::cmd_setTimerCountdown);
- DCmd_Register("give", &Debugger::cmd_giveItem);
+ DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
+ DCmd_Register("enter", WRAP_METHOD(Debugger, cmd_enterRoom));
+ DCmd_Register("rooms", WRAP_METHOD(Debugger, cmd_listRooms));
+ DCmd_Register("flags", WRAP_METHOD(Debugger, cmd_listFlags));
+ DCmd_Register("toggleflag", WRAP_METHOD(Debugger, cmd_toggleFlag));
+ DCmd_Register("queryflag", WRAP_METHOD(Debugger, cmd_queryFlag));
+ DCmd_Register("timers", WRAP_METHOD(Debugger, cmd_listTimers));
+ DCmd_Register("settimercountdown", WRAP_METHOD(Debugger, cmd_setTimerCountdown));
+ DCmd_Register("give", WRAP_METHOD(Debugger, cmd_giveItem));
}
void Debugger::preEnter() {
@@ -93,32 +90,6 @@
return true;
}
-bool Debugger::cmd_exit(int argc, const char **argv) {
- _detach_now = true;
- return false;
-}
-
-bool Debugger::cmd_help(int argc, const char **argv) {
- // console normally has 39 line width
- // wrap around nicely
- int width = 0, size, i;
-
- DebugPrintf("Commands are:\n");
- for (i = 0 ; i < _dcmd_count ; i++) {
- size = strlen(_dcmds[i].name) + 1;
-
- if ((width + size) >= 39) {
- DebugPrintf("\n");
- width = size;
- } else
- width += size;
-
- DebugPrintf("%s ", _dcmds[i].name);
- }
- DebugPrintf("\n");
- return true;
-}
-
bool Debugger::cmd_listRooms(int argc, const char **argv) {
for (int i = 0; i < _vm->_roomTableSize; i++) {
DebugPrintf("%-3i: %-10s", i, _vm->_roomFilenameTable[_vm->_roomTable[i].nameIndex]);
Modified: scummvm/trunk/engines/kyra/debugger.h
===================================================================
--- scummvm/trunk/engines/kyra/debugger.h 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/kyra/debugger.h 2006-09-16 16:58:27 UTC (rev 23890)
@@ -23,13 +23,13 @@
#ifndef KYRA_DEBUGGER_H
#define KYRA_DEBUGGER_H
-#include "common/debugger.h"
+#include "gui/debugger.h"
namespace Kyra {
class KyraEngine;
-class Debugger : public Common::Debugger<Debugger> {
+class Debugger : public GUI::Debugger {
public:
Debugger(KyraEngine *vm);
virtual ~Debugger() {} // we need this for __SYMBIAN32__ archaic gcc/UIQ
@@ -40,8 +40,6 @@
virtual void preEnter();
virtual void postEnter();
- bool cmd_exit(int argc, const char **argv);
- bool cmd_help(int argc, const char **argv);
bool cmd_enterRoom(int argc, const char **argv);
bool cmd_listRooms(int argc, const char **argv);
bool cmd_listFlags(int argc, const char **argv);
Modified: scummvm/trunk/engines/lure/debugger.cpp
===================================================================
--- scummvm/trunk/engines/lure/debugger.cpp 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/lure/debugger.cpp 2006-09-16 16:58:27 UTC (rev 23890)
@@ -22,7 +22,6 @@
#include "common/stdafx.h"
#include "common/config-manager.h"
-#include "common/debugger.cpp"
#include "lure/debugger.h"
#include "lure/res.h"
#include "lure/res_struct.h"
@@ -31,19 +30,16 @@
namespace Lure {
-Debugger::Debugger(): Common::Debugger<Debugger>() {
- DCmd_Register("continue", &Debugger::cmd_exit);
- DCmd_Register("exit", &Debugger::cmd_exit);
- DCmd_Register("help", &Debugger::cmd_help);
- DCmd_Register("quit", &Debugger::cmd_exit);
- DCmd_Register("enter", &Debugger::cmd_enterRoom);
- DCmd_Register("rooms", &Debugger::cmd_listRooms);
- DCmd_Register("fields", &Debugger::cmd_listFields);
- DCmd_Register("setfield", &Debugger::cmd_setField);
- DCmd_Register("queryfield", &Debugger::cmd_queryField);
- DCmd_Register("give", &Debugger::cmd_giveItem);
- DCmd_Register("hotspots", &Debugger::cmd_hotspots);
- DCmd_Register("hotspot", &Debugger::cmd_hotspot);
+Debugger::Debugger(): GUI::Debugger() {
+ DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
+ DCmd_Register("enter", WRAP_METHOD(Debugger, cmd_enterRoom));
+ DCmd_Register("rooms", WRAP_METHOD(Debugger, cmd_listRooms));
+ DCmd_Register("fields", WRAP_METHOD(Debugger, cmd_listFields));
+ DCmd_Register("setfield", WRAP_METHOD(Debugger, cmd_setField));
+ DCmd_Register("queryfield", WRAP_METHOD(Debugger, cmd_queryField));
+ DCmd_Register("give", WRAP_METHOD(Debugger, cmd_giveItem));
+ DCmd_Register("hotspots", WRAP_METHOD(Debugger, cmd_hotspots));
+ DCmd_Register("hotspot", WRAP_METHOD(Debugger, cmd_hotspot));
}
static int strToInt(const char *s) {
@@ -73,14 +69,6 @@
return result;
}
-void Debugger::preEnter() {
- // NO IMPLEMENTATION
-}
-
-void Debugger::postEnter() {
- // NO IMPLEMENTATION
-}
-
bool Debugger::cmd_enterRoom(int argc, const char **argv) {
Resources &res = Resources::getReference();
Room &room = Room::getReference();
@@ -114,32 +102,6 @@
return true;
}
-bool Debugger::cmd_exit(int argc, const char **argv) {
- _detach_now = true;
- return false;
-}
-
-bool Debugger::cmd_help(int argc, const char **argv) {
- // console normally has 39 line width
- // wrap around nicely
- int width = 0, size, i;
-
- DebugPrintf("Commands are:\n");
- for (i = 0 ; i < _dcmd_count ; i++) {
- size = strlen(_dcmds[i].name) + 1;
-
- if ((width + size) >= 69) {
- DebugPrintf("\n");
- width = size;
- } else
- width += size;
-
- DebugPrintf("%s ", _dcmds[i].name);
- }
- DebugPrintf("\n");
- return true;
-}
-
bool Debugger::cmd_listRooms(int argc, const char **argv) {
RoomDataList &rooms = Resources::getReference().roomData();
RoomDataList::iterator i;
Modified: scummvm/trunk/engines/lure/debugger.h
===================================================================
--- scummvm/trunk/engines/lure/debugger.h 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/lure/debugger.h 2006-09-16 16:58:27 UTC (rev 23890)
@@ -23,23 +23,18 @@
#ifndef LURE_DEBUGGER_H
#define LURE_DEBUGGER_H
-#include "common/debugger.h"
+#include "gui/debugger.h"
namespace Lure {
class KyraEngine;
-class Debugger : public Common::Debugger<Debugger> {
+class Debugger : public GUI::Debugger {
public:
Debugger();
virtual ~Debugger() {} // we need this for __SYMBIAN32__ archaic gcc/UIQ
protected:
- virtual void preEnter();
- virtual void postEnter();
-
- bool cmd_exit(int argc, const char **argv);
- bool cmd_help(int argc, const char **argv);
bool cmd_enterRoom(int argc, const char **argv);
bool cmd_listRooms(int argc, const char **argv);
bool cmd_listFields(int argc, const char **argv);
Modified: scummvm/trunk/engines/queen/debug.cpp
===================================================================
--- scummvm/trunk/engines/queen/debug.cpp 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/queen/debug.cpp 2006-09-16 16:58:27 UTC (rev 23890)
@@ -29,24 +29,20 @@
#include "queen/resource.h"
#include "queen/sound.h"
-#include "common/debugger.cpp"
-
namespace Queen {
Debugger::Debugger(QueenEngine *vm)
: _vm(vm), _flags(0) {
- DCmd_Register("exit", &Debugger::Cmd_Exit);
- DCmd_Register("help", &Debugger::Cmd_Help);
- DCmd_Register("areas", &Debugger::Cmd_Areas);
- DCmd_Register("asm", &Debugger::Cmd_Asm);
- DCmd_Register("bob", &Debugger::Cmd_Bob);
- DCmd_Register("bobs", &Debugger::Cmd_PrintBobs);
- DCmd_Register("gs", &Debugger::Cmd_GameState);
- DCmd_Register("info", &Debugger::Cmd_Info);
- DCmd_Register("items", &Debugger::Cmd_Items);
- DCmd_Register("room", &Debugger::Cmd_Room);
- DCmd_Register("song", &Debugger::Cmd_Song);
+ DCmd_Register("areas", WRAP_METHOD(Debugger, Cmd_Areas));
+ DCmd_Register("asm", WRAP_METHOD(Debugger, Cmd_Asm));
+ DCmd_Register("bob", WRAP_METHOD(Debugger, Cmd_Bob));
+ DCmd_Register("bobs", WRAP_METHOD(Debugger, Cmd_PrintBobs));
+ DCmd_Register("gs", WRAP_METHOD(Debugger, Cmd_GameState));
+ DCmd_Register("info", WRAP_METHOD(Debugger, Cmd_Info));
+ DCmd_Register("items", WRAP_METHOD(Debugger, Cmd_Items));
+ DCmd_Register("room", WRAP_METHOD(Debugger, Cmd_Room));
+ DCmd_Register("song", WRAP_METHOD(Debugger, Cmd_Song));
}
Debugger::~Debugger() {} // we need this here for __SYMBIAN32__
@@ -57,32 +53,6 @@
_vm->graphics()->setupMouseCursor();
}
-bool Debugger::Cmd_Exit(int argc, const char **argv) {
- _detach_now = true;
- return false;
-}
-
-bool Debugger::Cmd_Help(int argc, const char **argv) {
- // console normally has 39 line width
- // wrap around nicely
- int width = 0, size, i;
-
- DebugPrintf("Commands are:\n");
- for (i = 0 ; i < _dcmd_count ; i++) {
- size = strlen(_dcmds[i].name) + 1;
-
- if ((width + size) >= 39) {
- DebugPrintf("\n");
- width = size;
- } else
- width += size;
-
- DebugPrintf("%s ", _dcmds[i].name);
- }
- DebugPrintf("\n");
- return true;
-}
-
bool Debugger::Cmd_Asm(int argc, const char **argv) {
if (argc == 2) {
uint16 sm = atoi(argv[1]);
Modified: scummvm/trunk/engines/queen/debug.h
===================================================================
--- scummvm/trunk/engines/queen/debug.h 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/queen/debug.h 2006-09-16 16:58:27 UTC (rev 23890)
@@ -23,13 +23,13 @@
#ifndef QUEENDEBUG_H
#define QUEENDEBUG_H
-#include "common/debugger.h"
+#include "gui/debugger.h"
namespace Queen {
class QueenEngine;
-class Debugger : public Common::Debugger<Debugger> {
+class Debugger : public GUI::Debugger {
public:
Debugger(QueenEngine *vm);
@@ -46,8 +46,6 @@
virtual void preEnter();
virtual void postEnter();
- bool Cmd_Exit(int argc, const char **argv);
- bool Cmd_Help(int argc, const char **argv);
bool Cmd_Areas(int argc, const char **argv);
bool Cmd_Asm(int argc, const char **argv);
bool Cmd_Bob(int argc, const char **argv);
Modified: scummvm/trunk/engines/saga/console.cpp
===================================================================
--- scummvm/trunk/engines/saga/console.cpp 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/saga/console.cpp 2006-09-16 16:58:27 UTC (rev 23890)
@@ -32,26 +32,21 @@
#include "saga/console.h"
-#include "common/debugger.cpp"
-
namespace Saga {
-Console::Console(SagaEngine *vm) : Common::Debugger<Console>() {
+Console::Console(SagaEngine *vm) : GUI::Debugger() {
_vm = vm;
- DCmd_Register("continue", &Console::Cmd_Exit);
- DCmd_Register("exit", &Console::Cmd_Exit);
- DCmd_Register("quit", &Console::Cmd_Exit);
- DCmd_Register("help", &Console::Cmd_Help);
+ DCmd_Register("continue", WRAP_METHOD(Console, Cmd_Exit));
// CVAR_Register_I(&_soundEnabled, "sound", NULL, CVAR_CFG, 0, 1);
// CVAR_Register_I(&_musicEnabled, "music", NULL, CVAR_CFG, 0, 1);
// Actor commands
- DCmd_Register("actor_walk_to", &Console::cmdActorWalkTo);
+ DCmd_Register("actor_walk_to", WRAP_METHOD(Console, cmdActorWalkTo));
// Animation commands
- DCmd_Register("anim_info", &Console::Cmd_AnimInfo);
+ DCmd_Register("anim_info", WRAP_METHOD(Console, Cmd_AnimInfo));
// Game stuff
@@ -66,63 +61,14 @@
#endif
// Scene commands
- DCmd_Register("scene_change", &Console::cmdSceneChange);
- DCmd_Register("action_map_info", &Console::cmdActionMapInfo);
- DCmd_Register("object_map_info", &Console::cmdObjectMapInfo);
+ DCmd_Register("scene_change", WRAP_METHOD(Console, cmdSceneChange));
+ DCmd_Register("action_map_info", WRAP_METHOD(Console, cmdActionMapInfo));
+ DCmd_Register("object_map_info", WRAP_METHOD(Console, cmdObjectMapInfo));
}
Console::~Console() {
}
-void Console::preEnter() {
-}
-
-void Console::postEnter() {
-}
-
-bool Console::Cmd_Exit(int argc, const char **argv) {
- _detach_now = true;
- return false;
-}
-
-bool Console::Cmd_Help(int argc, const char **argv) {
- // console normally has 39 line width
- // wrap around nicely
- int width = 0, size, i;
-
- DebugPrintf("Commands are:\n");
- for (i = 0 ; i < _dcmd_count ; i++) {
- size = strlen(_dcmds[i].name) + 1;
-
- if ((width + size) >= 39) {
- DebugPrintf("\n");
- width = size;
- } else
- width += size;
-
- DebugPrintf("%s ", _dcmds[i].name);
- }
-
- width = 0;
-
- DebugPrintf("\n\nVariables are:\n");
- for (i = 0 ; i < _dvar_count ; i++) {
- size = strlen(_dvars[i].name) + 1;
-
- if ((width + size) >= 39) {
- DebugPrintf("\n");
- width = size;
- } else
- width += size;
-
- DebugPrintf("%s ", _dvars[i].name);
- }
-
- DebugPrintf("\n");
-
- return true;
-}
-
bool Console::cmdActorWalkTo(int argc, const char **argv) {
if (argc != 4)
DebugPrintf("Usage: %s <Actor id> <lx> <ly>\n", argv[0]);
Modified: scummvm/trunk/engines/saga/console.h
===================================================================
--- scummvm/trunk/engines/saga/console.h 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/saga/console.h 2006-09-16 16:58:27 UTC (rev 23890)
@@ -27,23 +27,16 @@
#ifndef SAGA_CONSOLE_H_
#define SAGA_CONSOLE_H_
-#include "common/debugger.h"
+#include "gui/debugger.h"
namespace Saga {
-class Console : public Common::Debugger<Console> {
+class Console : public GUI::Debugger {
public:
Console(SagaEngine *vm);
virtual ~Console(void);
-protected:
- virtual void preEnter();
- virtual void postEnter();
-
private:
- bool Cmd_Exit(int argc, const char **argv);
- bool Cmd_Help(int argc, const char **argv);
-
bool cmdActorWalkTo(int argc, const char **argv);
bool Cmd_AnimInfo(int argc, const char **argv);
Modified: scummvm/trunk/engines/scumm/debugger.cpp
===================================================================
--- scummvm/trunk/engines/scumm/debugger.cpp 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/scumm/debugger.cpp 2006-09-16 16:58:27 UTC (rev 23890)
@@ -36,8 +36,6 @@
#include "scumm/scumm.h"
#include "scumm/sound.h"
-#include "common/debugger.cpp"
-
namespace Scumm {
// Debug channel lookup table for Debugger console
@@ -71,7 +69,7 @@
}
ScummDebugger::ScummDebugger(ScummEngine *s)
- : Common::Debugger<ScummDebugger>() {
+ : GUI::Debugger() {
_vm = s;
// Register variables
@@ -87,38 +85,35 @@
DVar_Register("scumm_gameid", &_vm->_game.id, DVAR_BYTE, 0);
// Register commands
- DCmd_Register("continue", &ScummDebugger::Cmd_Exit);
- DCmd_Register("exit", &ScummDebugger::Cmd_Exit);
- DCmd_Register("quit", &ScummDebugger::Cmd_Exit);
- DCmd_Register("restart", &ScummDebugger::Cmd_Restart);
+ DCmd_Register("continue", WRAP_METHOD(ScummDebugger, Cmd_Exit));
+ DCmd_Register("restart", WRAP_METHOD(ScummDebugger, Cmd_Restart));
- DCmd_Register("actor", &ScummDebugger::Cmd_Actor);
- DCmd_Register("actors", &ScummDebugger::Cmd_PrintActor);
- DCmd_Register("box", &ScummDebugger::Cmd_PrintBox);
- DCmd_Register("matrix", &ScummDebugger::Cmd_PrintBoxMatrix);
- DCmd_Register("camera", &ScummDebugger::Cmd_Camera);
- DCmd_Register("room", &ScummDebugger::Cmd_Room);
- DCmd_Register("objects", &ScummDebugger::Cmd_PrintObjects);
- DCmd_Register("object", &ScummDebugger::Cmd_Object);
- DCmd_Register("script", &ScummDebugger::Cmd_Script);
- DCmd_Register("scr", &ScummDebugger::Cmd_Script);
- DCmd_Register("scripts", &ScummDebugger::Cmd_PrintScript);
- DCmd_Register("importres", &ScummDebugger::Cmd_ImportRes);
+ DCmd_Register("actor", WRAP_METHOD(ScummDebugger, Cmd_Actor));
+ DCmd_Register("actors", WRAP_METHOD(ScummDebugger, Cmd_PrintActor));
+ DCmd_Register("box", WRAP_METHOD(ScummDebugger, Cmd_PrintBox));
+ DCmd_Register("matrix", WRAP_METHOD(ScummDebugger, Cmd_PrintBoxMatrix));
+ DCmd_Register("camera", WRAP_METHOD(ScummDebugger, Cmd_Camera));
+ DCmd_Register("room", WRAP_METHOD(ScummDebugger, Cmd_Room));
+ DCmd_Register("objects", WRAP_METHOD(ScummDebugger, Cmd_PrintObjects));
+ DCmd_Register("object", WRAP_METHOD(ScummDebugger, Cmd_Object));
+ DCmd_Register("script", WRAP_METHOD(ScummDebugger, Cmd_Script));
+ DCmd_Register("scr", WRAP_METHOD(ScummDebugger, Cmd_Script));
+ DCmd_Register("scripts", WRAP_METHOD(ScummDebugger, Cmd_PrintScript));
+ DCmd_Register("importres", WRAP_METHOD(ScummDebugger, Cmd_ImportRes));
if (_vm->_game.id == GID_LOOM)
- DCmd_Register("drafts", &ScummDebugger::Cmd_PrintDraft);
+ DCmd_Register("drafts", WRAP_METHOD(ScummDebugger, Cmd_PrintDraft));
- DCmd_Register("loadgame", &ScummDebugger::Cmd_LoadGame);
- DCmd_Register("savegame", &ScummDebugger::Cmd_SaveGame);
+ DCmd_Register("loadgame", WRAP_METHOD(ScummDebugger, Cmd_LoadGame));
+ DCmd_Register("savegame", WRAP_METHOD(ScummDebugger, Cmd_SaveGame));
- DCmd_Register("level", &ScummDebugger::Cmd_DebugLevel);
- DCmd_Register("debug", &ScummDebugger::Cmd_Debug);
- DCmd_Register("help", &ScummDebugger::Cmd_Help);
+ DCmd_Register("level", WRAP_METHOD(ScummDebugger, Cmd_DebugLevel));
+ DCmd_Register("debug", WRAP_METHOD(ScummDebugger, Cmd_Debug));
- DCmd_Register("show", &ScummDebugger::Cmd_Show);
- DCmd_Register("hide", &ScummDebugger::Cmd_Hide);
+ DCmd_Register("show", WRAP_METHOD(ScummDebugger, Cmd_Show));
+ DCmd_Register("hide", WRAP_METHOD(ScummDebugger, Cmd_Hide));
- DCmd_Register("imuse", &ScummDebugger::Cmd_IMuse);
+ DCmd_Register("imuse", WRAP_METHOD(ScummDebugger, Cmd_IMuse));
}
ScummDebugger::~ScummDebugger() {} // we need this here for __SYMBIAN32__
@@ -138,11 +133,6 @@
// Now the fun stuff:
// Commands
-bool ScummDebugger::Cmd_Exit(int argc, const char **argv) {
- _detach_now = true;
- return false;
-}
-
bool ScummDebugger::Cmd_Restart(int argc, const char **argv) {
_vm->restart();
@@ -518,44 +508,6 @@
return true;
}
-bool ScummDebugger::Cmd_Help(int argc, const char **argv) {
- // console normally has 39 line width
- // wrap around nicely
- int width = 0, size, i;
-
- DebugPrintf("Commands are:\n");
- for (i = 0 ; i < _dcmd_count ; i++) {
- size = strlen(_dcmds[i].name) + 1;
-
- if ((width + size) >= 39) {
- DebugPrintf("\n");
- width = size;
- } else
- width += size;
-
- DebugPrintf("%s ", _dcmds[i].name);
- }
-
- width = 0;
-
- DebugPrintf("\n\nVariables are:\n");
- for (i = 0 ; i < _dvar_count ; i++) {
- size = strlen(_dvars[i].name) + 1;
-
- if ((width + size) >= 39) {
- DebugPrintf("\n");
- width = size;
- } else
- width += size;
-
- DebugPrintf("%s ", _dvars[i].name);
- }
-
- DebugPrintf("\n");
-
- return true;
-}
-
bool ScummDebugger::Cmd_Debug(int argc, const char **argv) {
int numChannels = sizeof(debugChannels) / sizeof(dbgChannelDesc);
Modified: scummvm/trunk/engines/scumm/debugger.h
===================================================================
--- scummvm/trunk/engines/scumm/debugger.h 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/scumm/debugger.h 2006-09-16 16:58:27 UTC (rev 23890)
@@ -19,16 +19,16 @@
* $Id$
*/
-#ifndef DEBUGGER_H
-#define DEBUGGER_H
+#ifndef SCUMM_DEBUGGER_H
+#define SCUMM_DEBUGGER_H
-#include "common/debugger.h"
+#include "gui/debugger.h"
namespace Scumm {
class ScummEngine;
-class ScummDebugger : public Common::Debugger<ScummDebugger> {
+class ScummDebugger : public GUI::Debugger {
public:
ScummDebugger(ScummEngine *s);
virtual ~ScummDebugger(); // we need this here for __SYMBIAN32__
@@ -41,7 +41,6 @@
virtual void postEnter();
// Commands
- bool Cmd_Exit(int argc, const char **argv);
bool Cmd_Room(int argc, const char **argv);
bool Cmd_LoadGame(int argc, const char **argv);
bool Cmd_SaveGame(int argc, const char **argv);
@@ -62,7 +61,6 @@
bool Cmd_Debug(int argc, const char **argv);
bool Cmd_DebugLevel(int argc, const char **argv);
- bool Cmd_Help(int argc, const char **argv);
bool Cmd_Show(int argc, const char **argv);
bool Cmd_Hide(int argc, const char **argv);
Modified: scummvm/trunk/engines/simon/debugger.cpp
===================================================================
--- scummvm/trunk/engines/simon/debugger.cpp 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/simon/debugger.cpp 2006-09-16 16:58:27 UTC (rev 23890)
@@ -24,7 +24,6 @@
#include "common/stdafx.h"
#include "common/config-manager.h"
-#include "common/debugger.cpp"
#include "simon/debugger.h"
#include "simon/simon.h"
@@ -32,20 +31,17 @@
namespace Simon {
Debugger::Debugger(SimonEngine *vm)
- : Common::Debugger<Debugger>() {
+ : GUI::Debugger() {
_vm = vm;
- DCmd_Register("continue", &Debugger::Cmd_Exit);
- DCmd_Register("exit", &Debugger::Cmd_Exit);
- DCmd_Register("help", &Debugger::Cmd_Help);
- DCmd_Register("quit", &Debugger::Cmd_Exit);
- DCmd_Register("level", &Debugger::Cmd_DebugLevel);
- DCmd_Register("music", &Debugger::Cmd_PlayMusic);
- DCmd_Register("sound", &Debugger::Cmd_PlaySound);
- DCmd_Register("voice", &Debugger::Cmd_PlayVoice);
- DCmd_Register("bit", &Debugger::Cmd_SetBit);
- DCmd_Register("var", &Debugger::Cmd_SetVar);
- DCmd_Register("sub", &Debugger::Cmd_StartSubroutine);
+ DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
+ DCmd_Register("level", WRAP_METHOD(Debugger, Cmd_DebugLevel));
+ DCmd_Register("music", WRAP_METHOD(Debugger, Cmd_PlayMusic));
+ DCmd_Register("sound", WRAP_METHOD(Debugger, Cmd_PlaySound));
+ DCmd_Register("voice", WRAP_METHOD(Debugger, Cmd_PlayVoice));
+ DCmd_Register("bit", WRAP_METHOD(Debugger, Cmd_SetBit));
+ DCmd_Register("var", WRAP_METHOD(Debugger, Cmd_SetVar));
+ DCmd_Register("sub", WRAP_METHOD(Debugger, Cmd_StartSubroutine));
}
@@ -60,32 +56,6 @@
}
-bool Debugger::Cmd_Exit(int argc, const char **argv) {
- _detach_now = true;
- return false;
-}
-
-bool Debugger::Cmd_Help(int argc, const char **argv) {
- // console normally has 39 line width
- // wrap around nicely
- int width = 0, size, i;
-
- DebugPrintf("Commands are:\n");
- for (i = 0 ; i < _dcmd_count ; i++) {
- size = strlen(_dcmds[i].name) + 1;
-
- if ((width + size) >= 39) {
- DebugPrintf("\n");
- width = size;
- } else
- width += size;
-
- DebugPrintf("%s ", _dcmds[i].name);
- }
- DebugPrintf("\n");
- return true;
-}
-
bool Debugger::Cmd_DebugLevel(int argc, const char **argv) {
if (argc == 1) {
if (_vm->_debugMode == false)
Modified: scummvm/trunk/engines/simon/debugger.h
===================================================================
--- scummvm/trunk/engines/simon/debugger.h 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/simon/debugger.h 2006-09-16 16:58:27 UTC (rev 23890)
@@ -24,13 +24,13 @@
#ifndef SIMON_DEBUGGER_H
#define SIMON_DEBUGGER_H
-#include "common/debugger.h"
+#include "gui/debugger.h"
namespace Simon {
class SimonEngine;
-class Debugger : public Common::Debugger<Debugger> {
+class Debugger : public GUI::Debugger {
public:
Debugger(SimonEngine *vm);
virtual ~Debugger() {} // we need this for __SYMBIAN32__ archaic gcc/UIQ
@@ -41,8 +41,6 @@
virtual void preEnter();
virtual void postEnter();
- bool Cmd_Exit(int argc, const char **argv);
- bool Cmd_Help(int argc, const char **argv);
bool Cmd_DebugLevel(int argc, const char **argv);
bool Cmd_PlayMusic(int argc, const char **argv);
bool Cmd_PlaySound(int argc, const char **argv);
Modified: scummvm/trunk/engines/sky/debug.cpp
===================================================================
--- scummvm/trunk/engines/sky/debug.cpp 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/sky/debug.cpp 2006-09-16 16:58:27 UTC (rev 23890)
@@ -23,7 +23,6 @@
#include "common/stdafx.h"
#include "common/endian.h"
#include "common/util.h"
-#include "common/debugger.cpp"
#include "sky/debug.h"
#include "sky/grid.h"
@@ -1280,16 +1279,14 @@
Debugger::Debugger(Logic *logic, Mouse *mouse, Screen *screen, SkyCompact *skyCompact)
-: Common::Debugger<Debugger>(), _logic(logic), _mouse(mouse), _screen(screen), _skyCompact(skyCompact), _showGrid(false) {
- DCmd_Register("exit", &Debugger::Cmd_Exit);
- DCmd_Register("help", &Debugger::Cmd_Help);
- DCmd_Register("info", &Debugger::Cmd_Info);
- DCmd_Register("showgrid", &Debugger::Cmd_ShowGrid);
- DCmd_Register("reloadgrid", &Debugger::Cmd_ReloadGrid);
- DCmd_Register("compact", &Debugger::Cmd_ShowCompact);
- DCmd_Register("logiccmd", &Debugger::Cmd_LogicCommand);
- DCmd_Register("scriptvar", &Debugger::Cmd_ScriptVar);
- DCmd_Register("section", &Debugger::Cmd_Section);
+: GUI::Debugger(), _logic(logic), _mouse(mouse), _screen(screen), _skyCompact(skyCompact), _showGrid(false) {
+ DCmd_Register("info", WRAP_METHOD(Debugger, Cmd_Info));
+ DCmd_Register("showgrid", WRAP_METHOD(Debugger, Cmd_ShowGrid));
+ DCmd_Register("reloadgrid", WRAP_METHOD(Debugger, Cmd_ReloadGrid));
+ DCmd_Register("compact", WRAP_METHOD(Debugger, Cmd_ShowCompact));
+ DCmd_Register("logiccmd", WRAP_METHOD(Debugger, Cmd_LogicCommand));
+ DCmd_Register("scriptvar", WRAP_METHOD(Debugger, Cmd_ScriptVar));
+ DCmd_Register("section", WRAP_METHOD(Debugger, Cmd_Section));
}
Debugger::~Debugger() {} // we need this here for __SYMBIAN32__
@@ -1302,33 +1299,6 @@
_mouse->resetCursor();
}
-bool Debugger::Cmd_Exit(int argc, const char **argv) {
- _detach_now = true;
- return false;
-}
-
-bool Debugger::Cmd_Help(int argc, const char **argv) {
- // console normally has 39 line width
- // wrap around nicely
- int width = 0, size;
-
- DebugPrintf("Commands are:\n");
- for (int i = 0; i < _dcmd_count; ++i) {
- size = strlen(_dcmds[i].name) + 1;
-
- if ((width + size) >= 39) {
- DebugPrintf("\n");
- width = size;
- } else {
- width += size;
- }
-
- DebugPrintf("%s ", _dcmds[i].name);
- }
- DebugPrintf("\n");
- return true;
-}
-
bool Debugger::Cmd_ShowGrid(int argc, const char **argv) {
_showGrid = !_showGrid;
DebugPrintf("Show grid: %s\n", _showGrid ? "On" : "Off");
Modified: scummvm/trunk/engines/sky/debug.h
===================================================================
--- scummvm/trunk/engines/sky/debug.h 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/sky/debug.h 2006-09-16 16:58:27 UTC (rev 23890)
@@ -25,7 +25,7 @@
#include "common/stdafx.h"
#include "common/scummsys.h"
-#include "common/debugger.h"
+#include "gui/debugger.h"
namespace Sky {
@@ -34,7 +34,7 @@
class Screen;
class SkyCompact;
-class Debugger : public Common::Debugger<Debugger> {
+class Debugger : public GUI::Debugger {
public:
Debugger(Logic *logic, Mouse *mouse, Screen *screen, SkyCompact *skyCompact);
virtual ~Debugger(); // we need this here for __SYMBIAN32__ archaic gcc/UIQ
@@ -44,8 +44,6 @@
virtual void preEnter();
virtual void postEnter();
- bool Cmd_Exit(int argc, const char **argv);
- bool Cmd_Help(int argc, const char **argv);
bool Cmd_ShowGrid(int argc, const char **argv);
bool Cmd_ReloadGrid(int argc, const char **argv);
bool Cmd_ShowCompact(int argc, const char **argv);
Modified: scummvm/trunk/engines/sword2/console.cpp
===================================================================
--- scummvm/trunk/engines/sword2/console.cpp 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/sword2/console.cpp 2006-09-16 16:58:27 UTC (rev 23890)
@@ -21,6 +21,7 @@
#include "common/stdafx.h"
#include "common/rect.h"
+#include "common/system.h"
#include "sword2/sword2.h"
#include "sword2/defs.h"
@@ -34,12 +35,10 @@
#include "sword2/screen.h"
#include "sword2/sound.h"
-#include "common/debugger.cpp"
-
namespace Sword2 {
Debugger::Debugger(Sword2Engine *vm)
- : Common::Debugger<Debugger>() {
+ : GUI::Debugger() {
_vm = vm;
memset(_debugTextBlocks, 0, sizeof(_debugTextBlocks));
@@ -79,47 +78,44 @@
// Register commands
- DCmd_Register("continue", &Debugger::Cmd_Exit);
- DCmd_Register("exit", &Debugger::Cmd_Exit);
- DCmd_Register("quit", &Debugger::Cmd_Exit);
- DCmd_Register("q", &Debugger::Cmd_Exit);
- DCmd_Register("help", &Debugger::Cmd_Help);
- DCmd_Register("mem", &Debugger::Cmd_Mem);
- DCmd_Register("tony", &Debugger::Cmd_Tony);
- DCmd_Register("res", &Debugger::Cmd_Res);
- DCmd_Register("reslist", &Debugger::Cmd_ResList);
- DCmd_Register("starts", &Debugger::Cmd_Starts);
- DCmd_Register("start", &Debugger::Cmd_Start);
- DCmd_Register("s", &Debugger::Cmd_Start);
- DCmd_Register("info", &Debugger::Cmd_Info);
- DCmd_Register("walkgrid", &Debugger::Cmd_WalkGrid);
- DCmd_Register("mouse", &Debugger::Cmd_Mouse);
- DCmd_Register("player", &Debugger::Cmd_Player);
- DCmd_Register("reslook", &Debugger::Cmd_ResLook);
- DCmd_Register("cur", &Debugger::Cmd_CurrentInfo);
- DCmd_Register("runlist", &Debugger::Cmd_RunList);
- DCmd_Register("kill", &Debugger::Cmd_Kill);
- DCmd_Register("nuke", &Debugger::Cmd_Nuke);
- DCmd_Register("var", &Debugger::Cmd_Var);
- DCmd_Register("rect", &Debugger::Cmd_Rect);
- DCmd_Register("clear", &Debugger::Cmd_Clear);
- DCmd_Register("debugon", &Debugger::Cmd_DebugOn);
- DCmd_Register("debugoff", &Debugger::Cmd_DebugOff);
- DCmd_Register("saverest", &Debugger::Cmd_SaveRest);
- DCmd_Register("timeon", &Debugger::Cmd_TimeOn);
- DCmd_Register("timeoff", &Debugger::Cmd_TimeOff);
- DCmd_Register("text", &Debugger::Cmd_Text);
- DCmd_Register("showvar", &Debugger::Cmd_ShowVar);
- DCmd_Register("hidevar", &Debugger::Cmd_HideVar);
- DCmd_Register("version", &Debugger::Cmd_Version);
- DCmd_Register("animtest", &Debugger::Cmd_AnimTest);
- DCmd_Register("texttest", &Debugger::Cmd_TextTest);
- DCmd_Register("linetest", &Debugger::Cmd_LineTest);
- DCmd_Register("events", &Debugger::Cmd_Events);
- DCmd_Register("sfx", &Debugger::Cmd_Sfx);
- DCmd_Register("english", &Debugger::Cmd_English);
- DCmd_Register("finnish", &Debugger::Cmd_Finnish);
- DCmd_Register("polish", &Debugger::Cmd_Polish);
+ DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
+ DCmd_Register("q", WRAP_METHOD(Debugger, Cmd_Exit));
+ DCmd_Register("mem", WRAP_METHOD(Debugger, Cmd_Mem));
+ DCmd_Register("tony", WRAP_METHOD(Debugger, Cmd_Tony));
+ DCmd_Register("res", WRAP_METHOD(Debugger, Cmd_Res));
+ DCmd_Register("reslist", WRAP_METHOD(Debugger, Cmd_ResList));
+ DCmd_Register("starts", WRAP_METHOD(Debugger, Cmd_Starts));
+ DCmd_Register("start", WRAP_METHOD(Debugger, Cmd_Start));
+ DCmd_Register("s", WRAP_METHOD(Debugger, Cmd_Start));
+ DCmd_Register("info", WRAP_METHOD(Debugger, Cmd_Info));
+ DCmd_Register("walkgrid", WRAP_METHOD(Debugger, Cmd_WalkGrid));
+ DCmd_Register("mouse", WRAP_METHOD(Debugger, Cmd_Mouse));
+ DCmd_Register("player", WRAP_METHOD(Debugger, Cmd_Player));
+ DCmd_Register("reslook", WRAP_METHOD(Debugger, Cmd_ResLook));
+ DCmd_Register("cur", WRAP_METHOD(Debugger, Cmd_CurrentInfo));
+ DCmd_Register("runlist", WRAP_METHOD(Debugger, Cmd_RunList));
+ DCmd_Register("kill", WRAP_METHOD(Debugger, Cmd_Kill));
+ DCmd_Register("nuke", WRAP_METHOD(Debugger, Cmd_Nuke));
+ DCmd_Register("var", WRAP_METHOD(Debugger, Cmd_Var));
+ DCmd_Register("rect", WRAP_METHOD(Debugger, Cmd_Rect));
+ DCmd_Register("clear", WRAP_METHOD(Debugger, Cmd_Clear));
+ DCmd_Register("debugon", WRAP_METHOD(Debugger, Cmd_DebugOn));
+ DCmd_Register("debugoff", WRAP_METHOD(Debugger, Cmd_DebugOff));
+ DCmd_Register("saverest", WRAP_METHOD(Debugger, Cmd_SaveRest));
+ DCmd_Register("timeon", WRAP_METHOD(Debugger, Cmd_TimeOn));
+ DCmd_Register("timeoff", WRAP_METHOD(Debugger, Cmd_TimeOff));
+ DCmd_Register("text", WRAP_METHOD(Debugger, Cmd_Text));
+ DCmd_Register("showvar", WRAP_METHOD(Debugger, Cmd_ShowVar));
+ DCmd_Register("hidevar", WRAP_METHOD(Debugger, Cmd_HideVar));
+ DCmd_Register("version", WRAP_METHOD(Debugger, Cmd_Version));
+ DCmd_Register("animtest", WRAP_METHOD(Debugger, Cmd_AnimTest));
+ DCmd_Register("texttest", WRAP_METHOD(Debugger, Cmd_TextTest));
+ DCmd_Register("linetest", WRAP_METHOD(Debugger, Cmd_LineTest));
+ DCmd_Register("events", WRAP_METHOD(Debugger, Cmd_Events));
+ DCmd_Register("sfx", WRAP_METHOD(Debugger, Cmd_Sfx));
+ DCmd_Register("english", WRAP_METHOD(Debugger, Cmd_English));
+ DCmd_Register("finnish", WRAP_METHOD(Debugger, Cmd_Finnish));
+ DCmd_Register("polish", WRAP_METHOD(Debugger, Cmd_Polish));
}
void Debugger::varGet(int var) {
@@ -157,34 +153,6 @@
// Now the fun stuff: Commands
-bool Debugger::Cmd_Exit(int argc, const char **argv) {
- _detach_now = true;
- _vm->clearInputEvents();
- return false;
-}
-
-bool Debugger::Cmd_Help(int argc, const char **argv) {
- // console normally has 78 line width
- // wrap around nicely
- int width = 0;
-
- DebugPrintf("Commands are:\n");
- for (int i = 0 ; i < _dcmd_count ; i++) {
- int size = strlen(_dcmds[i].name) + 1;
-
- if (width + size >= 75) {
- DebugPrintf("\n");
- width = size;
- } else
- width += size;
-
- DebugPrintf("%s ", _dcmds[i].name);
- }
-
- DebugPrintf("\n");
- return true;
-}
-
static int compare_blocks(const void *p1, const void *p2) {
const MemBlock *m1 = *(const MemBlock * const *)p1;
const MemBlock *m2 = *(const MemBlock * const *)p2;
Modified: scummvm/trunk/engines/sword2/console.h
===================================================================
--- scummvm/trunk/engines/sword2/console.h 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/engines/sword2/console.h 2006-09-16 16:58:27 UTC (rev 23890)
@@ -22,12 +22,12 @@
#ifndef SWORD2_CONSOLE_H
#define SWORD2_CONSOLE_H
-#include "common/debugger.h"
+#include "gui/debugger.h"
#include "sword2/debug.h"
namespace Sword2 {
-class Debugger : public Common::Debugger<Debugger> {
+class Debugger : public GUI::Debugger {
private:
void varGet(int var);
void varSet(int var, int val);
@@ -83,8 +83,6 @@
virtual void postEnter();
// Commands
- bool Cmd_Exit(int argc, const char **argv);
- bool Cmd_Help(int argc, const char **argv);
bool Cmd_Mem(int argc, const char **argv);
bool Cmd_Tony(int argc, const char **argv);
bool Cmd_Res(int argc, const char **argv);
Modified: scummvm/trunk/gui/console.h
===================================================================
--- scummvm/trunk/gui/console.h 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/gui/console.h 2006-09-16 16:58:27 UTC (rev 23890)
@@ -36,7 +36,6 @@
typedef bool (*InputCallbackProc)(ConsoleDialog *console, const char *input, void *refCon);
typedef bool (*CompletionCallbackProc)(ConsoleDialog* console, const char *input, char*& completion, void *refCon);
-protected:
enum {
kBufferSize = 32768,
kCharsPerLine = 128,
@@ -45,6 +44,7 @@
kHistorySize = 20
};
+protected:
const Graphics::Font *_font;
char _buffer[kBufferSize];
Copied: scummvm/trunk/gui/debugger.cpp (from rev 23887, scummvm/trunk/common/debugger.cpp)
===================================================================
--- scummvm/trunk/gui/debugger.cpp (rev 0)
+++ scummvm/trunk/gui/debugger.cpp 2006-09-16 16:58:27 UTC (rev 23890)
@@ -0,0 +1,466 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2001-2006 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "common/stdafx.h"
+
+#include "common/system.h"
+
+#include "gui/debugger.h"
+#if USE_CONSOLE
+ #include "gui/console.h"
+#endif
+
+namespace GUI {
+
+Debugger::Debugger() {
+ _frame_countdown = 0;
+ _dvar_count = 0;
+ _dcmd_count = 0;
+ _detach_now = false;
+ _isAttached = false;
+ _errStr = NULL;
+ _firstTime = true;
+ _debuggerDialog = new GUI::ConsoleDialog(1.0, 0.67F);
+ _debuggerDialog->setInputCallback(debuggerInputCallback, this);
+ _debuggerDialog->setCompletionCallback(debuggerCompletionCallback, this);
+
+ //DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
+ DCmd_Register("exit", WRAP_METHOD(Debugger, Cmd_Exit));
+ DCmd_Register("quit", WRAP_METHOD(Debugger, Cmd_Exit));
+
+ DCmd_Register("help", WRAP_METHOD(Debugger, Cmd_Help));
+
+ DCmd_Register("debugflag_list", WRAP_METHOD(Debugger, Cmd_DebugFlagsList));
+ DCmd_Register("debugflag_enable", WRAP_METHOD(Debugger, Cmd_DebugFlagEnable));
+ DCmd_Register("debugflag_disable", WRAP_METHOD(Debugger, Cmd_DebugFlagDisable));
+}
+
+Debugger::~Debugger() {
+ for (int i = 0; i < _dcmd_count; i++) {
+ delete _dcmds[i].debuglet;
+ _dcmds[i].debuglet = 0;
+ }
+ delete _debuggerDialog;
+}
+
+
+// Initialisation Functions
+int Debugger::DebugPrintf(const char *format, ...) {
+ va_list argptr;
+
+ va_start(argptr, format);
+ int count;
+#if USE_CONSOLE
+ count = _debuggerDialog->vprintf(format, argptr);
+#else
+ count = ::vprintf(format, argptr);
+#endif
+ va_end (argptr);
+ return count;
+}
+
+#ifndef __SYMBIAN32__ // gcc/UIQ doesn't like the debugger code for some reason? Actually get a cc1plus core dump here :)
+void Debugger::attach(const char *entry) {
+
+ g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
+
+ if (entry) {
+ _errStr = strdup(entry);
+ }
+
+ _frame_countdown = 1;
+ _detach_now = false;
+ _isAttached = true;
+}
+
+void Debugger::detach() {
+ g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
+
+ _detach_now = false;
+ _isAttached = false;
+}
+
+// Temporary execution handler
+void Debugger::onFrame() {
+ if (_frame_countdown == 0)
+ return;
+ --_frame_countdown;
+
+ if (!_frame_countdown) {
+
+ preEnter();
+ enter();
+ postEnter();
+
+ // Detach if we're finished with the debugger
+ if (_detach_now)
+ detach();
+ }
+}
+#endif // of ifndef __SYMBIAN32__ // gcc/UIQ doesn't like the debugger code for some reason? Actually get a cc1plus core dump here :)
+
+// Main Debugger Loop
+void Debugger::enter() {
+#if USE_CONSOLE
+ if (_firstTime) {
+ DebugPrintf("Debugger started, type 'exit' to return to the game.\n");
+ DebugPrintf("Type 'help' to see a little list of commands and variables.\n");
+ _firstTime = false;
+ }
+
+ if (_errStr) {
+ DebugPrintf("ERROR: %s\n\n", _errStr);
+ free(_errStr);
+ _errStr = NULL;
+ }
+
+ _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 (parseCommand(buf));
+
+#endif
+}
+
+bool Debugger::handleCommand(int argc, const char **argv, bool &result) {
+ for (int i = 0; i < _dcmd_count; ++i) {
+ if (!strcmp(_dcmds[i].name, argv[0])) {
+ Debuglet *debuglet = _dcmds[i].debuglet;
+ assert(debuglet);
+ result = (*debuglet)(argc, argv);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// Command execution loop
+bool Debugger::parseCommand(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;
+ }
+
+ // Handle commands first
+ bool result;
+ if (handleCommand(num_params, param, result)) {
+ free(input);
+ return result;
+ }
+
+ // It's not a command, so things get a little tricky for variables. Do fuzzy matching to ignore things like subscripts.
+ for (i = 0; i < _dvar_count; i++) {
+ if (!strncmp(_dvars[i].name, param[0], strlen(_dvars[i].name))) {
+ if (num_params > 1) {
+ // Alright, we need to check the TYPE of the variable to deref and stuff... the array stuff is a bit ugly :)
+ switch (_dvars[i].type) {
+ // Integer
+ case DVAR_BYTE:
+ *(byte *)_dvars[i].variable = atoi(param[1]);
+ DebugPrintf("byte%s = %d\n", param[0], *(byte *)_dvars[i].variable);
+ break;
+ case DVAR_INT:
+ *(int32 *)_dvars[i].variable = atoi(param[1]);
+ DebugPrintf("(int)%s = %d\n", param[0], *(int32 *)_dvars[i].variable);
+ break;
+ // Integer Array
+ case DVAR_INTARRAY: {
+ char *chr = (char *)strchr(param[0], '[');
+ if (!chr) {
+ DebugPrintf("You must access this array as %s[element]\n", param[0]);
+ } else {
+ int element = atoi(chr+1);
+ int32 *var = *(int32 **)_dvars[i].variable;
+ if (element >= _dvars[i].optional) {
+ DebugPrintf("%s is out of range (array is %d elements big)\n", param[0], _dvars[i].optional);
+ } else {
+ var[element] = atoi(param[1]);
+ DebugPrintf("(int)%s = %d\n", param[0], var[element]);
+ }
+ }
+ }
+ break;
+ default:
+ DebugPrintf("Failed to set variable %s to %s - unknown type\n", _dvars[i].name, param[1]);
+ break;
+ }
+ } else {
+ // And again, type-dependent prints/defrefs. The array one is still ugly.
+ switch (_dvars[i].type) {
+ // Integer
+ case DVAR_BYTE:
+ DebugPrintf("(byte)%s = %d\n", param[0], *(const byte *)_dvars[i].variable);
+ break;
+ case DVAR_INT:
+ DebugPrintf("(int)%s = %d\n", param[0], *(const int32 *)_dvars[i].variable);
+ break;
+ // Integer array
+ case DVAR_INTARRAY: {
+ const char *chr = strchr(param[0], '[');
+ if (!chr) {
+ DebugPrintf("You must access this array as %s[element]\n", param[0]);
+ } else {
+ int element = atoi(chr+1);
+ const int32 *var = *(const int32 **)_dvars[i].variable;
+ if (element >= _dvars[i].optional) {
+ DebugPrintf("%s is out of range (array is %d elements big)\n", param[0], _dvars[i].optional);
+ } else {
+ DebugPrintf("(int)%s = %d\n", param[0], var[element]);
+ }
+ }
+ }
+ break;
+ // String
+ case DVAR_STRING:
+ DebugPrintf("(string)%s = %s\n", param[0], ((Common::String *)_dvars[i].variable)->c_str());
+ break;
+ default:
+ DebugPrintf("%s = (unknown type)\n", param[0]);
+ break;
+ }
+ }
+
+ free(input);
+ return true;
+ }
+ }
+
+ DebugPrintf("Unknown command or variable\n");
+ free(input);
+ 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;
+ return true;
+}
+
+// Variable registration function
+void Debugger::DVar_Register(const char *varname, void *pointer, int type, int optional) {
+ assert(_dvar_count < ARRAYSIZE(_dvars));
+ strcpy(_dvars[_dvar_count].name, varname);
+ _dvars[_dvar_count].type = type;
+ _dvars[_dvar_count].variable = pointer;
+ _dvars[_dvar_count].optional = optional;
+
+ _dvar_count++;
+}
+
+// Command registration function
+void Debugger::DCmd_Register(const char *cmdname, Debuglet *debuglet) {
+ assert(_dcmd_count < ARRAYSIZE(_dcmds));
+ strcpy(_dcmds[_dcmd_count].name, cmdname);
+ _dcmds[_dcmd_count].debuglet = debuglet;
+
+ _dcmd_count++;
+}
+
+
+// Detach ("exit") the debugger
+bool Debugger::Cmd_Exit(int argc, const char **argv) {
+ _detach_now = true;
+ return false;
+}
+
+// Print a list of all registered commands (and variables, if any),
+// nicely word-wrapped.
+bool Debugger::Cmd_Help(int argc, const char **argv) {
+
+ int width, size, i;
+
+ DebugPrintf("Commands are:\n");
+ width = 0;
+ for (i = 0; i < _dcmd_count; i++) {
+ size = strlen(_dcmds[i].name) + 1;
+
+ if ((width + size) >= GUI::ConsoleDialog::kCharsPerLine) {
+ DebugPrintf("\n");
+ width = size;
+ } else
+ width += size;
+
+ DebugPrintf("%s ", _dcmds[i].name);
+ }
+ DebugPrintf("\n");
+
+ if (_dvar_count > 0) {
+ DebugPrintf("\n");
+ DebugPrintf("Variables are:\n");
+ width = 0;
+ for (i = 0; i < _dvar_count; i++) {
+ size = strlen(_dvars[i].name) + 1;
+
+ if ((width + size) >= GUI::ConsoleDialog::kCharsPerLine) {
+ DebugPrintf("\n");
+ width = size;
+ } else
+ width += size;
+
+ DebugPrintf("%s ", _dvars[i].name);
+ }
+ DebugPrintf("\n");
+ }
+
+ return true;
+}
+
+bool Debugger::Cmd_DebugFlagsList(int argc, const char **argv) {
+ const Common::Array<Common::EngineDebugLevel> &debugLevels = Common::listSpecialDebugLevels();
+
+ DebugPrintf("Engine debug levels:\n");
+ DebugPrintf("--------------------\n");
+ if (!debugLevels.size()) {
+ DebugPrintf("No engine debug levels\n");
+ return true;
+ }
+ for (uint i = 0; i < debugLevels.size(); ++i) {
+ DebugPrintf("'%s' - Description: %s\n", debugLevels[i].option.c_str(), debugLevels[i].description.c_str());
+ }
+ DebugPrintf("\n");
+ return true;
+}
+
+bool Debugger::Cmd_DebugFlagEnable(int argc, const char **argv) {
+ if (argc < 2) {
+ DebugPrintf("debugflag_enable <flag>\n");
+ } else {
+ if (Common::enableSpecialDebugLevel(argv[1])) {
+ DebugPrintf("Enabled debug flag '%s'\n", argv[1]);
+ } else {
+ DebugPrintf("Failed to enable debug flag '%s'\n", argv[1]);
+ }
+ }
+ return true;
+}
+
+bool Debugger::Cmd_DebugFlagDisable(int argc, const char **argv) {
+ if (argc < 2) {
+ DebugPrintf("debugflag_disable <flag>\n");
+ } else {
+ if (Common::disableSpecialDebugLevel(argv[1])) {
+ DebugPrintf("Disabled debug flag '%s'\n", argv[1]);
+ } else {
+ DebugPrintf("Failed to disable debug flag '%s'\n", argv[1]);
+ }
+ }
+ return true;
+}
+
+// Console handler
+#if USE_CONSOLE
+bool Debugger::debuggerInputCallback(GUI::ConsoleDialog *console, const char *input, void *refCon) {
+ Debugger *debugger = (Debugger *)refCon;
+
+ return debugger->parseCommand(input);
+}
+
+
+bool Debugger::debuggerCompletionCallback(GUI::ConsoleDialog *console, const char *input, char*& completion, void *refCon) {
+ Debugger *debugger = (Debugger *)refCon;
+
+ return debugger->tabComplete(input, completion);
+}
+
+#endif
+
+} // End of namespace GUI
Copied: scummvm/trunk/gui/debugger.h (from rev 23887, scummvm/trunk/common/debugger.h)
===================================================================
--- scummvm/trunk/gui/debugger.h (rev 0)
+++ scummvm/trunk/gui/debugger.h 2006-09-16 16:58:27 UTC (rev 23890)
@@ -0,0 +1,158 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2002-2006 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ */
+
+#ifndef GUI_DEBUGGER_H
+#define GUI_DEBUGGER_H
+
+namespace GUI {
+
+// Choose between text console or ScummConsole
+#define USE_CONSOLE 1
+
+#ifdef USE_CONSOLE
+class ConsoleDialog;
+#endif
+
+class Debugger {
+public:
+ Debugger();
+ virtual ~Debugger();
+
+ int DebugPrintf(const char *format, ...);
+
+#ifndef __SYMBIAN32__ // gcc/UIQ doesn't like the debugger code for some reason? Actually get a cc1plus core dump here :)
+ // FIXME: Fingolfin asks: This code *used* to be a problem when GUI::Debugger
+ // was a template class. But is it really still causing problems, or can
+ // this hack go away now?
+ virtual void onFrame();
+
+ virtual void attach(const char *entry = 0);
+#else
+ void onFrame() {}
+ void attach(const char *entry = 0) {}
+#endif
+ bool isAttached() const { return _isAttached; }
+
+protected:
+ class Debuglet {
+ public:
+ virtual ~Debuglet() {}
+ virtual bool operator()(int argc, const char **argv) = 0;
+ };
+
+ template <class T>
+ class DelegateDebuglet : public Debuglet {
+ typedef bool (T::*Method)(int argc, const char **argv);
+
+ T *_delegate;
+ const Method _method;
+ public:
+ DelegateDebuglet(T *delegate, Method method)
+ : _delegate(delegate), _method(method) {
+ assert(delegate != 0);
+ }
+ virtual bool operator()(int argc, const char **argv) {
+ return (_delegate->*_method)(argc, argv);
+ };
+ };
+
+ // Convenicence macro for registering a method of a debugger class
+ // as the current command.
+ #define WRAP_METHOD(cls, method) \
+ new DelegateDebuglet<cls>(this, &cls::method)
+
+ enum {
+ DVAR_BYTE,
+ DVAR_INT,
+ DVAR_BOOL,
+ DVAR_INTARRAY,
+ DVAR_STRING
+ };
+
+ struct DVar {
+ char name[30];
+ void *variable;
+ int type, optional;
+ };
+
+ struct DCmd {
+ char name[30];
+ Debuglet *debuglet;
+ };
+
+ int _frame_countdown;
+ bool _detach_now;
+
+ // TODO: Consider replacing the following two arrays by a Hashmap
+
+ int _dvar_count;
+ DVar _dvars[256];
+
+ int _dcmd_count;
+ DCmd _dcmds[256];
+
+private:
+ bool _isAttached;
+ char *_errStr;
+ bool _firstTime;
+ GUI::ConsoleDialog *_debuggerDialog;
+
+protected:
+ // Hook for subclasses: Called just before enter() is run
+ virtual void preEnter() {}
+
+ // Hook for subclasses: Called just after enter() was run
+ virtual void postEnter() {}
+
+ // Hook for subclasses: Process the given command line.
+ // Should return true if and only if argv[0] is a known command and was
+ // handled, false otherwise.
+ virtual bool handleCommand(int argc, const char **argv, bool &keepRunning);
+
+
+private:
+//protected:
+ void detach();
+ void enter();
+
+ bool parseCommand(const char *input);
+ bool tabComplete(const char *input, char*& completion);
+
+protected:
+ void DVar_Register(const char *varname, void *pointer, int type, int optional);
+ void DCmd_Register(const char *cmdname, Debuglet *debuglet);
+
+ bool Cmd_Exit(int argc, const char **argv);
+ bool Cmd_Help(int argc, const char **argv);
+ bool Cmd_DebugFlagsList(int argc, const char **argv);
+ bool Cmd_DebugFlagEnable(int argc, const char **argv);
+ bool Cmd_DebugFlagDisable(int argc, const char **argv);
+
+#if USE_CONSOLE
+private:
+ static bool debuggerInputCallback(GUI::ConsoleDialog *console, const char *input, void *refCon);
+ static bool debuggerCompletionCallback(GUI::ConsoleDialog *console, const char *input, char*& completion, void *refCon);
+#endif
+};
+
+} // End of namespace GUI
+
+#endif
Modified: scummvm/trunk/gui/module.mk
===================================================================
--- scummvm/trunk/gui/module.mk 2006-09-16 15:19:23 UTC (rev 23889)
+++ scummvm/trunk/gui/module.mk 2006-09-16 16:58:27 UTC (rev 23890)
@@ -5,6 +5,7 @@
browser.o \
chooser.o \
console.o \
+ debugger.o \
dialog.o \
editable.o \
EditTextWidget.o \
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list