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