From: wdenk Date: Thu, 2 Jan 2003 23:57:29 +0000 (+0000) Subject: Patch by Detlev Zundel, 30 Dec 2002: X-Git-Tag: LABEL_2006_03_12_0025~953 X-Git-Url: https://git.kernelconcepts.de/?p=karo-tx-uboot.git;a=commitdiff_plain;h=a25f862ba8b9d8440973d0204c19fec859f953f3 Patch by Detlev Zundel, 30 Dec 2002: Add single quote support for (old) command line parser --- diff --git a/CHANGELOG b/CHANGELOG index 13ee632ad0..e16565423e 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 3e92649ced..401efcf854 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;