commit e0e75ef7f4bafe7d02576973c912eac99874e141 from: Russ Cox date: Tue Nov 27 20:38:29 2007 UTC upas/smtp: remove intermediate files commit - 3f4e0dc707b92e7c5bce9555253852d4070c0b02 commit + e0e75ef7f4bafe7d02576973c912eac99874e141 blob - cacf86729622ee4c4a171cfb6f4ddd7a12ad6012 (mode 644) blob + /dev/null --- src/cmd/upas/smtp/rfc822.tab.c +++ /dev/null @@ -1,1260 +0,0 @@ - -#line 2 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -#include "common.h" -#include "smtp.h" -#include - -char *yylp; /* next character to be lex'd */ -int yydone; /* tell yylex to give up */ -char *yybuffer; /* first parsed character */ -char *yyend; /* end of buffer to be parsed */ -Node *root; -Field *firstfield; -Field *lastfield; -Node *usender; -Node *usys; -Node *udate; -char *startfield, *endfield; -int originator; -int destination; -int date; -int received; -int messageid; -extern int yyerrflag; -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 150 -#endif -#ifndef YYSTYPE -#define YYSTYPE int -#endif -YYSTYPE yylval; -YYSTYPE yyval; -#define WORD 57346 -#define DATE 57347 -#define RESENT_DATE 57348 -#define RETURN_PATH 57349 -#define FROM 57350 -#define SENDER 57351 -#define REPLY_TO 57352 -#define RESENT_FROM 57353 -#define RESENT_SENDER 57354 -#define RESENT_REPLY_TO 57355 -#define SUBJECT 57356 -#define TO 57357 -#define CC 57358 -#define BCC 57359 -#define RESENT_TO 57360 -#define RESENT_CC 57361 -#define RESENT_BCC 57362 -#define REMOTE 57363 -#define PRECEDENCE 57364 -#define MIMEVERSION 57365 -#define CONTENTTYPE 57366 -#define MESSAGEID 57367 -#define RECEIVED 57368 -#define MAILER 57369 -#define BADTOKEN 57370 -#define YYEOFCODE 1 -#define YYERRCODE 2 - -#line 246 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" - - -/* - * Initialize the parsing. Done once for each header field. - */ -void -yyinit(char *p, int len) -{ - yybuffer = p; - yylp = p; - yyend = p + len; - firstfield = lastfield = 0; - received = 0; -} - -/* - * keywords identifying header fields we care about - */ -typedef struct Keyword Keyword; -struct Keyword { - char *rep; - int val; -}; - -/* field names that we need to recognize */ -Keyword key[] = { - { "date", DATE }, - { "resent-date", RESENT_DATE }, - { "return_path", RETURN_PATH }, - { "from", FROM }, - { "sender", SENDER }, - { "reply-to", REPLY_TO }, - { "resent-from", RESENT_FROM }, - { "resent-sender", RESENT_SENDER }, - { "resent-reply-to", RESENT_REPLY_TO }, - { "to", TO }, - { "cc", CC }, - { "bcc", BCC }, - { "resent-to", RESENT_TO }, - { "resent-cc", RESENT_CC }, - { "resent-bcc", RESENT_BCC }, - { "remote", REMOTE }, - { "subject", SUBJECT }, - { "precedence", PRECEDENCE }, - { "mime-version", MIMEVERSION }, - { "content-type", CONTENTTYPE }, - { "message-id", MESSAGEID }, - { "received", RECEIVED }, - { "mailer", MAILER }, - { "who-the-hell-cares", WORD } -}; - -/* - * Lexical analysis for an rfc822 header field. Continuation lines - * are handled in yywhite() when skipping over white space. - * - */ -int -yylex(void) -{ - String *t; - int quoting; - int escaping; - char *start; - Keyword *kp; - int c, d; - -/* print("lexing\n"); /**/ - if(yylp >= yyend) - return 0; - if(yydone) - return 0; - - quoting = escaping = 0; - start = yylp; - yylval = malloc(sizeof(Node)); - yylval->white = yylval->s = 0; - yylval->next = 0; - yylval->addr = 0; - yylval->start = yylp; - for(t = 0; yylp < yyend; yylp++){ - c = *yylp & 0xff; - - /* dump nulls, they can't be in header */ - if(c == 0) - continue; - - if(escaping) { - escaping = 0; - } else if(quoting) { - switch(c){ - case '\\': - escaping = 1; - break; - case '\n': - d = (*(yylp+1))&0xff; - if(d != ' ' && d != '\t'){ - quoting = 0; - yylp--; - continue; - } - break; - case '"': - quoting = 0; - break; - } - } else { - switch(c){ - case '\\': - escaping = 1; - break; - case '(': - case ' ': - case '\t': - case '\r': - goto out; - case '\n': - if(yylp == start){ - yylp++; -/* print("lex(c %c)\n", c); /**/ - yylval->end = yylp; - return yylval->c = c; - } - goto out; - case '@': - case '>': - case '<': - case ':': - case ',': - case ';': - if(yylp == start){ - yylp++; - yylval->white = yywhite(); -/* print("lex(c %c)\n", c); /**/ - yylval->end = yylp; - return yylval->c = c; - } - goto out; - case '"': - quoting = 1; - break; - default: - break; - } - } - if(t == 0) - t = s_new(); - s_putc(t, c); - } -out: - yylval->white = yywhite(); - if(t) { - s_terminate(t); - } else /* message begins with white-space! */ - return yylval->c = '\n'; - yylval->s = t; - for(kp = key; kp->val != WORD; kp++) - if(cistrcmp(s_to_c(t), kp->rep)==0) - break; -/* print("lex(%d) %s\n", kp->val-WORD, s_to_c(t)); /**/ - yylval->end = yylp; - return yylval->c = kp->val; -} - -void -yyerror(char *x) -{ - USED(x); - - /*fprint(2, "parse err: %s\n", x);/**/ -} - -/* - * parse white space and comments - */ -String * -yywhite(void) -{ - String *w; - int clevel; - int c; - int escaping; - - escaping = clevel = 0; - for(w = 0; yylp < yyend; yylp++){ - c = *yylp & 0xff; - - /* dump nulls, they can't be in header */ - if(c == 0) - continue; - - if(escaping){ - escaping = 0; - } else if(clevel) { - switch(c){ - case '\n': - /* - * look for multiline fields - */ - if(*(yylp+1)==' ' || *(yylp+1)=='\t') - break; - else - goto out; - case '\\': - escaping = 1; - break; - case '(': - clevel++; - break; - case ')': - clevel--; - break; - } - } else { - switch(c){ - case '\\': - escaping = 1; - break; - case '(': - clevel++; - break; - case ' ': - case '\t': - case '\r': - break; - case '\n': - /* - * look for multiline fields - */ - if(*(yylp+1)==' ' || *(yylp+1)=='\t') - break; - else - goto out; - default: - goto out; - } - } - if(w == 0) - w = s_new(); - s_putc(w, c); - } -out: - if(w) - s_terminate(w); - return w; -} - -/* - * link two parsed entries together - */ -Node* -link2(Node *p1, Node *p2) -{ - Node *p; - - for(p = p1; p->next; p = p->next) - ; - p->next = p2; - return p1; -} - -/* - * link three parsed entries together - */ -Node* -link3(Node *p1, Node *p2, Node *p3) -{ - Node *p; - - for(p = p2; p->next; p = p->next) - ; - p->next = p3; - - for(p = p1; p->next; p = p->next) - ; - p->next = p2; - - return p1; -} - -/* - * make a:b, move all white space after both - */ -Node* -colon(Node *p1, Node *p2) -{ - if(p1->white){ - if(p2->white) - s_append(p1->white, s_to_c(p2->white)); - } else { - p1->white = p2->white; - p2->white = 0; - } - - s_append(p1->s, ":"); - if(p2->s) - s_append(p1->s, s_to_c(p2->s)); - - if(p1->end < p2->end) - p1->end = p2->end; - freenode(p2); - return p1; -} - -/* - * concatenate two fields, move all white space after both - */ -Node* -concat(Node *p1, Node *p2) -{ - char buf[2]; - - if(p1->white){ - if(p2->white) - s_append(p1->white, s_to_c(p2->white)); - } else { - p1->white = p2->white; - p2->white = 0; - } - - if(p1->s == nil){ - buf[0] = p1->c; - buf[1] = 0; - p1->s = s_new(); - s_append(p1->s, buf); - } - - if(p2->s) - s_append(p1->s, s_to_c(p2->s)); - else { - buf[0] = p2->c; - buf[1] = 0; - s_append(p1->s, buf); - } - - if(p1->end < p2->end) - p1->end = p2->end; - freenode(p2); - return p1; -} - -/* - * look for disallowed chars in the field name - */ -int -badfieldname(Node *p) -{ - for(; p; p = p->next){ - /* field name can't contain white space */ - if(p->white && p->next) - return 1; - } - return 0; -} - -/* - * mark as an address - */ -Node * -address(Node *p) -{ - p->addr = 1; - return p; -} - -/* - * case independent string compare - */ -int -cistrcmp(char *s1, char *s2) -{ - int c1, c2; - - for(; *s1; s1++, s2++){ - c1 = isupper(*s1) ? tolower(*s1) : *s1; - c2 = isupper(*s2) ? tolower(*s2) : *s2; - if (c1 != c2) - return -1; - } - return *s2; -} - -/* - * free a node - */ -void -freenode(Node *p) -{ - Node *tp; - - while(p){ - tp = p->next; - if(p->s) - s_free(p->s); - if(p->white) - s_free(p->white); - free(p); - p = tp; - } -} - - -/* - * an anonymous user - */ -Node* -nobody(Node *p) -{ - if(p->s) - s_free(p->s); - p->s = s_copy("pOsTmAsTeR"); - p->addr = 1; - return p; -} - -/* - * add anything that was dropped because of a parse error - */ -void -missing(Node *p) -{ - Node *np; - char *start, *end; - Field *f; - String *s; - - start = yybuffer; - if(lastfield != nil){ - for(np = lastfield->node; np; np = np->next) - start = np->end+1; - } - - end = p->start-1; - - if(end <= start) - return; - - if(strncmp(start, "From ", 5) == 0) - return; - - np = malloc(sizeof(Node)); - np->start = start; - np->end = end; - np->white = nil; - s = s_copy("BadHeader: "); - np->s = s_nappend(s, start, end-start); - np->next = nil; - - f = malloc(sizeof(Field)); - f->next = 0; - f->node = np; - f->source = 0; - if(firstfield) - lastfield->next = f; - else - firstfield = f; - lastfield = f; -} - -/* - * create a new field - */ -void -newfield(Node *p, int source) -{ - Field *f; - - missing(p); - - f = malloc(sizeof(Field)); - f->next = 0; - f->node = p; - f->source = source; - if(firstfield) - lastfield->next = f; - else - firstfield = f; - lastfield = f; - endfield = startfield; - startfield = yylp; -} - -/* - * fee a list of fields - */ -void -freefield(Field *f) -{ - Field *tf; - - while(f){ - tf = f->next; - freenode(f->node); - free(f); - f = tf; - } -} - -/* - * add some white space to a node - */ -Node* -whiten(Node *p) -{ - Node *tp; - - for(tp = p; tp->next; tp = tp->next) - ; - if(tp->white == 0) - tp->white = s_copy(" "); - return p; -} - -void -yycleanup(void) -{ - Field *f, *fnext; - Node *np, *next; - - for(f = firstfield; f; f = fnext){ - for(np = f->node; np; np = next){ - if(np->s) - s_free(np->s); - if(np->white) - s_free(np->white); - next = np->next; - free(np); - } - fnext = f->next; - free(f); - } - firstfield = lastfield = 0; -} -static const short yyexca[] = -{-1, 1, - 1, -1, - -2, 0, --1, 47, - 1, 4, - -2, 0, --1, 112, - 29, 72, - 31, 72, - 32, 72, - 35, 72, - -2, 74 -}; -#define YYNPROD 122 -#define YYPRIVATE 57344 -#define YYLAST 608 -static const short yyact[] = -{ - 112, 133, 136, 53, 121, 111, 134, 55, 109, 118, - 119, 116, 162, 171, 35, 48, 166, 54, 5, 166, - 179, 114, 115, 155, 49, 101, 100, 99, 95, 94, - 93, 92, 98, 91, 132, 90, 123, 89, 122, 88, - 87, 86, 85, 84, 83, 82, 97, 81, 80, 106, - 47, 46, 110, 117, 153, 168, 108, 2, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 73, 66, - 67, 68, 69, 70, 71, 72, 74, 75, 76, 77, - 78, 79, 124, 124, 49, 55, 177, 131, 110, 52, - 110, 110, 138, 137, 140, 141, 124, 124, 51, 120, - 124, 124, 124, 50, 102, 104, 135, 154, 31, 32, - 107, 157, 105, 14, 55, 55, 156, 13, 161, 117, - 117, 139, 158, 124, 142, 143, 144, 145, 146, 147, - 163, 164, 160, 12, 148, 149, 11, 157, 150, 151, - 152, 10, 156, 9, 8, 7, 3, 1, 0, 124, - 124, 124, 124, 124, 0, 169, 0, 0, 110, 165, - 0, 0, 170, 117, 0, 0, 0, 0, 173, 176, - 178, 0, 0, 0, 172, 0, 0, 0, 180, 0, - 0, 182, 183, 0, 0, 165, 165, 165, 165, 165, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 174, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 73, 66, 67, 68, 69, 70, 71, - 72, 74, 75, 76, 77, 78, 79, 0, 0, 128, - 130, 129, 125, 126, 127, 15, 0, 36, 16, 17, - 19, 103, 20, 18, 23, 22, 21, 30, 24, 26, - 28, 25, 27, 29, 0, 34, 37, 38, 39, 33, - 40, 0, 4, 0, 45, 44, 41, 42, 43, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 73, - 66, 67, 68, 69, 70, 71, 72, 74, 75, 76, - 77, 78, 79, 0, 0, 96, 45, 44, 41, 42, - 43, 15, 0, 36, 16, 17, 19, 6, 20, 18, - 23, 22, 21, 30, 24, 26, 28, 25, 27, 29, - 0, 34, 37, 38, 39, 33, 40, 0, 4, 0, - 45, 44, 41, 42, 43, 15, 0, 36, 16, 17, - 19, 103, 20, 18, 23, 22, 21, 30, 24, 26, - 28, 25, 27, 29, 0, 34, 37, 38, 39, 33, - 40, 0, 0, 0, 45, 44, 41, 42, 43, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 73, - 66, 67, 68, 69, 70, 71, 72, 74, 75, 76, - 77, 78, 79, 0, 0, 0, 0, 175, 113, 0, - 52, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 73, 66, 67, 68, 69, 70, 71, 72, 74, - 75, 76, 77, 78, 79, 0, 0, 0, 0, 0, - 113, 0, 52, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 73, 66, 67, 68, 69, 70, 71, - 72, 74, 75, 76, 77, 78, 79, 0, 0, 0, - 0, 0, 0, 159, 52, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 73, 66, 67, 68, 69, - 70, 71, 72, 74, 75, 76, 77, 78, 79, 0, - 0, 0, 0, 0, 0, 0, 52, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 73, 66, 67, - 68, 69, 70, 71, 72, 74, 75, 76, 77, 78, - 79, 0, 0, 167, 0, 0, 113, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 73, 66, 67, - 68, 69, 70, 71, 72, 74, 75, 76, 77, 78, - 79, 0, 0, 0, 0, 0, 113, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 73, 66, 67, - 68, 69, 70, 71, 72, 74, 75, 76, 77, 78, - 79, 0, 0, 181, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 73, 66, 67, 68, 69, 70, - 71, 72, 74, 75, 76, 77, 78, 79 -}; -static const short yypact[] = -{ - 299,-1000,-1000, 22,-1000, 21, 54,-1000,-1000,-1000, --1000,-1000,-1000,-1000,-1000, 19, 17, 15, 14, 13, - 12, 11, 10, 9, 7, 5, 3, 1, 0, -1, - -2, 265, -3, -4, -5,-1000,-1000,-1000,-1000,-1000, --1000,-1000,-1000,-1000,-1000,-1000, 233, 233, 580, 397, - -9,-1000, 580, -26, -25,-1000,-1000,-1000,-1000,-1000, --1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, --1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, - 333, 199, 199, 397, 461, 397, 397, 397, 397, 397, - 397, 397, 397, 397, 397, 199, 199,-1000,-1000, 199, - 199, 199,-1000, -6,-1000, 33, 580, -8,-1000,-1000, - 523,-1000,-1000, 429, 580, -23,-1000,-1000, 580, 580, --1000,-1000, 199,-1000,-1000,-1000,-1000,-1000,-1000,-1000, --1000,-1000, -15,-1000,-1000,-1000, 493,-1000,-1000, -15, --1000,-1000, -15, -15, -15, -15, -15, -15, 199, 199, - 199, 199, 199, 47, 580, 397,-1000,-1000, -21,-1000, - -25, -26, 580,-1000,-1000,-1000, 397, 365, 580, 580, --1000,-1000,-1000,-1000, -12,-1000,-1000, 553,-1000,-1000, - 580, 580,-1000,-1000 -}; -static const short yypgo[] = -{ - 0, 147, 57, 146, 18, 145, 144, 143, 141, 136, - 133, 117, 113, 8, 112, 0, 34, 110, 6, 4, - 38, 109, 108, 1, 106, 2, 5, 103, 17, 98, - 11, 3, 36, 86, 14 -}; -static const short yyr1[] = -{ - 0, 1, 1, 2, 2, 2, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 3, 6, 6, 6, 6, - 6, 6, 6, 5, 5, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 8, 8, 11, - 11, 12, 12, 10, 10, 21, 21, 21, 21, 9, - 9, 16, 16, 23, 23, 24, 24, 17, 17, 18, - 18, 18, 26, 26, 13, 13, 27, 27, 29, 29, - 28, 28, 31, 30, 25, 25, 20, 20, 32, 32, - 32, 32, 32, 32, 32, 19, 14, 33, 33, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 22, 22, 22, 22, 34, 34, 34, - 34, 34 -}; -static const short yyr2[] = -{ - 0, 1, 3, 1, 2, 3, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 6, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, 3, 2, 3, 2, - 3, 2, 3, 2, 3, 2, 3, 3, 2, 3, - 2, 3, 2, 3, 2, 1, 1, 1, 1, 3, - 2, 1, 3, 1, 1, 4, 3, 1, 3, 1, - 2, 1, 3, 2, 3, 1, 2, 4, 1, 1, - 3, 3, 1, 1, 1, 2, 1, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 6, 1, 3, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, - 1, 1 -}; -static const short yychk[] = -{ --1000, -1, -2, -3, 29, -4, 8, -5, -6, -7, - -8, -9, -10, -11, -12, 2, 5, 6, 10, 7, - 9, 13, 12, 11, 15, 18, 16, 19, 17, 20, - 14, -22, -21, 26, 22, -34, 4, 23, 24, 25, - 27, 33, 34, 35, 32, 31, 29, 29, -13, 30, - -27, -29, 35, -31, -28, -15, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, - 19, 20, 21, 14, 22, 23, 24, 25, 26, 27, - 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, -34, -15, 30, - 30, 30, -2, 8, -2, -14, -15, -17, -18, -13, - -25, -26, -15, 33, 30, 31, -30, -15, 35, 35, - -4, -19, -20, -32, -15, 33, 34, 35, 30, 32, - 31, -19, -16, -23, -18, -24, -25, -13, -18, -16, - -18, -18, -16, -16, -16, -16, -16, -16, -20, -20, - -20, -20, -20, 21, -15, 31, -26, -15, -13, 34, - -28, -31, 35, -30, -30, -32, 31, 30, 8, -15, - -18, 34, -30, -23, -16, 32, -15, -33, -15, 32, - -15, 30, -15, -15 -}; -static const short yydef[] = -{ - 0, -2, 1, 0, 3, 0, 0, 6, 7, 8, - 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 113, 114, 45, 46, 47, - 48, 117, 118, 119, 120, 121, 0, -2, 0, 0, - 0, 65, 0, 68, 69, 72, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, - 27, 29, 31, 33, 35, 38, 50, 115, 116, 44, - 40, 42, 2, 0, 5, 0, 0, 18, 57, 59, - 0, 61, -2, 0, 0, 0, 66, 73, 0, 0, - 14, 23, 85, 76, 78, 79, 80, 81, 82, 83, - 84, 24, 16, 51, 53, 54, 0, 17, 19, 20, - 21, 22, 26, 28, 30, 32, 34, 36, 37, 49, - 43, 39, 41, 0, 0, 0, 60, 75, 0, 63, - 64, 0, 0, 70, 71, 77, 0, 0, 0, 0, - 58, 62, 67, 52, 0, 56, 15, 0, 87, 55, - 0, 0, 86, 88 -}; -static const short yytok1[] = -{ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 32, - 33, 0, 34, 0, 35 -}; -static const short yytok2[] = -{ - 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28 -}; -static const long yytok3[] = -{ - 0 -}; -#define YYFLAG -1000 -#define YYERROR goto yyerrlab -#define YYACCEPT return(0) -#define YYABORT return(1) -#define yyclearin yychar = -1 -#define yyerrok yyerrflag = 0 - -#ifdef yydebug -#include "y.debug" -#else -#define yydebug 0 -static const char* yytoknames[1]; /* for debugging */ -static const char* yystates[1]; /* for debugging */ -#endif - -/* parser for yacc output */ -#ifdef YYARG -#define yynerrs yyarg->yynerrs -#define yyerrflag yyarg->yyerrflag -#define yyval yyarg->yyval -#define yylval yyarg->yylval -#else -int yynerrs = 0; /* number of errors */ -int yyerrflag = 0; /* error recovery flag */ -#endif - -extern int fprint(int, char*, ...); -extern int sprint(char*, char*, ...); - -static const char* -yytokname(int yyc) -{ - static char x[10]; - - if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0])) - if(yytoknames[yyc-1]) - return yytoknames[yyc-1]; - sprint(x, "<%d>", yyc); - return x; -} - -static const char* -yystatname(int yys) -{ - static char x[10]; - - if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0])) - if(yystates[yys]) - return yystates[yys]; - sprint(x, "<%d>\n", yys); - return x; -} - -static long -#ifdef YYARG -yylex1(struct Yyarg *yyarg) -#else -yylex1(void) -#endif -{ - long yychar; - const long *t3p; - int c; - -#ifdef YYARG - yychar = yylex(yyarg); -#else - yychar = yylex(); -#endif - if(yychar <= 0) { - c = yytok1[0]; - goto out; - } - if(yychar < sizeof(yytok1)/sizeof(yytok1[0])) { - c = yytok1[yychar]; - goto out; - } - if(yychar >= YYPRIVATE) - if(yychar < YYPRIVATE+sizeof(yytok2)/sizeof(yytok2[0])) { - c = yytok2[yychar-YYPRIVATE]; - goto out; - } - for(t3p=yytok3;; t3p+=2) { - c = t3p[0]; - if(c == yychar) { - c = t3p[1]; - goto out; - } - if(c == 0) - break; - } - c = 0; - -out: - if(c == 0) - c = yytok2[1]; /* unknown char */ - if(yydebug >= 3) - fprint(2, "lex %.4lux %s\n", yychar, yytokname(c)); - return c; -} - -int -#ifdef YYARG -yyparse(struct Yyarg *yyarg) -#else -yyparse(void) -#endif -{ - struct - { - YYSTYPE yyv; - int yys; - } yys[YYMAXDEPTH], *yyp, *yypt; - const short *yyxi; - int yyj, yym, yystate, yyn, yyg; - long yychar; -#ifndef YYARG - YYSTYPE save1, save2; - int save3, save4; - - save1 = yylval; - save2 = yyval; - save3 = yynerrs; - save4 = yyerrflag; -#endif - - yystate = 0; - yychar = -1; - yynerrs = 0; - yyerrflag = 0; - yyp = &yys[-1]; - goto yystack; - -ret0: - yyn = 0; - goto ret; - -ret1: - yyn = 1; - goto ret; - -ret: -#ifndef YYARG - yylval = save1; - yyval = save2; - yynerrs = save3; - yyerrflag = save4; -#endif - return yyn; - -yystack: - /* put a state and value onto the stack */ - if(yydebug >= 4) - fprint(2, "char %s in %s", yytokname(yychar), yystatname(yystate)); - - yyp++; - if(yyp >= &yys[YYMAXDEPTH]) { - yyerror("yacc stack overflow"); - goto ret1; - } - yyp->yys = yystate; - yyp->yyv = yyval; - -yynewstate: - yyn = yypact[yystate]; - if(yyn <= YYFLAG) - goto yydefault; /* simple state */ - if(yychar < 0) -#ifdef YYARG - yychar = yylex1(yyarg); -#else - yychar = yylex1(); -#endif - yyn += yychar; - if(yyn < 0 || yyn >= YYLAST) - goto yydefault; - yyn = yyact[yyn]; - if(yychk[yyn] == yychar) { /* valid shift */ - yychar = -1; - yyval = yylval; - yystate = yyn; - if(yyerrflag > 0) - yyerrflag--; - goto yystack; - } - -yydefault: - /* default state action */ - yyn = yydef[yystate]; - if(yyn == -2) { - if(yychar < 0) -#ifdef YYARG - yychar = yylex1(yyarg); -#else - yychar = yylex1(); -#endif - - /* look through exception table */ - for(yyxi=yyexca;; yyxi+=2) - if(yyxi[0] == -1 && yyxi[1] == yystate) - break; - for(yyxi += 2;; yyxi += 2) { - yyn = yyxi[0]; - if(yyn < 0 || yyn == yychar) - break; - } - yyn = yyxi[1]; - if(yyn < 0) - goto ret0; - } - if(yyn == 0) { - /* error ... attempt to resume parsing */ - switch(yyerrflag) { - case 0: /* brand new error */ - yyerror("syntax error"); - if(yydebug >= 1) { - fprint(2, "%s", yystatname(yystate)); - fprint(2, "saw %s\n", yytokname(yychar)); - } - goto yyerrlab; - yyerrlab: - yynerrs++; - - case 1: - case 2: /* incompletely recovered error ... try again */ - yyerrflag = 3; - - /* find a state where "error" is a legal shift action */ - while(yyp >= yys) { - yyn = yypact[yyp->yys] + YYERRCODE; - if(yyn >= 0 && yyn < YYLAST) { - yystate = yyact[yyn]; /* simulate a shift of "error" */ - if(yychk[yystate] == YYERRCODE) - goto yystack; - } - - /* the current yyp has no shift onn "error", pop stack */ - if(yydebug >= 2) - fprint(2, "error recovery pops state %d, uncovers %d\n", - yyp->yys, (yyp-1)->yys ); - yyp--; - } - /* there is no state on the stack with an error shift ... abort */ - goto ret1; - - case 3: /* no shift yet; clobber input char */ - if(yydebug >= 2) - fprint(2, "error recovery discards %s\n", yytokname(yychar)); - if(yychar == YYEOFCODE) - goto ret1; - yychar = -1; - goto yynewstate; /* try again in the same state */ - } - } - - /* reduction by production yyn */ - if(yydebug >= 2) - fprint(2, "reduce %d in:\n\t%s", yyn, yystatname(yystate)); - - yypt = yyp; - yyp -= yyr2[yyn]; - yyval = (yyp+1)->yyv; - yym = yyn; - - /* consult goto table to find next state */ - yyn = yyr1[yyn]; - yyg = yypgo[yyn]; - yyj = yyg + yyp->yys + 1; - - if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn) - yystate = yyact[yyg]; - switch(yym) { - -case 3: -#line 56 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yydone = 1; } break; -case 6: -#line 61 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ date = 1; } break; -case 7: -#line 63 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ originator = 1; } break; -case 8: -#line 65 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ destination = 1; } break; -case 15: -#line 74 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ freenode(yypt[-5].yyv); freenode(yypt[-2].yyv); freenode(yypt[-1].yyv); - usender = yypt[-4].yyv; udate = yypt[-3].yyv; usys = yypt[-0].yyv; - } break; -case 16: -#line 79 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break; -case 17: -#line 81 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break; -case 18: -#line 83 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break; -case 19: -#line 85 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break; -case 20: -#line 87 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break; -case 21: -#line 89 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break; -case 22: -#line 91 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 1); } break; -case 23: -#line 94 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 24: -#line 96 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 25: -#line 99 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 26: -#line 101 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 27: -#line 103 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 28: -#line 105 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 29: -#line 107 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 30: -#line 109 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 31: -#line 111 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 32: -#line 113 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 33: -#line 115 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 34: -#line 117 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 35: -#line 119 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 36: -#line 121 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 37: -#line 124 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 38: -#line 126 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 39: -#line 129 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); received++; } break; -case 40: -#line 131 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); received++; } break; -case 41: -#line 134 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 42: -#line 136 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 43: -#line 139 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 44: -#line 141 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); } break; -case 47: -#line 143 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ messageid = 1; } break; -case 49: -#line 146 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ /* hack to allow same lex for field names and the rest */ - if(badfieldname(yypt[-2].yyv)){ - freenode(yypt[-2].yyv); - freenode(yypt[-1].yyv); - freenode(yypt[-0].yyv); - return 1; - } - newfield(link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv), 0); - } break; -case 50: -#line 156 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ /* hack to allow same lex for field names and the rest */ - if(badfieldname(yypt[-1].yyv)){ - freenode(yypt[-1].yyv); - freenode(yypt[-0].yyv); - return 1; - } - newfield(link2(yypt[-1].yyv, yypt[-0].yyv), 0); - } break; -case 52: -#line 167 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv); } break; -case 55: -#line 173 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = link2(yypt[-3].yyv, link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv)); } break; -case 56: -#line 175 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv); } break; -case 58: -#line 179 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv); } break; -case 60: -#line 183 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = link2(yypt[-1].yyv, yypt[-0].yyv); } break; -case 62: -#line 187 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv); } break; -case 63: -#line 189 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = nobody(yypt[-0].yyv); freenode(yypt[-1].yyv); } break; -case 64: -#line 192 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = address(concat(yypt[-2].yyv, concat(yypt[-1].yyv, yypt[-0].yyv))); } break; -case 66: -#line 196 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = concat(yypt[-1].yyv, yypt[-0].yyv); } break; -case 67: -#line 198 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = concat(yypt[-3].yyv, concat(yypt[-2].yyv, concat(yypt[-1].yyv, yypt[-0].yyv))); } break; -case 68: -#line 201 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = address(yypt[-0].yyv); } break; -case 70: -#line 205 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = address(concat(yypt[-2].yyv, concat(yypt[-1].yyv, yypt[-0].yyv)));} break; -case 71: -#line 207 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = address(concat(yypt[-2].yyv, concat(yypt[-1].yyv, yypt[-0].yyv)));} break; -case 75: -#line 215 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = link2(yypt[-1].yyv, yypt[-0].yyv); } break; -case 77: -#line 219 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = link2(yypt[-1].yyv, yypt[-0].yyv); } break; -case 86: -#line 226 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = link3(yypt[-5].yyv, yypt[-3].yyv, link3(yypt[-4].yyv, yypt[-0].yyv, link2(yypt[-2].yyv, yypt[-1].yyv))); } break; -case 88: -#line 230 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = link3(yypt[-2].yyv, yypt[-1].yyv, yypt[-0].yyv); } break; -case 115: -#line 240 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = link2(yypt[-1].yyv, yypt[-0].yyv); } break; -case 116: -#line 242 "/usr/local/plan9/src/cmd/upas/smtp/rfc822.y" -{ yyval = link2(yypt[-1].yyv, yypt[-0].yyv); } break; - } - goto yystack; /* stack new state and value */ -} blob - a31a0e67b20868f78bf3afa07852d35e9a22ae77 (mode 644) blob + /dev/null --- src/cmd/upas/smtp/y.tab.h +++ /dev/null @@ -1,25 +0,0 @@ -#define WORD 57346 -#define DATE 57347 -#define RESENT_DATE 57348 -#define RETURN_PATH 57349 -#define FROM 57350 -#define SENDER 57351 -#define REPLY_TO 57352 -#define RESENT_FROM 57353 -#define RESENT_SENDER 57354 -#define RESENT_REPLY_TO 57355 -#define SUBJECT 57356 -#define TO 57357 -#define CC 57358 -#define BCC 57359 -#define RESENT_TO 57360 -#define RESENT_CC 57361 -#define RESENT_BCC 57362 -#define REMOTE 57363 -#define PRECEDENCE 57364 -#define MIMEVERSION 57365 -#define CONTENTTYPE 57366 -#define MESSAGEID 57367 -#define RECEIVED 57368 -#define MAILER 57369 -#define BADTOKEN 57370