xref: /csrg-svn/old/make/gcos.c (revision 32760)
1*32760Sbostic static	char *sccsid = "@(#)gcos.c	4.4 (Berkeley) 87/12/04";
22806Swnj /* GCOS DEPENDENT PROCEDURES */
32806Swnj 
42806Swnj 
52806Swnj /* DEFAULT RULES FOR GCOS */
62806Swnj 
72806Swnj char *builtin[]
82806Swnj 	{
92806Swnj 	".SUFFIXES : .d .c .y .lib",
102806Swnj 	".d.c:",
112806Swnj 	"\t./dtgen $<",
122806Swnj 	".y.c:",
132806Swnj 	"\t./yacc $<",
142806Swnj 	"\tcopy y.tab.c; /$@",
152806Swnj 	".y.lib:",
162806Swnj 	"\t./yacc $<",
172806Swnj 	"\t./cc y.tab.c r=$@",
182806Swnj 	".c.lib:",
192806Swnj 	"\t./cc $< r=$@",
202806Swnj 	0 };
212806Swnj 
222806Swnj # define MAXCSIZE 500
232806Swnj # define YZERO 60
242806Swnj 
252806Swnj int gtcalled 0;
262806Swnj 
272806Swnj /* all kinds of static declarations that must be used.. */
282806Swnj 
292806Swnj static double day { 64*1000*60*60*24 };  /* length of day in clock ticks */
302806Swnj 
312806Swnj struct { int lhs:18, rhs:18; };
322806Swnj struct catb {
332806Swnj 	int words[6],
342806Swnj 	name1, name2,
352806Swnj 	passw1, passw2,
362806Swnj 	word10, word11,
372806Swnj 	datcreat, datmod,  datused,
382806Swnj 	stuff[6],
392806Swnj 	jjjj:18, tused:18;
402806Swnj 	};
412806Swnj struct { int :3, slot:18; };  /* slot where time from cat. block fits */
422806Swnj 
432806Swnj struct catdesc {
442806Swnj 	int cat1, cat2, cpass1, cpass2,
452806Swnj 	    file1, file2, filep1, filep2,
462806Swnj 	    endmark; };
472806Swnj 
482806Swnj extern int _q_reg, _a_reg;
492806Swnj 
502806Swnj 
512806Swnj # define A10(x,y) 10*x + y
522806Swnj 
532806Swnj /*	interpret the mm/dd/yy format */
542806Swnj 
552806Swnj struct d9 { int	:5, m1:4, :5, m2:4, :9,
562806Swnj 		:5, d1:4, :5, d2:4, :9,
572806Swnj 		:5, y1:4, :5, y2:4  ;};
582806Swnj 
592806Swnj struct d6 { int	:2, m61:4, :2, m62:4,
602806Swnj 		:2, d61:4, :2, d62:4,
612806Swnj 		:2, y61:4, :2, y62:4; };
622806Swnj 
day6(d6word)632806Swnj static day6( d6word ){ /* return the day number of a word in bci format */
642806Swnj 	int m, y, d;
652806Swnj 
662806Swnj 	y = A10( d6word.y61, d6word.y62 );
672806Swnj 	m = A10( d6word.m61, d6word.m62 );
682806Swnj 	d = A10( d6word.d61, d6word.d62 );
692806Swnj 
702806Swnj 	return( d + 31*( m + 12*(y-YZERO) ) );
712806Swnj 	}
722806Swnj 
day9(p)732806Swnj static day9( p ) register int *p; {
742806Swnj 
752806Swnj 	int m, y, d;
762806Swnj 
772806Swnj 	y = A10( p->y1, p->y2 );
782806Swnj 	m = A10( p->m1, p->m2 );
792806Swnj 	d = A10( p->d1, p->d2 );
802806Swnj 
812806Swnj 	return( d + 31*( m + 12*(y-YZERO) ) );
822806Swnj 	}
832806Swnj 
842806Swnj 
dfold(dayno,timeno)852806Swnj static int dfold( dayno, timeno ){
862806Swnj 	int kk;
872806Swnj 	kk = ( day*dayno + timeno) / 32768.;
882806Swnj 	}
892806Swnj 
prestime()902806Swnj int prestime(){
912806Swnj 	int date[2];
922806Swnj 	drldrl( 021, date );
932806Swnj 	return( dfold( day9(date), _q_reg ) );
942806Swnj 	}
952806Swnj 
962806Swnj 
972806Swnj 
982806Swnj # define DODRL ar[0] = status; ar[1] = &b.cat1; drldrl(30,sp1,sp2); p=ar[0]<<18;
992806Swnj 
1002806Swnj static struct { int fn1, fn2;  int ftm; } fbb[MAXCSIZE];
1012806Swnj static int catsiz;
1022806Swnj 
getcat()1032806Swnj getcat() {
1042806Swnj 
1052806Swnj 	register i, *p, j;
1062806Swnj 	int asname[4];
1072806Swnj 	struct catdesc b;
1082806Swnj 	int sp1, sp2, temp;
1092806Swnj 	int ar[2], status[2];
1102806Swnj 	int filbuf[380];
1112806Swnj 
1122806Swnj 	gtcalled = 1;
1132806Swnj 
1142806Swnj 	sp1 = ar;
115*32760Sbostic 	sp1 >>= 18;
1162806Swnj 	sp2 = filbuf;
117*32760Sbostic 	sp2 >>= 18;
1182806Swnj 	sp2.lhs = 19;
1192806Swnj 
1202806Swnj 	b.cat1 = b.cat2 = b.file1 = -1;
1212806Swnj 	b.cpass1 = b.cpass2 = 0202020202020;
1222806Swnj 
1232806Swnj 	DODRL
1242806Swnj 	sp2.lhs++;
1252806Swnj 	for( i=0; p!=0 && i<MAXCSIZE; ++i ){
1262806Swnj 
1272806Swnj 		fbb[i].fn1 = b.file1 = p->name1;
1282806Swnj 		fbb[i].fn2 = b.file2 = p->name2;
1292806Swnj 		b.filep1 = p->passw1;
1302806Swnj 		b.filep2 = p->passw2;
1312806Swnj 		b.endmark = -1;
1322806Swnj 		temp = 0;
1332806Swnj 		temp.slot = p->tused;
1342806Swnj 		fbb[i].ftm = dfold( day6(p->datmod), temp );
1352806Swnj 		DODRL
1362806Swnj 		}
1372806Swnj 	catsiz = i;
1382806Swnj 	}
1392806Swnj 
14018644Smckusick  exists( p )
14118644Smckusick  struct nameblock *p; {
14218644Smckusick 	char *s, *cp, name[13];
1432806Swnj 	int i, *p, bcd[2];
1442806Swnj 
1452806Swnj /*
1462806Swnj    cheat about names with slashes -- try opening;
1472806Swnj    if it is openable, it exists, and assume it was made
1482806Swnj    at t=1 (long time ago); otherwise, assume it
1492806Swnj    does not exist
1502806Swnj */
1512806Swnj 
15218644Smckusick cp = p->namep;
15318644Smckusick 
1542806Swnj for(s=cp ; *s ; ++s)
1552806Swnj 	if(*s == '/')
1562806Swnj 		if(i = copen(cp,'r') < 0)
1572806Swnj 			return(0);
1582806Swnj 		else	{
1592806Swnj 			cclose(i);
1602806Swnj 			return(1);
1612806Swnj 			}
1622806Swnj 
1632806Swnj if(gtcalled == 0)  getcat();
1642806Swnj 
1652806Swnj 	p = name;
1662806Swnj 	for( i=0; *cp; ++i ) name[i] = *cp++;
1672806Swnj 	while( i<12 ) name[i++] = ' ';
1682806Swnj 	f9to6( *p, bcd[0], 12 );
1692806Swnj 	for ( i=0; i<catsiz; ++i ){
1702806Swnj 		if( fbb[i].fn1 == bcd[0] && fbb[i].fn2 == bcd[1] )
1712806Swnj 			return( fbb[i].ftm );
1722806Swnj 		}
1732806Swnj 	return( 0 );
1742806Swnj 	}
1752806Swnj 
1762806Swnj 
1772806Swnj #include "defs"
1782806Swnj 
1792806Swnj static char n13[13];
1802806Swnj static char *n13end &n13[12];
1812806Swnj 
1822806Swnj 
1832806Swnj 
srchdir(pat,mkchain,nextdbl)1842806Swnj struct depblock *srchdir(pat, mkchain, nextdbl)
1852806Swnj 
1862806Swnj char *pat; /* pattern to be matched in directory */
1872806Swnj int mkchain;  /* nonzero if results to be remembered */
1882806Swnj struct depblock *nextdbl;  /* final value for chain */
1892806Swnj {
1902806Swnj int dirf;
1912806Swnj int i, nread;
19224493Sbloom char *dirname, *dirpref, *endir, *filepat, *p, temp[BUFSIZ];
19324493Sbloom char fullname[BUFSIZ], *p1, *p2, *copys();
1942806Swnj struct nameblock *q;
1952806Swnj struct depblock *thisdbl;
1962806Swnj struct pattern *patp;
1972806Swnj int *intp1, *intp2;
1982806Swnj 
1992806Swnj if(gtcalled == 0)  getcat();
2002806Swnj thisdbl=0;
2012806Swnj 
2022806Swnj if(mkchain == 0)
2032806Swnj 	for(patp=firstpat ; patp!=0 ; patp = patp->nxtpattern)
2042806Swnj 		if(! unequal(pat, patp->patval)) return(0);
2052806Swnj 
2062806Swnj patp = ALLOC(pattern);
2072806Swnj patp->nxtpattern = firstpat;
2082806Swnj firstpat = patp;
2092806Swnj patp->patval = copys(pat);
2102806Swnj 
2112806Swnj endir = 0;
2122806Swnj 
2132806Swnj for(p=pat; *p!='\0'; ++p)
2142806Swnj 	if(*p=='/') endir = p;
2152806Swnj 
2162806Swnj if(endir==0)
2172806Swnj 	{
2182806Swnj 	dirname = "";
2192806Swnj 	dirpref = "";
2202806Swnj 	filepat = pat;
2212806Swnj 	}
2222806Swnj else	{
2232806Swnj fatal("File name has an embedded slash");
2242806Swnj 	dirname = pat;
2252806Swnj 	*endir = '\0';
2262806Swnj 	dirpref = concat(dirname, "/", temp);
2272806Swnj 	filepat = endir+1;
2282806Swnj 	}
2292806Swnj 
2302806Swnj for(i=0;i<catsiz;++i)
2312806Swnj 	{
2322806Swnj 	intp1 = &fbb[i].fn1;
2332806Swnj 	intp2 = n13;
2342806Swnj 	f6to9(*intp1, *intp2, 12);
2352806Swnj 	for(p1=n13; p1<n13end && *p1!=' ' ; ++p1)
236*32760Sbostic 		if('A'<=*p1 && *p1<='Z') *p1 += ('a'-'A');
2372806Swnj 		*p1 = '\0';
2382806Swnj 
2392806Swnj 	if( amatch(n13,filepat) )
2402806Swnj 		{
2412806Swnj 		concat(dirpref,n13,fullname);
2422806Swnj 		if( (q=srchname(fullname)) ==0)
2432806Swnj 			q = makename(copys(fullname));
2442806Swnj 		if(mkchain)
2452806Swnj 			{
2462806Swnj 			thisdbl = ALLOC(depblock);
2472806Swnj 			thisdbl->nextp = nextdbl;
2482806Swnj 			thisdbl->depname = q;
2492806Swnj 			nextdbl = thisdbl;
2502806Swnj 			}
2512806Swnj 		}
2522806Swnj 	}
2532806Swnj 
2542806Swnj if(endir != 0)  *endir = '/';
2552806Swnj 
2562806Swnj return(thisdbl);
2572806Swnj }
2582806Swnj 
2592806Swnj /* stolen from glob through find */
2602806Swnj 
amatch(s,p)2612806Swnj amatch(s, p)
2622806Swnj char *s, *p;
2632806Swnj {
2642806Swnj 	register int cc, scc, k;
2652806Swnj 	int c, lc;
2662806Swnj 
2672806Swnj 	scc = *s;
2682806Swnj 	lc = 077777;
2692806Swnj 	switch (c = *p) {
2702806Swnj 
2712806Swnj 	case '[':
2722806Swnj 		k = 0;
2732806Swnj 		while (cc = *++p) {
2742806Swnj 			switch (cc) {
2752806Swnj 
2762806Swnj 			case ']':
2772806Swnj 				if (k)
2782806Swnj 					return(amatch(++s, ++p));
2792806Swnj 				else
2802806Swnj 					return(0);
2812806Swnj 
2822806Swnj 			case '-':
283*32760Sbostic 				k |= lc <= scc & scc <= (cc=p[1]);
2842806Swnj 			}
2852806Swnj 			if (scc==(lc=cc)) k++;
2862806Swnj 		}
2872806Swnj 		return(0);
2882806Swnj 
2892806Swnj 	case '?':
2902806Swnj 	caseq:
2912806Swnj 		if(scc) return(amatch(++s, ++p));
2922806Swnj 		return(0);
2932806Swnj 	case '*':
2942806Swnj 		return(umatch(s, ++p));
2952806Swnj 	case 0:
2962806Swnj 		return(!scc);
2972806Swnj 	}
2982806Swnj 	if (c==scc) goto caseq;
2992806Swnj 	return(0);
3002806Swnj }
3012806Swnj 
umatch(s,p)3022806Swnj umatch(s, p)
3032806Swnj char *s, *p;
3042806Swnj {
3052806Swnj 	if(*p==0) return(1);
3062806Swnj 	while(*s)
3072806Swnj 		if (amatch(s++,p)) return(1);
3082806Swnj 	return(0);
3092806Swnj }
3102806Swnj 
3112806Swnj 
3122806Swnj 
dosys(comstring,nohalt)3132806Swnj dosys(comstring,nohalt)
3142806Swnj char *comstring;
3152806Swnj int nohalt;
3162806Swnj {
3172806Swnj char *p;
3182806Swnj 
3192806Swnj for(p=comstring ; *p!='\0' ; ++p);
3202806Swnj if( p-comstring > 80)
3212806Swnj 	fatal("Command string longer than 80 characters");
3222806Swnj 
3232806Swnj system(comstring);
3242806Swnj 
3252806Swnj return(0);
3262806Swnj }
3272806Swnj 
3282806Swnj 
touch(s)3292806Swnj touch(s)
3302806Swnj char *s;
3312806Swnj {
3322806Swnj fprintf(stderr, "touch not yet implemented on GCOS\n");
3332806Swnj cexit(2);
3342806Swnj }
335