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