From 6e035501e15e72398fcd9db88c97dd30e585a9ae Mon Sep 17 00:00:00 2001 From: Jan Vrany Date: Fri, 17 May 2019 10:58:23 +0100 Subject: [PATCH] MI: extract command completion logic from complete_command() Extract completion logic from CLI complete_command() into a new helper function complete(). gdb/Changelog: * completer.h (complete): New function. * completer.c (complete): Likewise. * cli/cli-cmds.c: (complete_command): Update to use new complete() function defined in completer.h. --- gdb/ChangeLog | 7 +++++++ gdb/cli/cli-cmds.c | 29 +---------------------------- gdb/completer.c | 35 +++++++++++++++++++++++++++++++++++ gdb/completer.h | 7 +++++++ 4 files changed, 50 insertions(+), 28 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fd9f70141be..f05cbb9f7cb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2019-01-24 Jan Vrany + + * completer.h (complete): New function. + * completer.c (complete): Likewise. + * cli/cli-cmds.c: (complete_command): Update to use new complete() + function defined in completer.h. + 2019-05-17 Jan Vrany * MAINTAINERS (Write After Approval): Add myself. diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index 3d8e2387ff7..332078b910f 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -243,40 +243,13 @@ complete_command (const char *arg, int from_tty) if (arg == NULL) arg = ""; - completion_tracker tracker_handle_brkchars; - completion_tracker tracker_handle_completions; - completion_tracker *tracker; - int quote_char = '\0'; const char *word; - try - { - word = completion_find_completion_word (tracker_handle_brkchars, - arg, "e_char); - - /* Completers that provide a custom word point in the - handle_brkchars phase also compute their completions then. - Completers that leave the completion word handling to readline - must be called twice. */ - if (tracker_handle_brkchars.use_custom_word_point ()) - tracker = &tracker_handle_brkchars; - else - { - complete_line (tracker_handle_completions, word, arg, strlen (arg)); - tracker = &tracker_handle_completions; - } - } - catch (const gdb_exception &ex) - { - return; - } + completion_result result = complete (arg, &word, "e_char); std::string arg_prefix (arg, word - arg); - completion_result result - = tracker->build_completion_result (word, word - arg, strlen (arg)); - if (result.number_matches != 0) { if (result.number_matches == 1) diff --git a/gdb/completer.c b/gdb/completer.c index 5d1decca1d1..cc2f80bc66e 100644 --- a/gdb/completer.c +++ b/gdb/completer.c @@ -1613,6 +1613,41 @@ make_completion_match_str (gdb::unique_xmalloc_ptr &&match_name, return gdb::unique_xmalloc_ptr (newobj); } +/* See complete.h. */ + +completion_result +complete (const char *line, char const **word, int *quote_char) +{ + completion_tracker tracker_handle_brkchars; + completion_tracker tracker_handle_completions; + completion_tracker *tracker; + + try + { + *word = completion_find_completion_word (tracker_handle_brkchars, + line, quote_char); + + /* Completers that provide a custom word point in the + handle_brkchars phase also compute their completions then. + Completers that leave the completion word handling to readline + must be called twice. */ + if (tracker_handle_brkchars.use_custom_word_point ()) + tracker = &tracker_handle_brkchars; + else + { + complete_line (tracker_handle_completions, *word, line, strlen (line)); + tracker = &tracker_handle_completions; + } + } + catch (const gdb_exception &ex) + { + return {}; + } + + return tracker->build_completion_result (*word, *word - line, strlen (line)); +} + + /* Generate completions all at once. Does nothing if max_completions is 0. If max_completions is non-negative, this will collect at most max_completions strings. diff --git a/gdb/completer.h b/gdb/completer.h index 52f8d7dff4f..38a0132ca4d 100644 --- a/gdb/completer.h +++ b/gdb/completer.h @@ -510,6 +510,13 @@ extern void complete_line (completion_tracker &tracker, const char *line_buffer, int point); +/* Complete LINE and return completion results. For completion purposes, + cursor position is assumed to be at the end of LINE. WORD is set to + the end of word to complete. QUOTE_CHAR is set to the opening quote + character if we found an unclosed quoted substring, '\0' otherwise. */ +extern completion_result + complete (const char *line, char const **word, int *quote_char); + /* Find the bounds of the word in TEXT for completion purposes, and return a pointer to the end of the word. Calls the completion machinery for a handle_brkchars phase (using TRACKER) to figure out -- 2.30.2