jchvr@ihlpg.UUCP (06/04/87)
source of PARSE.C needed for TOUCH.C see previous posting #include "dos.h" #include "stdio.h" /* define directory entry types */ #define FREADONLY 0x1 #define FHIDDEN 0x2 #define FSYSTEM 0x4 #define FLABEL 0x8 #define FDIR 0x10 #define FARCHIVE 0x20 static union REGS rg; /* cpu register for use of DOS calls */ static char ar[256]; struct DTA { char reserved[21]; char attribute; int time; int date; int lowsize; int highsize; char name[13]; char padding; }; static struct DTA dta; /* copy for Disk transfer address */ static haswild(s) char *s; { while ( *s ) { if ( (*s == '*') || (*s == '?') ) { return(1); } s++; } return(0); }/*haswild*/ static dofile(s,f) char *s; int (*f)(); { int i,j; int res; strcpy(ar,s); /* set DTA */ rg.h.ah = 0x1a; /* set DTA */ rg.x.dx = &(dta); intdos(&rg, &rg); /* start search through direc */ rg.h.ah = 0x4e; /* find match file */ rg.x.cx = 0xffff; /* all bits on */ rg.x.dx = &(ar[0]); /* pointer to path name */ intdos(&rg, &rg); /* if nothing found then return original */ if ( (rg.x.ax == 2) || (rg.x.ax == 18) ) { return((*f)(ar)); } /* call func with name */ while ( (rg.x.ax != 2) && ( rg.x.ax != 18 ) ) { /* do not look at labels */ if ( (dta.attribute & FLABEL) != 0) { goto next; } /* do not look at dirs */ if ( (dta.attribute & FDIR) != 0) { goto next; } /* else copy result and print it */ res = (*f)(dta.name); next: /* search for next entry */ rg.h.ah = 0x4f; intdos(&rg, &rg); } }/*dofile*/ static int glargc; static int glindex; static char **glargv; #define MAXARG 32 static insert(s) char s[]; { int i; char *ptr; char *malloc(); if (glargc >= MAXARG) { fprintf(stderr,"Too many arguments\n"); exit(1); } /* make room for string s */ ptr = malloc(strlen(s)+1); if ( ptr == NULL) { fprintf(stderr,"Out of memory\n"); exit(1); } strcpy(ptr,s); /* make room at glindex by moving it all down */ for (i=glargc; i > glindex ; i--) { glargv[i] = glargv[i-1]; } /* insert s and update argc index */ glargv[glindex] = ptr; glindex++; glargc++; }/*insert*/ /* parse file wildcards in argv[index] while adjusting argc and index ** index is returned as index into argv where index+1 used to point */ _parse(argc,argv,index) int *argc; char **argv; int *index; { char *ptr; int i; /* set global stuff */ glargc = *argc; glindex= *index; glargv = argv; ptr = glargv[glindex]; /* save ptr to thing to expand */ if (glindex >= glargc) { *index += 1; return; /* no more to do */ } if (haswild(ptr) == 0) { *index += 1; return; /* nothing to do no wild */ } /* delete item at glindex */ glargc--; for (i=glindex; i<glargc; i++) { glargv[i]=glargv[i+1]; } /* call insert routine */ dofile(ptr,insert); /* copy global stuff */ *argc = glargc; *index= glindex; }/*_parse*/ /* parse all argv[i] starting at i=index */ _parseall(argc,argv,index) int *argc; char **argv; int index; { int i; while ( index < *argc ) { _parse(argc,argv,&index); } }/*_parseall*/