home *** CD-ROM | disk | FTP | other *** search
- #include <stdlib.h>
- #include <stddef.h>
- #include <system.cf>
-
- /*********************************************************************
- (C) Copyright 1989-1992 MetaWare Incorporated; Santa Cruz, CA 95060.
- *********************************************************************/
-
- static void replace_argc_argv(int *argcp, char ***argvp,
- int newargc, char *newargv[]) {
- /* See if new array fits in old */
- if (newargc > *argcp) { /* allocate a new array */
- *argvp = (char **) malloc( (newargc + 1) * sizeof( char * ) );
- if (!argvp) return; // Doesn't fit.
- }
- /* Copy work buffer to output array */
- *argcp = newargc; char **argvout, **argvin;
- for (argvout = *argvp, argvin = newargv; newargc--;)
- *argvout++ = *argvin++;
- *argvout = NULL; /* argv[n+1] == NULL. */
- }
-
- static void get_path_name(char *fname,char *path) {
- register char *p;
- strcpy(path,fname);
- p = &path[strlen(path)+1];
- while (--p >= path && *p != '/' && *p != '\\' && *p != ':');
- *(p+1) = '\0';
- }
-
- #define MAX_ARGS 256
- void expand_wild_cards(int *argcp,char ***argvp) {
- char *work_argv[ MAX_ARGS ]; /* Scratch space to build up new argv */
- char **argvin = *argvp; /* current input argv entry */
- char **argvout = work_argv; /* current output argv entry */
- int argcout = 0;
- char *argp; /* Current input argument */
- int change = 0; /* Flags whether we changed anything */
-
- /*************************************************************************/
- void each_matching_file_name(char *farg)->(char *s)
- {
- char file_name[256]; /* File name buffer */
-
- File_mode fmode=Attr_archive;
- char dir_name[248];
- Find_buffer fbuf;
-
- get_path_name(farg,dir_name);
- memset((void *)&fbuf,0,sizeof(Find_buffer));
- errno = 0;
- c_find_first( farg, &fbuf , fmode);
- while (!errno && argcout < MAX_ARGS)
- {
- strcpy(file_name,dir_name);
- strcat(file_name,fbuf.Name);
- yield(file_name);
- if (!errno)
- find_next(&fbuf);
- }
- } /* end of each_matching_file_name()->() */
- /*************************************************************************/
- while (((argp = *argvin++) != NULL) && (argcout < MAX_ARGS)) {
- if (strchr(argp, '*') || strchr(argp, '?')) {
- for S <- each_matching_file_name(argp) do {
- *argvout = malloc(strlen(S)+1);
- if (!argvout) goto RETURN; // No more memory.
- strcpy(*argvout, S );
- argvout++;
- argcout++;
- }
- change = 1;
- }
- else { /* regular argument - pass it along */
- *argvout++ = argp;
- argcout++;
- }
- }
- /* All done scanning argument list - see if we did anything */
- if (change) { /* see if we blew out with too many args */
- if (argcout == MAX_ARGS)
- printf( "More than %d command line args (after wild-card %s\n",
- "expansion), remainder ignored", MAX_ARGS );
- replace_argc_argv(argcp,argvp,argcout,work_argv);
- }
- RETURN: ;
- }
- #ifdef TEST
- main (int argc, char ** argv) {
- printf("Before expansion:\n");
- for (int i = 0; i < argc; i++) printf("argv[%d]=%s\n",i,argv[i]);
- expand_wild_cards(&argc,&argv);
- printf("After expansion:\n");
- for ( i = 0; i < argc; i++) printf("argv[%d]=%s\n",i,argv[i]);
- }
- #endif
-