home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c221 / 5.ddi / MWHC.005 / E0 < prev    next >
Encoding:
Text File  |  1992-04-28  |  3.3 KB  |  97 lines

  1. #include <stdlib.h>
  2. #include <stddef.h>
  3. #include <system.cf>
  4.  
  5. /*********************************************************************
  6. (C) Copyright 1989-1992  MetaWare Incorporated;  Santa Cruz, CA 95060.
  7. *********************************************************************/
  8.  
  9. static void replace_argc_argv(int *argcp, char ***argvp,
  10.     int newargc, char *newargv[]) {
  11.     /* See if new array fits in old */
  12.     if (newargc > *argcp) { /* allocate a new array */
  13.     *argvp = (char **) malloc( (newargc + 1) * sizeof( char * ) );
  14.     if (!argvp) return;    // Doesn't fit.
  15.     }
  16.     /* Copy work buffer to output array */
  17.     *argcp = newargc; char **argvout, **argvin;
  18.     for (argvout = *argvp, argvin = newargv; newargc--;)
  19.     *argvout++ = *argvin++;
  20.     *argvout = NULL;    /* argv[n+1] == NULL. */
  21.     }
  22.  
  23. static void get_path_name(char *fname,char *path) {
  24.     register char *p;
  25.     strcpy(path,fname);
  26.     p = &path[strlen(path)+1];
  27.     while (--p >= path && *p != '/' && *p != '\\' && *p != ':');
  28.     *(p+1) = '\0';
  29.     }
  30.  
  31. #define MAX_ARGS  256
  32. void expand_wild_cards(int *argcp,char ***argvp) {
  33.   char  *work_argv[ MAX_ARGS ]; /* Scratch space to build up new argv */
  34.   char  **argvin = *argvp;      /* current input argv entry */
  35.   char  **argvout = work_argv;  /* current output argv entry */
  36.   int   argcout = 0;
  37.   char  *argp;                  /* Current input argument */
  38.   int   change = 0;             /* Flags whether we changed anything */
  39.  
  40.   /*************************************************************************/
  41.   void each_matching_file_name(char *farg)->(char *s)
  42.    {
  43.       char file_name[256];              /* File name buffer */
  44.  
  45.       File_mode fmode=Attr_archive;
  46.       char dir_name[248];
  47.       Find_buffer fbuf;
  48.  
  49.       get_path_name(farg,dir_name);
  50.       memset((void *)&fbuf,0,sizeof(Find_buffer));
  51.       errno = 0;
  52.       c_find_first( farg,  &fbuf , fmode);
  53.       while (!errno && argcout < MAX_ARGS)
  54.     {
  55.       strcpy(file_name,dir_name);
  56.       strcat(file_name,fbuf.Name);
  57.       yield(file_name);
  58.       if (!errno)
  59.          find_next(&fbuf);
  60.      }
  61.     } /* end of each_matching_file_name()->() */
  62.   /*************************************************************************/
  63.     while (((argp = *argvin++) != NULL) && (argcout < MAX_ARGS)) {
  64.     if (strchr(argp, '*') || strchr(argp, '?')) {
  65.     for S <- each_matching_file_name(argp) do {
  66.         *argvout = malloc(strlen(S)+1);
  67.         if (!argvout) goto RETURN;  // No more memory.
  68.         strcpy(*argvout, S );
  69.         argvout++;
  70.         argcout++;
  71.         }
  72.     change = 1;
  73.     }
  74.     else {                  /* regular argument - pass it along */
  75.     *argvout++ = argp;
  76.     argcout++;
  77.     }
  78.     }
  79.     /* All done scanning argument list - see if we did anything */
  80.     if (change) { /* see if we blew out with too many args */
  81.     if (argcout == MAX_ARGS)
  82.         printf( "More than %d command line args (after wild-card %s\n",
  83.         "expansion), remainder ignored", MAX_ARGS );
  84.     replace_argc_argv(argcp,argvp,argcout,work_argv);
  85.     }
  86. RETURN: ;
  87.     }
  88. #ifdef TEST
  89. main (int argc, char ** argv) {
  90.    printf("Before expansion:\n");
  91.    for (int i = 0; i < argc; i++) printf("argv[%d]=%s\n",i,argv[i]);
  92.    expand_wild_cards(&argc,&argv);
  93.    printf("After  expansion:\n");
  94.    for (    i = 0; i < argc; i++) printf("argv[%d]=%s\n",i,argv[i]);
  95.    }
  96. #endif
  97.