diff options
Diffstat (limited to 'common')
-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 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; |