diff options
-rw-r--r-- | cpukit/ChangeLog | 5 | ||||
-rw-r--r-- | cpukit/libmisc/shell/shell_makeargs.c | 36 |
2 files changed, 31 insertions, 10 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index ed134541f4..0cabb535c7 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,3 +1,8 @@ +2010-03-11 Andrei Mozzhuhin <nopscmn@gmail.com> + + PR 1496/shell + * libmisc/shell/shell_makeargs.c: Add support for quoted arguments. + 2010-03-10 Joel Sherrill <joel.sherrill@oarcorp.com> * score/include/rtems/score/interr.h, diff --git a/cpukit/libmisc/shell/shell_makeargs.c b/cpukit/libmisc/shell/shell_makeargs.c index 77d937e101..4901b54bd7 100644 --- a/cpukit/libmisc/shell/shell_makeargs.c +++ b/cpukit/libmisc/shell/shell_makeargs.c @@ -25,22 +25,38 @@ int rtems_shell_make_args( ) { int argc; - char *command; + char *ch; int status = 0; - + argc = 0; - command = commandLine; + ch = commandLine; + + while ( *ch ) { + + while ( isspace(*ch) ) ch++; - while ( 1 ) { - command = strtok( command, " \t\r\n" ); - if ( command == NULL ) + if ( *ch == '\0' ) break; - argv_p[ argc++ ] = command; - command = '\0'; - if ( argc == (max_args-1) ) { - status = -1; + + if ( *ch == '"' ) { + argv_p[ argc++ ] = ++ch; + while ( ( *ch == '\0' ) && ( *ch != '"' ) ) ch++; + } else { + argv_p[ argc++ ] = ch; + while ( ( *ch == '\0' ) && ( !isspace(*ch) ) ) ch++; + } + + if ( *ch == '\0' ) break; + + *ch++ = '\0'; + + if ( argc == (max_args-1) ) { + status = -1; + break; } + + } argv_p[ argc ] = NULL; *argc_p = argc; |