1*24493Sbloom static char *sccsid = "@(#)gcos.c 4.3 (Berkeley) 85/08/30"; 22806Swnj /* GCOS DEPENDENT PROCEDURES */ 32806Swnj 42806Swnj 52806Swnj /* DEFAULT RULES FOR GCOS */ 62806Swnj 72806Swnj char *builtin[] 82806Swnj { 92806Swnj ".SUFFIXES : .d .c .y .lib", 102806Swnj ".d.c:", 112806Swnj "\t./dtgen $<", 122806Swnj ".y.c:", 132806Swnj "\t./yacc $<", 142806Swnj "\tcopy y.tab.c; /$@", 152806Swnj ".y.lib:", 162806Swnj "\t./yacc $<", 172806Swnj "\t./cc y.tab.c r=$@", 182806Swnj ".c.lib:", 192806Swnj "\t./cc $< r=$@", 202806Swnj 0 }; 212806Swnj 222806Swnj # define MAXCSIZE 500 232806Swnj # define YZERO 60 242806Swnj 252806Swnj int gtcalled 0; 262806Swnj 272806Swnj /* all kinds of static declarations that must be used.. */ 282806Swnj 292806Swnj static double day { 64*1000*60*60*24 }; /* length of day in clock ticks */ 302806Swnj 312806Swnj struct { int lhs:18, rhs:18; }; 322806Swnj struct catb { 332806Swnj int words[6], 342806Swnj name1, name2, 352806Swnj passw1, passw2, 362806Swnj word10, word11, 372806Swnj datcreat, datmod, datused, 382806Swnj stuff[6], 392806Swnj jjjj:18, tused:18; 402806Swnj }; 412806Swnj struct { int :3, slot:18; }; /* slot where time from cat. block fits */ 422806Swnj 432806Swnj struct catdesc { 442806Swnj int cat1, cat2, cpass1, cpass2, 452806Swnj file1, file2, filep1, filep2, 462806Swnj endmark; }; 472806Swnj 482806Swnj extern int _q_reg, _a_reg; 492806Swnj 502806Swnj 512806Swnj # define A10(x,y) 10*x + y 522806Swnj 532806Swnj /* interpret the mm/dd/yy format */ 542806Swnj 552806Swnj struct d9 { int :5, m1:4, :5, m2:4, :9, 562806Swnj :5, d1:4, :5, d2:4, :9, 572806Swnj :5, y1:4, :5, y2:4 ;}; 582806Swnj 592806Swnj struct d6 { int :2, m61:4, :2, m62:4, 602806Swnj :2, d61:4, :2, d62:4, 612806Swnj :2, y61:4, :2, y62:4; }; 622806Swnj 632806Swnj static day6( d6word ){ /* return the day number of a word in bci format */ 642806Swnj int m, y, d; 652806Swnj 662806Swnj y = A10( d6word.y61, d6word.y62 ); 672806Swnj m = A10( d6word.m61, d6word.m62 ); 682806Swnj d = A10( d6word.d61, d6word.d62 ); 692806Swnj 702806Swnj return( d + 31*( m + 12*(y-YZERO) ) ); 712806Swnj } 722806Swnj 732806Swnj static day9( p ) register int *p; { 742806Swnj 752806Swnj int m, y, d; 762806Swnj 772806Swnj y = A10( p->y1, p->y2 ); 782806Swnj m = A10( p->m1, p->m2 ); 792806Swnj d = A10( p->d1, p->d2 ); 802806Swnj 812806Swnj return( d + 31*( m + 12*(y-YZERO) ) ); 822806Swnj } 832806Swnj 842806Swnj 852806Swnj static int dfold( dayno, timeno ){ 862806Swnj int kk; 872806Swnj kk = ( day*dayno + timeno) / 32768.; 882806Swnj } 892806Swnj 902806Swnj int prestime(){ 912806Swnj int date[2]; 922806Swnj drldrl( 021, date ); 932806Swnj return( dfold( day9(date), _q_reg ) ); 942806Swnj } 952806Swnj 962806Swnj 972806Swnj 982806Swnj # define DODRL ar[0] = status; ar[1] = &b.cat1; drldrl(30,sp1,sp2); p=ar[0]<<18; 992806Swnj 1002806Swnj static struct { int fn1, fn2; int ftm; } fbb[MAXCSIZE]; 1012806Swnj static int catsiz; 1022806Swnj 1032806Swnj getcat() { 1042806Swnj 1052806Swnj register i, *p, j; 1062806Swnj int asname[4]; 1072806Swnj struct catdesc b; 1082806Swnj int sp1, sp2, temp; 1092806Swnj int ar[2], status[2]; 1102806Swnj int filbuf[380]; 1112806Swnj 1122806Swnj gtcalled = 1; 1132806Swnj 1142806Swnj sp1 = ar; 1152806Swnj sp1 =>> 18; 1162806Swnj sp2 = filbuf; 1172806Swnj sp2 =>>18; 1182806Swnj sp2.lhs = 19; 1192806Swnj 1202806Swnj b.cat1 = b.cat2 = b.file1 = -1; 1212806Swnj b.cpass1 = b.cpass2 = 0202020202020; 1222806Swnj 1232806Swnj DODRL 1242806Swnj sp2.lhs++; 1252806Swnj for( i=0; p!=0 && i<MAXCSIZE; ++i ){ 1262806Swnj 1272806Swnj fbb[i].fn1 = b.file1 = p->name1; 1282806Swnj fbb[i].fn2 = b.file2 = p->name2; 1292806Swnj b.filep1 = p->passw1; 1302806Swnj b.filep2 = p->passw2; 1312806Swnj b.endmark = -1; 1322806Swnj temp = 0; 1332806Swnj temp.slot = p->tused; 1342806Swnj fbb[i].ftm = dfold( day6(p->datmod), temp ); 1352806Swnj DODRL 1362806Swnj } 1372806Swnj catsiz = i; 1382806Swnj } 1392806Swnj 14018644Smckusick exists( p ) 14118644Smckusick struct nameblock *p; { 14218644Smckusick char *s, *cp, name[13]; 1432806Swnj int i, *p, bcd[2]; 1442806Swnj 1452806Swnj /* 1462806Swnj cheat about names with slashes -- try opening; 1472806Swnj if it is openable, it exists, and assume it was made 1482806Swnj at t=1 (long time ago); otherwise, assume it 1492806Swnj does not exist 1502806Swnj */ 1512806Swnj 15218644Smckusick cp = p->namep; 15318644Smckusick 1542806Swnj for(s=cp ; *s ; ++s) 1552806Swnj if(*s == '/') 1562806Swnj if(i = copen(cp,'r') < 0) 1572806Swnj return(0); 1582806Swnj else { 1592806Swnj cclose(i); 1602806Swnj return(1); 1612806Swnj } 1622806Swnj 1632806Swnj if(gtcalled == 0) getcat(); 1642806Swnj 1652806Swnj p = name; 1662806Swnj for( i=0; *cp; ++i ) name[i] = *cp++; 1672806Swnj while( i<12 ) name[i++] = ' '; 1682806Swnj f9to6( *p, bcd[0], 12 ); 1692806Swnj for ( i=0; i<catsiz; ++i ){ 1702806Swnj if( fbb[i].fn1 == bcd[0] && fbb[i].fn2 == bcd[1] ) 1712806Swnj return( fbb[i].ftm ); 1722806Swnj } 1732806Swnj return( 0 ); 1742806Swnj } 1752806Swnj 1762806Swnj 1772806Swnj #include "defs" 1782806Swnj 1792806Swnj static char n13[13]; 1802806Swnj static char *n13end &n13[12]; 1812806Swnj 1822806Swnj 1832806Swnj 1842806Swnj struct depblock *srchdir(pat, mkchain, nextdbl) 1852806Swnj 1862806Swnj char *pat; /* pattern to be matched in directory */ 1872806Swnj int mkchain; /* nonzero if results to be remembered */ 1882806Swnj struct depblock *nextdbl; /* final value for chain */ 1892806Swnj { 1902806Swnj int dirf; 1912806Swnj int i, nread; 192*24493Sbloom char *dirname, *dirpref, *endir, *filepat, *p, temp[BUFSIZ]; 193*24493Sbloom char fullname[BUFSIZ], *p1, *p2, *copys(); 1942806Swnj struct nameblock *q; 1952806Swnj struct depblock *thisdbl; 1962806Swnj struct pattern *patp; 1972806Swnj int *intp1, *intp2; 1982806Swnj 1992806Swnj if(gtcalled == 0) getcat(); 2002806Swnj thisdbl=0; 2012806Swnj 2022806Swnj if(mkchain == 0) 2032806Swnj for(patp=firstpat ; patp!=0 ; patp = patp->nxtpattern) 2042806Swnj if(! unequal(pat, patp->patval)) return(0); 2052806Swnj 2062806Swnj patp = ALLOC(pattern); 2072806Swnj patp->nxtpattern = firstpat; 2082806Swnj firstpat = patp; 2092806Swnj patp->patval = copys(pat); 2102806Swnj 2112806Swnj endir = 0; 2122806Swnj 2132806Swnj for(p=pat; *p!='\0'; ++p) 2142806Swnj if(*p=='/') endir = p; 2152806Swnj 2162806Swnj if(endir==0) 2172806Swnj { 2182806Swnj dirname = ""; 2192806Swnj dirpref = ""; 2202806Swnj filepat = pat; 2212806Swnj } 2222806Swnj else { 2232806Swnj fatal("File name has an embedded slash"); 2242806Swnj dirname = pat; 2252806Swnj *endir = '\0'; 2262806Swnj dirpref = concat(dirname, "/", temp); 2272806Swnj filepat = endir+1; 2282806Swnj } 2292806Swnj 2302806Swnj for(i=0;i<catsiz;++i) 2312806Swnj { 2322806Swnj intp1 = &fbb[i].fn1; 2332806Swnj intp2 = n13; 2342806Swnj f6to9(*intp1, *intp2, 12); 2352806Swnj for(p1=n13; p1<n13end && *p1!=' ' ; ++p1) 2362806Swnj if('A'<=*p1 && *p1<='Z') *p1 =+ ('a'-'A'); 2372806Swnj *p1 = '\0'; 2382806Swnj 2392806Swnj if( amatch(n13,filepat) ) 2402806Swnj { 2412806Swnj concat(dirpref,n13,fullname); 2422806Swnj if( (q=srchname(fullname)) ==0) 2432806Swnj q = makename(copys(fullname)); 2442806Swnj if(mkchain) 2452806Swnj { 2462806Swnj thisdbl = ALLOC(depblock); 2472806Swnj thisdbl->nextp = nextdbl; 2482806Swnj thisdbl->depname = q; 2492806Swnj nextdbl = thisdbl; 2502806Swnj } 2512806Swnj } 2522806Swnj } 2532806Swnj 2542806Swnj if(endir != 0) *endir = '/'; 2552806Swnj 2562806Swnj return(thisdbl); 2572806Swnj } 2582806Swnj 2592806Swnj /* stolen from glob through find */ 2602806Swnj 2612806Swnj amatch(s, p) 2622806Swnj char *s, *p; 2632806Swnj { 2642806Swnj register int cc, scc, k; 2652806Swnj int c, lc; 2662806Swnj 2672806Swnj scc = *s; 2682806Swnj lc = 077777; 2692806Swnj switch (c = *p) { 2702806Swnj 2712806Swnj case '[': 2722806Swnj k = 0; 2732806Swnj while (cc = *++p) { 2742806Swnj switch (cc) { 2752806Swnj 2762806Swnj case ']': 2772806Swnj if (k) 2782806Swnj return(amatch(++s, ++p)); 2792806Swnj else 2802806Swnj return(0); 2812806Swnj 2822806Swnj case '-': 2832806Swnj k =| lc <= scc & scc <= (cc=p[1]); 2842806Swnj } 2852806Swnj if (scc==(lc=cc)) k++; 2862806Swnj } 2872806Swnj return(0); 2882806Swnj 2892806Swnj case '?': 2902806Swnj caseq: 2912806Swnj if(scc) return(amatch(++s, ++p)); 2922806Swnj return(0); 2932806Swnj case '*': 2942806Swnj return(umatch(s, ++p)); 2952806Swnj case 0: 2962806Swnj return(!scc); 2972806Swnj } 2982806Swnj if (c==scc) goto caseq; 2992806Swnj return(0); 3002806Swnj } 3012806Swnj 3022806Swnj umatch(s, p) 3032806Swnj char *s, *p; 3042806Swnj { 3052806Swnj if(*p==0) return(1); 3062806Swnj while(*s) 3072806Swnj if (amatch(s++,p)) return(1); 3082806Swnj return(0); 3092806Swnj } 3102806Swnj 3112806Swnj 3122806Swnj 3132806Swnj dosys(comstring,nohalt) 3142806Swnj char *comstring; 3152806Swnj int nohalt; 3162806Swnj { 3172806Swnj char *p; 3182806Swnj 3192806Swnj for(p=comstring ; *p!='\0' ; ++p); 3202806Swnj if( p-comstring > 80) 3212806Swnj fatal("Command string longer than 80 characters"); 3222806Swnj 3232806Swnj system(comstring); 3242806Swnj 3252806Swnj return(0); 3262806Swnj } 3272806Swnj 3282806Swnj 3292806Swnj touch(s) 3302806Swnj char *s; 3312806Swnj { 3322806Swnj fprintf(stderr, "touch not yet implemented on GCOS\n"); 3332806Swnj cexit(2); 3342806Swnj } 335