Annotation of researchv10no/cmd/mk/export/rule.c, revision 1.1

1.1     ! root        1: #include       "mk.h"
        !             2: 
        !             3: static Rule *lr, *lmr;
        !             4: static rcmp();
        !             5: static int nrules = 0;
        !             6: 
        !             7: addrule(head, tail, body, ahead, attr, hline, override, prog)
        !             8:        Word *tail, *ahead;
        !             9:        char *head, *body, *prog;
        !            10: {
        !            11:        register Rule *r;
        !            12:        Rule *rr;
        !            13:        Symtab *sym;
        !            14:        int reuse;
        !            15: 
        !            16:        if(sym = symlook(head, S_TARGET, (char *)0)){
        !            17:                for(r = (Rule *)sym->value; r; r = r->chain)
        !            18:                        if(rcmp(r, head, tail) == 0) break;
        !            19:                if(r && !override)
        !            20:                        return;
        !            21:        } else
        !            22:                r = 0;
        !            23:        reuse = r != 0;
        !            24:        if(r == 0)
        !            25:                r = (Rule *)Malloc(sizeof(Rule));
        !            26:        r->target = head;
        !            27:        r->tail = tail;
        !            28:        r->recipe = body;
        !            29:        r->line = hline;
        !            30:        r->file = infile;
        !            31:        r->attr = attr;
        !            32:        r->alltargets = ahead;
        !            33:        r->prog = prog;
        !            34:        r->rule = nrules++;
        !            35:        if(!reuse){
        !            36:                rr = (Rule *)symlook(head, S_TARGET, (char *)r)->value;
        !            37:                if(rr != r){
        !            38:                        r->chain = rr->chain;
        !            39:                        rr->chain = r;
        !            40:                } else
        !            41:                        r->chain = 0;
        !            42:        }
        !            43:        if(strchr(head, '%') || strchr(head, '&') || (attr&REGEXP))
        !            44:                goto meta;
        !            45:        if(reuse)
        !            46:                return;
        !            47:        r->next = 0;
        !            48:        r->pat = 0;
        !            49:        if(rules == 0)
        !            50:                rules = lr = r;
        !            51:        else {
        !            52:                lr->next = r;
        !            53:                lr = r;
        !            54:        }
        !            55:        return;
        !            56: meta:
        !            57:        r->attr |= META;
        !            58:        if(reuse)
        !            59:                return;
        !            60:        r->next = 0;
        !            61:        if(r->attr&REGEXP){
        !            62:                patrule = r;
        !            63:                r->pat = regcomp(head);
        !            64:        }
        !            65:        if(metarules == 0)
        !            66:                metarules = lmr = r;
        !            67:        else {
        !            68:                lmr->next = r;
        !            69:                lmr = r;
        !            70:        }
        !            71: }
        !            72: 
        !            73: dumpr(s, r)
        !            74:        char *s;
        !            75:        register Rule *r;
        !            76: {
        !            77:        Fprint(1, "%s: start=%ld\n", s, r);
        !            78:        for(; r; r = r->next){
        !            79:                Fprint(1, "\tRule %ld: %s[%d] attr=%x next=%ld chain=%ld alltarget='%s'",
        !            80:                        r, r->file, r->line, r->attr, r->next, r->chain, wtos(r->alltargets));
        !            81:                if(r->prog)
        !            82:                        Fprint(1, " prog='%s'", r->prog);
        !            83:                Fprint(1, "\n\ttarget=%s: %s\n", r->target, wtos(r->tail));
        !            84:                Fprint(1, "\trecipe@%ld='%s'\n", r->recipe, r->recipe);
        !            85:        }
        !            86: }
        !            87: 
        !            88: frule(w)
        !            89:        Word *w;
        !            90: {
        !            91:        extern Word *target1;
        !            92:        register Word *ww;
        !            93:        register char *s;
        !            94: 
        !            95: #define        ADD(s)  {if(target1==0)target1=ww=newword(s);else ww=ww->next=newword(s);}
        !            96: 
        !            97:        for(ww = w; ww; ww = ww->next)
        !            98:                if(strchr(w->s, '%') || strchr(w->s, '&'))
        !            99:                        return; /* no metarule targets */
        !           100:        while(w){
        !           101:                if(s = strchr(w->s, '+')){
        !           102:                        *s++ = 0;
        !           103:                        if(*w->s)
        !           104:                                ADD(w->s);
        !           105:                        if(*s)
        !           106:                                ADD(s);
        !           107:                        s[-1] = '+';
        !           108:                } else
        !           109:                        ADD(w->s);
        !           110:                w = w->next;
        !           111:        }
        !           112: }
        !           113: 
        !           114: static
        !           115: rcmp(r, target, tail)
        !           116:        register Rule *r;
        !           117:        char *target;
        !           118:        register Word *tail;
        !           119: {
        !           120:        register Word *w;
        !           121: 
        !           122:        if(strcmp(r->target, target))
        !           123:                return(1);
        !           124:        for(w = r->tail; w && tail; w = w->next, tail = tail->next)
        !           125:                if(strcmp(w->s, tail->s))
        !           126:                        return(1);
        !           127:        return(w || tail);
        !           128: }
        !           129: 
        !           130: char *
        !           131: rulecnt()
        !           132: {
        !           133:        register char *s;
        !           134: 
        !           135:        s = Malloc(nrules);
        !           136:        memset(s, 0, nrules);
        !           137:        return(s);
        !           138: }
        !           139: 
        !           140: ismeta(s)
        !           141:        register char *s;
        !           142: {
        !           143:        for(; *s; s++)
        !           144:                switch(*s)
        !           145:                {
        !           146:                case '\\':
        !           147:                        if(s[1])
        !           148:                                s++;
        !           149:                        break;
        !           150:                case '[':
        !           151:                case '*':
        !           152:                case '?':
        !           153:                        return(1);
        !           154:                        break;
        !           155:                }
        !           156:        return(0);
        !           157: }

unix.superglobalmegacorp.com

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