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