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;