diff options
author | jkh <jkh@FreeBSD.org> | 1998-09-03 06:14:41 +0000 |
---|---|---|
committer | jkh <jkh@FreeBSD.org> | 1998-09-03 06:14:41 +0000 |
commit | 50ed861cddbca02555f75be64719801242a1cae9 (patch) | |
tree | df83116e71ac6495c25f118f14a1b9641bc1f01c /sys/boot/common/interp_parse.c | |
parent | 2feae82d784a79b3fac686b4ca52c044fd75efda (diff) | |
download | FreeBSD-src-50ed861cddbca02555f75be64719801242a1cae9.zip FreeBSD-src-50ed861cddbca02555f75be64719801242a1cae9.tar.gz |
Allow quoted strings (single or double) for grouping whitespace separated
items. Eliminate warnings.
Diffstat (limited to 'sys/boot/common/interp_parse.c')
-rw-r--r-- | sys/boot/common/interp_parse.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/sys/boot/common/interp_parse.c b/sys/boot/common/interp_parse.c index ff5c274..57aa681 100644 --- a/sys/boot/common/interp_parse.c +++ b/sys/boot/common/interp_parse.c @@ -11,7 +11,7 @@ * Jordan K. Hubbard * 29 August 1998 * - * $Id$ + * $Id: interp_parse.c,v 1.1 1998/09/01 00:41:24 msmith Exp $ * * The meat of the simple parser. */ @@ -71,30 +71,41 @@ isdelim(char ch) return '\0'; } +static int +isquote(char ch) +{ + return (ch == '\'' || ch == '"'); +} + int parse(int *argc, char ***argv, char *str) { int ac; char *val, *p, *q, *copy = NULL; int i = 0; - char token, tmp, *buf; + char token, tmp, quote, *buf; enum { STR, VAR, WHITE } state; ac = *argc = 0; + quote = 0; if (!str || (p = copy = backslash(str)) == NULL) return 1; /* Initialize vector and state */ clean(); state = STR; - buf = malloc(PARSE_BUFSIZE); + buf = (char *)malloc(PARSE_BUFSIZE); token = 0; /* And awaaaaaaaaay we go! */ while (*p) { switch (state) { case STR: - if (isspace(*p)) { + if (isquote(*p)) { + quote = quote ? 0 : *p; + ++p; + } + else if (isspace(*p) && !quote) { state = WHITE; if (i) { buf[i] = '\0'; @@ -151,7 +162,7 @@ parse(int *argc, char ***argv, char *str) } args[ac] = NULL; *argc = ac; - *argv = malloc((sizeof(char *) * ac + 1)); + *argv = (char **)malloc((sizeof(char *) * ac + 1)); bcopy(args, *argv, sizeof(char *) * ac + 1); free(copy); return 0; |