6 #define YYSTYPE yystype
7 typedef struct quux yystype;
17 YYSTYPE cat(YYSTYPE*, YYSTYPE*, YYSTYPE*, YYSTYPE*, YYSTYPE*, YYSTYPE*, YYSTYPE*);
20 YYSTYPE anonymous(void);
33 | 'h' 'e' 'l' 'o' spaces sdomain CRLF
35 | 'e' 'h' 'l' 'o' spaces sdomain CRLF
37 | 'm' 'a' 'i' 'l' spaces 'f' 'r' 'o' 'm' ':' spath CRLF
39 | 'm' 'a' 'i' 'l' spaces 'f' 'r' 'o' 'm' ':' spath spaces 'a' 'u' 't' 'h' '=' sauth CRLF
41 | 'r' 'c' 'p' 't' spaces 't' 'o' ':' spath CRLF
43 | 'd' 'a' 't' 'a' CRLF
45 | 'r' 's' 'e' 't' CRLF
47 | 's' 'e' 'n' 'd' spaces 'f' 'r' 'o' 'm' ':' spath CRLF
49 | 's' 'o' 'm' 'l' spaces 'f' 'r' 'o' 'm' ':' spath CRLF
51 | 's' 'a' 'm' 'l' spaces 'f' 'r' 'o' 'm' ':' spath CRLF
53 | 'v' 'r' 'f' 'y' spaces string CRLF
55 | 'e' 'x' 'p' 'n' spaces string CRLF
57 | 'h' 'e' 'l' 'p' CRLF
59 | 'h' 'e' 'l' 'p' spaces string CRLF
61 | 'n' 'o' 'o' 'p' CRLF
63 | 'q' 'u' 'i' 't' CRLF
65 | 't' 'u' 'r' 'n' CRLF
67 | 's' 't' 'a' 'r' 't' 't' 'l' 's' CRLF
69 | 'a' 'u' 't' 'h' spaces name spaces string CRLF
71 | 'a' 'u' 't' 'h' spaces name CRLF
74 { reply("501 illegal command or bad syntax\r\n"); }
76 path : '<' '>' ={ $$ = anonymous(); }
77 | '<' mailbox '>' ={ $$ = $2; }
78 | '<' a_d_l ':' mailbox '>' ={ $$ = cat(&$2, bang, &$4, 0, 0 ,0, 0); }
80 spath : path ={ $$ = $1; }
81 | spaces path ={ $$ = $2; }
83 auth : path ={ $$ = $1; }
84 | mailbox ={ $$ = $1; }
86 sauth : auth ={ $$ = $1; }
87 | spaces auth ={ $$ = $2; }
90 a_d_l : at_domain ={ $$ = cat(&$1, 0, 0, 0, 0 ,0, 0); }
91 | at_domain ',' a_d_l ={ $$ = cat(&$1, bang, &$3, 0, 0, 0, 0); }
93 at_domain : '@' domain ={ $$ = cat(&$2, 0, 0, 0, 0 ,0, 0); }
95 sdomain : domain ={ $$ = $1; }
96 | domain spaces ={ $$ = $1; }
98 domain : element ={ $$ = cat(&$1, 0, 0, 0, 0 ,0, 0); }
99 | element '.' ={ $$ = cat(&$1, 0, 0, 0, 0 ,0, 0); }
100 | element '.' domain ={ $$ = cat(&$1, &$2, &$3, 0, 0 ,0, 0); }
102 element : name ={ $$ = cat(&$1, 0, 0, 0, 0 ,0, 0); }
103 | '#' number ={ $$ = cat(&$1, &$2, 0, 0, 0 ,0, 0); }
104 | '[' ']' ={ $$ = cat(&$1, &$2, 0, 0, 0 ,0, 0); }
105 | '[' dotnum ']' ={ $$ = cat(&$1, &$2, &$3, 0, 0 ,0, 0); }
107 mailbox : local_part ={ $$ = cat(&$1, 0, 0, 0, 0 ,0, 0); }
108 | local_part '@' domain ={ $$ = cat(&$3, bang, &$1, 0, 0 ,0, 0); }
110 local_part : dot_string ={ $$ = cat(&$1, 0, 0, 0, 0 ,0, 0); }
111 | quoted_string ={ $$ = cat(&$1, 0, 0, 0, 0 ,0, 0); }
113 name : let_dig ={ $$ = cat(&$1, 0, 0, 0, 0 ,0, 0); }
114 | let_dig ld_str ={ $$ = cat(&$1, &$2, 0, 0, 0 ,0, 0); }
115 | let_dig ldh_str ld_str ={ $$ = cat(&$1, &$2, &$3, 0, 0 ,0, 0); }
118 | let_dig ld_str ={ $$ = cat(&$1, &$2, 0, 0, 0 ,0, 0); }
121 | ld_str hunder ={ $$ = cat(&$1, &$2, 0, 0, 0 ,0, 0); }
122 | ldh_str ld_str hunder ={ $$ = cat(&$1, &$2, &$3, 0, 0 ,0, 0); }
127 dot_string : string ={ $$ = cat(&$1, 0, 0, 0, 0 ,0, 0); }
128 | string '.' dot_string ={ $$ = cat(&$1, &$2, &$3, 0, 0 ,0, 0); }
131 string : char ={ $$ = cat(&$1, 0, 0, 0, 0 ,0, 0); }
132 | string char ={ $$ = cat(&$1, &$2, 0, 0, 0 ,0, 0); }
135 quoted_string : '"' qtext '"' ={ $$ = cat(&$1, &$2, &$3, 0, 0 ,0, 0); }
137 qtext : '\\' x ={ $$ = cat(&$2, 0, 0, 0, 0 ,0, 0); }
138 | qtext '\\' x ={ $$ = cat(&$1, &$3, 0, 0, 0 ,0, 0); }
140 | qtext q ={ $$ = cat(&$1, &$2, 0, 0, 0 ,0, 0); }
143 | '\\' x ={ $$ = $2; }
145 dotnum : snum '.' snum '.' snum '.' snum ={ $$ = cat(&$1, &$2, &$3, &$4, &$5, &$6, &$7); }
147 number : d ={ $$ = cat(&$1, 0, 0, 0, 0 ,0, 0); }
148 | number d ={ $$ = cat(&$1, &$2, 0, 0, 0 ,0, 0); }
150 snum : number ={ if(atoi(s_to_c($1.s)) > 255) print("bad snum\n"); }
152 spaces : SPACE ={ $$ = $1; }
153 | SPACE spaces ={ $$ = $1; }
158 | '(' | ')' | ',' | '.'
159 | ':' | ';' | '<' | '>' | '@'
161 special : special1 | '\\' | '"'
163 notspecial : '!' | '#' | '$' | '%' | '&' | '\''
164 | '*' | '+' | '-' | '/'
166 | '[' | ']' | '^' | '_' | '`' | '{' | '|' | '}' | '~'
169 a : 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i'
170 | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r'
171 | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z'
173 d : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
175 c : a | d | notspecial
177 q : a | d | special1 | notspecial | SPACE
179 x : a | d | special | notspecial | SPACE
186 bang = (YYSTYPE*)malloc(sizeof(YYSTYPE));
203 yylval.c = c = c & 0x7F;
229 cat(YYSTYPE *y1, YYSTYPE *y2, YYSTYPE *y3, YYSTYPE *y4, YYSTYPE *y5, YYSTYPE *y6, YYSTYPE *y7)
233 memset(&rv, 0, sizeof rv);
243 s_append(rv.s, s_to_c(y2->s));
253 s_append(rv.s, s_to_c(y3->s));
263 s_append(rv.s, s_to_c(y4->s));
273 s_append(rv.s, s_to_c(y5->s));
283 s_append(rv.s, s_to_c(y6->s));
293 s_append(rv.s, s_to_c(y7->s));
318 memset(&rv, 0, sizeof rv);
319 rv.s = s_copy("/dev/null");