add CMD_NAME variable in command_invocation

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.
This commit is contained in:
Zachary T Welch 2009-11-16 05:46:15 -08:00
parent be084414ba
commit cffc98ad80
2 changed files with 9 additions and 8 deletions

View 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); script_debug(interp, c->name, argc, argv);
words = malloc(sizeof(char *) * (argc + 1)); words = malloc(argc * sizeof(char *));
words[0] = c->name;
for (i = 0; i < argc; i++) for (i = 0; i < argc; i++)
{ {
int len; 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 */ /* hit an end of line comment */
break; break;
} }
words[i + 1] = strdup(w); words[i] = strdup(w);
if (words[i + 1] == NULL) if (words[i] == NULL)
{ {
int j; int j;
for (j = 0; j < i; j++) for (j = 0; j < i; j++)
free(words[j + 1]); free(words[j]);
free(words); free(words);
return JIM_ERR; 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); log_add_callback(tcl_output, tclOutput);
// turn words[0] into CMD_ARGV[-1] with this cast // 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); 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); Jim_DecrRefCount(interp, tclOutput);
for (i = 0; i < nwords; i++) for (i = 0; i < nwords; i++)
free(words[i + 1]); free(words[i]);
free(words); free(words);
int *return_retval = Jim_GetAssocData(interp, "retval"); int *return_retval = Jim_GetAssocData(interp, "retval");
@ -449,6 +448,7 @@ static int run_command(struct command_context *context,
struct command_invocation cmd = { struct command_invocation cmd = {
.ctx = context, .ctx = context,
.name = c->name,
.argc = num_words - start_word - 1, .argc = num_words - start_word - 1,
.argv = words + start_word + 1, .argv = words + start_word + 1,
}; };

View File

@ -87,6 +87,7 @@ struct command_context
*/ */
struct command_invocation { struct command_invocation {
struct command_context *ctx; struct command_context *ctx;
const char *name;
unsigned argc; unsigned argc;
const char **argv; const char **argv;
}; };
@ -149,7 +150,7 @@ struct command_invocation {
* 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_ARGV[-1] #define CMD_NAME cmd->name
/// The type signature for commands' handler functions. /// The type signature for commands' handler functions.