summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Fuhrmannek2021-08-31 21:14:57 +0200
committerBen Fuhrmannek2021-08-31 21:14:57 +0200
commit5cdfa697666c0ed347aaa086953b7e9c7f8aa9f9 (patch)
treebd513c80149a941105963d8474881989f09bf6cc
parent8f689157b3857f82e0ad0a8b87609e83561d81fb (diff)
basic condition suuport for rules files
-rw-r--r--src/sp_config_scanner.cached.c939
-rw-r--r--src/sp_config_scanner.re54
2 files changed, 769 insertions, 224 deletions
diff --git a/src/sp_config_scanner.cached.c b/src/sp_config_scanner.cached.c
index 8e05986..d053e5f 100644
--- a/src/sp_config_scanner.cached.c
+++ b/src/sp_config_scanner.cached.c
@@ -3,6 +3,8 @@
3 3
4enum YYCONDTYPE { 4enum YYCONDTYPE {
5 yycinit, 5 yycinit,
6 yyccond,
7 yyccond_op,
6 yycrule, 8 yycrule,
7}; 9};
8 10
@@ -76,6 +78,21 @@ static void str_dtor(zval *zv) {
76 zend_string_release_ex(Z_STR_P(zv), 1); 78 zend_string_release_ex(Z_STR_P(zv), 1);
77} 79}
78 80
81static int apply_op(int v1, char op, int v2, int neg) {
82 if (neg) { v2 = !v2; }
83 switch (op) {
84 case 0: return v2;
85 case '&': return (v1 && v2);
86 case '|': return (v1 || v2);
87 case '<': return (v1 < v2);
88 case '>': return (v1 > v2);
89 case '=': return (v1 == v2);
90 }
91 return 0;
92}
93
94#define APPLY_OP(v2) cond_res = apply_op(cond_res, cond_op, v2, cond_neg); cond_op = cond_neg = 0;
95
79zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*)) 96zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*))
80{ 97{
81 const char *YYCURSOR = data; 98 const char *YYCURSOR = data;
@@ -95,6 +112,10 @@ const char *yyt4;
95 HashTable vars; 112 HashTable vars;
96 zend_hash_init(&vars, 10, NULL, str_dtor, 1); 113 zend_hash_init(&vars, 10, NULL, str_dtor, 1);
97 114
115 int cond_res = 1;
116 char cond_op = 0;
117 int cond_neg = 0;
118
98 int cond = yycinit; 119 int cond = yycinit;
99 long lineno = 1; 120 long lineno = 1;
100 121
@@ -102,68 +123,77 @@ const char *yyt4;
102{ 123{
103 char yych; 124 char yych;
104 unsigned int yyaccept = 0; 125 unsigned int yyaccept = 0;
105 if (cond < 1) { 126 if (cond < 2) {
106 goto yyc_init; 127 if (cond < 1) {
128 goto yyc_init;
129 } else {
130 goto yyc_cond;
131 }
107 } else { 132 } else {
108 goto yyc_rule; 133 if (cond < 3) {
134 goto yyc_cond_op;
135 } else {
136 goto yyc_rule;
137 }
109 } 138 }
110/* *********************************** */ 139/* *********************************** */
111yyc_init: 140yyc_init:
112 { 141 {
113 static const unsigned char yybm[] = { 142 static const unsigned char yybm[] = {
114 72, 72, 72, 72, 72, 72, 72, 72, 143 80, 80, 80, 80, 80, 80, 80, 80,
115 72, 92, 16, 72, 72, 24, 72, 72, 144 80, 88, 0, 80, 80, 16, 80, 80,
116 72, 72, 72, 72, 72, 72, 72, 72, 145 80, 80, 80, 80, 80, 80, 80, 80,
117 72, 72, 72, 72, 72, 72, 72, 72, 146 80, 80, 80, 80, 80, 80, 80, 80,
118 92, 72, 8, 72, 72, 72, 72, 72, 147 88, 80, 16, 80, 80, 80, 80, 80,
119 72, 72, 72, 72, 72, 72, 72, 72, 148 80, 80, 80, 80, 80, 80, 80, 80,
120 104, 104, 104, 104, 104, 104, 104, 104, 149 112, 112, 112, 112, 112, 112, 112, 112,
121 104, 104, 72, 72, 72, 72, 72, 72, 150 112, 112, 80, 80, 80, 80, 80, 80,
122 72, 104, 104, 104, 104, 104, 104, 104, 151 80, 112, 112, 112, 112, 112, 112, 112,
123 104, 104, 104, 104, 104, 104, 104, 104, 152 112, 112, 112, 112, 112, 112, 112, 112,
124 104, 104, 104, 104, 104, 104, 104, 104, 153 112, 112, 112, 112, 112, 112, 112, 112,
125 104, 104, 104, 72, 136, 72, 72, 104, 154 112, 112, 112, 80, 144, 80, 80, 112,
126 72, 104, 104, 104, 104, 104, 104, 104, 155 80, 112, 112, 112, 112, 112, 112, 112,
127 104, 104, 104, 104, 104, 104, 104, 104, 156 112, 112, 112, 112, 112, 112, 112, 112,
128 104, 104, 104, 104, 104, 104, 104, 104, 157 112, 112, 112, 112, 112, 112, 112, 112,
129 104, 104, 104, 72, 72, 72, 72, 72, 158 112, 112, 112, 80, 80, 80, 80, 80,
130 72, 72, 72, 72, 72, 72, 72, 72, 159 80, 80, 80, 80, 80, 80, 80, 80,
131 72, 72, 72, 72, 72, 72, 72, 72, 160 80, 80, 80, 80, 80, 80, 80, 80,
132 72, 72, 72, 72, 72, 72, 72, 72, 161 80, 80, 80, 80, 80, 80, 80, 80,
133 72, 72, 72, 72, 72, 72, 72, 72, 162 80, 80, 80, 80, 80, 80, 80, 80,
134 72, 72, 72, 72, 72, 72, 72, 72, 163 80, 80, 80, 80, 80, 80, 80, 80,
135 72, 72, 72, 72, 72, 72, 72, 72, 164 80, 80, 80, 80, 80, 80, 80, 80,
136 72, 72, 72, 72, 72, 72, 72, 72, 165 80, 80, 80, 80, 80, 80, 80, 80,
137 72, 72, 72, 72, 72, 72, 72, 72, 166 80, 80, 80, 80, 80, 80, 80, 80,
138 72, 72, 72, 72, 72, 72, 72, 72, 167 80, 80, 80, 80, 80, 80, 80, 80,
139 72, 72, 72, 72, 72, 72, 72, 72, 168 80, 80, 80, 80, 80, 80, 80, 80,
140 72, 72, 72, 72, 72, 72, 72, 72, 169 80, 80, 80, 80, 80, 80, 80, 80,
141 72, 72, 72, 72, 72, 72, 72, 72, 170 80, 80, 80, 80, 80, 80, 80, 80,
142 72, 72, 72, 72, 72, 72, 72, 72, 171 80, 80, 80, 80, 80, 80, 80, 80,
143 72, 72, 72, 72, 72, 72, 72, 72, 172 80, 80, 80, 80, 80, 80, 80, 80,
144 72, 72, 72, 72, 72, 72, 72, 72, 173 80, 80, 80, 80, 80, 80, 80, 80,
145 72, 72, 72, 72, 72, 72, 72, 72, 174 80, 80, 80, 80, 80, 80, 80, 80,
146 }; 175 };
147 yych = *YYCURSOR; 176 yych = *YYCURSOR;
148 if (yybm[0+yych] & 4) { 177 if (yybm[0+yych] & 8) {
149 goto yy6; 178 goto yy6;
150 } 179 }
151 if (yych <= '"') { 180 if (yych <= '#') {
152 if (yych <= '\n') { 181 if (yych <= '\n') {
153 if (yych <= 0x00) goto yy2; 182 if (yych <= 0x00) goto yy2;
154 if (yych <= 0x08) goto yy4; 183 if (yych <= 0x08) goto yy4;
155 goto yy9; 184 goto yy9;
156 } else { 185 } else {
157 if (yych == '\r') goto yy11; 186 if (yych == '\r') goto yy11;
158 goto yy4; 187 if (yych <= '"') goto yy4;
188 goto yy12;
159 } 189 }
160 } else { 190 } else {
161 if (yych <= ';') { 191 if (yych <= '?') {
162 if (yych <= '#') goto yy12; 192 if (yych == ';') goto yy12;
163 if (yych <= ':') goto yy4; 193 goto yy4;
164 goto yy12;
165 } else { 194 } else {
166 if (yych == 's') goto yy15; 195 if (yych <= '@') goto yy15;
196 if (yych == 's') goto yy16;
167 goto yy4; 197 goto yy4;
168 } 198 }
169 } 199 }
@@ -176,7 +206,7 @@ yy5:
176 { cs_error_log("Parser error on line %d", lineno); goto out; } 206 { cs_error_log("Parser error on line %d", lineno); goto out; }
177yy6: 207yy6:
178 yych = *++YYCURSOR; 208 yych = *++YYCURSOR;
179 if (yybm[0+yych] & 4) { 209 if (yybm[0+yych] & 8) {
180 goto yy6; 210 goto yy6;
181 } 211 }
182 { goto yyc_init; } 212 { goto yyc_init; }
@@ -189,99 +219,169 @@ yy11:
189 goto yy5; 219 goto yy5;
190yy12: 220yy12:
191 yych = *++YYCURSOR; 221 yych = *++YYCURSOR;
192 if (yybm[0+yych] & 8) { 222 if (yybm[0+yych] & 16) {
193 goto yy12; 223 goto yy12;
194 } 224 }
195 { goto yyc_init; } 225 { goto yyc_init; }
196yy15: 226yy15:
197 yyaccept = 0; 227 yyaccept = 0;
198 yych = *(YYMARKER = ++YYCURSOR); 228 yych = *(YYMARKER = ++YYCURSOR);
199 if (yych == 'e') goto yy16; 229 if (yych == 'c') goto yy17;
200 if (yych == 'p') goto yy18; 230 if (yych == 'e') goto yy19;
201 goto yy5; 231 goto yy5;
202yy16: 232yy16:
203 yych = *++YYCURSOR; 233 yyaccept = 0;
204 if (yych == 't') goto yy20; 234 yych = *(YYMARKER = ++YYCURSOR);
235 if (yych == 'e') goto yy20;
236 if (yych == 'p') goto yy21;
237 goto yy5;
205yy17: 238yy17:
239 yych = *++YYCURSOR;
240 if (yych == 'o') goto yy23;
241yy18:
206 YYCURSOR = YYMARKER; 242 YYCURSOR = YYMARKER;
207 if (yyaccept <= 1) { 243 if (yyaccept <= 1) {
208 if (yyaccept == 0) { 244 if (yyaccept == 0) {
209 goto yy5; 245 goto yy5;
210 } else { 246 } else {
211 yyt4 = YYCURSOR; 247 yyt4 = YYCURSOR;
212 goto yy30; 248 goto yy45;
213 } 249 }
214 } else { 250 } else {
215 goto yy30; 251 goto yy45;
216 } 252 }
217yy18: 253yy19:
218 ++YYCURSOR; 254 yych = *++YYCURSOR;
219 { kw_i = 0; goto yyc_rule; } 255 if (yych == 'n') goto yy24;
256 goto yy18;
220yy20: 257yy20:
221 yych = *++YYCURSOR; 258 yych = *++YYCURSOR;
222 if (yybm[0+yych] & 16) { 259 if (yych == 't') goto yy25;
223 goto yy21; 260 goto yy18;
224 }
225 goto yy17;
226yy21: 261yy21:
262 ++YYCURSOR;
263 { kw_i = 0; goto yyc_rule; }
264yy23:
227 yych = *++YYCURSOR; 265 yych = *++YYCURSOR;
228 if (yybm[0+yych] & 16) { 266 if (yych == 'n') goto yy26;
229 goto yy21; 267 goto yy18;
230 } 268yy24:
231 if (yych <= '^') { 269 yych = *++YYCURSOR;
232 if (yych <= '@') goto yy17; 270 if (yych == 'd') goto yy27;
233 if (yych >= '[') goto yy17; 271 goto yy18;
234 yyt1 = YYCURSOR; 272yy25:
273 yych = *++YYCURSOR;
274 if (yych == '\t') goto yy28;
275 if (yych == ' ') goto yy28;
276 goto yy18;
277yy26:
278 yych = *++YYCURSOR;
279 if (yych == 'd') goto yy30;
280 goto yy18;
281yy27:
282 yych = *++YYCURSOR;
283 if (yych == '_') goto yy31;
284 goto yy18;
285yy28:
286 yych = *++YYCURSOR;
287 if (yych <= '@') {
288 if (yych <= '\t') {
289 if (yych <= 0x08) goto yy18;
290 goto yy28;
291 } else {
292 if (yych == ' ') goto yy28;
293 goto yy18;
294 }
235 } else { 295 } else {
236 if (yych == '`') goto yy17; 296 if (yych <= '_') {
237 if (yych >= '{') goto yy17; 297 if (yych <= 'Z') {
238 yyt1 = YYCURSOR; 298 yyt1 = YYCURSOR;
299 goto yy32;
300 }
301 if (yych <= '^') goto yy18;
302 yyt1 = YYCURSOR;
303 goto yy32;
304 } else {
305 if (yych <= '`') goto yy18;
306 if (yych <= 'z') {
307 yyt1 = YYCURSOR;
308 goto yy32;
309 }
310 goto yy18;
311 }
239 } 312 }
240yy23: 313yy30:
314 yych = *++YYCURSOR;
315 if (yych == 'i') goto yy34;
316 goto yy18;
317yy31:
318 yych = *++YYCURSOR;
319 if (yych == 'c') goto yy35;
320 goto yy18;
321yy32:
241 yych = *++YYCURSOR; 322 yych = *++YYCURSOR;
242 if (yybm[0+yych] & 32) { 323 if (yybm[0+yych] & 32) {
243 goto yy23; 324 goto yy32;
244 } 325 }
245 if (yych <= '\f') { 326 if (yych == '\t') {
246 if (yych <= 0x08) goto yy17;
247 if (yych >= '\v') goto yy17;
248 yyt2 = YYCURSOR; 327 yyt2 = YYCURSOR;
249 } else { 328 goto yy36;
250 if (yych <= '\r') { 329 }
251 yyt2 = YYCURSOR; 330 if (yych == ' ') {
252 goto yy25;
253 }
254 if (yych != ' ') goto yy17;
255 yyt2 = YYCURSOR; 331 yyt2 = YYCURSOR;
332 goto yy36;
256 } 333 }
257yy25: 334 goto yy18;
335yy34:
258 yych = *++YYCURSOR; 336 yych = *++YYCURSOR;
259 if (yych <= '\r') { 337 if (yych == 't') goto yy38;
260 if (yych <= 0x08) goto yy17; 338 goto yy18;
261 if (yych <= '\n') goto yy25; 339yy35:
262 if (yych <= '\f') goto yy17; 340 yych = *++YYCURSOR;
263 goto yy25; 341 if (yych == 'o') goto yy39;
342 goto yy18;
343yy36:
344 yych = *++YYCURSOR;
345 if (yych <= 0x1F) {
346 if (yych == '\t') goto yy36;
347 goto yy18;
264 } else { 348 } else {
265 if (yych <= ' ') { 349 if (yych <= ' ') goto yy36;
266 if (yych <= 0x1F) goto yy17; 350 if (yych == '"') {
267 goto yy25;
268 } else {
269 if (yych != '"') goto yy17;
270 yyt3 = YYCURSOR; 351 yyt3 = YYCURSOR;
352 goto yy40;
271 } 353 }
354 goto yy18;
272 } 355 }
273yy27: 356yy38:
357 yych = *++YYCURSOR;
358 if (yych == 'i') goto yy42;
359 goto yy18;
360yy39:
361 yych = *++YYCURSOR;
362 if (yych == 'n') goto yy43;
363 goto yy18;
364yy40:
274 yych = *++YYCURSOR; 365 yych = *++YYCURSOR;
275 if (yybm[0+yych] & 64) { 366 if (yybm[0+yych] & 64) {
276 goto yy27; 367 goto yy40;
277 } 368 }
278 if (yych <= '\r') goto yy17; 369 if (yych <= '\r') goto yy18;
279 if (yych >= '#') goto yy31; 370 if (yych <= '"') goto yy44;
280yy29: 371 goto yy46;
372yy42:
373 yych = *++YYCURSOR;
374 if (yych == 'o') goto yy48;
375 goto yy18;
376yy43:
377 yych = *++YYCURSOR;
378 if (yych == 'd') goto yy49;
379 goto yy18;
380yy44:
281 yych = *++YYCURSOR; 381 yych = *++YYCURSOR;
282 yyt4 = YYCURSOR; 382 yyt4 = YYCURSOR;
283 if (yych == ';') goto yy33; 383 goto yy51;
284yy30: 384yy45:
285 t1 = yyt1; 385 t1 = yyt1;
286 t2 = yyt2; 386 t2 = yyt2;
287 t3 = yyt3; 387 t3 = yyt3;
@@ -297,48 +397,441 @@ yy30:
297 zend_hash_str_add_ptr(&vars, key, keylen, tmp); 397 zend_hash_str_add_ptr(&vars, key, keylen, tmp);
298 goto yyc_init; 398 goto yyc_init;
299 } 399 }
300yy31: 400yy46:
301 yych = *++YYCURSOR; 401 yych = *++YYCURSOR;
302 if (yybm[0+yych] & 64) { 402 if (yybm[0+yych] & 64) {
303 goto yy27; 403 goto yy40;
404 }
405 if (yych <= '\r') goto yy18;
406 if (yych <= '"') goto yy53;
407 goto yy46;
408yy48:
409 yych = *++YYCURSOR;
410 if (yych == 'n') goto yy54;
411 goto yy18;
412yy49:
413 yych = *++YYCURSOR;
414 if (yych == 'i') goto yy55;
415 goto yy18;
416yy50:
417 yych = *++YYCURSOR;
418yy51:
419 if (yych <= 0x1F) {
420 if (yych == '\t') goto yy50;
421 goto yy45;
422 } else {
423 if (yych <= ' ') goto yy50;
424 if (yych != ';') goto yy45;
304 } 425 }
305 if (yych <= '\r') goto yy17;
306 if (yych <= '"') goto yy34;
307 goto yy31;
308yy33:
309 ++YYCURSOR; 426 ++YYCURSOR;
310 goto yy30; 427 goto yy45;
311yy34: 428yy53:
312 yyaccept = 1; 429 yyaccept = 1;
313 yych = *(YYMARKER = ++YYCURSOR); 430 yych = *(YYMARKER = ++YYCURSOR);
314 if (yybm[0+yych] & 128) { 431 if (yybm[0+yych] & 128) {
315 goto yy31; 432 goto yy46;
316 } 433 }
317 if (yych <= '\r') { 434 if (yych <= 0x1F) {
318 if (yych == '\n') { 435 if (yych <= '\n') {
436 if (yych <= 0x08) goto yy40;
437 if (yych <= '\t') {
438 yyt4 = YYCURSOR;
439 goto yy56;
440 }
319 yyt4 = YYCURSOR; 441 yyt4 = YYCURSOR;
320 goto yy30; 442 goto yy45;
443 } else {
444 if (yych == '\r') {
445 yyt4 = YYCURSOR;
446 goto yy45;
447 }
448 goto yy40;
321 } 449 }
322 if (yych <= '\f') goto yy27;
323 yyt4 = YYCURSOR;
324 goto yy30;
325 } else { 450 } else {
326 if (yych <= '"') { 451 if (yych <= '"') {
327 if (yych <= '!') goto yy27; 452 if (yych <= ' ') {
328 goto yy29; 453 yyt4 = YYCURSOR;
454 goto yy56;
455 }
456 if (yych <= '!') goto yy40;
457 goto yy44;
329 } else { 458 } else {
330 if (yych != ';') goto yy27; 459 if (yych == ';') {
331 yyt4 = YYCURSOR; 460 yyt4 = YYCURSOR;
461 goto yy58;
462 }
463 goto yy40;
464 }
465 }
466yy54:
467 yych = *++YYCURSOR;
468 if (yych == '\t') goto yy59;
469 if (yych == ' ') goto yy59;
470 goto yy18;
471yy55:
472 yych = *++YYCURSOR;
473 if (yych == 't') goto yy62;
474 goto yy18;
475yy56:
476 yyaccept = 2;
477 yych = *(YYMARKER = ++YYCURSOR);
478 if (yybm[0+yych] & 128) {
479 goto yy46;
480 }
481 if (yych <= 0x1F) {
482 if (yych <= '\n') {
483 if (yych <= 0x08) goto yy40;
484 if (yych <= '\t') goto yy56;
485 goto yy45;
486 } else {
487 if (yych == '\r') goto yy45;
488 goto yy40;
489 }
490 } else {
491 if (yych <= '"') {
492 if (yych <= ' ') goto yy56;
493 if (yych <= '!') goto yy40;
494 goto yy44;
495 } else {
496 if (yych != ';') goto yy40;
332 } 497 }
333 } 498 }
499yy58:
334 yyaccept = 2; 500 yyaccept = 2;
335 yych = *(YYMARKER = ++YYCURSOR); 501 yych = *(YYMARKER = ++YYCURSOR);
336 if (yybm[0+yych] & 64) { 502 if (yybm[0+yych] & 64) {
337 goto yy27; 503 goto yy40;
504 }
505 if (yych <= '\r') goto yy45;
506 if (yych <= '"') goto yy44;
507 goto yy46;
508yy59:
509 yych = *++YYCURSOR;
510 if (yych == '\t') goto yy59;
511 if (yych == ' ') goto yy59;
512 { goto yyc_cond; }
513yy62:
514 yych = *++YYCURSOR;
515 if (yych != 'i') goto yy18;
516 yych = *++YYCURSOR;
517 if (yych != 'o') goto yy18;
518 yych = *++YYCURSOR;
519 if (yych != 'n') goto yy18;
520yy65:
521 yych = *++YYCURSOR;
522 if (yych <= 0x1F) {
523 if (yych == '\t') goto yy65;
524 goto yy18;
525 } else {
526 if (yych <= ' ') goto yy65;
527 if (yych != ';') goto yy18;
528 }
529 ++YYCURSOR;
530 { cond_res = 1; goto yyc_init; }
531 }
532/* *********************************** */
533yyc_cond:
534 {
535 static const unsigned char yybm[] = {
536 64, 64, 64, 64, 64, 64, 64, 64,
537 64, 72, 0, 64, 64, 0, 64, 64,
538 64, 64, 64, 64, 64, 64, 64, 64,
539 64, 64, 64, 64, 64, 64, 64, 64,
540 72, 64, 0, 64, 64, 64, 64, 64,
541 64, 64, 64, 64, 64, 64, 64, 64,
542 112, 112, 112, 112, 112, 112, 112, 112,
543 112, 112, 64, 64, 64, 64, 64, 64,
544 64, 96, 96, 96, 96, 96, 96, 96,
545 96, 96, 96, 96, 96, 96, 96, 96,
546 96, 96, 96, 96, 96, 96, 96, 96,
547 96, 96, 96, 64, 128, 64, 64, 96,
548 64, 96, 96, 96, 96, 96, 96, 96,
549 96, 96, 96, 96, 96, 96, 96, 96,
550 96, 96, 96, 96, 96, 96, 96, 96,
551 96, 96, 96, 64, 64, 64, 64, 64,
552 64, 64, 64, 64, 64, 64, 64, 64,
553 64, 64, 64, 64, 64, 64, 64, 64,
554 64, 64, 64, 64, 64, 64, 64, 64,
555 64, 64, 64, 64, 64, 64, 64, 64,
556 64, 64, 64, 64, 64, 64, 64, 64,
557 64, 64, 64, 64, 64, 64, 64, 64,
558 64, 64, 64, 64, 64, 64, 64, 64,
559 64, 64, 64, 64, 64, 64, 64, 64,
560 64, 64, 64, 64, 64, 64, 64, 64,
561 64, 64, 64, 64, 64, 64, 64, 64,
562 64, 64, 64, 64, 64, 64, 64, 64,
563 64, 64, 64, 64, 64, 64, 64, 64,
564 64, 64, 64, 64, 64, 64, 64, 64,
565 64, 64, 64, 64, 64, 64, 64, 64,
566 64, 64, 64, 64, 64, 64, 64, 64,
567 64, 64, 64, 64, 64, 64, 64, 64,
568 };
569 yych = *YYCURSOR;
570 if (yybm[0+yych] & 8) {
571 goto yy73;
572 }
573 if (yych <= '/') {
574 if (yych <= '\f') {
575 if (yych <= 0x08) goto yy71;
576 if (yych <= '\n') goto yy76;
577 } else {
578 if (yych <= '\r') goto yy78;
579 if (yych <= 0x1F) goto yy71;
580 if (yych <= '!') goto yy79;
581 }
582 } else {
583 if (yych <= '^') {
584 if (yych <= '9') {
585 yyt1 = YYCURSOR;
586 goto yy81;
587 }
588 if (yych <= '@') goto yy71;
589 if (yych <= 'Z') {
590 yyt1 = YYCURSOR;
591 goto yy84;
592 }
593 } else {
594 if (yych == '`') goto yy71;
595 if (yych <= 'z') {
596 yyt1 = YYCURSOR;
597 goto yy84;
598 }
599 }
600 }
601yy71:
602 ++YYCURSOR;
603yy72:
604 { cs_error_log("Syntax error in condition on line %d", lineno); return false; }
605yy73:
606 yych = *++YYCURSOR;
607 if (yybm[0+yych] & 8) {
608 goto yy73;
609 }
610 { goto yyc_cond; }
611yy76:
612 ++YYCURSOR;
613 { lineno++; goto yyc_cond; }
614yy78:
615 yych = *++YYCURSOR;
616 if (yych == '\n') goto yy76;
617 goto yy72;
618yy79:
619 ++YYCURSOR;
620 t1 = YYCURSOR - 1;
621 { cond_neg = (cond_neg + 1) % 2; goto yyc_cond; }
622yy81:
623 yych = *++YYCURSOR;
624 if (yybm[0+yych] & 16) {
625 goto yy81;
626 }
627 t1 = yyt1;
628 t2 = YYCURSOR;
629 { APPLY_OP(atoi(t1)); goto yyc_cond_op; }
630yy84:
631 yyaccept = 0;
632 yych = *(YYMARKER = ++YYCURSOR);
633 if (yybm[0+yych] & 32) {
634 goto yy84;
635 }
636 if (yych == '(') goto yy87;
637yy86:
638 t1 = yyt1;
639 t2 = YYCURSOR;
640 {
641 zend_string *tmp = zend_hash_str_find_ptr(&vars, t1, t2-t1);
642 if (!tmp) {
643 cs_error_log("unknown variable in condition on line %d", lineno);
644 goto out;
645 }
646 APPLY_OP(atoi(ZSTR_VAL(tmp)));
647 goto yyc_cond_op;
648 }
649yy87:
650 yych = *++YYCURSOR;
651 if (yych == '"') {
652 yyt2 = YYCURSOR;
653 goto yy89;
654 }
655 if (yych == ')') {
656 yyt2 = YYCURSOR;
657 goto yy91;
658 }
659yy88:
660 YYCURSOR = YYMARKER;
661 if (yyaccept == 0) {
662 goto yy86;
663 } else {
664 goto yy92;
665 }
666yy89:
667 yych = *++YYCURSOR;
668 if (yybm[0+yych] & 64) {
669 goto yy89;
670 }
671 if (yych <= '\r') goto yy88;
672 if (yych <= '"') goto yy93;
673 goto yy94;
674yy91:
675 ++YYCURSOR;
676yy92:
677 t1 = yyt1;
678 t3 = yyt2;
679 t2 = yyt2 - 1;
680 t4 = YYCURSOR - 1;
681 {
682 if (t4-t3 >= 2 && strlen("extension_loaded") == t2-t1 && strncmp("extension_loaded", t1, t2-t1) == 0) {
683 int is_loaded = (zend_hash_str_find_ptr(&module_registry, t3+1, t4-t3-2) != NULL);
684 APPLY_OP(is_loaded);
685 } else {
686 cs_error_log("unknown function in condition on line %d", lineno);
687 goto out;
688 }
689 goto yyc_cond_op;
690 }
691yy93:
692 yych = *++YYCURSOR;
693 if (yych == ')') goto yy91;
694 goto yy88;
695yy94:
696 yych = *++YYCURSOR;
697 if (yybm[0+yych] & 64) {
698 goto yy89;
699 }
700 if (yych <= '\r') goto yy88;
701 if (yych >= '#') goto yy94;
702 yych = *++YYCURSOR;
703 if (yybm[0+yych] & 128) {
704 goto yy94;
705 }
706 if (yych <= '\r') {
707 if (yych == '\n') goto yy88;
708 if (yych <= '\f') goto yy89;
709 goto yy88;
710 } else {
711 if (yych <= '"') {
712 if (yych <= '!') goto yy89;
713 goto yy93;
714 } else {
715 if (yych != ')') goto yy89;
716 }
717 }
718 yyaccept = 1;
719 yych = *(YYMARKER = ++YYCURSOR);
720 if (yybm[0+yych] & 64) {
721 goto yy89;
722 }
723 if (yych <= '\r') goto yy92;
724 if (yych <= '"') goto yy93;
725 goto yy94;
726 }
727/* *********************************** */
728yyc_cond_op:
729 {
730 static const unsigned char yybm[] = {
731 0, 0, 0, 0, 0, 0, 0, 0,
732 0, 128, 0, 0, 0, 0, 0, 0,
733 0, 0, 0, 0, 0, 0, 0, 0,
734 0, 0, 0, 0, 0, 0, 0, 0,
735 128, 0, 0, 0, 0, 0, 0, 0,
736 0, 0, 0, 0, 0, 0, 0, 0,
737 0, 0, 0, 0, 0, 0, 0, 0,
738 0, 0, 0, 0, 0, 0, 0, 0,
739 0, 0, 0, 0, 0, 0, 0, 0,
740 0, 0, 0, 0, 0, 0, 0, 0,
741 0, 0, 0, 0, 0, 0, 0, 0,
742 0, 0, 0, 0, 0, 0, 0, 0,
743 0, 0, 0, 0, 0, 0, 0, 0,
744 0, 0, 0, 0, 0, 0, 0, 0,
745 0, 0, 0, 0, 0, 0, 0, 0,
746 0, 0, 0, 0, 0, 0, 0, 0,
747 0, 0, 0, 0, 0, 0, 0, 0,
748 0, 0, 0, 0, 0, 0, 0, 0,
749 0, 0, 0, 0, 0, 0, 0, 0,
750 0, 0, 0, 0, 0, 0, 0, 0,
751 0, 0, 0, 0, 0, 0, 0, 0,
752 0, 0, 0, 0, 0, 0, 0, 0,
753 0, 0, 0, 0, 0, 0, 0, 0,
754 0, 0, 0, 0, 0, 0, 0, 0,
755 0, 0, 0, 0, 0, 0, 0, 0,
756 0, 0, 0, 0, 0, 0, 0, 0,
757 0, 0, 0, 0, 0, 0, 0, 0,
758 0, 0, 0, 0, 0, 0, 0, 0,
759 0, 0, 0, 0, 0, 0, 0, 0,
760 0, 0, 0, 0, 0, 0, 0, 0,
761 0, 0, 0, 0, 0, 0, 0, 0,
762 0, 0, 0, 0, 0, 0, 0, 0,
763 };
764 yych = *YYCURSOR;
765 if (yybm[0+yych] & 128) {
766 goto yy102;
767 }
768 if (yych <= ':') {
769 if (yych <= '\f') {
770 if (yych <= 0x08) goto yy100;
771 if (yych <= '\n') goto yy105;
772 } else {
773 if (yych <= '\r') goto yy107;
774 if (yych == '&') {
775 yyt1 = YYCURSOR;
776 goto yy108;
777 }
778 }
779 } else {
780 if (yych <= '=') {
781 if (yych <= ';') goto yy109;
782 if (yych <= '<') {
783 yyt1 = YYCURSOR;
784 goto yy111;
785 }
786 yyt1 = YYCURSOR;
787 goto yy113;
788 } else {
789 if (yych <= '>') {
790 yyt1 = YYCURSOR;
791 goto yy111;
792 }
793 if (yych == '|') {
794 yyt1 = YYCURSOR;
795 goto yy114;
796 }
797 }
798 }
799yy100:
800 ++YYCURSOR;
801yy101:
802 { cs_error_log("Syntax error in condition on line %d", lineno); return false; }
803yy102:
804 yych = *++YYCURSOR;
805 if (yybm[0+yych] & 128) {
806 goto yy102;
338 } 807 }
339 if (yych <= '\r') goto yy30; 808 { goto yyc_cond_op; }
340 if (yych <= '"') goto yy29; 809yy105:
341 goto yy31; 810 ++YYCURSOR;
811 { lineno++; goto yyc_cond_op; }
812yy107:
813 yych = *++YYCURSOR;
814 if (yych == '\n') goto yy105;
815 goto yy101;
816yy108:
817 yych = *++YYCURSOR;
818 if (yych == '&') goto yy111;
819 goto yy101;
820yy109:
821 ++YYCURSOR;
822 { goto yyc_init; }
823yy111:
824 ++YYCURSOR;
825 t1 = yyt1;
826 { cond_op = *t1; goto yyc_cond; }
827yy113:
828 yych = *++YYCURSOR;
829 if (yych == '=') goto yy111;
830 goto yy101;
831yy114:
832 yych = *++YYCURSOR;
833 if (yych == '|') goto yy111;
834 goto yy101;
342 } 835 }
343/* *********************************** */ 836/* *********************************** */
344yyc_rule: 837yyc_rule:
@@ -379,156 +872,158 @@ yyc_rule:
379 }; 872 };
380 yych = *YYCURSOR; 873 yych = *YYCURSOR;
381 if (yybm[0+yych] & 8) { 874 if (yybm[0+yych] & 8) {
382 goto yy40; 875 goto yy119;
383 } 876 }
384 if (yych <= '\r') { 877 if (yych <= '\r') {
385 if (yych <= 0x08) goto yy38; 878 if (yych <= 0x08) goto yy117;
386 if (yych <= '\n') goto yy43; 879 if (yych <= '\n') goto yy122;
387 if (yych >= '\r') goto yy44; 880 if (yych >= '\r') goto yy123;
388 } else { 881 } else {
389 if (yych <= '.') { 882 if (yych <= '.') {
390 if (yych >= '.') goto yy45; 883 if (yych >= '.') goto yy124;
391 } else { 884 } else {
392 if (yych == ';') goto yy46; 885 if (yych == ';') goto yy125;
393 } 886 }
394 } 887 }
395yy38: 888yy117:
396 ++YYCURSOR; 889 ++YYCURSOR;
397yy39: 890yy118:
398 { goto end_of_rule; } 891 { goto end_of_rule; }
399yy40: 892yy119:
400 yych = *++YYCURSOR; 893 yych = *++YYCURSOR;
401 if (yybm[0+yych] & 8) { 894 if (yybm[0+yych] & 8) {
402 goto yy40; 895 goto yy119;
403 } 896 }
404 { goto yyc_rule; } 897 { goto yyc_rule; }
405yy43: 898yy122:
406 yyaccept = 0; 899 yyaccept = 0;
407 yych = *(YYMARKER = ++YYCURSOR); 900 yych = *(YYMARKER = ++YYCURSOR);
408 if (yych <= '\r') { 901 if (yych <= '\r') {
409 if (yych <= 0x08) goto yy39; 902 if (yych <= 0x08) goto yy118;
410 if (yych <= '\n') { 903 if (yych <= '\n') {
411 yyt1 = YYCURSOR; 904 yyt1 = YYCURSOR;
412 goto yy48; 905 goto yy127;
413 } 906 }
414 if (yych <= '\f') goto yy39; 907 if (yych <= '\f') goto yy118;
415 yyt1 = YYCURSOR; 908 yyt1 = YYCURSOR;
416 goto yy51; 909 goto yy130;
417 } else { 910 } else {
418 if (yych <= ' ') { 911 if (yych <= ' ') {
419 if (yych <= 0x1F) goto yy39; 912 if (yych <= 0x1F) goto yy118;
420 yyt1 = YYCURSOR; 913 yyt1 = YYCURSOR;
421 goto yy48; 914 goto yy127;
422 } else { 915 } else {
423 if (yych == '.') { 916 if (yych == '.') {
424 yyt1 = YYCURSOR; 917 yyt1 = YYCURSOR;
425 goto yy52; 918 goto yy131;
426 } 919 }
427 goto yy39; 920 goto yy118;
428 } 921 }
429 } 922 }
430yy44: 923yy123:
431 yyaccept = 0; 924 yyaccept = 0;
432 yych = *(YYMARKER = ++YYCURSOR); 925 yych = *(YYMARKER = ++YYCURSOR);
433 if (yych == '\n') goto yy54; 926 if (yych == '\n') goto yy133;
434 goto yy39; 927 goto yy118;
435yy45: 928yy124:
436 yych = *++YYCURSOR; 929 yych = *++YYCURSOR;
437 if (yych <= '^') { 930 if (yych <= '^') {
438 if (yych <= '@') goto yy39; 931 if (yych <= '@') goto yy118;
439 if (yych <= 'Z') { 932 if (yych <= 'Z') {
440 yyt1 = YYCURSOR; 933 yyt1 = YYCURSOR;
441 goto yy55; 934 goto yy134;
442 } 935 }
443 goto yy39; 936 goto yy118;
444 } else { 937 } else {
445 if (yych == '`') goto yy39; 938 if (yych == '`') goto yy118;
446 if (yych <= 'z') { 939 if (yych <= 'z') {
447 yyt1 = YYCURSOR; 940 yyt1 = YYCURSOR;
448 goto yy55; 941 goto yy134;
449 } 942 }
450 goto yy39; 943 goto yy118;
451 } 944 }
452yy46: 945yy125:
453 ++YYCURSOR; 946 ++YYCURSOR;
454 { 947 {
455 end_of_rule: 948 end_of_rule:
949 if (!cond_res) { goto yyc_init; }
456 parsed_rule[kw_i++] = (sp_parsed_keyword){0, 0, 0, 0, 0, 0}; 950 parsed_rule[kw_i++] = (sp_parsed_keyword){0, 0, 0, 0, 0, 0};
457 if (process_rule && process_rule(parsed_rule) != SUCCESS) { 951 if (process_rule && process_rule(parsed_rule) != SUCCESS) {
458 goto out; 952 goto out;
459 } 953 }
460 goto yyc_init; 954 goto yyc_init;
461 } 955 }
462yy48: 956yy127:
463 yych = *++YYCURSOR; 957 yych = *++YYCURSOR;
464 if (yybm[0+yych] & 16) { 958 if (yybm[0+yych] & 16) {
465 goto yy48; 959 goto yy127;
466 } 960 }
467 if (yych == '\r') goto yy51; 961 if (yych == '\r') goto yy130;
468 if (yych == '.') goto yy52; 962 if (yych == '.') goto yy131;
469yy50: 963yy129:
470 YYCURSOR = YYMARKER; 964 YYCURSOR = YYMARKER;
471 if (yyaccept <= 1) { 965 if (yyaccept <= 1) {
472 if (yyaccept == 0) { 966 if (yyaccept == 0) {
473 goto yy39; 967 goto yy118;
474 } else { 968 } else {
475 yyt3 = yyt4 = NULL; 969 yyt3 = yyt4 = NULL;
476 yyt2 = YYCURSOR; 970 yyt2 = YYCURSOR;
477 goto yy57; 971 goto yy136;
478 } 972 }
479 } else { 973 } else {
480 goto yy57; 974 goto yy136;
481 } 975 }
482yy51: 976yy130:
483 yych = *++YYCURSOR; 977 yych = *++YYCURSOR;
484 if (yych == '\n') goto yy48; 978 if (yych == '\n') goto yy127;
485 goto yy50; 979 goto yy129;
486yy52: 980yy131:
487 ++YYCURSOR; 981 ++YYCURSOR;
488 YYCURSOR = yyt1; 982 YYCURSOR = yyt1;
489 { lineno++; goto yyc_rule; } 983 { lineno++; goto yyc_rule; }
490yy54: 984yy133:
491 yych = *++YYCURSOR; 985 yych = *++YYCURSOR;
492 if (yych <= '\r') { 986 if (yych <= '\r') {
493 if (yych <= 0x08) goto yy50; 987 if (yych <= 0x08) goto yy129;
494 if (yych <= '\n') { 988 if (yych <= '\n') {
495 yyt1 = YYCURSOR; 989 yyt1 = YYCURSOR;
496 goto yy48; 990 goto yy127;
497 } 991 }
498 if (yych <= '\f') goto yy50; 992 if (yych <= '\f') goto yy129;
499 yyt1 = YYCURSOR; 993 yyt1 = YYCURSOR;
500 goto yy51; 994 goto yy130;
501 } else { 995 } else {
502 if (yych <= ' ') { 996 if (yych <= ' ') {
503 if (yych <= 0x1F) goto yy50; 997 if (yych <= 0x1F) goto yy129;
504 yyt1 = YYCURSOR; 998 yyt1 = YYCURSOR;
505 goto yy48; 999 goto yy127;
506 } else { 1000 } else {
507 if (yych == '.') { 1001 if (yych == '.') {
508 yyt1 = YYCURSOR; 1002 yyt1 = YYCURSOR;
509 goto yy52; 1003 goto yy131;
510 } 1004 }
511 goto yy50; 1005 goto yy129;
512 } 1006 }
513 } 1007 }
514yy55: 1008yy134:
515 yyaccept = 1; 1009 yyaccept = 1;
516 yych = *(YYMARKER = ++YYCURSOR); 1010 yych = *(YYMARKER = ++YYCURSOR);
517 if (yybm[0+yych] & 32) { 1011 if (yybm[0+yych] & 32) {
518 goto yy55; 1012 goto yy134;
519 } 1013 }
520 if (yych == '(') { 1014 if (yych == '(') {
521 yyt2 = YYCURSOR; 1015 yyt2 = YYCURSOR;
522 goto yy58; 1016 goto yy137;
523 } 1017 }
524 yyt3 = yyt4 = NULL; 1018 yyt3 = yyt4 = NULL;
525 yyt2 = YYCURSOR; 1019 yyt2 = YYCURSOR;
526yy57: 1020yy136:
527 t1 = yyt1; 1021 t1 = yyt1;
528 t2 = yyt2; 1022 t2 = yyt2;
529 t3 = yyt3; 1023 t3 = yyt3;
530 t4 = yyt4; 1024 t4 = yyt4;
531 { 1025 {
1026 if (!cond_res) { goto yyc_rule; }
532 if (kw_i == max_keywords) { 1027 if (kw_i == max_keywords) {
533 cs_error_log("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno); 1028 cs_error_log("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno);
534 goto out; 1029 goto out;
@@ -557,110 +1052,110 @@ yy57:
557 parsed_rule[kw_i++] = kw; 1052 parsed_rule[kw_i++] = kw;
558 goto yyc_rule; 1053 goto yyc_rule;
559 } 1054 }
560yy58: 1055yy137:
561 yych = *++YYCURSOR; 1056 yych = *++YYCURSOR;
562 if (yych <= '@') { 1057 if (yych <= '@') {
563 if (yych <= '"') { 1058 if (yych <= '"') {
564 if (yych <= '!') goto yy50; 1059 if (yych <= '!') goto yy129;
565 yyt3 = YYCURSOR; 1060 yyt3 = YYCURSOR;
566 } else { 1061 } else {
567 if (yych == ')') { 1062 if (yych == ')') {
568 yyt3 = yyt4 = YYCURSOR; 1063 yyt3 = yyt4 = YYCURSOR;
569 goto yy61; 1064 goto yy140;
570 } 1065 }
571 goto yy50; 1066 goto yy129;
572 } 1067 }
573 } else { 1068 } else {
574 if (yych <= '_') { 1069 if (yych <= '_') {
575 if (yych <= 'Z') { 1070 if (yych <= 'Z') {
576 yyt3 = YYCURSOR; 1071 yyt3 = YYCURSOR;
577 goto yy62; 1072 goto yy141;
578 } 1073 }
579 if (yych <= '^') goto yy50; 1074 if (yych <= '^') goto yy129;
580 yyt3 = YYCURSOR; 1075 yyt3 = YYCURSOR;
581 goto yy62; 1076 goto yy141;
582 } else { 1077 } else {
583 if (yych <= '`') goto yy50; 1078 if (yych <= '`') goto yy129;
584 if (yych <= 'z') { 1079 if (yych <= 'z') {
585 yyt3 = YYCURSOR; 1080 yyt3 = YYCURSOR;
586 goto yy62; 1081 goto yy141;
587 } 1082 }
588 goto yy50; 1083 goto yy129;
589 } 1084 }
590 } 1085 }
591yy59: 1086yy138:
592 yych = *++YYCURSOR; 1087 yych = *++YYCURSOR;
593 if (yybm[0+yych] & 64) { 1088 if (yybm[0+yych] & 64) {
594 goto yy59; 1089 goto yy138;
595 } 1090 }
596 if (yych <= '\r') goto yy50; 1091 if (yych <= '\r') goto yy129;
597 if (yych <= '"') goto yy64; 1092 if (yych <= '"') goto yy143;
598 goto yy65; 1093 goto yy144;
599yy61: 1094yy140:
600 ++YYCURSOR; 1095 ++YYCURSOR;
601 goto yy57; 1096 goto yy136;
602yy62: 1097yy141:
603 yych = *++YYCURSOR; 1098 yych = *++YYCURSOR;
604 if (yych <= '@') { 1099 if (yych <= '@') {
605 if (yych <= ')') { 1100 if (yych <= ')') {
606 if (yych <= '(') goto yy50; 1101 if (yych <= '(') goto yy129;
607 yyt4 = YYCURSOR; 1102 yyt4 = YYCURSOR;
608 goto yy61; 1103 goto yy140;
609 } else { 1104 } else {
610 if (yych <= '/') goto yy50; 1105 if (yych <= '/') goto yy129;
611 if (yych <= '9') goto yy62; 1106 if (yych <= '9') goto yy141;
612 goto yy50; 1107 goto yy129;
613 } 1108 }
614 } else { 1109 } else {
615 if (yych <= '_') { 1110 if (yych <= '_') {
616 if (yych <= 'Z') goto yy62; 1111 if (yych <= 'Z') goto yy141;
617 if (yych <= '^') goto yy50; 1112 if (yych <= '^') goto yy129;
618 goto yy62; 1113 goto yy141;
619 } else { 1114 } else {
620 if (yych <= '`') goto yy50; 1115 if (yych <= '`') goto yy129;
621 if (yych <= 'z') goto yy62; 1116 if (yych <= 'z') goto yy141;
622 goto yy50; 1117 goto yy129;
623 } 1118 }
624 } 1119 }
625yy64: 1120yy143:
626 yych = *++YYCURSOR; 1121 yych = *++YYCURSOR;
627 if (yych == ')') { 1122 if (yych == ')') {
628 yyt4 = YYCURSOR; 1123 yyt4 = YYCURSOR;
629 goto yy61; 1124 goto yy140;
630 } 1125 }
631 goto yy50; 1126 goto yy129;
632yy65: 1127yy144:
633 yych = *++YYCURSOR; 1128 yych = *++YYCURSOR;
634 if (yybm[0+yych] & 64) { 1129 if (yybm[0+yych] & 64) {
635 goto yy59; 1130 goto yy138;
636 } 1131 }
637 if (yych <= '\r') goto yy50; 1132 if (yych <= '\r') goto yy129;
638 if (yych >= '#') goto yy65; 1133 if (yych >= '#') goto yy144;
639 yych = *++YYCURSOR; 1134 yych = *++YYCURSOR;
640 if (yybm[0+yych] & 128) { 1135 if (yybm[0+yych] & 128) {
641 goto yy65; 1136 goto yy144;
642 } 1137 }
643 if (yych <= '\r') { 1138 if (yych <= '\r') {
644 if (yych == '\n') goto yy50; 1139 if (yych == '\n') goto yy129;
645 if (yych <= '\f') goto yy59; 1140 if (yych <= '\f') goto yy138;
646 goto yy50; 1141 goto yy129;
647 } else { 1142 } else {
648 if (yych <= '"') { 1143 if (yych <= '"') {
649 if (yych <= '!') goto yy59; 1144 if (yych <= '!') goto yy138;
650 goto yy64; 1145 goto yy143;
651 } else { 1146 } else {
652 if (yych != ')') goto yy59; 1147 if (yych != ')') goto yy138;
653 yyt4 = YYCURSOR; 1148 yyt4 = YYCURSOR;
654 } 1149 }
655 } 1150 }
656 yyaccept = 2; 1151 yyaccept = 2;
657 yych = *(YYMARKER = ++YYCURSOR); 1152 yych = *(YYMARKER = ++YYCURSOR);
658 if (yybm[0+yych] & 64) { 1153 if (yybm[0+yych] & 64) {
659 goto yy59; 1154 goto yy138;
660 } 1155 }
661 if (yych <= '\r') goto yy57; 1156 if (yych <= '\r') goto yy136;
662 if (yych <= '"') goto yy64; 1157 if (yych <= '"') goto yy143;
663 goto yy65; 1158 goto yy144;
664 } 1159 }
665} 1160}
666 1161
diff --git a/src/sp_config_scanner.re b/src/sp_config_scanner.re
index 33362fc..b36423b 100644
--- a/src/sp_config_scanner.re
+++ b/src/sp_config_scanner.re
@@ -71,6 +71,21 @@ static void str_dtor(zval *zv) {
71 zend_string_release_ex(Z_STR_P(zv), 1); 71 zend_string_release_ex(Z_STR_P(zv), 1);
72} 72}
73 73
74static int apply_op(int v1, char op, int v2, int neg) {
75 if (neg) { v2 = !v2; }
76 switch (op) {
77 case 0: return v2;
78 case '&': return (v1 && v2);
79 case '|': return (v1 || v2);
80 case '<': return (v1 < v2);
81 case '>': return (v1 > v2);
82 case '=': return (v1 == v2);
83 }
84 return 0;
85}
86
87#define APPLY_OP(v2) cond_res = apply_op(cond_res, cond_op, v2, cond_neg); cond_op = cond_neg = 0;
88
74zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*)) 89zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*))
75{ 90{
76 const char *YYCURSOR = data; 91 const char *YYCURSOR = data;
@@ -86,6 +101,10 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key
86 HashTable vars; 101 HashTable vars;
87 zend_hash_init(&vars, 10, NULL, str_dtor, 1); 102 zend_hash_init(&vars, 10, NULL, str_dtor, 1);
88 103
104 int cond_res = 1;
105 char cond_op = 0;
106 int cond_neg = 0;
107
89 int cond = yycinit; 108 int cond = yycinit;
90 long lineno = 1; 109 long lineno = 1;
91 110
@@ -101,7 +120,6 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key
101 end = "\x00"; 120 end = "\x00";
102 nl = "\r"?"\n"; 121 nl = "\r"?"\n";
103 ws = [ \t]; 122 ws = [ \t];
104 wsnl = [ \t\r\n];
105 keyword = [a-zA-Z_][a-zA-Z0-9_]*; 123 keyword = [a-zA-Z_][a-zA-Z0-9_]*;
106 string = "\"" ("\\\"" | [^"\r\n])* "\""; 124 string = "\"" ("\\\"" | [^"\r\n])* "\"";
107 125
@@ -111,7 +129,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key
111 <init> nl { lineno++; goto yyc_init; } 129 <init> nl { lineno++; goto yyc_init; }
112 <init> "sp" { kw_i = 0; goto yyc_rule; } 130 <init> "sp" { kw_i = 0; goto yyc_rule; }
113 <init> end { ret = SUCCESS; goto out; } 131 <init> end { ret = SUCCESS; goto out; }
114 <init> "set" wsnl+ @t1 keyword @t2 wsnl+ @t3 string @t4 ";"? { 132 <init> "set" ws+ @t1 keyword @t2 ws+ @t3 string @t4 ws* ";"? {
115 char *key = (char*)t1; 133 char *key = (char*)t1;
116 int keylen = t2-t1; 134 int keylen = t2-t1;
117 zend_string *tmp = zend_hash_str_find_ptr(&vars, key, keylen); 135 zend_string *tmp = zend_hash_str_find_ptr(&vars, key, keylen);
@@ -122,11 +140,42 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key
122 zend_hash_str_add_ptr(&vars, key, keylen, tmp); 140 zend_hash_str_add_ptr(&vars, key, keylen, tmp);
123 goto yyc_init; 141 goto yyc_init;
124 } 142 }
143 <init> "@condition" ws+ { goto yyc_cond; }
144 <init> "@end_condition" ws* ";" { cond_res = 1; goto yyc_init; }
125 145
146 <cond> ws+ { goto yyc_cond; }
147 <cond> nl { lineno++; goto yyc_cond; }
148 <cond> @t1 keyword @t2 "(" @t3 string? @t4 ")" {
149 if (t4-t3 >= 2 && strlen("extension_loaded") == t2-t1 && strncmp("extension_loaded", t1, t2-t1) == 0) {
150 int is_loaded = (zend_hash_str_find_ptr(&module_registry, t3+1, t4-t3-2) != NULL);
151 APPLY_OP(is_loaded);
152 } else {
153 cs_error_log("unknown function in condition on line %d", lineno);
154 goto out;
155 }
156 goto yyc_cond_op;
157 }
158 <cond> @t1 keyword @t2 {
159 zend_string *tmp = zend_hash_str_find_ptr(&vars, t1, t2-t1);
160 if (!tmp) {
161 cs_error_log("unknown variable in condition on line %d", lineno);
162 goto out;
163 }
164 APPLY_OP(atoi(ZSTR_VAL(tmp)));
165 goto yyc_cond_op;
166 }
167 <cond> @t1 [0-9]+ @t2 { APPLY_OP(atoi(t1)); goto yyc_cond_op; }
168 <cond> @t1 "!" { cond_neg = (cond_neg + 1) % 2; goto yyc_cond; }
169 <cond_op> ws+ { goto yyc_cond_op; }
170 <cond_op> nl { lineno++; goto yyc_cond_op; }
171 <cond_op> @t1 ( "&&" | "||" | "<" | ">" | "==" ) { cond_op = *t1; goto yyc_cond; }
172 <cond_op> ";" { goto yyc_init; }
173 <cond, cond_op> * { cs_error_log("Syntax error in condition on line %d", lineno); return false; }
126 174
127 <rule> ws+ { goto yyc_rule; } 175 <rule> ws+ { goto yyc_rule; }
128 <rule> nl / ( nl | ws )* "." { lineno++; goto yyc_rule; } 176 <rule> nl / ( nl | ws )* "." { lineno++; goto yyc_rule; }
129 <rule> "." @t1 keyword @t2 ( "(" @t3 ( string? | keyword ) @t4 ")" )? { 177 <rule> "." @t1 keyword @t2 ( "(" @t3 ( string? | keyword ) @t4 ")" )? {
178 if (!cond_res) { goto yyc_rule; }
130 if (kw_i == max_keywords) { 179 if (kw_i == max_keywords) {
131 cs_error_log("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno); 180 cs_error_log("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno);
132 goto out; 181 goto out;
@@ -157,6 +206,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key
157 } 206 }
158 <rule> ";" { 207 <rule> ";" {
159 end_of_rule: 208 end_of_rule:
209 if (!cond_res) { goto yyc_init; }
160 parsed_rule[kw_i++] = (sp_parsed_keyword){0, 0, 0, 0, 0, 0}; 210 parsed_rule[kw_i++] = (sp_parsed_keyword){0, 0, 0, 0, 0, 0};
161 if (process_rule && process_rule(parsed_rule) != SUCCESS) { 211 if (process_rule && process_rule(parsed_rule) != SUCCESS) {
162 goto out; 212 goto out;