Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2000-07-16 10:31:06 +0400
committerChristopher Faylor <me@cgf.cx>2000-07-16 10:31:06 +0400
commit8e382d804957ac50dc61af60eef001cae13c25be (patch)
tree86dc1d2e60fdedfe5a31578beded8f9fcd22d47f
parent2768430b64d4e6689d923669c2c5af2ffcdebaaa (diff)
* spawn.cc (spawn_guts): Use \ for quoting '"'.
* dcrt0.cc (quoted): Understand \ quoting for '"'.
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/dcrt0.cc30
-rw-r--r--winsup/cygwin/spawn.cc11
3 files changed, 29 insertions, 17 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 4370ffb16..6d5258e32 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,8 @@
+Sun Jul 16 02:30:09 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * spawn.cc (spawn_guts): Use \ for quoting '"'.
+ * dcrt0.cc (quoted): Understand \ quoting for '"'.
+
Sun Jul 16 00:32:58 2000 Christopher Faylor <cgf@cygnus.com>
* dcrt0.cc (build_argv): Strip quotes from argv[0] since it should
diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
index 2d3fa8f7b..e33187acf 100644
--- a/winsup/cygwin/dcrt0.cc
+++ b/winsup/cygwin/dcrt0.cc
@@ -277,7 +277,7 @@ isquote (char c)
}
/* Step over a run of characters delimited by quotes */
-static __inline char *
+static /*__inline*/ char *
quoted (char *cmd, int winshell)
{
char *p;
@@ -293,10 +293,10 @@ quoted (char *cmd, int winshell)
cmd = strchr (cmd, '\0'); // no closing quote
break;
}
- else if (p[1] == quote)
+ else if (p[1] == quote && p[-1] != '\\')
{
- *p++ = '\\';
- cmd = p; // a quoted quote
+ *p = '\\';
+ cmd = ++p; // a quoted quote
}
else
{
@@ -310,20 +310,26 @@ quoted (char *cmd, int winshell)
characters should have been placed here by spawn_guts, so
we'll just pinch them out of the command string unless
they're quoted with a preceding \ */
- strcpy (cmd, cmd + 1);
- while (*cmd)
+ p = cmd + 1;
+ while (*p)
{
- if (*cmd != quote)
- cmd++;
- else if (cmd[1] == quote)
- strcpy (cmd++, cmd + 1);
+ if (*p != quote)
+ p++;
+ else if (p[-1] == '\\')
+ strcpy (p - 1, p);
+ else if (p[1] == quote)
+ {
+ strcpy (p, p + 1);
+ p++;
+ }
else
{
- strcpy (cmd, cmd + 1);
+ strcpy (p, p + 1);
break;
}
}
- return cmd;
+ strcpy (cmd, cmd + 1);
+ return p - 1;
}
/* Perform a glob on word if it contains wildcard characters.
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index 6ca82e413..af284f8ee 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -407,16 +407,17 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
newargv0 = NULL;
int len = strlen (a);
- if (len != 0 && !(p = strpbrk (a, " \t\n\r\"")))
+ if (len != 0 && !strpbrk (a, " \t\n\r\""))
one_line.add (a, len);
else
{
one_line.add ("\"", 1);
- for (; p; a = p, p = strchr (p, '"'))
+ for (0; p = strpbrk (a, "\"\\"); a = ++p)
{
- one_line.add (a, ++p - a);
- if (p[-1] == '"')
- one_line.add ("\"", 1);
+ one_line.add (a, p - a);
+ if (*p == '\\' || *p == '"')
+ one_line.add ("\\", 1);
+ one_line.add (p, 1);
}
if (*a)
one_line.add (a);