1*32760Sbostic static char *sccsid = "@(#)gcos.c 4.4 (Berkeley) 87/12/04";
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
day6(d6word)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
day9(p)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
dfold(dayno,timeno)852806Swnj static int dfold( dayno, timeno ){
862806Swnj int kk;
872806Swnj kk = ( day*dayno + timeno) / 32768.;
882806Swnj }
892806Swnj
prestime()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
getcat()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;
115*32760Sbostic sp1 >>= 18;
1162806Swnj sp2 = filbuf;
117*32760Sbostic 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
srchdir(pat,mkchain,nextdbl)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;
19224493Sbloom char *dirname, *dirpref, *endir, *filepat, *p, temp[BUFSIZ];
19324493Sbloom 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)
236*32760Sbostic 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
amatch(s,p)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 '-':
283*32760Sbostic 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
umatch(s,p)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
dosys(comstring,nohalt)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
touch(s)3292806Swnj touch(s)
3302806Swnj char *s;
3312806Swnj {
3322806Swnj fprintf(stderr, "touch not yet implemented on GCOS\n");
3332806Swnj cexit(2);
3342806Swnj }
335