diff options
| -rw-r--r-- | CHANGELOG | 2 | ||||
| -rw-r--r-- | common/main.c | 31 | 
2 files changed, 29 insertions, 4 deletions
| @@ -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 3e92649ce..401efcf85 100644 --- a/common/main.c +++ b/common/main.c @@ -613,7 +613,7 @@ static void process_macros (const char *input, char *output)  	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 @@ static void process_macros (const char *input, char *output)  	    c = *input++;  	    inputcnt--; +	    if (state!=3) {  	    /* remove one level of escape characters */  	    if ((c == '\\') && (prev != '\\')) {  		if (inputcnt-- == 0) @@ -633,9 +634,16 @@ static void process_macros (const char *input, char *output)  		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 { @@ -683,8 +691,17 @@ static void process_macros (const char *input, char *output)  			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 @@ int run_command (const char *cmd, int flag)  	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 @@ int run_command (const char *cmd, int flag)  		 * 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; |