diff options
author | wdenk <wdenk> | 2003-01-02 23:57:29 +0000 |
---|---|---|
committer | wdenk <wdenk> | 2003-01-02 23:57:29 +0000 |
commit | a25f862ba8b9d8440973d0204c19fec859f953f3 (patch) | |
tree | cf8bd8a15a858bd9d4a785f41abc2bc3041aa973 /common/main.c | |
parent | 13122b4f1d6d00d6d4993ef56d9b5c5bd24f431e (diff) | |
download | u-boot-imx-a25f862ba8b9d8440973d0204c19fec859f953f3.zip u-boot-imx-a25f862ba8b9d8440973d0204c19fec859f953f3.tar.gz u-boot-imx-a25f862ba8b9d8440973d0204c19fec859f953f3.tar.bz2 |
Patch by Detlev Zundel, 30 Dec 2002:
Add single quote support for (old) command line parser
Diffstat (limited to 'common/main.c')
-rw-r--r-- | common/main.c | 31 |
1 files changed, 27 insertions, 4 deletions
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 @@ 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; |