Commit | Line | Data |
---|---|---|
572693b3 | 1 | static char *sccsid = "@(#)gcos.c 4.4 (Berkeley) 87/12/04"; |
84e47efb BJ |
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 | \f | |
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; | |
572693b3 | 115 | sp1 >>= 18; |
84e47efb | 116 | sp2 = filbuf; |
572693b3 | 117 | sp2 >>= 18; |
84e47efb BJ |
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 | ||
a10b24d4 KM |
140 | exists( p ) |
141 | struct nameblock *p; { | |
142 | char *s, *cp, name[13]; | |
84e47efb BJ |
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 | ||
a10b24d4 KM |
152 | cp = p->namep; |
153 | ||
84e47efb BJ |
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 | \f | |
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; | |
dbf5cc74 JB |
192 | char *dirname, *dirpref, *endir, *filepat, *p, temp[BUFSIZ]; |
193 | char fullname[BUFSIZ], *p1, *p2, *copys(); | |
84e47efb BJ |
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) | |
572693b3 | 236 | if('A'<=*p1 && *p1<='Z') *p1 += ('a'-'A'); |
84e47efb BJ |
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 | \f | |
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 '-': | |
572693b3 | 283 | k |= lc <= scc & scc <= (cc=p[1]); |
84e47efb BJ |
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 | \f | |
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 | } |