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