]> mj.ucw.cz Git - umpf.git/blob - cond.y
clean up a bit
[umpf.git] / cond.y
1 %{
2
3 #include <stdio.h>
4 #include <string.h>
5 #include <pcre.h>
6
7 #define OVECCOUNT 3
8
9 int yylex (void);
10 void yyerror (char const *);
11
12 int regex_cmp(char* s, char* r);
13
14 %}
15
16 %union {
17         int b;  
18         int n;
19         char* str;
20 }
21
22 %token <str> CONST
23 %token <str> REGEX
24 %token <n> NUM
25 %left EQ NEQ GE LE GT LT RE NRE
26 %left '|' '&' '^'
27 %left '!'
28 %type <b> boo
29
30 %%
31 input:  /* empty */
32         | input line
33 ;
34
35 line:   '\n'
36         | boo '\n'              { printf("%s\n",$1?"true":"false"); }
37         | error '\n'            { yyerrok; }
38 ;
39
40 boo:     CONST EQ CONST         { $$ = ! strcmp($1, $3); }
41         | CONST NEQ CONST       { $$ = !! strcmp($1, $3); }
42         | CONST RE REGEX        { $$ = regex_cmp($1,$3) >= 0 }
43         | CONST NRE REGEX       { $$ = regex_cmp($1,$3) < 0 }
44         | NUM EQ NUM            { $$ = $1 == $3 }
45         | NUM NEQ NUM           { $$ = $1 != $3 }
46         | NUM GE NUM            { $$ = $1 >= $3 }
47         | NUM LE NUM            { $$ = $1 <= $3 }
48         | NUM GT NUM            { $$ = $1 > $3 }
49         | NUM LT NUM            { $$ = $1 < $3 }
50         | boo '|' boo           { $$ = $1 || $3 }
51         | boo '&' boo           { $$ = $1 && $3 }
52         | boo '^' boo           { $$ = ($1 || $3) && !($1 && $3) }
53         | '!' boo               { $$ = ! $2 }
54 ;
55
56 ;
57 %%
58
59 #include <ctype.h>
60 #include <stdlib.h>
61
62 #define BUFSIZE 4096
63
64 int 
65 regex_cmp(char* s, char* r)
66 {
67         pcre *brum;
68         int erroroffset;
69         const char* error;
70         int ovector[OVECCOUNT];
71         
72         brum=pcre_compile(r,0,&error,&erroroffset,NULL);
73         if (!brum)
74                 return -1;
75         
76         int res=pcre_exec(brum,NULL,s,strlen(s),0,0,ovector,OVECCOUNT);
77         
78         pcre_free(brum);
79
80         return res;
81 }
82
83 char*
84 get_string_out(char delim)
85 {
86         int last = delim; 
87         int i = 0;
88         char* s;
89         int c;
90
91         if (!(s = malloc(BUFSIZE))){
92                 puts("Low memory");
93                 exit(0);
94         }
95
96         while ((c = getchar()) != delim || last == '\\'){
97                 if (last=='\\' && c != delim)
98                         s[i-1] = c;
99                 else {          
100                         s[i] = c;
101                         i++;
102                 }
103                 last = c;
104                 if (i >= BUFSIZE-1)
105                         break;
106         }       
107         s[i] = '\0';
108
109         return s;
110 }
111
112 int
113 yylex(void)
114 {
115
116         int c, last;
117         
118         while ((c = getchar ()) == ' ' || c == '\t');
119         
120         if (c == '"'){
121                 last = '"';
122                 yylval.str = get_string_out('"');
123                 return CONST;   
124         }
125
126         if (c == '\''){
127                 last = '\'';
128                 yylval.str = get_string_out('\'');
129                 return CONST;   
130         }
131
132         if (c == '/'){
133                 last = '/';
134                 yylval.str = get_string_out('/');       
135                 return REGEX;   
136         }
137
138         if (isdigit(c)){
139                 ungetc(c,stdin);
140                 scanf("%d",&yylval.n);
141                 return NUM;
142         }
143
144         if (c == '!'){
145                 if ((c = getchar ()) == '=')
146                         return NEQ;
147                 else if (c == '~')
148                         return NRE;
149                 else
150                         ungetc(c,stdin);
151         }
152
153         if (c == '<'){
154                 if ((c = getchar ()) == '=')
155                         return LE;
156                 else {
157                         ungetc(c,stdin);
158                         return LT;
159                 }
160         }
161
162         if (c == '>'){
163                 if ((c = getchar ()) == '=')
164                         return GE;
165                 else {
166                         ungetc(c,stdin);
167                         return GT;
168                 }
169         }
170
171         if (c == '='){
172                 if ((c = getchar ()) == '=')
173                         return EQ;
174                 else
175                         ungetc(c,stdin);
176         }
177
178         if (c == '~'){
179                 if ((c = getchar ()) == '~')
180                         return RE;
181                 else
182                         ungetc(c,stdin);
183         }
184         
185         if (c == EOF)
186                 return 0;
187         
188         return c;
189 }
190
191 void
192 yyerror (char const *s)
193 {
194         fprintf (stderr, "%s\n", s);
195 }
196
197 int
198 main(void)
199 {
200         return yyparse ();
201 }