X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fcompleter.h;h=cf93cf0d5a5f6bd4841d794a9583c87aaa341d61;hb=6a2c1b8790e58ce0688507b5b1f8369aa621a665;hp=5e91030c792dcbb74408d14ae6ec018c9eebafc6;hpb=71c247087cbff23fbbe10333a9e504f3e197c107;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/completer.h b/gdb/completer.h index 5e91030c79..cf93cf0d5a 100644 --- a/gdb/completer.h +++ b/gdb/completer.h @@ -1,5 +1,5 @@ /* Header for GDB line completion. - Copyright (C) 2000-2014 Free Software Foundation, Inc. + Copyright (C) 2000-2017 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,44 +20,256 @@ #include "gdb_vecs.h" #include "command.h" -extern VEC (char_ptr) *complete_line (const char *text, - const char *line_buffer, - int point); +/* Types of functions in struct match_list_displayer. */ -extern char *readline_line_completion_function (const char *text, - int matches); +struct match_list_displayer; -extern VEC (char_ptr) *noop_completer (struct cmd_list_element *, - const char *, const char *); +typedef void mld_crlf_ftype (const struct match_list_displayer *); +typedef void mld_putch_ftype (const struct match_list_displayer *, int); +typedef void mld_puts_ftype (const struct match_list_displayer *, + const char *); +typedef void mld_flush_ftype (const struct match_list_displayer *); +typedef void mld_erase_entire_line_ftype (const struct match_list_displayer *); +typedef void mld_beep_ftype (const struct match_list_displayer *); +typedef int mld_read_key_ftype (const struct match_list_displayer *); -extern VEC (char_ptr) *filename_completer (struct cmd_list_element *, - const char *, const char *); +/* Interface between CLI/TUI and gdb_match_list_displayer. */ -extern VEC (char_ptr) *expression_completer (struct cmd_list_element *, - const char *, const char *); +struct match_list_displayer +{ + /* The screen dimensions to work with when displaying matches. */ + int height, width; -extern VEC (char_ptr) *location_completer (struct cmd_list_element *, - const char *, const char *); + /* Print cr,lf. */ + mld_crlf_ftype *crlf; -extern VEC (char_ptr) *command_completer (struct cmd_list_element *, - const char *, const char *); + /* Not "putc" to avoid issues where it is a stdio macro. Sigh. */ + mld_putch_ftype *putch; -extern VEC (char_ptr) *signal_completer (struct cmd_list_element *, - const char *, const char *); + /* Print a string. */ + mld_puts_ftype *puts; -extern VEC (char_ptr) *reg_or_group_completer (struct cmd_list_element *, - const char *, const char *); + /* Flush all accumulated output. */ + mld_flush_ftype *flush; -extern char *get_gdb_completer_quote_characters (void); + /* Erase the currently line on the terminal (but don't discard any text the + user has entered, readline may shortly re-print it). */ + mld_erase_entire_line_ftype *erase_entire_line; + + /* Ring the bell. */ + mld_beep_ftype *beep; + + /* Read one key. */ + mld_read_key_ftype *read_key; +}; + +/* A list of completion candidates. Each element is a malloc string, + because ownership of the strings is transferred to readline, which + calls free on each element. */ +typedef std::vector> completion_list; + +/* The final result of a completion that is handed over to either + readline or the "completion" command (which pretends to be + readline). Mainly a wrapper for a readline-style match list array, + though other bits of info are included too. */ + +struct completion_result +{ + /* Create an empty result. */ + completion_result (); + + /* Create a result. */ + completion_result (char **match_list, size_t number_matches, + bool completion_suppress_append); + + /* Destroy a result. */ + ~completion_result (); + + /* Disable copying, since we don't need it. */ + completion_result (const completion_result &rhs) = delete; + void operator= (const completion_result &rhs) = delete; + + /* Move a result. */ + completion_result (completion_result &&rhs); + + /* Release ownership of the match list array. */ + char **release_match_list (); + + /* Sort the match list. */ + void sort_match_list (); + +private: + /* Destroy the match list array and its contents. */ + void reset_match_list (); + +public: + /* (There's no point in making these fields private, since the whole + point of this wrapper is to build data in the layout expected by + readline. Making them private would require adding getters for + the "complete" command, which would expose the same + implementation details anyway.) */ + + /* The match list array, in the format that readline expects. + match_list[0] contains the common prefix. The real match list + starts at index 1. The list is NULL terminated. If there's only + one match, then match_list[1] is NULL. If there are no matches, + then this is NULL. */ + char **match_list; + /* The number of matched completions in MATCH_LIST. Does not + include the NULL terminator or the common prefix. */ + size_t number_matches; + + /* Whether readline should suppress appending a whitespace, when + there's only one possible completion. */ + bool completion_suppress_append; +}; + +/* Object used by completers to build a completion match list to hand + over to readline. It tracks: + + - How many unique completions have been generated, to terminate + completion list generation early if the list has grown to a size + so large as to be useless. This helps avoid GDB seeming to lock + up in the event the user requests to complete on something vague + that necessitates the time consuming expansion of many symbol + tables. +*/ +class completion_tracker +{ +public: + completion_tracker (); + ~completion_tracker (); + + /* Disable copy. */ + completion_tracker (const completion_tracker &rhs) = delete; + void operator= (const completion_tracker &rhs) = delete; + + /* Add the completion NAME to the list of generated completions if + it is not there already. If too many completions were already + found, this throws an error. */ + void add_completion (gdb::unique_xmalloc_ptr name); + + /* Add all completions matches in LIST. Elements are moved out of + LIST. */ + void add_completions (completion_list &&list); + + /* True if we have any completion match recorded. */ + bool have_completions () const + { return !m_entries_vec.empty (); } + + /* Build a completion_result containing the list of completion + matches to hand over to readline. The parameters are as in + rl_attempted_completion_function. */ + completion_result build_completion_result (const char *text, + int start, int end); + +private: + + /* Add the completion NAME to the list of generated completions if + it is not there already. If false is returned, too many + completions were found. */ + bool maybe_add_completion (gdb::unique_xmalloc_ptr name); + + /* Given a new match, recompute the lowest common denominator (LCD) + to hand over to readline. */ + void recompute_lowest_common_denominator (const char *new_match); + + /* The completion matches found so far, in a vector. */ + completion_list m_entries_vec; + + /* The completion matches found so far, in a hash table, for + duplicate elimination as entries are added. Otherwise the user + is left scratching his/her head: readline and complete_command + will remove duplicates, and if removal of duplicates there brings + the total under max_completions the user may think gdb quit + searching too early. */ + htab_t m_entries_hash; + + /* Our idea of lowest common denominator to hand over to readline. */ + char *m_lowest_common_denominator = NULL; + + /* If true, the LCD is unique. I.e., all completion candidates had + the same string. */ + bool m_lowest_common_denominator_unique = false; +}; + +extern void gdb_display_match_list (char **matches, int len, int max, + const struct match_list_displayer *); + +extern const char *get_max_completions_reached_message (void); + +extern void complete_line (completion_tracker &tracker, + const char *text, + const char *line_buffer, + int point); + +/* 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 + the right work break characters for the command in TEXT. + QUOTE_CHAR, if non-null, is set to the opening quote character if + we found an unclosed quoted substring, '\0' otherwise. */ +extern const char *completion_find_completion_word (completion_tracker &tracker, + const char *text, + int *quote_char); + +extern char **gdb_rl_attempted_completion_function (const char *text, + int start, int end); + +extern void noop_completer (struct cmd_list_element *, + completion_tracker &tracker, + const char *, const char *); + +extern void filename_completer (struct cmd_list_element *, + completion_tracker &tracker, + const char *, const char *); + +extern void expression_completer (struct cmd_list_element *, + completion_tracker &tracker, + const char *, const char *); + +extern void location_completer (struct cmd_list_element *, + completion_tracker &tracker, + const char *, const char *); + +extern void symbol_completer (struct cmd_list_element *, + completion_tracker &tracker, + const char *, const char *); + +extern void command_completer (struct cmd_list_element *, + completion_tracker &tracker, + const char *, const char *); + +extern void signal_completer (struct cmd_list_element *, + completion_tracker &tracker, + const char *, const char *); + +extern void reg_or_group_completer (struct cmd_list_element *, + completion_tracker &tracker, + const char *, const char *); + +extern void reggroup_completer (struct cmd_list_element *, + completion_tracker &tracker, + const char *, const char *); + +extern const char *get_gdb_completer_quote_characters (void); extern char *gdb_completion_word_break_characters (void); -/* Set the word break characters array to the corresponding set of - chars, based on FN. This function is useful for cases when the - completer doesn't know the type of the completion until some +/* Set the word break characters array to BREAK_CHARS. This function + is useful as const-correct alternative to direct assignment to + rl_completer_word_break_characters, which is "char *", + not "const char *". */ +extern void set_rl_completer_word_break_characters (const char *break_chars); + +/* Get the matching completer_handle_brkchars_ftype function for FN. + FN is one of the core completer functions above (filename, + location, symbol, etc.). This function is useful for cases when + the completer doesn't know the type of the completion until some calculation is done (e.g., for Python functions). */ -extern void set_gdb_completion_word_break_characters (completer_ftype *fn); +extern completer_handle_brkchars_ftype * + completer_handle_brkchars_func_for_completer (completer_ftype *fn); /* Exported to linespec.c */ @@ -66,4 +278,10 @@ extern const char *skip_quoted_chars (const char *, const char *, extern const char *skip_quoted (const char *); +/* Maximum number of candidates to consider before the completer + bails by throwing MAX_COMPLETIONS_REACHED_ERROR. Negative values + disable limiting. */ + +extern int max_completions; + #endif /* defined (COMPLETER_H) */