|
|
1.1 ! root 1: static char *sccsid = "@(#)gcos.c 4.1 (Berkeley) 81/02/28"; ! 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( cp ) char *cp; { ! 141: char *s, name[13]; ! 142: int i, *p, bcd[2]; ! 143: ! 144: /* ! 145: cheat about names with slashes -- try opening; ! 146: if it is openable, it exists, and assume it was made ! 147: at t=1 (long time ago); otherwise, assume it ! 148: does not exist ! 149: */ ! 150: ! 151: for(s=cp ; *s ; ++s) ! 152: if(*s == '/') ! 153: if(i = copen(cp,'r') < 0) ! 154: return(0); ! 155: else { ! 156: cclose(i); ! 157: return(1); ! 158: } ! 159: ! 160: if(gtcalled == 0) getcat(); ! 161: ! 162: p = name; ! 163: for( i=0; *cp; ++i ) name[i] = *cp++; ! 164: while( i<12 ) name[i++] = ' '; ! 165: f9to6( *p, bcd[0], 12 ); ! 166: for ( i=0; i<catsiz; ++i ){ ! 167: if( fbb[i].fn1 == bcd[0] && fbb[i].fn2 == bcd[1] ) ! 168: return( fbb[i].ftm ); ! 169: } ! 170: return( 0 ); ! 171: } ! 172: ! 173: ! 174: #include "defs" ! 175: ! 176: static char n13[13]; ! 177: static char *n13end &n13[12]; ! 178: ! 179: ! 180: ! 181: struct depblock *srchdir(pat, mkchain, nextdbl) ! 182: ! 183: char *pat; /* pattern to be matched in directory */ ! 184: int mkchain; /* nonzero if results to be remembered */ ! 185: struct depblock *nextdbl; /* final value for chain */ ! 186: { ! 187: int dirf; ! 188: int i, nread; ! 189: char *dirname, *dirpref, *endir, *filepat, *p, temp[100]; ! 190: char fullname[100], *p1, *p2, *copys(); ! 191: struct nameblock *q; ! 192: struct depblock *thisdbl; ! 193: struct pattern *patp; ! 194: int *intp1, *intp2; ! 195: ! 196: if(gtcalled == 0) getcat(); ! 197: thisdbl=0; ! 198: ! 199: if(mkchain == 0) ! 200: for(patp=firstpat ; patp!=0 ; patp = patp->nxtpattern) ! 201: if(! unequal(pat, patp->patval)) return(0); ! 202: ! 203: patp = ALLOC(pattern); ! 204: patp->nxtpattern = firstpat; ! 205: firstpat = patp; ! 206: patp->patval = copys(pat); ! 207: ! 208: endir = 0; ! 209: ! 210: for(p=pat; *p!='\0'; ++p) ! 211: if(*p=='/') endir = p; ! 212: ! 213: if(endir==0) ! 214: { ! 215: dirname = ""; ! 216: dirpref = ""; ! 217: filepat = pat; ! 218: } ! 219: else { ! 220: fatal("File name has an embedded slash"); ! 221: dirname = pat; ! 222: *endir = '\0'; ! 223: dirpref = concat(dirname, "/", temp); ! 224: filepat = endir+1; ! 225: } ! 226: ! 227: for(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 = ALLOC(depblock); ! 244: thisdbl->nextp = nextdbl; ! 245: thisdbl->depname = q; ! 246: nextdbl = thisdbl; ! 247: } ! 248: } ! 249: } ! 250: ! 251: if(endir != 0) *endir = '/'; ! 252: ! 253: return(thisdbl); ! 254: } ! 255: ! 256: /* stolen from glob through find */ ! 257: ! 258: amatch(s, p) ! 259: char *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: ! 299: umatch(s, p) ! 300: char *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: ! 310: dosys(comstring,nohalt) ! 311: char *comstring; ! 312: int nohalt; ! 313: { ! 314: char *p; ! 315: ! 316: for(p=comstring ; *p!='\0' ; ++p); ! 317: if( p-comstring > 80) ! 318: fatal("Command string longer than 80 characters"); ! 319: ! 320: system(comstring); ! 321: ! 322: return(0); ! 323: } ! 324: ! 325: ! 326: touch(s) ! 327: char *s; ! 328: { ! 329: fprintf(stderr, "touch not yet implemented on GCOS\n"); ! 330: cexit(2); ! 331: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.