diff options
author | Zachary T Welch <zw@superlucidity.net> | 2009-11-16 05:46:15 -0800 |
---|---|---|
committer | Zachary T Welch <zw@superlucidity.net> | 2009-11-17 11:40:21 -0800 |
commit | cffc98ad8047b6dc8d38a6422136638f2df992d2 (patch) | |
tree | 678ece1f99a35ab8dad501f9ca0c048ebcef872b | |
parent | be084414ba00a4ad641af04c3c6858312dd1b336 (diff) | |
download | openocd+libswd-cffc98ad8047b6dc8d38a6422136638f2df992d2.tar.gz openocd+libswd-cffc98ad8047b6dc8d38a6422136638f2df992d2.tar.bz2 openocd+libswd-cffc98ad8047b6dc8d38a6422136638f2df992d2.tar.xz openocd+libswd-cffc98ad8047b6dc8d38a6422136638f2df992d2.zip |
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.
-rw-r--r-- | src/helper/command.c | 14 | ||||
-rw-r--r-- | src/helper/command.h | 3 |
2 files changed, 9 insertions, 8 deletions
diff --git a/src/helper/command.c b/src/helper/command.c index 96d23ab4..b9d0d087 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -102,8 +102,7 @@ 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 + 1)); - words[0] = c->name; + words = malloc(argc * sizeof(char *)); for (i = 0; i < argc; i++) { 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 */ break; } - words[i + 1] = strdup(w); - if (words[i + 1] == NULL) + words[i] = strdup(w); + if (words[i] == NULL) { int j; for (j = 0; j < i; j++) - free(words[j + 1]); + free(words[j]); free(words); 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); // 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); @@ -152,7 +151,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 + 1]); + free(words[i]); free(words); int *return_retval = Jim_GetAssocData(interp, "retval"); @@ -449,6 +448,7 @@ static int run_command(struct command_context *context, struct command_invocation cmd = { .ctx = context, + .name = c->name, .argc = num_words - start_word - 1, .argv = words + start_word + 1, }; diff --git a/src/helper/command.h b/src/helper/command.h index b8ea3a4a..62231fc8 100644 --- a/src/helper/command.h +++ b/src/helper/command.h @@ -87,6 +87,7 @@ struct command_context */ struct command_invocation { struct command_context *ctx; + const char *name; unsigned argc; const char **argv; }; @@ -149,7 +150,7 @@ struct command_invocation { * 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_ARGV[-1] +#define CMD_NAME cmd->name /// The type signature for commands' handler functions. |