5 static int rhead(char *, Word **, Word **, int *, char **);
6 static char *rbody(Biobuf*);
10 parse(char *f, int fd, int varoverride)
28 Binit(&in, fd, OREAD);
30 while(assline(&in, buf)){
32 switch(rhead(buf->start, &head, &tail, &attr, &prog))
38 fprint(2, "missing include file name\n");
41 newfd = open(p, OREAD);
43 fprint(2, "warning: skipping missing include file: ");
52 fprint(2, "missing include program name\n");
56 pid=pipecmd(p, envy, &newfd);
58 fprint(2, "warning: skipping missing program file: ");
62 while(waitup(-3, &pid) >= 0)
65 fprint(2, "bad include program status\n");
71 addrules(head, tail, body, attr, hline, prog);
76 fprint(2, "multiple vars on left side of assignment\n");
79 if(symlook(head->s, S_OVERRIDE, 0)){
84 symlook(head->s, S_OVERRIDE, (void *)"");
90 cp = wtos(tail, ' '); print("assign %s to %s\n", head->s, cp); free(cp);
92 setvar(head->s, (void *) tail);
93 symlook(head->s, S_WESET, (void *)"");
96 symlook(head->s, S_NOEXPORT, (void *)"");
100 fprint(2, "expected one of :<=\n");
111 addrules(Word *head, Word *tail, char *body, int attr, int hline, char *prog)
115 assert(/*addrules args*/ head && body);
116 /* tuck away first non-meta rule as default target*/
117 if(target1 == 0 && !(attr®EXP)){
118 for(w = head; w; w = w->next)
119 if(charin(w->s, "%&"))
122 target1 = wdup(head);
124 for(w = head; w; w = w->next)
125 addrule(w->s, tail, body, head, attr, hline, prog);
129 rhead(char *line, Word **h, Word **t, int *attr, char **prog)
138 p = charin(line,":=<");
143 if(sep == '<' && *p == '|'){
150 pp = charin(p, termchars); /* termchars is shell-dependent */
151 if (pp && *pp == '=') {
153 n = chartorune(&r, p);
158 fprint(2, "unknown attribute '%c'\n",*p);
166 p++; /* skip trailing '=' */
169 if((sep == ':') && *p && (*p != ' ') && (*p != '\t')){
171 n = chartorune(&r, p);
179 fprint(2, "unknown attribute '%c'\n", p[-1]);
194 pp = utfrune(p, ':');
195 if (pp == 0 || *pp == 0)
219 fprint(2, "missing trailing :\n");
224 if(*w->s == 0 && sep != '<' && sep != '|') {
226 fprint(2, "no var on left side of assignment/rule\n");
249 else if (r != ' ' && r != '\t') {
260 p = strdup(buf->start);
271 static struct input *inputs = 0;
276 struct input *in, *me;
278 me = (struct input *)Malloc(sizeof(*me));
285 for(in = inputs; in->next; )
294 struct input *in, *me;
296 assert(/*pop input list*/ inputs != 0);
297 if(inputs->next == 0){
301 for(in = inputs; in->next->next; )