mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-21 19:51:49 +00:00
Merge pull request #1010 from dreammaster/debugger_params
GUI: Support double quoted debugger parameters
This commit is contained in:
commit
47f6c2e9b9
@ -1206,28 +1206,11 @@ void CGameObject::loadSurface() {
|
||||
}
|
||||
|
||||
bool CGameObject::changeView(const CString &viewName) {
|
||||
return changeView(viewName, "");
|
||||
return getRoot()->changeView(viewName, "");
|
||||
}
|
||||
|
||||
bool CGameObject::changeView(const CString &viewName, const CString &clipName) {
|
||||
CViewItem *newView = parseView(viewName);
|
||||
CGameManager *gameManager = getGameManager();
|
||||
CViewItem *oldView = gameManager->getView();
|
||||
|
||||
if (!oldView || !newView)
|
||||
return false;
|
||||
|
||||
CMovieClip *clip = nullptr;
|
||||
if (!clipName.empty()) {
|
||||
clip = oldView->findNode()->findRoom()->findClip(clipName);
|
||||
} else {
|
||||
CLinkItem *link = oldView->findLink(newView);
|
||||
if (link)
|
||||
clip = link->getClip();
|
||||
}
|
||||
|
||||
gameManager->_gameState.changeView(newView, clip);
|
||||
return true;
|
||||
return getRoot()->changeView(viewName, clipName);
|
||||
}
|
||||
|
||||
void CGameObject::dragMove(const Point &pt) {
|
||||
|
@ -631,4 +631,30 @@ CViewItem *CProjectItem::parseView(const CString &viewString) {
|
||||
return view;
|
||||
}
|
||||
|
||||
bool CProjectItem::changeView(const CString &viewName) {
|
||||
return changeView(viewName, "");
|
||||
}
|
||||
|
||||
bool CProjectItem::changeView(const CString &viewName, const CString &clipName) {
|
||||
CViewItem *newView = parseView(viewName);
|
||||
CGameManager *gameManager = getGameManager();
|
||||
CViewItem *oldView = gameManager->getView();
|
||||
|
||||
if (!oldView || !newView)
|
||||
return false;
|
||||
|
||||
CMovieClip *clip = nullptr;
|
||||
if (!clipName.empty()) {
|
||||
clip = oldView->findNode()->findRoom()->findClip(clipName);
|
||||
} else {
|
||||
CLinkItem *link = oldView->findLink(newView);
|
||||
if (link)
|
||||
clip = link->getClip();
|
||||
}
|
||||
|
||||
gameManager->_gameState.changeView(newView, clip);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
} // End of namespace Titanic
|
||||
|
@ -242,6 +242,15 @@ public:
|
||||
*/
|
||||
CViewItem *parseView(const CString &viewString);
|
||||
|
||||
/**
|
||||
* Change the view
|
||||
*/
|
||||
bool changeView(const CString &viewName, const CString &clipName);
|
||||
|
||||
/**
|
||||
* Change the view
|
||||
*/
|
||||
bool changeView(const CString &viewName);
|
||||
};
|
||||
|
||||
} // End of namespace Titanic
|
||||
|
@ -168,9 +168,18 @@ bool Debugger::cmdRoom(int argc, const char **argv) {
|
||||
} else if (argc >= 2) {
|
||||
CRoomItem *roomItem = findRoom(argv[1]);
|
||||
|
||||
if (!roomItem)
|
||||
debugPrintf("Could not find room - %s\n", argv[1]);
|
||||
else if (argc == 2)
|
||||
if (!roomItem && argc == 2) {
|
||||
// Presume it's a full view specified
|
||||
CProjectItem *project = g_vm->_window->_project;
|
||||
CViewItem *view = project->parseView(argv[1]);
|
||||
|
||||
if (view) {
|
||||
project->changeView(argv[1]);
|
||||
return false;
|
||||
} else {
|
||||
debugPrintf("Could not find view - %s\n", argv[1]);
|
||||
}
|
||||
} else if (argc == 2)
|
||||
listRoom(roomItem);
|
||||
else {
|
||||
CNodeItem *nodeItem = findNode(roomItem, argv[2]);
|
||||
@ -322,9 +331,6 @@ bool Debugger::cmdMovie(int argc, const char **argv) {
|
||||
bool Debugger::cmdSound(int argc, const char **argv) {
|
||||
if (argc == 2) {
|
||||
Common::String name = argv[1];
|
||||
const char *ch = strchr(argv[1], '!');
|
||||
if (ch)
|
||||
name.setChar('#', ch - argv[1]);
|
||||
if (!name.contains("#"))
|
||||
name = "z#" + name;
|
||||
|
||||
|
@ -480,9 +480,7 @@ void ConsoleDialog::handleKeyDown(Common::KeyState state) {
|
||||
}
|
||||
|
||||
void ConsoleDialog::defaultKeyDownHandler(Common::KeyState &state) {
|
||||
if (state.ascii == '~' || state.ascii == '#') {
|
||||
slideUpAndClose();
|
||||
} else if (state.hasFlags(Common::KBD_CTRL)) {
|
||||
if (state.hasFlags(Common::KBD_CTRL)) {
|
||||
specialKeys(state.keycode);
|
||||
} else if ((state.ascii >= 32 && state.ascii <= 127) || (state.ascii >= 160 && state.ascii <= 255)) {
|
||||
for (int i = _promptEndPos - 1; i >= _currentPos; i--)
|
||||
|
@ -289,17 +289,11 @@ bool Debugger::handleCommand(int argc, const char **argv, bool &result) {
|
||||
bool Debugger::parseCommand(const char *inputOrig) {
|
||||
int 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;
|
||||
}
|
||||
// One of the rare occasions using strdup is OK, since splitCommands needs to modify it
|
||||
char *input = strdup(inputOrig);
|
||||
splitCommand(input, num_params, ¶m[0]);
|
||||
|
||||
// Handle commands first
|
||||
bool result;
|
||||
@ -399,6 +393,57 @@ bool Debugger::parseCommand(const char *inputOrig) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void Debugger::splitCommand(char *input, int &argc, const char **argv) {
|
||||
byte c;
|
||||
enum states { DULL, IN_WORD, IN_STRING } state = DULL;
|
||||
const char *paramStart = nullptr;
|
||||
|
||||
argc = 0;
|
||||
for (char *p = input; *p; ++p) {
|
||||
c = (byte)*p;
|
||||
|
||||
switch (state) {
|
||||
case DULL:
|
||||
// not in a word, not in a double quoted string
|
||||
if (isspace(c))
|
||||
break;
|
||||
|
||||
// not a space -- if it's a double quote we go to IN_STRING, else to IN_WORD
|
||||
if (c == '"') {
|
||||
state = IN_STRING;
|
||||
paramStart = p + 1; // word starts at *next* char, not this one
|
||||
} else {
|
||||
state = IN_WORD;
|
||||
paramStart = p; // word starts here
|
||||
}
|
||||
break;
|
||||
|
||||
case IN_STRING:
|
||||
// we're in a double quoted string, so keep going until we hit a close "
|
||||
if (c == '"') {
|
||||
// Add entire quoted string to parameter list
|
||||
*p = '\0';
|
||||
argv[argc++] = paramStart;
|
||||
state = DULL; // back to "not in word, not in string" state
|
||||
}
|
||||
break;
|
||||
|
||||
case IN_WORD:
|
||||
// we're in a word, so keep going until we get to a space
|
||||
if (isspace(c)) {
|
||||
*p = '\0';
|
||||
argv[argc++] = paramStart;
|
||||
state = DULL; // back to "not in word, not in string" state
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (state != DULL)
|
||||
// Add in final parameter
|
||||
argv[argc++] = paramStart;
|
||||
}
|
||||
|
||||
// returns true if something has been completed
|
||||
// completion has to be delete[]-ed then
|
||||
bool Debugger::tabComplete(const char *input, Common::String &completion) const {
|
||||
|
@ -204,6 +204,12 @@ protected:
|
||||
private:
|
||||
void enter();
|
||||
|
||||
/**
|
||||
* Splits up the input into individual parameters
|
||||
* @remarks Adapted from code provided by torek on StackOverflow
|
||||
*/
|
||||
void splitCommand(char *input, int &argc, const char **argv);
|
||||
|
||||
bool parseCommand(const char *input);
|
||||
bool tabComplete(const char *input, Common::String &completion) const;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user