1*46186Sbostic static char *sccsid = "@(#)files.c 4.21 (Berkeley) 91/02/01"; 2*46186Sbostic #include <sys/types.h> 316212Sralph #include <fcntl.h> 416212Sralph 52805Swnj /* UNIX DEPENDENT PROCEDURES */ 62805Swnj 72805Swnj 82805Swnj /* DEFAULT RULES FOR UNIX */ 92805Swnj 102805Swnj char *builtin[] = 112805Swnj { 122805Swnj #ifdef pwb 132805Swnj ".SUFFIXES : .L .out .o .c .f .e .r .y .yr .ye .l .s .z .x .t .h .cl", 142805Swnj #else 1535487Sbostic ".SUFFIXES : .out .o .c .F .f .e .r .y .yr .ye .l .s .cl .p .8 .7 .6 .5 .4 .3 .2 .1 .0", 162805Swnj #endif 172805Swnj "YACC=yacc", 182805Swnj "YACCR=yacc -r", 192805Swnj "YACCE=yacc -e", 202805Swnj "YFLAGS=", 212805Swnj "LEX=lex", 222805Swnj "LFLAGS=", 232805Swnj "CC=cc", 2440168Sbostic "CPP=cpp", 2529848Ssam #if defined(vax) || defined(sun) || defined(tahoe) 262805Swnj "AS=as", 272805Swnj #else 282805Swnj "AS=as -", 292805Swnj #endif 302805Swnj "PC=pc", 312805Swnj "PFLAGS=", 322805Swnj "CFLAGS=", 332805Swnj "RC=f77", 342805Swnj "RFLAGS=", 352811Swnj "FC=f77", 362805Swnj "EFLAGS=", 372805Swnj "FFLAGS=", 382805Swnj "LOADLIBES=", 3935487Sbostic "NROFF=nroff", 402805Swnj #ifdef pwb 412805Swnj "SCOMP=scomp", 422805Swnj "SCFLAGS=", 432805Swnj "CMDICT=cmdict", 442805Swnj "CMFLAGS=", 452805Swnj #endif 462805Swnj 472805Swnj ".c.o :", 482805Swnj "\t$(CC) $(CFLAGS) -c $<", 492805Swnj 502805Swnj ".p.o :", 512805Swnj "\t$(PC) $(PFLAGS) -c $<", 522805Swnj 532805Swnj ".cl.o :", 542805Swnj "\tclass -c $<", 552805Swnj 5612525Snicklin ".e.o .r.o .F.o .f.o :", 572805Swnj "\t$(FC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<", 582805Swnj 592805Swnj ".s.o :", 602805Swnj "\t$(AS) -o $@ $<", 612805Swnj 622805Swnj ".y.o :", 632805Swnj "\t$(YACC) $(YFLAGS) $<", 642805Swnj "\t$(CC) $(CFLAGS) -c y.tab.c", 652805Swnj "\trm y.tab.c", 662805Swnj "\tmv y.tab.o $@", 672805Swnj 682805Swnj ".yr.o:", 692805Swnj "\t$(YACCR) $(YFLAGS) $<", 702805Swnj "\t$(RC) $(RFLAGS) -c y.tab.r", 712805Swnj "\trm y.tab.r", 722805Swnj "\tmv y.tab.o $@", 732805Swnj 742805Swnj ".ye.o :", 752805Swnj "\t$(YACCE) $(YFLAGS) $<", 762805Swnj "\t$(EC) $(RFLAGS) -c y.tab.e", 772805Swnj "\trm y.tab.e", 782805Swnj "\tmv y.tab.o $@", 792805Swnj 802805Swnj ".l.o :", 812805Swnj "\t$(LEX) $(LFLAGS) $<", 822805Swnj "\t$(CC) $(CFLAGS) -c lex.yy.c", 832805Swnj "\trm lex.yy.c", 842805Swnj "\tmv lex.yy.o $@", 852805Swnj 862805Swnj ".y.c :", 872805Swnj "\t$(YACC) $(YFLAGS) $<", 882805Swnj "\tmv y.tab.c $@", 892805Swnj 902805Swnj ".l.c :", 912805Swnj "\t$(LEX) $(LFLAGS) $<", 922805Swnj "\tmv lex.yy.c $@", 932805Swnj 942805Swnj ".yr.r:", 952805Swnj "\t$(YACCR) $(YFLAGS) $<", 962805Swnj "\tmv y.tab.r $@", 972805Swnj 982805Swnj ".ye.e :", 992805Swnj "\t$(YACCE) $(YFLAGS) $<", 1002805Swnj "\tmv y.tab.e $@", 1012805Swnj 1022805Swnj #ifdef pwb 1032805Swnj ".o.L .c.L .t.L:", 1042805Swnj "\t$(SCOMP) $(SCFLAGS) $<", 1052805Swnj 1062805Swnj ".t.o:", 1072805Swnj "\t$(SCOMP) $(SCFLAGS) -c $<", 1082805Swnj 1092805Swnj ".t.c:", 1102805Swnj "\t$(SCOMP) $(SCFLAGS) -t $<", 1112805Swnj 1122805Swnj ".h.z .t.z:", 1132805Swnj "\t$(CMDICT) $(CMFLAGS) $<", 1142805Swnj 1152805Swnj ".h.x .t.x:", 1162805Swnj "\t$(CMDICT) $(CMFLAGS) -c $<", 1172805Swnj #endif 1182805Swnj 1192805Swnj ".s.out .c.out .o.out :", 1202805Swnj "\t$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@", 1212805Swnj 12212525Snicklin ".f.out .F.out .r.out .e.out :", 1232805Swnj "\t$(FC) $(EFLAGS) $(RFLAGS) $(FFLAGS) $< $(LOADLIBES) -o $@", 1242805Swnj "\t-rm $*.o", 1252805Swnj 1262805Swnj ".y.out :", 1272805Swnj "\t$(YACC) $(YFLAGS) $<", 1282805Swnj "\t$(CC) $(CFLAGS) y.tab.c $(LOADLIBES) -ly -o $@", 1292805Swnj "\trm y.tab.c", 1302805Swnj 1312805Swnj ".l.out :", 1322805Swnj "\t$(LEX) $(LFLAGS) $<", 1332805Swnj "\t$(CC) $(CFLAGS) lex.yy.c $(LOADLIBES) -ll -o $@", 1342805Swnj "\trm lex.yy.c", 1352805Swnj 13635487Sbostic ".8.0 :", 13735487Sbostic "\t$(NROFF) -man -h $< > $@", 13835487Sbostic 13935487Sbostic ".7.0 :", 14035487Sbostic "\t$(NROFF) -man -h $< > $@", 14135487Sbostic 14235487Sbostic ".6.0 :", 14335487Sbostic "\t$(NROFF) -man -h $< > $@", 14435487Sbostic 14535487Sbostic ".5.0 :", 14635487Sbostic "\t$(NROFF) -man -h $< > $@", 14735487Sbostic 14835487Sbostic ".4.0 :", 14935487Sbostic "\t$(NROFF) -man -h $< > $@", 15035487Sbostic 15135487Sbostic ".3.0 :", 15235487Sbostic "\t$(NROFF) -man -h $< > $@", 15335487Sbostic 15435487Sbostic ".2.0 :", 15535487Sbostic "\t$(NROFF) -man -h $< > $@", 15635487Sbostic 15735487Sbostic ".1.0 :", 15835487Sbostic "\t$(NROFF) -man -h $< > $@", 15935487Sbostic 1602805Swnj 0 }; 1612805Swnj 1622805Swnj #include "defs" 16318644Smckusick #include <sys/stat.h> 1642805Swnj 1652805Swnj 16618644Smckusick 16718644Smckusick TIMETYPE 16818644Smckusick exists(pname) 16918644Smckusick struct nameblock *pname; 1702805Swnj { 1712805Swnj struct stat buf; 17218644Smckusick register char *s, *filename; 1732805Swnj TIMETYPE lookarch(); 17418644Smckusick extern char *findfl(); 1752805Swnj 17618644Smckusick filename = pname->namep; 17718644Smckusick 1782805Swnj for(s = filename ; *s!='\0' && *s!='(' ; ++s) 1792805Swnj ; 1802805Swnj 1812805Swnj if(*s == '(') 1822805Swnj return(lookarch(filename)); 1832805Swnj 1847208Sroot if (stat(filename, &buf) < 0) 18518644Smckusick { 18618644Smckusick s = findfl(filename); 18718644Smckusick if(s != (char *)-1) 18818644Smckusick { 18918644Smckusick pname->alias = copys(s); 19018644Smckusick if(stat(pname->alias, &buf) == 0) 19118644Smckusick return(buf.st_mtime); 19218644Smckusick } 1932805Swnj return(0); 19418644Smckusick } 1952805Swnj else return(buf.st_mtime); 1962805Swnj } 1972805Swnj 1982805Swnj 1992805Swnj TIMETYPE prestime() 2002805Swnj { 2012805Swnj TIMETYPE t; 2022805Swnj time(&t); 2032805Swnj return(t); 2042805Swnj } 2052805Swnj 2062805Swnj 2072805Swnj 2086578Smckusick FSTATIC char nbuf[MAXNAMLEN + 1]; 2096578Smckusick FSTATIC char *nbufend = &nbuf[MAXNAMLEN]; 2102805Swnj 2112805Swnj 2122805Swnj 2132805Swnj struct depblock *srchdir(pat, mkchain, nextdbl) 2142805Swnj register char *pat; /* pattern to be matched in directory */ 2152805Swnj int mkchain; /* nonzero if results to be remembered */ 2162805Swnj struct depblock *nextdbl; /* final value for chain */ 2172805Swnj { 2186578Smckusick DIR *dirf; 2192805Swnj register int i; 2202805Swnj int nread, cldir; 22124492Sbloom char *dirname, *dirpref, *endir, *filepat, *p, temp[BUFSIZ]; 22224492Sbloom char fullname[BUFSIZ], *p1, *p2; 2232805Swnj struct nameblock *q; 2242805Swnj struct depblock *thisdbl; 2256578Smckusick struct dirhdr *od; 2262805Swnj struct pattern *patp; 22718644Smckusick struct varblock *cp, *varptr(); 22824492Sbloom char *path, pth[BUFSIZ], *strcpy(); 22939958Sbostic struct dirent *dptr; 2302805Swnj 2312805Swnj 2322805Swnj thisdbl = 0; 2332805Swnj 2342805Swnj if(mkchain == NO) 2352805Swnj for(patp=firstpat ; patp ; patp = patp->nxtpattern) 2362805Swnj if(! unequal(pat, patp->patval)) return(0); 2372805Swnj 2382805Swnj patp = ALLOC(pattern); 2392805Swnj patp->nxtpattern = firstpat; 2402805Swnj firstpat = patp; 2412805Swnj patp->patval = copys(pat); 2422805Swnj 2432805Swnj endir = 0; 2442805Swnj 2452805Swnj for(p=pat; *p!='\0'; ++p) 2462805Swnj if(*p=='/') endir = p; 2472805Swnj 2482805Swnj if(endir==0) 2492805Swnj { 2502805Swnj dirpref = ""; 2512805Swnj filepat = pat; 25218644Smckusick cp = varptr("VPATH"); 25331029Sbostic if (cp->varval == NULL) path = "."; 25418644Smckusick else { 25518644Smckusick path = pth; 25618644Smckusick *path = '\0'; 25725773Sdonn if (strncmp(cp->varval, ".:", 2) != 0) strcpy(pth,".:"); 25818644Smckusick strcat(pth, cp->varval); 25918644Smckusick } 2602805Swnj } 2612805Swnj else { 2622805Swnj *endir = '\0'; 26318644Smckusick path = strcpy(pth, pat); 26418644Smckusick dirpref = concat(pat, "/", temp); 2652805Swnj filepat = endir+1; 2662805Swnj } 2672805Swnj 26818644Smckusick while (*path) { /* Loop thru each VPATH directory */ 26918644Smckusick dirname = path; 27018644Smckusick for (; *path; path++) 27118644Smckusick if (*path == ':') { 27218644Smckusick *path++ = '\0'; 27318644Smckusick break; 27418644Smckusick } 27518644Smckusick 2762805Swnj dirf = NULL; 2772805Swnj cldir = NO; 2782805Swnj 2792805Swnj for(od = firstod; od; od = od->nxtopendir) 2802805Swnj if(! unequal(dirname, od->dirn) ) 2812805Swnj { 2822805Swnj dirf = od->dirfc; 2836578Smckusick if (dirf != NULL) 2846578Smckusick rewinddir(dirf); /* start over at the beginning */ 2852805Swnj break; 2862805Swnj } 2872805Swnj 2882805Swnj if(dirf == NULL) 2892805Swnj { 2906578Smckusick dirf = opendir(dirname); 2912805Swnj if(nopdir >= MAXDIR) 2922805Swnj cldir = YES; 2932805Swnj else { 2942805Swnj ++nopdir; 2956578Smckusick od = ALLOC(dirhdr); 2962805Swnj od->nxtopendir = firstod; 2972805Swnj firstod = od; 2982805Swnj od->dirfc = dirf; 2992805Swnj od->dirn = copys(dirname); 30032620Sbostic fcntl(dirfd(dirf), F_SETFD, 1); 3012805Swnj } 3022805Swnj } 3032805Swnj 3042805Swnj if(dirf == NULL) 3052805Swnj { 3062805Swnj fprintf(stderr, "Directory %s: ", dirname); 3072805Swnj fatal("Cannot open"); 3082805Swnj } 3092805Swnj 3106578Smckusick else for (dptr = readdir(dirf); dptr != NULL; dptr = readdir(dirf)) 3112805Swnj { 3126578Smckusick p1 = dptr->d_name; 3136578Smckusick p2 = nbuf; 3146578Smckusick while( (p2<nbufend) && (*p2++ = *p1++)!='\0' ) 3156578Smckusick /* void */; 3166578Smckusick if( amatch(nbuf,filepat) ) 3176578Smckusick { 3186578Smckusick concat(dirpref,nbuf,fullname); 3196578Smckusick if( (q=srchname(fullname)) ==0) 3206578Smckusick q = makename(copys(fullname)); 3216578Smckusick if(mkchain) 3222805Swnj { 3236578Smckusick thisdbl = ALLOC(depblock); 3246578Smckusick thisdbl->nxtdepblock = nextdbl; 3256578Smckusick thisdbl->depname = q; 3266578Smckusick nextdbl = thisdbl; 3272805Swnj } 3286578Smckusick } 3296578Smckusick } 3302805Swnj 3312805Swnj if(endir != 0) *endir = '/'; 3322805Swnj 3336578Smckusick if(cldir) { 3346578Smckusick closedir(dirf); 3356578Smckusick dirf = NULL; 3366578Smckusick } 33718644Smckusick } /* End of VPATH loop */ 3382805Swnj return(thisdbl); 3392805Swnj } 3402805Swnj 3412805Swnj /* stolen from glob through find */ 3422805Swnj 3432805Swnj static amatch(s, p) 3442805Swnj char *s, *p; 3452805Swnj { 3462805Swnj register int cc, scc, k; 3472805Swnj int c, lc; 3482805Swnj 3492805Swnj scc = *s; 3502805Swnj lc = 077777; 3512805Swnj switch (c = *p) { 3522805Swnj 3532805Swnj case '[': 3542805Swnj k = 0; 3552805Swnj while (cc = *++p) { 3562805Swnj switch (cc) { 3572805Swnj 3582805Swnj case ']': 3592805Swnj if (k) 3602805Swnj return(amatch(++s, ++p)); 3612805Swnj else 3622805Swnj return(0); 3632805Swnj 3642805Swnj case '-': 3652805Swnj k |= (lc <= scc) & (scc <= (cc=p[1]) ) ; 3662805Swnj } 3672805Swnj if (scc==(lc=cc)) k++; 3682805Swnj } 3692805Swnj return(0); 3702805Swnj 3712805Swnj case '?': 3722805Swnj caseq: 3732805Swnj if(scc) return(amatch(++s, ++p)); 3742805Swnj return(0); 3752805Swnj case '*': 3762805Swnj return(umatch(s, ++p)); 3772805Swnj case 0: 3782805Swnj return(!scc); 3792805Swnj } 3802805Swnj if (c==scc) goto caseq; 3812805Swnj return(0); 3822805Swnj } 3832805Swnj 3842805Swnj static umatch(s, p) 3852805Swnj char *s, *p; 3862805Swnj { 3872805Swnj if(*p==0) return(1); 3882805Swnj while(*s) 3892805Swnj if (amatch(s++,p)) return(1); 3902805Swnj return(0); 3912805Swnj } 3922805Swnj 3932805Swnj #ifdef METERFILE 3942805Swnj #include <pwd.h> 3952805Swnj int meteron = 0; /* default: metering off */ 3962805Swnj 3972805Swnj meter(file) 3982805Swnj char *file; 3992805Swnj { 4002805Swnj TIMETYPE tvec; 4012805Swnj char *p, *ctime(); 4022805Swnj FILE * mout; 4032805Swnj struct passwd *pwd, *getpwuid(); 4042805Swnj 4052805Swnj if(file==0 || meteron==0) return; 4062805Swnj 4072805Swnj pwd = getpwuid(getuid()); 4082805Swnj 4092805Swnj time(&tvec); 4102805Swnj 4112805Swnj if( (mout=fopen(file,"a")) != NULL ) 4122805Swnj { 4132805Swnj p = ctime(&tvec); 4142805Swnj p[16] = '\0'; 4152805Swnj fprintf(mout,"User %s, %s\n",pwd->pw_name,p+4); 4162805Swnj fclose(mout); 4172805Swnj } 4182805Swnj } 4192805Swnj #endif 4202805Swnj 4212805Swnj 4222805Swnj /* look inside archives for notations a(b) and a((b)) 4232805Swnj a(b) is file member b in archive a 4242805Swnj a((b)) is entry point _b in object archive a 4252805Swnj */ 4262805Swnj 4272805Swnj #ifdef ASCARCH 4282805Swnj # include <ar.h> 4292805Swnj #else 4302805Swnj # include <ar.h> 4312805Swnj #endif 4322805Swnj #include <a.out.h> 4332805Swnj 4342805Swnj static long arflen; 4352805Swnj static long arfdate; 4362805Swnj static char arfname[16]; 4372805Swnj FILE *arfd; 4382805Swnj long int arpos, arlen; 4392805Swnj 4402805Swnj static struct exec objhead; 4412805Swnj 4422805Swnj static struct nlist objentry; 4432805Swnj 4442805Swnj 4452805Swnj TIMETYPE lookarch(filename) 4462805Swnj char *filename; 4472805Swnj { 4486578Smckusick char *p, *q, *send, s[MAXNAMLEN + 1]; 4492805Swnj int i, nc, nsym, objarch; 4502805Swnj 4512805Swnj for(p = filename; *p!= '(' ; ++p) 4522805Swnj ; 4532805Swnj *p = '\0'; 4542805Swnj openarch(filename); 4552805Swnj *p++ = '('; 4562805Swnj 4572805Swnj if(*p == '(') 4582805Swnj { 4592805Swnj objarch = YES; 4602805Swnj nc = 8; 4612805Swnj ++p; 4622805Swnj } 4632805Swnj else 4642805Swnj { 4652805Swnj objarch = NO; 4666578Smckusick nc = MAXNAMLEN; 4672805Swnj } 4682805Swnj send = s + nc; 4692805Swnj 4702805Swnj for( q = s ; q<send && *p!='\0' && *p!=')' ; *q++ = *p++ ) 4712805Swnj ; 4722805Swnj while(q < send) 4732805Swnj *q++ = '\0'; 4742805Swnj while(getarch()) 4752805Swnj { 4762805Swnj if(objarch) 4772805Swnj { 4782805Swnj getobj(); 4792805Swnj nsym = objhead.a_syms / sizeof(objentry); 4802805Swnj for(i = 0; i<nsym ; ++i) 4812805Swnj { 4822805Swnj fread( (char *) &objentry, sizeof(objentry),1,arfd); 4832805Swnj if( (objentry.n_type & N_EXT) 4842805Swnj && ((objentry.n_type & ~N_EXT) || objentry.n_value) 4852805Swnj && eqstr(objentry.n_un.n_name,s,nc)) 4862805Swnj { 4872805Swnj clarch(); 4882805Swnj return(arfdate); 4892805Swnj } 4902805Swnj } 4912805Swnj } 4922805Swnj 4932805Swnj else if( eqstr(arfname, s, nc)) 4942805Swnj { 4952805Swnj clarch(); 4962805Swnj return(arfdate); 4972805Swnj } 4982805Swnj } 4992805Swnj 5002805Swnj clarch(); 5012805Swnj return( 0L); 5022805Swnj } 5032805Swnj 5042805Swnj 5052805Swnj clarch() 5062805Swnj { 5072805Swnj fclose( arfd ); 5082805Swnj } 5092805Swnj 5102805Swnj 5112805Swnj openarch(f) 5122805Swnj register char *f; 5132805Swnj { 5142805Swnj #ifdef ASCARCH 5152805Swnj char magic[SARMAG]; 5162805Swnj #endif 5172805Swnj int word; 5182805Swnj #include <sys/stat.h> 5192805Swnj struct stat buf; 5202805Swnj 5212805Swnj stat(f, &buf); 5222805Swnj arlen = buf.st_size; 5232805Swnj 5242805Swnj arfd = fopen(f, "r"); 5252805Swnj if(arfd == NULL) 5262805Swnj fatal1("cannot open %s", f); 5272805Swnj 5282805Swnj fread( (char *) &word, sizeof(word), 1, arfd); 5292805Swnj #ifdef ASCARCH 5302805Swnj fseek(arfd, 0L, 0); 5312805Swnj fread(magic, SARMAG, 1, arfd); 5322805Swnj arpos = SARMAG; 5332805Swnj if( ! eqstr(magic, ARMAG, SARMAG) ) 5342805Swnj #else 5352805Swnj arpos = sizeof(word); 5362805Swnj if(word != ARMAG) 5372805Swnj #endif 5382805Swnj fatal1("%s is not an archive", f); 5392805Swnj 5402805Swnj arflen = 0; 5412805Swnj } 5422805Swnj 5432805Swnj 5442805Swnj 5452805Swnj getarch() 5462805Swnj { 5472805Swnj struct ar_hdr arhead; 5482805Swnj long atol(); 5492805Swnj 5502805Swnj arpos += (arflen + 1) & ~1L; /* round archived file length up to even */ 5512805Swnj if(arpos >= arlen) 5522805Swnj return(0); 5532805Swnj fseek(arfd, arpos, 0); 5542805Swnj 5552805Swnj fread( (char *) &arhead, sizeof(arhead), 1, arfd); 5562805Swnj arpos += sizeof(arhead); 5572805Swnj #ifdef ASCARCH 5582805Swnj arflen = atol(arhead.ar_size); 5592805Swnj arfdate = atol(arhead.ar_date); 5602805Swnj #else 5612805Swnj arflen = arhead.ar_size; 5622805Swnj arfdate = arhead.ar_date; 5632805Swnj #endif 5642805Swnj strncpy(arfname, arhead.ar_name, sizeof(arhead.ar_name)); 5652805Swnj return(1); 5662805Swnj } 5672805Swnj 5682805Swnj 5692805Swnj getobj() 5702805Swnj { 5712805Swnj long int skip; 5722805Swnj 5732805Swnj fread( (char *) &objhead, sizeof(objhead), 1, arfd); 5742805Swnj if (N_BADMAG(objhead)) 5752805Swnj fatal1("%s is not an object module", arfname); 5762805Swnj skip = objhead.a_text + objhead.a_data; 57729659Sbloom #ifndef pdp11 5782805Swnj skip += objhead.a_trsize + objhead.a_drsize; 5792805Swnj #else 5802805Swnj if(! objhead.a_flag ) 5812805Swnj skip *= 2; 5822805Swnj #endif 5832805Swnj fseek(arfd, skip, 1); 5842805Swnj } 5852805Swnj 5862805Swnj 5872805Swnj eqstr(a,b,n) 5882805Swnj register char *a, *b; 5892805Swnj int n; 5902805Swnj { 5912805Swnj register int i; 5922805Swnj for(i = 0 ; i < n ; ++i) 5932805Swnj if(*a++ != *b++) 5942805Swnj return(NO); 5952805Swnj return(YES); 5962805Swnj } 59718644Smckusick 59818644Smckusick 59918644Smckusick /* 60018644Smckusick * findfl(name) (like execvp, but does path search and finds files) 60118644Smckusick */ 60218644Smckusick static char fname[128]; 60318644Smckusick 60418644Smckusick char *execat(); 60518644Smckusick 60618644Smckusick char *findfl(name) 60718644Smckusick register char *name; 60818644Smckusick { 60918644Smckusick register char *p; 61018644Smckusick register struct varblock *cp; 61118644Smckusick struct stat buf; 61233074Sbostic struct varblock *varptr(); 61318644Smckusick 61418644Smckusick for (p = name; *p; p++) 61518644Smckusick if(*p == '/') return(name); 61618644Smckusick 61718644Smckusick cp = varptr("VPATH"); 61818644Smckusick if(cp->varval == NULL || *cp->varval == 0) 61918644Smckusick p = ":"; 62018644Smckusick else 62118644Smckusick p = cp->varval; 62218644Smckusick 62318644Smckusick do 62418644Smckusick { 62518644Smckusick p = execat(p, name, fname); 62618644Smckusick if(stat(fname,&buf) >= 0) 62718644Smckusick return(fname); 62818644Smckusick } while (p); 62918644Smckusick return((char *)-1); 63018644Smckusick } 63118644Smckusick 63218644Smckusick char *execat(s1, s2, si) 63318644Smckusick register char *s1, *s2; 63418644Smckusick char *si; 63518644Smckusick { 63618644Smckusick register char *s; 63718644Smckusick 63818644Smckusick s = si; 63918644Smckusick while (*s1 && *s1 != ':' && *s1 != '-') 64018644Smckusick *s++ = *s1++; 64118644Smckusick if (si != s) 64218644Smckusick *s++ = '/'; 64318644Smckusick while (*s2) 64418644Smckusick *s++ = *s2++; 64518644Smckusick *s = '\0'; 64618644Smckusick return(*s1? ++s1: 0); 64718644Smckusick } 64818644Smckusick 64918644Smckusick 65018644Smckusick /* copy s to d, changing file names to file aliases */ 65118644Smckusick fixname(s, d) 65218644Smckusick char *s, *d; 65318644Smckusick { 65418644Smckusick register char *r, *q; 65518644Smckusick struct nameblock *pn; 65624492Sbloom char name[BUFSIZ]; 65718644Smckusick 65818644Smckusick while (*s) { 65918644Smckusick if (isspace(*s)) *d++ = *s++; 66018644Smckusick else { 66118644Smckusick r = name; 66218644Smckusick while (*s) { 66318644Smckusick if (isspace(*s)) break; 66418644Smckusick *r++ = *s++; 66518644Smckusick } 66618644Smckusick *r = '\0'; 66718644Smckusick 66818644Smckusick if (((pn = srchname(name)) != 0) && (pn->alias)) 66918644Smckusick q = pn->alias; 67018644Smckusick else q = name; 67118644Smckusick 67218644Smckusick while (*q) *d++ = *q++; 67318644Smckusick } 67418644Smckusick } 67518644Smckusick *d = '\0'; 67618644Smckusick } 677