add CMD_NAME variable in command_invocation
authorZachary T Welch <zw@superlucidity.net>
Mon, 16 Nov 2009 13:46:15 +0000 (05:46 -0800)
committerZachary T Welch <zw@superlucidity.net>
Tue, 17 Nov 2009 19:40:21 +0000 (11:40 -0800)
Update CMD_NAME from its migratory home in CMD_ARGV[-1] to cmd->name.
Allows CMD_ARGV++ idiom to be used safely in command handlers.

src/helper/command.c
src/helper/command.h

index 96d23ab..b9d0d08 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");
@@ -449,6 +448,7 @@ static int run_command(struct command_context *context,
 
        struct command_invocation cmd = {
                        .ctx = context,
+                       .name = c->name,
                        .argc = num_words - start_word - 1,
                        .argv = words + start_word + 1,
                };
index b8ea3a4..62231fc 100644 (file)
@@ -87,6 +87,7 @@ struct command_context
  */
 struct command_invocation {
        struct command_context *ctx;
+       const char *name;
        unsigned argc;
        const char **argv;
 };
@@ -149,7 +150,7 @@ struct command_invocation {
  * Use this macro to access the name of the command being handled,
  * rather than accessing the variable directly.  It may be moved.
  */
-#define CMD_NAME CMD_ARGV[-1]
+#define CMD_NAME cmd->name
 
 
 /// The type signature for commands' handler functions.