X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fcompleter.c;h=0f4e7f9ca75f1fd936831821b4f7b2d6410de057;hb=e6ed716cd5514c08b9d7c469d185b1aa177dbc22;hp=6d87174253c5461a80b57b09462cdd611e6e53b1;hpb=a70b814420059e1f2de2130d532ddd7b2b2500fc;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/completer.c b/gdb/completer.c index 6d87174253..0f4e7f9ca7 100644 --- a/gdb/completer.c +++ b/gdb/completer.c @@ -352,29 +352,58 @@ gdb_rl_find_completion_word (struct gdb_rl_completion_word_info *info, return line_buffer + point; } -/* See completer.h. */ +/* Find the completion word point for TEXT, emulating the algorithm + readline uses to find the word point, using WORD_BREAK_CHARACTERS + as word break characters. */ -const char * -advance_to_expression_complete_word_point (completion_tracker &tracker, - const char *text) +static const char * +advance_to_completion_word (completion_tracker &tracker, + const char *word_break_characters, + const char *text) { gdb_rl_completion_word_info info; - info.word_break_characters - = current_language->la_word_break_characters (); + info.word_break_characters = word_break_characters; info.quote_characters = gdb_completer_quote_characters; info.basic_quote_characters = rl_basic_quote_characters; + int delimiter; const char *start - = gdb_rl_find_completion_word (&info, NULL, NULL, text); + = gdb_rl_find_completion_word (&info, NULL, &delimiter, text); tracker.advance_custom_word_point_by (start - text); + if (delimiter) + { + tracker.set_quote_char (delimiter); + tracker.set_suppress_append_ws (true); + } + return start; } /* See completer.h. */ +const char * +advance_to_expression_complete_word_point (completion_tracker &tracker, + const char *text) +{ + const char *brk_chars = current_language->la_word_break_characters (); + return advance_to_completion_word (tracker, brk_chars, text); +} + +/* See completer.h. */ + +const char * +advance_to_filename_complete_word_point (completion_tracker &tracker, + const char *text) +{ + const char *brk_chars = gdb_completer_file_name_break_characters; + return advance_to_completion_word (tracker, brk_chars, text); +} + +/* See completer.h. */ + bool completion_tracker::completes_to_completion_word (const char *word) { @@ -798,9 +827,7 @@ complete_explicit_location (completion_tracker &tracker, before: "b -function 'not_loaded_function_yet()'" after: "b -function 'not_loaded_function_yet()' " */ - gdb::unique_xmalloc_ptr text_copy - (xstrdup (text)); - tracker.add_completion (std::move (text_copy)); + tracker.add_completion (make_unique_xstrdup (text)); } else if (quoted_arg_end[1] == ' ') { @@ -1025,7 +1052,7 @@ complete_expression (completion_tracker &tracker, { type = parse_expression_for_completion (text, &fieldname, &code); } - catch (const gdb_exception_RETURN_MASK_ERROR &except) + catch (const gdb_exception_error &except) { return; } @@ -1398,6 +1425,9 @@ complete_line_internal_1 (completion_tracker &tracker, break; } + /* Move the custom word point back too. */ + tracker.advance_custom_word_point_by (q - p); + if (reason != handle_brkchars) complete_on_cmdlist (result_list, tracker, q, word, ignore_help_classes); @@ -1448,10 +1478,10 @@ complete_line_internal (completion_tracker &tracker, { complete_line_internal_1 (tracker, text, line_buffer, point, reason); } - catch (const gdb_exception_RETURN_MASK_ERROR &except) + catch (const gdb_exception_error &except) { if (except.error != MAX_COMPLETIONS_REACHED_ERROR) - throw_exception (except); + throw; } } @@ -1613,6 +1643,48 @@ 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; + + /* The WORD should be set to the end of word to complete. We initialize + to the completion point which is assumed to be at the end of LINE. + This leaves WORD to be initialized to a sensible value in cases + completion_find_completion_word() fails i.e., throws an exception. + See bug 24587. */ + *word = line + strlen (line); + + 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. @@ -1681,10 +1753,7 @@ signal_completer (struct cmd_list_element *ignore, continue; if (strncasecmp (signame, word, len) == 0) - { - gdb::unique_xmalloc_ptr copy (xstrdup (signame)); - tracker.add_completion (std::move (copy)); - } + tracker.add_completion (make_unique_xstrdup (signame)); } } @@ -1723,10 +1792,7 @@ reg_or_group_completer_1 (completion_tracker &tracker, i++) { if (*name != '\0' && strncmp (word, name, len) == 0) - { - gdb::unique_xmalloc_ptr copy (xstrdup (name)); - tracker.add_completion (std::move (copy)); - } + tracker.add_completion (make_unique_xstrdup (name)); } } @@ -1740,10 +1806,7 @@ reg_or_group_completer_1 (completion_tracker &tracker, { name = reggroup_name (group); if (strncmp (word, name, len) == 0) - { - gdb::unique_xmalloc_ptr copy (xstrdup (name)); - tracker.add_completion (std::move (copy)); - } + tracker.add_completion (make_unique_xstrdup (name)); } } } @@ -1861,7 +1924,7 @@ gdb_completion_word_break_characters () { return gdb_completion_word_break_characters_throw (); } - catch (const gdb_exception_RETURN_MASK_ALL &ex) + catch (const gdb_exception &ex) { /* Set this to that gdb_rl_attempted_completion_function knows to abort early. */ @@ -1934,7 +1997,7 @@ completion_tracker::recompute_lowest_common_denominator /* See completer.h. */ void -completion_tracker::advance_custom_word_point_by (size_t len) +completion_tracker::advance_custom_word_point_by (int len) { m_custom_word_point += len; } @@ -2208,7 +2271,7 @@ gdb_rl_attempted_completion_function (const char *text, int start, int end) { return gdb_rl_attempted_completion_function_throw (text, start, end); } - catch (const gdb_exception_RETURN_MASK_ALL &ex) + catch (const gdb_exception &ex) { }