aboutsummaryrefslogtreecommitdiffstats
path: root/os/various/shell/shell.c
diff options
context:
space:
mode:
authorGiovanni Di Sirio <gdisirio@gmail.com>2016-02-20 14:32:35 +0000
committerGiovanni Di Sirio <gdisirio@gmail.com>2016-02-20 14:32:35 +0000
commit22a386b4540b2e5fd4249887e26fdd78a73b692c (patch)
tree23f2d67abd32f3a9fb2e7be05d66e1e88cc809c8 /os/various/shell/shell.c
parent27e1398be3821f814aee4eaf7627b2d8fb5c4934 (diff)
downloadChibiOS-22a386b4540b2e5fd4249887e26fdd78a73b692c.tar.gz
ChibiOS-22a386b4540b2e5fd4249887e26fdd78a73b692c.tar.bz2
ChibiOS-22a386b4540b2e5fd4249887e26fdd78a73b692c.zip
Shell enhancements.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@8914 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/various/shell/shell.c')
-rw-r--r--os/various/shell/shell.c38
1 files changed, 27 insertions, 11 deletions
diff --git a/os/various/shell/shell.c b/os/various/shell/shell.c
index 379b6ddf0..958afcaf1 100644
--- a/os/various/shell/shell.c
+++ b/os/various/shell/shell.c
@@ -55,21 +55,37 @@ event_source_t shell_terminated;
/* Module local functions. */
/*===========================================================================*/
-static char *_strtok(char *str, const char *delim, char **saveptr) {
- char *token;
- if (str)
+static char *parse_arguments(char *str, char **saveptr) {
+ char *p;
+
+ if (str != NULL)
*saveptr = str;
- token = *saveptr;
- if (!token)
+ p = *saveptr;
+ if (!p) {
return NULL;
+ }
- token += strspn(token, delim);
- *saveptr = strpbrk(token, delim);
- if (*saveptr)
+ /* Skipping white space.*/
+ p += strspn(p, " \t");
+
+ if (*p == '"') {
+ /* If an argument starts with a double quote then its delimiter is another
+ quote.*/
+ p++;
+ *saveptr = strpbrk(p, "\"");
+ }
+ else {
+ /* The delimiter is white space.*/
+ *saveptr = strpbrk(p, " \t");
+ }
+
+ /* Replacing the delimiter with a zero.*/
+ if (*saveptr != NULL) {
*(*saveptr)++ = '\0';
+ }
- return *token ? token : NULL;
+ return *p != '\0' ? p : NULL;
}
static void usage(BaseSequentialStream *chp, char *p) {
@@ -122,10 +138,10 @@ THD_FUNCTION(shellThread, p) {
chprintf(chp, "\r\nlogout");
break;
}
- lp = _strtok(line, " \t", &tokp);
+ lp = parse_arguments(line, &tokp);
cmd = lp;
n = 0;
- while ((lp = _strtok(NULL, " \t", &tokp)) != NULL) {
+ while ((lp = parse_arguments(NULL, &tokp)) != NULL) {
if (n >= SHELL_MAX_ARGUMENTS) {
chprintf(chp, "too many arguments\r\n");
cmd = NULL;