Initial revision
[fw/sdcc] / support / cpp / winnt / spawnv.c
1 /* This is a kludge to get around the Microsoft C spawn functions' propensity
2    to remove the outermost set of double quotes from all arguments.  */
3
4 #define index(s,c) strchr((s),(c))
5
6 extern char *malloc ();
7
8 const char * const *
9 fix_argv (argv)
10   char **argv;
11 {
12   static char sh_chars[] = "\"";
13
14   int i, len;
15   char *new_argv;
16   char *p, *ap;
17
18   for (i=1; argv[i]; i++)
19     {
20
21       len = strlen (argv[i]);
22       new_argv = malloc (2*len+3);
23       ap = new_argv;
24
25       for (p = argv[i]; *p != '\0'; ++p)
26         {
27           if (index (sh_chars, *p) != 0)
28             *ap++ = '\\';
29           *ap++ = *p;
30         }
31       *ap = '\0';
32       argv[i] = new_argv;
33     }
34
35   return (const char * const *) argv;
36 }
37
38 int __spawnv (mode, cmdname, argv)
39   int mode;
40   const char *cmdname;
41   char **argv;
42 {
43   _spawnv (mode, cmdname, fix_argv (argv));
44 }
45
46 int __spawnvp (mode, cmdname, argv)
47   int mode;
48   const char *cmdname;
49   char **argv;
50 {
51   _spawnvp (mode, cmdname, fix_argv (argv));
52 }
53
54 int spawnve (mode, cmdname, argv, envp)
55   int mode;
56   const char *cmdname;
57   char **argv;
58   const char *const *envp;
59 {
60   _spawnve (mode, cmdname, fix_argv (argv), envp);
61 }
62
63 int __spawnvpe (mode, cmdname, argv, envp)
64   int mode;
65   const char *cmdname;
66   char **argv;
67   const char *const *envp;
68 {
69   _spawnvpe (mode, cmdname, fix_argv (argv), envp);
70 }
71