From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 129766 invoked by alias); 2 Jun 2017 12:22:51 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 129627 invoked by uid 89); 2 Jun 2017 12:22:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=WORD, TEXT X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 02 Jun 2017 12:22:46 +0000 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6DB9783F45 for ; Fri, 2 Jun 2017 12:22:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 6DB9783F45 Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=palves@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 6DB9783F45 Received: from cascais.lan (ovpn04.gateway.prod.ext.ams2.redhat.com [10.39.146.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id CAE374DA6D for ; Fri, 2 Jun 2017 12:22:48 +0000 (UTC) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 10/40] Clean up "completer_handle_brkchars" callback handling Date: Fri, 02 Jun 2017 12:23:00 -0000 Message-Id: <1496406158-12663-11-git-send-email-palves@redhat.com> In-Reply-To: <1496406158-12663-1-git-send-email-palves@redhat.com> References: <1496406158-12663-1-git-send-email-palves@redhat.com> X-SW-Source: 2017-06/txt/msg00020.txt.bz2 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: yyyy-mm-dd Pedro Alves * cli/cli-decode.c (set_cmd_completer_handle_brkchars): Adjust to renames. * cli/cli-decode.h (struct cmd_list_element) : Move comments to completer_ftype's declaration. : 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. --- gdb/cli/cli-decode.c | 4 +- gdb/cli/cli-decode.h | 17 +------ gdb/command.h | 18 +++++-- gdb/completer.c | 139 ++++++++++++++++++++++++++++++++++++--------------- gdb/completer.h | 10 ++-- gdb/python/py-cmd.c | 7 ++- 6 files changed, 127 insertions(+), 68 deletions(-) diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c index f982028..f163581 100644 --- a/gdb/cli/cli-decode.c +++ b/gdb/cli/cli-decode.c @@ -166,9 +166,9 @@ set_cmd_completer (struct cmd_list_element *cmd, completer_ftype *completer) void set_cmd_completer_handle_brkchars (struct cmd_list_element *cmd, - completer_ftype_void *completer_handle_brkchars) + completer_handle_brkchars_ftype *func) { - cmd->completer_handle_brkchars = completer_handle_brkchars; + cmd->completer_handle_brkchars = func; } /* Add element named NAME. diff --git a/gdb/cli/cli-decode.h b/gdb/cli/cli-decode.h index 66159fd..97dc5d4 100644 --- a/gdb/cli/cli-decode.h +++ b/gdb/cli/cli-decode.h @@ -161,19 +161,7 @@ struct cmd_list_element /* The prefix command of this command. */ struct cmd_list_element *prefix; - /* Completion routine for this command. TEXT is the text beyond - what was matched for the command itself (leading whitespace is - skipped). It stops where we are supposed to stop completing - (rl_point) and is '\0' terminated. - - Return value is a malloc'd vector of pointers to possible - completions terminated with NULL. If there are no completions, - returning a pointer to a NULL would work but returning NULL - itself is also valid. WORD points in the same buffer as TEXT, - and completions should be returned relative to this position. - For example, suppose TEXT is "foo" and we want to complete to - "foobar". If WORD is "oo", return "oobar"; if WORD is - "baz/foo", return "baz/foobar". */ + /* Completion routine for this command. */ completer_ftype *completer; /* Handle the word break characters for this completer. Usually @@ -182,8 +170,7 @@ struct cmd_list_element a class) the word break chars may need to be redefined depending on the completer type (e.g., for filename completers). */ - - completer_ftype_void *completer_handle_brkchars; + completer_handle_brkchars_ftype *completer_handle_brkchars; /* Destruction routine for this command. If non-NULL, this is called when this command instance is destroyed. This may be diff --git a/gdb/command.h b/gdb/command.h index 4a56a51..2a190d4 100644 --- a/gdb/command.h +++ b/gdb/command.h @@ -174,18 +174,28 @@ typedef void cmd_sfunc_ftype (char *args, int from_tty, extern void set_cmd_sfunc (struct cmd_list_element *cmd, cmd_sfunc_ftype *sfunc); +/* A completion routine. Return a list of possible completions. + + TEXT is the text beyond what was matched for the command itself + (leading whitespace is skipped). It stops where we are supposed to + stop completing (rl_point) and is '\0' terminated. WORD points in + the same buffer as TEXT, and completions should be returned + relative to this position. For example, suppose TEXT is "foo" and + we want to complete to "foobar". If WORD is "oo", return "oobar"; + if WORD is "baz/foo", return "baz/foobar". */ typedef VEC (char_ptr) *completer_ftype (struct cmd_list_element *, - const char *, const char *); + const char *text, const char *word); -typedef void completer_ftype_void (struct cmd_list_element *, - const char *, const char *); +/* Same, but for set_cmd_completer_handle_brkchars. */ +typedef void completer_handle_brkchars_ftype (struct cmd_list_element *, + const char *text, const char *word); extern void set_cmd_completer (struct cmd_list_element *, completer_ftype *); /* Set the completer_handle_brkchars callback. */ extern void set_cmd_completer_handle_brkchars (struct cmd_list_element *, - completer_ftype_void *); + completer_handle_brkchars_ftype *); /* HACK: cagney/2002-02-23: Code, mostly in tracepoints.c, grubs around in cmd objects to test the value of the commands sfunc(). */ diff --git a/gdb/completer.c b/gdb/completer.c index 4ab2388..fe69faa 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 @@ -711,6 +723,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. @@ -880,29 +937,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 @@ -953,24 +990,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); } } } @@ -1124,6 +1146,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) @@ -1132,6 +1155,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) * @@ -1240,6 +1273,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. */ diff --git a/gdb/completer.h b/gdb/completer.h index 0a40eaa..463a53d 100644 --- a/gdb/completer.h +++ b/gdb/completer.h @@ -112,12 +112,14 @@ extern char *gdb_completion_word_break_characters (void); not "const char *". */ extern void set_rl_completer_word_break_characters (const char *break_chars); -/* 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 +/* 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 */ diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c index 72ea577..b9a866e 100644 --- a/gdb/python/py-cmd.c +++ b/gdb/python/py-cmd.c @@ -293,11 +293,14 @@ cmdpy_completer_handle_brkchars (struct cmd_list_element *command, } else if (value >= 0 && value < (long) N_COMPLETERS) { + completer_handle_brkchars_ftype *brkchars_fn; + /* This is the core of this function. Depending on which completer type the Python function returns, we have to adjust the break characters accordingly. */ - set_gdb_completion_word_break_characters - (completers[value].completer); + brkchars_fn = (completer_handle_brkchars_func_for_completer + (completers[value].completer)); + brkchars_fn (command, text, word); } } } -- 2.5.5