diff --git a/sys/boot/common/interp_backslash.c b/sys/boot/common/interp_backslash.c index cbabb7c2cab1..8807fdaa9645 100644 --- a/sys/boot/common/interp_backslash.c +++ b/sys/boot/common/interp_backslash.c @@ -11,7 +11,7 @@ * Jordan K. Hubbard * 29 August 1998 * - * $Id$ + * $Id: interp_backslash.c,v 1.1 1998/09/01 00:41:24 msmith Exp $ * * Routine for doing backslash elimination. */ @@ -52,6 +52,13 @@ backslash(char *str) str++; break; + /* preserve backslashed quotes */ + case '\'': + case '"': + new_str[i++] = '\\'; + new_str[i++] = *str++; + break; + case 'b': new_str[i++] = '\b'; str++; diff --git a/sys/boot/common/interp_parse.c b/sys/boot/common/interp_parse.c index ff5c274ae8d8..57aa68151a63 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;