aboutsummaryrefslogtreecommitdiff
path: root/debugrl.cpp
diff options
context:
space:
mode:
authorClaudio Matsuoka2001-11-19 00:04:34 +0000
committerClaudio Matsuoka2001-11-19 00:04:34 +0000
commit14d89432bbd4f3af9cc2f4041f20263c88756da3 (patch)
tree93ad8bda22dbbaa0d489401d35f7b9828b5d61cf /debugrl.cpp
parentb9074d5dd1ae724a6d07ee0ebe66aefe1438f9cb (diff)
downloadscummvm-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.cpp86
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 */