home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / gcc / config / winnt / spawnv.c < prev    next >
C/C++ Source or Header  |  1997-02-11  |  2KB  |  84 lines

  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. void
  9. fix_argv (argv, cmdname)
  10.   char **argv;
  11.   char **cmdname;
  12. {
  13.   static char sh_chars[] = "\"";
  14.  
  15.   int i, len;
  16.   char *new_argv;
  17.   char *p, *ap;
  18.  
  19.   for (i=1; argv[i]; i++)
  20.     {
  21.  
  22.       len = strlen (argv[i]);
  23.       new_argv = malloc (2*len+3);
  24.       ap = new_argv;
  25.  
  26.       for (p = argv[i]; *p != '\0'; ++p)
  27.         {
  28.           if (index (sh_chars, *p) != 0)
  29.             *ap++ = '\\';
  30.           *ap++ = *p;
  31.         }
  32.       *ap = '\0';
  33.       argv[i] = new_argv;
  34.     }
  35.  
  36.   if (cmdname && *cmdname) {
  37.     len = strlen(*cmdname);
  38.     new_argv = malloc(len+1);
  39.     for(i=0; i<=len; i++) {
  40.        new_argv[i] = ('/' == (*cmdname)[i] ? '\\' : (*cmdname)[i]);
  41.     }
  42.     *cmdname = new_argv;
  43.   }
  44. }
  45.  
  46. int __spawnv (mode, cmdname, argv)
  47.   int mode;
  48.   const char *cmdname;
  49.   char **argv;
  50. {
  51.   fix_argv (argv, &cmdname);
  52.   _spawnv (mode, cmdname, argv);
  53. }
  54.  
  55. int __spawnvp (mode, cmdname, argv)
  56.   int mode;
  57.   const char *cmdname;
  58.   char **argv;
  59. {
  60.   fix_argv (argv, &cmdname);
  61.   _spawnvp (mode, cmdname, argv);
  62. }
  63.  
  64. int spawnve (mode, cmdname, argv, envp)
  65.   int mode;
  66.   const char *cmdname;
  67.   char **argv;
  68.   const char *const *envp;
  69. {
  70.   fix_argv (argv, &cmdname);
  71.   _spawnve (mode, cmdname, argv, envp);
  72. }
  73.  
  74. int __spawnvpe (mode, cmdname, argv, envp)
  75.   int mode;
  76.   const char *cmdname;
  77.   char **argv;
  78.   const char *const *envp;
  79. {
  80.   fix_argv (argv, &cmdname);
  81.   _spawnvpe (mode, cmdname, argv, envp);
  82. }
  83.  
  84.