--- freem/src/mdebug.c 2025/05/01 21:02:31 1.12 +++ freem/src/mdebug.c 2025/05/20 18:07:41 1.13 @@ -1,5 +1,5 @@ /* - * $Id: mdebug.c,v 1.12 2025/05/01 21:02:31 snw Exp $ + * $Id: mdebug.c,v 1.13 2025/05/20 18:07:41 snw Exp $ * debugger enhancements * * @@ -24,6 +24,9 @@ * along with FreeM. If not, see . * * $Log: mdebug.c,v $ + * Revision 1.13 2025/05/20 18:07:41 snw + * Add completion to debugger + * * Revision 1.12 2025/05/01 21:02:31 snw * Documentation updates * @@ -98,6 +101,51 @@ extern int read_history (); #include "freem.h" #include "mref.h" +#ifdef HAVE_LIBREADLINE +char *dbg_commands[] = { + "backtrace", + "continue", + "examine", + "exit", + "halt", + "next", + "quit", + "step", + "trace", + "watch", + NULL +}; + +char **dbg_completion(const char *, int, int); +char *dbg_generator(const char *, int); + +char **dbg_completion(const char *text, int start, int end) +{ + if (start > 0) return NULL; + rl_attempted_completion_over = 1; + return rl_completion_matches (text, dbg_generator); +} + +char *dbg_generator(const char *text, int state) +{ + static int list_index, len; + char *name; + + if (!state) { + list_index = 0; + len = strlen(text); + } + + while ((name = dbg_commands[list_index++])) { + if (strncmp (name, text, len) == 0) { + return strdup (name); + } + } + + return NULL; +} +#endif + dbg_watch dbg_watchlist[MAXWATCH]; /* list of watchpoints */ short dbg_enable_watch; /* 0 = watches disabled, 1 = watches enabled */ int dbg_pending_watches; @@ -142,7 +190,8 @@ int debugger (int entry_mode, char *entr char tbuf2[512]; register int i; register int j; - + + rl_attempted_completion_function = dbg_completion; set_io (UNIX); if (first_entry) {