This is an automated email from Gerrit.

"Antonio Borneo <borneo.anto...@gmail.com>" just uploaded a new patch set to 
Gerrit, which you can find at https://review.openocd.org/c/openocd/+/6510

-- gerrit

commit af18db97a0653445f16f5206089e0c7707d453f6
Author: Antonio Borneo <borneo.anto...@gmail.com>
Date:   Mon Aug 30 01:01:40 2021 +0200

    openocd: prepare for jimtcl 0.81 'expr' syntax change
    
    Jimtcl commit 1843b79a03dd ("expr: TIP 526, only support a single
    arg") drops the support for multi-argument syntax for the TCL
    command 'expr'.
    All the scripts distributed with OpenOCD are already compliant
    with the new syntax.
    
    To avoid breaking user script, introduce a replacement for 'expr'
    command that handles the old syntax while issuing a deprecated
    warning.
    This change should be part of OpenOCD v0.12.0, then reverted.
    
    Change-Id: Ib08aa8ebcb634c81a3ce9d24fb4938b0418c947c
    Signed-off-by: Antonio Borneo <borneo.anto...@gmail.com>

diff --git a/src/openocd.c b/src/openocd.c
index b4571b464..12bd52c58 100644
--- a/src/openocd.c
+++ b/src/openocd.c
@@ -234,6 +234,65 @@ static int openocd_register_commands(struct 
command_context *cmd_ctx)
        return register_commands(cmd_ctx, NULL, openocd_command_handlers);
 }
 
+/*
+ * TODO: to be removed after v0.12.0
+ * workaround for syntax change of "expr" in jimtcl 0.81
+ * replace "expr" with openocd version that prints the deprecated msg
+ */
+struct jim_scriptobj {
+       void *token;
+       Jim_Obj *filename_obj;
+       int len;
+       int subst_flags;
+       int in_use;
+       int firstline;
+       int linenr;
+       int missing;
+};
+
+static int jim_expr_command(Jim_Interp *interp, int argc, Jim_Obj * const 
*argv)
+{
+       if (argc == 2)
+               return Jim_EvalExpression(interp, argv[1]);
+
+       if (argc > 2) {
+               Jim_Obj *obj = Jim_ConcatObj(interp, argc - 1, argv + 1);
+               Jim_IncrRefCount(obj);
+               const char *s = Jim_String(obj);
+               struct jim_scriptobj *script = 
Jim_GetIntRepPtr(interp->currentScriptObj);
+               if (interp->currentScriptObj == interp->emptyObj ||
+                               strcmp(interp->currentScriptObj->typePtr->name, 
"script") ||
+                               script->subst_flags ||
+                               script->filename_obj == interp->emptyObj)
+                       LOG_WARNING("DEPRECATED! use 'expr { %s }' not 'expr 
%s'", s, s);
+               else
+                       LOG_WARNING("DEPRECATED! (%s:%d) use 'expr { %s }' not 
'expr %s'",
+                                               
Jim_String(script->filename_obj), script->linenr, s, s);
+               int retcode = Jim_EvalExpression(interp, obj);
+               Jim_DecrRefCount(interp, obj);
+               return retcode;
+       }
+
+       Jim_WrongNumArgs(interp, 1, argv, "expression ?...?");
+       return JIM_ERR;
+}
+
+static const struct command_registration expr_handler[] = {
+       {
+               .name = "expr",
+               .jim_handler = jim_expr_command,
+               .mode = COMMAND_ANY,
+               .help = "",
+               .usage = "",
+       },
+       COMMAND_REGISTRATION_DONE
+};
+
+static int workaround_for_jimtcl_expr(struct command_context *cmd_ctx)
+{
+       return register_commands(cmd_ctx, NULL, expr_handler);
+}
+
 struct command_context *global_cmd_ctx;
 
 static struct command_context *setup_command_handler(Jim_Interp *interp)
@@ -246,6 +305,7 @@ static struct command_context 
*setup_command_handler(Jim_Interp *interp)
        /* register subsystem commands */
        typedef int (*command_registrant_t)(struct command_context 
*cmd_ctx_value);
        static const command_registrant_t command_registrants[] = {
+               &workaround_for_jimtcl_expr,
                &openocd_register_commands,
                &server_register_commands,
                &gdb_register_commands,

-- 

Reply via email to