1 76193d7c 2003-09-30 devnull #include "mk.h"
3 76193d7c 2003-09-30 devnull static Rule *lr, *lmr;
4 76193d7c 2003-09-30 devnull static int rcmp(Rule *r, char *target, Word *tail);
5 76193d7c 2003-09-30 devnull static int nrules = 0;
8 76193d7c 2003-09-30 devnull addrule(char *head, Word *tail, char *body, Word *ahead, int attr, int hline, char *prog)
11 76193d7c 2003-09-30 devnull Rule *rr;
12 76193d7c 2003-09-30 devnull Symtab *sym;
13 76193d7c 2003-09-30 devnull int reuse;
16 76193d7c 2003-09-30 devnull reuse = 0;
17 76193d7c 2003-09-30 devnull if(sym = symlook(head, S_TARGET, 0)){
18 76193d7c 2003-09-30 devnull for(r = (Rule *)sym->value; r; r = r->chain)
19 76193d7c 2003-09-30 devnull if(rcmp(r, head, tail) == 0){
20 76193d7c 2003-09-30 devnull reuse = 1;
24 76193d7c 2003-09-30 devnull if(r == 0)
25 76193d7c 2003-09-30 devnull r = (Rule *)Malloc(sizeof(Rule));
26 76193d7c 2003-09-30 devnull r->target = head;
27 76193d7c 2003-09-30 devnull r->tail = tail;
28 76193d7c 2003-09-30 devnull r->recipe = body;
29 76193d7c 2003-09-30 devnull r->line = hline;
30 76193d7c 2003-09-30 devnull r->file = infile;
31 76193d7c 2003-09-30 devnull r->attr = attr;
32 76193d7c 2003-09-30 devnull r->alltargets = ahead;
33 76193d7c 2003-09-30 devnull r->prog = prog;
34 76193d7c 2003-09-30 devnull r->rule = nrules++;
35 76193d7c 2003-09-30 devnull if(!reuse){
36 76193d7c 2003-09-30 devnull rr = (Rule *)symlook(head, S_TARGET, (void *)r)->value;
37 76193d7c 2003-09-30 devnull if(rr != r){
38 76193d7c 2003-09-30 devnull r->chain = rr->chain;
39 76193d7c 2003-09-30 devnull rr->chain = r;
41 76193d7c 2003-09-30 devnull r->chain = 0;
43 76193d7c 2003-09-30 devnull if(!reuse)
44 76193d7c 2003-09-30 devnull r->next = 0;
45 76193d7c 2003-09-30 devnull if((attr®EXP) || charin(head, "%&")){
46 76193d7c 2003-09-30 devnull r->attr |= META;
47 76193d7c 2003-09-30 devnull if(reuse)
49 76193d7c 2003-09-30 devnull if(attr®EXP){
50 76193d7c 2003-09-30 devnull patrule = r;
51 76193d7c 2003-09-30 devnull r->pat = regcomp(head);
53 76193d7c 2003-09-30 devnull if(metarules == 0)
54 76193d7c 2003-09-30 devnull metarules = lmr = r;
56 76193d7c 2003-09-30 devnull lmr->next = r;
60 76193d7c 2003-09-30 devnull if(reuse)
62 76193d7c 2003-09-30 devnull r->pat = 0;
63 76193d7c 2003-09-30 devnull if(rules == 0)
64 76193d7c 2003-09-30 devnull rules = lr = r;
66 76193d7c 2003-09-30 devnull lr->next = r;
73 76193d7c 2003-09-30 devnull dumpr(char *s, Rule *r)
75 76193d7c 2003-09-30 devnull Bprint(&bout, "%s: start=%ld\n", s, r);
76 76193d7c 2003-09-30 devnull for(; r; r = r->next){
77 76193d7c 2003-09-30 devnull Bprint(&bout, "\tRule %ld: %s[%d] attr=%x next=%ld chain=%ld alltarget='%s'",
78 76193d7c 2003-09-30 devnull r, r->file, r->line, r->attr, r->next, r->chain, wtos(r->alltargets, ' '));
79 76193d7c 2003-09-30 devnull if(r->prog)
80 76193d7c 2003-09-30 devnull Bprint(&bout, " prog='%s'", r->prog);
81 76193d7c 2003-09-30 devnull Bprint(&bout, "\n\ttarget=%s: %s\n", r->target, wtos(r->tail, ' '));
82 76193d7c 2003-09-30 devnull Bprint(&bout, "\trecipe@%ld='%s'\n", r->recipe, r->recipe);
86 76193d7c 2003-09-30 devnull static int
87 76193d7c 2003-09-30 devnull rcmp(Rule *r, char *target, Word *tail)
91 76193d7c 2003-09-30 devnull if(strcmp(r->target, target))
92 76193d7c 2003-09-30 devnull return 1;
93 76193d7c 2003-09-30 devnull for(w = r->tail; w && tail; w = w->next, tail = tail->next)
94 76193d7c 2003-09-30 devnull if(strcmp(w->s, tail->s))
95 76193d7c 2003-09-30 devnull return 1;
96 76193d7c 2003-09-30 devnull return(w || tail);
100 76193d7c 2003-09-30 devnull rulecnt(void)
102 76193d7c 2003-09-30 devnull char *s;
104 76193d7c 2003-09-30 devnull s = Malloc(nrules);
105 76193d7c 2003-09-30 devnull memset(s, 0, nrules);
106 76193d7c 2003-09-30 devnull return(s);