Annotation of 43BSDTahoe/bin/make/gcos.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)gcos.c      4.4 (Berkeley) 87/12/04";
                      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( p ) 
                    141:  struct nameblock *p; {
                    142:        char *s, *cp, name[13];
                    143:        int i, *p, bcd[2];
                    144: 
                    145: /*
                    146:    cheat about names with slashes -- try opening;
                    147:    if it is openable, it exists, and assume it was made
                    148:    at t=1 (long time ago); otherwise, assume it
                    149:    does not exist
                    150: */
                    151: 
                    152: cp = p->namep;
                    153: 
                    154: for(s=cp ; *s ; ++s)
                    155:        if(*s == '/')
                    156:                if(i = copen(cp,'r') < 0)
                    157:                        return(0);
                    158:                else    {
                    159:                        cclose(i);
                    160:                        return(1);
                    161:                        }
                    162: 
                    163: if(gtcalled == 0)  getcat();
                    164: 
                    165:        p = name;
                    166:        for( i=0; *cp; ++i ) name[i] = *cp++;
                    167:        while( i<12 ) name[i++] = ' ';
                    168:        f9to6( *p, bcd[0], 12 );
                    169:        for ( i=0; i<catsiz; ++i ){
                    170:                if( fbb[i].fn1 == bcd[0] && fbb[i].fn2 == bcd[1] )
                    171:                        return( fbb[i].ftm );
                    172:                }
                    173:        return( 0 );
                    174:        }
                    175: 
                    176: 
                    177: #include "defs"
                    178: 
                    179: static char n13[13];
                    180: static char *n13end &n13[12];
                    181: 
                    182: 
                    183: 
                    184: struct depblock *srchdir(pat, mkchain, nextdbl)
                    185: 
                    186: char *pat; /* pattern to be matched in directory */
                    187: int mkchain;  /* nonzero if results to be remembered */
                    188: struct depblock *nextdbl;  /* final value for chain */
                    189: {
                    190: int dirf;
                    191: int i, nread;
                    192: char *dirname, *dirpref, *endir, *filepat, *p, temp[BUFSIZ];
                    193: char fullname[BUFSIZ], *p1, *p2, *copys();
                    194: struct nameblock *q;
                    195: struct depblock *thisdbl;
                    196: struct pattern *patp;
                    197: int *intp1, *intp2;
                    198: 
                    199: if(gtcalled == 0)  getcat();
                    200: thisdbl=0;
                    201: 
                    202: if(mkchain == 0)
                    203:        for(patp=firstpat ; patp!=0 ; patp = patp->nxtpattern)
                    204:                if(! unequal(pat, patp->patval)) return(0);
                    205: 
                    206: patp = ALLOC(pattern);
                    207: patp->nxtpattern = firstpat;
                    208: firstpat = patp;
                    209: patp->patval = copys(pat);
                    210: 
                    211: endir = 0;
                    212: 
                    213: for(p=pat; *p!='\0'; ++p)
                    214:        if(*p=='/') endir = p;
                    215: 
                    216: if(endir==0)
                    217:        {
                    218:        dirname = "";
                    219:        dirpref = "";
                    220:        filepat = pat;
                    221:        }
                    222: else   {
                    223: fatal("File name has an embedded slash");
                    224:        dirname = pat;
                    225:        *endir = '\0';
                    226:        dirpref = concat(dirname, "/", temp);
                    227:        filepat = endir+1;
                    228:        }
                    229: 
                    230: for(i=0;i<catsiz;++i)
                    231:        {
                    232:        intp1 = &fbb[i].fn1;
                    233:        intp2 = n13;
                    234:        f6to9(*intp1, *intp2, 12);
                    235:        for(p1=n13; p1<n13end && *p1!=' ' ; ++p1) 
                    236:                if('A'<=*p1 && *p1<='Z') *p1 += ('a'-'A');
                    237:                *p1 = '\0';
                    238: 
                    239:        if( amatch(n13,filepat) )
                    240:                {
                    241:                concat(dirpref,n13,fullname);
                    242:                if( (q=srchname(fullname)) ==0)
                    243:                        q = makename(copys(fullname));
                    244:                if(mkchain)
                    245:                        {
                    246:                        thisdbl = ALLOC(depblock);
                    247:                        thisdbl->nextp = nextdbl;
                    248:                        thisdbl->depname = q;
                    249:                        nextdbl = thisdbl;
                    250:                        }
                    251:                }
                    252:        }
                    253: 
                    254: if(endir != 0)  *endir = '/';
                    255: 
                    256: return(thisdbl);
                    257: }
                    258: 
                    259: /* stolen from glob through find */
                    260: 
                    261: amatch(s, p)
                    262: char *s, *p;
                    263: {
                    264:        register int cc, scc, k;
                    265:        int c, lc;
                    266: 
                    267:        scc = *s;
                    268:        lc = 077777;
                    269:        switch (c = *p) {
                    270: 
                    271:        case '[':
                    272:                k = 0;
                    273:                while (cc = *++p) {
                    274:                        switch (cc) {
                    275: 
                    276:                        case ']':
                    277:                                if (k)
                    278:                                        return(amatch(++s, ++p));
                    279:                                else
                    280:                                        return(0);
                    281: 
                    282:                        case '-':
                    283:                                k |= lc <= scc & scc <= (cc=p[1]);
                    284:                        }
                    285:                        if (scc==(lc=cc)) k++;
                    286:                }
                    287:                return(0);
                    288: 
                    289:        case '?':
                    290:        caseq:
                    291:                if(scc) return(amatch(++s, ++p));
                    292:                return(0);
                    293:        case '*':
                    294:                return(umatch(s, ++p));
                    295:        case 0:
                    296:                return(!scc);
                    297:        }
                    298:        if (c==scc) goto caseq;
                    299:        return(0);
                    300: }
                    301: 
                    302: umatch(s, p)
                    303: char *s, *p;
                    304: {
                    305:        if(*p==0) return(1);
                    306:        while(*s)
                    307:                if (amatch(s++,p)) return(1);
                    308:        return(0);
                    309: }
                    310: 
                    311: 
                    312: 
                    313: dosys(comstring,nohalt)
                    314: char *comstring;
                    315: int nohalt;
                    316: {
                    317: char *p;
                    318: 
                    319: for(p=comstring ; *p!='\0' ; ++p);
                    320: if( p-comstring > 80)
                    321:        fatal("Command string longer than 80 characters");
                    322: 
                    323: system(comstring);
                    324: 
                    325: return(0);
                    326: }
                    327: 
                    328: 
                    329: touch(s)
                    330: char *s;
                    331: {
                    332: fprintf(stderr, "touch not yet implemented on GCOS\n");
                    333: cexit(2);
                    334: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.