From f973320cbb98d661bc0e4ba4fa9939ce8bce2b83 Mon Sep 17 00:00:00 2001 From: Zachary T Welch Date: Tue, 10 Nov 2009 23:01:44 -0800 Subject: [PATCH] command_handler_t: make cmd an indirect parameter 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 | 16 +++++++++------- src/helper/command.h | 6 +++--- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/helper/command.c b/src/helper/command.c index 7a42ab20fb..3cd11d218f 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -102,7 +102,8 @@ 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); + words = malloc(sizeof(char *) * (argc + 1)); + words[0] = c->name; 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; } - 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++) - free(words[j]); + free(words[j + 1]); 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); - 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); @@ -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++) - free(words[i]); + free(words[i + 1]); 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; - 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 */ diff --git a/src/helper/command.h b/src/helper/command.h index fbcc0aa0d6..bddb053ee5 100644 --- a/src/helper/command.h +++ b/src/helper/command.h @@ -88,7 +88,7 @@ typedef struct command_context_s */ #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). @@ -104,7 +104,7 @@ typedef struct command_context_s * 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. @@ -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. */ -#define CMD_NAME cmd +#define CMD_NAME args[-1] /// The type signature for commands' handler functions. -- 2.30.2