helper/command: fix printing usage for incomplete commands
The commit "helper/command: do not replace new commands with ocd_ prefix" breaks the print of usage text when a multi-word command is typed incompletely. Fix it by explicitly running the "usage" command. Change-Id: I46f8e521d9b6ac617bff8938cf8fc96f0ade45c8 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/5166 Tested-by: jenkins Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
This commit is contained in:
parent
c826746068
commit
92b582ed62
|
@ -968,6 +968,65 @@ static int command_unknown_find(unsigned argc, Jim_Obj *const *argv,
|
||||||
return command_unknown_find(--argc, ++argv, (*out)->children, out);
|
return command_unknown_find(--argc, ++argv, (*out)->children, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *alloc_concatenate_strings(int argc, Jim_Obj * const *argv)
|
||||||
|
{
|
||||||
|
char *prev, *all;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
assert(argc >= 1);
|
||||||
|
|
||||||
|
all = strdup(Jim_GetString(argv[0], NULL));
|
||||||
|
if (!all) {
|
||||||
|
LOG_ERROR("Out of memory");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1; i < argc; ++i) {
|
||||||
|
prev = all;
|
||||||
|
all = alloc_printf("%s %s", all, Jim_GetString(argv[i], NULL));
|
||||||
|
free(prev);
|
||||||
|
if (!all) {
|
||||||
|
LOG_ERROR("Out of memory");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return all;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int run_usage(Jim_Interp *interp, int argc_valid, int argc, Jim_Obj * const *argv)
|
||||||
|
{
|
||||||
|
struct command_context *cmd_ctx = current_command_context(interp);
|
||||||
|
char *command;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
assert(argc_valid >= 1);
|
||||||
|
assert(argc >= argc_valid);
|
||||||
|
|
||||||
|
command = alloc_concatenate_strings(argc_valid, argv);
|
||||||
|
if (!command)
|
||||||
|
return JIM_ERR;
|
||||||
|
|
||||||
|
retval = command_run_linef(cmd_ctx, "usage %s", command);
|
||||||
|
if (retval != ERROR_OK) {
|
||||||
|
LOG_ERROR("unable to execute command \"usage %s\"", command);
|
||||||
|
return JIM_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc_valid == argc)
|
||||||
|
LOG_ERROR("%s: command requires more arguments", command);
|
||||||
|
else {
|
||||||
|
free(command);
|
||||||
|
command = alloc_concatenate_strings(argc - argc_valid, argv + argc_valid);
|
||||||
|
if (!command)
|
||||||
|
return JIM_ERR;
|
||||||
|
LOG_ERROR("invalid subcommand \"%s\"", command);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(command);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
|
static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
|
||||||
{
|
{
|
||||||
const char *cmd_name = Jim_GetString(argv[0], NULL);
|
const char *cmd_name = Jim_GetString(argv[0], NULL);
|
||||||
|
@ -996,13 +1055,10 @@ static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
|
||||||
count = remaining + 1;
|
count = remaining + 1;
|
||||||
start = argv + (argc - remaining - 1);
|
start = argv + (argc - remaining - 1);
|
||||||
} else {
|
} else {
|
||||||
c = command_find(cmd_ctx->commands, "usage");
|
|
||||||
if (NULL == c) {
|
|
||||||
LOG_ERROR("unknown command, but usage is missing too");
|
|
||||||
return JIM_ERR;
|
|
||||||
}
|
|
||||||
count = argc - remaining;
|
count = argc - remaining;
|
||||||
start = argv;
|
start = argv;
|
||||||
|
run_usage(interp, count, argc, start);
|
||||||
|
return JIM_ERR;
|
||||||
}
|
}
|
||||||
/* pass the command through to the intended handler */
|
/* pass the command through to the intended handler */
|
||||||
if (c->jim_handler) {
|
if (c->jim_handler) {
|
||||||
|
|
Loading…
Reference in New Issue