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:
parent
be084414ba
commit
cffc98ad80
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue