helper/command: simplify jim_command_mode()

Now that every command has struct command as private data, use jim
to get access to the struct command to read the command mode,
instead of running through the tree of struct command.

Change-Id: Iddacdbac604714f6abe38a050daad245bdcfd20c
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/5673
Tested-by: jenkins
Reviewed-by: Oleksij Rempel <linux@rempel-privat.de>
This commit is contained in:
Antonio Borneo 2020-05-10 17:48:25 +02:00
parent f238337c9c
commit d8d24f3b36
1 changed files with 22 additions and 25 deletions

View File

@ -52,16 +52,27 @@ struct log_capture_state {
static int unregister_command(struct command_context *context,
struct command *parent, const char *name);
static char *command_name(struct command *c, char delim);
static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj * const *argv);
static int help_add_command(struct command_context *cmd_ctx,
const char *cmd_name, const char *help_text, const char *usage_text);
static int help_del_command(struct command_context *cmd_ctx, const char *cmd_name);
/* wrap jimtcl internal data */
/* set of functions to wrap jimtcl internal data */
static inline bool jimcmd_is_proc(Jim_Cmd *cmd)
{
return cmd->isproc;
}
static inline bool jimcmd_is_ocd_command(Jim_Cmd *cmd)
{
return !cmd->isproc && cmd->u.native.cmdProc == command_unknown;
}
static inline void *jimcmd_privdata(Jim_Cmd *cmd)
{
return cmd->isproc ? NULL : cmd->u.native.privData;
}
static void tcl_output(void *privData, const char *file, unsigned line,
const char *function, const char *string)
{
@ -340,8 +351,6 @@ command_new_error:
return NULL;
}
static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
static struct command *register_command(struct command_context *context,
struct command *parent, const struct command_registration *cr)
{
@ -914,19 +923,6 @@ COMMAND_HANDLER(handle_help_command)
return retval;
}
static int command_unknown_find(unsigned argc, Jim_Obj *const *argv,
struct command *head, struct command **out)
{
if (0 == argc)
return argc;
const char *cmd_name = Jim_GetString(argv[0], NULL);
struct command *c = command_find(head, cmd_name);
if (NULL == c)
return argc;
*out = c;
return command_unknown_find(--argc, ++argv, (*out)->children, out);
}
static char *alloc_concatenate_strings(int argc, Jim_Obj * const *argv)
{
char *prev, *all;
@ -1038,18 +1034,19 @@ static int jim_command_mode(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
Jim_Cmd *cmd = Jim_GetCommand(interp, s, JIM_NONE);
Jim_DecrRefCount(interp, s);
free(full_name);
if (cmd && jimcmd_is_proc(cmd)) {
Jim_SetResultString(interp, "any", -1);
return JIM_OK;
}
struct command *c = cmd_ctx->commands;
int remaining = command_unknown_find(argc - 1, argv + 1, c, &c);
/* if nothing could be consumed, then it's an unknown command */
if (remaining == argc - 1) {
if (!cmd || !(jimcmd_is_proc(cmd) || jimcmd_is_ocd_command(cmd))) {
Jim_SetResultString(interp, "unknown", -1);
return JIM_OK;
}
mode = c->mode;
if (jimcmd_is_proc(cmd)) {
/* tcl proc */
mode = COMMAND_ANY;
} else {
struct command *c = jimcmd_privdata(cmd);
mode = c->mode;
}
} else
mode = cmd_ctx->mode;