add CMD_NAME variable in command_invocation
[fw/openocd] / src / helper / command.c
index fdb59f01ad7a17d6a699493175a9d956fee674be..b9d0d087ad4f873ac61a6ce37e08e38f48de05d8 100644 (file)
@@ -102,8 +102,7 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
        script_debug(interp, c->name, argc, argv);
 
-       words = malloc(sizeof(char *) * (argc + 1));
-       words[0] = c->name;
+       words = malloc(argc * sizeof(char *));
        for (i = 0; i < argc; i++)
        {
                int len;
@@ -113,12 +112,12 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                        /* hit an end of line comment */
                        break;
                }
-               words[i + 1] = strdup(w);
-               if (words[i + 1] == NULL)
+               words[i] = strdup(w);
+               if (words[i] == NULL)
                {
                        int j;
                        for (j = 0; j < i; j++)
-                               free(words[j + 1]);
+                               free(words[j]);
                        free(words);
                        return JIM_ERR;
                }
@@ -143,7 +142,7 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        log_add_callback(tcl_output, tclOutput);
 
        // turn words[0] into CMD_ARGV[-1] with this cast
-       retval = run_command(context, c, (const char **)words + 1, nwords);
+       retval = run_command(context, c, (const char **)words, nwords);
 
        log_remove_callback(tcl_output, tclOutput);
 
@@ -152,7 +151,7 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        Jim_DecrRefCount(interp, tclOutput);
 
        for (i = 0; i < nwords; i++)
-               free(words[i + 1]);
+               free(words[i]);
        free(words);
 
        int *return_retval = Jim_GetAssocData(interp, "retval");
@@ -447,9 +446,13 @@ static int run_command(struct command_context *context,
                return ERROR_FAIL;
        }
 
-       unsigned argc = num_words - start_word - 1;
-       const char **args = words + start_word + 1;
-       int retval = c->handler(context, args, argc);
+       struct command_invocation cmd = {
+                       .ctx = context,
+                       .name = c->name,
+                       .argc = num_words - start_word - 1,
+                       .argv = words + start_word + 1,
+               };
+       int retval = c->handler(&cmd);
        if (retval == ERROR_COMMAND_SYNTAX_ERROR)
        {
                /* Print help for command */