command_handler_t: make cmd an indirect parameter
authorZachary T Welch <zw@superlucidity.net>
Wed, 11 Nov 2009 07:01:44 +0000 (23:01 -0800)
committerZachary T Welch <zw@superlucidity.net>
Fri, 13 Nov 2009 18:56:55 +0000 (10:56 -0800)
This patch removes 'cmd' from the list of direct parameters, moving
that pointer to args[-1] (by way of the new CMD_NAME macro).

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

index 7a42ab2..3cd11d2 100644 (file)
@@ -102,7 +102,8 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
        script_debug(interp, c->name, argc, argv);
 
 
        script_debug(interp, c->name, argc, argv);
 
-       words = malloc(sizeof(char *) * argc);
+       words = malloc(sizeof(char *) * (argc + 1));
+       words[0] = c->name;
        for (i = 0; i < argc; i++)
        {
                int len;
        for (i = 0; i < argc; i++)
        {
                int len;
@@ -112,12 +113,12 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                        /* hit an end of line comment */
                        break;
                }
                        /* hit an end of line comment */
                        break;
                }
-               words[i] = strdup(w);
-               if (words[i] == NULL)
+               words[i + 1] = strdup(w);
+               if (words[i + 1] == NULL)
                {
                        int j;
                        for (j = 0; j < i; j++)
                {
                        int j;
                        for (j = 0; j < i; j++)
-                               free(words[j]);
+                               free(words[j + 1]);
                        free(words);
                        return JIM_ERR;
                }
                        free(words);
                        return JIM_ERR;
                }
@@ -141,7 +142,8 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
        log_add_callback(tcl_output, tclOutput);
 
 
        log_add_callback(tcl_output, tclOutput);
 
-       retval = run_command(context, c, (const char **)words, nwords);
+       // turn words[0] into args[-1] with this cast
+       retval = run_command(context, c, (const char **)words + 1, nwords);
 
        log_remove_callback(tcl_output, tclOutput);
 
 
        log_remove_callback(tcl_output, tclOutput);
 
@@ -150,7 +152,7 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        Jim_DecrRefCount(interp, tclOutput);
 
        for (i = 0; i < nwords; i++)
        Jim_DecrRefCount(interp, tclOutput);
 
        for (i = 0; i < nwords; i++)
-               free(words[i]);
+               free(words[i + 1]);
        free(words);
 
        int *return_retval = Jim_GetAssocData(interp, "retval");
        free(words);
 
        int *return_retval = Jim_GetAssocData(interp, "retval");
@@ -447,7 +449,7 @@ static int run_command(command_context_t *context,
 
        unsigned argc = num_words - start_word - 1;
        const char **args = words + start_word + 1;
 
        unsigned argc = num_words - start_word - 1;
        const char **args = words + start_word + 1;
-       int retval = c->handler(context, c->name, args, argc);
+       int retval = c->handler(context, args, argc);
        if (retval == ERROR_COMMAND_SYNTAX_ERROR)
        {
                /* Print help for command */
        if (retval == ERROR_COMMAND_SYNTAX_ERROR)
        {
                /* Print help for command */
index fbcc0aa..bddb053 100644 (file)
@@ -88,7 +88,7 @@ typedef struct command_context_s
  */
 #define __COMMAND_HANDLER(name, extra...) \
                int name(struct command_context_s *cmd_ctx, \
  */
 #define __COMMAND_HANDLER(name, extra...) \
                int name(struct command_context_s *cmd_ctx, \
-                               const char *cmd, const char *args[], unsigned argc, ##extra)
+                               const char *args[], unsigned argc, ##extra)
 
 /**
  * Use this to macro to call a command helper (or a nested handler).
 
 /**
  * Use this to macro to call a command helper (or a nested handler).
@@ -104,7 +104,7 @@ typedef struct command_context_s
  * variables in intervening scope(s) by accident.
  */
 #define CALL_COMMAND_HANDLER(name, extra...) \
  * variables in intervening scope(s) by accident.
  */
 #define CALL_COMMAND_HANDLER(name, extra...) \
-               name(cmd_ctx, cmd, args, argc, ##extra)
+               name(cmd_ctx, args, argc, ##extra)
 
 /**
  * Always use this macro to define new command handler functions.
 
 /**
  * Always use this macro to define new command handler functions.
@@ -125,7 +125,7 @@ typedef struct command_context_s
  * Use this macro to access the name of the command being handled,
  * rather than accessing the variable directly.  It may be moved.
  */
  * 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
+#define CMD_NAME args[-1]
 
 
 /// The type signature for commands' handler functions.
 
 
 /// The type signature for commands' handler functions.