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