summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorwdenk <wdenk>2003-01-02 23:57:29 +0000
committerwdenk <wdenk>2003-01-02 23:57:29 +0000
commita25f862ba8b9d8440973d0204c19fec859f953f3 (patch)
treecf8bd8a15a858bd9d4a785f41abc2bc3041aa973 /common
parent13122b4f1d6d00d6d4993ef56d9b5c5bd24f431e (diff)
Patch by Detlev Zundel, 30 Dec 2002:
Add single quote support for (old) command line parser
Diffstat (limited to 'common')
-rw-r--r--common/main.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/common/main.c b/common/main.c
index 3e92649ced3..401efcf8546 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;