X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fhelper%2Fcommand.c;h=ba28784da3cf604f53ff23e160cb0fcabe3fe570;hp=b7c44efc91033058c43adab890945504eac0d0e5;hb=67c29d9935b023a85056149e2f73288434c25995;hpb=4d8d1d32d0f0e0b8866a06cb1d3f304563fa6796 diff --git a/src/helper/command.c b/src/helper/command.c index b7c44efc91..ba28784da3 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -44,7 +44,6 @@ #include "jim-eventloop.h" -int fast_and_dangerous = 0; Jim_Interp *interp = NULL; static int run_command(struct command_context *context, @@ -76,15 +75,45 @@ void script_debug(Jim_Interp *interp, const char *name, } } +static void script_command_args_free(const char **words, unsigned nwords) +{ + for (unsigned i = 0; i < nwords; i++) + free((void *)words[i]); + free(words); +} +static const char **script_command_args_alloc( + unsigned argc, Jim_Obj *const *argv, unsigned *nwords) +{ + const char **words = malloc(argc * sizeof(char *)); + if (NULL == words) + return NULL; + + unsigned i; + for (i = 0; i < argc; i++) + { + int len; + const char *w = Jim_GetString(argv[i], &len); + /* a comment may end the line early */ + if (*w == '#') + break; + + words[i] = strdup(w); + if (words[i] == NULL) + { + script_command_args_free(words, i); + return NULL; + } + } + *nwords = i; + return words; +} + static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { /* the private data is stashed in the interp structure */ struct command *c; struct command_context *context; int retval; - int i; - int nwords; - char **words; /* DANGER!!!! be careful what we invoke here, since interp->cmdPrivData might * get overwritten by running other Jim commands! Treat it as an @@ -102,27 +131,10 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv) script_debug(interp, c->name, argc, argv); - words = malloc(argc * sizeof(char *)); - for (i = 0; i < argc; i++) - { - int len; - const char *w = Jim_GetString(argv[i], &len); - if (*w=='#') - { - /* hit an end of line comment */ - break; - } - words[i] = strdup(w); - if (words[i] == NULL) - { - int j; - for (j = 0; j < i; j++) - free(words[j]); - free(words); - return JIM_ERR; - } - } - nwords = i; + unsigned nwords; + const char **words = script_command_args_alloc(argc, argv, &nwords); + if (NULL == words) + return JIM_ERR; /* grab the command context from the associated data */ context = Jim_GetAssocData(interp, "context"); @@ -141,7 +153,6 @@ 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, nwords); log_remove_callback(tcl_output, tclOutput); @@ -150,9 +161,7 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv) Jim_SetResult(interp, tclOutput); Jim_DecrRefCount(interp, tclOutput); - for (i = 0; i < nwords; i++) - free(words[i]); - free(words); + script_command_args_free(words, nwords); int *return_retval = Jim_GetAssocData(interp, "retval"); if (return_retval != NULL) @@ -755,17 +764,6 @@ COMMAND_HANDLER(handle_sleep_command) return ERROR_OK; } -COMMAND_HANDLER(handle_fast_command) -{ - if (CMD_ARGC != 1) - return ERROR_COMMAND_SYNTAX_ERROR; - - fast_and_dangerous = strcmp("enable", CMD_ARGV[0]) == 0; - - return ERROR_OK; -} - - struct command_context* command_init(const char *startup_tcl) { struct command_context* context = malloc(sizeof(struct command_context)); @@ -839,10 +837,6 @@ struct command_context* command_init(const char *startup_tcl) handle_sleep_command, COMMAND_ANY, " [busy] - sleep for n milliseconds. " "\"busy\" means busy wait"); - register_command(context, NULL, "fast", - handle_fast_command, COMMAND_ANY, - "fast - place at beginning of " - "config files. Sets defaults to fast and dangerous."); return context; } @@ -882,18 +876,6 @@ void register_jim(struct command_context *cmd_ctx, const char *name, command_helptext_add(cmd_list, help); } -/* return global variable long value or 0 upon failure */ -long jim_global_long(const char *variable) -{ - Jim_Obj *objPtr = Jim_GetGlobalVariableStr(interp, variable, JIM_ERRMSG); - long t; - if (Jim_GetLong(interp, objPtr, &t) == JIM_OK) - { - return t; - } - return 0; -} - #define DEFINE_PARSE_NUM_TYPE(name, type, func, min, max) \ int parse##name(const char *str, type *ul) \ { \