summaryrefslogtreecommitdiffstats
path: root/sys/boot/common/interp_parse.c
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1998-09-03 06:14:41 +0000
committerjkh <jkh@FreeBSD.org>1998-09-03 06:14:41 +0000
commit50ed861cddbca02555f75be64719801242a1cae9 (patch)
treedf83116e71ac6495c25f118f14a1b9641bc1f01c /sys/boot/common/interp_parse.c
parent2feae82d784a79b3fac686b4ca52c044fd75efda (diff)
downloadFreeBSD-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.c21
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;
OpenPOWER on IntegriCloud