diff options
author | Pedro Alves <palves@redhat.com> | 2017-07-17 12:05:03 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2017-07-17 12:05:03 +0100 |
commit | 6e1dbf8cda1c66256179d0b15c96bc97ea5cf7b3 (patch) | |
tree | 1ce35dd58e6d3a3e884467426d24b62a0b532870 /gdb/completer.c | |
parent | 78b13106edcd14d87b4cc0b7f8dce8db8c2be489 (diff) | |
download | gdb-6e1dbf8cda1c66256179d0b15c96bc97ea5cf7b3.zip gdb-6e1dbf8cda1c66256179d0b15c96bc97ea5cf7b3.tar.gz gdb-6e1dbf8cda1c66256179d0b15c96bc97ea5cf7b3.tar.bz2 |
Clean up "completer_handle_brkchars" callback handling
This patch cleans up "completer_handle_brkchars" callback handling:
- Renames the function typedef to better match its intent:
completer_ftype_void -> completer_handle_brkchars_ftype
- Factors out common code in complete_line_internal handling the
"handle_brkchars" callback to a separate function.
- Centralizes all the "completer method" to "handle_brkchars method"
mapping in a single function.
gdb/ChangeLog:
2017-07-17 Pedro Alves <palves@redhat.com>
* cli/cli-decode.c (set_cmd_completer_handle_brkchars): Adjust to
renames.
* cli/cli-decode.h (struct cmd_list_element) <completer>: Move
comments to completer_ftype's declaration.
<completer_handle_brkchars>: Change type to
completer_handle_brkchars_ftype.
* command.h (completer_ftype): Add describing comment and give
names to parameters.
(completer_ftype_void): Rename to ...
(completer_handle_brkchars_ftype) ... this. Add describing comment.
(set_cmd_completer_handle_brkchars): Adjust.
* completer.c (filename_completer_handle_brkchars): New function.
(complete_line_internal_normal_command): New function, factored
out from ...
(complete_line_internal): ... here.
(command_completer_handle_brkchars)
(default_completer_handle_brkchars)
(completer_handle_brkchars_func_for_completer): New functions.
* completer.h (set_gdb_completion_word_break_characters): Delete
declaration.
(completer_handle_brkchars_func_for_completer): New declaration.
* python/py-cmd.c (cmdpy_completer_handle_brkchars): Adjust to use
completer_handle_brkchars_func_for_completer.
Diffstat (limited to 'gdb/completer.c')
-rw-r--r-- | gdb/completer.c | 139 |
1 files changed, 98 insertions, 41 deletions
diff --git a/gdb/completer.c b/gdb/completer.c index 89cecbc..625ff4f 100644 --- a/gdb/completer.c +++ b/gdb/completer.c @@ -132,6 +132,7 @@ noop_completer (struct cmd_list_element *ignore, } /* Complete on filenames. */ + VEC (char_ptr) * filename_completer (struct cmd_list_element *ignore, const char *text, const char *word) @@ -192,6 +193,17 @@ filename_completer (struct cmd_list_element *ignore, return return_val; } +/* The corresponding completer_handle_brkchars + implementation. */ + +static void +filename_completer_handle_brkchars (struct cmd_list_element *ignore, + const char *text, const char *word) +{ + set_rl_completer_word_break_characters + (gdb_completer_file_name_break_characters); +} + /* Complete on linespecs, which might be of two possible forms: file:line @@ -703,6 +715,51 @@ typedef enum } complete_line_internal_reason; +/* Helper for complete_line_internal to simplify it. */ + +static VEC (char_ptr) * +complete_line_internal_normal_command (const char *command, const char *word, + const char *cmd_args, + complete_line_internal_reason reason, + struct cmd_list_element *c) +{ + const char *p = cmd_args; + + if (c->completer == filename_completer) + { + /* Many commands which want to complete on file names accept + several file names, as in "run foo bar >>baz". So we don't + want to complete the entire text after the command, just the + last word. To this end, we need to find the beginning of the + file name by starting at `word' and going backwards. */ + for (p = word; + p > command + && strchr (gdb_completer_file_name_break_characters, + p[-1]) == NULL; + p--) + ; + } + + if (reason == handle_brkchars) + { + completer_handle_brkchars_ftype *brkchars_fn; + + if (c->completer_handle_brkchars != NULL) + brkchars_fn = c->completer_handle_brkchars; + else + { + brkchars_fn + = (completer_handle_brkchars_func_for_completer + (c->completer)); + } + + brkchars_fn (c, p, word); + } + + if (reason != handle_brkchars && c->completer != NULL) + return (*c->completer) (c, p, word); + return NULL; +} /* Internal function used to handle completions. @@ -872,29 +929,9 @@ complete_line_internal (const char *text, { /* It is a normal command; what comes after it is completed by the command's completer function. */ - if (c->completer == filename_completer) - { - /* Many commands which want to complete on - file names accept several file names, as - in "run foo bar >>baz". So we don't want - to complete the entire text after the - command, just the last word. To this - end, we need to find the beginning of the - file name by starting at `word' and going - backwards. */ - for (p = word; - p > tmp_command - && strchr (gdb_completer_file_name_break_characters, p[-1]) == NULL; - p--) - ; - set_rl_completer_word_break_characters - (gdb_completer_file_name_break_characters); - } - if (reason == handle_brkchars - && c->completer_handle_brkchars != NULL) - (*c->completer_handle_brkchars) (c, p, word); - if (reason != handle_brkchars && c->completer != NULL) - list = (*c->completer) (c, p, word); + list = complete_line_internal_normal_command (tmp_command, + word, p, + reason, c); } } else @@ -945,24 +982,9 @@ complete_line_internal (const char *text, else { /* It is a normal command. */ - if (c->completer == filename_completer) - { - /* See the commentary above about the specifics - of file-name completion. */ - for (p = word; - p > tmp_command - && strchr (gdb_completer_file_name_break_characters, - p[-1]) == NULL; - p--) - ; - set_rl_completer_word_break_characters - (gdb_completer_file_name_break_characters); - } - if (reason == handle_brkchars - && c->completer_handle_brkchars != NULL) - (*c->completer_handle_brkchars) (c, p, word); - if (reason != handle_brkchars && c->completer != NULL) - list = (*c->completer) (c, p, word); + list = complete_line_internal_normal_command (tmp_command, + word, p, + reason, c); } } } @@ -1116,6 +1138,7 @@ complete_line (const char *text, const char *line_buffer, int point) } /* Complete on command names. Used by "help". */ + VEC (char_ptr) * command_completer (struct cmd_list_element *ignore, const char *text, const char *word) @@ -1124,6 +1147,16 @@ command_completer (struct cmd_list_element *ignore, strlen (text), handle_help); } +/* The corresponding completer_handle_brkchars implementation. */ + +static void +command_completer_handle_brkchars (struct cmd_list_element *ignore, + const char *text, const char *word) +{ + set_rl_completer_word_break_characters + (gdb_completer_command_word_break_characters); +} + /* Complete on signals. */ VEC (char_ptr) * @@ -1232,6 +1265,30 @@ reggroup_completer (struct cmd_list_element *ignore, complete_reggroup_names); } +/* The default completer_handle_brkchars implementation. */ + +static void +default_completer_handle_brkchars (struct cmd_list_element *ignore, + const char *text, const char *word) +{ + set_rl_completer_word_break_characters + (current_language->la_word_break_characters ()); +} + +/* See definition in completer.h. */ + +completer_handle_brkchars_ftype * +completer_handle_brkchars_func_for_completer (completer_ftype *fn) +{ + if (fn == filename_completer) + return filename_completer_handle_brkchars; + + if (fn == command_completer) + return command_completer_handle_brkchars; + + return default_completer_handle_brkchars; +} + /* Get the list of chars that are considered as word breaks for the current command. */ |