|
|
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®EXP))
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®EXP){
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.