+2020-05-15 Philippe Waroquiers <philippe.waroquiers@skynet.be>
+
+ * cli/cli-cmds.c (alias_command): Check for an existing alias
+ using lookup_cmd_composition, as valid_command_p is too strict
+ and forbids aliases that are the prefix of an existing alias
+ or command.
+ * cli/cli-decode.c (lookup_cmd_composition): Ensure a prefix
+ command is properly recognised as a valid command.
+
2020-05-15 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* unittests/help-doc-selftests.c: Rename to
/* ALIAS must not exist. */
std::string alias_string (argv_to_string (alias_argv, alias_argc));
alias = alias_string.c_str ();
- if (valid_command_p (alias))
- error (_("Alias already exists: %s"), alias);
+ {
+ cmd_list_element *alias_cmd, *prefix_cmd, *cmd;
+
+ if (lookup_cmd_composition (alias, &alias_cmd, &prefix_cmd, &cmd))
+ {
+ const char *alias_name = alias_argv[alias_argc-1];
+
+ /* If we found an existing ALIAS_CMD, check that the prefix differ or
+ the name differ. */
+
+ if (alias_cmd != nullptr
+ && alias_cmd->prefix == prefix_cmd
+ && strcmp (alias_name, alias_cmd->name) == 0)
+ error (_("Alias already exists: %s"), alias);
+
+ /* Check ALIAS differs from the found CMD. */
+
+ if (cmd->prefix == prefix_cmd
+ && strcmp (alias_name, cmd->name) == 0)
+ error (_("Alias %s is the name of an existing command"), alias);
+ }
+ }
+
/* If ALIAS is one word, it is an alias for the entire COMMAND.
Example: alias spe = set print elements
cur_list = cmdlist;
+ text = skip_spaces (text);
+
while (1)
{
/* Go through as many command lists as we need to,
prev_cmd = *cmd;
- while (*text == ' ' || *text == '\t')
- (text)++;
-
/* Identify the name of the command. */
len = find_command_name_length (text);
return 0;
/* TEXT is the start of the first command word to lookup (and
- it's length is len). We copy this into a local temporary. */
+ it's length is LEN). We copy this into a local temporary. */
command = (char *) alloca (len + 1);
memcpy (command, text, len);
}
*prefix_cmd = prev_cmd;
}
- if ((*cmd)->prefixlist)
+
+ text += len;
+ text = skip_spaces (text);
+
+ if ((*cmd)->prefixlist && *text != '\0')
cur_list = *(*cmd)->prefixlist;
else
return 1;
-
- text += len;
}
}
+2020-05-15 Philippe Waroquiers <philippe.waroquiers@skynet.be>
+
+ * gdb.base/alias.exp: Test aliases starting with a prefix of
+ another alias.
+
2020-05-15 Gary Benson <gbenson@redhat.com>
* gdb.base/info-os.c (main): Add return statement.
gdb_test_no_output "set print max-elements 57"
gdb_test "show print elements" "Limit .* is 57\[.\]" "verify 57"
+
+# Test aliases having a common prefix.
+gdb_test_no_output "alias abcd = backtrace"
+gdb_test_no_output "alias abcde = backtrace"
+gdb_test_no_output "alias fghij = backtrace"
+gdb_test_no_output "alias fghi = backtrace"