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.antonio@gmail.com> Reviewed-on: https://review.openocd.org/c/openocd/+/6510 Reviewed-by: Oleksij Rempel <linux@rempel-privat.de> Reviewed-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com> Tested-by: jenkins
This commit is contained in:
parent
48f267d4ad
commit
c7eaaf6204
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue