diff options
author | Claudio Matsuoka | 2001-11-19 00:04:34 +0000 |
---|---|---|
committer | Claudio Matsuoka | 2001-11-19 00:04:34 +0000 |
commit | 14d89432bbd4f3af9cc2f4041f20263c88756da3 (patch) | |
tree | 93ad8bda22dbbaa0d489401d35f7b9828b5d61cf /debugrl.cpp | |
parent | b9074d5dd1ae724a6d07ee0ebe66aefe1438f9cb (diff) | |
download | scummvm-rg350-14d89432bbd4f3af9cc2f4041f20263c88756da3.tar.gz scummvm-rg350-14d89432bbd4f3af9cc2f4041f20263c88756da3.tar.bz2 scummvm-rg350-14d89432bbd4f3af9cc2f4041f20263c88756da3.zip |
Merged Tom Dunstan's debugger readline patch. Define
HAVE_READLINE to enable it.
svn-id: r3500
Diffstat (limited to 'debugrl.cpp')
-rw-r--r-- | debugrl.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/debugrl.cpp b/debugrl.cpp new file mode 100644 index 0000000000..86d72327a0 --- /dev/null +++ b/debugrl.cpp @@ -0,0 +1,86 @@ +#ifdef HAVE_READLINE + +#include "debugrl.h" + +// A lot of this was ripped straight from the readline fileman.c example. + +char* _debugger_commands[] = { + "help", + "quit", + "go", + "actor", + "scripts", + "exit", + (char *)NULL +}; + + +// forwards decls +char ** scumm_debugger_completion (const char *text, int start, int end); +char * scumm_debugger_command_generator (const char *text, int state); + +void initialize_readline () { + /* Allow conditional parsing of the ~/.inputrc file. */ + rl_readline_name = "scummvm"; + + /* Tell the completer that we want a crack first. */ + rl_attempted_completion_function = scumm_debugger_completion; +} + +char ** scumm_debugger_completion (const char *text, int start, int end) { + + char **matches; + + matches = (char **)NULL; + + // If this word is at the start of the line, then it is a command + // to complete. + if (start == 0) { + matches = rl_completion_matches (text, scumm_debugger_command_generator); + } else { + // At some stage it'd be nice to have symbolic actor name completion + // or something similarly groovy. Not right now though. + } + + // This just makes sure that readline doesn't try to use its default + // completer, which uses filenames in the current dir, if we can't find + // a match, since filenames don't have much use in the debuger :) + // There's probably a nice way to do this once, rather than every time. + rl_attempted_completion_over = 1; + + return (matches); +} + + +/* Generator function for command completion. STATE lets us know whether + to start from scratch; without any state (i.e. STATE == 0), then we + start at the top of the list. */ +char * scumm_debugger_command_generator (const char *text, int state) { + + static int list_index, len; + char *name; + + /* If this is a new word to complete, initialize now. This includes + saving the length of TEXT for efficiency, and initializing the index + variable to 0. */ + if (!state) + { + list_index = 0; + len = strlen (text); + } + + /* Return the next name which partially matches from the command list. */ + while (name = _debugger_commands[list_index]) + { + list_index++; + + if (strncmp (name, text, len) == 0) + //return (dupstr(name)); + return strdup(name); + } + + /* If no names matched, then return NULL. */ + return ((char *)NULL); +} + +#endif /* HAVE_READLINE */ |