home *** CD-ROM | disk | FTP | other *** search
/ Mega Top 1 / os2_top1.zip / os2_top1 / APPS / UTILS / H-O / LESS177 / SYSTEM.C < prev    next >
C/C++ Source or Header  |  1992-08-07  |  3KB  |  102 lines

  1. /* system.c (emx+gcc) -- Copyright (c) 1990-1992 by Eberhard Mattes */
  2.  
  3. #include <process.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <io.h>
  7. #include <errno.h>
  8.  
  9. int system (const char *name)
  10.     {
  11.     int argc, arga, i, rc, my_errno;
  12.     int bs, quote;
  13.     char *tmp, *args, *p, *q, *sh, *dst;
  14.     const char *add = " /c ";
  15.     char **argv, **tav;
  16.  
  17.     tmp = NULL; args = NULL; argv = NULL;
  18.     sh = getenv ("COMSPEC");
  19.     if (sh == NULL)
  20.         {
  21.         errno = ENOENT;
  22.         return (-1);
  23.         }
  24.     if (name == NULL)   /* Check for command interpreter */
  25.         return (access (sh, 0) == 0);
  26.     if (*name == 0)
  27.         add = "";
  28.     i = strlen (sh) + strlen (add) + strlen (name) + 1;
  29.     tmp = malloc (i);
  30.     args = malloc (i);
  31.     if (tmp == NULL || args == NULL)
  32.         {
  33.         rc = -1; my_errno = ENOMEM;
  34.         goto done;
  35.         }
  36.     (void)strcpy (tmp, sh);
  37.     (void)strcat (tmp, add);
  38.     (void)strcat (tmp, name);
  39.     argc = 0; arga = 0; p = tmp; dst = args;
  40.     do  {
  41.         while (*p == ' ' || *p == '\t' || *p == '\n')
  42.             ++p;
  43.         if (argc >= arga)
  44.             {
  45.             arga += 20;
  46.             tav = (char **)realloc (argv, arga * sizeof (char *));
  47.             if (tav == NULL)
  48.                 {
  49.                 rc = -1; my_errno = ENOMEM;
  50.                 goto done;
  51.                 }
  52.             argv = tav;
  53.             }
  54.         if (*p == 0)
  55.             q = NULL;
  56.         else
  57.             {
  58.             q = dst; bs = 0; quote = 0;
  59.             for (;;)
  60.                 {
  61.                 if (*p == '"')
  62.                     {
  63.                     while (bs >= 2)
  64.                         {
  65.                         *dst++ = '\\';
  66.                         bs -= 2;
  67.                         }
  68.                     if (bs & 1)
  69.                         *dst++ = '"';
  70.                     else
  71.                         quote = !quote;
  72.                     bs = 0;
  73.                     }
  74.                 else if (*p == '\\')
  75.                     ++bs;
  76.                 else
  77.                     {
  78.                     while (bs != 0)
  79.                         {
  80.                         *dst++ = '\\';
  81.                         --bs;
  82.                         }
  83.                     if (*p == 0 || ((*p == ' ' || *p == '\t') && !quote))
  84.                         break;
  85.                     *dst++ = *p;
  86.                     }
  87.                 ++p;
  88.                 }
  89.             *dst++ = 0;
  90.             }
  91.         argv[argc++] = q;
  92.         } while (q != NULL);
  93.     rc = spawnvp (P_WAIT, argv[0], (char const * const *)argv);
  94.     my_errno = errno;
  95. done:
  96.     if (tmp != NULL) free (tmp);
  97.     if (argv != NULL) free (argv);
  98.     if (args != NULL) free (args);
  99.     errno = my_errno;
  100.     return (rc);
  101.     }
  102.