xref: /csrg-svn/old/make/gcos.c (revision 2806)
1*2806Swnj static	char *sccsid = "@(#)gcos.c	4.1 (Berkeley) 81/02/28";
2*2806Swnj /* GCOS DEPENDENT PROCEDURES */
3*2806Swnj 
4*2806Swnj 
5*2806Swnj /* DEFAULT RULES FOR GCOS */
6*2806Swnj 
7*2806Swnj char *builtin[]
8*2806Swnj 	{
9*2806Swnj 	".SUFFIXES : .d .c .y .lib",
10*2806Swnj 	".d.c:",
11*2806Swnj 	"\t./dtgen $<",
12*2806Swnj 	".y.c:",
13*2806Swnj 	"\t./yacc $<",
14*2806Swnj 	"\tcopy y.tab.c; /$@",
15*2806Swnj 	".y.lib:",
16*2806Swnj 	"\t./yacc $<",
17*2806Swnj 	"\t./cc y.tab.c r=$@",
18*2806Swnj 	".c.lib:",
19*2806Swnj 	"\t./cc $< r=$@",
20*2806Swnj 	0 };
21*2806Swnj 
22*2806Swnj # define MAXCSIZE 500
23*2806Swnj # define YZERO 60
24*2806Swnj 
25*2806Swnj int gtcalled 0;
26*2806Swnj 
27*2806Swnj /* all kinds of static declarations that must be used.. */
28*2806Swnj 
29*2806Swnj static double day { 64*1000*60*60*24 };  /* length of day in clock ticks */
30*2806Swnj 
31*2806Swnj struct { int lhs:18, rhs:18; };
32*2806Swnj struct catb {
33*2806Swnj 	int words[6],
34*2806Swnj 	name1, name2,
35*2806Swnj 	passw1, passw2,
36*2806Swnj 	word10, word11,
37*2806Swnj 	datcreat, datmod,  datused,
38*2806Swnj 	stuff[6],
39*2806Swnj 	jjjj:18, tused:18;
40*2806Swnj 	};
41*2806Swnj struct { int :3, slot:18; };  /* slot where time from cat. block fits */
42*2806Swnj 
43*2806Swnj struct catdesc {
44*2806Swnj 	int cat1, cat2, cpass1, cpass2,
45*2806Swnj 	    file1, file2, filep1, filep2,
46*2806Swnj 	    endmark; };
47*2806Swnj 
48*2806Swnj extern int _q_reg, _a_reg;
49*2806Swnj 
50*2806Swnj 
51*2806Swnj # define A10(x,y) 10*x + y
52*2806Swnj 
53*2806Swnj /*	interpret the mm/dd/yy format */
54*2806Swnj 
55*2806Swnj struct d9 { int	:5, m1:4, :5, m2:4, :9,
56*2806Swnj 		:5, d1:4, :5, d2:4, :9,
57*2806Swnj 		:5, y1:4, :5, y2:4  ;};
58*2806Swnj 
59*2806Swnj struct d6 { int	:2, m61:4, :2, m62:4,
60*2806Swnj 		:2, d61:4, :2, d62:4,
61*2806Swnj 		:2, y61:4, :2, y62:4; };
62*2806Swnj 
63*2806Swnj static day6( d6word ){ /* return the day number of a word in bci format */
64*2806Swnj 	int m, y, d;
65*2806Swnj 
66*2806Swnj 	y = A10( d6word.y61, d6word.y62 );
67*2806Swnj 	m = A10( d6word.m61, d6word.m62 );
68*2806Swnj 	d = A10( d6word.d61, d6word.d62 );
69*2806Swnj 
70*2806Swnj 	return( d + 31*( m + 12*(y-YZERO) ) );
71*2806Swnj 	}
72*2806Swnj 
73*2806Swnj static day9( p ) register int *p; {
74*2806Swnj 
75*2806Swnj 	int m, y, d;
76*2806Swnj 
77*2806Swnj 	y = A10( p->y1, p->y2 );
78*2806Swnj 	m = A10( p->m1, p->m2 );
79*2806Swnj 	d = A10( p->d1, p->d2 );
80*2806Swnj 
81*2806Swnj 	return( d + 31*( m + 12*(y-YZERO) ) );
82*2806Swnj 	}
83*2806Swnj 
84*2806Swnj 
85*2806Swnj static int dfold( dayno, timeno ){
86*2806Swnj 	int kk;
87*2806Swnj 	kk = ( day*dayno + timeno) / 32768.;
88*2806Swnj 	}
89*2806Swnj 
90*2806Swnj int prestime(){
91*2806Swnj 	int date[2];
92*2806Swnj 	drldrl( 021, date );
93*2806Swnj 	return( dfold( day9(date), _q_reg ) );
94*2806Swnj 	}
95*2806Swnj 
96*2806Swnj 
97*2806Swnj 
98*2806Swnj # define DODRL ar[0] = status; ar[1] = &b.cat1; drldrl(30,sp1,sp2); p=ar[0]<<18;
99*2806Swnj 
100*2806Swnj static struct { int fn1, fn2;  int ftm; } fbb[MAXCSIZE];
101*2806Swnj static int catsiz;
102*2806Swnj 
103*2806Swnj getcat() {
104*2806Swnj 
105*2806Swnj 	register i, *p, j;
106*2806Swnj 	int asname[4];
107*2806Swnj 	struct catdesc b;
108*2806Swnj 	int sp1, sp2, temp;
109*2806Swnj 	int ar[2], status[2];
110*2806Swnj 	int filbuf[380];
111*2806Swnj 
112*2806Swnj 	gtcalled = 1;
113*2806Swnj 
114*2806Swnj 	sp1 = ar;
115*2806Swnj 	sp1 =>> 18;
116*2806Swnj 	sp2 = filbuf;
117*2806Swnj 	sp2 =>>18;
118*2806Swnj 	sp2.lhs = 19;
119*2806Swnj 
120*2806Swnj 	b.cat1 = b.cat2 = b.file1 = -1;
121*2806Swnj 	b.cpass1 = b.cpass2 = 0202020202020;
122*2806Swnj 
123*2806Swnj 	DODRL
124*2806Swnj 	sp2.lhs++;
125*2806Swnj 	for( i=0; p!=0 && i<MAXCSIZE; ++i ){
126*2806Swnj 
127*2806Swnj 		fbb[i].fn1 = b.file1 = p->name1;
128*2806Swnj 		fbb[i].fn2 = b.file2 = p->name2;
129*2806Swnj 		b.filep1 = p->passw1;
130*2806Swnj 		b.filep2 = p->passw2;
131*2806Swnj 		b.endmark = -1;
132*2806Swnj 		temp = 0;
133*2806Swnj 		temp.slot = p->tused;
134*2806Swnj 		fbb[i].ftm = dfold( day6(p->datmod), temp );
135*2806Swnj 		DODRL
136*2806Swnj 		}
137*2806Swnj 	catsiz = i;
138*2806Swnj 	}
139*2806Swnj 
140*2806Swnj  exists( cp ) char *cp; {
141*2806Swnj 	char *s, name[13];
142*2806Swnj 	int i, *p, bcd[2];
143*2806Swnj 
144*2806Swnj /*
145*2806Swnj    cheat about names with slashes -- try opening;
146*2806Swnj    if it is openable, it exists, and assume it was made
147*2806Swnj    at t=1 (long time ago); otherwise, assume it
148*2806Swnj    does not exist
149*2806Swnj */
150*2806Swnj 
151*2806Swnj for(s=cp ; *s ; ++s)
152*2806Swnj 	if(*s == '/')
153*2806Swnj 		if(i = copen(cp,'r') < 0)
154*2806Swnj 			return(0);
155*2806Swnj 		else	{
156*2806Swnj 			cclose(i);
157*2806Swnj 			return(1);
158*2806Swnj 			}
159*2806Swnj 
160*2806Swnj if(gtcalled == 0)  getcat();
161*2806Swnj 
162*2806Swnj 	p = name;
163*2806Swnj 	for( i=0; *cp; ++i ) name[i] = *cp++;
164*2806Swnj 	while( i<12 ) name[i++] = ' ';
165*2806Swnj 	f9to6( *p, bcd[0], 12 );
166*2806Swnj 	for ( i=0; i<catsiz; ++i ){
167*2806Swnj 		if( fbb[i].fn1 == bcd[0] && fbb[i].fn2 == bcd[1] )
168*2806Swnj 			return( fbb[i].ftm );
169*2806Swnj 		}
170*2806Swnj 	return( 0 );
171*2806Swnj 	}
172*2806Swnj 
173*2806Swnj 
174*2806Swnj #include "defs"
175*2806Swnj 
176*2806Swnj static char n13[13];
177*2806Swnj static char *n13end &n13[12];
178*2806Swnj 
179*2806Swnj 
180*2806Swnj 
181*2806Swnj struct depblock *srchdir(pat, mkchain, nextdbl)
182*2806Swnj 
183*2806Swnj char *pat; /* pattern to be matched in directory */
184*2806Swnj int mkchain;  /* nonzero if results to be remembered */
185*2806Swnj struct depblock *nextdbl;  /* final value for chain */
186*2806Swnj {
187*2806Swnj int dirf;
188*2806Swnj int i, nread;
189*2806Swnj char *dirname, *dirpref, *endir, *filepat, *p, temp[100];
190*2806Swnj char fullname[100], *p1, *p2, *copys();
191*2806Swnj struct nameblock *q;
192*2806Swnj struct depblock *thisdbl;
193*2806Swnj struct pattern *patp;
194*2806Swnj int *intp1, *intp2;
195*2806Swnj 
196*2806Swnj if(gtcalled == 0)  getcat();
197*2806Swnj thisdbl=0;
198*2806Swnj 
199*2806Swnj if(mkchain == 0)
200*2806Swnj 	for(patp=firstpat ; patp!=0 ; patp = patp->nxtpattern)
201*2806Swnj 		if(! unequal(pat, patp->patval)) return(0);
202*2806Swnj 
203*2806Swnj patp = ALLOC(pattern);
204*2806Swnj patp->nxtpattern = firstpat;
205*2806Swnj firstpat = patp;
206*2806Swnj patp->patval = copys(pat);
207*2806Swnj 
208*2806Swnj endir = 0;
209*2806Swnj 
210*2806Swnj for(p=pat; *p!='\0'; ++p)
211*2806Swnj 	if(*p=='/') endir = p;
212*2806Swnj 
213*2806Swnj if(endir==0)
214*2806Swnj 	{
215*2806Swnj 	dirname = "";
216*2806Swnj 	dirpref = "";
217*2806Swnj 	filepat = pat;
218*2806Swnj 	}
219*2806Swnj else	{
220*2806Swnj fatal("File name has an embedded slash");
221*2806Swnj 	dirname = pat;
222*2806Swnj 	*endir = '\0';
223*2806Swnj 	dirpref = concat(dirname, "/", temp);
224*2806Swnj 	filepat = endir+1;
225*2806Swnj 	}
226*2806Swnj 
227*2806Swnj for(i=0;i<catsiz;++i)
228*2806Swnj 	{
229*2806Swnj 	intp1 = &fbb[i].fn1;
230*2806Swnj 	intp2 = n13;
231*2806Swnj 	f6to9(*intp1, *intp2, 12);
232*2806Swnj 	for(p1=n13; p1<n13end && *p1!=' ' ; ++p1)
233*2806Swnj 		if('A'<=*p1 && *p1<='Z') *p1 =+ ('a'-'A');
234*2806Swnj 		*p1 = '\0';
235*2806Swnj 
236*2806Swnj 	if( amatch(n13,filepat) )
237*2806Swnj 		{
238*2806Swnj 		concat(dirpref,n13,fullname);
239*2806Swnj 		if( (q=srchname(fullname)) ==0)
240*2806Swnj 			q = makename(copys(fullname));
241*2806Swnj 		if(mkchain)
242*2806Swnj 			{
243*2806Swnj 			thisdbl = ALLOC(depblock);
244*2806Swnj 			thisdbl->nextp = nextdbl;
245*2806Swnj 			thisdbl->depname = q;
246*2806Swnj 			nextdbl = thisdbl;
247*2806Swnj 			}
248*2806Swnj 		}
249*2806Swnj 	}
250*2806Swnj 
251*2806Swnj if(endir != 0)  *endir = '/';
252*2806Swnj 
253*2806Swnj return(thisdbl);
254*2806Swnj }
255*2806Swnj 
256*2806Swnj /* stolen from glob through find */
257*2806Swnj 
258*2806Swnj amatch(s, p)
259*2806Swnj char *s, *p;
260*2806Swnj {
261*2806Swnj 	register int cc, scc, k;
262*2806Swnj 	int c, lc;
263*2806Swnj 
264*2806Swnj 	scc = *s;
265*2806Swnj 	lc = 077777;
266*2806Swnj 	switch (c = *p) {
267*2806Swnj 
268*2806Swnj 	case '[':
269*2806Swnj 		k = 0;
270*2806Swnj 		while (cc = *++p) {
271*2806Swnj 			switch (cc) {
272*2806Swnj 
273*2806Swnj 			case ']':
274*2806Swnj 				if (k)
275*2806Swnj 					return(amatch(++s, ++p));
276*2806Swnj 				else
277*2806Swnj 					return(0);
278*2806Swnj 
279*2806Swnj 			case '-':
280*2806Swnj 				k =| lc <= scc & scc <= (cc=p[1]);
281*2806Swnj 			}
282*2806Swnj 			if (scc==(lc=cc)) k++;
283*2806Swnj 		}
284*2806Swnj 		return(0);
285*2806Swnj 
286*2806Swnj 	case '?':
287*2806Swnj 	caseq:
288*2806Swnj 		if(scc) return(amatch(++s, ++p));
289*2806Swnj 		return(0);
290*2806Swnj 	case '*':
291*2806Swnj 		return(umatch(s, ++p));
292*2806Swnj 	case 0:
293*2806Swnj 		return(!scc);
294*2806Swnj 	}
295*2806Swnj 	if (c==scc) goto caseq;
296*2806Swnj 	return(0);
297*2806Swnj }
298*2806Swnj 
299*2806Swnj umatch(s, p)
300*2806Swnj char *s, *p;
301*2806Swnj {
302*2806Swnj 	if(*p==0) return(1);
303*2806Swnj 	while(*s)
304*2806Swnj 		if (amatch(s++,p)) return(1);
305*2806Swnj 	return(0);
306*2806Swnj }
307*2806Swnj 
308*2806Swnj 
309*2806Swnj 
310*2806Swnj dosys(comstring,nohalt)
311*2806Swnj char *comstring;
312*2806Swnj int nohalt;
313*2806Swnj {
314*2806Swnj char *p;
315*2806Swnj 
316*2806Swnj for(p=comstring ; *p!='\0' ; ++p);
317*2806Swnj if( p-comstring > 80)
318*2806Swnj 	fatal("Command string longer than 80 characters");
319*2806Swnj 
320*2806Swnj system(comstring);
321*2806Swnj 
322*2806Swnj return(0);
323*2806Swnj }
324*2806Swnj 
325*2806Swnj 
326*2806Swnj touch(s)
327*2806Swnj char *s;
328*2806Swnj {
329*2806Swnj fprintf(stderr, "touch not yet implemented on GCOS\n");
330*2806Swnj cexit(2);
331*2806Swnj }
332