Patch by Detlev Zundel, 30 Dec 2002:
Add single quote support for (old) command line parser
This commit is contained in:
parent
13122b4f1d
commit
a25f862ba8
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user