aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2020-05-09 02:00:45 +0200
committerAntonio Borneo <borneo.antonio@gmail.com>2021-04-18 15:33:37 +0100
commitcb83bc747ce1106c50d713f6d552da8c3e476e0f (patch)
treed4f2891e1ca0a6a762676313e23c878dc907f189 /src
parent41c95aa4ea1506a951dad0147f6cd4b8d7043358 (diff)
downloadriscv-openocd-cb83bc747ce1106c50d713f6d552da8c3e476e0f.zip
riscv-openocd-cb83bc747ce1106c50d713f6d552da8c3e476e0f.tar.gz
riscv-openocd-cb83bc747ce1106c50d713f6d552da8c3e476e0f.tar.bz2
command mode: return "any" for tcl proc
A tcl proc can be executed anytime, in any command mode. Let the command "command mode" to detect a tcl proc and return the string "any". Change-Id: I0559076c3063632ee0ea9a57a25f91060209b77f Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/5669 Tested-by: jenkins Reviewed-by: Oleksij Rempel <linux@rempel-privat.de>
Diffstat (limited to 'src')
-rw-r--r--src/helper/command.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/helper/command.c b/src/helper/command.c
index 114d073..288ba99 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -53,6 +53,12 @@ static int unregister_command(struct command_context *context,
struct command *parent, const char *name);
static char *command_name(struct command *c, char delim);
+/* wrap jimtcl internal data */
+static inline bool jimcmd_is_proc(Jim_Cmd *cmd)
+{
+ return cmd->isproc;
+}
+
static void tcl_output(void *privData, const char *file, unsigned line,
const char *function, const char *string)
{
@@ -1076,6 +1082,18 @@ static int jim_command_mode(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
enum command_mode mode;
if (argc > 1) {
+ char *full_name = alloc_concatenate_strings(argc - 1, argv + 1);
+ if (!full_name)
+ return JIM_ERR;
+ Jim_Obj *s = Jim_NewStringObj(interp, full_name, -1);
+ Jim_IncrRefCount(s);
+ 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 */