summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjvoisin2023-04-29 16:46:02 +0200
committerjvoisin2023-04-29 16:46:02 +0200
commitcee55351d6c2865447e72d9e3e8ba5922647162d (patch)
tree8172322ef3cb9560611b00e3addf8ce89d51053a
parent8532f01c7f3c356fbb2dda593477d3902491de77 (diff)
Improve how the parser is generated
- use long variant of options for re2c in its makefile - use `define` instead of magic numbers - add some consts - trailing `;` are now mandatory for conditions - NULL bytes are no longer allowed in configuration file - the parser shouldn't crash in the absence of trailing new line at the end of its configuration file
-rw-r--r--src/Makefile.frag4
-rw-r--r--src/sp_config_scanner.cached.c1088
-rw-r--r--src/sp_config_scanner.h2
-rw-r--r--src/sp_config_scanner.re139
-rw-r--r--src/tests/broken_configuration/broken_conf.phpt2
-rw-r--r--src/tests/broken_configuration/broken_conf_allow_broken_disabled.phpt2
-rw-r--r--src/tests/broken_configuration/broken_conf_allow_broken_enabled.phpt2
7 files changed, 645 insertions, 594 deletions
diff --git a/src/Makefile.frag b/src/Makefile.frag
index 454ba60..6598df2 100644
--- a/src/Makefile.frag
+++ b/src/Makefile.frag
@@ -1,7 +1,7 @@
1$(srcdir)/sp_config_scanner.c: $(srcdir)/sp_config_scanner.re 1$(srcdir)/sp_config_scanner.c: $(srcdir)/sp_config_scanner.re
2 if re2c -v |grep ' [23]\.' 2>/dev/null; then \ 2 if re2c -v |grep ' [23]\.' 2>/dev/null; then \
3 re2c -bc -o $@ $<; \ 3 re2c -W --conditions --bit-vectors --no-debug-info --output $@ $<; \
4 re2c --no-generation-date --no-version -bci -o $(srcdir)/sp_config_scanner.cached.c $<; \ 4 re2c -W --no-generation-date --bit-vectors --no-version --conditions --no-debug-info --output $(srcdir)/sp_config_scanner.cached.c $<; \
5 else \ 5 else \
6 cp $(srcdir)/sp_config_scanner.cached.c $@; \ 6 cp $(srcdir)/sp_config_scanner.cached.c $@; \
7 fi; 7 fi;
diff --git a/src/sp_config_scanner.cached.c b/src/sp_config_scanner.cached.c
index 3114918..c6099e8 100644
--- a/src/sp_config_scanner.cached.c
+++ b/src/sp_config_scanner.cached.c
@@ -15,15 +15,19 @@ enum YYCONDTYPE {
15#define cs_log_info(fmt, ...) sp_log_msg("config", SP_LOG_INFO, fmt, ##__VA_ARGS__) 15#define cs_log_info(fmt, ...) sp_log_msg("config", SP_LOG_INFO, fmt, ##__VA_ARGS__)
16#define cs_log_warning(fmt, ...) sp_log_warn("config", fmt, ##__VA_ARGS__) 16#define cs_log_warning(fmt, ...) sp_log_warn("config", fmt, ##__VA_ARGS__)
17 17
18#define MAX_CONDITIONS 100
19#define MAX_KEYWORDS 16
20
18 21
19zend_string *sp_get_arg_string(sp_parsed_keyword const *const kw) { 22zend_string *sp_get_arg_string(sp_parsed_keyword const *const kw) {
20 if (!kw || !kw->arg) { 23 if (!kw || !kw->arg) {
21 return NULL; 24 return NULL;
22 } 25 }
26
23 zend_string *ret = zend_string_init(kw->arg, kw->arglen, 1); 27 zend_string *ret = zend_string_init(kw->arg, kw->arglen, 1);
24 char *pin, *pout; 28 char *pin, *pout;
25 pin = pout = ZSTR_VAL(ret); 29 pin = pout = ZSTR_VAL(ret);
26 char *pend = pin + ZSTR_LEN(ret); 30 char const *const pend = pin + ZSTR_LEN(ret);
27 31
28 while (pin < pend) { 32 while (pin < pend) {
29 if (*pin == '\\') { 33 if (*pin == '\\') {
@@ -44,31 +48,38 @@ zend_string *sp_get_arg_string(sp_parsed_keyword const *const kw) {
44 48
45zend_string *sp_get_textual_representation(sp_parsed_keyword const *const parsed_rule) { 49zend_string *sp_get_textual_representation(sp_parsed_keyword const *const parsed_rule) {
46 // a rule is "sp.keyword...keyword(arg);\0" 50 // a rule is "sp.keyword...keyword(arg);\0"
47 size_t len = 3; // sp + ; 51 size_t len = 3; // "sp" + ";"
48 for (const sp_parsed_keyword *kw = parsed_rule; kw->kw; kw++) { 52 for (const sp_parsed_keyword *kw = parsed_rule; kw->kw; kw++) {
49 len++; // . 53 len++; // .
50 len += kw->kwlen; 54 len += kw->kwlen;
51 if (kw->argtype == SP_ARGTYPE_EMPTY) { 55 if (kw->argtype == SP_ARGTYPE_EMPTY) {
52 len += 2; // () 56 len += 2; // ()
53 } else if (kw->argtype == SP_ARGTYPE_STR) { 57 } else if (kw->argtype == SP_ARGTYPE_STR) {
54 len += 4; 58 len += 2; // ("
55 len += kw->arglen; 59 len += kw->arglen;
60 len += 2; // ")
56 } 61 }
57 } 62 }
58 63
59 zend_string *ret = zend_string_alloc(len, 1); 64 zend_string *ret = zend_string_alloc(len, 1);
60 char *ptr = ZSTR_VAL(ret); 65 char *ptr = ZSTR_VAL(ret);
61 66
62 memcpy(ptr, "sp", 2); ptr += 2; 67 memcpy(ptr, "sp", 2);
68 ptr += 2;
69
63 for (const sp_parsed_keyword *kw = parsed_rule; kw->kw; kw++) { 70 for (const sp_parsed_keyword *kw = parsed_rule; kw->kw; kw++) {
64 *ptr++ = '.'; 71 *ptr++ = '.';
65 memcpy(ptr, kw->kw, kw->kwlen); ptr += kw->kwlen; 72
73 memcpy(ptr, kw->kw, kw->kwlen);
74 ptr += kw->kwlen;
75
66 if (kw->argtype == SP_ARGTYPE_EMPTY || kw->argtype == SP_ARGTYPE_STR || kw->argtype == SP_ARGTYPE_UNKNOWN) { 76 if (kw->argtype == SP_ARGTYPE_EMPTY || kw->argtype == SP_ARGTYPE_STR || kw->argtype == SP_ARGTYPE_UNKNOWN) {
67 *ptr++ = '('; 77 *ptr++ = '(';
68 } 78 }
69 if (kw->argtype == SP_ARGTYPE_STR && kw->arg) { 79 if (kw->argtype == SP_ARGTYPE_STR && kw->arg) {
70 *ptr++ = '"'; 80 *ptr++ = '"';
71 memcpy(ptr, kw->arg, kw->arglen); ptr += kw->arglen; 81 memcpy(ptr, kw->arg, kw->arglen);
82 ptr += kw->arglen;
72 *ptr++ = '"'; 83 *ptr++ = '"';
73 } 84 }
74 if (kw->argtype == SP_ARGTYPE_EMPTY || kw->argtype == SP_ARGTYPE_STR || kw->argtype == SP_ARGTYPE_UNKNOWN) { 85 if (kw->argtype == SP_ARGTYPE_EMPTY || kw->argtype == SP_ARGTYPE_STR || kw->argtype == SP_ARGTYPE_UNKNOWN) {
@@ -86,16 +97,16 @@ static void str_dtor(zval *zv) {
86 97
87// sy_ functions and macros are helpers for the shunting yard algorithm 98// sy_ functions and macros are helpers for the shunting yard algorithm
88#define sy_res_push(val) \ 99#define sy_res_push(val) \
89 if (cond_res_i >= 100) { cs_log_error("condition too complex on line %d", lineno); goto out; } \ 100 if (cond_res_i >= MAX_CONDITIONS) { cs_log_error("condition too complex on line %d", lineno); goto out; } \
90 cond_res[cond_res_i++] = val; 101 cond_res[cond_res_i++] = val;
91#define sy_res_pop() cond_res[--cond_res_i] 102#define sy_res_pop() cond_res[--cond_res_i]
92#define sy_op_push(op) \ 103#define sy_op_push(op) \
93 if (cond_op_i >= 100) { cs_log_error("condition too complex on line %d", lineno); goto out; } \ 104 if (cond_op_i >= MAX_CONDITIONS) { cs_log_error("condition too complex on line %d", lineno); goto out; } \
94 cond_op[cond_op_i++] = op; 105 cond_op[cond_op_i++] = op;
95#define sy_op_pop() cond_op[--cond_op_i] 106#define sy_op_pop() cond_op[--cond_op_i]
96#define sy_op_peek() cond_op[cond_op_i-1] 107#define sy_op_peek() cond_op[cond_op_i-1]
97 108
98static inline int sy_op_precedence(char op) { 109static inline int sy_op_precedence(const char op) {
99 switch (op) { 110 switch (op) {
100 case '!': return 120; 111 case '!': return 120;
101 case '<': 112 case '<':
@@ -109,13 +120,15 @@ static inline int sy_op_precedence(char op) {
109 } 120 }
110 return 0; 121 return 0;
111} 122}
112static inline int sy_op_is_left_assoc(char op) { 123
124static inline int sy_op_is_left_assoc(const char op) {
113 switch (op) { 125 switch (op) {
114 case '!': return 0; 126 case '!': return 0;
115 } 127 }
116 return 1; 128 return 1;
117} 129}
118static int sy_apply_op(char op, int a, int b) { 130
131static int sy_apply_op(const char op, const int a, const int b) {
119 switch (op) { 132 switch (op) {
120 case '!': return !a; 133 case '!': return !a;
121 case '&': return (b && a); 134 case '&': return (b && a);
@@ -145,38 +158,35 @@ static int sy_apply_op(char op, int a, int b) {
145 tmpstr[tmplen] = 0; 158 tmpstr[tmplen] = 0;
146 159
147 160
148zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*)) 161zend_result sp_config_scan(const char *data, zend_result (*process_rule)(sp_parsed_keyword*))
149{ 162{
150 const char *YYCURSOR = data;
151 const char *YYMARKER, *t1, *t2, *t3, *t4; 163 const char *YYMARKER, *t1, *t2, *t3, *t4;
152 const char *yyt1;
153const char *yyt2;
154const char *yyt3;
155const char *yyt4;
156
157 164
158 int ret = FAILURE; 165 int ret = FAILURE;
159 166 sp_parsed_keyword parsed_rule[MAX_KEYWORDS+1];
160 const int max_keywords = 16;
161 sp_parsed_keyword parsed_rule[max_keywords+1];
162 int kw_i = 0; 167 int kw_i = 0;
163 168
164 HashTable vars; 169 HashTable vars;
165 zend_hash_init(&vars, 10, NULL, str_dtor, 1); 170 zend_hash_init(&vars, 10, NULL, str_dtor, 1);
166 zend_hash_str_add_ptr(&vars, ZEND_STRL("PHP_VERSION_ID"), zend_string_init(ZEND_STRL(ZEND_TOSTR(PHP_VERSION_ID)), 1)); 171 zend_hash_str_add_ptr(&vars, ZEND_STRL("PHP_VERSION_ID"), zend_string_init(ZEND_STRL(ZEND_TOSTR(PHP_VERSION_ID)), 1));
167 172
168 173 int cond_res[MAX_CONDITIONS] = {1};
169 int cond_res[100] = {1};
170 int cond_res_i = 0; 174 int cond_res_i = 0;
171 char cond_op[100] = {0}; 175 char cond_op[MAX_CONDITIONS] = {0};
172 int cond_op_i = 0; 176 int cond_op_i = 0;
173 177
174 int cond = yycinit; 178 int cond = yycinit;
175 long lineno = 1; 179 long lineno = 1;
176 180
181 const char *yyt1;
182const char *yyt2;
183const char *yyt3;
184const char *yyt4;
185const char *yyt5;
186
177 187
178{ 188{
179 unsigned char yych; 189 char yych;
180 unsigned int yyaccept = 0; 190 unsigned int yyaccept = 0;
181 if (cond < 2) { 191 if (cond < 2) {
182 if (cond < 1) { 192 if (cond < 1) {
@@ -195,8 +205,8 @@ const char *yyt4;
195yyc_init: 205yyc_init:
196 { 206 {
197 static const unsigned char yybm[] = { 207 static const unsigned char yybm[] = {
198 80, 80, 80, 80, 80, 80, 80, 80, 208 0, 80, 80, 80, 80, 80, 80, 80,
199 80, 88, 0, 80, 80, 16, 80, 80, 209 80, 88, 0, 80, 80, 0, 80, 80,
200 80, 80, 80, 80, 80, 80, 80, 80, 210 80, 80, 80, 80, 80, 80, 80, 80,
201 80, 80, 80, 80, 80, 80, 80, 80, 211 80, 80, 80, 80, 80, 80, 80, 80,
202 88, 80, 16, 80, 80, 80, 80, 80, 212 88, 80, 16, 80, 80, 80, 80, 80,
@@ -228,7 +238,7 @@ yyc_init:
228 80, 80, 80, 80, 80, 80, 80, 80, 238 80, 80, 80, 80, 80, 80, 80, 80,
229 80, 80, 80, 80, 80, 80, 80, 80, 239 80, 80, 80, 80, 80, 80, 80, 80,
230 }; 240 };
231 yych = *YYCURSOR; 241 yych = *data;
232 if (yybm[0+yych] & 8) { 242 if (yybm[0+yych] & 8) {
233 goto yy4; 243 goto yy4;
234 } 244 }
@@ -253,34 +263,34 @@ yyc_init:
253 } 263 }
254 } 264 }
255yy1: 265yy1:
256 ++YYCURSOR; 266 ++data;
257 { ret = SUCCESS; goto out; } 267 { ret = SUCCESS; goto out; }
258yy2: 268yy2:
259 ++YYCURSOR; 269 ++data;
260yy3: 270yy3:
261 { cs_log_error("Parser error on line %d", lineno); goto out; } 271 { cs_log_error("parser error on line %d", lineno); goto out; }
262yy4: 272yy4:
263 yych = *++YYCURSOR; 273 yych = *++data;
264 if (yybm[0+yych] & 8) { 274 if (yybm[0+yych] & 8) {
265 goto yy4; 275 goto yy4;
266 } 276 }
267 { goto yyc_init; } 277 { goto yyc_init; }
268yy5: 278yy5:
269 ++YYCURSOR; 279 ++data;
270 { lineno++; goto yyc_init; } 280 { lineno++; goto yyc_init; }
271yy6: 281yy6:
272 yych = *++YYCURSOR; 282 yych = *++data;
273 if (yych == '\n') goto yy5; 283 if (yych == '\n') goto yy5;
274 goto yy3; 284 goto yy3;
275yy7: 285yy7:
276 yych = *++YYCURSOR; 286 yych = *++data;
277 if (yybm[0+yych] & 16) { 287 if (yybm[0+yych] & 16) {
278 goto yy7; 288 goto yy7;
279 } 289 }
280 { goto yyc_init; } 290 { goto yyc_init; }
281yy8: 291yy8:
282 yyaccept = 0; 292 yyaccept = 0;
283 yych = *(YYMARKER = ++YYCURSOR); 293 yych = *(YYMARKER = ++data);
284 switch (yych) { 294 switch (yych) {
285 case 'c': goto yy10; 295 case 'c': goto yy10;
286 case 'e': goto yy12; 296 case 'e': goto yy12;
@@ -292,171 +302,143 @@ yy8:
292 } 302 }
293yy9: 303yy9:
294 yyaccept = 0; 304 yyaccept = 0;
295 yych = *(YYMARKER = ++YYCURSOR); 305 yych = *(YYMARKER = ++data);
296 if (yych == 'e') goto yy17; 306 if (yych == 'e') goto yy17;
297 if (yych == 'p') goto yy18; 307 if (yych == 'p') goto yy18;
298 goto yy3; 308 goto yy3;
299yy10: 309yy10:
300 yych = *++YYCURSOR; 310 yych = *++data;
301 if (yych == 'o') goto yy19; 311 if (yych == 'o') goto yy19;
302yy11: 312yy11:
303 YYCURSOR = YYMARKER; 313 data = YYMARKER;
304 if (yyaccept <= 4) { 314 if (yyaccept <= 2) {
305 if (yyaccept <= 2) { 315 if (yyaccept <= 1) {
306 if (yyaccept <= 1) { 316 if (yyaccept == 0) {
307 if (yyaccept == 0) { 317 goto yy3;
308 goto yy3;
309 } else {
310 yyt2 = YYCURSOR;
311 goto yy54;
312 }
313 } else { 318 } else {
314 yyt2 = YYCURSOR; 319 goto yy63;
315 goto yy57;
316 } 320 }
317 } else { 321 } else {
318 if (yyaccept == 3) { 322 goto yy66;
319 goto yy54;
320 } else {
321 goto yy57;
322 }
323 } 323 }
324 } else { 324 } else {
325 if (yyaccept <= 6) { 325 if (yyaccept == 3) {
326 if (yyaccept == 5) { 326 goto yy78;
327 yyt2 = YYCURSOR;
328 goto yy69;
329 } else {
330 yyt4 = YYCURSOR;
331 goto yy73;
332 }
333 } else { 327 } else {
334 if (yyaccept == 7) { 328 goto yy82;
335 goto yy69;
336 } else {
337 goto yy73;
338 }
339 } 329 }
340 } 330 }
341yy12: 331yy12:
342 yych = *++YYCURSOR; 332 yych = *++data;
343 if (yych == 'n') goto yy20; 333 if (yych == 'n') goto yy20;
344 if (yych == 'r') goto yy21; 334 if (yych == 'r') goto yy21;
345 goto yy11; 335 goto yy11;
346yy13: 336yy13:
347 yych = *++YYCURSOR; 337 yych = *++data;
348 if (yych == 'n') goto yy22; 338 if (yych == 'n') goto yy22;
349 goto yy11; 339 goto yy11;
350yy14: 340yy14:
351 yych = *++YYCURSOR; 341 yych = *++data;
352 if (yych == 'o') goto yy23; 342 if (yych == 'o') goto yy23;
353 goto yy11; 343 goto yy11;
354yy15: 344yy15:
355 yych = *++YYCURSOR; 345 yych = *++data;
356 if (yych == 'e') goto yy17; 346 if (yych == 'e') goto yy17;
357 goto yy11; 347 goto yy11;
358yy16: 348yy16:
359 yych = *++YYCURSOR; 349 yych = *++data;
360 if (yych == 'a') goto yy24; 350 if (yych == 'a') goto yy24;
361 goto yy11; 351 goto yy11;
362yy17: 352yy17:
363 yych = *++YYCURSOR; 353 yych = *++data;
364 if (yych == 't') goto yy25; 354 if (yych == 't') goto yy25;
365 goto yy11; 355 goto yy11;
366yy18: 356yy18:
367 ++YYCURSOR; 357 ++data;
368 { kw_i = 0; goto yyc_rule; } 358 { kw_i = 0; goto yyc_rule; }
369yy19: 359yy19:
370 yych = *++YYCURSOR; 360 yych = *++data;
371 if (yych == 'n') goto yy26; 361 if (yych == 'n') goto yy26;
372 goto yy11; 362 goto yy11;
373yy20: 363yy20:
374 yych = *++YYCURSOR; 364 yych = *++data;
375 if (yych == 'd') goto yy27; 365 if (yych == 'd') goto yy27;
376 goto yy11; 366 goto yy11;
377yy21: 367yy21:
378 yych = *++YYCURSOR; 368 yych = *++data;
379 if (yych == 'r') goto yy28; 369 if (yych == 'r') goto yy28;
380 goto yy11; 370 goto yy11;
381yy22: 371yy22:
382 yych = *++YYCURSOR; 372 yych = *++data;
383 if (yych == 'f') goto yy29; 373 if (yych == 'f') goto yy29;
384 goto yy11; 374 goto yy11;
385yy23: 375yy23:
386 yych = *++YYCURSOR; 376 yych = *++data;
387 if (yych == 'g') goto yy30; 377 if (yych == 'g') goto yy30;
388 goto yy11; 378 goto yy11;
389yy24: 379yy24:
390 yych = *++YYCURSOR; 380 yych = *++data;
391 if (yych == 'r') goto yy31; 381 if (yych == 'r') goto yy31;
392 goto yy11; 382 goto yy11;
393yy25: 383yy25:
394 yych = *++YYCURSOR; 384 yych = *++data;
395 if (yych == '\t') goto yy32; 385 if (yych == '\t') goto yy32;
396 if (yych == ' ') goto yy32; 386 if (yych == ' ') goto yy32;
397 goto yy11; 387 goto yy11;
398yy26: 388yy26:
399 yych = *++YYCURSOR; 389 yych = *++data;
400 if (yych == 'd') goto yy33; 390 if (yych == 'd') goto yy33;
401 goto yy11; 391 goto yy11;
402yy27: 392yy27:
403 yych = *++YYCURSOR; 393 yych = *++data;
404 if (yych == '_') goto yy34; 394 if (yych == '_') goto yy34;
405 goto yy11; 395 goto yy11;
406yy28: 396yy28:
407 yych = *++YYCURSOR; 397 yych = *++data;
408 if (yych == '"') goto yy11; 398 if (yych == '"') goto yy11;
409 if (yych == 'o') goto yy37; 399 if (yych == 'o') goto yy37;
410 goto yy36; 400 goto yy36;
411yy29: 401yy29:
412 yych = *++YYCURSOR; 402 yych = *++data;
413 if (yych != 'o') goto yy11; 403 if (yych != 'o') goto yy11;
414yy30: 404yy30:
415 yych = *++YYCURSOR; 405 yych = *++data;
416 if (yych == '"') goto yy11; 406 if (yych == '"') goto yy11;
417 goto yy39; 407 goto yy39;
418yy31: 408yy31:
419 yych = *++YYCURSOR; 409 yych = *++data;
420 if (yych == 'n') goto yy40; 410 if (yych == 'n') goto yy40;
421 goto yy11; 411 goto yy11;
422yy32: 412yy32:
423 yych = *++YYCURSOR; 413 yych = *++data;
424 if (yych <= '@') { 414 if (yych <= ' ') {
425 if (yych <= '\t') { 415 if (yych == '\t') goto yy32;
426 if (yych <= 0x08) goto yy11; 416 if (yych <= 0x1F) goto yy11;
427 goto yy32; 417 goto yy32;
428 } else {
429 if (yych == ' ') goto yy32;
430 goto yy11;
431 }
432 } else { 418 } else {
433 if (yych <= '_') { 419 if (yych <= 'Z') {
434 if (yych <= 'Z') { 420 if (yych <= '@') goto yy11;
435 yyt1 = YYCURSOR; 421 yyt1 = data;
436 goto yy41;
437 }
438 if (yych <= '^') goto yy11;
439 yyt1 = YYCURSOR;
440 goto yy41; 422 goto yy41;
441 } else { 423 } else {
442 if (yych <= '`') goto yy11; 424 if (yych <= '`') goto yy11;
443 if (yych <= 'z') { 425 if (yych <= 'z') {
444 yyt1 = YYCURSOR; 426 yyt1 = data;
445 goto yy41; 427 goto yy41;
446 } 428 }
447 goto yy11; 429 goto yy11;
448 } 430 }
449 } 431 }
450yy33: 432yy33:
451 yych = *++YYCURSOR; 433 yych = *++data;
452 if (yych == 'i') goto yy42; 434 if (yych == 'i') goto yy42;
453 goto yy11; 435 goto yy11;
454yy34: 436yy34:
455 yych = *++YYCURSOR; 437 yych = *++data;
456 if (yych == 'c') goto yy43; 438 if (yych == 'c') goto yy43;
457 goto yy11; 439 goto yy11;
458yy35: 440yy35:
459 yych = *++YYCURSOR; 441 yych = *++data;
460yy36: 442yy36:
461 if (yych <= 0x1F) { 443 if (yych <= 0x1F) {
462 if (yych == '\t') goto yy35; 444 if (yych == '\t') goto yy35;
@@ -464,17 +446,17 @@ yy36:
464 } else { 446 } else {
465 if (yych <= ' ') goto yy35; 447 if (yych <= ' ') goto yy35;
466 if (yych == '"') { 448 if (yych == '"') {
467 yyt1 = YYCURSOR; 449 yyt1 = data;
468 goto yy44; 450 goto yy44;
469 } 451 }
470 goto yy11; 452 goto yy11;
471 } 453 }
472yy37: 454yy37:
473 yych = *++YYCURSOR; 455 yych = *++data;
474 if (yych == 'r') goto yy45; 456 if (yych == 'r') goto yy45;
475 goto yy11; 457 goto yy11;
476yy38: 458yy38:
477 yych = *++YYCURSOR; 459 yych = *++data;
478yy39: 460yy39:
479 if (yych <= 0x1F) { 461 if (yych <= 0x1F) {
480 if (yych == '\t') goto yy38; 462 if (yych == '\t') goto yy38;
@@ -482,67 +464,72 @@ yy39:
482 } else { 464 } else {
483 if (yych <= ' ') goto yy38; 465 if (yych <= ' ') goto yy38;
484 if (yych == '"') { 466 if (yych == '"') {
485 yyt1 = YYCURSOR; 467 yyt1 = data;
486 goto yy46; 468 goto yy46;
487 } 469 }
488 goto yy11; 470 goto yy11;
489 } 471 }
490yy40: 472yy40:
491 yych = *++YYCURSOR; 473 yych = *++data;
492 if (yych == '"') goto yy11; 474 if (yych == '"') goto yy11;
493 if (yych == 'i') goto yy49; 475 if (yych == 'i') goto yy49;
494 goto yy48; 476 goto yy48;
495yy41: 477yy41:
496 yych = *++YYCURSOR; 478 yych = *++data;
497 if (yybm[0+yych] & 32) { 479 if (yybm[0+yych] & 32) {
498 goto yy41; 480 goto yy41;
499 } 481 }
500 if (yych == '\t') { 482 if (yych == '\t') {
501 yyt2 = YYCURSOR; 483 yyt2 = data;
502 goto yy50; 484 goto yy50;
503 } 485 }
504 if (yych == ' ') { 486 if (yych == ' ') {
505 yyt2 = YYCURSOR; 487 yyt2 = data;
506 goto yy50; 488 goto yy50;
507 } 489 }
508 goto yy11; 490 goto yy11;
509yy42: 491yy42:
510 yych = *++YYCURSOR; 492 yych = *++data;
511 if (yych == 't') goto yy51; 493 if (yych == 't') goto yy51;
512 goto yy11; 494 goto yy11;
513yy43: 495yy43:
514 yych = *++YYCURSOR; 496 yych = *++data;
515 if (yych == 'o') goto yy52; 497 if (yych == 'o') goto yy52;
516 goto yy11; 498 goto yy11;
517yy44: 499yy44:
518 yych = *++YYCURSOR; 500 yych = *++data;
519 if (yybm[0+yych] & 64) { 501 if (yybm[0+yych] & 64) {
520 goto yy44; 502 goto yy44;
521 } 503 }
522 if (yych <= '\r') goto yy11; 504 if (yych <= '\r') goto yy11;
523 if (yych <= '"') goto yy53; 505 if (yych <= '"') goto yy53;
524 goto yy55; 506 goto yy54;
525yy45: 507yy45:
526 yych = *++YYCURSOR; 508 yych = *++data;
527 if (yych == '"') goto yy11; 509 if (yych == '"') goto yy11;
528 goto yy36; 510 goto yy36;
529yy46: 511yy46:
530 yych = *++YYCURSOR; 512 yych = *++data;
531 if (yych <= '\r') { 513 if (yych <= '\r') {
532 if (yych == '\n') goto yy11; 514 if (yych <= '\t') {
533 if (yych <= '\f') goto yy46; 515 if (yych <= 0x00) goto yy11;
534 goto yy11; 516 goto yy46;
517 } else {
518 if (yych <= '\n') goto yy11;
519 if (yych <= '\f') goto yy46;
520 goto yy11;
521 }
535 } else { 522 } else {
536 if (yych <= '"') { 523 if (yych <= '"') {
537 if (yych <= '!') goto yy46; 524 if (yych <= '!') goto yy46;
538 goto yy56; 525 goto yy55;
539 } else { 526 } else {
540 if (yych == '\\') goto yy58; 527 if (yych == '\\') goto yy56;
541 goto yy46; 528 goto yy46;
542 } 529 }
543 } 530 }
544yy47: 531yy47:
545 yych = *++YYCURSOR; 532 yych = *++data;
546yy48: 533yy48:
547 if (yych <= 0x1F) { 534 if (yych <= 0x1F) {
548 if (yych == '\t') goto yy47; 535 if (yych == '\t') goto yy47;
@@ -550,439 +537,475 @@ yy48:
550 } else { 537 } else {
551 if (yych <= ' ') goto yy47; 538 if (yych <= ' ') goto yy47;
552 if (yych == '"') { 539 if (yych == '"') {
553 yyt1 = YYCURSOR; 540 yyt1 = data;
554 goto yy59; 541 goto yy57;
555 } 542 }
556 goto yy11; 543 goto yy11;
557 } 544 }
558yy49: 545yy49:
559 yych = *++YYCURSOR; 546 yych = *++data;
560 if (yych == 'n') goto yy60; 547 if (yych == 'n') goto yy58;
561 goto yy11; 548 goto yy11;
562yy50: 549yy50:
563 yych = *++YYCURSOR; 550 yych = *++data;
564 if (yych <= 0x1F) { 551 if (yych <= 0x1F) {
565 if (yych == '\t') goto yy50; 552 if (yych == '\t') goto yy50;
566 goto yy11; 553 goto yy11;
567 } else { 554 } else {
568 if (yych <= ' ') goto yy50; 555 if (yych <= ' ') goto yy50;
569 if (yych == '"') { 556 if (yych == '"') {
570 yyt3 = YYCURSOR; 557 yyt3 = data;
571 goto yy61; 558 goto yy59;
572 } 559 }
573 goto yy11; 560 goto yy11;
574 } 561 }
575yy51: 562yy51:
576 yych = *++YYCURSOR; 563 yych = *++data;
577 if (yych == 'i') goto yy62; 564 if (yych == 'i') goto yy60;
578 goto yy11; 565 goto yy11;
579yy52: 566yy52:
580 yych = *++YYCURSOR; 567 yych = *++data;
581 if (yych == 'n') goto yy63; 568 if (yych == 'n') goto yy61;
582 goto yy11; 569 goto yy11;
583yy53: 570yy53:
584 yych = *++YYCURSOR; 571 yych = *++data;
585 yyt2 = YYCURSOR; 572 if (yych == ';') goto yy62;
586 if (yych == ';') goto yy64; 573 goto yy11;
587yy54: 574yy54:
588 t1 = yyt1; 575 yych = *++data;
589 t2 = yyt2;
590 {
591 if (!cond_res[0]) { goto yyc_init; }
592 TMPSTR(tmpstr, t2, t1);
593 cs_log_error("[line %d]: %s", lineno, tmpstr);
594 goto out;
595 }
596yy55:
597 yych = *++YYCURSOR;
598 if (yybm[0+yych] & 64) { 576 if (yybm[0+yych] & 64) {
599 goto yy44; 577 goto yy44;
600 } 578 }
601 if (yych <= '\r') goto yy11; 579 if (yych <= '\r') goto yy11;
602 if (yych <= '"') goto yy65; 580 if (yych <= '"') goto yy64;
603 goto yy55; 581 goto yy54;
582yy55:
583 yych = *++data;
584 if (yych == ';') goto yy65;
585 goto yy11;
604yy56: 586yy56:
605 yych = *++YYCURSOR; 587 yych = *++data;
606 yyt2 = YYCURSOR;
607 if (yych == ';') goto yy66;
608yy57:
609 t1 = yyt1;
610 t2 = yyt2;
611 {
612 if (!cond_res[0]) { goto yyc_init; }
613 TMPSTR(tmpstr, t2, t1);
614 cs_log_info("[line %d]: %s", lineno, tmpstr);
615 goto yyc_init;
616 }
617yy58:
618 yych = *++YYCURSOR;
619 if (yych <= '\r') { 588 if (yych <= '\r') {
620 if (yych == '\n') goto yy11; 589 if (yych <= '\t') {
621 if (yych <= '\f') goto yy46; 590 if (yych <= 0x00) goto yy11;
622 goto yy11; 591 goto yy46;
592 } else {
593 if (yych <= '\n') goto yy11;
594 if (yych <= '\f') goto yy46;
595 goto yy11;
596 }
623 } else { 597 } else {
624 if (yych <= '"') { 598 if (yych <= '"') {
625 if (yych <= '!') goto yy46; 599 if (yych <= '!') goto yy46;
626 goto yy67; 600 goto yy67;
627 } else { 601 } else {
628 if (yych == '\\') goto yy58; 602 if (yych == '\\') goto yy56;
629 goto yy46; 603 goto yy46;
630 } 604 }
631 } 605 }
632yy59: 606yy57:
633 yych = *++YYCURSOR; 607 yych = *++data;
634 if (yych <= '\r') { 608 if (yych <= '\r') {
635 if (yych == '\n') goto yy11; 609 if (yych <= '\t') {
636 if (yych <= '\f') goto yy59; 610 if (yych <= 0x00) goto yy11;
637 goto yy11; 611 goto yy57;
612 } else {
613 if (yych <= '\n') goto yy11;
614 if (yych <= '\f') goto yy57;
615 goto yy11;
616 }
638 } else { 617 } else {
639 if (yych <= '"') { 618 if (yych <= '"') {
640 if (yych <= '!') goto yy59; 619 if (yych <= '!') goto yy57;
641 goto yy68; 620 goto yy68;
642 } else { 621 } else {
643 if (yych == '\\') goto yy70; 622 if (yych == '\\') goto yy69;
644 goto yy59; 623 goto yy57;
645 } 624 }
646 } 625 }
647yy60: 626yy58:
648 yych = *++YYCURSOR; 627 yych = *++data;
649 if (yych == 'g') goto yy71; 628 if (yych == 'g') goto yy70;
650 goto yy11; 629 goto yy11;
651yy61: 630yy59:
652 yych = *++YYCURSOR; 631 yych = *++data;
653 if (yych <= '\r') { 632 if (yych <= '\r') {
654 if (yych == '\n') goto yy11; 633 if (yych <= '\t') {
655 if (yych <= '\f') goto yy61; 634 if (yych <= 0x00) goto yy11;
656 goto yy11; 635 goto yy59;
636 } else {
637 if (yych <= '\n') goto yy11;
638 if (yych <= '\f') goto yy59;
639 goto yy11;
640 }
657 } else { 641 } else {
658 if (yych <= '"') { 642 if (yych <= '"') {
659 if (yych <= '!') goto yy61; 643 if (yych <= '!') goto yy59;
660 goto yy72; 644 goto yy71;
661 } else { 645 } else {
662 if (yych == '\\') goto yy74; 646 if (yych == '\\') goto yy72;
663 goto yy61; 647 goto yy59;
664 } 648 }
665 } 649 }
666yy62: 650yy60:
667 yych = *++YYCURSOR; 651 yych = *++data;
668 if (yych == 'o') goto yy75; 652 if (yych == 'o') goto yy73;
669 goto yy11; 653 goto yy11;
670yy63: 654yy61:
671 yych = *++YYCURSOR; 655 yych = *++data;
672 if (yych == 'd') goto yy76; 656 if (yych == 'd') goto yy74;
673 goto yy11; 657 goto yy11;
658yy62:
659 ++data;
660yy63:
661 t1 = yyt1;
662 t2 = data - 1;
663 {
664 if (!cond_res[0]) { goto yyc_init; }
665 TMPSTR(tmpstr, t2, t1);
666 cs_log_error("[line %d]: %s", lineno, tmpstr);
667 goto out;
668 }
674yy64: 669yy64:
675 ++YYCURSOR; 670 yych = *++data;
676 goto yy54;
677yy65:
678 yyaccept = 1;
679 yych = *(YYMARKER = ++YYCURSOR);
680 if (yybm[0+yych] & 128) { 671 if (yybm[0+yych] & 128) {
681 goto yy55; 672 goto yy54;
682 } 673 }
683 if (yych <= '\r') { 674 if (yych <= '\r') {
684 if (yych == '\n') { 675 if (yych <= '\t') {
685 yyt2 = YYCURSOR; 676 if (yych <= 0x00) goto yy11;
686 goto yy54; 677 goto yy44;
678 } else {
679 if (yych <= '\n') goto yy11;
680 if (yych <= '\f') goto yy44;
681 goto yy11;
687 } 682 }
688 if (yych <= '\f') goto yy44;
689 yyt2 = YYCURSOR;
690 goto yy54;
691 } else { 683 } else {
692 if (yych <= '"') { 684 if (yych <= '"') {
693 if (yych <= '!') goto yy44; 685 if (yych <= '!') goto yy44;
694 goto yy53; 686 goto yy53;
695 } else { 687 } else {
696 if (yych == ';') { 688 if (yych == ';') goto yy75;
697 yyt2 = YYCURSOR;
698 goto yy77;
699 }
700 goto yy44; 689 goto yy44;
701 } 690 }
702 } 691 }
692yy65:
693 ++data;
703yy66: 694yy66:
704 ++YYCURSOR; 695 t1 = yyt1;
705 goto yy57; 696 t2 = data - 1;
697 {
698 if (!cond_res[0]) { goto yyc_init; }
699 TMPSTR(tmpstr, t2, t1);
700 cs_log_info("[line %d]: %s", lineno, tmpstr);
701 goto yyc_init;
702 }
706yy67: 703yy67:
707 yyaccept = 2; 704 yych = *++data;
708 yych = *(YYMARKER = ++YYCURSOR);
709 if (yych <= '!') { 705 if (yych <= '!') {
710 if (yych <= '\n') { 706 if (yych <= '\n') {
707 if (yych <= 0x00) goto yy11;
711 if (yych <= '\t') goto yy46; 708 if (yych <= '\t') goto yy46;
712 yyt2 = YYCURSOR; 709 goto yy11;
713 goto yy57;
714 } else { 710 } else {
715 if (yych == '\r') { 711 if (yych == '\r') goto yy11;
716 yyt2 = YYCURSOR;
717 goto yy57;
718 }
719 goto yy46; 712 goto yy46;
720 } 713 }
721 } else { 714 } else {
722 if (yych <= ';') { 715 if (yych <= ';') {
723 if (yych <= '"') goto yy56; 716 if (yych <= '"') goto yy55;
724 if (yych <= ':') goto yy46; 717 if (yych <= ':') goto yy46;
725 yyt2 = YYCURSOR; 718 goto yy76;
726 goto yy78;
727 } else { 719 } else {
728 if (yych == '\\') goto yy58; 720 if (yych == '\\') goto yy56;
729 goto yy46; 721 goto yy46;
730 } 722 }
731 } 723 }
732yy68: 724yy68:
733 yych = *++YYCURSOR; 725 yych = *++data;
734 yyt2 = YYCURSOR; 726 if (yych == ';') goto yy77;
735 if (yych == ';') goto yy79; 727 goto yy11;
736yy69: 728yy69:
737 t1 = yyt1; 729 yych = *++data;
738 t2 = yyt2;
739 {
740 if (!cond_res[0]) { goto yyc_init; }
741 TMPSTR(tmpstr, t2, t1);
742 cs_log_warning("[line %d]: %s", lineno, tmpstr);
743 goto yyc_init;
744 }
745yy70:
746 yych = *++YYCURSOR;
747 if (yych <= '\r') { 730 if (yych <= '\r') {
748 if (yych == '\n') goto yy11; 731 if (yych <= '\t') {
749 if (yych <= '\f') goto yy59; 732 if (yych <= 0x00) goto yy11;
750 goto yy11; 733 goto yy57;
734 } else {
735 if (yych <= '\n') goto yy11;
736 if (yych <= '\f') goto yy57;
737 goto yy11;
738 }
751 } else { 739 } else {
752 if (yych <= '"') { 740 if (yych <= '"') {
753 if (yych <= '!') goto yy59; 741 if (yych <= '!') goto yy57;
754 goto yy80; 742 goto yy79;
755 } else { 743 } else {
756 if (yych == '\\') goto yy70; 744 if (yych == '\\') goto yy69;
757 goto yy59; 745 goto yy57;
758 } 746 }
759 } 747 }
760yy71: 748yy70:
761 yych = *++YYCURSOR; 749 yych = *++data;
762 if (yych == '"') goto yy11; 750 if (yych == '"') goto yy11;
763 goto yy48; 751 goto yy48;
752yy71:
753 yych = *++data;
754 if (yych <= 0x1F) {
755 if (yych == '\t') {
756 yyt5 = data;
757 goto yy80;
758 }
759 goto yy11;
760 } else {
761 if (yych <= ' ') {
762 yyt5 = data;
763 goto yy80;
764 }
765 if (yych == ';') {
766 yyt5 = data;
767 goto yy81;
768 }
769 goto yy11;
770 }
764yy72: 771yy72:
765 yych = *++YYCURSOR; 772 yych = *++data;
766 yyt4 = YYCURSOR;
767 goto yy82;
768yy73:
769 t1 = yyt1;
770 t2 = yyt2;
771 t3 = yyt3;
772 t4 = yyt4;
773 {
774 if (!cond_res[0]) { goto yyc_init; }
775 char *key = (char*)t1;
776 int keylen = t2-t1;
777 zend_string *tmp = zend_hash_str_find_ptr(&vars, key, keylen);
778 if (tmp) {
779 zend_hash_str_del(&vars, key, keylen);
780 }
781 tmp = zend_string_init(t3+1, t4-t3-2, 1);
782 zend_hash_str_add_ptr(&vars, key, keylen, tmp);
783 goto yyc_init;
784 }
785yy74:
786 yych = *++YYCURSOR;
787 if (yych <= '\r') { 773 if (yych <= '\r') {
788 if (yych == '\n') goto yy11; 774 if (yych <= '\t') {
789 if (yych <= '\f') goto yy61; 775 if (yych <= 0x00) goto yy11;
790 goto yy11; 776 goto yy59;
777 } else {
778 if (yych <= '\n') goto yy11;
779 if (yych <= '\f') goto yy59;
780 goto yy11;
781 }
791 } else { 782 } else {
792 if (yych <= '"') { 783 if (yych <= '"') {
793 if (yych <= '!') goto yy61; 784 if (yych <= '!') goto yy59;
794 goto yy83; 785 goto yy83;
795 } else { 786 } else {
796 if (yych == '\\') goto yy74; 787 if (yych == '\\') goto yy72;
797 goto yy61; 788 goto yy59;
798 } 789 }
799 } 790 }
800yy75: 791yy73:
801 yych = *++YYCURSOR; 792 yych = *++data;
802 if (yych == 'n') goto yy84; 793 if (yych == 'n') goto yy84;
803 goto yy11; 794 goto yy11;
804yy76: 795yy74:
805 yych = *++YYCURSOR; 796 yych = *++data;
806 if (yych == 'i') goto yy85; 797 if (yych == 'i') goto yy85;
807 goto yy11; 798 goto yy11;
808yy77: 799yy75:
809 yyaccept = 3; 800 yyaccept = 1;
810 yych = *(YYMARKER = ++YYCURSOR); 801 yych = *(YYMARKER = ++data);
811 if (yybm[0+yych] & 64) { 802 if (yybm[0+yych] & 64) {
812 goto yy44; 803 goto yy44;
813 } 804 }
814 if (yych <= '\r') goto yy54; 805 if (yych <= '\r') goto yy63;
815 if (yych <= '"') goto yy53; 806 if (yych <= '"') goto yy53;
816 goto yy55; 807 goto yy54;
817yy78: 808yy76:
818 yyaccept = 4; 809 yyaccept = 2;
819 yych = *(YYMARKER = ++YYCURSOR); 810 yych = *(YYMARKER = ++data);
820 if (yych <= '\r') { 811 if (yych <= '\r') {
821 if (yych == '\n') goto yy57; 812 if (yych <= '\t') {
822 if (yych <= '\f') goto yy46; 813 if (yych <= 0x00) goto yy66;
823 goto yy57; 814 goto yy46;
815 } else {
816 if (yych <= '\n') goto yy66;
817 if (yych <= '\f') goto yy46;
818 goto yy66;
819 }
824 } else { 820 } else {
825 if (yych <= '"') { 821 if (yych <= '"') {
826 if (yych <= '!') goto yy46; 822 if (yych <= '!') goto yy46;
827 goto yy56; 823 goto yy55;
828 } else { 824 } else {
829 if (yych == '\\') goto yy58; 825 if (yych == '\\') goto yy56;
830 goto yy46; 826 goto yy46;
831 } 827 }
832 } 828 }
829yy77:
830 ++data;
831yy78:
832 t1 = yyt1;
833 t2 = data - 1;
834 {
835 if (!cond_res[0]) { goto yyc_init; }
836 TMPSTR(tmpstr, t2, t1);
837 cs_log_warning("[line %d]: %s", lineno, tmpstr);
838 goto yyc_init;
839 }
833yy79: 840yy79:
834 ++YYCURSOR; 841 yych = *++data;
835 goto yy69;
836yy80:
837 yyaccept = 5;
838 yych = *(YYMARKER = ++YYCURSOR);
839 if (yych <= '!') { 842 if (yych <= '!') {
840 if (yych <= '\n') { 843 if (yych <= '\n') {
841 if (yych <= '\t') goto yy59; 844 if (yych <= 0x00) goto yy11;
842 yyt2 = YYCURSOR; 845 if (yych <= '\t') goto yy57;
843 goto yy69; 846 goto yy11;
844 } else { 847 } else {
845 if (yych == '\r') { 848 if (yych == '\r') goto yy11;
846 yyt2 = YYCURSOR; 849 goto yy57;
847 goto yy69;
848 }
849 goto yy59;
850 } 850 }
851 } else { 851 } else {
852 if (yych <= ';') { 852 if (yych <= ';') {
853 if (yych <= '"') goto yy68; 853 if (yych <= '"') goto yy68;
854 if (yych <= ':') goto yy59; 854 if (yych <= ':') goto yy57;
855 yyt2 = YYCURSOR;
856 goto yy86; 855 goto yy86;
857 } else { 856 } else {
858 if (yych == '\\') goto yy70; 857 if (yych == '\\') goto yy69;
859 goto yy59; 858 goto yy57;
860 } 859 }
861 } 860 }
862yy81: 861yy80:
863 yych = *++YYCURSOR; 862 yych = *++data;
864yy82:
865 if (yych <= 0x1F) { 863 if (yych <= 0x1F) {
866 if (yych == '\t') goto yy81; 864 if (yych == '\t') goto yy80;
867 goto yy73; 865 goto yy11;
868 } else { 866 } else {
869 if (yych <= ' ') goto yy81; 867 if (yych <= ' ') goto yy80;
870 if (yych != ';') goto yy73; 868 if (yych != ';') goto yy11;
871 } 869 }
872 ++YYCURSOR; 870yy81:
873 goto yy73; 871 ++data;
872 yyt4 = yyt5;
873yy82:
874 t1 = yyt1;
875 t2 = yyt2;
876 t3 = yyt3;
877 t4 = yyt4;
878 {
879 if (!cond_res[0]) { goto yyc_init; }
880 char *key = (char*)t1;
881 int keylen = t2 - t1;
882 zend_string *tmp = zend_hash_str_find_ptr(&vars, key, keylen);
883 if (tmp) {
884 zend_hash_str_del(&vars, key, keylen);
885 }
886 tmp = zend_string_init(t3+1, t4-t3-2, 1); // `-2` for the surrounding double quotes.
887 zend_hash_str_add_ptr(&vars, key, keylen, tmp);
888 goto yyc_init;
889 }
874yy83: 890yy83:
875 yyaccept = 6; 891 yych = *++data;
876 yych = *(YYMARKER = ++YYCURSOR); 892 if (yych <= 0x1F) {
877 if (yych <= ' ') { 893 if (yych <= '\t') {
878 if (yych <= '\n') { 894 if (yych <= 0x00) goto yy11;
879 if (yych <= 0x08) goto yy61; 895 if (yych <= 0x08) goto yy59;
880 if (yych <= '\t') { 896 yyt5 = data;
881 yyt4 = YYCURSOR;
882 goto yy87;
883 }
884 yyt4 = YYCURSOR;
885 goto yy73;
886 } else {
887 if (yych == '\r') {
888 yyt4 = YYCURSOR;
889 goto yy73;
890 }
891 if (yych <= 0x1F) goto yy61;
892 yyt4 = YYCURSOR;
893 goto yy87; 897 goto yy87;
898 } else {
899 if (yych <= '\n') goto yy11;
900 if (yych == '\r') goto yy11;
901 goto yy59;
894 } 902 }
895 } else { 903 } else {
896 if (yych <= ':') { 904 if (yych <= ':') {
897 if (yych == '"') goto yy72; 905 if (yych <= ' ') {
898 goto yy61; 906 yyt5 = data;
907 goto yy87;
908 }
909 if (yych == '"') goto yy71;
910 goto yy59;
899 } else { 911 } else {
900 if (yych <= ';') { 912 if (yych <= ';') {
901 yyt4 = YYCURSOR; 913 yyt5 = data;
902 goto yy88; 914 goto yy88;
903 } 915 }
904 if (yych == '\\') goto yy74; 916 if (yych == '\\') goto yy72;
905 goto yy61; 917 goto yy59;
906 } 918 }
907 } 919 }
908yy84: 920yy84:
909 yych = *++YYCURSOR; 921 yych = *++data;
910 if (yych == '\t') goto yy89; 922 if (yych == '\t') goto yy89;
911 if (yych == ' ') goto yy89; 923 if (yych == ' ') goto yy89;
912 goto yy11; 924 goto yy11;
913yy85: 925yy85:
914 yych = *++YYCURSOR; 926 yych = *++data;
915 if (yych == 't') goto yy90; 927 if (yych == 't') goto yy90;
916 goto yy11; 928 goto yy11;
917yy86: 929yy86:
918 yyaccept = 7; 930 yyaccept = 3;
919 yych = *(YYMARKER = ++YYCURSOR); 931 yych = *(YYMARKER = ++data);
920 if (yych <= '\r') { 932 if (yych <= '\r') {
921 if (yych == '\n') goto yy69; 933 if (yych <= '\t') {
922 if (yych <= '\f') goto yy59; 934 if (yych <= 0x00) goto yy78;
923 goto yy69; 935 goto yy57;
936 } else {
937 if (yych <= '\n') goto yy78;
938 if (yych <= '\f') goto yy57;
939 goto yy78;
940 }
924 } else { 941 } else {
925 if (yych <= '"') { 942 if (yych <= '"') {
926 if (yych <= '!') goto yy59; 943 if (yych <= '!') goto yy57;
927 goto yy68; 944 goto yy68;
928 } else { 945 } else {
929 if (yych == '\\') goto yy70; 946 if (yych == '\\') goto yy69;
930 goto yy59; 947 goto yy57;
931 } 948 }
932 } 949 }
933yy87: 950yy87:
934 yyaccept = 8; 951 yych = *++data;
935 yych = *(YYMARKER = ++YYCURSOR); 952 if (yych <= 0x1F) {
936 if (yych <= ' ') { 953 if (yych <= '\t') {
937 if (yych <= '\n') { 954 if (yych <= 0x00) goto yy11;
938 if (yych <= 0x08) goto yy61; 955 if (yych <= 0x08) goto yy59;
939 if (yych <= '\t') goto yy87;
940 goto yy73;
941 } else {
942 if (yych == '\r') goto yy73;
943 if (yych <= 0x1F) goto yy61;
944 goto yy87; 956 goto yy87;
957 } else {
958 if (yych <= '\n') goto yy11;
959 if (yych == '\r') goto yy11;
960 goto yy59;
945 } 961 }
946 } else { 962 } else {
947 if (yych <= ':') { 963 if (yych <= ':') {
948 if (yych == '"') goto yy72; 964 if (yych <= ' ') goto yy87;
949 goto yy61; 965 if (yych == '"') goto yy71;
966 goto yy59;
950 } else { 967 } else {
951 if (yych <= ';') goto yy88; 968 if (yych <= ';') goto yy88;
952 if (yych == '\\') goto yy74; 969 if (yych == '\\') goto yy72;
953 goto yy61; 970 goto yy59;
954 } 971 }
955 } 972 }
956yy88: 973yy88:
957 yyaccept = 8; 974 yyaccept = 4;
958 yych = *(YYMARKER = ++YYCURSOR); 975 yych = *(YYMARKER = ++data);
976 yyt4 = yyt5;
959 if (yych <= '\r') { 977 if (yych <= '\r') {
960 if (yych == '\n') goto yy73; 978 if (yych <= '\t') {
961 if (yych <= '\f') goto yy61; 979 if (yych <= 0x00) goto yy82;
962 goto yy73; 980 goto yy59;
981 } else {
982 if (yych <= '\n') goto yy82;
983 if (yych <= '\f') goto yy59;
984 goto yy82;
985 }
963 } else { 986 } else {
964 if (yych <= '"') { 987 if (yych <= '"') {
965 if (yych <= '!') goto yy61; 988 if (yych <= '!') goto yy59;
966 goto yy72; 989 goto yy71;
967 } else { 990 } else {
968 if (yych == '\\') goto yy74; 991 if (yych == '\\') goto yy72;
969 goto yy61; 992 goto yy59;
970 } 993 }
971 } 994 }
972yy89: 995yy89:
973 yych = *++YYCURSOR; 996 yych = *++data;
974 if (yych == '\t') goto yy89; 997 if (yych == '\t') goto yy89;
975 if (yych == ' ') goto yy89; 998 if (yych == ' ') goto yy89;
976 { cond_res_i = 0; goto yyc_cond; } 999 { cond_res_i = 0; goto yyc_cond; }
977yy90: 1000yy90:
978 yych = *++YYCURSOR; 1001 yych = *++data;
979 if (yych != 'i') goto yy11; 1002 if (yych != 'i') goto yy11;
980 yych = *++YYCURSOR; 1003 yych = *++data;
981 if (yych != 'o') goto yy11; 1004 if (yych != 'o') goto yy11;
982 yych = *++YYCURSOR; 1005 yych = *++data;
983 if (yych != 'n') goto yy11; 1006 if (yych != 'n') goto yy11;
984yy91: 1007yy91:
985 yych = *++YYCURSOR; 1008 yych = *++data;
986 if (yych <= 0x1F) { 1009 if (yych <= 0x1F) {
987 if (yych == '\t') goto yy91; 1010 if (yych == '\t') goto yy91;
988 goto yy11; 1011 goto yy11;
@@ -990,14 +1013,14 @@ yy91:
990 if (yych <= ' ') goto yy91; 1013 if (yych <= ' ') goto yy91;
991 if (yych != ';') goto yy11; 1014 if (yych != ';') goto yy11;
992 } 1015 }
993 ++YYCURSOR; 1016 ++data;
994 { cond_res[0] = 1; cond_res_i = 0; goto yyc_init; } 1017 { cond_res[0] = 1; cond_res_i = 0; goto yyc_init; }
995 } 1018 }
996/* *********************************** */ 1019/* *********************************** */
997yyc_cond: 1020yyc_cond:
998 { 1021 {
999 static const unsigned char yybm[] = { 1022 static const unsigned char yybm[] = {
1000 64, 64, 64, 64, 64, 64, 64, 64, 1023 0, 64, 64, 64, 64, 64, 64, 64,
1001 64, 72, 0, 64, 64, 0, 64, 64, 1024 64, 72, 0, 64, 64, 0, 64, 64,
1002 64, 64, 64, 64, 64, 64, 64, 64, 1025 64, 64, 64, 64, 64, 64, 64, 64,
1003 64, 64, 64, 64, 64, 64, 64, 64, 1026 64, 64, 64, 64, 64, 64, 64, 64,
@@ -1030,89 +1053,82 @@ yyc_cond:
1030 64, 64, 64, 64, 64, 64, 64, 64, 1053 64, 64, 64, 64, 64, 64, 64, 64,
1031 64, 64, 64, 64, 64, 64, 64, 64, 1054 64, 64, 64, 64, 64, 64, 64, 64,
1032 }; 1055 };
1033 yych = *YYCURSOR; 1056 yych = *data;
1034 if (yybm[0+yych] & 8) { 1057 if (yybm[0+yych] & 8) {
1035 goto yy95; 1058 goto yy95;
1036 } 1059 }
1037 if (yych <= '(') { 1060 if (yych <= '\'') {
1038 if (yych <= '\r') { 1061 if (yych <= '\f') {
1039 if (yych <= 0x08) goto yy93; 1062 if (yych <= 0x08) goto yy93;
1040 if (yych <= '\n') goto yy96; 1063 if (yych <= '\n') goto yy96;
1041 if (yych >= '\r') goto yy97;
1042 } else { 1064 } else {
1065 if (yych <= '\r') goto yy97;
1043 if (yych <= 0x1F) goto yy93; 1066 if (yych <= 0x1F) goto yy93;
1044 if (yych <= '!') goto yy98; 1067 if (yych <= '!') goto yy98;
1045 if (yych >= '(') goto yy99;
1046 } 1068 }
1047 } else { 1069 } else {
1048 if (yych <= 'Z') { 1070 if (yych <= '@') {
1071 if (yych <= '(') goto yy99;
1049 if (yych <= '/') goto yy93; 1072 if (yych <= '/') goto yy93;
1050 if (yych <= '9') { 1073 if (yych <= '9') {
1051 yyt1 = YYCURSOR; 1074 yyt1 = data;
1052 goto yy100; 1075 goto yy100;
1053 } 1076 }
1054 if (yych >= 'A') { 1077 } else {
1055 yyt1 = YYCURSOR; 1078 if (yych <= 'Z') {
1079 yyt1 = data;
1056 goto yy101; 1080 goto yy101;
1057 } 1081 }
1058 } else { 1082 if (yych <= '`') goto yy93;
1059 if (yych <= '_') { 1083 if (yych <= 'z') {
1060 if (yych >= '_') { 1084 yyt1 = data;
1061 yyt1 = YYCURSOR; 1085 goto yy101;
1062 goto yy101;
1063 }
1064 } else {
1065 if (yych <= '`') goto yy93;
1066 if (yych <= 'z') {
1067 yyt1 = YYCURSOR;
1068 goto yy101;
1069 }
1070 } 1086 }
1071 } 1087 }
1072 } 1088 }
1073yy93: 1089yy93:
1074 ++YYCURSOR; 1090 ++data;
1075yy94: 1091yy94:
1076 { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } 1092 { cs_log_error("syntax error in condition on line %d", lineno); goto out; }
1077yy95: 1093yy95:
1078 yych = *++YYCURSOR; 1094 yych = *++data;
1079 if (yybm[0+yych] & 8) { 1095 if (yybm[0+yych] & 8) {
1080 goto yy95; 1096 goto yy95;
1081 } 1097 }
1082 { goto yyc_cond; } 1098 { goto yyc_cond; }
1083yy96: 1099yy96:
1084 ++YYCURSOR; 1100 ++data;
1085 { lineno++; goto yyc_cond; } 1101 { lineno++; goto yyc_cond; }
1086yy97: 1102yy97:
1087 yych = *++YYCURSOR; 1103 yych = *++data;
1088 if (yych == '\n') goto yy96; 1104 if (yych == '\n') goto yy96;
1089 goto yy94; 1105 goto yy94;
1090yy98: 1106yy98:
1091 ++YYCURSOR; 1107 ++data;
1092 t1 = YYCURSOR - 1; 1108 t1 = data - 1;
1093 { sy_op_push(*t1); goto yyc_cond; } 1109 { sy_op_push(*t1); goto yyc_cond; }
1094yy99: 1110yy99:
1095 ++YYCURSOR; 1111 ++data;
1096 t1 = YYCURSOR - 1; 1112 t1 = data - 1;
1097 { sy_op_push(*t1); goto yyc_cond; } 1113 { sy_op_push(*t1); goto yyc_cond; }
1098yy100: 1114yy100:
1099 yych = *++YYCURSOR; 1115 yych = *++data;
1100 if (yybm[0+yych] & 16) { 1116 if (yybm[0+yych] & 16) {
1101 goto yy100; 1117 goto yy100;
1102 } 1118 }
1103 t1 = yyt1; 1119 t1 = yyt1;
1104 t2 = YYCURSOR; 1120 t2 = data;
1105 { sy_res_push(atoi(t1)); goto yyc_cond_op; } 1121 { sy_res_push(atoi(t1)); goto yyc_cond_op; }
1106yy101: 1122yy101:
1107 yyaccept = 0; 1123 yyaccept = 0;
1108 yych = *(YYMARKER = ++YYCURSOR); 1124 yych = *(YYMARKER = ++data);
1109 if (yybm[0+yych] & 32) { 1125 if (yybm[0+yych] & 32) {
1110 goto yy101; 1126 goto yy101;
1111 } 1127 }
1112 if (yych == '(') goto yy103; 1128 if (yych == '(') goto yy103;
1113yy102: 1129yy102:
1114 t1 = yyt1; 1130 t1 = yyt1;
1115 t2 = YYCURSOR; 1131 t2 = data;
1116 { 1132 {
1117 zend_string *tmp = zend_hash_str_find_ptr(&vars, t1, t2-t1); 1133 zend_string *tmp = zend_hash_str_find_ptr(&vars, t1, t2-t1);
1118 if (!tmp) { 1134 if (!tmp) {
@@ -1123,24 +1139,24 @@ yy102:
1123 goto yyc_cond_op; 1139 goto yyc_cond_op;
1124 } 1140 }
1125yy103: 1141yy103:
1126 yych = *++YYCURSOR; 1142 yych = *++data;
1127 if (yych == '"') { 1143 if (yych == '"') {
1128 yyt2 = YYCURSOR; 1144 yyt2 = data;
1129 goto yy105; 1145 goto yy105;
1130 } 1146 }
1131 if (yych == ')') { 1147 if (yych == ')') {
1132 yyt2 = YYCURSOR; 1148 yyt2 = data;
1133 goto yy106; 1149 goto yy106;
1134 } 1150 }
1135yy104: 1151yy104:
1136 YYCURSOR = YYMARKER; 1152 data = YYMARKER;
1137 if (yyaccept == 0) { 1153 if (yyaccept == 0) {
1138 goto yy102; 1154 goto yy102;
1139 } else { 1155 } else {
1140 goto yy107; 1156 goto yy107;
1141 } 1157 }
1142yy105: 1158yy105:
1143 yych = *++YYCURSOR; 1159 yych = *++data;
1144 if (yybm[0+yych] & 64) { 1160 if (yybm[0+yych] & 64) {
1145 goto yy105; 1161 goto yy105;
1146 } 1162 }
@@ -1148,12 +1164,12 @@ yy105:
1148 if (yych <= '"') goto yy108; 1164 if (yych <= '"') goto yy108;
1149 goto yy109; 1165 goto yy109;
1150yy106: 1166yy106:
1151 ++YYCURSOR; 1167 ++data;
1152yy107: 1168yy107:
1153 t1 = yyt1; 1169 t1 = yyt1;
1154 t3 = yyt2; 1170 t3 = yyt2;
1155 t2 = yyt2 - 1; 1171 t2 = yyt2 - 1;
1156 t4 = YYCURSOR - 1; 1172 t4 = data - 1;
1157 { 1173 {
1158 if (t4-t3 >= 2 && strlen("extension_loaded") == t2-t1 && strncmp("extension_loaded", t1, t2-t1) == 0) { 1174 if (t4-t3 >= 2 && strlen("extension_loaded") == t2-t1 && strncmp("extension_loaded", t1, t2-t1) == 0) {
1159 int is_loaded = (zend_hash_str_find_ptr(&module_registry, t3+1, t4-t3-2) != NULL); 1175 int is_loaded = (zend_hash_str_find_ptr(&module_registry, t3+1, t4-t3-2) != NULL);
@@ -1165,24 +1181,29 @@ yy107:
1165 goto yyc_cond_op; 1181 goto yyc_cond_op;
1166 } 1182 }
1167yy108: 1183yy108:
1168 yych = *++YYCURSOR; 1184 yych = *++data;
1169 if (yych == ')') goto yy106; 1185 if (yych == ')') goto yy106;
1170 goto yy104; 1186 goto yy104;
1171yy109: 1187yy109:
1172 yych = *++YYCURSOR; 1188 yych = *++data;
1173 if (yybm[0+yych] & 64) { 1189 if (yybm[0+yych] & 64) {
1174 goto yy105; 1190 goto yy105;
1175 } 1191 }
1176 if (yych <= '\r') goto yy104; 1192 if (yych <= '\r') goto yy104;
1177 if (yych >= '#') goto yy109; 1193 if (yych >= '#') goto yy109;
1178 yych = *++YYCURSOR; 1194 yych = *++data;
1179 if (yybm[0+yych] & 128) { 1195 if (yybm[0+yych] & 128) {
1180 goto yy109; 1196 goto yy109;
1181 } 1197 }
1182 if (yych <= '\r') { 1198 if (yych <= '\r') {
1183 if (yych == '\n') goto yy104; 1199 if (yych <= '\t') {
1184 if (yych <= '\f') goto yy105; 1200 if (yych <= 0x00) goto yy104;
1185 goto yy104; 1201 goto yy105;
1202 } else {
1203 if (yych <= '\n') goto yy104;
1204 if (yych <= '\f') goto yy105;
1205 goto yy104;
1206 }
1186 } else { 1207 } else {
1187 if (yych <= '"') { 1208 if (yych <= '"') {
1188 if (yych <= '!') goto yy105; 1209 if (yych <= '!') goto yy105;
@@ -1192,7 +1213,7 @@ yy109:
1192 } 1213 }
1193 } 1214 }
1194 yyaccept = 1; 1215 yyaccept = 1;
1195 yych = *(YYMARKER = ++YYCURSOR); 1216 yych = *(YYMARKER = ++data);
1196 if (yybm[0+yych] & 64) { 1217 if (yybm[0+yych] & 64) {
1197 goto yy105; 1218 goto yy105;
1198 } 1219 }
@@ -1237,7 +1258,7 @@ yyc_cond_op:
1237 0, 0, 0, 0, 0, 0, 0, 0, 1258 0, 0, 0, 0, 0, 0, 0, 0,
1238 0, 0, 0, 0, 0, 0, 0, 0, 1259 0, 0, 0, 0, 0, 0, 0, 0,
1239 }; 1260 };
1240 yych = *YYCURSOR; 1261 yych = *data;
1241 if (yybm[0+yych] & 128) { 1262 if (yybm[0+yych] & 128) {
1242 goto yy113; 1263 goto yy113;
1243 } 1264 }
@@ -1248,7 +1269,7 @@ yyc_cond_op:
1248 if (yych >= '\r') goto yy115; 1269 if (yych >= '\r') goto yy115;
1249 } else { 1270 } else {
1250 if (yych == '&') { 1271 if (yych == '&') {
1251 yyt1 = YYCURSOR; 1272 yyt1 = data;
1252 goto yy116; 1273 goto yy116;
1253 } 1274 }
1254 if (yych >= ')') goto yy117; 1275 if (yych >= ')') goto yy117;
@@ -1258,71 +1279,71 @@ yyc_cond_op:
1258 if (yych <= ':') goto yy111; 1279 if (yych <= ':') goto yy111;
1259 if (yych <= ';') goto yy118; 1280 if (yych <= ';') goto yy118;
1260 if (yych <= '<') { 1281 if (yych <= '<') {
1261 yyt1 = YYCURSOR; 1282 yyt1 = data;
1262 goto yy119; 1283 goto yy119;
1263 } 1284 }
1264 yyt1 = YYCURSOR; 1285 yyt1 = data;
1265 goto yy121; 1286 goto yy121;
1266 } else { 1287 } else {
1267 if (yych <= '>') { 1288 if (yych <= '>') {
1268 yyt1 = YYCURSOR; 1289 yyt1 = data;
1269 goto yy119; 1290 goto yy119;
1270 } 1291 }
1271 if (yych == '|') { 1292 if (yych == '|') {
1272 yyt1 = YYCURSOR; 1293 yyt1 = data;
1273 goto yy122; 1294 goto yy122;
1274 } 1295 }
1275 } 1296 }
1276 } 1297 }
1277yy111: 1298yy111:
1278 ++YYCURSOR; 1299 ++data;
1279yy112: 1300yy112:
1280 { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } 1301 { cs_log_error("syntax error in condition on line %d", lineno); goto out; }
1281yy113: 1302yy113:
1282 yych = *++YYCURSOR; 1303 yych = *++data;
1283 if (yybm[0+yych] & 128) { 1304 if (yybm[0+yych] & 128) {
1284 goto yy113; 1305 goto yy113;
1285 } 1306 }
1286 { goto yyc_cond_op; } 1307 { goto yyc_cond_op; }
1287yy114: 1308yy114:
1288 ++YYCURSOR; 1309 ++data;
1289 { lineno++; goto yyc_cond_op; } 1310 { lineno++; goto yyc_cond_op; }
1290yy115: 1311yy115:
1291 yych = *++YYCURSOR; 1312 yych = *++data;
1292 if (yych == '\n') goto yy114; 1313 if (yych == '\n') goto yy114;
1293 goto yy112; 1314 goto yy112;
1294yy116: 1315yy116:
1295 yych = *++YYCURSOR; 1316 yych = *++data;
1296 if (yych == '&') goto yy123; 1317 if (yych == '&') goto yy123;
1297 goto yy112; 1318 goto yy112;
1298yy117: 1319yy117:
1299 ++YYCURSOR; 1320 ++data;
1300 { 1321 {
1301 while (cond_op_i && sy_op_peek() != '(') { 1322 while (cond_op_i && sy_op_peek() != '(') {
1302 SY_APPLY_OP_FROM_STACK(); 1323 SY_APPLY_OP_FROM_STACK();
1303 } 1324 }
1304 if (cond_op_i == 0 || sy_op_peek() != '(') { 1325 if (cond_op_i == 0 || sy_op_peek() != '(') {
1305 cs_log_error("unbalanced parathesis on line %d", lineno); goto out; 1326 cs_log_error("unbalanced parenthesis on line %d", lineno); goto out;
1306 } 1327 }
1307 cond_op_i--; 1328 cond_op_i--;
1308 goto yyc_cond_op; 1329 goto yyc_cond_op;
1309 } 1330 }
1310yy118: 1331yy118:
1311 ++YYCURSOR; 1332 ++data;
1312 { 1333 {
1313 while (cond_op_i) { 1334 while (cond_op_i) {
1314 if (sy_op_peek() == '(') { cs_log_error("unbalanced parathesis on line %d", lineno); goto out; } 1335 if (sy_op_peek() == '(') { cs_log_error("unbalanced parenthesis on line %d", lineno); goto out; }
1315 SY_APPLY_OP_FROM_STACK(); 1336 SY_APPLY_OP_FROM_STACK();
1316 } 1337 }
1317 if (cond_res_i > 1) { cs_log_error("invalid condition on line %d", lineno); goto out; } 1338 if (cond_res_i > 1) { cs_log_error("invalid condition on line %d", lineno); goto out; }
1318 goto yyc_init; 1339 goto yyc_init;
1319 } 1340 }
1320yy119: 1341yy119:
1321 yych = *++YYCURSOR; 1342 yych = *++data;
1322 if (yych == '=') goto yy123; 1343 if (yych == '=') goto yy123;
1323yy120: 1344yy120:
1324 t1 = yyt1; 1345 t1 = yyt1;
1325 t2 = YYCURSOR; 1346 t2 = data;
1326 { 1347 {
1327 char op1 = *t1; 1348 char op1 = *t1;
1328 if (t2-t1 == 2) { 1349 if (t2-t1 == 2) {
@@ -1331,28 +1352,34 @@ yy120:
1331 case '>': op1 = 'G'; break; // >= 1352 case '>': op1 = 'G'; break; // >=
1332 } 1353 }
1333 } 1354 }
1334 while (cond_op_i && sy_op_peek() != '(' && ((sy_op_precedence(sy_op_peek()) > sy_op_precedence(*t1)) || (sy_op_precedence(sy_op_peek()) == sy_op_precedence(*t1) && sy_op_is_left_assoc(*t1)))) { 1355 while (cond_op_i &&
1356 sy_op_peek() != '(' &&
1357 (
1358 (sy_op_precedence(sy_op_peek()) > sy_op_precedence(*t1)) ||
1359 (sy_op_precedence(sy_op_peek()) == sy_op_precedence(*t1) && sy_op_is_left_assoc(*t1))
1360 )
1361 ) {
1335 SY_APPLY_OP_FROM_STACK(); 1362 SY_APPLY_OP_FROM_STACK();
1336 } 1363 }
1337 sy_op_push(*t1); 1364 sy_op_push(*t1);
1338 goto yyc_cond; 1365 goto yyc_cond;
1339 } 1366 }
1340yy121: 1367yy121:
1341 yych = *++YYCURSOR; 1368 yych = *++data;
1342 if (yych == '=') goto yy123; 1369 if (yych == '=') goto yy123;
1343 goto yy112; 1370 goto yy112;
1344yy122: 1371yy122:
1345 yych = *++YYCURSOR; 1372 yych = *++data;
1346 if (yych != '|') goto yy112; 1373 if (yych != '|') goto yy112;
1347yy123: 1374yy123:
1348 ++YYCURSOR; 1375 ++data;
1349 goto yy120; 1376 goto yy120;
1350 } 1377 }
1351/* *********************************** */ 1378/* *********************************** */
1352yyc_rule: 1379yyc_rule:
1353 { 1380 {
1354 static const unsigned char yybm[] = { 1381 static const unsigned char yybm[] = {
1355 64, 64, 64, 64, 64, 64, 64, 64, 1382 0, 64, 64, 64, 64, 64, 64, 64,
1356 64, 88, 16, 64, 64, 0, 64, 64, 1383 64, 88, 16, 64, 64, 0, 64, 64,
1357 64, 64, 64, 64, 64, 64, 64, 64, 1384 64, 64, 64, 64, 64, 64, 64, 64,
1358 64, 64, 64, 64, 64, 64, 64, 64, 1385 64, 64, 64, 64, 64, 64, 64, 64,
@@ -1385,7 +1412,7 @@ yyc_rule:
1385 64, 64, 64, 64, 64, 64, 64, 64, 1412 64, 64, 64, 64, 64, 64, 64, 64,
1386 64, 64, 64, 64, 64, 64, 64, 64, 1413 64, 64, 64, 64, 64, 64, 64, 64,
1387 }; 1414 };
1388 yych = *YYCURSOR; 1415 yych = *data;
1389 if (yybm[0+yych] & 8) { 1416 if (yybm[0+yych] & 8) {
1390 goto yy127; 1417 goto yy127;
1391 } 1418 }
@@ -1401,35 +1428,35 @@ yyc_rule:
1401 } 1428 }
1402 } 1429 }
1403yy125: 1430yy125:
1404 ++YYCURSOR; 1431 ++data;
1405yy126: 1432yy126:
1406 { goto end_of_rule; } 1433 { goto end_of_rule; }
1407yy127: 1434yy127:
1408 yych = *++YYCURSOR; 1435 yych = *++data;
1409 if (yybm[0+yych] & 8) { 1436 if (yybm[0+yych] & 8) {
1410 goto yy127; 1437 goto yy127;
1411 } 1438 }
1412 { goto yyc_rule; } 1439 { goto yyc_rule; }
1413yy128: 1440yy128:
1414 yyaccept = 0; 1441 yyaccept = 0;
1415 yych = *(YYMARKER = ++YYCURSOR); 1442 yych = *(YYMARKER = ++data);
1416 if (yych <= '\r') { 1443 if (yych <= '\r') {
1417 if (yych <= 0x08) goto yy126; 1444 if (yych <= 0x08) goto yy126;
1418 if (yych <= '\n') { 1445 if (yych <= '\n') {
1419 yyt1 = YYCURSOR; 1446 yyt1 = data;
1420 goto yy132; 1447 goto yy132;
1421 } 1448 }
1422 if (yych <= '\f') goto yy126; 1449 if (yych <= '\f') goto yy126;
1423 yyt1 = YYCURSOR; 1450 yyt1 = data;
1424 goto yy134; 1451 goto yy134;
1425 } else { 1452 } else {
1426 if (yych <= ' ') { 1453 if (yych <= ' ') {
1427 if (yych <= 0x1F) goto yy126; 1454 if (yych <= 0x1F) goto yy126;
1428 yyt1 = YYCURSOR; 1455 yyt1 = data;
1429 goto yy132; 1456 goto yy132;
1430 } else { 1457 } else {
1431 if (yych == '.') { 1458 if (yych == '.') {
1432 yyt1 = YYCURSOR; 1459 yyt1 = data;
1433 goto yy135; 1460 goto yy135;
1434 } 1461 }
1435 goto yy126; 1462 goto yy126;
@@ -1437,28 +1464,24 @@ yy128:
1437 } 1464 }
1438yy129: 1465yy129:
1439 yyaccept = 0; 1466 yyaccept = 0;
1440 yych = *(YYMARKER = ++YYCURSOR); 1467 yych = *(YYMARKER = ++data);
1441 if (yych == '\n') goto yy136; 1468 if (yych == '\n') goto yy136;
1442 goto yy126; 1469 goto yy126;
1443yy130: 1470yy130:
1444 yych = *++YYCURSOR; 1471 yych = *++data;
1445 if (yych <= '^') { 1472 if (yych <= '@') goto yy126;
1446 if (yych <= '@') goto yy126; 1473 if (yych <= 'Z') {
1447 if (yych <= 'Z') { 1474 yyt1 = data;
1448 yyt1 = YYCURSOR; 1475 goto yy137;
1449 goto yy137; 1476 }
1450 } 1477 if (yych <= '`') goto yy126;
1451 goto yy126; 1478 if (yych <= 'z') {
1452 } else { 1479 yyt1 = data;
1453 if (yych == '`') goto yy126; 1480 goto yy137;
1454 if (yych <= 'z') {
1455 yyt1 = YYCURSOR;
1456 goto yy137;
1457 }
1458 goto yy126;
1459 } 1481 }
1482 goto yy126;
1460yy131: 1483yy131:
1461 ++YYCURSOR; 1484 ++data;
1462 { 1485 {
1463 end_of_rule: 1486 end_of_rule:
1464 if (!cond_res[0]) { goto yyc_init; } 1487 if (!cond_res[0]) { goto yyc_init; }
@@ -1469,52 +1492,52 @@ yy131:
1469 goto yyc_init; 1492 goto yyc_init;
1470 } 1493 }
1471yy132: 1494yy132:
1472 yych = *++YYCURSOR; 1495 yych = *++data;
1473 if (yybm[0+yych] & 16) { 1496 if (yybm[0+yych] & 16) {
1474 goto yy132; 1497 goto yy132;
1475 } 1498 }
1476 if (yych == '\r') goto yy134; 1499 if (yych == '\r') goto yy134;
1477 if (yych == '.') goto yy135; 1500 if (yych == '.') goto yy135;
1478yy133: 1501yy133:
1479 YYCURSOR = YYMARKER; 1502 data = YYMARKER;
1480 if (yyaccept <= 1) { 1503 if (yyaccept <= 1) {
1481 if (yyaccept == 0) { 1504 if (yyaccept == 0) {
1482 goto yy126; 1505 goto yy126;
1483 } else { 1506 } else {
1484 yyt3 = yyt4 = NULL; 1507 yyt3 = yyt4 = NULL;
1485 yyt2 = YYCURSOR; 1508 yyt2 = data;
1486 goto yy138; 1509 goto yy138;
1487 } 1510 }
1488 } else { 1511 } else {
1489 goto yy138; 1512 goto yy138;
1490 } 1513 }
1491yy134: 1514yy134:
1492 yych = *++YYCURSOR; 1515 yych = *++data;
1493 if (yych == '\n') goto yy132; 1516 if (yych == '\n') goto yy132;
1494 goto yy133; 1517 goto yy133;
1495yy135: 1518yy135:
1496 ++YYCURSOR; 1519 ++data;
1497 YYCURSOR = yyt1; 1520 data = yyt1;
1498 { lineno++; goto yyc_rule; } 1521 { lineno++; goto yyc_rule; }
1499yy136: 1522yy136:
1500 yych = *++YYCURSOR; 1523 yych = *++data;
1501 if (yych <= '\r') { 1524 if (yych <= '\r') {
1502 if (yych <= 0x08) goto yy133; 1525 if (yych <= 0x08) goto yy133;
1503 if (yych <= '\n') { 1526 if (yych <= '\n') {
1504 yyt1 = YYCURSOR; 1527 yyt1 = data;
1505 goto yy132; 1528 goto yy132;
1506 } 1529 }
1507 if (yych <= '\f') goto yy133; 1530 if (yych <= '\f') goto yy133;
1508 yyt1 = YYCURSOR; 1531 yyt1 = data;
1509 goto yy134; 1532 goto yy134;
1510 } else { 1533 } else {
1511 if (yych <= ' ') { 1534 if (yych <= ' ') {
1512 if (yych <= 0x1F) goto yy133; 1535 if (yych <= 0x1F) goto yy133;
1513 yyt1 = YYCURSOR; 1536 yyt1 = data;
1514 goto yy132; 1537 goto yy132;
1515 } else { 1538 } else {
1516 if (yych == '.') { 1539 if (yych == '.') {
1517 yyt1 = YYCURSOR; 1540 yyt1 = data;
1518 goto yy135; 1541 goto yy135;
1519 } 1542 }
1520 goto yy133; 1543 goto yy133;
@@ -1522,16 +1545,16 @@ yy136:
1522 } 1545 }
1523yy137: 1546yy137:
1524 yyaccept = 1; 1547 yyaccept = 1;
1525 yych = *(YYMARKER = ++YYCURSOR); 1548 yych = *(YYMARKER = ++data);
1526 if (yybm[0+yych] & 32) { 1549 if (yybm[0+yych] & 32) {
1527 goto yy137; 1550 goto yy137;
1528 } 1551 }
1529 if (yych == '(') { 1552 if (yych == '(') {
1530 yyt2 = YYCURSOR; 1553 yyt2 = data;
1531 goto yy139; 1554 goto yy139;
1532 } 1555 }
1533 yyt3 = yyt4 = NULL; 1556 yyt3 = yyt4 = NULL;
1534 yyt2 = YYCURSOR; 1557 yyt2 = data;
1535yy138: 1558yy138:
1536 t1 = yyt1; 1559 t1 = yyt1;
1537 t2 = yyt2; 1560 t2 = yyt2;
@@ -1539,11 +1562,18 @@ yy138:
1539 t4 = yyt4; 1562 t4 = yyt4;
1540 { 1563 {
1541 if (!cond_res[0]) { goto yyc_rule; } 1564 if (!cond_res[0]) { goto yyc_rule; }
1542 if (kw_i == max_keywords) { 1565 if (kw_i == MAX_KEYWORDS) {
1543 cs_log_error("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno); 1566 cs_log_error("too many keywords in rule (more than %d) on line %d", MAX_KEYWORDS, lineno);
1544 goto out; 1567 goto out;
1545 } 1568 }
1546 sp_parsed_keyword kw = {.kw = (char*)t1, .kwlen = t2-t1, .arg = (char*)t3, .arglen = t4-t3, .argtype = SP_ARGTYPE_UNKNOWN, .lineno = lineno}; 1569 sp_parsed_keyword kw = {
1570 .kw = (char*)t1,
1571 .kwlen = t2-t1,
1572 .arg = (char*)t3,
1573 .arglen = t4-t3,
1574 .argtype = SP_ARGTYPE_UNKNOWN,
1575 .lineno = lineno
1576 };
1547 if (t3 && t4) { 1577 if (t3 && t4) {
1548 if (t3 == t4) { 1578 if (t3 == t4) {
1549 kw.argtype = SP_ARGTYPE_EMPTY; 1579 kw.argtype = SP_ARGTYPE_EMPTY;
@@ -1568,38 +1598,31 @@ yy138:
1568 goto yyc_rule; 1598 goto yyc_rule;
1569 } 1599 }
1570yy139: 1600yy139:
1571 yych = *++YYCURSOR; 1601 yych = *++data;
1572 if (yych <= '@') { 1602 if (yych <= ')') {
1573 if (yych <= '"') { 1603 if (yych == '"') {
1574 if (yych <= '!') goto yy133; 1604 yyt3 = data;
1575 yyt3 = YYCURSOR; 1605 goto yy140;
1576 } else {
1577 if (yych == ')') {
1578 yyt3 = yyt4 = YYCURSOR;
1579 goto yy141;
1580 }
1581 goto yy133;
1582 } 1606 }
1607 if (yych <= '(') goto yy133;
1608 yyt3 = yyt4 = data;
1609 goto yy141;
1583 } else { 1610 } else {
1584 if (yych <= '_') { 1611 if (yych <= 'Z') {
1585 if (yych <= 'Z') { 1612 if (yych <= '@') goto yy133;
1586 yyt3 = YYCURSOR; 1613 yyt3 = data;
1587 goto yy142;
1588 }
1589 if (yych <= '^') goto yy133;
1590 yyt3 = YYCURSOR;
1591 goto yy142; 1614 goto yy142;
1592 } else { 1615 } else {
1593 if (yych <= '`') goto yy133; 1616 if (yych <= '`') goto yy133;
1594 if (yych <= 'z') { 1617 if (yych <= 'z') {
1595 yyt3 = YYCURSOR; 1618 yyt3 = data;
1596 goto yy142; 1619 goto yy142;
1597 } 1620 }
1598 goto yy133; 1621 goto yy133;
1599 } 1622 }
1600 } 1623 }
1601yy140: 1624yy140:
1602 yych = *++YYCURSOR; 1625 yych = *++data;
1603 if (yybm[0+yych] & 64) { 1626 if (yybm[0+yych] & 64) {
1604 goto yy140; 1627 goto yy140;
1605 } 1628 }
@@ -1607,14 +1630,14 @@ yy140:
1607 if (yych <= '"') goto yy143; 1630 if (yych <= '"') goto yy143;
1608 goto yy144; 1631 goto yy144;
1609yy141: 1632yy141:
1610 ++YYCURSOR; 1633 ++data;
1611 goto yy138; 1634 goto yy138;
1612yy142: 1635yy142:
1613 yych = *++YYCURSOR; 1636 yych = *++data;
1614 if (yych <= '@') { 1637 if (yych <= '@') {
1615 if (yych <= ')') { 1638 if (yych <= ')') {
1616 if (yych <= '(') goto yy133; 1639 if (yych <= '(') goto yy133;
1617 yyt4 = YYCURSOR; 1640 yyt4 = data;
1618 goto yy141; 1641 goto yy141;
1619 } else { 1642 } else {
1620 if (yych <= '/') goto yy133; 1643 if (yych <= '/') goto yy133;
@@ -1633,38 +1656,43 @@ yy142:
1633 } 1656 }
1634 } 1657 }
1635yy143: 1658yy143:
1636 yych = *++YYCURSOR; 1659 yych = *++data;
1637 if (yych == ')') { 1660 if (yych == ')') {
1638 yyt4 = YYCURSOR; 1661 yyt4 = data;
1639 goto yy141; 1662 goto yy141;
1640 } 1663 }
1641 goto yy133; 1664 goto yy133;
1642yy144: 1665yy144:
1643 yych = *++YYCURSOR; 1666 yych = *++data;
1644 if (yybm[0+yych] & 64) { 1667 if (yybm[0+yych] & 64) {
1645 goto yy140; 1668 goto yy140;
1646 } 1669 }
1647 if (yych <= '\r') goto yy133; 1670 if (yych <= '\r') goto yy133;
1648 if (yych >= '#') goto yy144; 1671 if (yych >= '#') goto yy144;
1649 yych = *++YYCURSOR; 1672 yych = *++data;
1650 if (yybm[0+yych] & 128) { 1673 if (yybm[0+yych] & 128) {
1651 goto yy144; 1674 goto yy144;
1652 } 1675 }
1653 if (yych <= '\r') { 1676 if (yych <= '\r') {
1654 if (yych == '\n') goto yy133; 1677 if (yych <= '\t') {
1655 if (yych <= '\f') goto yy140; 1678 if (yych <= 0x00) goto yy133;
1656 goto yy133; 1679 goto yy140;
1680 } else {
1681 if (yych <= '\n') goto yy133;
1682 if (yych <= '\f') goto yy140;
1683 goto yy133;
1684 }
1657 } else { 1685 } else {
1658 if (yych <= '"') { 1686 if (yych <= '"') {
1659 if (yych <= '!') goto yy140; 1687 if (yych <= '!') goto yy140;
1660 goto yy143; 1688 goto yy143;
1661 } else { 1689 } else {
1662 if (yych != ')') goto yy140; 1690 if (yych != ')') goto yy140;
1663 yyt4 = YYCURSOR; 1691 yyt4 = data;
1664 } 1692 }
1665 } 1693 }
1666 yyaccept = 2; 1694 yyaccept = 2;
1667 yych = *(YYMARKER = ++YYCURSOR); 1695 yych = *(YYMARKER = ++data);
1668 if (yybm[0+yych] & 64) { 1696 if (yybm[0+yych] & 64) {
1669 goto yy140; 1697 goto yy140;
1670 } 1698 }
diff --git a/src/sp_config_scanner.h b/src/sp_config_scanner.h
index 8ce1fb7..71f8f7e 100644
--- a/src/sp_config_scanner.h
+++ b/src/sp_config_scanner.h
@@ -18,7 +18,7 @@ typedef struct {
18 long lineno; 18 long lineno;
19} sp_parsed_keyword; 19} sp_parsed_keyword;
20 20
21zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*)); 21zend_result sp_config_scan(const char *data, zend_result (*process_rule)(sp_parsed_keyword*));
22zend_string *sp_get_arg_string(sp_parsed_keyword const *const kw); 22zend_string *sp_get_arg_string(sp_parsed_keyword const *const kw);
23zend_string *sp_get_textual_representation(sp_parsed_keyword const *const parsed_rule); 23zend_string *sp_get_textual_representation(sp_parsed_keyword const *const parsed_rule);
24 24
diff --git a/src/sp_config_scanner.re b/src/sp_config_scanner.re
index 6a14a11..82359d6 100644
--- a/src/sp_config_scanner.re
+++ b/src/sp_config_scanner.re
@@ -8,15 +8,19 @@
8#define cs_log_info(fmt, ...) sp_log_msg("config", SP_LOG_INFO, fmt, ##__VA_ARGS__) 8#define cs_log_info(fmt, ...) sp_log_msg("config", SP_LOG_INFO, fmt, ##__VA_ARGS__)
9#define cs_log_warning(fmt, ...) sp_log_warn("config", fmt, ##__VA_ARGS__) 9#define cs_log_warning(fmt, ...) sp_log_warn("config", fmt, ##__VA_ARGS__)
10 10
11#define MAX_CONDITIONS 100
12#define MAX_KEYWORDS 16
13
11 14
12zend_string *sp_get_arg_string(sp_parsed_keyword const *const kw) { 15zend_string *sp_get_arg_string(sp_parsed_keyword const *const kw) {
13 if (!kw || !kw->arg) { 16 if (!kw || !kw->arg) {
14 return NULL; 17 return NULL;
15 } 18 }
19
16 zend_string *ret = zend_string_init(kw->arg, kw->arglen, 1); 20 zend_string *ret = zend_string_init(kw->arg, kw->arglen, 1);
17 char *pin, *pout; 21 char *pin, *pout;
18 pin = pout = ZSTR_VAL(ret); 22 pin = pout = ZSTR_VAL(ret);
19 char *pend = pin + ZSTR_LEN(ret); 23 char const *const pend = pin + ZSTR_LEN(ret);
20 24
21 while (pin < pend) { 25 while (pin < pend) {
22 if (*pin == '\\') { 26 if (*pin == '\\') {
@@ -37,31 +41,38 @@ zend_string *sp_get_arg_string(sp_parsed_keyword const *const kw) {
37 41
38zend_string *sp_get_textual_representation(sp_parsed_keyword const *const parsed_rule) { 42zend_string *sp_get_textual_representation(sp_parsed_keyword const *const parsed_rule) {
39 // a rule is "sp.keyword...keyword(arg);\0" 43 // a rule is "sp.keyword...keyword(arg);\0"
40 size_t len = 3; // sp + ; 44 size_t len = 3; // "sp" + ";"
41 for (const sp_parsed_keyword *kw = parsed_rule; kw->kw; kw++) { 45 for (const sp_parsed_keyword *kw = parsed_rule; kw->kw; kw++) {
42 len++; // . 46 len++; // .
43 len += kw->kwlen; 47 len += kw->kwlen;
44 if (kw->argtype == SP_ARGTYPE_EMPTY) { 48 if (kw->argtype == SP_ARGTYPE_EMPTY) {
45 len += 2; // () 49 len += 2; // ()
46 } else if (kw->argtype == SP_ARGTYPE_STR) { 50 } else if (kw->argtype == SP_ARGTYPE_STR) {
47 len += 4; 51 len += 2; // ("
48 len += kw->arglen; 52 len += kw->arglen;
53 len += 2; // ")
49 } 54 }
50 } 55 }
51 56
52 zend_string *ret = zend_string_alloc(len, 1); 57 zend_string *ret = zend_string_alloc(len, 1);
53 char *ptr = ZSTR_VAL(ret); 58 char *ptr = ZSTR_VAL(ret);
54 59
55 memcpy(ptr, "sp", 2); ptr += 2; 60 memcpy(ptr, "sp", 2);
61 ptr += 2;
62
56 for (const sp_parsed_keyword *kw = parsed_rule; kw->kw; kw++) { 63 for (const sp_parsed_keyword *kw = parsed_rule; kw->kw; kw++) {
57 *ptr++ = '.'; 64 *ptr++ = '.';
58 memcpy(ptr, kw->kw, kw->kwlen); ptr += kw->kwlen; 65
66 memcpy(ptr, kw->kw, kw->kwlen);
67 ptr += kw->kwlen;
68
59 if (kw->argtype == SP_ARGTYPE_EMPTY || kw->argtype == SP_ARGTYPE_STR || kw->argtype == SP_ARGTYPE_UNKNOWN) { 69 if (kw->argtype == SP_ARGTYPE_EMPTY || kw->argtype == SP_ARGTYPE_STR || kw->argtype == SP_ARGTYPE_UNKNOWN) {
60 *ptr++ = '('; 70 *ptr++ = '(';
61 } 71 }
62 if (kw->argtype == SP_ARGTYPE_STR && kw->arg) { 72 if (kw->argtype == SP_ARGTYPE_STR && kw->arg) {
63 *ptr++ = '"'; 73 *ptr++ = '"';
64 memcpy(ptr, kw->arg, kw->arglen); ptr += kw->arglen; 74 memcpy(ptr, kw->arg, kw->arglen);
75 ptr += kw->arglen;
65 *ptr++ = '"'; 76 *ptr++ = '"';
66 } 77 }
67 if (kw->argtype == SP_ARGTYPE_EMPTY || kw->argtype == SP_ARGTYPE_STR || kw->argtype == SP_ARGTYPE_UNKNOWN) { 78 if (kw->argtype == SP_ARGTYPE_EMPTY || kw->argtype == SP_ARGTYPE_STR || kw->argtype == SP_ARGTYPE_UNKNOWN) {
@@ -79,16 +90,16 @@ static void str_dtor(zval *zv) {
79 90
80// sy_ functions and macros are helpers for the shunting yard algorithm 91// sy_ functions and macros are helpers for the shunting yard algorithm
81#define sy_res_push(val) \ 92#define sy_res_push(val) \
82 if (cond_res_i >= 100) { cs_log_error("condition too complex on line %d", lineno); goto out; } \ 93 if (cond_res_i >= MAX_CONDITIONS) { cs_log_error("condition too complex on line %d", lineno); goto out; } \
83 cond_res[cond_res_i++] = val; 94 cond_res[cond_res_i++] = val;
84#define sy_res_pop() cond_res[--cond_res_i] 95#define sy_res_pop() cond_res[--cond_res_i]
85#define sy_op_push(op) \ 96#define sy_op_push(op) \
86 if (cond_op_i >= 100) { cs_log_error("condition too complex on line %d", lineno); goto out; } \ 97 if (cond_op_i >= MAX_CONDITIONS) { cs_log_error("condition too complex on line %d", lineno); goto out; } \
87 cond_op[cond_op_i++] = op; 98 cond_op[cond_op_i++] = op;
88#define sy_op_pop() cond_op[--cond_op_i] 99#define sy_op_pop() cond_op[--cond_op_i]
89#define sy_op_peek() cond_op[cond_op_i-1] 100#define sy_op_peek() cond_op[cond_op_i-1]
90 101
91static inline int sy_op_precedence(char op) { 102static inline int sy_op_precedence(const char op) {
92 switch (op) { 103 switch (op) {
93 case '!': return 120; 104 case '!': return 120;
94 case '<': 105 case '<':
@@ -102,13 +113,15 @@ static inline int sy_op_precedence(char op) {
102 } 113 }
103 return 0; 114 return 0;
104} 115}
105static inline int sy_op_is_left_assoc(char op) { 116
117static inline int sy_op_is_left_assoc(const char op) {
106 switch (op) { 118 switch (op) {
107 case '!': return 0; 119 case '!': return 0;
108 } 120 }
109 return 1; 121 return 1;
110} 122}
111static int sy_apply_op(char op, int a, int b) { 123
124static int sy_apply_op(const char op, const int a, const int b) {
112 switch (op) { 125 switch (op) {
113 case '!': return !a; 126 case '!': return !a;
114 case '&': return (b && a); 127 case '&': return (b && a);
@@ -138,79 +151,77 @@ static int sy_apply_op(char op, int a, int b) {
138 tmpstr[tmplen] = 0; 151 tmpstr[tmplen] = 0;
139 152
140 153
141zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*)) 154zend_result sp_config_scan(const char *data, zend_result (*process_rule)(sp_parsed_keyword*))
142{ 155{
143 const char *YYCURSOR = data;
144 const char *YYMARKER, *t1, *t2, *t3, *t4; 156 const char *YYMARKER, *t1, *t2, *t3, *t4;
145 /*!stags:re2c format = 'const char *@@;\n'; */
146 157
147 int ret = FAILURE; 158 int ret = FAILURE;
148 159 sp_parsed_keyword parsed_rule[MAX_KEYWORDS+1];
149 const int max_keywords = 16;
150 sp_parsed_keyword parsed_rule[max_keywords+1];
151 int kw_i = 0; 160 int kw_i = 0;
152 161
153 HashTable vars; 162 HashTable vars;
154 zend_hash_init(&vars, 10, NULL, str_dtor, 1); 163 zend_hash_init(&vars, 10, NULL, str_dtor, 1);
155 zend_hash_str_add_ptr(&vars, ZEND_STRL("PHP_VERSION_ID"), zend_string_init(ZEND_STRL(ZEND_TOSTR(PHP_VERSION_ID)), 1)); 164 zend_hash_str_add_ptr(&vars, ZEND_STRL("PHP_VERSION_ID"), zend_string_init(ZEND_STRL(ZEND_TOSTR(PHP_VERSION_ID)), 1));
156 165
157 166 int cond_res[MAX_CONDITIONS] = {1};
158 int cond_res[100] = {1};
159 int cond_res_i = 0; 167 int cond_res_i = 0;
160 char cond_op[100] = {0}; 168 char cond_op[MAX_CONDITIONS] = {0};
161 int cond_op_i = 0; 169 int cond_op_i = 0;
162 170
163 int cond = yycinit; 171 int cond = yycinit;
164 long lineno = 1; 172 long lineno = 1;
165 173
174 /*!stags:re2c format = 'const char *@@;\n'; */
166 /*!re2c 175 /*!re2c
167 re2c:define:YYCTYPE = "unsigned char"; 176 re2c:define:YYCTYPE = char;
168 // re2c:define:YYCURSOR = data; 177 re2c:define:YYCURSOR = data;
178 //re2c:sentinel = 0;
169 re2c:yyfill:enable = 0; 179 re2c:yyfill:enable = 0;
180 re2c:eof = -1;
170 re2c:flags:tags = 1; 181 re2c:flags:tags = 1;
171 re2c:api:style = free-form; 182 re2c:api:style = free-form;
172 re2c:define:YYGETCONDITION = "cond"; 183 re2c:define:YYGETCONDITION = "cond";
173 re2c:define:YYSETCONDITION = "cond = @@;"; 184 re2c:define:YYSETCONDITION = "cond = @@;";
174 185
175 end = "\x00"; 186 end = "\x00";
176 nl = "\r"?"\n"; 187 newline = "\r"?"\n";
177 ws = [ \t]; 188 whitespace = [ \t];
178 keyword = [a-zA-Z_][a-zA-Z0-9_]*; 189 keyword = [a-zA-Z][a-zA-Z0-9_]*;
179 string = "\"" ("\\\"" | [^"\r\n])* "\""; 190 string = ["] ("\\"["] | [^"\r\n\x00])* ["];
180 191
181 <init> * { cs_log_error("Parser error on line %d", lineno); goto out; } 192 <init> * { cs_log_error("parser error on line %d", lineno); goto out; }
182 <init> ws+ { goto yyc_init; } 193 <init> whitespace+ { goto yyc_init; }
183 <init> [;#] .* { goto yyc_init; } 194 <init> [;#] [^\r\n\x00]* { goto yyc_init; }
184 <init> nl { lineno++; goto yyc_init; } 195 <init> newline { lineno++; goto yyc_init; }
185 <init> "sp" { kw_i = 0; goto yyc_rule; } 196 <init> "sp" { kw_i = 0; goto yyc_rule; }
186 <init> end { ret = SUCCESS; goto out; } 197 <init> end { ret = SUCCESS; goto out; }
187 <init> "@"? "set" ws+ @t1 keyword @t2 ws+ @t3 string @t4 ws* ";"? { 198 <init> "@"? "set" whitespace+ @t1 keyword @t2 whitespace+ @t3 string @t4 whitespace* ";" {
188 if (!cond_res[0]) { goto yyc_init; } 199 if (!cond_res[0]) { goto yyc_init; }
189 char *key = (char*)t1; 200 char *key = (char*)t1;
190 int keylen = t2-t1; 201 int keylen = t2 - t1;
191 zend_string *tmp = zend_hash_str_find_ptr(&vars, key, keylen); 202 zend_string *tmp = zend_hash_str_find_ptr(&vars, key, keylen);
192 if (tmp) { 203 if (tmp) {
193 zend_hash_str_del(&vars, key, keylen); 204 zend_hash_str_del(&vars, key, keylen);
194 } 205 }
195 tmp = zend_string_init(t3+1, t4-t3-2, 1); 206 tmp = zend_string_init(t3+1, t4-t3-2, 1); // `-2` for the surrounding double quotes.
196 zend_hash_str_add_ptr(&vars, key, keylen, tmp); 207 zend_hash_str_add_ptr(&vars, key, keylen, tmp);
197 goto yyc_init; 208 goto yyc_init;
198 } 209 }
199 <init> "@condition" ws+ { cond_res_i = 0; goto yyc_cond; } 210 <init> "@condition" whitespace+ { cond_res_i = 0; goto yyc_cond; }
200 <init> "@end_condition" ws* ";" { cond_res[0] = 1; cond_res_i = 0; goto yyc_init; } 211 <init> "@end_condition" whitespace* ";" { cond_res[0] = 1; cond_res_i = 0; goto yyc_init; }
201 <init> ( "@log" | "@info" ) ws+ @t1 string @t2 ";"? { 212 <init> ( "@log" | "@info" ) whitespace+ @t1 string @t2 ";" {
202 if (!cond_res[0]) { goto yyc_init; } 213 if (!cond_res[0]) { goto yyc_init; }
203 TMPSTR(tmpstr, t2, t1); 214 TMPSTR(tmpstr, t2, t1);
204 cs_log_info("[line %d]: %s", lineno, tmpstr); 215 cs_log_info("[line %d]: %s", lineno, tmpstr);
205 goto yyc_init; 216 goto yyc_init;
206 } 217 }
207 <init> ( "@warn" | "@warning" ) ws+ @t1 string @t2 ";"? { 218 <init> ( "@warn" | "@warning" ) whitespace+ @t1 string @t2 ";" {
208 if (!cond_res[0]) { goto yyc_init; } 219 if (!cond_res[0]) { goto yyc_init; }
209 TMPSTR(tmpstr, t2, t1); 220 TMPSTR(tmpstr, t2, t1);
210 cs_log_warning("[line %d]: %s", lineno, tmpstr); 221 cs_log_warning("[line %d]: %s", lineno, tmpstr);
211 goto yyc_init; 222 goto yyc_init;
212 } 223 }
213 <init> ( "@err" | "@error" ) ws+ @t1 string @t2 ";"? { 224 <init> ( "@err" | "@error" ) whitespace+ @t1 string @t2 ";" {
214 if (!cond_res[0]) { goto yyc_init; } 225 if (!cond_res[0]) { goto yyc_init; }
215 TMPSTR(tmpstr, t2, t1); 226 TMPSTR(tmpstr, t2, t1);
216 cs_log_error("[line %d]: %s", lineno, tmpstr); 227 cs_log_error("[line %d]: %s", lineno, tmpstr);
@@ -218,8 +229,8 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key
218 } 229 }
219 230
220 231
221 <cond> ws+ { goto yyc_cond; } 232 <cond> whitespace+ { goto yyc_cond; }
222 <cond> nl { lineno++; goto yyc_cond; } 233 <cond> newline { lineno++; goto yyc_cond; }
223 <cond> @t1 keyword @t2 "(" @t3 string? @t4 ")" { 234 <cond> @t1 keyword @t2 "(" @t3 string? @t4 ")" {
224 if (t4-t3 >= 2 && strlen("extension_loaded") == t2-t1 && strncmp("extension_loaded", t1, t2-t1) == 0) { 235 if (t4-t3 >= 2 && strlen("extension_loaded") == t2-t1 && strncmp("extension_loaded", t1, t2-t1) == 0) {
225 int is_loaded = (zend_hash_str_find_ptr(&module_registry, t3+1, t4-t3-2) != NULL); 236 int is_loaded = (zend_hash_str_find_ptr(&module_registry, t3+1, t4-t3-2) != NULL);
@@ -240,10 +251,10 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key
240 goto yyc_cond_op; 251 goto yyc_cond_op;
241 } 252 }
242 <cond> @t1 [0-9]+ @t2 { sy_res_push(atoi(t1)); goto yyc_cond_op; } 253 <cond> @t1 [0-9]+ @t2 { sy_res_push(atoi(t1)); goto yyc_cond_op; }
243 <cond> @t1 "!" { sy_op_push(*t1); goto yyc_cond; } 254 <cond> @t1 "!" { sy_op_push(*t1); goto yyc_cond; }
244 <cond> @t1 "(" { sy_op_push(*t1); goto yyc_cond; } 255 <cond> @t1 "(" { sy_op_push(*t1); goto yyc_cond; }
245 <cond_op> ws+ { goto yyc_cond_op; } 256 <cond_op> whitespace+ { goto yyc_cond_op; }
246 <cond_op> nl { lineno++; goto yyc_cond_op; } 257 <cond_op> newline { lineno++; goto yyc_cond_op; }
247 <cond_op> @t1 ( "&&" | "||" | "<" | ">" | "==" | "<=" | ">=") @t2 { 258 <cond_op> @t1 ( "&&" | "||" | "<" | ">" | "==" | "<=" | ">=") @t2 {
248 char op1 = *t1; 259 char op1 = *t1;
249 if (t2-t1 == 2) { 260 if (t2-t1 == 2) {
@@ -252,7 +263,13 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key
252 case '>': op1 = 'G'; break; // >= 263 case '>': op1 = 'G'; break; // >=
253 } 264 }
254 } 265 }
255 while (cond_op_i && sy_op_peek() != '(' && ((sy_op_precedence(sy_op_peek()) > sy_op_precedence(*t1)) || (sy_op_precedence(sy_op_peek()) == sy_op_precedence(*t1) && sy_op_is_left_assoc(*t1)))) { 266 while (cond_op_i &&
267 sy_op_peek() != '(' &&
268 (
269 (sy_op_precedence(sy_op_peek()) > sy_op_precedence(*t1)) ||
270 (sy_op_precedence(sy_op_peek()) == sy_op_precedence(*t1) && sy_op_is_left_assoc(*t1))
271 )
272 ) {
256 SY_APPLY_OP_FROM_STACK(); 273 SY_APPLY_OP_FROM_STACK();
257 } 274 }
258 sy_op_push(*t1); 275 sy_op_push(*t1);
@@ -263,30 +280,37 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key
263 SY_APPLY_OP_FROM_STACK(); 280 SY_APPLY_OP_FROM_STACK();
264 } 281 }
265 if (cond_op_i == 0 || sy_op_peek() != '(') { 282 if (cond_op_i == 0 || sy_op_peek() != '(') {
266 cs_log_error("unbalanced parathesis on line %d", lineno); goto out; 283 cs_log_error("unbalanced parenthesis on line %d", lineno); goto out;
267 } 284 }
268 cond_op_i--; 285 cond_op_i--;
269 goto yyc_cond_op; 286 goto yyc_cond_op;
270 } 287 }
271 <cond_op> ";" { 288 <cond_op> ";" {
272 while (cond_op_i) { 289 while (cond_op_i) {
273 if (sy_op_peek() == '(') { cs_log_error("unbalanced parathesis on line %d", lineno); goto out; } 290 if (sy_op_peek() == '(') { cs_log_error("unbalanced parenthesis on line %d", lineno); goto out; }
274 SY_APPLY_OP_FROM_STACK(); 291 SY_APPLY_OP_FROM_STACK();
275 } 292 }
276 if (cond_res_i > 1) { cs_log_error("invalid condition on line %d", lineno); goto out; } 293 if (cond_res_i > 1) { cs_log_error("invalid condition on line %d", lineno); goto out; }
277 goto yyc_init; 294 goto yyc_init;
278 } 295 }
279 <cond, cond_op> * { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } 296 <cond, cond_op> * { cs_log_error("syntax error in condition on line %d", lineno); goto out; }
280 297
281 <rule> ws+ { goto yyc_rule; } 298 <rule> whitespace+ { goto yyc_rule; }
282 <rule> nl / ( nl | ws )* "." { lineno++; goto yyc_rule; } 299 <rule> newline / ( newline | whitespace )* "." { lineno++; goto yyc_rule; }
283 <rule> "." @t1 keyword @t2 ( "(" @t3 ( string? | keyword ) @t4 ")" )? { 300 <rule> "." @t1 keyword @t2 ( "(" @t3 ( string? | keyword ) @t4 ")" )? {
284 if (!cond_res[0]) { goto yyc_rule; } 301 if (!cond_res[0]) { goto yyc_rule; }
285 if (kw_i == max_keywords) { 302 if (kw_i == MAX_KEYWORDS) {
286 cs_log_error("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno); 303 cs_log_error("too many keywords in rule (more than %d) on line %d", MAX_KEYWORDS, lineno);
287 goto out; 304 goto out;
288 } 305 }
289 sp_parsed_keyword kw = {.kw = (char*)t1, .kwlen = t2-t1, .arg = (char*)t3, .arglen = t4-t3, .argtype = SP_ARGTYPE_UNKNOWN, .lineno = lineno}; 306 sp_parsed_keyword kw = {
307 .kw = (char*)t1,
308 .kwlen = t2-t1,
309 .arg = (char*)t3,
310 .arglen = t4-t3,
311 .argtype = SP_ARGTYPE_UNKNOWN,
312 .lineno = lineno
313 };
290 if (t3 && t4) { 314 if (t3 && t4) {
291 if (t3 == t4) { 315 if (t3 == t4) {
292 kw.argtype = SP_ARGTYPE_EMPTY; 316 kw.argtype = SP_ARGTYPE_EMPTY;
@@ -320,7 +344,6 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key
320 goto yyc_init; 344 goto yyc_init;
321 } 345 }
322 <rule> * { goto end_of_rule; } 346 <rule> * { goto end_of_rule; }
323
324 */ 347 */
325out: 348out:
326 zend_hash_destroy(&vars); 349 zend_hash_destroy(&vars);
diff --git a/src/tests/broken_configuration/broken_conf.phpt b/src/tests/broken_configuration/broken_conf.phpt
index 3500b42..1e6642a 100644
--- a/src/tests/broken_configuration/broken_conf.phpt
+++ b/src/tests/broken_configuration/broken_conf.phpt
@@ -7,7 +7,7 @@ sp.configuration_file={PWD}/config/broken_conf.ini
7error_log=/dev/null 7error_log=/dev/null
8--FILE-- 8--FILE--
9--EXPECT-- 9--EXPECT--
10Fatal error: [snuffleupagus][0.0.0.0][config][log] Parser error on line 1 in Unknown on line 0 10Fatal error: [snuffleupagus][0.0.0.0][config][log] parser error on line 1 in Unknown on line 0
11 11
12Fatal error: [snuffleupagus][0.0.0.0][config][log] Invalid configuration file in Unknown on line 0 12Fatal error: [snuffleupagus][0.0.0.0][config][log] Invalid configuration file in Unknown on line 0
13Could not startup. 13Could not startup.
diff --git a/src/tests/broken_configuration/broken_conf_allow_broken_disabled.phpt b/src/tests/broken_configuration/broken_conf_allow_broken_disabled.phpt
index f43c790..ca3410a 100644
--- a/src/tests/broken_configuration/broken_conf_allow_broken_disabled.phpt
+++ b/src/tests/broken_configuration/broken_conf_allow_broken_disabled.phpt
@@ -11,7 +11,7 @@ error_log=/dev/null
11echo 1337; 11echo 1337;
12?> 12?>
13--EXPECT-- 13--EXPECT--
14Fatal error: [snuffleupagus][0.0.0.0][config][log] Parser error on line 1 in Unknown on line 0 14Fatal error: [snuffleupagus][0.0.0.0][config][log] parser error on line 1 in Unknown on line 0
15 15
16Fatal error: [snuffleupagus][0.0.0.0][config][log] Invalid configuration file in Unknown on line 0 16Fatal error: [snuffleupagus][0.0.0.0][config][log] Invalid configuration file in Unknown on line 0
17Could not startup. 17Could not startup.
diff --git a/src/tests/broken_configuration/broken_conf_allow_broken_enabled.phpt b/src/tests/broken_configuration/broken_conf_allow_broken_enabled.phpt
index b999e7e..006e31d 100644
--- a/src/tests/broken_configuration/broken_conf_allow_broken_enabled.phpt
+++ b/src/tests/broken_configuration/broken_conf_allow_broken_enabled.phpt
@@ -11,5 +11,5 @@ error_log=/dev/null
11echo 1337; 11echo 1337;
12?> 12?>
13--EXPECT-- 13--EXPECT--
14Fatal error: [snuffleupagus][0.0.0.0][config][log] Parser error on line 1 in Unknown on line 0 14Fatal error: [snuffleupagus][0.0.0.0][config][log] parser error on line 1 in Unknown on line 0
151337 151337