+/*
+ * 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);
+}
+