Patch by Detlev Zundel, 30 Dec 2002:
Add single quote support for (old) command line parser
diff --git a/CHANGELOG b/CHANGELOG
index 13ee632..e165654 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,8 @@
Changes since U-Boot 0.2.0:
======================================================================
+* Add single quote support for (old) command line parser
+
* Switch LWMON board default config from FRAM to EEPROM;
in POST, EEPROM shows up on 8 addresses
diff --git a/common/main.c b/common/main.c
index 3e92649..401efcf 100644
--- a/common/main.c
+++ b/common/main.c
@@ -613,7 +613,7 @@
int state = 0; /* 0 = waiting for '$' */
/* 1 = waiting for '(' */
/* 2 = waiting for ')' */
-
+ /* 3 = waiting for ''' */
#ifdef DEBUG_PARSER
char *output_start = output;
@@ -626,6 +626,7 @@
c = *input++;
inputcnt--;
+ if (state!=3) {
/* remove one level of escape characters */
if ((c == '\\') && (prev != '\\')) {
if (inputcnt-- == 0)
@@ -633,9 +634,16 @@
prev = c;
c = *input++;
}
+ }
switch (state) {
case 0: /* Waiting for (unescaped) $ */
+ if ((c == '\'') && (prev != '\\')) {
+ state = 3;
+ if (inputcnt)
+ inputcnt--;
+ break;
+ }
if ((c == '$') && (prev != '\\')) {
state++;
} else {
@@ -681,10 +689,19 @@
}
/* Look for another '$' */
state = 0;
+ }
+ break;
+ case 3: /* Waiting for ' */
+ if ((c == '\'') && (prev != '\\')) {
+ state = 0;
+ if (inputcnt)
+ inputcnt--;
+ } else {
+ *(output++) = c;
+ outputcnt--;
}
break;
}
-
prev = c;
}
@@ -725,6 +742,7 @@
char *argv[CFG_MAXARGS + 1]; /* NULL terminated */
int argc;
int repeatable = 1;
+ int inquotes;
#ifdef DEBUG_PARSER
printf ("[RUN_COMMAND] cmd[%p]=\"", cmd);
@@ -758,8 +776,13 @@
* Find separator, or string end
* Allow simple escape of ';' by writing "\;"
*/
- for (sep = str; *sep; sep++) {
- if ((*sep == ';') && /* separator */
+ for (inquotes = 0, sep = str; *sep; sep++) {
+ if ((*sep=='\'') &&
+ (*(sep-1) != '\\'))
+ inquotes=!inquotes;
+
+ if (!inquotes &&
+ (*sep == ';') && /* separator */
( sep != str) && /* past string start */
(*(sep-1) != '\\')) /* and NOT escaped */
break;