1 static char *sccsid = "@(#)gcos.c 4.4 (Berkeley) 87/12/04"; 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 } 335