aboutsummaryrefslogtreecommitdiff
path: root/src/helper/command.c
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2020-05-10 17:48:25 +0200
committerAntonio Borneo <borneo.antonio@gmail.com>2021-04-18 15:34:34 +0100
commitd8d24f3b3696f5d2e64a67df87684132b48031d2 (patch)
tree03ed59275c6c93f007012e6beb66589aa7102cb7 /src/helper/command.c
parentf238337c9c2fdabb48992487e5243d03d32e215d (diff)
downloadriscv-openocd-d8d24f3b3696f5d2e64a67df87684132b48031d2.zip
riscv-openocd-d8d24f3b3696f5d2e64a67df87684132b48031d2.tar.gz
riscv-openocd-d8d24f3b3696f5d2e64a67df87684132b48031d2.tar.bz2
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>
Diffstat (limited to 'src/helper/command.c')
-rw-r--r--src/helper/command.c47
1 files changed, 22 insertions, 25 deletions
diff --git a/src/helper/command.c b/src/helper/command.c
index 1628b6e..5cddf21 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -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;