* \return True if a word was extracted, false if we got to the end
* of the string without extracting any word.
*/
-static bool get_word(const char **begin, const char **end)
+bool get_word(const char **begin, const char **end)
{
const char *cur = *end;
+ bool open_quote = false;
while ((*cur == ' ' || *cur == '\t') && *cur)
++cur;
+ if (*cur == '"')
+ open_quote = true;
+
*begin = cur;
- while ((*cur != ' ' && *cur != '\t') && *cur)
+ if (open_quote)
+ {
++cur;
+ while (*cur != '"' && *cur)
+ ++cur;
+ if (*cur != '"')
+ return false;
+ ++cur;
+ }
+ else
+ while ((*cur != ' ' && *cur != '\t') && *cur)
+ ++cur;
*end = cur;
break;
case 's':
- (*argv).str.p = begin;
- (*argv).str.sz = end - begin;
+ (*argv).s.p = begin;
+ (*argv).s.sz = end - begin;
+ /* Remove the quotes from argument */
+ if (*begin == '"' && *(end - 1) == '"')
+ {
+ (*argv).s.p += 1;
+ (*argv).s.sz -= 2;
+ }
argv++;
break;
if (!input)
return false;
- args[0].str.p = cmdp->name;
+ args[0].s.p = cmdp->name;
if (!parseArgs(cmdp->arg_fmt, input, args + 1))
return false;