Blame


1 76193d7c 2003-09-30 devnull #include "mk.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull char *infile;
4 76193d7c 2003-09-30 devnull int mkinline;
5 76193d7c 2003-09-30 devnull static int rhead(char *, Word **, Word **, int *, char **);
6 76193d7c 2003-09-30 devnull static char *rbody(Biobuf*);
7 76193d7c 2003-09-30 devnull extern Word *target1;
8 76193d7c 2003-09-30 devnull
9 76193d7c 2003-09-30 devnull void
10 76193d7c 2003-09-30 devnull parse(char *f, int fd, int varoverride)
11 76193d7c 2003-09-30 devnull {
12 76193d7c 2003-09-30 devnull int hline;
13 76193d7c 2003-09-30 devnull char *body;
14 76193d7c 2003-09-30 devnull Word *head, *tail;
15 76193d7c 2003-09-30 devnull int attr, set, pid;
16 76193d7c 2003-09-30 devnull char *prog, *p;
17 76193d7c 2003-09-30 devnull int newfd;
18 76193d7c 2003-09-30 devnull Biobuf in;
19 76193d7c 2003-09-30 devnull Bufblock *buf;
20 76193d7c 2003-09-30 devnull
21 76193d7c 2003-09-30 devnull if(fd < 0){
22 76193d7c 2003-09-30 devnull fprint(2, "open %s: %r\n", f);
23 76193d7c 2003-09-30 devnull Exit();
24 76193d7c 2003-09-30 devnull }
25 76193d7c 2003-09-30 devnull ipush();
26 76193d7c 2003-09-30 devnull infile = strdup(f);
27 76193d7c 2003-09-30 devnull mkinline = 1;
28 76193d7c 2003-09-30 devnull Binit(&in, fd, OREAD);
29 76193d7c 2003-09-30 devnull buf = newbuf();
30 76193d7c 2003-09-30 devnull while(assline(&in, buf)){
31 76193d7c 2003-09-30 devnull hline = mkinline;
32 76193d7c 2003-09-30 devnull switch(rhead(buf->start, &head, &tail, &attr, &prog))
33 76193d7c 2003-09-30 devnull {
34 76193d7c 2003-09-30 devnull case '<':
35 76193d7c 2003-09-30 devnull p = wtos(tail, ' ');
36 76193d7c 2003-09-30 devnull if(*p == 0){
37 76193d7c 2003-09-30 devnull SYNERR(-1);
38 76193d7c 2003-09-30 devnull fprint(2, "missing include file name\n");
39 76193d7c 2003-09-30 devnull Exit();
40 76193d7c 2003-09-30 devnull }
41 76193d7c 2003-09-30 devnull newfd = open(p, OREAD);
42 76193d7c 2003-09-30 devnull if(newfd < 0){
43 76193d7c 2003-09-30 devnull fprint(2, "warning: skipping missing include file %s: %r\n", p);
44 76193d7c 2003-09-30 devnull } else
45 76193d7c 2003-09-30 devnull parse(p, newfd, 0);
46 76193d7c 2003-09-30 devnull break;
47 76193d7c 2003-09-30 devnull case '|':
48 76193d7c 2003-09-30 devnull p = wtos(tail, ' ');
49 76193d7c 2003-09-30 devnull if(*p == 0){
50 76193d7c 2003-09-30 devnull SYNERR(-1);
51 76193d7c 2003-09-30 devnull fprint(2, "missing include program name\n");
52 76193d7c 2003-09-30 devnull Exit();
53 76193d7c 2003-09-30 devnull }
54 76193d7c 2003-09-30 devnull execinit();
55 76193d7c 2003-09-30 devnull pid=pipecmd(p, envy, &newfd);
56 76193d7c 2003-09-30 devnull if(newfd < 0){
57 76193d7c 2003-09-30 devnull fprint(2, "warning: skipping missing program file %s: %r\n", p);
58 76193d7c 2003-09-30 devnull } else
59 76193d7c 2003-09-30 devnull parse(p, newfd, 0);
60 76193d7c 2003-09-30 devnull while(waitup(-3, &pid) >= 0)
61 76193d7c 2003-09-30 devnull ;
62 76193d7c 2003-09-30 devnull if(pid != 0){
63 76193d7c 2003-09-30 devnull fprint(2, "bad include program status\n");
64 76193d7c 2003-09-30 devnull Exit();
65 76193d7c 2003-09-30 devnull }
66 76193d7c 2003-09-30 devnull break;
67 76193d7c 2003-09-30 devnull case ':':
68 76193d7c 2003-09-30 devnull body = rbody(&in);
69 76193d7c 2003-09-30 devnull addrules(head, tail, body, attr, hline, prog);
70 76193d7c 2003-09-30 devnull break;
71 76193d7c 2003-09-30 devnull case '=':
72 76193d7c 2003-09-30 devnull if(head->next){
73 76193d7c 2003-09-30 devnull SYNERR(-1);
74 76193d7c 2003-09-30 devnull fprint(2, "multiple vars on left side of assignment\n");
75 76193d7c 2003-09-30 devnull Exit();
76 76193d7c 2003-09-30 devnull }
77 76193d7c 2003-09-30 devnull if(symlook(head->s, S_OVERRIDE, 0)){
78 76193d7c 2003-09-30 devnull set = varoverride;
79 76193d7c 2003-09-30 devnull } else {
80 76193d7c 2003-09-30 devnull set = 1;
81 76193d7c 2003-09-30 devnull if(varoverride)
82 76193d7c 2003-09-30 devnull symlook(head->s, S_OVERRIDE, (void *)"");
83 76193d7c 2003-09-30 devnull }
84 76193d7c 2003-09-30 devnull if(set){
85 76193d7c 2003-09-30 devnull /*
86 76193d7c 2003-09-30 devnull char *cp;
87 76193d7c 2003-09-30 devnull dumpw("tail", tail);
88 76193d7c 2003-09-30 devnull cp = wtos(tail, ' '); print("assign %s to %s\n", head->s, cp); free(cp);
89 76193d7c 2003-09-30 devnull */
90 76193d7c 2003-09-30 devnull setvar(head->s, (void *) tail);
91 76193d7c 2003-09-30 devnull symlook(head->s, S_WESET, (void *)"");
92 76193d7c 2003-09-30 devnull }
93 76193d7c 2003-09-30 devnull if(attr)
94 76193d7c 2003-09-30 devnull symlook(head->s, S_NOEXPORT, (void *)"");
95 76193d7c 2003-09-30 devnull break;
96 76193d7c 2003-09-30 devnull default:
97 76193d7c 2003-09-30 devnull SYNERR(hline);
98 76193d7c 2003-09-30 devnull fprint(2, "expected one of :<=\n");
99 76193d7c 2003-09-30 devnull Exit();
100 76193d7c 2003-09-30 devnull break;
101 76193d7c 2003-09-30 devnull }
102 76193d7c 2003-09-30 devnull }
103 76193d7c 2003-09-30 devnull close(fd);
104 76193d7c 2003-09-30 devnull freebuf(buf);
105 76193d7c 2003-09-30 devnull ipop();
106 76193d7c 2003-09-30 devnull }
107 76193d7c 2003-09-30 devnull
108 76193d7c 2003-09-30 devnull void
109 76193d7c 2003-09-30 devnull addrules(Word *head, Word *tail, char *body, int attr, int hline, char *prog)
110 76193d7c 2003-09-30 devnull {
111 76193d7c 2003-09-30 devnull Word *w;
112 76193d7c 2003-09-30 devnull
113 76193d7c 2003-09-30 devnull assert("addrules args", head && body);
114 76193d7c 2003-09-30 devnull /* tuck away first non-meta rule as default target*/
115 76193d7c 2003-09-30 devnull if(target1 == 0 && !(attr&REGEXP)){
116 76193d7c 2003-09-30 devnull for(w = head; w; w = w->next)
117 76193d7c 2003-09-30 devnull if(charin(w->s, "%&"))
118 76193d7c 2003-09-30 devnull break;
119 76193d7c 2003-09-30 devnull if(w == 0)
120 76193d7c 2003-09-30 devnull target1 = wdup(head);
121 76193d7c 2003-09-30 devnull }
122 76193d7c 2003-09-30 devnull for(w = head; w; w = w->next)
123 76193d7c 2003-09-30 devnull addrule(w->s, tail, body, head, attr, hline, prog);
124 76193d7c 2003-09-30 devnull }
125 76193d7c 2003-09-30 devnull
126 76193d7c 2003-09-30 devnull static int
127 76193d7c 2003-09-30 devnull rhead(char *line, Word **h, Word **t, int *attr, char **prog)
128 76193d7c 2003-09-30 devnull {
129 76193d7c 2003-09-30 devnull char *p;
130 76193d7c 2003-09-30 devnull char *pp;
131 76193d7c 2003-09-30 devnull int sep;
132 76193d7c 2003-09-30 devnull Rune r;
133 76193d7c 2003-09-30 devnull int n;
134 76193d7c 2003-09-30 devnull Word *w;
135 76193d7c 2003-09-30 devnull
136 76193d7c 2003-09-30 devnull p = charin(line,":=<");
137 76193d7c 2003-09-30 devnull if(p == 0)
138 76193d7c 2003-09-30 devnull return('?');
139 76193d7c 2003-09-30 devnull sep = *p;
140 76193d7c 2003-09-30 devnull *p++ = 0;
141 76193d7c 2003-09-30 devnull if(sep == '<' && *p == '|'){
142 76193d7c 2003-09-30 devnull sep = '|';
143 76193d7c 2003-09-30 devnull p++;
144 76193d7c 2003-09-30 devnull }
145 76193d7c 2003-09-30 devnull *attr = 0;
146 76193d7c 2003-09-30 devnull *prog = 0;
147 76193d7c 2003-09-30 devnull if(sep == '='){
148 76193d7c 2003-09-30 devnull pp = charin(p, termchars); /* termchars is shell-dependent */
149 76193d7c 2003-09-30 devnull if (pp && *pp == '=') {
150 76193d7c 2003-09-30 devnull while (p != pp) {
151 76193d7c 2003-09-30 devnull n = chartorune(&r, p);
152 76193d7c 2003-09-30 devnull switch(r)
153 76193d7c 2003-09-30 devnull {
154 76193d7c 2003-09-30 devnull default:
155 76193d7c 2003-09-30 devnull SYNERR(-1);
156 76193d7c 2003-09-30 devnull fprint(2, "unknown attribute '%c'\n",*p);
157 76193d7c 2003-09-30 devnull Exit();
158 76193d7c 2003-09-30 devnull case 'U':
159 76193d7c 2003-09-30 devnull *attr = 1;
160 76193d7c 2003-09-30 devnull break;
161 76193d7c 2003-09-30 devnull }
162 76193d7c 2003-09-30 devnull p += n;
163 76193d7c 2003-09-30 devnull }
164 76193d7c 2003-09-30 devnull p++; /* skip trailing '=' */
165 76193d7c 2003-09-30 devnull }
166 76193d7c 2003-09-30 devnull }
167 76193d7c 2003-09-30 devnull if((sep == ':') && *p && (*p != ' ') && (*p != '\t')){
168 76193d7c 2003-09-30 devnull while (*p) {
169 76193d7c 2003-09-30 devnull n = chartorune(&r, p);
170 76193d7c 2003-09-30 devnull if (r == ':')
171 76193d7c 2003-09-30 devnull break;
172 76193d7c 2003-09-30 devnull p += n;
173 76193d7c 2003-09-30 devnull switch(r)
174 76193d7c 2003-09-30 devnull {
175 76193d7c 2003-09-30 devnull default:
176 76193d7c 2003-09-30 devnull SYNERR(-1);
177 76193d7c 2003-09-30 devnull fprint(2, "unknown attribute '%c'\n", p[-1]);
178 76193d7c 2003-09-30 devnull Exit();
179 76193d7c 2003-09-30 devnull case 'D':
180 76193d7c 2003-09-30 devnull *attr |= DEL;
181 76193d7c 2003-09-30 devnull break;
182 76193d7c 2003-09-30 devnull case 'E':
183 76193d7c 2003-09-30 devnull *attr |= NOMINUSE;
184 76193d7c 2003-09-30 devnull break;
185 76193d7c 2003-09-30 devnull case 'n':
186 76193d7c 2003-09-30 devnull *attr |= NOVIRT;
187 76193d7c 2003-09-30 devnull break;
188 76193d7c 2003-09-30 devnull case 'N':
189 76193d7c 2003-09-30 devnull *attr |= NOREC;
190 76193d7c 2003-09-30 devnull break;
191 76193d7c 2003-09-30 devnull case 'P':
192 76193d7c 2003-09-30 devnull pp = utfrune(p, ':');
193 76193d7c 2003-09-30 devnull if (pp == 0 || *pp == 0)
194 76193d7c 2003-09-30 devnull goto eos;
195 76193d7c 2003-09-30 devnull *pp = 0;
196 76193d7c 2003-09-30 devnull *prog = strdup(p);
197 76193d7c 2003-09-30 devnull *pp = ':';
198 76193d7c 2003-09-30 devnull p = pp;
199 76193d7c 2003-09-30 devnull break;
200 76193d7c 2003-09-30 devnull case 'Q':
201 76193d7c 2003-09-30 devnull *attr |= QUIET;
202 76193d7c 2003-09-30 devnull break;
203 76193d7c 2003-09-30 devnull case 'R':
204 76193d7c 2003-09-30 devnull *attr |= REGEXP;
205 76193d7c 2003-09-30 devnull break;
206 76193d7c 2003-09-30 devnull case 'U':
207 76193d7c 2003-09-30 devnull *attr |= UPD;
208 76193d7c 2003-09-30 devnull break;
209 76193d7c 2003-09-30 devnull case 'V':
210 76193d7c 2003-09-30 devnull *attr |= VIR;
211 76193d7c 2003-09-30 devnull break;
212 76193d7c 2003-09-30 devnull }
213 76193d7c 2003-09-30 devnull }
214 76193d7c 2003-09-30 devnull if (*p++ != ':') {
215 76193d7c 2003-09-30 devnull eos:
216 76193d7c 2003-09-30 devnull SYNERR(-1);
217 76193d7c 2003-09-30 devnull fprint(2, "missing trailing :\n");
218 76193d7c 2003-09-30 devnull Exit();
219 76193d7c 2003-09-30 devnull }
220 76193d7c 2003-09-30 devnull }
221 76193d7c 2003-09-30 devnull *h = w = stow(line);
222 76193d7c 2003-09-30 devnull if(*w->s == 0 && sep != '<' && sep != '|') {
223 76193d7c 2003-09-30 devnull SYNERR(mkinline-1);
224 76193d7c 2003-09-30 devnull fprint(2, "no var on left side of assignment/rule\n");
225 76193d7c 2003-09-30 devnull Exit();
226 76193d7c 2003-09-30 devnull }
227 76193d7c 2003-09-30 devnull *t = stow(p);
228 76193d7c 2003-09-30 devnull return(sep);
229 76193d7c 2003-09-30 devnull }
230 76193d7c 2003-09-30 devnull
231 76193d7c 2003-09-30 devnull static char *
232 76193d7c 2003-09-30 devnull rbody(Biobuf *in)
233 76193d7c 2003-09-30 devnull {
234 76193d7c 2003-09-30 devnull Bufblock *buf;
235 76193d7c 2003-09-30 devnull int r, lastr;
236 76193d7c 2003-09-30 devnull char *p;
237 76193d7c 2003-09-30 devnull
238 76193d7c 2003-09-30 devnull lastr = '\n';
239 76193d7c 2003-09-30 devnull buf = newbuf();
240 76193d7c 2003-09-30 devnull for(;;){
241 76193d7c 2003-09-30 devnull r = Bgetrune(in);
242 76193d7c 2003-09-30 devnull if (r < 0)
243 76193d7c 2003-09-30 devnull break;
244 76193d7c 2003-09-30 devnull if (lastr == '\n') {
245 76193d7c 2003-09-30 devnull if (r == '#')
246 76193d7c 2003-09-30 devnull rinsert(buf, r);
247 76193d7c 2003-09-30 devnull else if (r != ' ' && r != '\t') {
248 76193d7c 2003-09-30 devnull Bungetrune(in);
249 76193d7c 2003-09-30 devnull break;
250 76193d7c 2003-09-30 devnull }
251 76193d7c 2003-09-30 devnull } else
252 76193d7c 2003-09-30 devnull rinsert(buf, r);
253 76193d7c 2003-09-30 devnull lastr = r;
254 76193d7c 2003-09-30 devnull if (r == '\n')
255 76193d7c 2003-09-30 devnull mkinline++;
256 76193d7c 2003-09-30 devnull }
257 76193d7c 2003-09-30 devnull insert(buf, 0);
258 76193d7c 2003-09-30 devnull p = strdup(buf->start);
259 76193d7c 2003-09-30 devnull freebuf(buf);
260 76193d7c 2003-09-30 devnull return p;
261 76193d7c 2003-09-30 devnull }
262 76193d7c 2003-09-30 devnull
263 76193d7c 2003-09-30 devnull struct input
264 76193d7c 2003-09-30 devnull {
265 76193d7c 2003-09-30 devnull char *file;
266 76193d7c 2003-09-30 devnull int line;
267 76193d7c 2003-09-30 devnull struct input *next;
268 76193d7c 2003-09-30 devnull };
269 76193d7c 2003-09-30 devnull static struct input *inputs = 0;
270 76193d7c 2003-09-30 devnull
271 76193d7c 2003-09-30 devnull void
272 76193d7c 2003-09-30 devnull ipush(void)
273 76193d7c 2003-09-30 devnull {
274 76193d7c 2003-09-30 devnull struct input *in, *me;
275 76193d7c 2003-09-30 devnull
276 76193d7c 2003-09-30 devnull me = (struct input *)Malloc(sizeof(*me));
277 76193d7c 2003-09-30 devnull me->file = infile;
278 76193d7c 2003-09-30 devnull me->line = mkinline;
279 76193d7c 2003-09-30 devnull me->next = 0;
280 76193d7c 2003-09-30 devnull if(inputs == 0)
281 76193d7c 2003-09-30 devnull inputs = me;
282 76193d7c 2003-09-30 devnull else {
283 76193d7c 2003-09-30 devnull for(in = inputs; in->next; )
284 76193d7c 2003-09-30 devnull in = in->next;
285 76193d7c 2003-09-30 devnull in->next = me;
286 76193d7c 2003-09-30 devnull }
287 76193d7c 2003-09-30 devnull }
288 76193d7c 2003-09-30 devnull
289 76193d7c 2003-09-30 devnull void
290 76193d7c 2003-09-30 devnull ipop(void)
291 76193d7c 2003-09-30 devnull {
292 76193d7c 2003-09-30 devnull struct input *in, *me;
293 76193d7c 2003-09-30 devnull
294 76193d7c 2003-09-30 devnull assert("pop input list", inputs != 0);
295 76193d7c 2003-09-30 devnull if(inputs->next == 0){
296 76193d7c 2003-09-30 devnull me = inputs;
297 76193d7c 2003-09-30 devnull inputs = 0;
298 76193d7c 2003-09-30 devnull } else {
299 76193d7c 2003-09-30 devnull for(in = inputs; in->next->next; )
300 76193d7c 2003-09-30 devnull in = in->next;
301 76193d7c 2003-09-30 devnull me = in->next;
302 76193d7c 2003-09-30 devnull in->next = 0;
303 76193d7c 2003-09-30 devnull }
304 76193d7c 2003-09-30 devnull infile = me->file;
305 76193d7c 2003-09-30 devnull mkinline = me->line;
306 76193d7c 2003-09-30 devnull free((char *)me);
307 76193d7c 2003-09-30 devnull }