xref: /csrg-svn/old/make/files.c (revision 40168)
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