xref: /csrg-svn/old/make/files.c (revision 6178)
1*6178Ssam static	char *sccsid = "@(#)files.c	4.3 (Berkeley) 82/03/14";
22805Swnj /* UNIX DEPENDENT PROCEDURES */
32805Swnj 
42805Swnj 
52805Swnj /* DEFAULT RULES FOR UNIX */
62805Swnj 
72805Swnj char *builtin[] =
82805Swnj 	{
92805Swnj #ifdef pwb
102805Swnj 	".SUFFIXES : .L .out .o .c .f .e .r .y .yr .ye .l .s .z .x .t .h .cl",
112805Swnj #else
122805Swnj 	".SUFFIXES : .out .o .c .f .e .r .y .yr .ye .l .s .cl .p",
132805Swnj #endif
142805Swnj 	"YACC=yacc",
152805Swnj 	"YACCR=yacc -r",
162805Swnj 	"YACCE=yacc -e",
172805Swnj 	"YFLAGS=",
182805Swnj 	"LEX=lex",
192805Swnj 	"LFLAGS=",
202805Swnj 	"CC=cc",
212805Swnj #ifdef vax
222805Swnj 	"AS=as",
232805Swnj #else
242805Swnj 	"AS=as -",
252805Swnj #endif
262805Swnj 	"PC=pc",
272805Swnj 	"PFLAGS=",
282805Swnj 	"CFLAGS=",
292805Swnj 	"RC=f77",
302805Swnj 	"RFLAGS=",
312811Swnj 	"FC=f77",
322805Swnj 	"EFLAGS=",
332805Swnj 	"FFLAGS=",
342805Swnj 	"LOADLIBES=",
352805Swnj #ifdef pwb
362805Swnj 	"SCOMP=scomp",
372805Swnj 	"SCFLAGS=",
382805Swnj 	"CMDICT=cmdict",
392805Swnj 	"CMFLAGS=",
402805Swnj #endif
412805Swnj 
422805Swnj 	".c.o :",
432805Swnj 	"\t$(CC) $(CFLAGS) -c $<",
442805Swnj 
452805Swnj 	".p.o :",
462805Swnj 	"\t$(PC) $(PFLAGS) -c $<",
472805Swnj 
482805Swnj 	".cl.o :",
492805Swnj 	"\tclass -c $<",
502805Swnj 
512805Swnj 	".e.o .r.o .f.o :",
522805Swnj 	"\t$(FC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<",
532805Swnj 
542805Swnj 	".s.o :",
552805Swnj 	"\t$(AS) -o $@ $<",
562805Swnj 
572805Swnj 	".y.o :",
582805Swnj 	"\t$(YACC) $(YFLAGS) $<",
592805Swnj 	"\t$(CC) $(CFLAGS) -c y.tab.c",
602805Swnj 	"\trm y.tab.c",
612805Swnj 	"\tmv y.tab.o $@",
622805Swnj 
632805Swnj 	".yr.o:",
642805Swnj 	"\t$(YACCR) $(YFLAGS) $<",
652805Swnj 	"\t$(RC) $(RFLAGS) -c y.tab.r",
662805Swnj 	"\trm y.tab.r",
672805Swnj 	"\tmv y.tab.o $@",
682805Swnj 
692805Swnj 	".ye.o :",
702805Swnj 	"\t$(YACCE) $(YFLAGS) $<",
712805Swnj 	"\t$(EC) $(RFLAGS) -c y.tab.e",
722805Swnj 	"\trm y.tab.e",
732805Swnj 	"\tmv y.tab.o $@",
742805Swnj 
752805Swnj 	".l.o :",
762805Swnj 	"\t$(LEX) $(LFLAGS) $<",
772805Swnj 	"\t$(CC) $(CFLAGS) -c lex.yy.c",
782805Swnj 	"\trm lex.yy.c",
792805Swnj 	"\tmv lex.yy.o $@",
802805Swnj 
812805Swnj 	".y.c :",
822805Swnj 	"\t$(YACC) $(YFLAGS) $<",
832805Swnj 	"\tmv y.tab.c $@",
842805Swnj 
852805Swnj 	".l.c :",
862805Swnj 	"\t$(LEX) $(LFLAGS) $<",
872805Swnj 	"\tmv lex.yy.c $@",
882805Swnj 
892805Swnj 	".yr.r:",
902805Swnj 	"\t$(YACCR) $(YFLAGS) $<",
912805Swnj 	"\tmv y.tab.r $@",
922805Swnj 
932805Swnj 	".ye.e :",
942805Swnj 	"\t$(YACCE) $(YFLAGS) $<",
952805Swnj 	"\tmv y.tab.e $@",
962805Swnj 
972805Swnj #ifdef pwb
982805Swnj 	".o.L .c.L .t.L:",
992805Swnj 	"\t$(SCOMP) $(SCFLAGS) $<",
1002805Swnj 
1012805Swnj 	".t.o:",
1022805Swnj 	"\t$(SCOMP) $(SCFLAGS) -c $<",
1032805Swnj 
1042805Swnj 	".t.c:",
1052805Swnj 	"\t$(SCOMP) $(SCFLAGS) -t $<",
1062805Swnj 
1072805Swnj 	".h.z .t.z:",
1082805Swnj 	"\t$(CMDICT) $(CMFLAGS) $<",
1092805Swnj 
1102805Swnj 	".h.x .t.x:",
1112805Swnj 	"\t$(CMDICT) $(CMFLAGS) -c $<",
1122805Swnj #endif
1132805Swnj 
1142805Swnj 	".s.out .c.out .o.out :",
1152805Swnj 	"\t$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@",
1162805Swnj 
1172805Swnj 	".f.out .r.out .e.out :",
1182805Swnj 	"\t$(FC) $(EFLAGS) $(RFLAGS) $(FFLAGS) $< $(LOADLIBES) -o $@",
1192805Swnj 	"\t-rm $*.o",
1202805Swnj 
1212805Swnj 	".y.out :",
1222805Swnj 	"\t$(YACC) $(YFLAGS) $<",
1232805Swnj 	"\t$(CC) $(CFLAGS) y.tab.c $(LOADLIBES) -ly -o $@",
1242805Swnj 	"\trm y.tab.c",
1252805Swnj 
1262805Swnj 	".l.out :",
1272805Swnj 	"\t$(LEX) $(LFLAGS) $<",
1282805Swnj 	"\t$(CC) $(CFLAGS) lex.yy.c $(LOADLIBES) -ll -o $@",
1292805Swnj 	"\trm lex.yy.c",
1302805Swnj 
1312805Swnj 	0 };
1322805Swnj 
1332805Swnj #include "defs"
1342805Swnj #include <sys/types.h>
1352805Swnj 
1362805Swnj 
1372805Swnj TIMETYPE exists(filename)
1382805Swnj char *filename;
1392805Swnj {
1402805Swnj #include <sys/stat.h>
1412805Swnj struct stat buf;
1422805Swnj register char *s;
1432805Swnj TIMETYPE lookarch();
1442805Swnj 
1452805Swnj for(s = filename ; *s!='\0' && *s!='(' ; ++s)
1462805Swnj 	;
1472805Swnj 
1482805Swnj if(*s == '(')
1492805Swnj 	return(lookarch(filename));
1502805Swnj 
151*6178Ssam #if vax
152*6178Ssam if (lstat(filename, &buf) < 0)
153*6178Ssam #else
1542805Swnj if(stat(filename,&buf) < 0)
155*6178Ssam #endif
1562805Swnj 	return(0);
1572805Swnj else	return(buf.st_mtime);
1582805Swnj }
1592805Swnj 
1602805Swnj 
1612805Swnj TIMETYPE prestime()
1622805Swnj {
1632805Swnj TIMETYPE t;
1642805Swnj time(&t);
1652805Swnj return(t);
1662805Swnj }
1672805Swnj 
1682805Swnj 
1692805Swnj 
1702805Swnj #include <sys/dir.h>
1712805Swnj FSTATIC char n15[15];
1722805Swnj FSTATIC char *n15end	= &n15[14];
1732805Swnj 
1742805Swnj 
1752805Swnj 
1762805Swnj struct depblock *srchdir(pat, mkchain, nextdbl)
1772805Swnj register char *pat; /* pattern to be matched in directory */
1782805Swnj int mkchain;  /* nonzero if results to be remembered */
1792805Swnj struct depblock *nextdbl;  /* final value for chain */
1802805Swnj {
1812805Swnj FILE * dirf;
1822805Swnj register int i;
1832805Swnj int nread, cldir;
1842805Swnj char *dirname, *dirpref, *endir, *filepat, *p, temp[100];
1852805Swnj char fullname[100], *p1, *p2;
1862805Swnj struct nameblock *q;
1872805Swnj struct depblock *thisdbl;
1882805Swnj struct opendir *od;
1892805Swnj struct pattern *patp;
1902805Swnj 
1912805Swnj struct direct entry[32];
1922805Swnj 
1932805Swnj 
1942805Swnj thisdbl = 0;
1952805Swnj 
1962805Swnj if(mkchain == NO)
1972805Swnj 	for(patp=firstpat ; patp ; patp = patp->nxtpattern)
1982805Swnj 		if(! unequal(pat, patp->patval)) return(0);
1992805Swnj 
2002805Swnj patp = ALLOC(pattern);
2012805Swnj patp->nxtpattern = firstpat;
2022805Swnj firstpat = patp;
2032805Swnj patp->patval = copys(pat);
2042805Swnj 
2052805Swnj endir = 0;
2062805Swnj 
2072805Swnj for(p=pat; *p!='\0'; ++p)
2082805Swnj 	if(*p=='/') endir = p;
2092805Swnj 
2102805Swnj if(endir==0)
2112805Swnj 	{
2122805Swnj 	dirname = ".";
2132805Swnj 	dirpref = "";
2142805Swnj 	filepat = pat;
2152805Swnj 	}
2162805Swnj else	{
2172805Swnj 	dirname = pat;
2182805Swnj 	*endir = '\0';
2192805Swnj 	dirpref = concat(dirname, "/", temp);
2202805Swnj 	filepat = endir+1;
2212805Swnj 	}
2222805Swnj 
2232805Swnj dirf = NULL;
2242805Swnj cldir = NO;
2252805Swnj 
2262805Swnj for(od = firstod; od; od = od->nxtopendir)
2272805Swnj 	if(! unequal(dirname, od->dirn) )
2282805Swnj 		{
2292805Swnj 		dirf = od->dirfc;
2302805Swnj 		fseek(dirf, 0L, 0); /* start over at the beginning  */
2312805Swnj 		break;
2322805Swnj 		}
2332805Swnj 
2342805Swnj if(dirf == NULL)
2352805Swnj 	{
2362805Swnj 	dirf = fopen(dirname, "r");
2372805Swnj 	if(nopdir >= MAXDIR)
2382805Swnj 		cldir = YES;
2392805Swnj 	else	{
2402805Swnj 		++nopdir;
2412805Swnj 		od = ALLOC(opendir);
2422805Swnj 		od->nxtopendir = firstod;
2432805Swnj 		firstod = od;
2442805Swnj 		od->dirfc = dirf;
2452805Swnj 		od->dirn = copys(dirname);
2462805Swnj 		}
2472805Swnj 	}
2482805Swnj 
2492805Swnj if(dirf == NULL)
2502805Swnj 	{
2512805Swnj 	fprintf(stderr, "Directory %s: ", dirname);
2522805Swnj 	fatal("Cannot open");
2532805Swnj 	}
2542805Swnj 
2552805Swnj else do
2562805Swnj 	{
2572805Swnj 	nread = fread( (char *) &entry[0], sizeof(struct direct), 32, dirf) ;
2582805Swnj 	for(i=0; i<nread; ++i)
2592805Swnj 		if(entry[i].d_ino!= 0)
2602805Swnj 			{
2612805Swnj 			p1 = entry[i].d_name;
2622805Swnj 			p2 = n15;
2632805Swnj 			while( (p2<n15end) &&
2642805Swnj 			  (*p2++ = *p1++)!='\0' );
2652805Swnj 			if( amatch(n15,filepat) )
2662805Swnj 				{
2672805Swnj 				concat(dirpref,n15,fullname);
2682805Swnj 				if( (q=srchname(fullname)) ==0)
2692805Swnj 					q = makename(copys(fullname));
2702805Swnj 				if(mkchain)
2712805Swnj 					{
2722805Swnj 					thisdbl = ALLOC(depblock);
2732805Swnj 					thisdbl->nxtdepblock = nextdbl;
2742805Swnj 					thisdbl->depname = q;
2752805Swnj 					nextdbl = thisdbl;
2762805Swnj 					}
2772805Swnj 				}
2782805Swnj 			}
2792805Swnj 
2802805Swnj 	} while(nread==32);
2812805Swnj 
2822805Swnj if(endir != 0)  *endir = '/';
2832805Swnj 
2842805Swnj if(cldir)
2852805Swnj 	fclose(dirf);
2862805Swnj return(thisdbl);
2872805Swnj }
2882805Swnj 
2892805Swnj /* stolen from glob through find */
2902805Swnj 
2912805Swnj static amatch(s, p)
2922805Swnj char *s, *p;
2932805Swnj {
2942805Swnj 	register int cc, scc, k;
2952805Swnj 	int c, lc;
2962805Swnj 
2972805Swnj 	scc = *s;
2982805Swnj 	lc = 077777;
2992805Swnj 	switch (c = *p) {
3002805Swnj 
3012805Swnj 	case '[':
3022805Swnj 		k = 0;
3032805Swnj 		while (cc = *++p) {
3042805Swnj 			switch (cc) {
3052805Swnj 
3062805Swnj 			case ']':
3072805Swnj 				if (k)
3082805Swnj 					return(amatch(++s, ++p));
3092805Swnj 				else
3102805Swnj 					return(0);
3112805Swnj 
3122805Swnj 			case '-':
3132805Swnj 				k |= (lc <= scc)  & (scc <= (cc=p[1]) ) ;
3142805Swnj 			}
3152805Swnj 			if (scc==(lc=cc)) k++;
3162805Swnj 		}
3172805Swnj 		return(0);
3182805Swnj 
3192805Swnj 	case '?':
3202805Swnj 	caseq:
3212805Swnj 		if(scc) return(amatch(++s, ++p));
3222805Swnj 		return(0);
3232805Swnj 	case '*':
3242805Swnj 		return(umatch(s, ++p));
3252805Swnj 	case 0:
3262805Swnj 		return(!scc);
3272805Swnj 	}
3282805Swnj 	if (c==scc) goto caseq;
3292805Swnj 	return(0);
3302805Swnj }
3312805Swnj 
3322805Swnj static umatch(s, p)
3332805Swnj char *s, *p;
3342805Swnj {
3352805Swnj 	if(*p==0) return(1);
3362805Swnj 	while(*s)
3372805Swnj 		if (amatch(s++,p)) return(1);
3382805Swnj 	return(0);
3392805Swnj }
3402805Swnj 
3412805Swnj #ifdef METERFILE
3422805Swnj #include <pwd.h>
3432805Swnj int meteron	= 0;	/* default: metering off */
3442805Swnj 
3452805Swnj meter(file)
3462805Swnj char *file;
3472805Swnj {
3482805Swnj TIMETYPE tvec;
3492805Swnj char *p, *ctime();
3502805Swnj FILE * mout;
3512805Swnj struct passwd *pwd, *getpwuid();
3522805Swnj 
3532805Swnj if(file==0 || meteron==0) return;
3542805Swnj 
3552805Swnj pwd = getpwuid(getuid());
3562805Swnj 
3572805Swnj time(&tvec);
3582805Swnj 
3592805Swnj if( (mout=fopen(file,"a")) != NULL )
3602805Swnj 	{
3612805Swnj 	p = ctime(&tvec);
3622805Swnj 	p[16] = '\0';
3632805Swnj 	fprintf(mout,"User %s, %s\n",pwd->pw_name,p+4);
3642805Swnj 	fclose(mout);
3652805Swnj 	}
3662805Swnj }
3672805Swnj #endif
3682805Swnj 
3692805Swnj 
3702805Swnj /* look inside archives for notations a(b) and a((b))
3712805Swnj 	a(b)	is file member   b   in archive a
3722805Swnj 	a((b))	is entry point  _b  in object archive a
3732805Swnj */
3742805Swnj 
3752805Swnj #ifdef ASCARCH
3762805Swnj #	include <ar.h>
3772805Swnj #else
3782805Swnj #	include <ar.h>
3792805Swnj #endif
3802805Swnj #include <a.out.h>
3812805Swnj 
3822805Swnj static long arflen;
3832805Swnj static long arfdate;
3842805Swnj static char arfname[16];
3852805Swnj FILE *arfd;
3862805Swnj long int arpos, arlen;
3872805Swnj 
3882805Swnj static struct exec objhead;
3892805Swnj 
3902805Swnj static struct nlist objentry;
3912805Swnj 
3922805Swnj 
3932805Swnj TIMETYPE lookarch(filename)
3942805Swnj char *filename;
3952805Swnj {
3962805Swnj char *p, *q, *send, s[15];
3972805Swnj int i, nc, nsym, objarch;
3982805Swnj 
3992805Swnj for(p = filename; *p!= '(' ; ++p)
4002805Swnj 	;
4012805Swnj *p = '\0';
4022805Swnj openarch(filename);
4032805Swnj *p++ = '(';
4042805Swnj 
4052805Swnj if(*p == '(')
4062805Swnj 	{
4072805Swnj 	objarch = YES;
4082805Swnj 	nc = 8;
4092805Swnj 	++p;
4102805Swnj 	}
4112805Swnj else
4122805Swnj 	{
4132805Swnj 	objarch = NO;
4142805Swnj 	nc = 14;
4152805Swnj 	}
4162805Swnj send = s + nc;
4172805Swnj 
4182805Swnj for( q = s ; q<send && *p!='\0' && *p!=')' ; *q++ = *p++ )
4192805Swnj 	;
4202805Swnj while(q < send)
4212805Swnj 	*q++ = '\0';
4222805Swnj while(getarch())
4232805Swnj 	{
4242805Swnj 	if(objarch)
4252805Swnj 		{
4262805Swnj 		getobj();
4272805Swnj 		nsym = objhead.a_syms / sizeof(objentry);
4282805Swnj 		for(i = 0; i<nsym ; ++i)
4292805Swnj 			{
4302805Swnj 			fread( (char *) &objentry, sizeof(objentry),1,arfd);
4312805Swnj 			if( (objentry.n_type & N_EXT)
4322805Swnj 			   && ((objentry.n_type & ~N_EXT) || objentry.n_value)
4332805Swnj 			   && eqstr(objentry.n_un.n_name,s,nc))
4342805Swnj 				{
4352805Swnj 				clarch();
4362805Swnj 				return(arfdate);
4372805Swnj 				}
4382805Swnj 			}
4392805Swnj 		}
4402805Swnj 
4412805Swnj 	else if( eqstr(arfname, s, nc))
4422805Swnj 		{
4432805Swnj 		clarch();
4442805Swnj 		return(arfdate);
4452805Swnj 		}
4462805Swnj 	}
4472805Swnj 
4482805Swnj clarch();
4492805Swnj return( 0L);
4502805Swnj }
4512805Swnj 
4522805Swnj 
4532805Swnj clarch()
4542805Swnj {
4552805Swnj fclose( arfd );
4562805Swnj }
4572805Swnj 
4582805Swnj 
4592805Swnj openarch(f)
4602805Swnj register char *f;
4612805Swnj {
4622805Swnj #ifdef ASCARCH
4632805Swnj char magic[SARMAG];
4642805Swnj #endif
4652805Swnj int word;
4662805Swnj #include <sys/stat.h>
4672805Swnj struct stat buf;
4682805Swnj 
469*6178Ssam #if vax
470*6178Ssam lstat(f, &buf);
471*6178Ssam #else
4722805Swnj stat(f, &buf);
473*6178Ssam #endif
4742805Swnj arlen = buf.st_size;
4752805Swnj 
4762805Swnj arfd = fopen(f, "r");
4772805Swnj if(arfd == NULL)
4782805Swnj 	fatal1("cannot open %s", f);
4792805Swnj 
4802805Swnj 	fread( (char *) &word, sizeof(word), 1, arfd);
4812805Swnj #ifdef ASCARCH
4822805Swnj 	fseek(arfd, 0L, 0);
4832805Swnj 	fread(magic, SARMAG, 1, arfd);
4842805Swnj 	arpos = SARMAG;
4852805Swnj 	if( ! eqstr(magic, ARMAG, SARMAG) )
4862805Swnj #else
4872805Swnj 	arpos = sizeof(word);
4882805Swnj 	if(word != ARMAG)
4892805Swnj #endif
4902805Swnj 		fatal1("%s is not an archive", f);
4912805Swnj 
4922805Swnj arflen = 0;
4932805Swnj }
4942805Swnj 
4952805Swnj 
4962805Swnj 
4972805Swnj getarch()
4982805Swnj {
4992805Swnj 	struct ar_hdr arhead;
5002805Swnj 	long atol();
5012805Swnj 
5022805Swnj arpos += (arflen + 1) & ~1L;	/* round archived file length up to even */
5032805Swnj if(arpos >= arlen)
5042805Swnj 	return(0);
5052805Swnj fseek(arfd, arpos, 0);
5062805Swnj 
5072805Swnj 	fread( (char *) &arhead, sizeof(arhead), 1, arfd);
5082805Swnj 	arpos += sizeof(arhead);
5092805Swnj #ifdef ASCARCH
5102805Swnj 	arflen = atol(arhead.ar_size);
5112805Swnj 	arfdate = atol(arhead.ar_date);
5122805Swnj #else
5132805Swnj 	arflen = arhead.ar_size;
5142805Swnj 	arfdate = arhead.ar_date;
5152805Swnj #endif
5162805Swnj 	strncpy(arfname, arhead.ar_name, sizeof(arhead.ar_name));
5172805Swnj return(1);
5182805Swnj }
5192805Swnj 
5202805Swnj 
5212805Swnj getobj()
5222805Swnj {
5232805Swnj long int skip;
5242805Swnj 
5252805Swnj fread( (char *) &objhead, sizeof(objhead), 1, arfd);
5262805Swnj if (N_BADMAG(objhead))
5272805Swnj 	fatal1("%s is not an object module", arfname);
5282805Swnj skip = objhead.a_text + objhead.a_data;
5292805Swnj #ifdef vax
5302805Swnj skip += objhead.a_trsize + objhead.a_drsize;
5312805Swnj #else
5322805Swnj if(! objhead.a_flag )
5332805Swnj 	skip *= 2;
5342805Swnj #endif
5352805Swnj fseek(arfd, skip, 1);
5362805Swnj }
5372805Swnj 
5382805Swnj 
5392805Swnj eqstr(a,b,n)
5402805Swnj register char *a, *b;
5412805Swnj int n;
5422805Swnj {
5432805Swnj register int i;
5442805Swnj for(i = 0 ; i < n ; ++i)
5452805Swnj 	if(*a++ != *b++)
5462805Swnj 		return(NO);
5472805Swnj return(YES);
5482805Swnj }
549