X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fcompleter.c;h=3a17445004d92b102916474e0116f10945a4537d;hb=d16c467a501547e37b111f775396e28f8bf27c1e;hp=0f4e7f9ca75f1fd936831821b4f7b2d6410de057;hpb=e6ed716cd5514c08b9d7c469d185b1aa177dbc22;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/completer.c b/gdb/completer.c index 0f4e7f9ca7..3a17445004 100644 --- a/gdb/completer.c +++ b/gdb/completer.c @@ -1,5 +1,5 @@ /* Line completion stuff for GDB, the GNU debugger. - Copyright (C) 2000-2019 Free Software Foundation, Inc. + Copyright (C) 2000-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -22,7 +22,7 @@ #include "expression.h" #include "filenames.h" /* For DOSish file names. */ #include "language.h" -#include "common/gdb_signals.h" +#include "gdbsupport/gdb_signals.h" #include "target.h" #include "reggroups.h" #include "user-regs.h" @@ -102,13 +102,13 @@ enum explicit_location_match_type /* Variables which are necessary for fancy command line editing. */ -/* When completing on command names, we remove '-' from the list of +/* When completing on command names, we remove '-' and '.' from the list of word break characters, since we use it in command names. If the readline library sees one in any of the current completion strings, it thinks that the string needs to be quoted and automatically supplies a leading quote. */ static const char gdb_completer_command_word_break_characters[] = -" \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,"; +" \t\n!@#$%^&*()+=|~`}{[]\"';:?/><,"; /* When completing on file names, we remove from the list of word break characters any characters that are commonly used in file @@ -423,6 +423,39 @@ completion_tracker::completes_to_completion_word (const char *word) return false; } +/* See completer.h. */ + +void +complete_nested_command_line (completion_tracker &tracker, const char *text) +{ + /* Must be called from a custom-word-point completer. */ + gdb_assert (tracker.use_custom_word_point ()); + + /* Disable the custom word point temporarily, because we want to + probe whether the command we're completing itself uses a custom + word point. */ + tracker.set_use_custom_word_point (false); + size_t save_custom_word_point = tracker.custom_word_point (); + + int quote_char = '\0'; + const char *word = completion_find_completion_word (tracker, text, + "e_char); + + if (tracker.use_custom_word_point ()) + { + /* The command we're completing uses a custom word point, so the + tracker already contains the matches. We're done. */ + return; + } + + /* Restore the custom word point settings. */ + tracker.set_custom_word_point (save_custom_word_point); + tracker.set_use_custom_word_point (true); + + /* Run the handle_completions completer phase. */ + complete_line (tracker, word, text, strlen (text)); +} + /* Complete on linespecs, which might be of two possible forms: file:line @@ -832,7 +865,7 @@ complete_explicit_location (completion_tracker &tracker, else if (quoted_arg_end[1] == ' ') { /* We're maybe past the explicit location argument. - Skip the argument without interpretion, assuming the + Skip the argument without interpretation, assuming the user may want to create pending breakpoint. Offer the keyword and explicit location options as possible completions. */ @@ -1108,23 +1141,6 @@ set_rl_completer_word_break_characters (const char *break_chars) rl_completer_word_break_characters = (char *) break_chars; } -/* See definition in completer.h. */ - -void -set_gdb_completion_word_break_characters (completer_ftype *fn) -{ - const char *break_chars; - - /* So far we are only interested in differentiating filename - completers from everything else. */ - if (fn == filename_completer) - break_chars = gdb_completer_file_name_break_characters; - else - break_chars = gdb_completer_command_word_break_characters; - - set_rl_completer_word_break_characters (break_chars); -} - /* Complete on symbols. */ void @@ -1268,7 +1284,7 @@ complete_line_internal_1 (completion_tracker &tracker, on command strings (as opposed to strings supplied by the individual command completer functions, which can be any string) then we will switch to the special word break set for command - strings, which leaves out the '-' character used in some + strings, which leaves out the '-' and '.' character used in some commands. */ set_rl_completer_word_break_characters (current_language->la_word_break_characters()); @@ -1331,7 +1347,7 @@ complete_line_internal_1 (completion_tracker &tracker, /* lookup_cmd_1 advances p up to the first ambiguous thing, but doesn't advance over that thing itself. Do so now. */ q = p; - while (*q && (isalnum (*q) || *q == '-' || *q == '_')) + while (valid_cmd_char_p (*q)) ++q; if (q != tmp_command + point) { @@ -1419,7 +1435,7 @@ complete_line_internal_1 (completion_tracker &tracker, q = p; while (q > tmp_command) { - if (isalnum (q[-1]) || q[-1] == '-' || q[-1] == '_') + if (valid_cmd_char_p (q[-1])) --q; else break; @@ -1894,6 +1910,9 @@ gdb_completion_word_break_characters_throw () { gdb_assert (tracker.custom_word_point () > 0); rl_point = tracker.custom_word_point () - 1; + + gdb_assert (rl_point >= 0 && rl_point < strlen (rl_line_buffer)); + gdb_custom_word_point_brkchars[0] = rl_line_buffer[rl_point]; rl_completer_word_break_characters = gdb_custom_word_point_brkchars; rl_completer_quote_characters = NULL;