summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZachary T Welch <zw@superlucidity.net>2009-11-18 16:34:34 -0800
committerZachary T Welch <zw@superlucidity.net>2009-11-20 14:52:56 -0800
commit67c29d9935b023a85056149e2f73288434c25995 (patch)
treefd5603286628d08f990e1bfefe45b63a70c7637c /src
parent7b77b3c5d1a20793cc2057a96e67d8f7ca20e4cb (diff)
downloadopenocd_libswd-67c29d9935b023a85056149e2f73288434c25995.tar.gz
openocd_libswd-67c29d9935b023a85056149e2f73288434c25995.tar.bz2
openocd_libswd-67c29d9935b023a85056149e2f73288434c25995.tar.xz
openocd_libswd-67c29d9935b023a85056149e2f73288434c25995.zip
factor script_command argv allocation
Splits argument allocation out from script command, reusing free() code.
Diffstat (limited to 'src')
-rw-r--r--src/helper/command.c65
1 files changed, 38 insertions, 27 deletions
diff --git a/src/helper/command.c b/src/helper/command.c
index ba689b00..ba28784d 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -75,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
@@ -101,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");
@@ -148,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)