8sa1-gcc/gcc/config/winnt/spawnv.c

74 lines
1.3 KiB
C
Raw Normal View History

1995-06-19 16:52:51 -04:00
/* 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);
}