Blame


1 e72e360a 2005-12-30 devnull %{
2 e72e360a 2005-12-30 devnull #include <u.h>
3 e72e360a 2005-12-30 devnull #include <libc.h>
4 e72e360a 2005-12-30 devnull #include <ctype.h>
5 e72e360a 2005-12-30 devnull #include "dat.h"
6 e72e360a 2005-12-30 devnull
7 e72e360a 2005-12-30 devnull char *yylp; /* next character to be lex'd */
8 e72e360a 2005-12-30 devnull char *yybuffer;
9 e72e360a 2005-12-30 devnull char *yyend; /* end of buffer to be parsed */
10 e72e360a 2005-12-30 devnull %}
11 e72e360a 2005-12-30 devnull
12 e72e360a 2005-12-30 devnull %term LOR
13 e72e360a 2005-12-30 devnull %term LAND
14 e72e360a 2005-12-30 devnull %term WORD
15 a38a1836 2006-02-14 devnull %term NE
16 e72e360a 2005-12-30 devnull %right '!'
17 e72e360a 2005-12-30 devnull %left '|'
18 e72e360a 2005-12-30 devnull %left '&'
19 e72e360a 2005-12-30 devnull %left LOR
20 e72e360a 2005-12-30 devnull %left LAND
21 e72e360a 2005-12-30 devnull %start filter
22 e72e360a 2005-12-30 devnull %%
23 e72e360a 2005-12-30 devnull
24 e72e360a 2005-12-30 devnull filter : expr
25 e72e360a 2005-12-30 devnull { filter = $$; }
26 e72e360a 2005-12-30 devnull ;
27 e72e360a 2005-12-30 devnull expr : WORD
28 e72e360a 2005-12-30 devnull { $$ = $1; }
29 e72e360a 2005-12-30 devnull | WORD '=' WORD
30 e72e360a 2005-12-30 devnull { $2->l = $1; $2->r = $3; $$ = $2; }
31 a38a1836 2006-02-14 devnull | WORD NE WORD
32 a38a1836 2006-02-14 devnull { $2->l = newfilter();
33 a38a1836 2006-02-14 devnull $2->l->op = '=';
34 a38a1836 2006-02-14 devnull $2->l->l = $1;
35 a38a1836 2006-02-14 devnull $2->l->r = $3;
36 a38a1836 2006-02-14 devnull $2->op = '!';
37 a38a1836 2006-02-14 devnull $$ = $2;
38 a38a1836 2006-02-14 devnull }
39 e72e360a 2005-12-30 devnull | WORD '(' expr ')'
40 e72e360a 2005-12-30 devnull { $1->l = $3; free($2); free($4); $$ = $1; }
41 e72e360a 2005-12-30 devnull | '(' expr ')'
42 e72e360a 2005-12-30 devnull { free($1); free($3); $$ = $2; }
43 e72e360a 2005-12-30 devnull | expr LOR expr
44 e72e360a 2005-12-30 devnull { $2->l = $1; $2->r = $3; $$ = $2; }
45 e72e360a 2005-12-30 devnull | expr LAND expr
46 e72e360a 2005-12-30 devnull { $2->l = $1; $2->r = $3; $$ = $2; }
47 e72e360a 2005-12-30 devnull | '!' expr
48 e72e360a 2005-12-30 devnull { $1->l = $2; $$ = $1; }
49 e72e360a 2005-12-30 devnull ;
50 e72e360a 2005-12-30 devnull %%
51 e72e360a 2005-12-30 devnull
52 e72e360a 2005-12-30 devnull /*
53 e72e360a 2005-12-30 devnull * Initialize the parsing. Done once for each header field.
54 e72e360a 2005-12-30 devnull */
55 e72e360a 2005-12-30 devnull void
56 e72e360a 2005-12-30 devnull yyinit(char *p)
57 e72e360a 2005-12-30 devnull {
58 e72e360a 2005-12-30 devnull yylp = p;
59 e72e360a 2005-12-30 devnull }
60 e72e360a 2005-12-30 devnull
61 e72e360a 2005-12-30 devnull int
62 e72e360a 2005-12-30 devnull yylex(void)
63 e72e360a 2005-12-30 devnull {
64 e72e360a 2005-12-30 devnull char *p;
65 e72e360a 2005-12-30 devnull int c;
66 e72e360a 2005-12-30 devnull
67 e72e360a 2005-12-30 devnull if(yylp == nil || *yylp == 0)
68 e72e360a 2005-12-30 devnull return 0;
69 e72e360a 2005-12-30 devnull while(isspace(*yylp))
70 e72e360a 2005-12-30 devnull yylp++;
71 e72e360a 2005-12-30 devnull
72 e72e360a 2005-12-30 devnull yylval = newfilter();
73 e72e360a 2005-12-30 devnull
74 e72e360a 2005-12-30 devnull p = strpbrk(yylp, "!|&()= ");
75 e72e360a 2005-12-30 devnull if(p == 0){
76 e72e360a 2005-12-30 devnull yylval->op = WORD;
77 e72e360a 2005-12-30 devnull yylval->s = strdup(yylp);
78 e72e360a 2005-12-30 devnull if(yylval->s == nil)
79 e72e360a 2005-12-30 devnull sysfatal("parsing filter: %r");
80 e72e360a 2005-12-30 devnull yylp = nil;
81 e72e360a 2005-12-30 devnull return WORD;
82 e72e360a 2005-12-30 devnull }
83 e72e360a 2005-12-30 devnull c = *p;
84 e72e360a 2005-12-30 devnull if(p != yylp){
85 e72e360a 2005-12-30 devnull yylval->op = WORD;
86 e72e360a 2005-12-30 devnull *p = 0;
87 e72e360a 2005-12-30 devnull yylval->s = strdup(yylp);
88 e72e360a 2005-12-30 devnull if(yylval->s == nil)
89 e72e360a 2005-12-30 devnull sysfatal("parsing filter: %r");
90 e72e360a 2005-12-30 devnull *p = c;
91 e72e360a 2005-12-30 devnull yylp = p;
92 e72e360a 2005-12-30 devnull return WORD;
93 e72e360a 2005-12-30 devnull }
94 e72e360a 2005-12-30 devnull
95 e72e360a 2005-12-30 devnull yylp++;
96 a38a1836 2006-02-14 devnull if(c == '!' && *yylp == '='){
97 a38a1836 2006-02-14 devnull c = NE;
98 a38a1836 2006-02-14 devnull yylp++;
99 a38a1836 2006-02-14 devnull }
100 a38a1836 2006-02-14 devnull else if(c == '&' && *yylp == '&'){
101 a38a1836 2006-02-14 devnull c = LAND;
102 a38a1836 2006-02-14 devnull yylp++;
103 a38a1836 2006-02-14 devnull }
104 a38a1836 2006-02-14 devnull else if(c == '|' && *yylp == '|'){
105 a38a1836 2006-02-14 devnull c = LOR;
106 a38a1836 2006-02-14 devnull yylp++;
107 a38a1836 2006-02-14 devnull }
108 e72e360a 2005-12-30 devnull yylval->op = c;
109 e72e360a 2005-12-30 devnull return c;
110 e72e360a 2005-12-30 devnull }
111 e72e360a 2005-12-30 devnull
112 e72e360a 2005-12-30 devnull void
113 e72e360a 2005-12-30 devnull yyerror(char *e)
114 e72e360a 2005-12-30 devnull {
115 e72e360a 2005-12-30 devnull USED(e);
116 a38a1836 2006-02-14 devnull // longjmp(errjmp, 1);
117 e72e360a 2005-12-30 devnull sysfatal("error parsing filter");
118 e72e360a 2005-12-30 devnull }