Blame


1 76193d7c 2003-09-30 devnull #include "mk.h"
2 76193d7c 2003-09-30 devnull
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;
6 76193d7c 2003-09-30 devnull
7 76193d7c 2003-09-30 devnull void
8 76193d7c 2003-09-30 devnull addrule(char *head, Word *tail, char *body, Word *ahead, int attr, int hline, char *prog)
9 76193d7c 2003-09-30 devnull {
10 76193d7c 2003-09-30 devnull Rule *r;
11 76193d7c 2003-09-30 devnull Rule *rr;
12 76193d7c 2003-09-30 devnull Symtab *sym;
13 76193d7c 2003-09-30 devnull int reuse;
14 76193d7c 2003-09-30 devnull
15 76193d7c 2003-09-30 devnull r = 0;
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;
21 76193d7c 2003-09-30 devnull break;
22 76193d7c 2003-09-30 devnull }
23 76193d7c 2003-09-30 devnull }
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;
40 76193d7c 2003-09-30 devnull } else
41 76193d7c 2003-09-30 devnull r->chain = 0;
42 76193d7c 2003-09-30 devnull }
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&REGEXP) || charin(head, "%&")){
46 76193d7c 2003-09-30 devnull r->attr |= META;
47 76193d7c 2003-09-30 devnull if(reuse)
48 76193d7c 2003-09-30 devnull return;
49 76193d7c 2003-09-30 devnull if(attr&REGEXP){
50 76193d7c 2003-09-30 devnull patrule = r;
51 76193d7c 2003-09-30 devnull r->pat = regcomp(head);
52 76193d7c 2003-09-30 devnull }
53 76193d7c 2003-09-30 devnull if(metarules == 0)
54 76193d7c 2003-09-30 devnull metarules = lmr = r;
55 76193d7c 2003-09-30 devnull else {
56 76193d7c 2003-09-30 devnull lmr->next = r;
57 76193d7c 2003-09-30 devnull lmr = r;
58 76193d7c 2003-09-30 devnull }
59 76193d7c 2003-09-30 devnull } else {
60 76193d7c 2003-09-30 devnull if(reuse)
61 76193d7c 2003-09-30 devnull return;
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;
65 76193d7c 2003-09-30 devnull else {
66 76193d7c 2003-09-30 devnull lr->next = r;
67 76193d7c 2003-09-30 devnull lr = r;
68 76193d7c 2003-09-30 devnull }
69 76193d7c 2003-09-30 devnull }
70 76193d7c 2003-09-30 devnull }
71 76193d7c 2003-09-30 devnull
72 76193d7c 2003-09-30 devnull void
73 76193d7c 2003-09-30 devnull dumpr(char *s, Rule *r)
74 76193d7c 2003-09-30 devnull {
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);
83 76193d7c 2003-09-30 devnull }
84 76193d7c 2003-09-30 devnull }
85 76193d7c 2003-09-30 devnull
86 76193d7c 2003-09-30 devnull static int
87 76193d7c 2003-09-30 devnull rcmp(Rule *r, char *target, Word *tail)
88 76193d7c 2003-09-30 devnull {
89 76193d7c 2003-09-30 devnull Word *w;
90 76193d7c 2003-09-30 devnull
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);
97 76193d7c 2003-09-30 devnull }
98 76193d7c 2003-09-30 devnull
99 76193d7c 2003-09-30 devnull char *
100 76193d7c 2003-09-30 devnull rulecnt(void)
101 76193d7c 2003-09-30 devnull {
102 76193d7c 2003-09-30 devnull char *s;
103 76193d7c 2003-09-30 devnull
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);
107 76193d7c 2003-09-30 devnull }