From 7f51f2cd5866d485898fd4b60827fa3643252b71 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Fri, 20 Oct 2023 14:20:35 +0100 Subject: [PATCH] gdb: make skip_over_slash_fmt available outside printcmd.c Move the function skip_over_slash_fmt into completer.c, and make it extern, with a declaration in completer.h. This is a refactor in order to support the next commit. I've not changed any of the code in skip_over_slash_fmt. There should be no user visible changes after this commit. --- gdb/completer.c | 53 ++++++++++++++++++++++++++++++++++++++++ gdb/completer.h | 17 +++++++++++++ gdb/printcmd.c | 65 ------------------------------------------------- 3 files changed, 70 insertions(+), 65 deletions(-) diff --git a/gdb/completer.c b/gdb/completer.c index 8942a3f7950..d5799c0d1ff 100644 --- a/gdb/completer.c +++ b/gdb/completer.c @@ -2991,6 +2991,59 @@ gdb_display_match_list (char **matches, int len, int max, } } +/* See completer.h. */ + +bool +skip_over_slash_fmt (completion_tracker &tracker, const char **args) +{ + const char *text = *args; + + if (text[0] == '/') + { + bool in_fmt; + tracker.set_use_custom_word_point (true); + + if (text[1] == '\0') + { + /* The user tried to complete after typing just the '/' character + of the /FMT string. Step the completer past the '/', but we + don't offer any completions. */ + in_fmt = true; + ++text; + } + else + { + /* The user has typed some characters after the '/', we assume + this is a complete /FMT string, first skip over it. */ + text = skip_to_space (text); + + if (*text == '\0') + { + /* We're at the end of the input string. The user has typed + '/FMT' and asked for a completion. Push an empty + completion string, this will cause readline to insert a + space so the user now has '/FMT '. */ + in_fmt = true; + tracker.add_completion (make_unique_xstrdup (text)); + } + else + { + /* The user has already typed things after the /FMT, skip the + whitespace and return false. Whoever called this function + should then try to complete what comes next. */ + in_fmt = false; + text = skip_spaces (text); + } + } + + tracker.advance_custom_word_point_by (text - *args); + *args = text; + return in_fmt; + } + + return false; +} + void _initialize_completer (); void _initialize_completer () diff --git a/gdb/completer.h b/gdb/completer.h index 67d2fbf9d38..d96c4b515d3 100644 --- a/gdb/completer.h +++ b/gdb/completer.h @@ -657,6 +657,23 @@ extern const char *skip_quoted_chars (const char *, const char *, extern const char *skip_quoted (const char *); +/* Called from command completion function to skip over /FMT + specifications, allowing the rest of the line to be completed. Returns + true if the /FMT is at the end of the current line and there is nothing + left to complete, otherwise false is returned. + + In either case *ARGS can be updated to point after any part of /FMT that + is present. + + This function is designed so that trying to complete '/' will offer no + completions, the user needs to insert the format specification + themselves. Trying to complete '/FMT' (where FMT is any non-empty set + of alpha-numeric characters) will cause readline to insert a single + space, setting the user up to enter the expression. */ + +extern bool skip_over_slash_fmt (completion_tracker &tracker, + const char **args); + /* Maximum number of candidates to consider before the completer bails by throwing MAX_COMPLETIONS_REACHED_ERROR. Negative values disable limiting. */ diff --git a/gdb/printcmd.c b/gdb/printcmd.c index 06cc5316eec..c5e6a815580 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -1380,71 +1380,6 @@ print_command_1 (const char *args, int voidprint) } } -/* Called from command completion function to skip over /FMT - specifications, allowing the rest of the line to be completed. Returns - true if the /FMT is at the end of the current line and there is nothing - left to complete, otherwise false is returned. - - In either case *ARGS can be updated to point after any part of /FMT that - is present. - - This function is designed so that trying to complete '/' will offer no - completions, the user needs to insert the format specification - themselves. Trying to complete '/FMT' (where FMT is any non-empty set - of alpha-numeric characters) will cause readline to insert a single - space, setting the user up to enter the expression. */ - -static bool -skip_over_slash_fmt (completion_tracker &tracker, const char **args) -{ - const char *text = *args; - - if (text[0] == '/') - { - bool in_fmt; - tracker.set_use_custom_word_point (true); - - if (text[1] == '\0') - { - /* The user tried to complete after typing just the '/' character - of the /FMT string. Step the completer past the '/', but we - don't offer any completions. */ - in_fmt = true; - ++text; - } - else - { - /* The user has typed some characters after the '/', we assume - this is a complete /FMT string, first skip over it. */ - text = skip_to_space (text); - - if (*text == '\0') - { - /* We're at the end of the input string. The user has typed - '/FMT' and asked for a completion. Push an empty - completion string, this will cause readline to insert a - space so the user now has '/FMT '. */ - in_fmt = true; - tracker.add_completion (make_unique_xstrdup (text)); - } - else - { - /* The user has already typed things after the /FMT, skip the - whitespace and return false. Whoever called this function - should then try to complete what comes next. */ - in_fmt = false; - text = skip_spaces (text); - } - } - - tracker.advance_custom_word_point_by (text - *args); - *args = text; - return in_fmt; - } - - return false; -} - /* See valprint.h. */ void -- 2.30.2