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.
This commit is contained in:
Andrew Burgess 2023-10-20 14:20:35 +01:00
parent f3a8a979bb
commit 7f51f2cd58
3 changed files with 70 additions and 65 deletions

View File

@ -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 ()

View File

@ -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. */

View File

@ -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