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:
parent
f238337c9c
commit
d8d24f3b36
|
@ -52,16 +52,27 @@ struct log_capture_state {
|
||||||
static int unregister_command(struct command_context *context,
|
static int unregister_command(struct command_context *context,
|
||||||
struct command *parent, const char *name);
|
struct command *parent, const char *name);
|
||||||
static char *command_name(struct command *c, char delim);
|
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,
|
static int help_add_command(struct command_context *cmd_ctx,
|
||||||
const char *cmd_name, const char *help_text, const char *usage_text);
|
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);
|
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)
|
static inline bool jimcmd_is_proc(Jim_Cmd *cmd)
|
||||||
{
|
{
|
||||||
return cmd->isproc;
|
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,
|
static void tcl_output(void *privData, const char *file, unsigned line,
|
||||||
const char *function, const char *string)
|
const char *function, const char *string)
|
||||||
{
|
{
|
||||||
|
@ -340,8 +351,6 @@ command_new_error:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
|
|
||||||
|
|
||||||
static struct command *register_command(struct command_context *context,
|
static struct command *register_command(struct command_context *context,
|
||||||
struct command *parent, const struct command_registration *cr)
|
struct command *parent, const struct command_registration *cr)
|
||||||
{
|
{
|
||||||
|
@ -914,19 +923,6 @@ COMMAND_HANDLER(handle_help_command)
|
||||||
return retval;
|
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)
|
static char *alloc_concatenate_strings(int argc, Jim_Obj * const *argv)
|
||||||
{
|
{
|
||||||
char *prev, *all;
|
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_Cmd *cmd = Jim_GetCommand(interp, s, JIM_NONE);
|
||||||
Jim_DecrRefCount(interp, s);
|
Jim_DecrRefCount(interp, s);
|
||||||
free(full_name);
|
free(full_name);
|
||||||
if (cmd && jimcmd_is_proc(cmd)) {
|
if (!cmd || !(jimcmd_is_proc(cmd) || jimcmd_is_ocd_command(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) {
|
|
||||||
Jim_SetResultString(interp, "unknown", -1);
|
Jim_SetResultString(interp, "unknown", -1);
|
||||||
return JIM_OK;
|
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
|
} else
|
||||||
mode = cmd_ctx->mode;
|
mode = cmd_ctx->mode;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue