2 5cdb1798 2005-10-29 devnull #line 2 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
3 5cdb1798 2005-10-29 devnull #include "common.h"
4 5cdb1798 2005-10-29 devnull #include "smtp.h"
5 5cdb1798 2005-10-29 devnull #include <ctype.h>
7 5cdb1798 2005-10-29 devnull char *yylp; /* next character to be lex'd */
8 5cdb1798 2005-10-29 devnull int yydone; /* tell yylex to give up */
9 5cdb1798 2005-10-29 devnull char *yybuffer; /* first parsed character */
10 5cdb1798 2005-10-29 devnull char *yyend; /* end of buffer to be parsed */
11 5cdb1798 2005-10-29 devnull Node *root;
12 5cdb1798 2005-10-29 devnull Field *firstfield;
13 5cdb1798 2005-10-29 devnull Field *lastfield;
14 5cdb1798 2005-10-29 devnull Node *usender;
15 5cdb1798 2005-10-29 devnull Node *usys;
16 5cdb1798 2005-10-29 devnull Node *udate;
17 5cdb1798 2005-10-29 devnull char *startfield, *endfield;
18 5cdb1798 2005-10-29 devnull int originator;
19 5cdb1798 2005-10-29 devnull int destination;
20 5cdb1798 2005-10-29 devnull int date;
21 5cdb1798 2005-10-29 devnull int received;
22 5cdb1798 2005-10-29 devnull int messageid;
23 5cdb1798 2005-10-29 devnull extern int yyerrflag;
24 5cdb1798 2005-10-29 devnull #ifndef YYMAXDEPTH
25 5cdb1798 2005-10-29 devnull #define YYMAXDEPTH 150
27 5cdb1798 2005-10-29 devnull #ifndef YYSTYPE
28 5cdb1798 2005-10-29 devnull #define YYSTYPE int
30 5cdb1798 2005-10-29 devnull YYSTYPE yylval;
31 5cdb1798 2005-10-29 devnull YYSTYPE yyval;
32 5cdb1798 2005-10-29 devnull #define WORD 57346
33 5cdb1798 2005-10-29 devnull #define DATE 57347
34 5cdb1798 2005-10-29 devnull #define RESENT_DATE 57348
35 5cdb1798 2005-10-29 devnull #define RETURN_PATH 57349
36 5cdb1798 2005-10-29 devnull #define FROM 57350
37 5cdb1798 2005-10-29 devnull #define SENDER 57351
38 5cdb1798 2005-10-29 devnull #define REPLY_TO 57352
39 5cdb1798 2005-10-29 devnull #define RESENT_FROM 57353
40 5cdb1798 2005-10-29 devnull #define RESENT_SENDER 57354
41 5cdb1798 2005-10-29 devnull #define RESENT_REPLY_TO 57355
42 5cdb1798 2005-10-29 devnull #define SUBJECT 57356
43 5cdb1798 2005-10-29 devnull #define TO 57357
44 5cdb1798 2005-10-29 devnull #define CC 57358
45 5cdb1798 2005-10-29 devnull #define BCC 57359
46 5cdb1798 2005-10-29 devnull #define RESENT_TO 57360
47 5cdb1798 2005-10-29 devnull #define RESENT_CC 57361
48 5cdb1798 2005-10-29 devnull #define RESENT_BCC 57362
49 5cdb1798 2005-10-29 devnull #define REMOTE 57363
50 5cdb1798 2005-10-29 devnull #define PRECEDENCE 57364
51 5cdb1798 2005-10-29 devnull #define MIMEVERSION 57365
52 5cdb1798 2005-10-29 devnull #define CONTENTTYPE 57366
53 5cdb1798 2005-10-29 devnull #define MESSAGEID 57367
54 5cdb1798 2005-10-29 devnull #define RECEIVED 57368
55 5cdb1798 2005-10-29 devnull #define MAILER 57369
56 5cdb1798 2005-10-29 devnull #define BADTOKEN 57370
57 5cdb1798 2005-10-29 devnull #define YYEOFCODE 1
58 5cdb1798 2005-10-29 devnull #define YYERRCODE 2
60 5cdb1798 2005-10-29 devnull #line 246 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
64 5cdb1798 2005-10-29 devnull * Initialize the parsing. Done once for each header field.
67 5cdb1798 2005-10-29 devnull yyinit(char *p, int len)
69 5cdb1798 2005-10-29 devnull yybuffer = p;
70 5cdb1798 2005-10-29 devnull yylp = p;
71 5cdb1798 2005-10-29 devnull yyend = p + len;
72 5cdb1798 2005-10-29 devnull firstfield = lastfield = 0;
73 5cdb1798 2005-10-29 devnull received = 0;
77 5cdb1798 2005-10-29 devnull * keywords identifying header fields we care about
79 5cdb1798 2005-10-29 devnull typedef struct Keyword Keyword;
80 5cdb1798 2005-10-29 devnull struct Keyword {
81 5cdb1798 2005-10-29 devnull char *rep;
85 5cdb1798 2005-10-29 devnull /* field names that we need to recognize */
86 5cdb1798 2005-10-29 devnull Keyword key[] = {
87 5cdb1798 2005-10-29 devnull { "date", DATE },
88 5cdb1798 2005-10-29 devnull { "resent-date", RESENT_DATE },
89 5cdb1798 2005-10-29 devnull { "return_path", RETURN_PATH },
90 5cdb1798 2005-10-29 devnull { "from", FROM },
91 5cdb1798 2005-10-29 devnull { "sender", SENDER },
92 5cdb1798 2005-10-29 devnull { "reply-to", REPLY_TO },
93 5cdb1798 2005-10-29 devnull { "resent-from", RESENT_FROM },
94 5cdb1798 2005-10-29 devnull { "resent-sender", RESENT_SENDER },
95 5cdb1798 2005-10-29 devnull { "resent-reply-to", RESENT_REPLY_TO },
96 5cdb1798 2005-10-29 devnull { "to", TO },
97 5cdb1798 2005-10-29 devnull { "cc", CC },
98 5cdb1798 2005-10-29 devnull { "bcc", BCC },
99 5cdb1798 2005-10-29 devnull { "resent-to", RESENT_TO },
100 5cdb1798 2005-10-29 devnull { "resent-cc", RESENT_CC },
101 5cdb1798 2005-10-29 devnull { "resent-bcc", RESENT_BCC },
102 5cdb1798 2005-10-29 devnull { "remote", REMOTE },
103 5cdb1798 2005-10-29 devnull { "subject", SUBJECT },
104 5cdb1798 2005-10-29 devnull { "precedence", PRECEDENCE },
105 5cdb1798 2005-10-29 devnull { "mime-version", MIMEVERSION },
106 5cdb1798 2005-10-29 devnull { "content-type", CONTENTTYPE },
107 5cdb1798 2005-10-29 devnull { "message-id", MESSAGEID },
108 5cdb1798 2005-10-29 devnull { "received", RECEIVED },
109 5cdb1798 2005-10-29 devnull { "mailer", MAILER },
110 5cdb1798 2005-10-29 devnull { "who-the-hell-cares", WORD }
114 5cdb1798 2005-10-29 devnull * Lexical analysis for an rfc822 header field. Continuation lines
115 5cdb1798 2005-10-29 devnull * are handled in yywhite() when skipping over white space.
119 5cdb1798 2005-10-29 devnull yylex(void)
121 5cdb1798 2005-10-29 devnull String *t;
122 5cdb1798 2005-10-29 devnull int quoting;
123 5cdb1798 2005-10-29 devnull int escaping;
124 5cdb1798 2005-10-29 devnull char *start;
125 5cdb1798 2005-10-29 devnull Keyword *kp;
126 5cdb1798 2005-10-29 devnull int c, d;
128 5cdb1798 2005-10-29 devnull /* print("lexing\n"); /**/
129 5cdb1798 2005-10-29 devnull if(yylp >= yyend)
130 5cdb1798 2005-10-29 devnull return 0;
131 5cdb1798 2005-10-29 devnull if(yydone)
132 5cdb1798 2005-10-29 devnull return 0;
134 5cdb1798 2005-10-29 devnull quoting = escaping = 0;
135 5cdb1798 2005-10-29 devnull start = yylp;
136 5cdb1798 2005-10-29 devnull yylval = malloc(sizeof(Node));
137 5cdb1798 2005-10-29 devnull yylval->white = yylval->s = 0;
138 5cdb1798 2005-10-29 devnull yylval->next = 0;
139 5cdb1798 2005-10-29 devnull yylval->addr = 0;
140 5cdb1798 2005-10-29 devnull yylval->start = yylp;
141 5cdb1798 2005-10-29 devnull for(t = 0; yylp < yyend; yylp++){
142 5cdb1798 2005-10-29 devnull c = *yylp & 0xff;
144 5cdb1798 2005-10-29 devnull /* dump nulls, they can't be in header */
145 5cdb1798 2005-10-29 devnull if(c == 0)
146 5cdb1798 2005-10-29 devnull continue;
148 5cdb1798 2005-10-29 devnull if(escaping) {
149 5cdb1798 2005-10-29 devnull escaping = 0;
150 5cdb1798 2005-10-29 devnull } else if(quoting) {
151 5cdb1798 2005-10-29 devnull switch(c){
152 5cdb1798 2005-10-29 devnull case '\\':
153 5cdb1798 2005-10-29 devnull escaping = 1;
155 5cdb1798 2005-10-29 devnull case '\n':
156 5cdb1798 2005-10-29 devnull d = (*(yylp+1))&0xff;
157 5cdb1798 2005-10-29 devnull if(d != ' ' && d != '\t'){
158 5cdb1798 2005-10-29 devnull quoting = 0;
160 5cdb1798 2005-10-29 devnull continue;
163 5cdb1798 2005-10-29 devnull case '"':
164 5cdb1798 2005-10-29 devnull quoting = 0;
167 5cdb1798 2005-10-29 devnull } else {
168 5cdb1798 2005-10-29 devnull switch(c){
169 5cdb1798 2005-10-29 devnull case '\\':
170 5cdb1798 2005-10-29 devnull escaping = 1;
172 5cdb1798 2005-10-29 devnull case '(':
173 5cdb1798 2005-10-29 devnull case ' ':
174 5cdb1798 2005-10-29 devnull case '\t':
175 5cdb1798 2005-10-29 devnull case '\r':
176 5cdb1798 2005-10-29 devnull goto out;
177 5cdb1798 2005-10-29 devnull case '\n':
178 5cdb1798 2005-10-29 devnull if(yylp == start){
180 5cdb1798 2005-10-29 devnull /* print("lex(c %c)\n", c); /**/
181 5cdb1798 2005-10-29 devnull yylval->end = yylp;
182 5cdb1798 2005-10-29 devnull return yylval->c = c;
184 5cdb1798 2005-10-29 devnull goto out;
185 5cdb1798 2005-10-29 devnull case '@':
186 5cdb1798 2005-10-29 devnull case '>':
187 5cdb1798 2005-10-29 devnull case '<':
188 5cdb1798 2005-10-29 devnull case ':':
189 5cdb1798 2005-10-29 devnull case ',':
190 5cdb1798 2005-10-29 devnull case ';':
191 5cdb1798 2005-10-29 devnull if(yylp == start){
193 5cdb1798 2005-10-29 devnull yylval->white = yywhite();
194 5cdb1798 2005-10-29 devnull /* print("lex(c %c)\n", c); /**/
195 5cdb1798 2005-10-29 devnull yylval->end = yylp;
196 5cdb1798 2005-10-29 devnull return yylval->c = c;
198 5cdb1798 2005-10-29 devnull goto out;
199 5cdb1798 2005-10-29 devnull case '"':
200 5cdb1798 2005-10-29 devnull quoting = 1;
202 5cdb1798 2005-10-29 devnull default:
206 5cdb1798 2005-10-29 devnull if(t == 0)
207 5cdb1798 2005-10-29 devnull t = s_new();
208 5cdb1798 2005-10-29 devnull s_putc(t, c);
211 5cdb1798 2005-10-29 devnull yylval->white = yywhite();
213 5cdb1798 2005-10-29 devnull s_terminate(t);
214 5cdb1798 2005-10-29 devnull } else /* message begins with white-space! */
215 5cdb1798 2005-10-29 devnull return yylval->c = '\n';
216 5cdb1798 2005-10-29 devnull yylval->s = t;
217 5cdb1798 2005-10-29 devnull for(kp = key; kp->val != WORD; kp++)
218 5cdb1798 2005-10-29 devnull if(cistrcmp(s_to_c(t), kp->rep)==0)
220 5cdb1798 2005-10-29 devnull /* print("lex(%d) %s\n", kp->val-WORD, s_to_c(t)); /**/
221 5cdb1798 2005-10-29 devnull yylval->end = yylp;
222 5cdb1798 2005-10-29 devnull return yylval->c = kp->val;
226 5cdb1798 2005-10-29 devnull yyerror(char *x)
228 5cdb1798 2005-10-29 devnull USED(x);
230 5cdb1798 2005-10-29 devnull /*fprint(2, "parse err: %s\n", x);/**/
234 5cdb1798 2005-10-29 devnull * parse white space and comments
236 5cdb1798 2005-10-29 devnull String *
237 5cdb1798 2005-10-29 devnull yywhite(void)
239 5cdb1798 2005-10-29 devnull String *w;
240 5cdb1798 2005-10-29 devnull int clevel;
242 5cdb1798 2005-10-29 devnull int escaping;
244 5cdb1798 2005-10-29 devnull escaping = clevel = 0;
245 5cdb1798 2005-10-29 devnull for(w = 0; yylp < yyend; yylp++){
246 5cdb1798 2005-10-29 devnull c = *yylp & 0xff;
248 5cdb1798 2005-10-29 devnull /* dump nulls, they can't be in header */
249 5cdb1798 2005-10-29 devnull if(c == 0)
250 5cdb1798 2005-10-29 devnull continue;
252 5cdb1798 2005-10-29 devnull if(escaping){
253 5cdb1798 2005-10-29 devnull escaping = 0;
254 5cdb1798 2005-10-29 devnull } else if(clevel) {
255 5cdb1798 2005-10-29 devnull switch(c){
256 5cdb1798 2005-10-29 devnull case '\n':
258 5cdb1798 2005-10-29 devnull * look for multiline fields
260 5cdb1798 2005-10-29 devnull if(*(yylp+1)==' ' || *(yylp+1)=='\t')
263 5cdb1798 2005-10-29 devnull goto out;
264 5cdb1798 2005-10-29 devnull case '\\':
265 5cdb1798 2005-10-29 devnull escaping = 1;
267 5cdb1798 2005-10-29 devnull case '(':
268 5cdb1798 2005-10-29 devnull clevel++;
270 5cdb1798 2005-10-29 devnull case ')':
271 5cdb1798 2005-10-29 devnull clevel--;
274 5cdb1798 2005-10-29 devnull } else {
275 5cdb1798 2005-10-29 devnull switch(c){
276 5cdb1798 2005-10-29 devnull case '\\':
277 5cdb1798 2005-10-29 devnull escaping = 1;
279 5cdb1798 2005-10-29 devnull case '(':
280 5cdb1798 2005-10-29 devnull clevel++;
282 5cdb1798 2005-10-29 devnull case ' ':
283 5cdb1798 2005-10-29 devnull case '\t':
284 5cdb1798 2005-10-29 devnull case '\r':
286 5cdb1798 2005-10-29 devnull case '\n':
288 5cdb1798 2005-10-29 devnull * look for multiline fields
290 5cdb1798 2005-10-29 devnull if(*(yylp+1)==' ' || *(yylp+1)=='\t')
293 5cdb1798 2005-10-29 devnull goto out;
294 5cdb1798 2005-10-29 devnull default:
295 5cdb1798 2005-10-29 devnull goto out;
298 5cdb1798 2005-10-29 devnull if(w == 0)
299 5cdb1798 2005-10-29 devnull w = s_new();
300 5cdb1798 2005-10-29 devnull s_putc(w, c);
304 5cdb1798 2005-10-29 devnull s_terminate(w);
305 5cdb1798 2005-10-29 devnull return w;
309 5cdb1798 2005-10-29 devnull * link two parsed entries together
312 5cdb1798 2005-10-29 devnull link2(Node *p1, Node *p2)
314 5cdb1798 2005-10-29 devnull Node *p;
316 5cdb1798 2005-10-29 devnull for(p = p1; p->next; p = p->next)
318 5cdb1798 2005-10-29 devnull p->next = p2;
319 5cdb1798 2005-10-29 devnull return p1;
323 5cdb1798 2005-10-29 devnull * link three parsed entries together
326 5cdb1798 2005-10-29 devnull link3(Node *p1, Node *p2, Node *p3)
328 5cdb1798 2005-10-29 devnull Node *p;
330 5cdb1798 2005-10-29 devnull for(p = p2; p->next; p = p->next)
332 5cdb1798 2005-10-29 devnull p->next = p3;
334 5cdb1798 2005-10-29 devnull for(p = p1; p->next; p = p->next)
336 5cdb1798 2005-10-29 devnull p->next = p2;
338 5cdb1798 2005-10-29 devnull return p1;
342 5cdb1798 2005-10-29 devnull * make a:b, move all white space after both
345 5cdb1798 2005-10-29 devnull colon(Node *p1, Node *p2)
347 5cdb1798 2005-10-29 devnull if(p1->white){
348 5cdb1798 2005-10-29 devnull if(p2->white)
349 5cdb1798 2005-10-29 devnull s_append(p1->white, s_to_c(p2->white));
350 5cdb1798 2005-10-29 devnull } else {
351 5cdb1798 2005-10-29 devnull p1->white = p2->white;
352 5cdb1798 2005-10-29 devnull p2->white = 0;
355 5cdb1798 2005-10-29 devnull s_append(p1->s, ":");
356 5cdb1798 2005-10-29 devnull if(p2->s)
357 5cdb1798 2005-10-29 devnull s_append(p1->s, s_to_c(p2->s));
359 5cdb1798 2005-10-29 devnull if(p1->end < p2->end)
360 5cdb1798 2005-10-29 devnull p1->end = p2->end;
361 5cdb1798 2005-10-29 devnull freenode(p2);
362 5cdb1798 2005-10-29 devnull return p1;
366 5cdb1798 2005-10-29 devnull * concatenate two fields, move all white space after both
369 5cdb1798 2005-10-29 devnull concat(Node *p1, Node *p2)
371 5cdb1798 2005-10-29 devnull char buf[2];
373 5cdb1798 2005-10-29 devnull if(p1->white){
374 5cdb1798 2005-10-29 devnull if(p2->white)
375 5cdb1798 2005-10-29 devnull s_append(p1->white, s_to_c(p2->white));
376 5cdb1798 2005-10-29 devnull } else {
377 5cdb1798 2005-10-29 devnull p1->white = p2->white;
378 5cdb1798 2005-10-29 devnull p2->white = 0;
381 5cdb1798 2005-10-29 devnull if(p1->s == nil){
382 5cdb1798 2005-10-29 devnull buf[0] = p1->c;
383 5cdb1798 2005-10-29 devnull buf[1] = 0;
384 5cdb1798 2005-10-29 devnull p1->s = s_new();
385 5cdb1798 2005-10-29 devnull s_append(p1->s, buf);
388 5cdb1798 2005-10-29 devnull if(p2->s)
389 5cdb1798 2005-10-29 devnull s_append(p1->s, s_to_c(p2->s));
391 5cdb1798 2005-10-29 devnull buf[0] = p2->c;
392 5cdb1798 2005-10-29 devnull buf[1] = 0;
393 5cdb1798 2005-10-29 devnull s_append(p1->s, buf);
396 5cdb1798 2005-10-29 devnull if(p1->end < p2->end)
397 5cdb1798 2005-10-29 devnull p1->end = p2->end;
398 5cdb1798 2005-10-29 devnull freenode(p2);
399 5cdb1798 2005-10-29 devnull return p1;
403 5cdb1798 2005-10-29 devnull * look for disallowed chars in the field name
406 5cdb1798 2005-10-29 devnull badfieldname(Node *p)
408 5cdb1798 2005-10-29 devnull for(; p; p = p->next){
409 5cdb1798 2005-10-29 devnull /* field name can't contain white space */
410 5cdb1798 2005-10-29 devnull if(p->white && p->next)
411 5cdb1798 2005-10-29 devnull return 1;
413 5cdb1798 2005-10-29 devnull return 0;
417 5cdb1798 2005-10-29 devnull * mark as an address
420 5cdb1798 2005-10-29 devnull address(Node *p)
422 5cdb1798 2005-10-29 devnull p->addr = 1;
423 5cdb1798 2005-10-29 devnull return p;
427 5cdb1798 2005-10-29 devnull * case independent string compare
430 5cdb1798 2005-10-29 devnull cistrcmp(char *s1, char *s2)
432 5cdb1798 2005-10-29 devnull int c1, c2;
434 5cdb1798 2005-10-29 devnull for(; *s1; s1++, s2++){
435 5cdb1798 2005-10-29 devnull c1 = isupper(*s1) ? tolower(*s1) : *s1;
436 5cdb1798 2005-10-29 devnull c2 = isupper(*s2) ? tolower(*s2) : *s2;
437 5cdb1798 2005-10-29 devnull if (c1 != c2)
438 5cdb1798 2005-10-29 devnull return -1;
440 5cdb1798 2005-10-29 devnull return *s2;
444 5cdb1798 2005-10-29 devnull * free a node
447 5cdb1798 2005-10-29 devnull freenode(Node *p)
449 5cdb1798 2005-10-29 devnull Node *tp;
451 5cdb1798 2005-10-29 devnull while(p){
452 5cdb1798 2005-10-29 devnull tp = p->next;
453 5cdb1798 2005-10-29 devnull if(p->s)
454 5cdb1798 2005-10-29 devnull s_free(p->s);
455 5cdb1798 2005-10-29 devnull if(p->white)
456 5cdb1798 2005-10-29 devnull s_free(p->white);
457 5cdb1798 2005-10-29 devnull free(p);
464 5cdb1798 2005-10-29 devnull * an anonymous user
467 5cdb1798 2005-10-29 devnull nobody(Node *p)
469 5cdb1798 2005-10-29 devnull if(p->s)
470 5cdb1798 2005-10-29 devnull s_free(p->s);
471 5cdb1798 2005-10-29 devnull p->s = s_copy("pOsTmAsTeR");
472 5cdb1798 2005-10-29 devnull p->addr = 1;
473 5cdb1798 2005-10-29 devnull return p;
477 5cdb1798 2005-10-29 devnull * add anything that was dropped because of a parse error
480 5cdb1798 2005-10-29 devnull missing(Node *p)
482 5cdb1798 2005-10-29 devnull Node *np;
483 5cdb1798 2005-10-29 devnull char *start, *end;
484 5cdb1798 2005-10-29 devnull Field *f;
485 5cdb1798 2005-10-29 devnull String *s;
487 5cdb1798 2005-10-29 devnull start = yybuffer;
488 5cdb1798 2005-10-29 devnull if(lastfield != nil){
489 5cdb1798 2005-10-29 devnull for(np = lastfield->node; np; np = np->next)
490 5cdb1798 2005-10-29 devnull start = np->end+1;
493 5cdb1798 2005-10-29 devnull end = p->start-1;
495 5cdb1798 2005-10-29 devnull if(end <= start)
498 5cdb1798 2005-10-29 devnull if(strncmp(start, "From ", 5) == 0)
501 5cdb1798 2005-10-29 devnull np = malloc(sizeof(Node));
502 5cdb1798 2005-10-29 devnull np->start = start;
503 5cdb1798 2005-10-29 devnull np->end = end;
504 5cdb1798 2005-10-29 devnull np->white = nil;
505 5cdb1798 2005-10-29 devnull s = s_copy("BadHeader: ");
506 5cdb1798 2005-10-29 devnull np->s = s_nappend(s, start, end-start);
507 5cdb1798 2005-10-29 devnull np->next = nil;
509 5cdb1798 2005-10-29 devnull f = malloc(sizeof(Field));
510 5cdb1798 2005-10-29 devnull f->next = 0;
511 5cdb1798 2005-10-29 devnull f->node = np;
512 5cdb1798 2005-10-29 devnull f->source = 0;
513 5cdb1798 2005-10-29 devnull if(firstfield)
514 5cdb1798 2005-10-29 devnull lastfield->next = f;
516 5cdb1798 2005-10-29 devnull firstfield = f;
517 5cdb1798 2005-10-29 devnull lastfield = f;
521 5cdb1798 2005-10-29 devnull * create a new field
524 5cdb1798 2005-10-29 devnull newfield(Node *p, int source)
526 5cdb1798 2005-10-29 devnull Field *f;
528 5cdb1798 2005-10-29 devnull missing(p);
530 5cdb1798 2005-10-29 devnull f = malloc(sizeof(Field));
531 5cdb1798 2005-10-29 devnull f->next = 0;
532 5cdb1798 2005-10-29 devnull f->node = p;
533 5cdb1798 2005-10-29 devnull f->source = source;
534 5cdb1798 2005-10-29 devnull if(firstfield)
535 5cdb1798 2005-10-29 devnull lastfield->next = f;
537 5cdb1798 2005-10-29 devnull firstfield = f;
538 5cdb1798 2005-10-29 devnull lastfield = f;
539 5cdb1798 2005-10-29 devnull endfield = startfield;
540 5cdb1798 2005-10-29 devnull startfield = yylp;
544 5cdb1798 2005-10-29 devnull * fee a list of fields
547 5cdb1798 2005-10-29 devnull freefield(Field *f)
549 5cdb1798 2005-10-29 devnull Field *tf;
551 5cdb1798 2005-10-29 devnull while(f){
552 5cdb1798 2005-10-29 devnull tf = f->next;
553 5cdb1798 2005-10-29 devnull freenode(f->node);
554 5cdb1798 2005-10-29 devnull free(f);
560 5cdb1798 2005-10-29 devnull * add some white space to a node
563 5cdb1798 2005-10-29 devnull whiten(Node *p)
565 5cdb1798 2005-10-29 devnull Node *tp;
567 5cdb1798 2005-10-29 devnull for(tp = p; tp->next; tp = tp->next)
569 5cdb1798 2005-10-29 devnull if(tp->white == 0)
570 5cdb1798 2005-10-29 devnull tp->white = s_copy(" ");
571 5cdb1798 2005-10-29 devnull return p;
575 5cdb1798 2005-10-29 devnull yycleanup(void)
577 5cdb1798 2005-10-29 devnull Field *f, *fnext;
578 5cdb1798 2005-10-29 devnull Node *np, *next;
580 5cdb1798 2005-10-29 devnull for(f = firstfield; f; f = fnext){
581 5cdb1798 2005-10-29 devnull for(np = f->node; np; np = next){
582 5cdb1798 2005-10-29 devnull if(np->s)
583 5cdb1798 2005-10-29 devnull s_free(np->s);
584 5cdb1798 2005-10-29 devnull if(np->white)
585 5cdb1798 2005-10-29 devnull s_free(np->white);
586 5cdb1798 2005-10-29 devnull next = np->next;
587 5cdb1798 2005-10-29 devnull free(np);
589 5cdb1798 2005-10-29 devnull fnext = f->next;
590 5cdb1798 2005-10-29 devnull free(f);
592 5cdb1798 2005-10-29 devnull firstfield = lastfield = 0;
594 5cdb1798 2005-10-29 devnull static const short yyexca[] =
601 5cdb1798 2005-10-29 devnull -1, 112,
608 5cdb1798 2005-10-29 devnull #define YYNPROD 122
609 5cdb1798 2005-10-29 devnull #define YYPRIVATE 57344
610 5cdb1798 2005-10-29 devnull #define YYLAST 608
611 5cdb1798 2005-10-29 devnull static const short yyact[] =
613 5cdb1798 2005-10-29 devnull 112, 133, 136, 53, 121, 111, 134, 55, 109, 118,
614 5cdb1798 2005-10-29 devnull 119, 116, 162, 171, 35, 48, 166, 54, 5, 166,
615 5cdb1798 2005-10-29 devnull 179, 114, 115, 155, 49, 101, 100, 99, 95, 94,
616 5cdb1798 2005-10-29 devnull 93, 92, 98, 91, 132, 90, 123, 89, 122, 88,
617 5cdb1798 2005-10-29 devnull 87, 86, 85, 84, 83, 82, 97, 81, 80, 106,
618 5cdb1798 2005-10-29 devnull 47, 46, 110, 117, 153, 168, 108, 2, 56, 57,
619 5cdb1798 2005-10-29 devnull 58, 59, 60, 61, 62, 63, 64, 65, 73, 66,
620 5cdb1798 2005-10-29 devnull 67, 68, 69, 70, 71, 72, 74, 75, 76, 77,
621 5cdb1798 2005-10-29 devnull 78, 79, 124, 124, 49, 55, 177, 131, 110, 52,
622 5cdb1798 2005-10-29 devnull 110, 110, 138, 137, 140, 141, 124, 124, 51, 120,
623 5cdb1798 2005-10-29 devnull 124, 124, 124, 50, 102, 104, 135, 154, 31, 32,
624 5cdb1798 2005-10-29 devnull 107, 157, 105, 14, 55, 55, 156, 13, 161, 117,
625 5cdb1798 2005-10-29 devnull 117, 139, 158, 124, 142, 143, 144, 145, 146, 147,
626 5cdb1798 2005-10-29 devnull 163, 164, 160, 12, 148, 149, 11, 157, 150, 151,
627 5cdb1798 2005-10-29 devnull 152, 10, 156, 9, 8, 7, 3, 1, 0, 124,
628 5cdb1798 2005-10-29 devnull 124, 124, 124, 124, 0, 169, 0, 0, 110, 165,
629 5cdb1798 2005-10-29 devnull 0, 0, 170, 117, 0, 0, 0, 0, 173, 176,
630 5cdb1798 2005-10-29 devnull 178, 0, 0, 0, 172, 0, 0, 0, 180, 0,
631 5cdb1798 2005-10-29 devnull 0, 182, 183, 0, 0, 165, 165, 165, 165, 165,
632 5cdb1798 2005-10-29 devnull 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
633 5cdb1798 2005-10-29 devnull 0, 0, 174, 56, 57, 58, 59, 60, 61, 62,
634 5cdb1798 2005-10-29 devnull 63, 64, 65, 73, 66, 67, 68, 69, 70, 71,
635 5cdb1798 2005-10-29 devnull 72, 74, 75, 76, 77, 78, 79, 0, 0, 128,
636 5cdb1798 2005-10-29 devnull 130, 129, 125, 126, 127, 15, 0, 36, 16, 17,
637 5cdb1798 2005-10-29 devnull 19, 103, 20, 18, 23, 22, 21, 30, 24, 26,
638 5cdb1798 2005-10-29 devnull 28, 25, 27, 29, 0, 34, 37, 38, 39, 33,
639 5cdb1798 2005-10-29 devnull 40, 0, 4, 0, 45, 44, 41, 42, 43, 56,
640 5cdb1798 2005-10-29 devnull 57, 58, 59, 60, 61, 62, 63, 64, 65, 73,
641 5cdb1798 2005-10-29 devnull 66, 67, 68, 69, 70, 71, 72, 74, 75, 76,
642 5cdb1798 2005-10-29 devnull 77, 78, 79, 0, 0, 96, 45, 44, 41, 42,
643 5cdb1798 2005-10-29 devnull 43, 15, 0, 36, 16, 17, 19, 6, 20, 18,
644 5cdb1798 2005-10-29 devnull 23, 22, 21, 30, 24, 26, 28, 25, 27, 29,
645 5cdb1798 2005-10-29 devnull 0, 34, 37, 38, 39, 33, 40, 0, 4, 0,
646 5cdb1798 2005-10-29 devnull 45, 44, 41, 42, 43, 15, 0, 36, 16, 17,
647 5cdb1798 2005-10-29 devnull 19, 103, 20, 18, 23, 22, 21, 30, 24, 26,
648 5cdb1798 2005-10-29 devnull 28, 25, 27, 29, 0, 34, 37, 38, 39, 33,
649 5cdb1798 2005-10-29 devnull 40, 0, 0, 0, 45, 44, 41, 42, 43, 56,
650 5cdb1798 2005-10-29 devnull 57, 58, 59, 60, 61, 62, 63, 64, 65, 73,
651 5cdb1798 2005-10-29 devnull 66, 67, 68, 69, 70, 71, 72, 74, 75, 76,
652 5cdb1798 2005-10-29 devnull 77, 78, 79, 0, 0, 0, 0, 175, 113, 0,
653 5cdb1798 2005-10-29 devnull 52, 56, 57, 58, 59, 60, 61, 62, 63, 64,
654 5cdb1798 2005-10-29 devnull 65, 73, 66, 67, 68, 69, 70, 71, 72, 74,
655 5cdb1798 2005-10-29 devnull 75, 76, 77, 78, 79, 0, 0, 0, 0, 0,
656 5cdb1798 2005-10-29 devnull 113, 0, 52, 56, 57, 58, 59, 60, 61, 62,
657 5cdb1798 2005-10-29 devnull 63, 64, 65, 73, 66, 67, 68, 69, 70, 71,
658 5cdb1798 2005-10-29 devnull 72, 74, 75, 76, 77, 78, 79, 0, 0, 0,
659 5cdb1798 2005-10-29 devnull 0, 0, 0, 159, 52, 56, 57, 58, 59, 60,
660 5cdb1798 2005-10-29 devnull 61, 62, 63, 64, 65, 73, 66, 67, 68, 69,
661 5cdb1798 2005-10-29 devnull 70, 71, 72, 74, 75, 76, 77, 78, 79, 0,
662 5cdb1798 2005-10-29 devnull 0, 0, 0, 0, 0, 0, 52, 56, 57, 58,
663 5cdb1798 2005-10-29 devnull 59, 60, 61, 62, 63, 64, 65, 73, 66, 67,
664 5cdb1798 2005-10-29 devnull 68, 69, 70, 71, 72, 74, 75, 76, 77, 78,
665 5cdb1798 2005-10-29 devnull 79, 0, 0, 167, 0, 0, 113, 56, 57, 58,
666 5cdb1798 2005-10-29 devnull 59, 60, 61, 62, 63, 64, 65, 73, 66, 67,
667 5cdb1798 2005-10-29 devnull 68, 69, 70, 71, 72, 74, 75, 76, 77, 78,
668 5cdb1798 2005-10-29 devnull 79, 0, 0, 0, 0, 0, 113, 56, 57, 58,
669 5cdb1798 2005-10-29 devnull 59, 60, 61, 62, 63, 64, 65, 73, 66, 67,
670 5cdb1798 2005-10-29 devnull 68, 69, 70, 71, 72, 74, 75, 76, 77, 78,
671 5cdb1798 2005-10-29 devnull 79, 0, 0, 181, 56, 57, 58, 59, 60, 61,
672 5cdb1798 2005-10-29 devnull 62, 63, 64, 65, 73, 66, 67, 68, 69, 70,
673 5cdb1798 2005-10-29 devnull 71, 72, 74, 75, 76, 77, 78, 79
675 5cdb1798 2005-10-29 devnull static const short yypact[] =
677 5cdb1798 2005-10-29 devnull 299,-1000,-1000, 22,-1000, 21, 54,-1000,-1000,-1000,
678 5cdb1798 2005-10-29 devnull -1000,-1000,-1000,-1000,-1000, 19, 17, 15, 14, 13,
679 5cdb1798 2005-10-29 devnull 12, 11, 10, 9, 7, 5, 3, 1, 0, -1,
680 5cdb1798 2005-10-29 devnull -2, 265, -3, -4, -5,-1000,-1000,-1000,-1000,-1000,
681 5cdb1798 2005-10-29 devnull -1000,-1000,-1000,-1000,-1000,-1000, 233, 233, 580, 397,
682 5cdb1798 2005-10-29 devnull -9,-1000, 580, -26, -25,-1000,-1000,-1000,-1000,-1000,
683 5cdb1798 2005-10-29 devnull -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
684 5cdb1798 2005-10-29 devnull -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
685 5cdb1798 2005-10-29 devnull 333, 199, 199, 397, 461, 397, 397, 397, 397, 397,
686 5cdb1798 2005-10-29 devnull 397, 397, 397, 397, 397, 199, 199,-1000,-1000, 199,
687 5cdb1798 2005-10-29 devnull 199, 199,-1000, -6,-1000, 33, 580, -8,-1000,-1000,
688 5cdb1798 2005-10-29 devnull 523,-1000,-1000, 429, 580, -23,-1000,-1000, 580, 580,
689 5cdb1798 2005-10-29 devnull -1000,-1000, 199,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
690 5cdb1798 2005-10-29 devnull -1000,-1000, -15,-1000,-1000,-1000, 493,-1000,-1000, -15,
691 5cdb1798 2005-10-29 devnull -1000,-1000, -15, -15, -15, -15, -15, -15, 199, 199,
692 5cdb1798 2005-10-29 devnull 199, 199, 199, 47, 580, 397,-1000,-1000, -21,-1000,
693 5cdb1798 2005-10-29 devnull -25, -26, 580,-1000,-1000,-1000, 397, 365, 580, 580,
694 5cdb1798 2005-10-29 devnull -1000,-1000,-1000,-1000, -12,-1000,-1000, 553,-1000,-1000,
695 5cdb1798 2005-10-29 devnull 580, 580,-1000,-1000
697 5cdb1798 2005-10-29 devnull static const short yypgo[] =
699 5cdb1798 2005-10-29 devnull 0, 147, 57, 146, 18, 145, 144, 143, 141, 136,
700 5cdb1798 2005-10-29 devnull 133, 117, 113, 8, 112, 0, 34, 110, 6, 4,
701 5cdb1798 2005-10-29 devnull 38, 109, 108, 1, 106, 2, 5, 103, 17, 98,
702 5cdb1798 2005-10-29 devnull 11, 3, 36, 86, 14
704 5cdb1798 2005-10-29 devnull static const short yyr1[] =
706 5cdb1798 2005-10-29 devnull 0, 1, 1, 2, 2, 2, 4, 4, 4, 4,
707 5cdb1798 2005-10-29 devnull 4, 4, 4, 4, 4, 3, 6, 6, 6, 6,
708 5cdb1798 2005-10-29 devnull 6, 6, 6, 5, 5, 7, 7, 7, 7, 7,
709 5cdb1798 2005-10-29 devnull 7, 7, 7, 7, 7, 7, 7, 8, 8, 11,
710 5cdb1798 2005-10-29 devnull 11, 12, 12, 10, 10, 21, 21, 21, 21, 9,
711 5cdb1798 2005-10-29 devnull 9, 16, 16, 23, 23, 24, 24, 17, 17, 18,
712 5cdb1798 2005-10-29 devnull 18, 18, 26, 26, 13, 13, 27, 27, 29, 29,
713 5cdb1798 2005-10-29 devnull 28, 28, 31, 30, 25, 25, 20, 20, 32, 32,
714 5cdb1798 2005-10-29 devnull 32, 32, 32, 32, 32, 19, 14, 33, 33, 15,
715 5cdb1798 2005-10-29 devnull 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
716 5cdb1798 2005-10-29 devnull 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
717 5cdb1798 2005-10-29 devnull 15, 15, 15, 22, 22, 22, 22, 34, 34, 34,
720 5cdb1798 2005-10-29 devnull static const short yyr2[] =
722 5cdb1798 2005-10-29 devnull 0, 1, 3, 1, 2, 3, 1, 1, 1, 1,
723 5cdb1798 2005-10-29 devnull 1, 1, 1, 1, 3, 6, 3, 3, 3, 3,
724 5cdb1798 2005-10-29 devnull 3, 3, 3, 3, 3, 2, 3, 2, 3, 2,
725 5cdb1798 2005-10-29 devnull 3, 2, 3, 2, 3, 2, 3, 3, 2, 3,
726 5cdb1798 2005-10-29 devnull 2, 3, 2, 3, 2, 1, 1, 1, 1, 3,
727 5cdb1798 2005-10-29 devnull 2, 1, 3, 1, 1, 4, 3, 1, 3, 1,
728 5cdb1798 2005-10-29 devnull 2, 1, 3, 2, 3, 1, 2, 4, 1, 1,
729 5cdb1798 2005-10-29 devnull 3, 3, 1, 1, 1, 2, 1, 2, 1, 1,
730 5cdb1798 2005-10-29 devnull 1, 1, 1, 1, 1, 1, 6, 1, 3, 1,
731 5cdb1798 2005-10-29 devnull 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
732 5cdb1798 2005-10-29 devnull 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
733 5cdb1798 2005-10-29 devnull 1, 1, 1, 1, 1, 2, 2, 1, 1, 1,
736 5cdb1798 2005-10-29 devnull static const short yychk[] =
738 5cdb1798 2005-10-29 devnull -1000, -1, -2, -3, 29, -4, 8, -5, -6, -7,
739 5cdb1798 2005-10-29 devnull -8, -9, -10, -11, -12, 2, 5, 6, 10, 7,
740 5cdb1798 2005-10-29 devnull 9, 13, 12, 11, 15, 18, 16, 19, 17, 20,
741 5cdb1798 2005-10-29 devnull 14, -22, -21, 26, 22, -34, 4, 23, 24, 25,
742 5cdb1798 2005-10-29 devnull 27, 33, 34, 35, 32, 31, 29, 29, -13, 30,
743 5cdb1798 2005-10-29 devnull -27, -29, 35, -31, -28, -15, 4, 5, 6, 7,
744 5cdb1798 2005-10-29 devnull 8, 9, 10, 11, 12, 13, 15, 16, 17, 18,
745 5cdb1798 2005-10-29 devnull 19, 20, 21, 14, 22, 23, 24, 25, 26, 27,
746 5cdb1798 2005-10-29 devnull 29, 30, 30, 30, 30, 30, 30, 30, 30, 30,
747 5cdb1798 2005-10-29 devnull 30, 30, 30, 30, 30, 30, 30, -34, -15, 30,
748 5cdb1798 2005-10-29 devnull 30, 30, -2, 8, -2, -14, -15, -17, -18, -13,
749 5cdb1798 2005-10-29 devnull -25, -26, -15, 33, 30, 31, -30, -15, 35, 35,
750 5cdb1798 2005-10-29 devnull -4, -19, -20, -32, -15, 33, 34, 35, 30, 32,
751 5cdb1798 2005-10-29 devnull 31, -19, -16, -23, -18, -24, -25, -13, -18, -16,
752 5cdb1798 2005-10-29 devnull -18, -18, -16, -16, -16, -16, -16, -16, -20, -20,
753 5cdb1798 2005-10-29 devnull -20, -20, -20, 21, -15, 31, -26, -15, -13, 34,
754 5cdb1798 2005-10-29 devnull -28, -31, 35, -30, -30, -32, 31, 30, 8, -15,
755 5cdb1798 2005-10-29 devnull -18, 34, -30, -23, -16, 32, -15, -33, -15, 32,
756 5cdb1798 2005-10-29 devnull -15, 30, -15, -15
758 5cdb1798 2005-10-29 devnull static const short yydef[] =
760 5cdb1798 2005-10-29 devnull 0, -2, 1, 0, 3, 0, 0, 6, 7, 8,
761 5cdb1798 2005-10-29 devnull 9, 10, 11, 12, 13, 0, 0, 0, 0, 0,
762 5cdb1798 2005-10-29 devnull 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
763 5cdb1798 2005-10-29 devnull 0, 0, 0, 0, 0, 113, 114, 45, 46, 47,
764 5cdb1798 2005-10-29 devnull 48, 117, 118, 119, 120, 121, 0, -2, 0, 0,
765 5cdb1798 2005-10-29 devnull 0, 65, 0, 68, 69, 72, 89, 90, 91, 92,
766 5cdb1798 2005-10-29 devnull 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
767 5cdb1798 2005-10-29 devnull 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
768 5cdb1798 2005-10-29 devnull 0, 0, 0, 0, 0, 0, 0, 0, 0, 25,
769 5cdb1798 2005-10-29 devnull 27, 29, 31, 33, 35, 38, 50, 115, 116, 44,
770 5cdb1798 2005-10-29 devnull 40, 42, 2, 0, 5, 0, 0, 18, 57, 59,
771 5cdb1798 2005-10-29 devnull 0, 61, -2, 0, 0, 0, 66, 73, 0, 0,
772 5cdb1798 2005-10-29 devnull 14, 23, 85, 76, 78, 79, 80, 81, 82, 83,
773 5cdb1798 2005-10-29 devnull 84, 24, 16, 51, 53, 54, 0, 17, 19, 20,
774 5cdb1798 2005-10-29 devnull 21, 22, 26, 28, 30, 32, 34, 36, 37, 49,
775 5cdb1798 2005-10-29 devnull 43, 39, 41, 0, 0, 0, 60, 75, 0, 63,
776 5cdb1798 2005-10-29 devnull 64, 0, 0, 70, 71, 77, 0, 0, 0, 0,
777 5cdb1798 2005-10-29 devnull 58, 62, 67, 52, 0, 56, 15, 0, 87, 55,
778 5cdb1798 2005-10-29 devnull 0, 0, 86, 88
780 5cdb1798 2005-10-29 devnull static const short yytok1[] =
782 5cdb1798 2005-10-29 devnull 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
783 5cdb1798 2005-10-29 devnull 29, 0, 0, 0, 0, 0, 0, 0, 0, 0,
784 5cdb1798 2005-10-29 devnull 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
785 5cdb1798 2005-10-29 devnull 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
786 5cdb1798 2005-10-29 devnull 0, 0, 0, 0, 31, 0, 0, 0, 0, 0,
787 5cdb1798 2005-10-29 devnull 0, 0, 0, 0, 0, 0, 0, 0, 30, 32,
788 5cdb1798 2005-10-29 devnull 33, 0, 34, 0, 35
790 5cdb1798 2005-10-29 devnull static const short yytok2[] =
792 5cdb1798 2005-10-29 devnull 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
793 5cdb1798 2005-10-29 devnull 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
794 5cdb1798 2005-10-29 devnull 22, 23, 24, 25, 26, 27, 28
796 5cdb1798 2005-10-29 devnull static const long yytok3[] =
800 5cdb1798 2005-10-29 devnull #define YYFLAG -1000
801 5cdb1798 2005-10-29 devnull #define YYERROR goto yyerrlab
802 5cdb1798 2005-10-29 devnull #define YYACCEPT return(0)
803 5cdb1798 2005-10-29 devnull #define YYABORT return(1)
804 5cdb1798 2005-10-29 devnull #define yyclearin yychar = -1
805 5cdb1798 2005-10-29 devnull #define yyerrok yyerrflag = 0
807 5cdb1798 2005-10-29 devnull #ifdef yydebug
808 5cdb1798 2005-10-29 devnull #include "y.debug"
810 5cdb1798 2005-10-29 devnull #define yydebug 0
811 5cdb1798 2005-10-29 devnull static const char* yytoknames[1]; /* for debugging */
812 5cdb1798 2005-10-29 devnull static const char* yystates[1]; /* for debugging */
815 5cdb1798 2005-10-29 devnull /* parser for yacc output */
816 5cdb1798 2005-10-29 devnull #ifdef YYARG
817 5cdb1798 2005-10-29 devnull #define yynerrs yyarg->yynerrs
818 5cdb1798 2005-10-29 devnull #define yyerrflag yyarg->yyerrflag
819 5cdb1798 2005-10-29 devnull #define yyval yyarg->yyval
820 5cdb1798 2005-10-29 devnull #define yylval yyarg->yylval
822 5cdb1798 2005-10-29 devnull int yynerrs = 0; /* number of errors */
823 5cdb1798 2005-10-29 devnull int yyerrflag = 0; /* error recovery flag */
826 5cdb1798 2005-10-29 devnull extern int fprint(int, char*, ...);
827 5cdb1798 2005-10-29 devnull extern int sprint(char*, char*, ...);
829 5cdb1798 2005-10-29 devnull static const char*
830 5cdb1798 2005-10-29 devnull yytokname(int yyc)
832 5cdb1798 2005-10-29 devnull static char x[10];
834 5cdb1798 2005-10-29 devnull if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0]))
835 5cdb1798 2005-10-29 devnull if(yytoknames[yyc-1])
836 5cdb1798 2005-10-29 devnull return yytoknames[yyc-1];
837 5cdb1798 2005-10-29 devnull sprint(x, "<%d>", yyc);
838 5cdb1798 2005-10-29 devnull return x;
841 5cdb1798 2005-10-29 devnull static const char*
842 5cdb1798 2005-10-29 devnull yystatname(int yys)
844 5cdb1798 2005-10-29 devnull static char x[10];
846 5cdb1798 2005-10-29 devnull if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0]))
847 5cdb1798 2005-10-29 devnull if(yystates[yys])
848 5cdb1798 2005-10-29 devnull return yystates[yys];
849 5cdb1798 2005-10-29 devnull sprint(x, "<%d>\n", yys);
850 5cdb1798 2005-10-29 devnull return x;
853 5cdb1798 2005-10-29 devnull static long
854 5cdb1798 2005-10-29 devnull #ifdef YYARG
855 5cdb1798 2005-10-29 devnull yylex1(struct Yyarg *yyarg)
857 5cdb1798 2005-10-29 devnull yylex1(void)
860 5cdb1798 2005-10-29 devnull long yychar;
861 5cdb1798 2005-10-29 devnull const long *t3p;
864 5cdb1798 2005-10-29 devnull #ifdef YYARG
865 5cdb1798 2005-10-29 devnull yychar = yylex(yyarg);
867 5cdb1798 2005-10-29 devnull yychar = yylex();
869 5cdb1798 2005-10-29 devnull if(yychar <= 0) {
870 5cdb1798 2005-10-29 devnull c = yytok1[0];
871 5cdb1798 2005-10-29 devnull goto out;
873 5cdb1798 2005-10-29 devnull if(yychar < sizeof(yytok1)/sizeof(yytok1[0])) {
874 5cdb1798 2005-10-29 devnull c = yytok1[yychar];
875 5cdb1798 2005-10-29 devnull goto out;
877 5cdb1798 2005-10-29 devnull if(yychar >= YYPRIVATE)
878 5cdb1798 2005-10-29 devnull if(yychar < YYPRIVATE+sizeof(yytok2)/sizeof(yytok2[0])) {
879 5cdb1798 2005-10-29 devnull c = yytok2[yychar-YYPRIVATE];
880 5cdb1798 2005-10-29 devnull goto out;
882 5cdb1798 2005-10-29 devnull for(t3p=yytok3;; t3p+=2) {
883 5cdb1798 2005-10-29 devnull c = t3p[0];
884 5cdb1798 2005-10-29 devnull if(c == yychar) {
885 5cdb1798 2005-10-29 devnull c = t3p[1];
886 5cdb1798 2005-10-29 devnull goto out;
888 5cdb1798 2005-10-29 devnull if(c == 0)
894 5cdb1798 2005-10-29 devnull if(c == 0)
895 5cdb1798 2005-10-29 devnull c = yytok2[1]; /* unknown char */
896 5cdb1798 2005-10-29 devnull if(yydebug >= 3)
897 5cdb1798 2005-10-29 devnull fprint(2, "lex %.4lux %s\n", yychar, yytokname(c));
898 5cdb1798 2005-10-29 devnull return c;
902 5cdb1798 2005-10-29 devnull #ifdef YYARG
903 5cdb1798 2005-10-29 devnull yyparse(struct Yyarg *yyarg)
905 5cdb1798 2005-10-29 devnull yyparse(void)
910 5cdb1798 2005-10-29 devnull YYSTYPE yyv;
911 5cdb1798 2005-10-29 devnull int yys;
912 5cdb1798 2005-10-29 devnull } yys[YYMAXDEPTH], *yyp, *yypt;
913 5cdb1798 2005-10-29 devnull const short *yyxi;
914 5cdb1798 2005-10-29 devnull int yyj, yym, yystate, yyn, yyg;
915 5cdb1798 2005-10-29 devnull long yychar;
916 5cdb1798 2005-10-29 devnull #ifndef YYARG
917 5cdb1798 2005-10-29 devnull YYSTYPE save1, save2;
918 5cdb1798 2005-10-29 devnull int save3, save4;
920 5cdb1798 2005-10-29 devnull save1 = yylval;
921 5cdb1798 2005-10-29 devnull save2 = yyval;
922 5cdb1798 2005-10-29 devnull save3 = yynerrs;
923 5cdb1798 2005-10-29 devnull save4 = yyerrflag;
926 5cdb1798 2005-10-29 devnull yystate = 0;
927 5cdb1798 2005-10-29 devnull yychar = -1;
928 5cdb1798 2005-10-29 devnull yynerrs = 0;
929 5cdb1798 2005-10-29 devnull yyerrflag = 0;
930 5cdb1798 2005-10-29 devnull yyp = &yys[-1];
931 5cdb1798 2005-10-29 devnull goto yystack;
934 5cdb1798 2005-10-29 devnull yyn = 0;
935 5cdb1798 2005-10-29 devnull goto ret;
938 5cdb1798 2005-10-29 devnull yyn = 1;
939 5cdb1798 2005-10-29 devnull goto ret;
942 5cdb1798 2005-10-29 devnull #ifndef YYARG
943 5cdb1798 2005-10-29 devnull yylval = save1;
944 5cdb1798 2005-10-29 devnull yyval = save2;
945 5cdb1798 2005-10-29 devnull yynerrs = save3;
946 5cdb1798 2005-10-29 devnull yyerrflag = save4;
948 5cdb1798 2005-10-29 devnull return yyn;
950 5cdb1798 2005-10-29 devnull yystack:
951 5cdb1798 2005-10-29 devnull /* put a state and value onto the stack */
952 5cdb1798 2005-10-29 devnull if(yydebug >= 4)
953 5cdb1798 2005-10-29 devnull fprint(2, "char %s in %s", yytokname(yychar), yystatname(yystate));
956 5cdb1798 2005-10-29 devnull if(yyp >= &yys[YYMAXDEPTH]) {
957 5cdb1798 2005-10-29 devnull yyerror("yacc stack overflow");
958 5cdb1798 2005-10-29 devnull goto ret1;
960 5cdb1798 2005-10-29 devnull yyp->yys = yystate;
961 5cdb1798 2005-10-29 devnull yyp->yyv = yyval;
963 5cdb1798 2005-10-29 devnull yynewstate:
964 5cdb1798 2005-10-29 devnull yyn = yypact[yystate];
965 5cdb1798 2005-10-29 devnull if(yyn <= YYFLAG)
966 5cdb1798 2005-10-29 devnull goto yydefault; /* simple state */
967 5cdb1798 2005-10-29 devnull if(yychar < 0)
968 5cdb1798 2005-10-29 devnull #ifdef YYARG
969 5cdb1798 2005-10-29 devnull yychar = yylex1(yyarg);
971 5cdb1798 2005-10-29 devnull yychar = yylex1();
973 5cdb1798 2005-10-29 devnull yyn += yychar;
974 5cdb1798 2005-10-29 devnull if(yyn < 0 || yyn >= YYLAST)
975 5cdb1798 2005-10-29 devnull goto yydefault;
976 5cdb1798 2005-10-29 devnull yyn = yyact[yyn];
977 5cdb1798 2005-10-29 devnull if(yychk[yyn] == yychar) { /* valid shift */
978 5cdb1798 2005-10-29 devnull yychar = -1;
979 5cdb1798 2005-10-29 devnull yyval = yylval;
980 5cdb1798 2005-10-29 devnull yystate = yyn;
981 5cdb1798 2005-10-29 devnull if(yyerrflag > 0)
982 5cdb1798 2005-10-29 devnull yyerrflag--;
983 5cdb1798 2005-10-29 devnull goto yystack;
986 5cdb1798 2005-10-29 devnull yydefault:
987 5cdb1798 2005-10-29 devnull /* default state action */
988 5cdb1798 2005-10-29 devnull yyn = yydef[yystate];
989 5cdb1798 2005-10-29 devnull if(yyn == -2) {
990 5cdb1798 2005-10-29 devnull if(yychar < 0)
991 5cdb1798 2005-10-29 devnull #ifdef YYARG
992 5cdb1798 2005-10-29 devnull yychar = yylex1(yyarg);
994 5cdb1798 2005-10-29 devnull yychar = yylex1();
997 5cdb1798 2005-10-29 devnull /* look through exception table */
998 5cdb1798 2005-10-29 devnull for(yyxi=yyexca;; yyxi+=2)
999 5cdb1798 2005-10-29 devnull if(yyxi[0] == -1 && yyxi[1] == yystate)
1001 5cdb1798 2005-10-29 devnull for(yyxi += 2;; yyxi += 2) {
1002 5cdb1798 2005-10-29 devnull yyn = yyxi[0];
1003 5cdb1798 2005-10-29 devnull if(yyn < 0 || yyn == yychar)
1006 5cdb1798 2005-10-29 devnull yyn = yyxi[1];
1007 5cdb1798 2005-10-29 devnull if(yyn < 0)
1008 5cdb1798 2005-10-29 devnull goto ret0;
1010 5cdb1798 2005-10-29 devnull if(yyn == 0) {
1011 5cdb1798 2005-10-29 devnull /* error ... attempt to resume parsing */
1012 5cdb1798 2005-10-29 devnull switch(yyerrflag) {
1013 5cdb1798 2005-10-29 devnull case 0: /* brand new error */
1014 5cdb1798 2005-10-29 devnull yyerror("syntax error");
1015 5cdb1798 2005-10-29 devnull if(yydebug >= 1) {
1016 5cdb1798 2005-10-29 devnull fprint(2, "%s", yystatname(yystate));
1017 5cdb1798 2005-10-29 devnull fprint(2, "saw %s\n", yytokname(yychar));
1019 5cdb1798 2005-10-29 devnull goto yyerrlab;
1020 5cdb1798 2005-10-29 devnull yyerrlab:
1021 5cdb1798 2005-10-29 devnull yynerrs++;
1023 5cdb1798 2005-10-29 devnull case 1:
1024 5cdb1798 2005-10-29 devnull case 2: /* incompletely recovered error ... try again */
1025 5cdb1798 2005-10-29 devnull yyerrflag = 3;
1027 5cdb1798 2005-10-29 devnull /* find a state where "error" is a legal shift action */
1028 5cdb1798 2005-10-29 devnull while(yyp >= yys) {
1029 5cdb1798 2005-10-29 devnull yyn = yypact[yyp->yys] + YYERRCODE;
1030 5cdb1798 2005-10-29 devnull if(yyn >= 0 && yyn < YYLAST) {
1031 5cdb1798 2005-10-29 devnull yystate = yyact[yyn]; /* simulate a shift of "error" */
1032 5cdb1798 2005-10-29 devnull if(yychk[yystate] == YYERRCODE)
1033 5cdb1798 2005-10-29 devnull goto yystack;
1036 5cdb1798 2005-10-29 devnull /* the current yyp has no shift onn "error", pop stack */
1037 5cdb1798 2005-10-29 devnull if(yydebug >= 2)
1038 5cdb1798 2005-10-29 devnull fprint(2, "error recovery pops state %d, uncovers %d\n",
1039 5cdb1798 2005-10-29 devnull yyp->yys, (yyp-1)->yys );
1042 5cdb1798 2005-10-29 devnull /* there is no state on the stack with an error shift ... abort */
1043 5cdb1798 2005-10-29 devnull goto ret1;
1045 5cdb1798 2005-10-29 devnull case 3: /* no shift yet; clobber input char */
1046 5cdb1798 2005-10-29 devnull if(yydebug >= 2)
1047 5cdb1798 2005-10-29 devnull fprint(2, "error recovery discards %s\n", yytokname(yychar));
1048 5cdb1798 2005-10-29 devnull if(yychar == YYEOFCODE)
1049 5cdb1798 2005-10-29 devnull goto ret1;
1050 5cdb1798 2005-10-29 devnull yychar = -1;
1051 5cdb1798 2005-10-29 devnull goto yynewstate; /* try again in the same state */
1055 5cdb1798 2005-10-29 devnull /* reduction by production yyn */
1056 5cdb1798 2005-10-29 devnull if(yydebug >= 2)
1057 5cdb1798 2005-10-29 devnull fprint(2, "reduce %d in:\n\t%s", yyn, yystatname(yystate));
1059 5cdb1798 2005-10-29 devnull yypt = yyp;
1060 5cdb1798 2005-10-29 devnull yyp -= yyr2[yyn];
1061 5cdb1798 2005-10-29 devnull yyval = (yyp+1)->yyv;
1062 5cdb1798 2005-10-29 devnull yym = yyn;
1064 5cdb1798 2005-10-29 devnull /* consult goto table to find next state */
1065 5cdb1798 2005-10-29 devnull yyn = yyr1[yyn];
1066 5cdb1798 2005-10-29 devnull yyg = yypgo[yyn];
1067 5cdb1798 2005-10-29 devnull yyj = yyg + yyp->yys + 1;
1069 5cdb1798 2005-10-29 devnull if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn)
1070 5cdb1798 2005-10-29 devnull yystate = yyact[yyg];
1071 5cdb1798 2005-10-29 devnull switch(yym) {
1073 5cdb1798 2005-10-29 devnull case 3:
1074 5cdb1798 2005-10-29 devnull #line 56 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1075 5cdb1798 2005-10-29 devnull { yydone = 1; } break;
1076 5cdb1798 2005-10-29 devnull case 6:
1077 5cdb1798 2005-10-29 devnull #line 61 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1078 5cdb1798 2005-10-29 devnull { date = 1; } break;
1079 5cdb1798 2005-10-29 devnull case 7:
1080 5cdb1798 2005-10-29 devnull #line 63 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1081 5cdb1798 2005-10-29 devnull { originator = 1; } break;
1082 5cdb1798 2005-10-29 devnull case 8:
1083 5cdb1798 2005-10-29 devnull #line 65 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1084 5cdb1798 2005-10-29 devnull { destination = 1; } break;
1085 5cdb1798 2005-10-29 devnull case 15:
1086 5cdb1798 2005-10-29 devnull #line 74 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1087 5cdb1798 2005-10-29 devnull { freenode(yypt[-5].yyv); freenode(yypt[-2].yyv); freenode(yypt[-1].yyv);
1088 5cdb1798 2005-10-29 devnull usender = yypt[-4].yyv; udate = yypt[-3].yyv; usys = yypt[-0].yyv;
1089 5cdb1798 2005-10-29 devnull } break;
1090 5cdb1798 2005-10-29 devnull case 16:
1091 5cdb1798 2005-10-29 devnull #line 79 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1092 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break;
1093 5cdb1798 2005-10-29 devnull case 17:
1094 5cdb1798 2005-10-29 devnull #line 81 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1095 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break;
1096 5cdb1798 2005-10-29 devnull case 18:
1097 5cdb1798 2005-10-29 devnull #line 83 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1098 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break;
1099 5cdb1798 2005-10-29 devnull case 19:
1100 5cdb1798 2005-10-29 devnull #line 85 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1101 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break;
1102 5cdb1798 2005-10-29 devnull case 20:
1103 5cdb1798 2005-10-29 devnull #line 87 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1104 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break;
1105 5cdb1798 2005-10-29 devnull case 21:
1106 5cdb1798 2005-10-29 devnull #line 89 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1107 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break;
1108 5cdb1798 2005-10-29 devnull case 22:
1109 5cdb1798 2005-10-29 devnull #line 91 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1110 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break;
1111 5cdb1798 2005-10-29 devnull case 23:
1112 5cdb1798 2005-10-29 devnull #line 94 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1113 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1114 5cdb1798 2005-10-29 devnull case 24:
1115 5cdb1798 2005-10-29 devnull #line 96 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1116 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1117 5cdb1798 2005-10-29 devnull case 25:
1118 5cdb1798 2005-10-29 devnull #line 99 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1119 5cdb1798 2005-10-29 devnull { newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1120 5cdb1798 2005-10-29 devnull case 26:
1121 5cdb1798 2005-10-29 devnull #line 101 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1122 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1123 5cdb1798 2005-10-29 devnull case 27:
1124 5cdb1798 2005-10-29 devnull #line 103 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1125 5cdb1798 2005-10-29 devnull { newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1126 5cdb1798 2005-10-29 devnull case 28:
1127 5cdb1798 2005-10-29 devnull #line 105 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1128 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1129 5cdb1798 2005-10-29 devnull case 29:
1130 5cdb1798 2005-10-29 devnull #line 107 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1131 5cdb1798 2005-10-29 devnull { newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1132 5cdb1798 2005-10-29 devnull case 30:
1133 5cdb1798 2005-10-29 devnull #line 109 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1134 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1135 5cdb1798 2005-10-29 devnull case 31:
1136 5cdb1798 2005-10-29 devnull #line 111 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1137 5cdb1798 2005-10-29 devnull { newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1138 5cdb1798 2005-10-29 devnull case 32:
1139 5cdb1798 2005-10-29 devnull #line 113 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1140 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1141 5cdb1798 2005-10-29 devnull case 33:
1142 5cdb1798 2005-10-29 devnull #line 115 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1143 5cdb1798 2005-10-29 devnull { newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1144 5cdb1798 2005-10-29 devnull case 34:
1145 5cdb1798 2005-10-29 devnull #line 117 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1146 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1147 5cdb1798 2005-10-29 devnull case 35:
1148 5cdb1798 2005-10-29 devnull #line 119 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1149 5cdb1798 2005-10-29 devnull { newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1150 5cdb1798 2005-10-29 devnull case 36:
1151 5cdb1798 2005-10-29 devnull #line 121 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1152 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1153 5cdb1798 2005-10-29 devnull case 37:
1154 5cdb1798 2005-10-29 devnull #line 124 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1155 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1156 5cdb1798 2005-10-29 devnull case 38:
1157 5cdb1798 2005-10-29 devnull #line 126 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1158 5cdb1798 2005-10-29 devnull { newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1159 5cdb1798 2005-10-29 devnull case 39:
1160 5cdb1798 2005-10-29 devnull #line 129 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1161 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); received++; } break;
1162 5cdb1798 2005-10-29 devnull case 40:
1163 5cdb1798 2005-10-29 devnull #line 131 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1164 5cdb1798 2005-10-29 devnull { newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); received++; } break;
1165 5cdb1798 2005-10-29 devnull case 41:
1166 5cdb1798 2005-10-29 devnull #line 134 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1167 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1168 5cdb1798 2005-10-29 devnull case 42:
1169 5cdb1798 2005-10-29 devnull #line 136 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1170 5cdb1798 2005-10-29 devnull { newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1171 5cdb1798 2005-10-29 devnull case 43:
1172 5cdb1798 2005-10-29 devnull #line 139 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1173 5cdb1798 2005-10-29 devnull { newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1174 5cdb1798 2005-10-29 devnull case 44:
1175 5cdb1798 2005-10-29 devnull #line 141 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1176 5cdb1798 2005-10-29 devnull { newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break;
1177 5cdb1798 2005-10-29 devnull case 47:
1178 5cdb1798 2005-10-29 devnull #line 143 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1179 5cdb1798 2005-10-29 devnull { messageid = 1; } break;
1180 5cdb1798 2005-10-29 devnull case 49:
1181 5cdb1798 2005-10-29 devnull #line 146 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1182 5cdb1798 2005-10-29 devnull { /* hack to allow same lex for field names and the rest */
1183 5cdb1798 2005-10-29 devnull if(badfieldname(yypt[-2].yyv)){
1184 5cdb1798 2005-10-29 devnull freenode(yypt[-2].yyv);
1185 5cdb1798 2005-10-29 devnull freenode(yypt[-1].yyv);
1186 5cdb1798 2005-10-29 devnull freenode(yypt[-0].yyv);
1187 5cdb1798 2005-10-29 devnull return 1;
1189 5cdb1798 2005-10-29 devnull newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0);
1190 5cdb1798 2005-10-29 devnull } break;
1191 5cdb1798 2005-10-29 devnull case 50:
1192 5cdb1798 2005-10-29 devnull #line 156 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1193 5cdb1798 2005-10-29 devnull { /* hack to allow same lex for field names and the rest */
1194 5cdb1798 2005-10-29 devnull if(badfieldname(yypt[-1].yyv)){
1195 5cdb1798 2005-10-29 devnull freenode(yypt[-1].yyv);
1196 5cdb1798 2005-10-29 devnull freenode(yypt[-0].yyv);
1197 5cdb1798 2005-10-29 devnull return 1;
1199 5cdb1798 2005-10-29 devnull newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0);
1200 5cdb1798 2005-10-29 devnull } break;
1201 5cdb1798 2005-10-29 devnull case 52:
1202 5cdb1798 2005-10-29 devnull #line 167 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1203 5cdb1798 2005-10-29 devnull { yyval = link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv); } break;
1204 5cdb1798 2005-10-29 devnull case 55:
1205 5cdb1798 2005-10-29 devnull #line 173 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1206 5cdb1798 2005-10-29 devnull { yyval = link2(yypt[-3].yyv, link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv)); } break;
1207 5cdb1798 2005-10-29 devnull case 56:
1208 5cdb1798 2005-10-29 devnull #line 175 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1209 5cdb1798 2005-10-29 devnull { yyval = link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv); } break;
1210 5cdb1798 2005-10-29 devnull case 58:
1211 5cdb1798 2005-10-29 devnull #line 179 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1212 5cdb1798 2005-10-29 devnull { yyval = link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv); } break;
1213 5cdb1798 2005-10-29 devnull case 60:
1214 5cdb1798 2005-10-29 devnull #line 183 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1215 5cdb1798 2005-10-29 devnull { yyval = link2(yypt[-1].yyv, yypt[-0].yyv); } break;
1216 5cdb1798 2005-10-29 devnull case 62:
1217 5cdb1798 2005-10-29 devnull #line 187 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1218 5cdb1798 2005-10-29 devnull { yyval = link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv); } break;
1219 5cdb1798 2005-10-29 devnull case 63:
1220 5cdb1798 2005-10-29 devnull #line 189 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1221 5cdb1798 2005-10-29 devnull { yyval = nobody(yypt[-0].yyv); freenode(yypt[-1].yyv); } break;
1222 5cdb1798 2005-10-29 devnull case 64:
1223 5cdb1798 2005-10-29 devnull #line 192 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1224 5cdb1798 2005-10-29 devnull { yyval = address(concat(yypt[-2].yyv, concat(yypt[-1].yyv, yypt[-0].yyv))); } break;
1225 5cdb1798 2005-10-29 devnull case 66:
1226 5cdb1798 2005-10-29 devnull #line 196 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1227 5cdb1798 2005-10-29 devnull { yyval = concat(yypt[-1].yyv, yypt[-0].yyv); } break;
1228 5cdb1798 2005-10-29 devnull case 67:
1229 5cdb1798 2005-10-29 devnull #line 198 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1230 5cdb1798 2005-10-29 devnull { yyval = concat(yypt[-3].yyv, concat(yypt[-2].yyv, concat(yypt[-1].yyv, yypt[-0].yyv))); } break;
1231 5cdb1798 2005-10-29 devnull case 68:
1232 5cdb1798 2005-10-29 devnull #line 201 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1233 5cdb1798 2005-10-29 devnull { yyval = address(yypt[-0].yyv); } break;
1234 5cdb1798 2005-10-29 devnull case 70:
1235 5cdb1798 2005-10-29 devnull #line 205 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1236 5cdb1798 2005-10-29 devnull { yyval = address(concat(yypt[-2].yyv, concat(yypt[-1].yyv, yypt[-0].yyv)));} break;
1237 5cdb1798 2005-10-29 devnull case 71:
1238 5cdb1798 2005-10-29 devnull #line 207 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1239 5cdb1798 2005-10-29 devnull { yyval = address(concat(yypt[-2].yyv, concat(yypt[-1].yyv, yypt[-0].yyv)));} break;
1240 5cdb1798 2005-10-29 devnull case 75:
1241 5cdb1798 2005-10-29 devnull #line 215 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1242 5cdb1798 2005-10-29 devnull { yyval = link2(yypt[-1].yyv, yypt[-0].yyv); } break;
1243 5cdb1798 2005-10-29 devnull case 77:
1244 5cdb1798 2005-10-29 devnull #line 219 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1245 5cdb1798 2005-10-29 devnull { yyval = link2(yypt[-1].yyv, yypt[-0].yyv); } break;
1246 5cdb1798 2005-10-29 devnull case 86:
1247 5cdb1798 2005-10-29 devnull #line 226 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1248 5cdb1798 2005-10-29 devnull { yyval = link3(yypt[-5].yyv, yypt[-3].yyv, link3(yypt[-4].yyv, yypt[-0].yyv, link2(yypt[-2].yyv, yypt[-1].yyv))); } break;
1249 5cdb1798 2005-10-29 devnull case 88:
1250 5cdb1798 2005-10-29 devnull #line 230 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1251 5cdb1798 2005-10-29 devnull { yyval = link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv); } break;
1252 5cdb1798 2005-10-29 devnull case 115:
1253 5cdb1798 2005-10-29 devnull #line 240 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1254 5cdb1798 2005-10-29 devnull { yyval = link2(yypt[-1].yyv, yypt[-0].yyv); } break;
1255 5cdb1798 2005-10-29 devnull case 116:
1256 5cdb1798 2005-10-29 devnull #line 242 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y"
1257 5cdb1798 2005-10-29 devnull { yyval = link2(yypt[-1].yyv, yypt[-0].yyv); } break;
1259 5cdb1798 2005-10-29 devnull goto yystack; /* stack new state and value */