aboutsummaryrefslogtreecommitdiff
path: root/gdb/cli
diff options
context:
space:
mode:
authorSergio Durigan Junior <sergiodj@redhat.com>2017-06-30 08:27:29 -0400
committerSergio Durigan Junior <sergiodj@redhat.com>2017-06-30 09:31:21 -0400
commitdc4bde35d16df749e529229657b3468417937cfc (patch)
tree9c8ef1f1ac11054bb17626342d5b01fd9c233639 /gdb/cli
parent51ed89aa0dce3db46561235efdc4bbc0661bcf37 (diff)
downloadgdb-dc4bde35d16df749e529229657b3468417937cfc.zip
gdb-dc4bde35d16df749e529229657b3468417937cfc.tar.gz
gdb-dc4bde35d16df749e529229657b3468417937cfc.tar.bz2
PR cli/21688: Detect aliases when issuing python/compile/guile commands (and fix last commit)
My last commit fixed a regression that happened when using inline/multi-line commands for Python/Compile/Guile, but introduced another regression: it is now not possible to use aliases for the commands mentioned above. The fix is to almost revert the change I've made and go back to using the 'struct cmd_list_element *', but at the same time make sure that we advance the 'cmd_name' variable past all the whitespace characters after the command name. If, after skipping the whitespace, we encounter a '\0', it means that the command is not inline. Otherwise, it is. This patch also expands the testcase in order to check for aliases and for trailing whitespace after the command name. gdb/ChangeLog: 2017-06-30 Sergio Durigan Junior <sergiodj@redhat.com> Pedro Alves <palves@redhat.com> PR cli/21688 * cli/cli-script.c (command_name_equals_not_inline): Remove function. (process_next_line): New variable 'inline_cmd'. Adjust 'if' clauses for "python", "compile" and "guile" to use 'command_name_equals' and check for '!inline_cmd'. gdb/testsuite/ChangeLog: 2017-06-30 Sergio Durigan Junior <sergiodj@redhat.com> PR cli/21688 * gdb.python/py-cmd.exp (test_python_inline_or_multiline): Add new tests for alias commands and trailing whitespace.
Diffstat (limited to 'gdb/cli')
-rw-r--r--gdb/cli/cli-script.c22
1 files changed, 5 insertions, 17 deletions
diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c
index 72f316f..5674404 100644
--- a/gdb/cli/cli-script.c
+++ b/gdb/cli/cli-script.c
@@ -900,20 +900,6 @@ command_name_equals (struct cmd_list_element *cmd, const char *name)
&& strcmp (cmd->name, name) == 0);
}
-/* Return true if NAME is the only command between COMMAND_START and
- COMMAND_END. This is useful when we want to know whether the
- command is inline (i.e., has arguments like 'python command1') or
- is the start of a multi-line command block. */
-
-static bool
-command_name_equals_not_inline (const char *command_start,
- const char *command_end,
- const char *name)
-{
- return (command_end - command_start == strlen (name)
- && startswith (command_start, name));
-}
-
/* Given an input line P, skip the command and return a pointer to the
first argument. */
@@ -966,6 +952,8 @@ process_next_line (char *p, struct command_line **command, int parse_commands,
const char *cmd_name = p;
struct cmd_list_element *cmd
= lookup_cmd_1 (&cmd_name, cmdlist, NULL, 1);
+ cmd_name = skip_spaces_const (cmd_name);
+ bool inline_cmd = *cmd_name != '\0';
/* If commands are parsed, we skip initial spaces. Otherwise,
which is the case for Python commands and documentation
@@ -1011,20 +999,20 @@ process_next_line (char *p, struct command_line **command, int parse_commands,
{
*command = build_command_line (commands_control, line_first_arg (p));
}
- else if (command_name_equals_not_inline (p_start, p_end, "python"))
+ else if (command_name_equals (cmd, "python") && !inline_cmd)
{
/* Note that we ignore the inline "python command" form
here. */
*command = build_command_line (python_control, "");
}
- else if (command_name_equals_not_inline (p_start, p_end, "compile"))
+ else if (command_name_equals (cmd, "compile") && !inline_cmd)
{
/* Note that we ignore the inline "compile command" form
here. */
*command = build_command_line (compile_control, "");
(*command)->control_u.compile.scope = COMPILE_I_INVALID_SCOPE;
}
- else if (command_name_equals_not_inline (p_start, p_end, "guile"))
+ else if (command_name_equals (cmd, "guile") && !inline_cmd)
{
/* Note that we ignore the inline "guile command" form here. */
*command = build_command_line (guile_control, "");