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"
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 */
12 e72e360a 2005-12-30 devnull %term LOR
13 e72e360a 2005-12-30 devnull %term LAND
14 e72e360a 2005-12-30 devnull %term WORD
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
24 e72e360a 2005-12-30 devnull filter : expr
25 e72e360a 2005-12-30 devnull { filter = $$; }
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 = '!';
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; }
53 e72e360a 2005-12-30 devnull * Initialize the parsing. Done once for each header field.
56 e72e360a 2005-12-30 devnull yyinit(char *p)
58 e72e360a 2005-12-30 devnull yylp = p;
62 e72e360a 2005-12-30 devnull yylex(void)
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))
72 e72e360a 2005-12-30 devnull yylval = newfilter();
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;
84 e72e360a 2005-12-30 devnull if(p != yylp){
85 e72e360a 2005-12-30 devnull yylval->op = WORD;
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");
91 e72e360a 2005-12-30 devnull yylp = p;
92 e72e360a 2005-12-30 devnull return WORD;
96 a38a1836 2006-02-14 devnull if(c == '!' && *yylp == '='){
100 a38a1836 2006-02-14 devnull else if(c == '&' && *yylp == '&'){
101 a38a1836 2006-02-14 devnull c = LAND;
104 a38a1836 2006-02-14 devnull else if(c == '|' && *yylp == '|'){
105 a38a1836 2006-02-14 devnull c = LOR;
108 e72e360a 2005-12-30 devnull yylval->op = c;
109 e72e360a 2005-12-30 devnull return c;
113 e72e360a 2005-12-30 devnull yyerror(char *e)
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");