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