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).
__archive__
Zachary T Welch 2009-11-10 23:01:44 -08:00
parent deede35c27
commit f973320cbb
2 changed files with 12 additions and 10 deletions

View 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++) for (i = 0; i < argc; i++)
{ {
int len; 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 */ /* hit an end of line comment */
break; break;
} }
words[i] = strdup(w); words[i + 1] = strdup(w);
if (words[i] == NULL) if (words[i + 1] == NULL)
{ {
int j; int j;
for (j = 0; j < i; j++) for (j = 0; j < i; j++)
free(words[j]); free(words[j + 1]);
free(words); free(words);
return JIM_ERR; 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); Jim_DecrRefCount(interp, tclOutput);
for (i = 0; i < nwords; i++) for (i = 0; i < nwords; i++)
free(words[i]); free(words[i + 1]);
free(words); free(words);
int *return_retval = Jim_GetAssocData(interp, "retval"); 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; unsigned argc = num_words - start_word - 1;
const char **args = 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) if (retval == ERROR_COMMAND_SYNTAX_ERROR)
{ {
/* Print help for command */ /* Print help for command */

View File

@ -88,7 +88,7 @@ typedef struct command_context_s
*/ */
#define __COMMAND_HANDLER(name, extra...) \ #define __COMMAND_HANDLER(name, extra...) \
int name(struct command_context_s *cmd_ctx, \ 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. * variables in intervening scope(s) by accident.
*/ */
#define CALL_COMMAND_HANDLER(name, extra...) \ #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, * Use this macro to access the name of the command being handled,
* rather than accessing the variable directly. It may be moved. * 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.