Initial revision
authorRichard Kenner <kenner@gcc.gnu.org>
Mon, 19 Jun 1995 20:52:51 +0000 (16:52 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 19 Jun 1995 20:52:51 +0000 (16:52 -0400)
From-SVN: r10011

gcc/config/winnt/spawnv.c [new file with mode: 0644]

diff --git a/gcc/config/winnt/spawnv.c b/gcc/config/winnt/spawnv.c
new file mode 100644 (file)
index 0000000..1b5ace1
--- /dev/null
@@ -0,0 +1,73 @@
+/* This is a kludge to get around the Microsoft C spawn functions' propensity
+   to remove the outermost set of double quotes from all arguements.  */
+
+
+#define index(s,c) strchr((s),(c))
+
+extern char *xmalloc ();
+
+const char * const *
+fix_argv (argv)
+  char **argv;
+{
+  static char sh_chars[] = "\"";
+
+  int i, len;
+  char *new_argv;
+  char *p, *ap;
+
+  for (i=1; argv[i]; i++)
+    {
+
+      len = strlen (argv[i]);
+      new_argv = xmalloc (2*len+3);
+      ap = new_argv;
+      *ap++ = '"';
+
+      for (p = argv[i]; *p != '\0'; ++p)
+        {
+          if (index (sh_chars, *p) != 0)
+            *ap++ = '\\';
+          *ap++ = *p;
+        }
+      *ap++ = '"';
+      *ap = '\0';
+      argv[i] = new_argv;
+    }
+
+    return (const char * const *) argv;
+}
+
+int spawnv (mode, cmdname, argv)
+  int mode;
+  const char *cmdname;
+  char **argv;
+{
+  _spawnv (mode, cmdname, fix_argv (argv));
+}
+
+int spawnvp (mode, cmdname, argv)
+  int mode;
+  const char *cmdname;
+  char **argv;
+{
+  _spawnvp (mode, cmdname, fix_argv (argv));
+}
+
+int spawnve (mode, cmdname, argv, envp)
+  int mode;
+  const char *cmdname;
+  char **argv;
+  const char *const *envp;
+{
+  _spawnve (mode, cmdname, fix_argv (argv), envp);
+}
+
+int spawnvpe (mode, cmdname, argv, envp)
+  int mode;
+  const char *cmdname;
+  char **argv;
+  const char *const *envp;
+{
+  _spawnvpe (mode, cmdname, fix_argv (argv), envp);
+}