|
|
|
@ -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; |
|
|
|
|