1*46778Sbostic static char *sccsid = "@(#)files.c 4.22 (Berkeley) 91/02/28";
246186Sbostic #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
exists(pname)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
prestime()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
211*46778Sbostic static int amatch();
2122805Swnj
srchdir(pat,mkchain,nextdbl)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
amatch(s,p)3432805Swnj static amatch(s, p)
3442805Swnj char *s, *p;
3452805Swnj {
3462805Swnj register int cc, scc, k;
3472805Swnj int c, lc;
348*46778Sbostic static int umatch();
3492805Swnj
3502805Swnj scc = *s;
3512805Swnj lc = 077777;
3522805Swnj switch (c = *p) {
3532805Swnj
3542805Swnj case '[':
3552805Swnj k = 0;
3562805Swnj while (cc = *++p) {
3572805Swnj switch (cc) {
3582805Swnj
3592805Swnj case ']':
3602805Swnj if (k)
3612805Swnj return(amatch(++s, ++p));
3622805Swnj else
3632805Swnj return(0);
3642805Swnj
3652805Swnj case '-':
3662805Swnj k |= (lc <= scc) & (scc <= (cc=p[1]) ) ;
3672805Swnj }
3682805Swnj if (scc==(lc=cc)) k++;
3692805Swnj }
3702805Swnj return(0);
3712805Swnj
3722805Swnj case '?':
3732805Swnj caseq:
3742805Swnj if(scc) return(amatch(++s, ++p));
3752805Swnj return(0);
3762805Swnj case '*':
3772805Swnj return(umatch(s, ++p));
3782805Swnj case 0:
3792805Swnj return(!scc);
3802805Swnj }
3812805Swnj if (c==scc) goto caseq;
3822805Swnj return(0);
3832805Swnj }
3842805Swnj
umatch(s,p)3852805Swnj static umatch(s, p)
3862805Swnj char *s, *p;
3872805Swnj {
3882805Swnj if(*p==0) return(1);
3892805Swnj while(*s)
3902805Swnj if (amatch(s++,p)) return(1);
3912805Swnj return(0);
3922805Swnj }
3932805Swnj
3942805Swnj #ifdef METERFILE
3952805Swnj #include <pwd.h>
3962805Swnj int meteron = 0; /* default: metering off */
3972805Swnj
meter(file)3982805Swnj meter(file)
3992805Swnj char *file;
4002805Swnj {
4012805Swnj TIMETYPE tvec;
4022805Swnj char *p, *ctime();
4032805Swnj FILE * mout;
4042805Swnj struct passwd *pwd, *getpwuid();
4052805Swnj
4062805Swnj if(file==0 || meteron==0) return;
4072805Swnj
4082805Swnj pwd = getpwuid(getuid());
4092805Swnj
4102805Swnj time(&tvec);
4112805Swnj
4122805Swnj if( (mout=fopen(file,"a")) != NULL )
4132805Swnj {
4142805Swnj p = ctime(&tvec);
4152805Swnj p[16] = '\0';
4162805Swnj fprintf(mout,"User %s, %s\n",pwd->pw_name,p+4);
4172805Swnj fclose(mout);
4182805Swnj }
4192805Swnj }
4202805Swnj #endif
4212805Swnj
4222805Swnj
4232805Swnj /* look inside archives for notations a(b) and a((b))
4242805Swnj a(b) is file member b in archive a
4252805Swnj a((b)) is entry point _b in object archive a
4262805Swnj */
4272805Swnj
4282805Swnj #ifdef ASCARCH
4292805Swnj # include <ar.h>
4302805Swnj #else
4312805Swnj # include <ar.h>
4322805Swnj #endif
4332805Swnj #include <a.out.h>
4342805Swnj
4352805Swnj static long arflen;
4362805Swnj static long arfdate;
4372805Swnj static char arfname[16];
4382805Swnj FILE *arfd;
4392805Swnj long int arpos, arlen;
4402805Swnj
4412805Swnj static struct exec objhead;
4422805Swnj
4432805Swnj static struct nlist objentry;
4442805Swnj
4452805Swnj
lookarch(filename)4462805Swnj TIMETYPE lookarch(filename)
4472805Swnj char *filename;
4482805Swnj {
4496578Smckusick char *p, *q, *send, s[MAXNAMLEN + 1];
4502805Swnj int i, nc, nsym, objarch;
4512805Swnj
4522805Swnj for(p = filename; *p!= '(' ; ++p)
4532805Swnj ;
4542805Swnj *p = '\0';
4552805Swnj openarch(filename);
4562805Swnj *p++ = '(';
4572805Swnj
4582805Swnj if(*p == '(')
4592805Swnj {
4602805Swnj objarch = YES;
4612805Swnj nc = 8;
4622805Swnj ++p;
4632805Swnj }
4642805Swnj else
4652805Swnj {
4662805Swnj objarch = NO;
4676578Smckusick nc = MAXNAMLEN;
4682805Swnj }
4692805Swnj send = s + nc;
4702805Swnj
4712805Swnj for( q = s ; q<send && *p!='\0' && *p!=')' ; *q++ = *p++ )
4722805Swnj ;
4732805Swnj while(q < send)
4742805Swnj *q++ = '\0';
4752805Swnj while(getarch())
4762805Swnj {
4772805Swnj if(objarch)
4782805Swnj {
4792805Swnj getobj();
4802805Swnj nsym = objhead.a_syms / sizeof(objentry);
4812805Swnj for(i = 0; i<nsym ; ++i)
4822805Swnj {
4832805Swnj fread( (char *) &objentry, sizeof(objentry),1,arfd);
4842805Swnj if( (objentry.n_type & N_EXT)
4852805Swnj && ((objentry.n_type & ~N_EXT) || objentry.n_value)
4862805Swnj && eqstr(objentry.n_un.n_name,s,nc))
4872805Swnj {
4882805Swnj clarch();
4892805Swnj return(arfdate);
4902805Swnj }
4912805Swnj }
4922805Swnj }
4932805Swnj
4942805Swnj else if( eqstr(arfname, s, nc))
4952805Swnj {
4962805Swnj clarch();
4972805Swnj return(arfdate);
4982805Swnj }
4992805Swnj }
5002805Swnj
5012805Swnj clarch();
5022805Swnj return( 0L);
5032805Swnj }
5042805Swnj
5052805Swnj
clarch()5062805Swnj clarch()
5072805Swnj {
5082805Swnj fclose( arfd );
5092805Swnj }
5102805Swnj
5112805Swnj
openarch(f)5122805Swnj openarch(f)
5132805Swnj register char *f;
5142805Swnj {
5152805Swnj #ifdef ASCARCH
5162805Swnj char magic[SARMAG];
5172805Swnj #endif
5182805Swnj int word;
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
getarch()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
getobj()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
eqstr(a,b,n)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
findfl(name)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
execat(s1,s2,si)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 */
fixname(s,d)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