home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / OS2 / EMXFIX04.ZIP / WILDCARD.C < prev    next >
C/C++ Source or Header  |  1994-01-17  |  2KB  |  78 lines

  1. /* wildcard.c (emx+gcc) -- Copyright (c) 1990-1994 by Eberhard Mattes */
  2.  
  3. #include <sys/emx.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. #define WPUT(x) do { \
  9.     if (new_argc >= new_alloc) \
  10.       { \
  11.         new_alloc += 20; \
  12.         new_argv = (char **)realloc (new_argv, new_alloc * sizeof (char *)); \
  13.         if (new_argv == NULL) \
  14.             goto out_of_memory; \
  15.       } \
  16.     new_argv[new_argc++] = x; \
  17.   } while (0)
  18.  
  19.  
  20.  
  21. void _wildcard (int *argcp, char ***argvp)
  22. {
  23.   int i, old_argc, new_argc, new_alloc;
  24.   char **old_argv, **new_argv;
  25.   char line[256], *p, *q;
  26.   struct _find find;
  27.  
  28.   old_argc = *argcp; old_argv = *argvp;
  29.   _rfnlwr ();
  30.   for (i = 1; i < old_argc; ++i)
  31.     if (old_argv[i] != NULL &&
  32.         !(old_argv[i][-1] & (_ARG_DQUOTE|_ARG_RESPONSE)) &&
  33.         strpbrk (old_argv[i], "?*") != NULL)
  34.       break;
  35.   if (i >= old_argc)
  36.     return;                 /* do nothing */
  37.   new_argv = NULL; new_alloc = 0; new_argc = 0;
  38.   for (i = 0; i < old_argc; ++i)
  39.     {
  40.       if (i == 0 || old_argv[i] == NULL
  41.           || (old_argv[i][-1] & (_ARG_DQUOTE|_ARG_RESPONSE))
  42.           || strpbrk (old_argv[i], "?*") == NULL
  43.           || __findfirst (old_argv[i], 0x10, &find) != 0)
  44.         WPUT (old_argv[i]);
  45.       else
  46.         {
  47.           line[0] = _ARG_NONZERO|_ARG_WILDCARD;
  48.           strcpy (line+1, old_argv[i]);
  49.           p = q = line + 1;
  50.           while (*q != 0)
  51.             {
  52.               if (*q == ':' || *q == '\\' || *q == '/')
  53.                 p = q + 1;
  54.               ++q;
  55.             }
  56.           do
  57.             {
  58.               if (strcmp (find.name, ".") != 0 &&
  59.                   strcmp (find.name, "..") != 0)
  60.                 {
  61.                   strcpy (p, find.name);
  62.                   _fnlwr2 (p, line+1);
  63.                   q = strdup (line);
  64.                   WPUT (q+1);
  65.                 }
  66.             } while (__findnext (&find) == 0);
  67.         }
  68.     }
  69.   WPUT (NULL); --new_argc;
  70.   *argcp = new_argc; *argvp = new_argv;
  71.   _rfnlwr ();
  72.   return;
  73.  
  74. out_of_memory:
  75.   fputs ("Out of memory while expanding wildcards\n", stderr);
  76.   exit (255);
  77. }
  78.