From 60fad2a6b3b61a63e2e829d60b7b0bda51099b19 Mon Sep 17 00:00:00 2001 From: Ben Fuhrmannek Date: Tue, 17 Aug 2021 13:06:39 +0200 Subject: added pregenerated scanner to relax re2c dependency --- src/sp_config_scanner.cached.c | 670 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 670 insertions(+) create mode 100644 src/sp_config_scanner.cached.c (limited to 'src/sp_config_scanner.cached.c') diff --git a/src/sp_config_scanner.cached.c b/src/sp_config_scanner.cached.c new file mode 100644 index 0000000..8e05986 --- /dev/null +++ b/src/sp_config_scanner.cached.c @@ -0,0 +1,670 @@ +/* Generated by re2c */ +#include "php_snuffleupagus.h" + +enum YYCONDTYPE { + yycinit, + yycrule, +}; + + +#define cs_error_log(fmt, ...) sp_log_err("config", fmt, ##__VA_ARGS__) + +zend_string *sp_get_arg_string(sp_parsed_keyword *kw) { + if (!kw || !kw->arg) { + return NULL; + } + zend_string *ret = zend_string_init(kw->arg, kw->arglen, 1); + char *pin, *pout; + pin = pout = ZSTR_VAL(ret); + char *pend = pin + ZSTR_LEN(ret); + + while (pin < pend) { + if (*pin == '\\') { + pin++; + } + *pout = *pin; + pin++; pout++; + } + + if (pin != pout) { + size_t len = pout - ZSTR_VAL(ret); + ret = zend_string_truncate(ret, len, 1); + ZSTR_VAL(ret)[len] = 0; + } + + return ret; +} + +zend_string *sp_get_textual_representation(sp_parsed_keyword *parsed_rule) { + // a rule is "sp.keyword...keyword(arg);\0" + size_t len = 3; // sp + ; + sp_parsed_keyword *kw; + for (kw = parsed_rule; kw->kw; kw++) { + len++; // . + len += kw->kwlen; + if (kw->argtype == SP_ARGTYPE_EMPTY) { + len += 2; // () + } else if (kw->argtype == SP_ARGTYPE_STR) { + len += 4; + len += kw->arglen; + } + } + zend_string *ret = zend_string_alloc(len, 1); + char *ptr = ZSTR_VAL(ret); + memcpy(ptr, "sp", 2); ptr += 2; + for (kw = parsed_rule; kw->kw; kw++) { + *ptr++ = '.'; + memcpy(ptr, kw->kw, kw->kwlen); ptr += kw->kwlen; + if (kw->argtype == SP_ARGTYPE_EMPTY || kw->argtype == SP_ARGTYPE_STR || kw->argtype == SP_ARGTYPE_UNKNOWN) { + *ptr++ = '('; + } + if (kw->argtype == SP_ARGTYPE_STR && kw->arg) { + *ptr++ = '"'; + memcpy(ptr, kw->arg, kw->arglen); ptr += kw->arglen; + *ptr++ = '"'; + } + if (kw->argtype == SP_ARGTYPE_EMPTY || kw->argtype == SP_ARGTYPE_STR || kw->argtype == SP_ARGTYPE_UNKNOWN) { + *ptr++ = ')'; + } + } + *ptr++ = ';'; + *ptr = 0; + return ret; +} + +static void str_dtor(zval *zv) { + zend_string_release_ex(Z_STR_P(zv), 1); +} + +zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*)) +{ + const char *YYCURSOR = data; + const char *YYMARKER, *t1, *t2, *t3, *t4; + const char *yyt1; +const char *yyt2; +const char *yyt3; +const char *yyt4; + + + int ret = FAILURE; + + const int max_keywords = 16; + sp_parsed_keyword parsed_rule[max_keywords+1]; + int kw_i = 0; + + HashTable vars; + zend_hash_init(&vars, 10, NULL, str_dtor, 1); + + int cond = yycinit; + long lineno = 1; + + +{ + char yych; + unsigned int yyaccept = 0; + if (cond < 1) { + goto yyc_init; + } else { + goto yyc_rule; + } +/* *********************************** */ +yyc_init: + { + static const unsigned char yybm[] = { + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 92, 16, 72, 72, 24, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 92, 72, 8, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 72, 72, 72, 72, 72, 72, + 72, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 72, 136, 72, 72, 104, + 72, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + }; + yych = *YYCURSOR; + if (yybm[0+yych] & 4) { + goto yy6; + } + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy2; + if (yych <= 0x08) goto yy4; + goto yy9; + } else { + if (yych == '\r') goto yy11; + goto yy4; + } + } else { + if (yych <= ';') { + if (yych <= '#') goto yy12; + if (yych <= ':') goto yy4; + goto yy12; + } else { + if (yych == 's') goto yy15; + goto yy4; + } + } +yy2: + ++YYCURSOR; + { ret = SUCCESS; goto out; } +yy4: + ++YYCURSOR; +yy5: + { cs_error_log("Parser error on line %d", lineno); goto out; } +yy6: + yych = *++YYCURSOR; + if (yybm[0+yych] & 4) { + goto yy6; + } + { goto yyc_init; } +yy9: + ++YYCURSOR; + { lineno++; goto yyc_init; } +yy11: + yych = *++YYCURSOR; + if (yych == '\n') goto yy9; + goto yy5; +yy12: + yych = *++YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy12; + } + { goto yyc_init; } +yy15: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'e') goto yy16; + if (yych == 'p') goto yy18; + goto yy5; +yy16: + yych = *++YYCURSOR; + if (yych == 't') goto yy20; +yy17: + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy5; + } else { + yyt4 = YYCURSOR; + goto yy30; + } + } else { + goto yy30; + } +yy18: + ++YYCURSOR; + { kw_i = 0; goto yyc_rule; } +yy20: + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy21; + } + goto yy17; +yy21: + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy21; + } + if (yych <= '^') { + if (yych <= '@') goto yy17; + if (yych >= '[') goto yy17; + yyt1 = YYCURSOR; + } else { + if (yych == '`') goto yy17; + if (yych >= '{') goto yy17; + yyt1 = YYCURSOR; + } +yy23: + yych = *++YYCURSOR; + if (yybm[0+yych] & 32) { + goto yy23; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy17; + if (yych >= '\v') goto yy17; + yyt2 = YYCURSOR; + } else { + if (yych <= '\r') { + yyt2 = YYCURSOR; + goto yy25; + } + if (yych != ' ') goto yy17; + yyt2 = YYCURSOR; + } +yy25: + yych = *++YYCURSOR; + if (yych <= '\r') { + if (yych <= 0x08) goto yy17; + if (yych <= '\n') goto yy25; + if (yych <= '\f') goto yy17; + goto yy25; + } else { + if (yych <= ' ') { + if (yych <= 0x1F) goto yy17; + goto yy25; + } else { + if (yych != '"') goto yy17; + yyt3 = YYCURSOR; + } + } +yy27: + yych = *++YYCURSOR; + if (yybm[0+yych] & 64) { + goto yy27; + } + if (yych <= '\r') goto yy17; + if (yych >= '#') goto yy31; +yy29: + yych = *++YYCURSOR; + yyt4 = YYCURSOR; + if (yych == ';') goto yy33; +yy30: + t1 = yyt1; + t2 = yyt2; + t3 = yyt3; + t4 = yyt4; + { + char *key = (char*)t1; + int keylen = t2-t1; + zend_string *tmp = zend_hash_str_find_ptr(&vars, key, keylen); + if (tmp) { + zend_hash_str_del(&vars, key, keylen); + } + tmp = zend_string_init(t3+1, t4-t3-2, 1); + zend_hash_str_add_ptr(&vars, key, keylen, tmp); + goto yyc_init; + } +yy31: + yych = *++YYCURSOR; + if (yybm[0+yych] & 64) { + goto yy27; + } + if (yych <= '\r') goto yy17; + if (yych <= '"') goto yy34; + goto yy31; +yy33: + ++YYCURSOR; + goto yy30; +yy34: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy31; + } + if (yych <= '\r') { + if (yych == '\n') { + yyt4 = YYCURSOR; + goto yy30; + } + if (yych <= '\f') goto yy27; + yyt4 = YYCURSOR; + goto yy30; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy27; + goto yy29; + } else { + if (yych != ';') goto yy27; + yyt4 = YYCURSOR; + } + } + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy27; + } + if (yych <= '\r') goto yy30; + if (yych <= '"') goto yy29; + goto yy31; + } +/* *********************************** */ +yyc_rule: + { + static const unsigned char yybm[] = { + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 88, 16, 64, 64, 0, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 88, 64, 0, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 64, 64, 64, 64, 64, 64, + 64, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 64, 128, 64, 64, 96, + 64, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + }; + yych = *YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy40; + } + if (yych <= '\r') { + if (yych <= 0x08) goto yy38; + if (yych <= '\n') goto yy43; + if (yych >= '\r') goto yy44; + } else { + if (yych <= '.') { + if (yych >= '.') goto yy45; + } else { + if (yych == ';') goto yy46; + } + } +yy38: + ++YYCURSOR; +yy39: + { goto end_of_rule; } +yy40: + yych = *++YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy40; + } + { goto yyc_rule; } +yy43: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '\r') { + if (yych <= 0x08) goto yy39; + if (yych <= '\n') { + yyt1 = YYCURSOR; + goto yy48; + } + if (yych <= '\f') goto yy39; + yyt1 = YYCURSOR; + goto yy51; + } else { + if (yych <= ' ') { + if (yych <= 0x1F) goto yy39; + yyt1 = YYCURSOR; + goto yy48; + } else { + if (yych == '.') { + yyt1 = YYCURSOR; + goto yy52; + } + goto yy39; + } + } +yy44: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == '\n') goto yy54; + goto yy39; +yy45: + yych = *++YYCURSOR; + if (yych <= '^') { + if (yych <= '@') goto yy39; + if (yych <= 'Z') { + yyt1 = YYCURSOR; + goto yy55; + } + goto yy39; + } else { + if (yych == '`') goto yy39; + if (yych <= 'z') { + yyt1 = YYCURSOR; + goto yy55; + } + goto yy39; + } +yy46: + ++YYCURSOR; + { + end_of_rule: + parsed_rule[kw_i++] = (sp_parsed_keyword){0, 0, 0, 0, 0, 0}; + if (process_rule && process_rule(parsed_rule) != SUCCESS) { + goto out; + } + goto yyc_init; + } +yy48: + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy48; + } + if (yych == '\r') goto yy51; + if (yych == '.') goto yy52; +yy50: + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy39; + } else { + yyt3 = yyt4 = NULL; + yyt2 = YYCURSOR; + goto yy57; + } + } else { + goto yy57; + } +yy51: + yych = *++YYCURSOR; + if (yych == '\n') goto yy48; + goto yy50; +yy52: + ++YYCURSOR; + YYCURSOR = yyt1; + { lineno++; goto yyc_rule; } +yy54: + yych = *++YYCURSOR; + if (yych <= '\r') { + if (yych <= 0x08) goto yy50; + if (yych <= '\n') { + yyt1 = YYCURSOR; + goto yy48; + } + if (yych <= '\f') goto yy50; + yyt1 = YYCURSOR; + goto yy51; + } else { + if (yych <= ' ') { + if (yych <= 0x1F) goto yy50; + yyt1 = YYCURSOR; + goto yy48; + } else { + if (yych == '.') { + yyt1 = YYCURSOR; + goto yy52; + } + goto yy50; + } + } +yy55: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy55; + } + if (yych == '(') { + yyt2 = YYCURSOR; + goto yy58; + } + yyt3 = yyt4 = NULL; + yyt2 = YYCURSOR; +yy57: + t1 = yyt1; + t2 = yyt2; + t3 = yyt3; + t4 = yyt4; + { + if (kw_i == max_keywords) { + cs_error_log("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno); + goto out; + } + sp_parsed_keyword kw = {.kw = (char*)t1, .kwlen = t2-t1, .arg = (char*)t3, .arglen = t4-t3, .argtype = SP_ARGTYPE_UNKNOWN, .lineno = lineno}; + if (t3 && t4) { + if (t3 == t4) { + kw.argtype = SP_ARGTYPE_EMPTY; + } else if (t4-t3 >= 2 && *t3 == '"') { + kw.arg = (char*)t3 + 1; + kw.arglen = t4 - t3 - 2; + kw.argtype = SP_ARGTYPE_STR; + } else { + zend_string *tmp = zend_hash_str_find_ptr(&vars, t3, t4-t3); + if (!tmp) { + cs_error_log("unknown variable on line %d", lineno); + goto out; + } + kw.arg = ZSTR_VAL(tmp); + kw.arglen = ZSTR_LEN(tmp); + kw.argtype = SP_ARGTYPE_STR; + } + } else { + kw.argtype = SP_ARGTYPE_NONE; + } + parsed_rule[kw_i++] = kw; + goto yyc_rule; + } +yy58: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '"') { + if (yych <= '!') goto yy50; + yyt3 = YYCURSOR; + } else { + if (yych == ')') { + yyt3 = yyt4 = YYCURSOR; + goto yy61; + } + goto yy50; + } + } else { + if (yych <= '_') { + if (yych <= 'Z') { + yyt3 = YYCURSOR; + goto yy62; + } + if (yych <= '^') goto yy50; + yyt3 = YYCURSOR; + goto yy62; + } else { + if (yych <= '`') goto yy50; + if (yych <= 'z') { + yyt3 = YYCURSOR; + goto yy62; + } + goto yy50; + } + } +yy59: + yych = *++YYCURSOR; + if (yybm[0+yych] & 64) { + goto yy59; + } + if (yych <= '\r') goto yy50; + if (yych <= '"') goto yy64; + goto yy65; +yy61: + ++YYCURSOR; + goto yy57; +yy62: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= ')') { + if (yych <= '(') goto yy50; + yyt4 = YYCURSOR; + goto yy61; + } else { + if (yych <= '/') goto yy50; + if (yych <= '9') goto yy62; + goto yy50; + } + } else { + if (yych <= '_') { + if (yych <= 'Z') goto yy62; + if (yych <= '^') goto yy50; + goto yy62; + } else { + if (yych <= '`') goto yy50; + if (yych <= 'z') goto yy62; + goto yy50; + } + } +yy64: + yych = *++YYCURSOR; + if (yych == ')') { + yyt4 = YYCURSOR; + goto yy61; + } + goto yy50; +yy65: + yych = *++YYCURSOR; + if (yybm[0+yych] & 64) { + goto yy59; + } + if (yych <= '\r') goto yy50; + if (yych >= '#') goto yy65; + yych = *++YYCURSOR; + if (yybm[0+yych] & 128) { + goto yy65; + } + if (yych <= '\r') { + if (yych == '\n') goto yy50; + if (yych <= '\f') goto yy59; + goto yy50; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy59; + goto yy64; + } else { + if (yych != ')') goto yy59; + yyt4 = YYCURSOR; + } + } + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy59; + } + if (yych <= '\r') goto yy57; + if (yych <= '"') goto yy64; + goto yy65; + } +} + +out: + zend_hash_destroy(&vars); + return ret; +} \ No newline at end of file -- cgit v1.3 From 5cdfa697666c0ed347aaa086953b7e9c7f8aa9f9 Mon Sep 17 00:00:00 2001 From: Ben Fuhrmannek Date: Tue, 31 Aug 2021 21:14:57 +0200 Subject: basic condition suuport for rules files --- src/sp_config_scanner.cached.c | 939 +++++++++++++++++++++++++++++++---------- src/sp_config_scanner.re | 56 ++- 2 files changed, 770 insertions(+), 225 deletions(-) (limited to 'src/sp_config_scanner.cached.c') 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 @@ enum YYCONDTYPE { yycinit, + yyccond, + yyccond_op, yycrule, }; @@ -76,6 +78,21 @@ static void str_dtor(zval *zv) { zend_string_release_ex(Z_STR_P(zv), 1); } +static int apply_op(int v1, char op, int v2, int neg) { + if (neg) { v2 = !v2; } + switch (op) { + case 0: return v2; + case '&': return (v1 && v2); + case '|': return (v1 || v2); + case '<': return (v1 < v2); + case '>': return (v1 > v2); + case '=': return (v1 == v2); + } + return 0; +} + +#define APPLY_OP(v2) cond_res = apply_op(cond_res, cond_op, v2, cond_neg); cond_op = cond_neg = 0; + zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*)) { const char *YYCURSOR = data; @@ -95,6 +112,10 @@ const char *yyt4; HashTable vars; zend_hash_init(&vars, 10, NULL, str_dtor, 1); + int cond_res = 1; + char cond_op = 0; + int cond_neg = 0; + int cond = yycinit; long lineno = 1; @@ -102,68 +123,77 @@ const char *yyt4; { char yych; unsigned int yyaccept = 0; - if (cond < 1) { - goto yyc_init; + if (cond < 2) { + if (cond < 1) { + goto yyc_init; + } else { + goto yyc_cond; + } } else { - goto yyc_rule; + if (cond < 3) { + goto yyc_cond_op; + } else { + goto yyc_rule; + } } /* *********************************** */ yyc_init: { static const unsigned char yybm[] = { - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 92, 16, 72, 72, 24, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 92, 72, 8, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 72, 72, 72, 72, 72, 72, - 72, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 72, 136, 72, 72, 104, - 72, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 88, 0, 80, 80, 16, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 88, 80, 16, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 80, 80, 80, 80, 80, 80, + 80, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 80, 144, 80, 80, 112, + 80, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, }; yych = *YYCURSOR; - if (yybm[0+yych] & 4) { + if (yybm[0+yych] & 8) { goto yy6; } - if (yych <= '"') { + if (yych <= '#') { if (yych <= '\n') { if (yych <= 0x00) goto yy2; if (yych <= 0x08) goto yy4; goto yy9; } else { if (yych == '\r') goto yy11; - goto yy4; + if (yych <= '"') goto yy4; + goto yy12; } } else { - if (yych <= ';') { - if (yych <= '#') goto yy12; - if (yych <= ':') goto yy4; - goto yy12; + if (yych <= '?') { + if (yych == ';') goto yy12; + goto yy4; } else { - if (yych == 's') goto yy15; + if (yych <= '@') goto yy15; + if (yych == 's') goto yy16; goto yy4; } } @@ -176,7 +206,7 @@ yy5: { cs_error_log("Parser error on line %d", lineno); goto out; } yy6: yych = *++YYCURSOR; - if (yybm[0+yych] & 4) { + if (yybm[0+yych] & 8) { goto yy6; } { goto yyc_init; } @@ -189,99 +219,169 @@ yy11: goto yy5; yy12: yych = *++YYCURSOR; - if (yybm[0+yych] & 8) { + if (yybm[0+yych] & 16) { goto yy12; } { goto yyc_init; } yy15: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'e') goto yy16; - if (yych == 'p') goto yy18; + if (yych == 'c') goto yy17; + if (yych == 'e') goto yy19; goto yy5; yy16: - yych = *++YYCURSOR; - if (yych == 't') goto yy20; + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'e') goto yy20; + if (yych == 'p') goto yy21; + goto yy5; yy17: + yych = *++YYCURSOR; + if (yych == 'o') goto yy23; +yy18: YYCURSOR = YYMARKER; if (yyaccept <= 1) { if (yyaccept == 0) { goto yy5; } else { yyt4 = YYCURSOR; - goto yy30; + goto yy45; } } else { - goto yy30; + goto yy45; } -yy18: - ++YYCURSOR; - { kw_i = 0; goto yyc_rule; } +yy19: + yych = *++YYCURSOR; + if (yych == 'n') goto yy24; + goto yy18; yy20: yych = *++YYCURSOR; - if (yybm[0+yych] & 16) { - goto yy21; - } - goto yy17; + if (yych == 't') goto yy25; + goto yy18; yy21: + ++YYCURSOR; + { kw_i = 0; goto yyc_rule; } +yy23: yych = *++YYCURSOR; - if (yybm[0+yych] & 16) { - goto yy21; - } - if (yych <= '^') { - if (yych <= '@') goto yy17; - if (yych >= '[') goto yy17; - yyt1 = YYCURSOR; + if (yych == 'n') goto yy26; + goto yy18; +yy24: + yych = *++YYCURSOR; + if (yych == 'd') goto yy27; + goto yy18; +yy25: + yych = *++YYCURSOR; + if (yych == '\t') goto yy28; + if (yych == ' ') goto yy28; + goto yy18; +yy26: + yych = *++YYCURSOR; + if (yych == 'd') goto yy30; + goto yy18; +yy27: + yych = *++YYCURSOR; + if (yych == '_') goto yy31; + goto yy18; +yy28: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '\t') { + if (yych <= 0x08) goto yy18; + goto yy28; + } else { + if (yych == ' ') goto yy28; + goto yy18; + } } else { - if (yych == '`') goto yy17; - if (yych >= '{') goto yy17; - yyt1 = YYCURSOR; + if (yych <= '_') { + if (yych <= 'Z') { + yyt1 = YYCURSOR; + goto yy32; + } + if (yych <= '^') goto yy18; + yyt1 = YYCURSOR; + goto yy32; + } else { + if (yych <= '`') goto yy18; + if (yych <= 'z') { + yyt1 = YYCURSOR; + goto yy32; + } + goto yy18; + } } -yy23: +yy30: + yych = *++YYCURSOR; + if (yych == 'i') goto yy34; + goto yy18; +yy31: + yych = *++YYCURSOR; + if (yych == 'c') goto yy35; + goto yy18; +yy32: yych = *++YYCURSOR; if (yybm[0+yych] & 32) { - goto yy23; + goto yy32; } - if (yych <= '\f') { - if (yych <= 0x08) goto yy17; - if (yych >= '\v') goto yy17; + if (yych == '\t') { yyt2 = YYCURSOR; - } else { - if (yych <= '\r') { - yyt2 = YYCURSOR; - goto yy25; - } - if (yych != ' ') goto yy17; + goto yy36; + } + if (yych == ' ') { yyt2 = YYCURSOR; + goto yy36; } -yy25: + goto yy18; +yy34: yych = *++YYCURSOR; - if (yych <= '\r') { - if (yych <= 0x08) goto yy17; - if (yych <= '\n') goto yy25; - if (yych <= '\f') goto yy17; - goto yy25; + if (yych == 't') goto yy38; + goto yy18; +yy35: + yych = *++YYCURSOR; + if (yych == 'o') goto yy39; + goto yy18; +yy36: + yych = *++YYCURSOR; + if (yych <= 0x1F) { + if (yych == '\t') goto yy36; + goto yy18; } else { - if (yych <= ' ') { - if (yych <= 0x1F) goto yy17; - goto yy25; - } else { - if (yych != '"') goto yy17; + if (yych <= ' ') goto yy36; + if (yych == '"') { yyt3 = YYCURSOR; + goto yy40; } + goto yy18; } -yy27: +yy38: + yych = *++YYCURSOR; + if (yych == 'i') goto yy42; + goto yy18; +yy39: + yych = *++YYCURSOR; + if (yych == 'n') goto yy43; + goto yy18; +yy40: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy27; + goto yy40; } - if (yych <= '\r') goto yy17; - if (yych >= '#') goto yy31; -yy29: + if (yych <= '\r') goto yy18; + if (yych <= '"') goto yy44; + goto yy46; +yy42: + yych = *++YYCURSOR; + if (yych == 'o') goto yy48; + goto yy18; +yy43: + yych = *++YYCURSOR; + if (yych == 'd') goto yy49; + goto yy18; +yy44: yych = *++YYCURSOR; yyt4 = YYCURSOR; - if (yych == ';') goto yy33; -yy30: + goto yy51; +yy45: t1 = yyt1; t2 = yyt2; t3 = yyt3; @@ -297,48 +397,441 @@ yy30: zend_hash_str_add_ptr(&vars, key, keylen, tmp); goto yyc_init; } -yy31: +yy46: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy27; + goto yy40; + } + if (yych <= '\r') goto yy18; + if (yych <= '"') goto yy53; + goto yy46; +yy48: + yych = *++YYCURSOR; + if (yych == 'n') goto yy54; + goto yy18; +yy49: + yych = *++YYCURSOR; + if (yych == 'i') goto yy55; + goto yy18; +yy50: + yych = *++YYCURSOR; +yy51: + if (yych <= 0x1F) { + if (yych == '\t') goto yy50; + goto yy45; + } else { + if (yych <= ' ') goto yy50; + if (yych != ';') goto yy45; } - if (yych <= '\r') goto yy17; - if (yych <= '"') goto yy34; - goto yy31; -yy33: ++YYCURSOR; - goto yy30; -yy34: + goto yy45; +yy53: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 128) { - goto yy31; + goto yy46; } - if (yych <= '\r') { - if (yych == '\n') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy40; + if (yych <= '\t') { + yyt4 = YYCURSOR; + goto yy56; + } yyt4 = YYCURSOR; - goto yy30; + goto yy45; + } else { + if (yych == '\r') { + yyt4 = YYCURSOR; + goto yy45; + } + goto yy40; } - if (yych <= '\f') goto yy27; - yyt4 = YYCURSOR; - goto yy30; } else { if (yych <= '"') { - if (yych <= '!') goto yy27; - goto yy29; + if (yych <= ' ') { + yyt4 = YYCURSOR; + goto yy56; + } + if (yych <= '!') goto yy40; + goto yy44; } else { - if (yych != ';') goto yy27; - yyt4 = YYCURSOR; + if (yych == ';') { + yyt4 = YYCURSOR; + goto yy58; + } + goto yy40; + } + } +yy54: + yych = *++YYCURSOR; + if (yych == '\t') goto yy59; + if (yych == ' ') goto yy59; + goto yy18; +yy55: + yych = *++YYCURSOR; + if (yych == 't') goto yy62; + goto yy18; +yy56: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy46; + } + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy40; + if (yych <= '\t') goto yy56; + goto yy45; + } else { + if (yych == '\r') goto yy45; + goto yy40; + } + } else { + if (yych <= '"') { + if (yych <= ' ') goto yy56; + if (yych <= '!') goto yy40; + goto yy44; + } else { + if (yych != ';') goto yy40; } } +yy58: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy27; + goto yy40; + } + if (yych <= '\r') goto yy45; + if (yych <= '"') goto yy44; + goto yy46; +yy59: + yych = *++YYCURSOR; + if (yych == '\t') goto yy59; + if (yych == ' ') goto yy59; + { goto yyc_cond; } +yy62: + yych = *++YYCURSOR; + if (yych != 'i') goto yy18; + yych = *++YYCURSOR; + if (yych != 'o') goto yy18; + yych = *++YYCURSOR; + if (yych != 'n') goto yy18; +yy65: + yych = *++YYCURSOR; + if (yych <= 0x1F) { + if (yych == '\t') goto yy65; + goto yy18; + } else { + if (yych <= ' ') goto yy65; + if (yych != ';') goto yy18; + } + ++YYCURSOR; + { cond_res = 1; goto yyc_init; } + } +/* *********************************** */ +yyc_cond: + { + static const unsigned char yybm[] = { + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 72, 0, 64, 64, 0, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 72, 64, 0, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 64, 64, 64, 64, 64, 64, + 64, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 64, 128, 64, 64, 96, + 64, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + }; + yych = *YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy73; + } + if (yych <= '/') { + if (yych <= '\f') { + if (yych <= 0x08) goto yy71; + if (yych <= '\n') goto yy76; + } else { + if (yych <= '\r') goto yy78; + if (yych <= 0x1F) goto yy71; + if (yych <= '!') goto yy79; + } + } else { + if (yych <= '^') { + if (yych <= '9') { + yyt1 = YYCURSOR; + goto yy81; + } + if (yych <= '@') goto yy71; + if (yych <= 'Z') { + yyt1 = YYCURSOR; + goto yy84; + } + } else { + if (yych == '`') goto yy71; + if (yych <= 'z') { + yyt1 = YYCURSOR; + goto yy84; + } + } + } +yy71: + ++YYCURSOR; +yy72: + { cs_error_log("Syntax error in condition on line %d", lineno); return false; } +yy73: + yych = *++YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy73; + } + { goto yyc_cond; } +yy76: + ++YYCURSOR; + { lineno++; goto yyc_cond; } +yy78: + yych = *++YYCURSOR; + if (yych == '\n') goto yy76; + goto yy72; +yy79: + ++YYCURSOR; + t1 = YYCURSOR - 1; + { cond_neg = (cond_neg + 1) % 2; goto yyc_cond; } +yy81: + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy81; + } + t1 = yyt1; + t2 = YYCURSOR; + { APPLY_OP(atoi(t1)); goto yyc_cond_op; } +yy84: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy84; + } + if (yych == '(') goto yy87; +yy86: + t1 = yyt1; + t2 = YYCURSOR; + { + zend_string *tmp = zend_hash_str_find_ptr(&vars, t1, t2-t1); + if (!tmp) { + cs_error_log("unknown variable in condition on line %d", lineno); + goto out; + } + APPLY_OP(atoi(ZSTR_VAL(tmp))); + goto yyc_cond_op; + } +yy87: + yych = *++YYCURSOR; + if (yych == '"') { + yyt2 = YYCURSOR; + goto yy89; + } + if (yych == ')') { + yyt2 = YYCURSOR; + goto yy91; + } +yy88: + YYCURSOR = YYMARKER; + if (yyaccept == 0) { + goto yy86; + } else { + goto yy92; + } +yy89: + yych = *++YYCURSOR; + if (yybm[0+yych] & 64) { + goto yy89; + } + if (yych <= '\r') goto yy88; + if (yych <= '"') goto yy93; + goto yy94; +yy91: + ++YYCURSOR; +yy92: + t1 = yyt1; + t3 = yyt2; + t2 = yyt2 - 1; + t4 = YYCURSOR - 1; + { + if (t4-t3 >= 2 && strlen("extension_loaded") == t2-t1 && strncmp("extension_loaded", t1, t2-t1) == 0) { + int is_loaded = (zend_hash_str_find_ptr(&module_registry, t3+1, t4-t3-2) != NULL); + APPLY_OP(is_loaded); + } else { + cs_error_log("unknown function in condition on line %d", lineno); + goto out; + } + goto yyc_cond_op; + } +yy93: + yych = *++YYCURSOR; + if (yych == ')') goto yy91; + goto yy88; +yy94: + yych = *++YYCURSOR; + if (yybm[0+yych] & 64) { + goto yy89; + } + if (yych <= '\r') goto yy88; + if (yych >= '#') goto yy94; + yych = *++YYCURSOR; + if (yybm[0+yych] & 128) { + goto yy94; + } + if (yych <= '\r') { + if (yych == '\n') goto yy88; + if (yych <= '\f') goto yy89; + goto yy88; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy89; + goto yy93; + } else { + if (yych != ')') goto yy89; + } + } + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy89; + } + if (yych <= '\r') goto yy92; + if (yych <= '"') goto yy93; + goto yy94; + } +/* *********************************** */ +yyc_cond_op: + { + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *YYCURSOR; + if (yybm[0+yych] & 128) { + goto yy102; + } + if (yych <= ':') { + if (yych <= '\f') { + if (yych <= 0x08) goto yy100; + if (yych <= '\n') goto yy105; + } else { + if (yych <= '\r') goto yy107; + if (yych == '&') { + yyt1 = YYCURSOR; + goto yy108; + } + } + } else { + if (yych <= '=') { + if (yych <= ';') goto yy109; + if (yych <= '<') { + yyt1 = YYCURSOR; + goto yy111; + } + yyt1 = YYCURSOR; + goto yy113; + } else { + if (yych <= '>') { + yyt1 = YYCURSOR; + goto yy111; + } + if (yych == '|') { + yyt1 = YYCURSOR; + goto yy114; + } + } + } +yy100: + ++YYCURSOR; +yy101: + { cs_error_log("Syntax error in condition on line %d", lineno); return false; } +yy102: + yych = *++YYCURSOR; + if (yybm[0+yych] & 128) { + goto yy102; } - if (yych <= '\r') goto yy30; - if (yych <= '"') goto yy29; - goto yy31; + { goto yyc_cond_op; } +yy105: + ++YYCURSOR; + { lineno++; goto yyc_cond_op; } +yy107: + yych = *++YYCURSOR; + if (yych == '\n') goto yy105; + goto yy101; +yy108: + yych = *++YYCURSOR; + if (yych == '&') goto yy111; + goto yy101; +yy109: + ++YYCURSOR; + { goto yyc_init; } +yy111: + ++YYCURSOR; + t1 = yyt1; + { cond_op = *t1; goto yyc_cond; } +yy113: + yych = *++YYCURSOR; + if (yych == '=') goto yy111; + goto yy101; +yy114: + yych = *++YYCURSOR; + if (yych == '|') goto yy111; + goto yy101; } /* *********************************** */ yyc_rule: @@ -379,156 +872,158 @@ yyc_rule: }; yych = *YYCURSOR; if (yybm[0+yych] & 8) { - goto yy40; + goto yy119; } if (yych <= '\r') { - if (yych <= 0x08) goto yy38; - if (yych <= '\n') goto yy43; - if (yych >= '\r') goto yy44; + if (yych <= 0x08) goto yy117; + if (yych <= '\n') goto yy122; + if (yych >= '\r') goto yy123; } else { if (yych <= '.') { - if (yych >= '.') goto yy45; + if (yych >= '.') goto yy124; } else { - if (yych == ';') goto yy46; + if (yych == ';') goto yy125; } } -yy38: +yy117: ++YYCURSOR; -yy39: +yy118: { goto end_of_rule; } -yy40: +yy119: yych = *++YYCURSOR; if (yybm[0+yych] & 8) { - goto yy40; + goto yy119; } { goto yyc_rule; } -yy43: +yy122: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\r') { - if (yych <= 0x08) goto yy39; + if (yych <= 0x08) goto yy118; if (yych <= '\n') { yyt1 = YYCURSOR; - goto yy48; + goto yy127; } - if (yych <= '\f') goto yy39; + if (yych <= '\f') goto yy118; yyt1 = YYCURSOR; - goto yy51; + goto yy130; } else { if (yych <= ' ') { - if (yych <= 0x1F) goto yy39; + if (yych <= 0x1F) goto yy118; yyt1 = YYCURSOR; - goto yy48; + goto yy127; } else { if (yych == '.') { yyt1 = YYCURSOR; - goto yy52; + goto yy131; } - goto yy39; + goto yy118; } } -yy44: +yy123: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == '\n') goto yy54; - goto yy39; -yy45: + if (yych == '\n') goto yy133; + goto yy118; +yy124: yych = *++YYCURSOR; if (yych <= '^') { - if (yych <= '@') goto yy39; + if (yych <= '@') goto yy118; if (yych <= 'Z') { yyt1 = YYCURSOR; - goto yy55; + goto yy134; } - goto yy39; + goto yy118; } else { - if (yych == '`') goto yy39; + if (yych == '`') goto yy118; if (yych <= 'z') { yyt1 = YYCURSOR; - goto yy55; + goto yy134; } - goto yy39; + goto yy118; } -yy46: +yy125: ++YYCURSOR; { end_of_rule: + if (!cond_res) { goto yyc_init; } parsed_rule[kw_i++] = (sp_parsed_keyword){0, 0, 0, 0, 0, 0}; if (process_rule && process_rule(parsed_rule) != SUCCESS) { goto out; } goto yyc_init; } -yy48: +yy127: yych = *++YYCURSOR; if (yybm[0+yych] & 16) { - goto yy48; + goto yy127; } - if (yych == '\r') goto yy51; - if (yych == '.') goto yy52; -yy50: + if (yych == '\r') goto yy130; + if (yych == '.') goto yy131; +yy129: YYCURSOR = YYMARKER; if (yyaccept <= 1) { if (yyaccept == 0) { - goto yy39; + goto yy118; } else { yyt3 = yyt4 = NULL; yyt2 = YYCURSOR; - goto yy57; + goto yy136; } } else { - goto yy57; + goto yy136; } -yy51: +yy130: yych = *++YYCURSOR; - if (yych == '\n') goto yy48; - goto yy50; -yy52: + if (yych == '\n') goto yy127; + goto yy129; +yy131: ++YYCURSOR; YYCURSOR = yyt1; { lineno++; goto yyc_rule; } -yy54: +yy133: yych = *++YYCURSOR; if (yych <= '\r') { - if (yych <= 0x08) goto yy50; + if (yych <= 0x08) goto yy129; if (yych <= '\n') { yyt1 = YYCURSOR; - goto yy48; + goto yy127; } - if (yych <= '\f') goto yy50; + if (yych <= '\f') goto yy129; yyt1 = YYCURSOR; - goto yy51; + goto yy130; } else { if (yych <= ' ') { - if (yych <= 0x1F) goto yy50; + if (yych <= 0x1F) goto yy129; yyt1 = YYCURSOR; - goto yy48; + goto yy127; } else { if (yych == '.') { yyt1 = YYCURSOR; - goto yy52; + goto yy131; } - goto yy50; + goto yy129; } } -yy55: +yy134: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { - goto yy55; + goto yy134; } if (yych == '(') { yyt2 = YYCURSOR; - goto yy58; + goto yy137; } yyt3 = yyt4 = NULL; yyt2 = YYCURSOR; -yy57: +yy136: t1 = yyt1; t2 = yyt2; t3 = yyt3; t4 = yyt4; { + if (!cond_res) { goto yyc_rule; } if (kw_i == max_keywords) { cs_error_log("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno); goto out; @@ -557,110 +1052,110 @@ yy57: parsed_rule[kw_i++] = kw; goto yyc_rule; } -yy58: +yy137: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '"') { - if (yych <= '!') goto yy50; + if (yych <= '!') goto yy129; yyt3 = YYCURSOR; } else { if (yych == ')') { yyt3 = yyt4 = YYCURSOR; - goto yy61; + goto yy140; } - goto yy50; + goto yy129; } } else { if (yych <= '_') { if (yych <= 'Z') { yyt3 = YYCURSOR; - goto yy62; + goto yy141; } - if (yych <= '^') goto yy50; + if (yych <= '^') goto yy129; yyt3 = YYCURSOR; - goto yy62; + goto yy141; } else { - if (yych <= '`') goto yy50; + if (yych <= '`') goto yy129; if (yych <= 'z') { yyt3 = YYCURSOR; - goto yy62; + goto yy141; } - goto yy50; + goto yy129; } } -yy59: +yy138: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy59; + goto yy138; } - if (yych <= '\r') goto yy50; - if (yych <= '"') goto yy64; - goto yy65; -yy61: + if (yych <= '\r') goto yy129; + if (yych <= '"') goto yy143; + goto yy144; +yy140: ++YYCURSOR; - goto yy57; -yy62: + goto yy136; +yy141: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= ')') { - if (yych <= '(') goto yy50; + if (yych <= '(') goto yy129; yyt4 = YYCURSOR; - goto yy61; + goto yy140; } else { - if (yych <= '/') goto yy50; - if (yych <= '9') goto yy62; - goto yy50; + if (yych <= '/') goto yy129; + if (yych <= '9') goto yy141; + goto yy129; } } else { if (yych <= '_') { - if (yych <= 'Z') goto yy62; - if (yych <= '^') goto yy50; - goto yy62; + if (yych <= 'Z') goto yy141; + if (yych <= '^') goto yy129; + goto yy141; } else { - if (yych <= '`') goto yy50; - if (yych <= 'z') goto yy62; - goto yy50; + if (yych <= '`') goto yy129; + if (yych <= 'z') goto yy141; + goto yy129; } } -yy64: +yy143: yych = *++YYCURSOR; if (yych == ')') { yyt4 = YYCURSOR; - goto yy61; + goto yy140; } - goto yy50; -yy65: + goto yy129; +yy144: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy59; + goto yy138; } - if (yych <= '\r') goto yy50; - if (yych >= '#') goto yy65; + if (yych <= '\r') goto yy129; + if (yych >= '#') goto yy144; yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy65; + goto yy144; } if (yych <= '\r') { - if (yych == '\n') goto yy50; - if (yych <= '\f') goto yy59; - goto yy50; + if (yych == '\n') goto yy129; + if (yych <= '\f') goto yy138; + goto yy129; } else { if (yych <= '"') { - if (yych <= '!') goto yy59; - goto yy64; + if (yych <= '!') goto yy138; + goto yy143; } else { - if (yych != ')') goto yy59; + if (yych != ')') goto yy138; yyt4 = YYCURSOR; } } yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy59; + goto yy138; } - if (yych <= '\r') goto yy57; - if (yych <= '"') goto yy64; - goto yy65; + if (yych <= '\r') goto yy136; + if (yych <= '"') goto yy143; + goto yy144; } } 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) { zend_string_release_ex(Z_STR_P(zv), 1); } +static int apply_op(int v1, char op, int v2, int neg) { + if (neg) { v2 = !v2; } + switch (op) { + case 0: return v2; + case '&': return (v1 && v2); + case '|': return (v1 || v2); + case '<': return (v1 < v2); + case '>': return (v1 > v2); + case '=': return (v1 == v2); + } + return 0; +} + +#define APPLY_OP(v2) cond_res = apply_op(cond_res, cond_op, v2, cond_neg); cond_op = cond_neg = 0; + zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*)) { const char *YYCURSOR = data; @@ -86,6 +101,10 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key HashTable vars; zend_hash_init(&vars, 10, NULL, str_dtor, 1); + int cond_res = 1; + char cond_op = 0; + int cond_neg = 0; + int cond = yycinit; long lineno = 1; @@ -101,7 +120,6 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key end = "\x00"; nl = "\r"?"\n"; ws = [ \t]; - wsnl = [ \t\r\n]; keyword = [a-zA-Z_][a-zA-Z0-9_]*; string = "\"" ("\\\"" | [^"\r\n])* "\""; @@ -111,7 +129,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key nl { lineno++; goto yyc_init; } "sp" { kw_i = 0; goto yyc_rule; } end { ret = SUCCESS; goto out; } - "set" wsnl+ @t1 keyword @t2 wsnl+ @t3 string @t4 ";"? { + "set" ws+ @t1 keyword @t2 ws+ @t3 string @t4 ws* ";"? { char *key = (char*)t1; int keylen = t2-t1; 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 zend_hash_str_add_ptr(&vars, key, keylen, tmp); goto yyc_init; } - + "@condition" ws+ { goto yyc_cond; } + "@end_condition" ws* ";" { cond_res = 1; goto yyc_init; } + + ws+ { goto yyc_cond; } + nl { lineno++; goto yyc_cond; } + @t1 keyword @t2 "(" @t3 string? @t4 ")" { + if (t4-t3 >= 2 && strlen("extension_loaded") == t2-t1 && strncmp("extension_loaded", t1, t2-t1) == 0) { + int is_loaded = (zend_hash_str_find_ptr(&module_registry, t3+1, t4-t3-2) != NULL); + APPLY_OP(is_loaded); + } else { + cs_error_log("unknown function in condition on line %d", lineno); + goto out; + } + goto yyc_cond_op; + } + @t1 keyword @t2 { + zend_string *tmp = zend_hash_str_find_ptr(&vars, t1, t2-t1); + if (!tmp) { + cs_error_log("unknown variable in condition on line %d", lineno); + goto out; + } + APPLY_OP(atoi(ZSTR_VAL(tmp))); + goto yyc_cond_op; + } + @t1 [0-9]+ @t2 { APPLY_OP(atoi(t1)); goto yyc_cond_op; } + @t1 "!" { cond_neg = (cond_neg + 1) % 2; goto yyc_cond; } + ws+ { goto yyc_cond_op; } + nl { lineno++; goto yyc_cond_op; } + @t1 ( "&&" | "||" | "<" | ">" | "==" ) { cond_op = *t1; goto yyc_cond; } + ";" { goto yyc_init; } + * { cs_error_log("Syntax error in condition on line %d", lineno); return false; } ws+ { goto yyc_rule; } nl / ( nl | ws )* "." { lineno++; goto yyc_rule; } "." @t1 keyword @t2 ( "(" @t3 ( string? | keyword ) @t4 ")" )? { + if (!cond_res) { goto yyc_rule; } if (kw_i == max_keywords) { cs_error_log("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno); goto out; @@ -157,6 +206,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key } ";" { end_of_rule: + if (!cond_res) { goto yyc_init; } parsed_rule[kw_i++] = (sp_parsed_keyword){0, 0, 0, 0, 0, 0}; if (process_rule && process_rule(parsed_rule) != SUCCESS) { goto out; -- cgit v1.3 From 782336d8f4b9c411d344c0e7752e87631952f268 Mon Sep 17 00:00:00 2001 From: Ben Fuhrmannek Date: Wed, 1 Sep 2021 17:01:00 +0200 Subject: implemented proper operand precedence using the shunting yard algorithm --- src/sp_config_scanner.cached.c | 502 ++++++++++++++++++++++++----------------- src/sp_config_scanner.re | 118 ++++++++-- 2 files changed, 394 insertions(+), 226 deletions(-) (limited to 'src/sp_config_scanner.cached.c') diff --git a/src/sp_config_scanner.cached.c b/src/sp_config_scanner.cached.c index d053e5f..26a6652 100644 --- a/src/sp_config_scanner.cached.c +++ b/src/sp_config_scanner.cached.c @@ -78,20 +78,60 @@ static void str_dtor(zval *zv) { zend_string_release_ex(Z_STR_P(zv), 1); } -static int apply_op(int v1, char op, int v2, int neg) { - if (neg) { v2 = !v2; } +// sy_ functions and macros are helpers for the shunting yard algorithm +#define sy_res_push(val) \ + if (cond_res_i >= 100) { cs_error_log("condition too complex on line %d", lineno); goto out; } \ + cond_res[cond_res_i++] = val; +#define sy_res_pop() cond_res[--cond_res_i] +#define sy_op_push(op) \ + if (cond_op_i >= 100) { cs_error_log("condition too complex on line %d", lineno); goto out; } \ + cond_op[cond_op_i++] = op; +#define sy_op_pop() cond_op[--cond_op_i] +#define sy_op_peek() cond_op[cond_op_i-1] + +static inline int sy_op_precedence(char op) { + switch (op) { + case '!': return 120; + case '<': + case '>': + case 'L': // <= + case 'G': // >= + return 90; + case '&': return 70; + case '|': return 60; + case '=': return 20; + } + return 0; +} +static inline int sy_op_is_left_assoc(char op) { + switch (op) { + case '!': return 0; + } + return 1; +} +static int sy_apply_op(char op, int a, int b) { switch (op) { - case 0: return v2; - case '&': return (v1 && v2); - case '|': return (v1 || v2); - case '<': return (v1 < v2); - case '>': return (v1 > v2); - case '=': return (v1 == v2); + case '!': return !a; + case '&': return (b && a); + case '|': return (b || a); + case '<': return (b < a); + case 'L': return (b <= a); + case 'G': return (b >= a); + case '>': return (b > a); + case '=': return (b == a); } return 0; } -#define APPLY_OP(v2) cond_res = apply_op(cond_res, cond_op, v2, cond_neg); cond_op = cond_neg = 0; +#define SY_APPLY_OP_FROM_STACK() \ + char op = sy_op_pop(); \ + int unary = (op == '!'); \ + if (cond_res_i < (2 - unary)) { cs_error_log("not enough input on line %d", lineno); goto out; } \ + int a = sy_res_pop(); \ + int b = unary ? 0 : sy_res_pop(); \ + int res = sy_apply_op(op, a, b); \ + sy_res_push(res); + zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*)) { @@ -111,10 +151,13 @@ const char *yyt4; HashTable vars; zend_hash_init(&vars, 10, NULL, str_dtor, 1); + zend_hash_str_add_ptr(&vars, ZEND_STRL("PHP_VERSION_ID"), zend_string_init(ZEND_STRL(ZEND_TOSTR(PHP_VERSION_ID)), 1)); - int cond_res = 1; - char cond_op = 0; - int cond_neg = 0; + + int cond_res[100] = {0}; + int cond_res_i = 0; + char cond_op[100] = {0}; + int cond_op_i = 0; int cond = yycinit; long lineno = 1; @@ -527,7 +570,7 @@ yy65: if (yych != ';') goto yy18; } ++YYCURSOR; - { cond_res = 1; goto yyc_init; } + { cond_res[0] = 1; goto yyc_init; } } /* *********************************** */ yyc_cond: @@ -570,38 +613,46 @@ yyc_cond: if (yybm[0+yych] & 8) { goto yy73; } - if (yych <= '/') { - if (yych <= '\f') { + if (yych <= '(') { + if (yych <= '\r') { if (yych <= 0x08) goto yy71; if (yych <= '\n') goto yy76; + if (yych >= '\r') goto yy78; } else { - if (yych <= '\r') goto yy78; if (yych <= 0x1F) goto yy71; if (yych <= '!') goto yy79; + if (yych >= '(') goto yy81; } } else { - if (yych <= '^') { + if (yych <= 'Z') { + if (yych <= '/') goto yy71; if (yych <= '9') { yyt1 = YYCURSOR; - goto yy81; + goto yy83; } - if (yych <= '@') goto yy71; - if (yych <= 'Z') { + if (yych >= 'A') { yyt1 = YYCURSOR; - goto yy84; + goto yy86; } } else { - if (yych == '`') goto yy71; - if (yych <= 'z') { - yyt1 = YYCURSOR; - goto yy84; + if (yych <= '_') { + if (yych >= '_') { + yyt1 = YYCURSOR; + goto yy86; + } + } else { + if (yych <= '`') goto yy71; + if (yych <= 'z') { + yyt1 = YYCURSOR; + goto yy86; + } } } } yy71: ++YYCURSOR; yy72: - { cs_error_log("Syntax error in condition on line %d", lineno); return false; } + { cs_error_log("Syntax error in condition on line %d", lineno); goto out; } yy73: yych = *++YYCURSOR; if (yybm[0+yych] & 8) { @@ -618,23 +669,27 @@ yy78: yy79: ++YYCURSOR; t1 = YYCURSOR - 1; - { cond_neg = (cond_neg + 1) % 2; goto yyc_cond; } + { sy_op_push(*t1); goto yyc_cond; } yy81: + ++YYCURSOR; + t1 = YYCURSOR - 1; + { sy_op_push(*t1); goto yyc_cond; } +yy83: yych = *++YYCURSOR; if (yybm[0+yych] & 16) { - goto yy81; + goto yy83; } t1 = yyt1; t2 = YYCURSOR; - { APPLY_OP(atoi(t1)); goto yyc_cond_op; } -yy84: + { sy_res_push(atoi(t1)); goto yyc_cond_op; } +yy86: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { - goto yy84; + goto yy86; } - if (yych == '(') goto yy87; -yy86: + if (yych == '(') goto yy89; +yy88: t1 = yyt1; t2 = YYCURSOR; { @@ -643,37 +698,37 @@ yy86: cs_error_log("unknown variable in condition on line %d", lineno); goto out; } - APPLY_OP(atoi(ZSTR_VAL(tmp))); + sy_res_push(atoi(ZSTR_VAL(tmp))); goto yyc_cond_op; } -yy87: +yy89: yych = *++YYCURSOR; if (yych == '"') { yyt2 = YYCURSOR; - goto yy89; + goto yy91; } if (yych == ')') { yyt2 = YYCURSOR; - goto yy91; + goto yy93; } -yy88: +yy90: YYCURSOR = YYMARKER; if (yyaccept == 0) { - goto yy86; + goto yy88; } else { - goto yy92; + goto yy94; } -yy89: +yy91: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy89; + goto yy91; } - if (yych <= '\r') goto yy88; - if (yych <= '"') goto yy93; - goto yy94; -yy91: + if (yych <= '\r') goto yy90; + if (yych <= '"') goto yy95; + goto yy96; +yy93: ++YYCURSOR; -yy92: +yy94: t1 = yyt1; t3 = yyt2; t2 = yyt2 - 1; @@ -681,48 +736,48 @@ yy92: { if (t4-t3 >= 2 && strlen("extension_loaded") == t2-t1 && strncmp("extension_loaded", t1, t2-t1) == 0) { int is_loaded = (zend_hash_str_find_ptr(&module_registry, t3+1, t4-t3-2) != NULL); - APPLY_OP(is_loaded); + sy_res_push(is_loaded); } else { cs_error_log("unknown function in condition on line %d", lineno); goto out; } goto yyc_cond_op; } -yy93: +yy95: yych = *++YYCURSOR; - if (yych == ')') goto yy91; - goto yy88; -yy94: + if (yych == ')') goto yy93; + goto yy90; +yy96: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy89; + goto yy91; } - if (yych <= '\r') goto yy88; - if (yych >= '#') goto yy94; + if (yych <= '\r') goto yy90; + if (yych >= '#') goto yy96; yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy94; + goto yy96; } if (yych <= '\r') { - if (yych == '\n') goto yy88; - if (yych <= '\f') goto yy89; - goto yy88; + if (yych == '\n') goto yy90; + if (yych <= '\f') goto yy91; + goto yy90; } else { if (yych <= '"') { - if (yych <= '!') goto yy89; - goto yy93; + if (yych <= '!') goto yy91; + goto yy95; } else { - if (yych != ')') goto yy89; + if (yych != ')') goto yy91; } } yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy89; + goto yy91; } - if (yych <= '\r') goto yy92; - if (yych <= '"') goto yy93; - goto yy94; + if (yych <= '\r') goto yy94; + if (yych <= '"') goto yy95; + goto yy96; } /* *********************************** */ yyc_cond_op: @@ -763,75 +818,114 @@ yyc_cond_op: }; yych = *YYCURSOR; if (yybm[0+yych] & 128) { - goto yy102; + goto yy104; } - if (yych <= ':') { - if (yych <= '\f') { - if (yych <= 0x08) goto yy100; - if (yych <= '\n') goto yy105; + if (yych <= ')') { + if (yych <= '\r') { + if (yych <= 0x08) goto yy102; + if (yych <= '\n') goto yy107; + if (yych >= '\r') goto yy109; } else { - if (yych <= '\r') goto yy107; if (yych == '&') { yyt1 = YYCURSOR; - goto yy108; + goto yy110; } + if (yych >= ')') goto yy111; } } else { if (yych <= '=') { - if (yych <= ';') goto yy109; + if (yych <= ':') goto yy102; + if (yych <= ';') goto yy113; if (yych <= '<') { yyt1 = YYCURSOR; - goto yy111; + goto yy115; } yyt1 = YYCURSOR; - goto yy113; + goto yy117; } else { if (yych <= '>') { yyt1 = YYCURSOR; - goto yy111; + goto yy115; } if (yych == '|') { yyt1 = YYCURSOR; - goto yy114; + goto yy118; } } } -yy100: - ++YYCURSOR; -yy101: - { cs_error_log("Syntax error in condition on line %d", lineno); return false; } yy102: + ++YYCURSOR; +yy103: + { cs_error_log("Syntax error in condition on line %d", lineno); goto out; } +yy104: yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy102; + goto yy104; } { goto yyc_cond_op; } -yy105: +yy107: ++YYCURSOR; { lineno++; goto yyc_cond_op; } -yy107: +yy109: yych = *++YYCURSOR; - if (yych == '\n') goto yy105; - goto yy101; -yy108: + if (yych == '\n') goto yy107; + goto yy103; +yy110: yych = *++YYCURSOR; - if (yych == '&') goto yy111; - goto yy101; -yy109: - ++YYCURSOR; - { goto yyc_init; } + if (yych == '&') goto yy119; + goto yy103; yy111: ++YYCURSOR; - t1 = yyt1; - { cond_op = *t1; goto yyc_cond; } + { + while (cond_op_i && sy_op_peek() != '(') { + SY_APPLY_OP_FROM_STACK(); + } + if (cond_op_i == 0 || sy_op_peek() != '(') { + cs_error_log("unbalanced parathesis on line %d", lineno); goto out; + } + sy_op_pop(); + goto yyc_cond_op; + } yy113: + ++YYCURSOR; + { + while (cond_op_i) { + if (sy_op_peek() == '(') { cs_error_log("unbalanced parathesis on line %d", lineno); goto out; } + SY_APPLY_OP_FROM_STACK(); + } + if (cond_res_i > 1) { cs_error_log("invalid condition on line %d", lineno); goto out; } + goto yyc_init; + } +yy115: + yych = *++YYCURSOR; + if (yych == '=') goto yy119; +yy116: + t1 = yyt1; + t2 = YYCURSOR; + { + char op1 = *t1; + if (t2-t1 == 2) { + switch (op1) { + case '<': op1 = 'L'; break; // <= + case '>': op1 = 'G'; break; // >= + } + } + 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))) { + SY_APPLY_OP_FROM_STACK(); + } + sy_op_push(*t1); + goto yyc_cond; + } +yy117: yych = *++YYCURSOR; - if (yych == '=') goto yy111; - goto yy101; -yy114: + if (yych == '=') goto yy119; + goto yy103; +yy118: yych = *++YYCURSOR; - if (yych == '|') goto yy111; - goto yy101; + if (yych != '|') goto yy103; +yy119: + ++YYCURSOR; + goto yy116; } /* *********************************** */ yyc_rule: @@ -872,158 +966,158 @@ yyc_rule: }; yych = *YYCURSOR; if (yybm[0+yych] & 8) { - goto yy119; + goto yy124; } if (yych <= '\r') { - if (yych <= 0x08) goto yy117; - if (yych <= '\n') goto yy122; - if (yych >= '\r') goto yy123; + if (yych <= 0x08) goto yy122; + if (yych <= '\n') goto yy127; + if (yych >= '\r') goto yy128; } else { if (yych <= '.') { - if (yych >= '.') goto yy124; + if (yych >= '.') goto yy129; } else { - if (yych == ';') goto yy125; + if (yych == ';') goto yy130; } } -yy117: +yy122: ++YYCURSOR; -yy118: +yy123: { goto end_of_rule; } -yy119: +yy124: yych = *++YYCURSOR; if (yybm[0+yych] & 8) { - goto yy119; + goto yy124; } { goto yyc_rule; } -yy122: +yy127: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\r') { - if (yych <= 0x08) goto yy118; + if (yych <= 0x08) goto yy123; if (yych <= '\n') { yyt1 = YYCURSOR; - goto yy127; + goto yy132; } - if (yych <= '\f') goto yy118; + if (yych <= '\f') goto yy123; yyt1 = YYCURSOR; - goto yy130; + goto yy135; } else { if (yych <= ' ') { - if (yych <= 0x1F) goto yy118; + if (yych <= 0x1F) goto yy123; yyt1 = YYCURSOR; - goto yy127; + goto yy132; } else { if (yych == '.') { yyt1 = YYCURSOR; - goto yy131; + goto yy136; } - goto yy118; + goto yy123; } } -yy123: +yy128: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == '\n') goto yy133; - goto yy118; -yy124: + if (yych == '\n') goto yy138; + goto yy123; +yy129: yych = *++YYCURSOR; if (yych <= '^') { - if (yych <= '@') goto yy118; + if (yych <= '@') goto yy123; if (yych <= 'Z') { yyt1 = YYCURSOR; - goto yy134; + goto yy139; } - goto yy118; + goto yy123; } else { - if (yych == '`') goto yy118; + if (yych == '`') goto yy123; if (yych <= 'z') { yyt1 = YYCURSOR; - goto yy134; + goto yy139; } - goto yy118; + goto yy123; } -yy125: +yy130: ++YYCURSOR; { end_of_rule: - if (!cond_res) { goto yyc_init; } + if (!cond_res[0]) { goto yyc_init; } parsed_rule[kw_i++] = (sp_parsed_keyword){0, 0, 0, 0, 0, 0}; if (process_rule && process_rule(parsed_rule) != SUCCESS) { goto out; } goto yyc_init; } -yy127: +yy132: yych = *++YYCURSOR; if (yybm[0+yych] & 16) { - goto yy127; + goto yy132; } - if (yych == '\r') goto yy130; - if (yych == '.') goto yy131; -yy129: + if (yych == '\r') goto yy135; + if (yych == '.') goto yy136; +yy134: YYCURSOR = YYMARKER; if (yyaccept <= 1) { if (yyaccept == 0) { - goto yy118; + goto yy123; } else { yyt3 = yyt4 = NULL; yyt2 = YYCURSOR; - goto yy136; + goto yy141; } } else { - goto yy136; + goto yy141; } -yy130: +yy135: yych = *++YYCURSOR; - if (yych == '\n') goto yy127; - goto yy129; -yy131: + if (yych == '\n') goto yy132; + goto yy134; +yy136: ++YYCURSOR; YYCURSOR = yyt1; { lineno++; goto yyc_rule; } -yy133: +yy138: yych = *++YYCURSOR; if (yych <= '\r') { - if (yych <= 0x08) goto yy129; + if (yych <= 0x08) goto yy134; if (yych <= '\n') { yyt1 = YYCURSOR; - goto yy127; + goto yy132; } - if (yych <= '\f') goto yy129; + if (yych <= '\f') goto yy134; yyt1 = YYCURSOR; - goto yy130; + goto yy135; } else { if (yych <= ' ') { - if (yych <= 0x1F) goto yy129; + if (yych <= 0x1F) goto yy134; yyt1 = YYCURSOR; - goto yy127; + goto yy132; } else { if (yych == '.') { yyt1 = YYCURSOR; - goto yy131; + goto yy136; } - goto yy129; + goto yy134; } } -yy134: +yy139: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { - goto yy134; + goto yy139; } if (yych == '(') { yyt2 = YYCURSOR; - goto yy137; + goto yy142; } yyt3 = yyt4 = NULL; yyt2 = YYCURSOR; -yy136: +yy141: t1 = yyt1; t2 = yyt2; t3 = yyt3; t4 = yyt4; { - if (!cond_res) { goto yyc_rule; } + if (!cond_res[0]) { goto yyc_rule; } if (kw_i == max_keywords) { cs_error_log("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno); goto out; @@ -1052,110 +1146,110 @@ yy136: parsed_rule[kw_i++] = kw; goto yyc_rule; } -yy137: +yy142: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '"') { - if (yych <= '!') goto yy129; + if (yych <= '!') goto yy134; yyt3 = YYCURSOR; } else { if (yych == ')') { yyt3 = yyt4 = YYCURSOR; - goto yy140; + goto yy145; } - goto yy129; + goto yy134; } } else { if (yych <= '_') { if (yych <= 'Z') { yyt3 = YYCURSOR; - goto yy141; + goto yy146; } - if (yych <= '^') goto yy129; + if (yych <= '^') goto yy134; yyt3 = YYCURSOR; - goto yy141; + goto yy146; } else { - if (yych <= '`') goto yy129; + if (yych <= '`') goto yy134; if (yych <= 'z') { yyt3 = YYCURSOR; - goto yy141; + goto yy146; } - goto yy129; + goto yy134; } } -yy138: +yy143: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy138; + goto yy143; } - if (yych <= '\r') goto yy129; - if (yych <= '"') goto yy143; - goto yy144; -yy140: + if (yych <= '\r') goto yy134; + if (yych <= '"') goto yy148; + goto yy149; +yy145: ++YYCURSOR; - goto yy136; -yy141: + goto yy141; +yy146: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= ')') { - if (yych <= '(') goto yy129; + if (yych <= '(') goto yy134; yyt4 = YYCURSOR; - goto yy140; + goto yy145; } else { - if (yych <= '/') goto yy129; - if (yych <= '9') goto yy141; - goto yy129; + if (yych <= '/') goto yy134; + if (yych <= '9') goto yy146; + goto yy134; } } else { if (yych <= '_') { - if (yych <= 'Z') goto yy141; - if (yych <= '^') goto yy129; - goto yy141; + if (yych <= 'Z') goto yy146; + if (yych <= '^') goto yy134; + goto yy146; } else { - if (yych <= '`') goto yy129; - if (yych <= 'z') goto yy141; - goto yy129; + if (yych <= '`') goto yy134; + if (yych <= 'z') goto yy146; + goto yy134; } } -yy143: +yy148: yych = *++YYCURSOR; if (yych == ')') { yyt4 = YYCURSOR; - goto yy140; + goto yy145; } - goto yy129; -yy144: + goto yy134; +yy149: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy138; + goto yy143; } - if (yych <= '\r') goto yy129; - if (yych >= '#') goto yy144; + if (yych <= '\r') goto yy134; + if (yych >= '#') goto yy149; yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy144; + goto yy149; } if (yych <= '\r') { - if (yych == '\n') goto yy129; - if (yych <= '\f') goto yy138; - goto yy129; + if (yych == '\n') goto yy134; + if (yych <= '\f') goto yy143; + goto yy134; } else { if (yych <= '"') { - if (yych <= '!') goto yy138; - goto yy143; + if (yych <= '!') goto yy143; + goto yy148; } else { - if (yych != ')') goto yy138; + if (yych != ')') goto yy143; yyt4 = YYCURSOR; } } yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy138; + goto yy143; } - if (yych <= '\r') goto yy136; - if (yych <= '"') goto yy143; - goto yy144; + if (yych <= '\r') goto yy141; + if (yych <= '"') goto yy148; + goto yy149; } } diff --git a/src/sp_config_scanner.re b/src/sp_config_scanner.re index b36423b..f911df3 100644 --- a/src/sp_config_scanner.re +++ b/src/sp_config_scanner.re @@ -71,20 +71,60 @@ static void str_dtor(zval *zv) { zend_string_release_ex(Z_STR_P(zv), 1); } -static int apply_op(int v1, char op, int v2, int neg) { - if (neg) { v2 = !v2; } +// sy_ functions and macros are helpers for the shunting yard algorithm +#define sy_res_push(val) \ + if (cond_res_i >= 100) { cs_error_log("condition too complex on line %d", lineno); goto out; } \ + cond_res[cond_res_i++] = val; +#define sy_res_pop() cond_res[--cond_res_i] +#define sy_op_push(op) \ + if (cond_op_i >= 100) { cs_error_log("condition too complex on line %d", lineno); goto out; } \ + cond_op[cond_op_i++] = op; +#define sy_op_pop() cond_op[--cond_op_i] +#define sy_op_peek() cond_op[cond_op_i-1] + +static inline int sy_op_precedence(char op) { switch (op) { - case 0: return v2; - case '&': return (v1 && v2); - case '|': return (v1 || v2); - case '<': return (v1 < v2); - case '>': return (v1 > v2); - case '=': return (v1 == v2); + case '!': return 120; + case '<': + case '>': + case 'L': // <= + case 'G': // >= + return 90; + case '&': return 70; + case '|': return 60; + case '=': return 20; } return 0; } +static inline int sy_op_is_left_assoc(char op) { + switch (op) { + case '!': return 0; + } + return 1; +} +static int sy_apply_op(char op, int a, int b) { + switch (op) { + case '!': return !a; + case '&': return (b && a); + case '|': return (b || a); + case '<': return (b < a); + case 'L': return (b <= a); + case 'G': return (b >= a); + case '>': return (b > a); + case '=': return (b == a); + } + return 0; +} + +#define SY_APPLY_OP_FROM_STACK() \ + char op = sy_op_pop(); \ + int unary = (op == '!'); \ + if (cond_res_i < (2 - unary)) { cs_error_log("not enough input on line %d", lineno); goto out; } \ + int a = sy_res_pop(); \ + int b = unary ? 0 : sy_res_pop(); \ + int res = sy_apply_op(op, a, b); \ + sy_res_push(res); -#define APPLY_OP(v2) cond_res = apply_op(cond_res, cond_op, v2, cond_neg); cond_op = cond_neg = 0; zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*)) { @@ -100,10 +140,13 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key HashTable vars; zend_hash_init(&vars, 10, NULL, str_dtor, 1); + zend_hash_str_add_ptr(&vars, ZEND_STRL("PHP_VERSION_ID"), zend_string_init(ZEND_STRL(ZEND_TOSTR(PHP_VERSION_ID)), 1)); - int cond_res = 1; - char cond_op = 0; - int cond_neg = 0; + + int cond_res[100] = {0}; + int cond_res_i = 0; + char cond_op[100] = {0}; + int cond_op_i = 0; int cond = yycinit; long lineno = 1; @@ -141,14 +184,14 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key goto yyc_init; } "@condition" ws+ { goto yyc_cond; } - "@end_condition" ws* ";" { cond_res = 1; goto yyc_init; } + "@end_condition" ws* ";" { cond_res[0] = 1; goto yyc_init; } ws+ { goto yyc_cond; } nl { lineno++; goto yyc_cond; } @t1 keyword @t2 "(" @t3 string? @t4 ")" { if (t4-t3 >= 2 && strlen("extension_loaded") == t2-t1 && strncmp("extension_loaded", t1, t2-t1) == 0) { int is_loaded = (zend_hash_str_find_ptr(&module_registry, t3+1, t4-t3-2) != NULL); - APPLY_OP(is_loaded); + sy_res_push(is_loaded); } else { cs_error_log("unknown function in condition on line %d", lineno); goto out; @@ -161,21 +204,52 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key cs_error_log("unknown variable in condition on line %d", lineno); goto out; } - APPLY_OP(atoi(ZSTR_VAL(tmp))); + sy_res_push(atoi(ZSTR_VAL(tmp))); goto yyc_cond_op; } - @t1 [0-9]+ @t2 { APPLY_OP(atoi(t1)); goto yyc_cond_op; } - @t1 "!" { cond_neg = (cond_neg + 1) % 2; goto yyc_cond; } + @t1 [0-9]+ @t2 { sy_res_push(atoi(t1)); goto yyc_cond_op; } + @t1 "!" { sy_op_push(*t1); goto yyc_cond; } + @t1 "(" { sy_op_push(*t1); goto yyc_cond; } ws+ { goto yyc_cond_op; } nl { lineno++; goto yyc_cond_op; } - @t1 ( "&&" | "||" | "<" | ">" | "==" ) { cond_op = *t1; goto yyc_cond; } - ";" { goto yyc_init; } - * { cs_error_log("Syntax error in condition on line %d", lineno); return false; } + @t1 ( "&&" | "||" | "<" | ">" | "==" | "<=" | ">=") @t2 { + char op1 = *t1; + if (t2-t1 == 2) { + switch (op1) { + case '<': op1 = 'L'; break; // <= + case '>': op1 = 'G'; break; // >= + } + } + 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))) { + SY_APPLY_OP_FROM_STACK(); + } + sy_op_push(*t1); + goto yyc_cond; + } + ")" { + while (cond_op_i && sy_op_peek() != '(') { + SY_APPLY_OP_FROM_STACK(); + } + if (cond_op_i == 0 || sy_op_peek() != '(') { + cs_error_log("unbalanced parathesis on line %d", lineno); goto out; + } + sy_op_pop(); + goto yyc_cond_op; + } + ";" { + while (cond_op_i) { + if (sy_op_peek() == '(') { cs_error_log("unbalanced parathesis on line %d", lineno); goto out; } + SY_APPLY_OP_FROM_STACK(); + } + if (cond_res_i > 1) { cs_error_log("invalid condition on line %d", lineno); goto out; } + goto yyc_init; + } + * { cs_error_log("Syntax error in condition on line %d", lineno); goto out; } ws+ { goto yyc_rule; } nl / ( nl | ws )* "." { lineno++; goto yyc_rule; } "." @t1 keyword @t2 ( "(" @t3 ( string? | keyword ) @t4 ")" )? { - if (!cond_res) { goto yyc_rule; } + if (!cond_res[0]) { goto yyc_rule; } if (kw_i == max_keywords) { cs_error_log("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno); goto out; @@ -206,7 +280,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key } ";" { end_of_rule: - if (!cond_res) { goto yyc_init; } + if (!cond_res[0]) { goto yyc_init; } parsed_rule[kw_i++] = (sp_parsed_keyword){0, 0, 0, 0, 0, 0}; if (process_rule && process_rule(parsed_rule) != SUCCESS) { goto out; -- cgit v1.3 From b4dcbe2dd11efda09adc934fa2563eafc12e9b55 Mon Sep 17 00:00:00 2001 From: Ben Fuhrmannek Date: Thu, 2 Sep 2021 13:58:01 +0200 Subject: fixed compiler warnings + test cases --- src/sp_config_keywords.c | 2 +- src/sp_config_scanner.cached.c | 14 +++++++------- src/sp_config_scanner.re | 14 +++++++------- .../broken_conf_cookie_encryption_without_env_var.phpt | 2 +- .../cookies_encryption_warning/encrypt_cookies_no_env.phpt | 2 +- .../encrypt_regexp_cookies_no_env.phpt | 2 +- 6 files changed, 18 insertions(+), 18 deletions(-) (limited to 'src/sp_config_scanner.cached.c') diff --git a/src/sp_config_keywords.c b/src/sp_config_keywords.c index fd90453..3b6bc0b 100644 --- a/src/sp_config_keywords.c +++ b/src/sp_config_keywords.c @@ -183,7 +183,7 @@ SP_PARSE_FN(parse_cookie) { if (cookie->encrypt) { if (!SNUFFLEUPAGUS_G(config).config_snuffleupagus->cookies_env_var) { sp_log_err("config", "You're trying to use the cookie encryption feature on line %zu " - "without having set the `." SP_TOKEN_ENV_VAR "` option in`sp.global`: please set it first", parsed_rule->lineno); + "without having set the `." SP_TOKEN_ENV_VAR "` option in `sp.global`: please set it first", parsed_rule->lineno); goto err; } else if (!SNUFFLEUPAGUS_G(config).config_snuffleupagus->encryption_key) { sp_log_err("config", "You're trying to use the cookie encryption feature " diff --git a/src/sp_config_scanner.cached.c b/src/sp_config_scanner.cached.c index 26a6652..868d271 100644 --- a/src/sp_config_scanner.cached.c +++ b/src/sp_config_scanner.cached.c @@ -154,7 +154,7 @@ const char *yyt4; zend_hash_str_add_ptr(&vars, ZEND_STRL("PHP_VERSION_ID"), zend_string_init(ZEND_STRL(ZEND_TOSTR(PHP_VERSION_ID)), 1)); - int cond_res[100] = {0}; + int cond_res[100] = {1}; int cond_res_i = 0; char cond_op[100] = {0}; int cond_op_i = 0; @@ -883,7 +883,7 @@ yy111: if (cond_op_i == 0 || sy_op_peek() != '(') { cs_error_log("unbalanced parathesis on line %d", lineno); goto out; } - sy_op_pop(); + cond_op_i--; goto yyc_cond_op; } yy113: @@ -910,12 +910,12 @@ yy116: case '>': op1 = 'G'; break; // >= } } - 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))) { - SY_APPLY_OP_FROM_STACK(); - } - sy_op_push(*t1); - goto yyc_cond; + 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)))) { + SY_APPLY_OP_FROM_STACK(); } + sy_op_push(*t1); + goto yyc_cond; + } yy117: yych = *++YYCURSOR; if (yych == '=') goto yy119; diff --git a/src/sp_config_scanner.re b/src/sp_config_scanner.re index f911df3..5fd1928 100644 --- a/src/sp_config_scanner.re +++ b/src/sp_config_scanner.re @@ -143,7 +143,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key zend_hash_str_add_ptr(&vars, ZEND_STRL("PHP_VERSION_ID"), zend_string_init(ZEND_STRL(ZEND_TOSTR(PHP_VERSION_ID)), 1)); - int cond_res[100] = {0}; + int cond_res[100] = {1}; int cond_res_i = 0; char cond_op[100] = {0}; int cond_op_i = 0; @@ -220,12 +220,12 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key case '>': op1 = 'G'; break; // >= } } - 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))) { - SY_APPLY_OP_FROM_STACK(); - } - sy_op_push(*t1); - goto yyc_cond; + 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)))) { + SY_APPLY_OP_FROM_STACK(); } + sy_op_push(*t1); + goto yyc_cond; + } ")" { while (cond_op_i && sy_op_peek() != '(') { SY_APPLY_OP_FROM_STACK(); @@ -233,7 +233,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key if (cond_op_i == 0 || sy_op_peek() != '(') { cs_error_log("unbalanced parathesis on line %d", lineno); goto out; } - sy_op_pop(); + cond_op_i--; goto yyc_cond_op; } ";" { diff --git a/src/tests/broken_configuration_php8/broken_conf_cookie_encryption_without_env_var.phpt b/src/tests/broken_configuration_php8/broken_conf_cookie_encryption_without_env_var.phpt index 25371dd..99e391e 100644 --- a/src/tests/broken_configuration_php8/broken_conf_cookie_encryption_without_env_var.phpt +++ b/src/tests/broken_configuration_php8/broken_conf_cookie_encryption_without_env_var.phpt @@ -7,7 +7,7 @@ Broken configuration - encrypted cookie with without cookie env var sp.configuration_file={PWD}/config/broken_conf_cookie_encryption_without_env_var.ini --FILE-- --EXPECT-- -Fatal error: [snuffleupagus][0.0.0.0][config][log] You're trying to use the cookie encryption feature on line 2 without having set the `.cookie_env_var` option in`sp.global`: please set it first in Unknown on line 0 +Fatal error: [snuffleupagus][0.0.0.0][config][log] You're trying to use the cookie encryption feature on line 2 without having set the `.cookie_env_var` option in `sp.global`: please set it first in Unknown on line 0 Fatal error: [snuffleupagus][0.0.0.0][config][log] Invalid configuration file in Unknown on line 0 Could not startup. diff --git a/src/tests/cookies_encryption_warning/encrypt_cookies_no_env.phpt b/src/tests/cookies_encryption_warning/encrypt_cookies_no_env.phpt index a01c352..b31bf78 100644 --- a/src/tests/cookies_encryption_warning/encrypt_cookies_no_env.phpt +++ b/src/tests/cookies_encryption_warning/encrypt_cookies_no_env.phpt @@ -18,4 +18,4 @@ EOF; --EXPECT-- Fatal error: [snuffleupagus][127.0.0.1][config][log] Invalid configuration file in Unknown on line 0 -Fatal error: [snuffleupagus][127.0.0.1][config][log] You're trying to use the cookie encryption feature on line 2 without having set the `.cookie_env_var` option in`sp.global`: please set it first in Unknown on line 0 +Fatal error: [snuffleupagus][127.0.0.1][config][log] You're trying to use the cookie encryption feature on line 2 without having set the `.cookie_env_var` option in `sp.global`: please set it first in Unknown on line 0 diff --git a/src/tests/cookies_encryption_warning/encrypt_regexp_cookies_no_env.phpt b/src/tests/cookies_encryption_warning/encrypt_regexp_cookies_no_env.phpt index 1fe4074..d4b7e6a 100644 --- a/src/tests/cookies_encryption_warning/encrypt_regexp_cookies_no_env.phpt +++ b/src/tests/cookies_encryption_warning/encrypt_regexp_cookies_no_env.phpt @@ -18,4 +18,4 @@ EOF; --EXPECT-- Fatal error: [snuffleupagus][127.0.0.1][config][log] Invalid configuration file in Unknown on line 0 -Fatal error: [snuffleupagus][127.0.0.1][config][log] You're trying to use the cookie encryption feature on line 2 without having set the `.cookie_env_var` option in`sp.global`: please set it first in Unknown on line 0 +Fatal error: [snuffleupagus][127.0.0.1][config][log] You're trying to use the cookie encryption feature on line 2 without having set the `.cookie_env_var` option in `sp.global`: please set it first in Unknown on line 0 -- cgit v1.3 From 2ffe94c9366f96700ec5f747385ac07307a012a5 Mon Sep 17 00:00:00 2001 From: Ben Fuhrmannek Date: Thu, 21 Oct 2021 18:54:06 +0200 Subject: fix oob memory access --- src/sp_config_scanner.cached.c | 2 +- src/sp_config_scanner.re | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/sp_config_scanner.cached.c') diff --git a/src/sp_config_scanner.cached.c b/src/sp_config_scanner.cached.c index 868d271..90bcdbe 100644 --- a/src/sp_config_scanner.cached.c +++ b/src/sp_config_scanner.cached.c @@ -164,7 +164,7 @@ const char *yyt4; { - char yych; + unsigned char yych; unsigned int yyaccept = 0; if (cond < 2) { if (cond < 1) { diff --git a/src/sp_config_scanner.re b/src/sp_config_scanner.re index 5fd1928..75e0424 100644 --- a/src/sp_config_scanner.re +++ b/src/sp_config_scanner.re @@ -152,7 +152,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key long lineno = 1; /*!re2c - re2c:define:YYCTYPE = char; + re2c:define:YYCTYPE = "unsigned char"; // re2c:define:YYCURSOR = data; re2c:yyfill:enable = 0; re2c:flags:tags = 1; -- cgit v1.3 From aa099cd7a4aa5e3296d39158184e301af9ef2f78 Mon Sep 17 00:00:00 2001 From: Ben Fuhrmannek Date: Tue, 30 Nov 2021 13:06:53 +0100 Subject: added @log logging feature to config parser --- src/sp_config_scanner.cached.c | 783 +++++++++++++++++++++++------------------ src/sp_config_scanner.re | 35 +- src/sp_utils.h | 1 + 3 files changed, 463 insertions(+), 356 deletions(-) (limited to 'src/sp_config_scanner.cached.c') diff --git a/src/sp_config_scanner.cached.c b/src/sp_config_scanner.cached.c index 90bcdbe..91144c7 100644 --- a/src/sp_config_scanner.cached.c +++ b/src/sp_config_scanner.cached.c @@ -9,7 +9,8 @@ enum YYCONDTYPE { }; -#define cs_error_log(fmt, ...) sp_log_err("config", fmt, ##__VA_ARGS__) +#define cs_log_error(fmt, ...) sp_log_err("config", fmt, ##__VA_ARGS__) +#define cs_log_info(fmt, ...) sp_log_msg("config", SP_LOG_INFO, fmt, ##__VA_ARGS__) zend_string *sp_get_arg_string(sp_parsed_keyword *kw) { if (!kw || !kw->arg) { @@ -80,11 +81,11 @@ static void str_dtor(zval *zv) { // sy_ functions and macros are helpers for the shunting yard algorithm #define sy_res_push(val) \ - if (cond_res_i >= 100) { cs_error_log("condition too complex on line %d", lineno); goto out; } \ + if (cond_res_i >= 100) { cs_log_error("condition too complex on line %d", lineno); goto out; } \ cond_res[cond_res_i++] = val; #define sy_res_pop() cond_res[--cond_res_i] #define sy_op_push(op) \ - if (cond_op_i >= 100) { cs_error_log("condition too complex on line %d", lineno); goto out; } \ + if (cond_op_i >= 100) { cs_log_error("condition too complex on line %d", lineno); goto out; } \ cond_op[cond_op_i++] = op; #define sy_op_pop() cond_op[--cond_op_i] #define sy_op_peek() cond_op[cond_op_i-1] @@ -126,7 +127,7 @@ static int sy_apply_op(char op, int a, int b) { #define SY_APPLY_OP_FROM_STACK() \ char op = sy_op_pop(); \ int unary = (op == '!'); \ - if (cond_res_i < (2 - unary)) { cs_error_log("not enough input on line %d", lineno); goto out; } \ + if (cond_res_i < (2 - unary)) { cs_log_error("not enough input on line %d", lineno); goto out; } \ int a = sy_res_pop(); \ int b = unary ? 0 : sy_res_pop(); \ int res = sy_apply_op(op, a, b); \ @@ -246,7 +247,7 @@ yy2: yy4: ++YYCURSOR; yy5: - { cs_error_log("Parser error on line %d", lineno); goto out; } + { cs_log_error("Parser error on line %d", lineno); goto out; } yy6: yych = *++YYCURSOR; if (yybm[0+yych] & 8) { @@ -269,162 +270,249 @@ yy12: yy15: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'c') goto yy17; - if (yych == 'e') goto yy19; - goto yy5; + if (yych <= 'd') { + if (yych == 'c') goto yy17; + goto yy5; + } else { + if (yych <= 'e') goto yy19; + if (yych == 'l') goto yy20; + goto yy5; + } yy16: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'e') goto yy20; - if (yych == 'p') goto yy21; + if (yych == 'e') goto yy21; + if (yych == 'p') goto yy22; goto yy5; yy17: yych = *++YYCURSOR; - if (yych == 'o') goto yy23; + if (yych == 'o') goto yy24; yy18: YYCURSOR = YYMARKER; - if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy5; + if (yyaccept <= 2) { + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy5; + } else { + yyt1 = YYCURSOR; + goto yy37; + } } else { - yyt4 = YYCURSOR; - goto yy45; + goto yy37; } } else { - goto yy45; + if (yyaccept == 3) { + yyt4 = YYCURSOR; + goto yy57; + } else { + goto yy57; + } } yy19: yych = *++YYCURSOR; - if (yych == 'n') goto yy24; + if (yych == 'n') goto yy25; goto yy18; yy20: yych = *++YYCURSOR; - if (yych == 't') goto yy25; + if (yych == 'o') goto yy26; goto yy18; yy21: - ++YYCURSOR; - { kw_i = 0; goto yyc_rule; } -yy23: yych = *++YYCURSOR; - if (yych == 'n') goto yy26; + if (yych == 't') goto yy27; goto yy18; +yy22: + ++YYCURSOR; + { kw_i = 0; goto yyc_rule; } yy24: yych = *++YYCURSOR; - if (yych == 'd') goto yy27; + if (yych == 'n') goto yy28; goto yy18; yy25: yych = *++YYCURSOR; - if (yych == '\t') goto yy28; - if (yych == ' ') goto yy28; + if (yych == 'd') goto yy29; goto yy18; yy26: yych = *++YYCURSOR; - if (yych == 'd') goto yy30; + if (yych == 'g') goto yy30; goto yy18; yy27: yych = *++YYCURSOR; - if (yych == '_') goto yy31; + if (yych == '\t') goto yy31; + if (yych == ' ') goto yy31; goto yy18; yy28: + yych = *++YYCURSOR; + if (yych == 'd') goto yy33; + goto yy18; +yy29: + yych = *++YYCURSOR; + if (yych == '_') goto yy34; + goto yy18; +yy30: + yych = *++YYCURSOR; + if (yych == '\t') goto yy35; + if (yych == ' ') goto yy35; + goto yy18; +yy31: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '\t') { if (yych <= 0x08) goto yy18; - goto yy28; + goto yy31; } else { - if (yych == ' ') goto yy28; + if (yych == ' ') goto yy31; goto yy18; } } else { if (yych <= '_') { if (yych <= 'Z') { yyt1 = YYCURSOR; - goto yy32; + goto yy38; } if (yych <= '^') goto yy18; yyt1 = YYCURSOR; - goto yy32; + goto yy38; } else { if (yych <= '`') goto yy18; if (yych <= 'z') { yyt1 = YYCURSOR; - goto yy32; + goto yy38; } goto yy18; } } -yy30: +yy33: yych = *++YYCURSOR; - if (yych == 'i') goto yy34; + if (yych == 'i') goto yy40; goto yy18; -yy31: +yy34: yych = *++YYCURSOR; - if (yych == 'c') goto yy35; + if (yych == 'c') goto yy41; goto yy18; -yy32: +yy35: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x1F) { + if (yych == '\t') goto yy35; + yyt1 = YYCURSOR; + } else { + if (yych <= ' ') goto yy35; + if (yych == '"') { + yyt1 = YYCURSOR; + goto yy42; + } + yyt1 = YYCURSOR; + } +yy37: + t1 = yyt1; + t2 = YYCURSOR; + { + char tmpstr[1024]; + size_t tmplen = MIN(t2-t1-2, 1023); + strncpy(tmpstr, t1+1, tmplen); + tmpstr[tmplen] = 0; + cs_log_info("[line %d]: %s", lineno, tmpstr); + goto yyc_init; + } +yy38: yych = *++YYCURSOR; if (yybm[0+yych] & 32) { - goto yy32; + goto yy38; } if (yych == '\t') { yyt2 = YYCURSOR; - goto yy36; + goto yy44; } if (yych == ' ') { yyt2 = YYCURSOR; - goto yy36; + goto yy44; } goto yy18; -yy34: +yy40: yych = *++YYCURSOR; - if (yych == 't') goto yy38; + if (yych == 't') goto yy46; goto yy18; -yy35: +yy41: yych = *++YYCURSOR; - if (yych == 'o') goto yy39; + if (yych == 'o') goto yy47; goto yy18; -yy36: +yy42: + yych = *++YYCURSOR; + if (yybm[0+yych] & 64) { + goto yy42; + } + if (yych <= '\r') goto yy18; + if (yych <= '"') goto yy48; + goto yy49; +yy44: yych = *++YYCURSOR; if (yych <= 0x1F) { - if (yych == '\t') goto yy36; + if (yych == '\t') goto yy44; goto yy18; } else { - if (yych <= ' ') goto yy36; + if (yych <= ' ') goto yy44; if (yych == '"') { yyt3 = YYCURSOR; - goto yy40; + goto yy51; } goto yy18; } -yy38: +yy46: yych = *++YYCURSOR; - if (yych == 'i') goto yy42; + if (yych == 'i') goto yy53; goto yy18; -yy39: +yy47: yych = *++YYCURSOR; - if (yych == 'n') goto yy43; + if (yych == 'n') goto yy54; goto yy18; -yy40: +yy48: + ++YYCURSOR; + goto yy37; +yy49: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy40; + goto yy42; } if (yych <= '\r') goto yy18; - if (yych <= '"') goto yy44; - goto yy46; -yy42: + if (yych <= '"') goto yy55; + goto yy49; +yy51: + yych = *++YYCURSOR; + if (yych <= '\r') { + if (yych == '\n') goto yy18; + if (yych <= '\f') goto yy51; + goto yy18; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy51; + goto yy56; + } else { + if (yych == '\\') goto yy58; + goto yy51; + } + } +yy53: yych = *++YYCURSOR; - if (yych == 'o') goto yy48; + if (yych == 'o') goto yy60; goto yy18; -yy43: +yy54: yych = *++YYCURSOR; - if (yych == 'd') goto yy49; + if (yych == 'd') goto yy61; goto yy18; -yy44: +yy55: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy42; + } + if (yych <= '\r') goto yy37; + if (yych <= '"') goto yy48; + goto yy49; +yy56: yych = *++YYCURSOR; yyt4 = YYCURSOR; - goto yy51; -yy45: + goto yy63; +yy57: t1 = yyt1; t2 = yyt2; t3 = yyt3; @@ -440,133 +528,142 @@ yy45: zend_hash_str_add_ptr(&vars, key, keylen, tmp); goto yyc_init; } -yy46: +yy58: yych = *++YYCURSOR; - if (yybm[0+yych] & 64) { - goto yy40; + if (yych <= '\r') { + if (yych == '\n') goto yy18; + if (yych <= '\f') goto yy51; + goto yy18; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy51; + goto yy65; + } else { + if (yych == '\\') goto yy58; + goto yy51; + } } - if (yych <= '\r') goto yy18; - if (yych <= '"') goto yy53; - goto yy46; -yy48: +yy60: yych = *++YYCURSOR; - if (yych == 'n') goto yy54; + if (yych == 'n') goto yy66; goto yy18; -yy49: +yy61: yych = *++YYCURSOR; - if (yych == 'i') goto yy55; + if (yych == 'i') goto yy67; goto yy18; -yy50: +yy62: yych = *++YYCURSOR; -yy51: +yy63: if (yych <= 0x1F) { - if (yych == '\t') goto yy50; - goto yy45; + if (yych == '\t') goto yy62; + goto yy57; } else { - if (yych <= ' ') goto yy50; - if (yych != ';') goto yy45; + if (yych <= ' ') goto yy62; + if (yych != ';') goto yy57; } ++YYCURSOR; - goto yy45; -yy53: - yyaccept = 1; + goto yy57; +yy65: + yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy46; - } - if (yych <= 0x1F) { + if (yych <= ' ') { if (yych <= '\n') { - if (yych <= 0x08) goto yy40; + if (yych <= 0x08) goto yy51; if (yych <= '\t') { yyt4 = YYCURSOR; - goto yy56; + goto yy68; } yyt4 = YYCURSOR; - goto yy45; + goto yy57; } else { if (yych == '\r') { yyt4 = YYCURSOR; - goto yy45; + goto yy57; } - goto yy40; + if (yych <= 0x1F) goto yy51; + yyt4 = YYCURSOR; + goto yy68; } } else { - if (yych <= '"') { - if (yych <= ' ') { - yyt4 = YYCURSOR; - goto yy56; - } - if (yych <= '!') goto yy40; - goto yy44; + if (yych <= ':') { + if (yych == '"') goto yy56; + goto yy51; } else { - if (yych == ';') { + if (yych <= ';') { yyt4 = YYCURSOR; - goto yy58; + goto yy70; } - goto yy40; + if (yych == '\\') goto yy58; + goto yy51; } } -yy54: +yy66: yych = *++YYCURSOR; - if (yych == '\t') goto yy59; - if (yych == ' ') goto yy59; + if (yych == '\t') goto yy71; + if (yych == ' ') goto yy71; goto yy18; -yy55: +yy67: yych = *++YYCURSOR; - if (yych == 't') goto yy62; + if (yych == 't') goto yy74; goto yy18; -yy56: - yyaccept = 2; +yy68: + yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy46; - } - if (yych <= 0x1F) { + if (yych <= ' ') { if (yych <= '\n') { - if (yych <= 0x08) goto yy40; - if (yych <= '\t') goto yy56; - goto yy45; + if (yych <= 0x08) goto yy51; + if (yych <= '\t') goto yy68; + goto yy57; } else { - if (yych == '\r') goto yy45; - goto yy40; + if (yych == '\r') goto yy57; + if (yych <= 0x1F) goto yy51; + goto yy68; } } else { - if (yych <= '"') { - if (yych <= ' ') goto yy56; - if (yych <= '!') goto yy40; - goto yy44; + if (yych <= ':') { + if (yych == '"') goto yy56; + goto yy51; } else { - if (yych != ';') goto yy40; + if (yych <= ';') goto yy70; + if (yych == '\\') goto yy58; + goto yy51; } } -yy58: - yyaccept = 2; +yy70: + yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy40; + if (yych <= '\r') { + if (yych == '\n') goto yy57; + if (yych <= '\f') goto yy51; + goto yy57; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy51; + goto yy56; + } else { + if (yych == '\\') goto yy58; + goto yy51; + } } - if (yych <= '\r') goto yy45; - if (yych <= '"') goto yy44; - goto yy46; -yy59: +yy71: yych = *++YYCURSOR; - if (yych == '\t') goto yy59; - if (yych == ' ') goto yy59; + if (yych == '\t') goto yy71; + if (yych == ' ') goto yy71; { goto yyc_cond; } -yy62: +yy74: yych = *++YYCURSOR; if (yych != 'i') goto yy18; yych = *++YYCURSOR; if (yych != 'o') goto yy18; yych = *++YYCURSOR; if (yych != 'n') goto yy18; -yy65: +yy77: yych = *++YYCURSOR; if (yych <= 0x1F) { - if (yych == '\t') goto yy65; + if (yych == '\t') goto yy77; goto yy18; } else { - if (yych <= ' ') goto yy65; + if (yych <= ' ') goto yy77; if (yych != ';') goto yy18; } ++YYCURSOR; @@ -611,124 +708,124 @@ yyc_cond: }; yych = *YYCURSOR; if (yybm[0+yych] & 8) { - goto yy73; + goto yy85; } if (yych <= '(') { if (yych <= '\r') { - if (yych <= 0x08) goto yy71; - if (yych <= '\n') goto yy76; - if (yych >= '\r') goto yy78; + if (yych <= 0x08) goto yy83; + if (yych <= '\n') goto yy88; + if (yych >= '\r') goto yy90; } else { - if (yych <= 0x1F) goto yy71; - if (yych <= '!') goto yy79; - if (yych >= '(') goto yy81; + if (yych <= 0x1F) goto yy83; + if (yych <= '!') goto yy91; + if (yych >= '(') goto yy93; } } else { if (yych <= 'Z') { - if (yych <= '/') goto yy71; + if (yych <= '/') goto yy83; if (yych <= '9') { yyt1 = YYCURSOR; - goto yy83; + goto yy95; } if (yych >= 'A') { yyt1 = YYCURSOR; - goto yy86; + goto yy98; } } else { if (yych <= '_') { if (yych >= '_') { yyt1 = YYCURSOR; - goto yy86; + goto yy98; } } else { - if (yych <= '`') goto yy71; + if (yych <= '`') goto yy83; if (yych <= 'z') { yyt1 = YYCURSOR; - goto yy86; + goto yy98; } } } } -yy71: +yy83: ++YYCURSOR; -yy72: - { cs_error_log("Syntax error in condition on line %d", lineno); goto out; } -yy73: +yy84: + { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } +yy85: yych = *++YYCURSOR; if (yybm[0+yych] & 8) { - goto yy73; + goto yy85; } { goto yyc_cond; } -yy76: +yy88: ++YYCURSOR; { lineno++; goto yyc_cond; } -yy78: +yy90: yych = *++YYCURSOR; - if (yych == '\n') goto yy76; - goto yy72; -yy79: + if (yych == '\n') goto yy88; + goto yy84; +yy91: ++YYCURSOR; t1 = YYCURSOR - 1; { sy_op_push(*t1); goto yyc_cond; } -yy81: +yy93: ++YYCURSOR; t1 = YYCURSOR - 1; { sy_op_push(*t1); goto yyc_cond; } -yy83: +yy95: yych = *++YYCURSOR; if (yybm[0+yych] & 16) { - goto yy83; + goto yy95; } t1 = yyt1; t2 = YYCURSOR; { sy_res_push(atoi(t1)); goto yyc_cond_op; } -yy86: +yy98: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { - goto yy86; + goto yy98; } - if (yych == '(') goto yy89; -yy88: + if (yych == '(') goto yy101; +yy100: t1 = yyt1; t2 = YYCURSOR; { zend_string *tmp = zend_hash_str_find_ptr(&vars, t1, t2-t1); if (!tmp) { - cs_error_log("unknown variable in condition on line %d", lineno); + cs_log_error("unknown variable in condition on line %d", lineno); goto out; } sy_res_push(atoi(ZSTR_VAL(tmp))); goto yyc_cond_op; } -yy89: +yy101: yych = *++YYCURSOR; if (yych == '"') { yyt2 = YYCURSOR; - goto yy91; + goto yy103; } if (yych == ')') { yyt2 = YYCURSOR; - goto yy93; + goto yy105; } -yy90: +yy102: YYCURSOR = YYMARKER; if (yyaccept == 0) { - goto yy88; + goto yy100; } else { - goto yy94; + goto yy106; } -yy91: +yy103: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy91; + goto yy103; } - if (yych <= '\r') goto yy90; - if (yych <= '"') goto yy95; - goto yy96; -yy93: + if (yych <= '\r') goto yy102; + if (yych <= '"') goto yy107; + goto yy108; +yy105: ++YYCURSOR; -yy94: +yy106: t1 = yyt1; t3 = yyt2; t2 = yyt2 - 1; @@ -738,46 +835,46 @@ yy94: int is_loaded = (zend_hash_str_find_ptr(&module_registry, t3+1, t4-t3-2) != NULL); sy_res_push(is_loaded); } else { - cs_error_log("unknown function in condition on line %d", lineno); + cs_log_error("unknown function in condition on line %d", lineno); goto out; } goto yyc_cond_op; } -yy95: +yy107: yych = *++YYCURSOR; - if (yych == ')') goto yy93; - goto yy90; -yy96: + if (yych == ')') goto yy105; + goto yy102; +yy108: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy91; + goto yy103; } - if (yych <= '\r') goto yy90; - if (yych >= '#') goto yy96; + if (yych <= '\r') goto yy102; + if (yych >= '#') goto yy108; yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy96; + goto yy108; } if (yych <= '\r') { - if (yych == '\n') goto yy90; - if (yych <= '\f') goto yy91; - goto yy90; + if (yych == '\n') goto yy102; + if (yych <= '\f') goto yy103; + goto yy102; } else { if (yych <= '"') { - if (yych <= '!') goto yy91; - goto yy95; + if (yych <= '!') goto yy103; + goto yy107; } else { - if (yych != ')') goto yy91; + if (yych != ')') goto yy103; } } yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy91; + goto yy103; } - if (yych <= '\r') goto yy94; - if (yych <= '"') goto yy95; - goto yy96; + if (yych <= '\r') goto yy106; + if (yych <= '"') goto yy107; + goto yy108; } /* *********************************** */ yyc_cond_op: @@ -818,88 +915,88 @@ yyc_cond_op: }; yych = *YYCURSOR; if (yybm[0+yych] & 128) { - goto yy104; + goto yy116; } if (yych <= ')') { if (yych <= '\r') { - if (yych <= 0x08) goto yy102; - if (yych <= '\n') goto yy107; - if (yych >= '\r') goto yy109; + if (yych <= 0x08) goto yy114; + if (yych <= '\n') goto yy119; + if (yych >= '\r') goto yy121; } else { if (yych == '&') { yyt1 = YYCURSOR; - goto yy110; + goto yy122; } - if (yych >= ')') goto yy111; + if (yych >= ')') goto yy123; } } else { if (yych <= '=') { - if (yych <= ':') goto yy102; - if (yych <= ';') goto yy113; + if (yych <= ':') goto yy114; + if (yych <= ';') goto yy125; if (yych <= '<') { yyt1 = YYCURSOR; - goto yy115; + goto yy127; } yyt1 = YYCURSOR; - goto yy117; + goto yy129; } else { if (yych <= '>') { yyt1 = YYCURSOR; - goto yy115; + goto yy127; } if (yych == '|') { yyt1 = YYCURSOR; - goto yy118; + goto yy130; } } } -yy102: +yy114: ++YYCURSOR; -yy103: - { cs_error_log("Syntax error in condition on line %d", lineno); goto out; } -yy104: +yy115: + { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } +yy116: yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy104; + goto yy116; } { goto yyc_cond_op; } -yy107: +yy119: ++YYCURSOR; { lineno++; goto yyc_cond_op; } -yy109: +yy121: yych = *++YYCURSOR; - if (yych == '\n') goto yy107; - goto yy103; -yy110: + if (yych == '\n') goto yy119; + goto yy115; +yy122: yych = *++YYCURSOR; - if (yych == '&') goto yy119; - goto yy103; -yy111: + if (yych == '&') goto yy131; + goto yy115; +yy123: ++YYCURSOR; { while (cond_op_i && sy_op_peek() != '(') { SY_APPLY_OP_FROM_STACK(); } if (cond_op_i == 0 || sy_op_peek() != '(') { - cs_error_log("unbalanced parathesis on line %d", lineno); goto out; + cs_log_error("unbalanced parathesis on line %d", lineno); goto out; } cond_op_i--; goto yyc_cond_op; } -yy113: +yy125: ++YYCURSOR; { while (cond_op_i) { - if (sy_op_peek() == '(') { cs_error_log("unbalanced parathesis on line %d", lineno); goto out; } + if (sy_op_peek() == '(') { cs_log_error("unbalanced parathesis on line %d", lineno); goto out; } SY_APPLY_OP_FROM_STACK(); } - if (cond_res_i > 1) { cs_error_log("invalid condition on line %d", lineno); goto out; } + if (cond_res_i > 1) { cs_log_error("invalid condition on line %d", lineno); goto out; } goto yyc_init; } -yy115: +yy127: yych = *++YYCURSOR; - if (yych == '=') goto yy119; -yy116: + if (yych == '=') goto yy131; +yy128: t1 = yyt1; t2 = YYCURSOR; { @@ -916,16 +1013,16 @@ yy116: sy_op_push(*t1); goto yyc_cond; } -yy117: +yy129: yych = *++YYCURSOR; - if (yych == '=') goto yy119; - goto yy103; -yy118: + if (yych == '=') goto yy131; + goto yy115; +yy130: yych = *++YYCURSOR; - if (yych != '|') goto yy103; -yy119: + if (yych != '|') goto yy115; +yy131: ++YYCURSOR; - goto yy116; + goto yy128; } /* *********************************** */ yyc_rule: @@ -966,77 +1063,77 @@ yyc_rule: }; yych = *YYCURSOR; if (yybm[0+yych] & 8) { - goto yy124; + goto yy136; } if (yych <= '\r') { - if (yych <= 0x08) goto yy122; - if (yych <= '\n') goto yy127; - if (yych >= '\r') goto yy128; + if (yych <= 0x08) goto yy134; + if (yych <= '\n') goto yy139; + if (yych >= '\r') goto yy140; } else { if (yych <= '.') { - if (yych >= '.') goto yy129; + if (yych >= '.') goto yy141; } else { - if (yych == ';') goto yy130; + if (yych == ';') goto yy142; } } -yy122: +yy134: ++YYCURSOR; -yy123: +yy135: { goto end_of_rule; } -yy124: +yy136: yych = *++YYCURSOR; if (yybm[0+yych] & 8) { - goto yy124; + goto yy136; } { goto yyc_rule; } -yy127: +yy139: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\r') { - if (yych <= 0x08) goto yy123; + if (yych <= 0x08) goto yy135; if (yych <= '\n') { yyt1 = YYCURSOR; - goto yy132; + goto yy144; } - if (yych <= '\f') goto yy123; + if (yych <= '\f') goto yy135; yyt1 = YYCURSOR; - goto yy135; + goto yy147; } else { if (yych <= ' ') { - if (yych <= 0x1F) goto yy123; + if (yych <= 0x1F) goto yy135; yyt1 = YYCURSOR; - goto yy132; + goto yy144; } else { if (yych == '.') { yyt1 = YYCURSOR; - goto yy136; + goto yy148; } - goto yy123; + goto yy135; } } -yy128: +yy140: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == '\n') goto yy138; - goto yy123; -yy129: + if (yych == '\n') goto yy150; + goto yy135; +yy141: yych = *++YYCURSOR; if (yych <= '^') { - if (yych <= '@') goto yy123; + if (yych <= '@') goto yy135; if (yych <= 'Z') { yyt1 = YYCURSOR; - goto yy139; + goto yy151; } - goto yy123; + goto yy135; } else { - if (yych == '`') goto yy123; + if (yych == '`') goto yy135; if (yych <= 'z') { yyt1 = YYCURSOR; - goto yy139; + goto yy151; } - goto yy123; + goto yy135; } -yy130: +yy142: ++YYCURSOR; { end_of_rule: @@ -1047,71 +1144,71 @@ yy130: } goto yyc_init; } -yy132: +yy144: yych = *++YYCURSOR; if (yybm[0+yych] & 16) { - goto yy132; + goto yy144; } - if (yych == '\r') goto yy135; - if (yych == '.') goto yy136; -yy134: + if (yych == '\r') goto yy147; + if (yych == '.') goto yy148; +yy146: YYCURSOR = YYMARKER; if (yyaccept <= 1) { if (yyaccept == 0) { - goto yy123; + goto yy135; } else { yyt3 = yyt4 = NULL; yyt2 = YYCURSOR; - goto yy141; + goto yy153; } } else { - goto yy141; + goto yy153; } -yy135: +yy147: yych = *++YYCURSOR; - if (yych == '\n') goto yy132; - goto yy134; -yy136: + if (yych == '\n') goto yy144; + goto yy146; +yy148: ++YYCURSOR; YYCURSOR = yyt1; { lineno++; goto yyc_rule; } -yy138: +yy150: yych = *++YYCURSOR; if (yych <= '\r') { - if (yych <= 0x08) goto yy134; + if (yych <= 0x08) goto yy146; if (yych <= '\n') { yyt1 = YYCURSOR; - goto yy132; + goto yy144; } - if (yych <= '\f') goto yy134; + if (yych <= '\f') goto yy146; yyt1 = YYCURSOR; - goto yy135; + goto yy147; } else { if (yych <= ' ') { - if (yych <= 0x1F) goto yy134; + if (yych <= 0x1F) goto yy146; yyt1 = YYCURSOR; - goto yy132; + goto yy144; } else { if (yych == '.') { yyt1 = YYCURSOR; - goto yy136; + goto yy148; } - goto yy134; + goto yy146; } } -yy139: +yy151: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { - goto yy139; + goto yy151; } if (yych == '(') { yyt2 = YYCURSOR; - goto yy142; + goto yy154; } yyt3 = yyt4 = NULL; yyt2 = YYCURSOR; -yy141: +yy153: t1 = yyt1; t2 = yyt2; t3 = yyt3; @@ -1119,7 +1216,7 @@ yy141: { if (!cond_res[0]) { goto yyc_rule; } if (kw_i == max_keywords) { - cs_error_log("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno); + cs_log_error("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno); goto out; } sp_parsed_keyword kw = {.kw = (char*)t1, .kwlen = t2-t1, .arg = (char*)t3, .arglen = t4-t3, .argtype = SP_ARGTYPE_UNKNOWN, .lineno = lineno}; @@ -1133,7 +1230,7 @@ yy141: } else { zend_string *tmp = zend_hash_str_find_ptr(&vars, t3, t4-t3); if (!tmp) { - cs_error_log("unknown variable on line %d", lineno); + cs_log_error("unknown variable on line %d", lineno); goto out; } kw.arg = ZSTR_VAL(tmp); @@ -1146,110 +1243,110 @@ yy141: parsed_rule[kw_i++] = kw; goto yyc_rule; } -yy142: +yy154: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '"') { - if (yych <= '!') goto yy134; + if (yych <= '!') goto yy146; yyt3 = YYCURSOR; } else { if (yych == ')') { yyt3 = yyt4 = YYCURSOR; - goto yy145; + goto yy157; } - goto yy134; + goto yy146; } } else { if (yych <= '_') { if (yych <= 'Z') { yyt3 = YYCURSOR; - goto yy146; + goto yy158; } - if (yych <= '^') goto yy134; + if (yych <= '^') goto yy146; yyt3 = YYCURSOR; - goto yy146; + goto yy158; } else { - if (yych <= '`') goto yy134; + if (yych <= '`') goto yy146; if (yych <= 'z') { yyt3 = YYCURSOR; - goto yy146; + goto yy158; } - goto yy134; + goto yy146; } } -yy143: +yy155: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy143; + goto yy155; } - if (yych <= '\r') goto yy134; - if (yych <= '"') goto yy148; - goto yy149; -yy145: + if (yych <= '\r') goto yy146; + if (yych <= '"') goto yy160; + goto yy161; +yy157: ++YYCURSOR; - goto yy141; -yy146: + goto yy153; +yy158: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= ')') { - if (yych <= '(') goto yy134; + if (yych <= '(') goto yy146; yyt4 = YYCURSOR; - goto yy145; + goto yy157; } else { - if (yych <= '/') goto yy134; - if (yych <= '9') goto yy146; - goto yy134; + if (yych <= '/') goto yy146; + if (yych <= '9') goto yy158; + goto yy146; } } else { if (yych <= '_') { - if (yych <= 'Z') goto yy146; - if (yych <= '^') goto yy134; - goto yy146; + if (yych <= 'Z') goto yy158; + if (yych <= '^') goto yy146; + goto yy158; } else { - if (yych <= '`') goto yy134; - if (yych <= 'z') goto yy146; - goto yy134; + if (yych <= '`') goto yy146; + if (yych <= 'z') goto yy158; + goto yy146; } } -yy148: +yy160: yych = *++YYCURSOR; if (yych == ')') { yyt4 = YYCURSOR; - goto yy145; + goto yy157; } - goto yy134; -yy149: + goto yy146; +yy161: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy143; + goto yy155; } - if (yych <= '\r') goto yy134; - if (yych >= '#') goto yy149; + if (yych <= '\r') goto yy146; + if (yych >= '#') goto yy161; yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy149; + goto yy161; } if (yych <= '\r') { - if (yych == '\n') goto yy134; - if (yych <= '\f') goto yy143; - goto yy134; + if (yych == '\n') goto yy146; + if (yych <= '\f') goto yy155; + goto yy146; } else { if (yych <= '"') { - if (yych <= '!') goto yy143; - goto yy148; + if (yych <= '!') goto yy155; + goto yy160; } else { - if (yych != ')') goto yy143; + if (yych != ')') goto yy155; yyt4 = YYCURSOR; } } yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy143; + goto yy155; } - if (yych <= '\r') goto yy141; - if (yych <= '"') goto yy148; - goto yy149; + if (yych <= '\r') goto yy153; + if (yych <= '"') goto yy160; + goto yy161; } } diff --git a/src/sp_config_scanner.re b/src/sp_config_scanner.re index 75e0424..063d332 100644 --- a/src/sp_config_scanner.re +++ b/src/sp_config_scanner.re @@ -2,7 +2,8 @@ /*!types:re2c*/ -#define cs_error_log(fmt, ...) sp_log_err("config", fmt, ##__VA_ARGS__) +#define cs_log_error(fmt, ...) sp_log_err("config", fmt, ##__VA_ARGS__) +#define cs_log_info(fmt, ...) sp_log_msg("config", SP_LOG_INFO, fmt, ##__VA_ARGS__) zend_string *sp_get_arg_string(sp_parsed_keyword *kw) { if (!kw || !kw->arg) { @@ -73,11 +74,11 @@ static void str_dtor(zval *zv) { // sy_ functions and macros are helpers for the shunting yard algorithm #define sy_res_push(val) \ - if (cond_res_i >= 100) { cs_error_log("condition too complex on line %d", lineno); goto out; } \ + if (cond_res_i >= 100) { cs_log_error("condition too complex on line %d", lineno); goto out; } \ cond_res[cond_res_i++] = val; #define sy_res_pop() cond_res[--cond_res_i] #define sy_op_push(op) \ - if (cond_op_i >= 100) { cs_error_log("condition too complex on line %d", lineno); goto out; } \ + if (cond_op_i >= 100) { cs_log_error("condition too complex on line %d", lineno); goto out; } \ cond_op[cond_op_i++] = op; #define sy_op_pop() cond_op[--cond_op_i] #define sy_op_peek() cond_op[cond_op_i-1] @@ -119,7 +120,7 @@ static int sy_apply_op(char op, int a, int b) { #define SY_APPLY_OP_FROM_STACK() \ char op = sy_op_pop(); \ int unary = (op == '!'); \ - if (cond_res_i < (2 - unary)) { cs_error_log("not enough input on line %d", lineno); goto out; } \ + if (cond_res_i < (2 - unary)) { cs_log_error("not enough input on line %d", lineno); goto out; } \ int a = sy_res_pop(); \ int b = unary ? 0 : sy_res_pop(); \ int res = sy_apply_op(op, a, b); \ @@ -166,7 +167,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key keyword = [a-zA-Z_][a-zA-Z0-9_]*; string = "\"" ("\\\"" | [^"\r\n])* "\""; - * { cs_error_log("Parser error on line %d", lineno); goto out; } + * { cs_log_error("Parser error on line %d", lineno); goto out; } ws+ { goto yyc_init; } [;#] .* { goto yyc_init; } nl { lineno++; goto yyc_init; } @@ -185,6 +186,14 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key } "@condition" ws+ { goto yyc_cond; } "@end_condition" ws* ";" { cond_res[0] = 1; goto yyc_init; } + "@log" ws+ @t1 string? @t2 { + char tmpstr[1024]; + size_t tmplen = MIN(t2-t1-2, 1023); + strncpy(tmpstr, t1+1, tmplen); + tmpstr[tmplen] = 0; + cs_log_info("[line %d]: %s", lineno, tmpstr); + goto yyc_init; + } ws+ { goto yyc_cond; } nl { lineno++; goto yyc_cond; } @@ -193,7 +202,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key int is_loaded = (zend_hash_str_find_ptr(&module_registry, t3+1, t4-t3-2) != NULL); sy_res_push(is_loaded); } else { - cs_error_log("unknown function in condition on line %d", lineno); + cs_log_error("unknown function in condition on line %d", lineno); goto out; } goto yyc_cond_op; @@ -201,7 +210,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key @t1 keyword @t2 { zend_string *tmp = zend_hash_str_find_ptr(&vars, t1, t2-t1); if (!tmp) { - cs_error_log("unknown variable in condition on line %d", lineno); + cs_log_error("unknown variable in condition on line %d", lineno); goto out; } sy_res_push(atoi(ZSTR_VAL(tmp))); @@ -231,27 +240,27 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key SY_APPLY_OP_FROM_STACK(); } if (cond_op_i == 0 || sy_op_peek() != '(') { - cs_error_log("unbalanced parathesis on line %d", lineno); goto out; + cs_log_error("unbalanced parathesis on line %d", lineno); goto out; } cond_op_i--; goto yyc_cond_op; } ";" { while (cond_op_i) { - if (sy_op_peek() == '(') { cs_error_log("unbalanced parathesis on line %d", lineno); goto out; } + if (sy_op_peek() == '(') { cs_log_error("unbalanced parathesis on line %d", lineno); goto out; } SY_APPLY_OP_FROM_STACK(); } - if (cond_res_i > 1) { cs_error_log("invalid condition on line %d", lineno); goto out; } + if (cond_res_i > 1) { cs_log_error("invalid condition on line %d", lineno); goto out; } goto yyc_init; } - * { cs_error_log("Syntax error in condition on line %d", lineno); goto out; } + * { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } ws+ { goto yyc_rule; } nl / ( nl | ws )* "." { lineno++; goto yyc_rule; } "." @t1 keyword @t2 ( "(" @t3 ( string? | keyword ) @t4 ")" )? { if (!cond_res[0]) { goto yyc_rule; } if (kw_i == max_keywords) { - cs_error_log("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno); + cs_log_error("Too many keywords in rule (more than %d) on line %d", max_keywords, lineno); goto out; } sp_parsed_keyword kw = {.kw = (char*)t1, .kwlen = t2-t1, .arg = (char*)t3, .arglen = t4-t3, .argtype = SP_ARGTYPE_UNKNOWN, .lineno = lineno}; @@ -265,7 +274,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key } else { zend_string *tmp = zend_hash_str_find_ptr(&vars, t3, t4-t3); if (!tmp) { - cs_error_log("unknown variable on line %d", lineno); + cs_log_error("unknown variable on line %d", lineno); goto out; } kw.arg = ZSTR_VAL(tmp); diff --git a/src/sp_utils.h b/src/sp_utils.h index 27c8bfa..a4694f2 100644 --- a/src/sp_utils.h +++ b/src/sp_utils.h @@ -33,6 +33,7 @@ #define SP_TYPE_SIMULATION (2) #define SP_LOG_DEBUG E_NOTICE +#define SP_LOG_INFO E_NOTICE #define SP_LOG_ERROR E_ERROR #define SP_LOG_WARN E_WARNING -- cgit v1.3 From d3d9b594fe904e6d101522617fdcf18dc5518b16 Mon Sep 17 00:00:00 2001 From: Ben Fuhrmannek Date: Mon, 20 Dec 2021 16:26:12 +0100 Subject: added @warn/@err to config syntax --- src/snuffleupagus.c | 3 +- src/sp_config_scanner.cached.c | 937 +++++++++++++++++++++++++---------------- src/sp_config_scanner.re | 26 +- 3 files changed, 593 insertions(+), 373 deletions(-) (limited to 'src/sp_config_scanner.cached.c') diff --git a/src/snuffleupagus.c b/src/snuffleupagus.c index de68130..3baad1b 100644 --- a/src/snuffleupagus.c +++ b/src/snuffleupagus.c @@ -223,8 +223,7 @@ PHP_RINIT_FUNCTION(snuffleupagus) { if (SPG(is_config_valid) == SP_CONFIG_INVALID) { sp_log_err("config", "Invalid configuration file"); } else if (SPG(is_config_valid) == SP_CONFIG_NONE) { - sp_log_warn("config", - "No configuration specificed via sp.configuration_file"); + sp_log_warn("config", "No configuration specificed via sp.configuration_file"); } } diff --git a/src/sp_config_scanner.cached.c b/src/sp_config_scanner.cached.c index 91144c7..bd2fa3c 100644 --- a/src/sp_config_scanner.cached.c +++ b/src/sp_config_scanner.cached.c @@ -11,6 +11,8 @@ enum YYCONDTYPE { #define cs_log_error(fmt, ...) sp_log_err("config", fmt, ##__VA_ARGS__) #define cs_log_info(fmt, ...) sp_log_msg("config", SP_LOG_INFO, fmt, ##__VA_ARGS__) +#define cs_log_warning(fmt, ...) sp_log_warn("config", fmt, ##__VA_ARGS__) + zend_string *sp_get_arg_string(sp_parsed_keyword *kw) { if (!kw || !kw->arg) { @@ -133,6 +135,12 @@ static int sy_apply_op(char op, int a, int b) { int res = sy_apply_op(op, a, b); \ sy_res_push(res); +#define TMPSTR(tmpstr, t2, t1) \ + char tmpstr[1024]; \ + size_t tmplen = MIN(t2-t1-2, 1023); \ + strncpy(tmpstr, t1+1, tmplen); \ + tmpstr[tmplen] = 0; + zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*)) { @@ -270,23 +278,23 @@ yy12: yy15: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 'd') { - if (yych == 'c') goto yy17; - goto yy5; - } else { - if (yych <= 'e') goto yy19; - if (yych == 'l') goto yy20; - goto yy5; + switch (yych) { + case 'c': goto yy17; + case 'e': goto yy19; + case 'i': goto yy20; + case 'l': goto yy21; + case 'w': goto yy22; + default: goto yy5; } yy16: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'e') goto yy21; - if (yych == 'p') goto yy22; + if (yych == 'e') goto yy23; + if (yych == 'p') goto yy24; goto yy5; yy17: yych = *++YYCURSOR; - if (yych == 'o') goto yy24; + if (yych == 'o') goto yy26; yy18: YYCURSOR = YYMARKER; if (yyaccept <= 2) { @@ -294,225 +302,406 @@ yy18: if (yyaccept == 0) { goto yy5; } else { - yyt1 = YYCURSOR; - goto yy37; + goto yy66; } } else { - goto yy37; + goto yy70; } } else { - if (yyaccept == 3) { - yyt4 = YYCURSOR; - goto yy57; + if (yyaccept <= 4) { + if (yyaccept == 3) { + goto yy83; + } else { + yyt4 = YYCURSOR; + goto yy88; + } } else { - goto yy57; + goto yy88; } } yy19: yych = *++YYCURSOR; - if (yych == 'n') goto yy25; + if (yych == 'n') goto yy27; + if (yych == 'r') goto yy28; goto yy18; yy20: yych = *++YYCURSOR; - if (yych == 'o') goto yy26; + if (yych == 'n') goto yy29; goto yy18; yy21: yych = *++YYCURSOR; - if (yych == 't') goto yy27; + if (yych == 'o') goto yy30; goto yy18; yy22: - ++YYCURSOR; - { kw_i = 0; goto yyc_rule; } -yy24: yych = *++YYCURSOR; - if (yych == 'n') goto yy28; + if (yych == 'a') goto yy31; goto yy18; -yy25: +yy23: yych = *++YYCURSOR; - if (yych == 'd') goto yy29; + if (yych == 't') goto yy32; goto yy18; +yy24: + ++YYCURSOR; + { kw_i = 0; goto yyc_rule; } yy26: yych = *++YYCURSOR; - if (yych == 'g') goto yy30; + if (yych == 'n') goto yy33; goto yy18; yy27: yych = *++YYCURSOR; - if (yych == '\t') goto yy31; - if (yych == ' ') goto yy31; + if (yych == 'd') goto yy34; goto yy18; yy28: yych = *++YYCURSOR; - if (yych == 'd') goto yy33; + if (yych == 'r') goto yy35; goto yy18; yy29: yych = *++YYCURSOR; - if (yych == '_') goto yy34; + if (yych == 'f') goto yy36; goto yy18; yy30: yych = *++YYCURSOR; - if (yych == '\t') goto yy35; - if (yych == ' ') goto yy35; + if (yych == 'g') goto yy37; goto yy18; yy31: + yych = *++YYCURSOR; + if (yych == 'r') goto yy38; + goto yy18; +yy32: + yych = *++YYCURSOR; + if (yych == '\t') goto yy39; + if (yych == ' ') goto yy39; + goto yy18; +yy33: + yych = *++YYCURSOR; + if (yych == 'd') goto yy41; + goto yy18; +yy34: + yych = *++YYCURSOR; + if (yych == '_') goto yy42; + goto yy18; +yy35: + yych = *++YYCURSOR; + if (yych == '"') goto yy18; + if (yych == 'o') goto yy45; + goto yy44; +yy36: + yych = *++YYCURSOR; + if (yych != 'o') goto yy18; +yy37: + yych = *++YYCURSOR; + if (yych == '"') goto yy18; + goto yy47; +yy38: + yych = *++YYCURSOR; + if (yych == 'n') goto yy48; + goto yy18; +yy39: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '\t') { if (yych <= 0x08) goto yy18; - goto yy31; + goto yy39; } else { - if (yych == ' ') goto yy31; + if (yych == ' ') goto yy39; goto yy18; } } else { if (yych <= '_') { if (yych <= 'Z') { yyt1 = YYCURSOR; - goto yy38; + goto yy49; } if (yych <= '^') goto yy18; yyt1 = YYCURSOR; - goto yy38; + goto yy49; } else { if (yych <= '`') goto yy18; if (yych <= 'z') { yyt1 = YYCURSOR; - goto yy38; + goto yy49; } goto yy18; } } -yy33: +yy41: yych = *++YYCURSOR; - if (yych == 'i') goto yy40; + if (yych == 'i') goto yy51; goto yy18; -yy34: +yy42: yych = *++YYCURSOR; - if (yych == 'c') goto yy41; + if (yych == 'c') goto yy52; goto yy18; -yy35: - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); +yy43: + yych = *++YYCURSOR; +yy44: if (yych <= 0x1F) { - if (yych == '\t') goto yy35; - yyt1 = YYCURSOR; + if (yych == '\t') goto yy43; + goto yy18; } else { - if (yych <= ' ') goto yy35; + if (yych <= ' ') goto yy43; if (yych == '"') { yyt1 = YYCURSOR; - goto yy42; + goto yy53; } - yyt1 = YYCURSOR; + goto yy18; } -yy37: - t1 = yyt1; - t2 = YYCURSOR; - { - char tmpstr[1024]; - size_t tmplen = MIN(t2-t1-2, 1023); - strncpy(tmpstr, t1+1, tmplen); - tmpstr[tmplen] = 0; - cs_log_info("[line %d]: %s", lineno, tmpstr); - goto yyc_init; - } -yy38: +yy45: + yych = *++YYCURSOR; + if (yych == 'r') goto yy55; + goto yy18; +yy46: + yych = *++YYCURSOR; +yy47: + if (yych <= 0x1F) { + if (yych == '\t') goto yy46; + goto yy18; + } else { + if (yych <= ' ') goto yy46; + if (yych == '"') { + yyt1 = YYCURSOR; + goto yy56; + } + goto yy18; + } +yy48: + yych = *++YYCURSOR; + if (yych == '"') goto yy18; + if (yych == 'i') goto yy60; + goto yy59; +yy49: yych = *++YYCURSOR; if (yybm[0+yych] & 32) { - goto yy38; + goto yy49; } if (yych == '\t') { yyt2 = YYCURSOR; - goto yy44; + goto yy61; } if (yych == ' ') { yyt2 = YYCURSOR; - goto yy44; + goto yy61; } goto yy18; -yy40: +yy51: yych = *++YYCURSOR; - if (yych == 't') goto yy46; + if (yych == 't') goto yy63; goto yy18; -yy41: +yy52: yych = *++YYCURSOR; - if (yych == 'o') goto yy47; + if (yych == 'o') goto yy64; goto yy18; -yy42: +yy53: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy42; + goto yy53; } if (yych <= '\r') goto yy18; - if (yych <= '"') goto yy48; - goto yy49; -yy44: + if (yych <= '"') goto yy65; + goto yy67; +yy55: yych = *++YYCURSOR; + if (yych == '"') goto yy18; + goto yy44; +yy56: + yych = *++YYCURSOR; + if (yych <= '\r') { + if (yych == '\n') goto yy18; + if (yych <= '\f') goto yy56; + goto yy18; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy56; + goto yy69; + } else { + if (yych == '\\') goto yy71; + goto yy56; + } + } +yy58: + yych = *++YYCURSOR; +yy59: if (yych <= 0x1F) { - if (yych == '\t') goto yy44; + if (yych == '\t') goto yy58; goto yy18; } else { - if (yych <= ' ') goto yy44; + if (yych <= ' ') goto yy58; + if (yych == '"') { + yyt1 = YYCURSOR; + goto yy73; + } + goto yy18; + } +yy60: + yych = *++YYCURSOR; + if (yych == 'n') goto yy75; + goto yy18; +yy61: + yych = *++YYCURSOR; + if (yych <= 0x1F) { + if (yych == '\t') goto yy61; + goto yy18; + } else { + if (yych <= ' ') goto yy61; if (yych == '"') { yyt3 = YYCURSOR; - goto yy51; + goto yy76; } goto yy18; } -yy46: +yy63: yych = *++YYCURSOR; - if (yych == 'i') goto yy53; + if (yych == 'i') goto yy78; goto yy18; -yy47: +yy64: yych = *++YYCURSOR; - if (yych == 'n') goto yy54; + if (yych == 'n') goto yy79; goto yy18; -yy48: +yy65: ++YYCURSOR; - goto yy37; -yy49: +yy66: + t1 = yyt1; + t2 = YYCURSOR; + { + TMPSTR(tmpstr, t2, t1); + cs_log_error("[line %d]: %s", lineno, tmpstr); + goto out; + } +yy67: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy42; + goto yy53; } if (yych <= '\r') goto yy18; - if (yych <= '"') goto yy55; - goto yy49; -yy51: + if (yych <= '"') goto yy80; + goto yy67; +yy69: + ++YYCURSOR; +yy70: + t1 = yyt1; + t2 = YYCURSOR; + { + TMPSTR(tmpstr, t2, t1); + sp_log_debug("tmplen: %d", tmplen); + cs_log_info("[line %d]: %s", lineno, tmpstr); + goto yyc_init; + } +yy71: yych = *++YYCURSOR; if (yych <= '\r') { if (yych == '\n') goto yy18; - if (yych <= '\f') goto yy51; + if (yych <= '\f') goto yy56; goto yy18; } else { if (yych <= '"') { - if (yych <= '!') goto yy51; + if (yych <= '!') goto yy56; + goto yy81; + } else { + if (yych == '\\') goto yy71; goto yy56; + } + } +yy73: + yych = *++YYCURSOR; + if (yych <= '\r') { + if (yych == '\n') goto yy18; + if (yych <= '\f') goto yy73; + goto yy18; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy73; + goto yy82; } else { - if (yych == '\\') goto yy58; - goto yy51; + if (yych == '\\') goto yy84; + goto yy73; } } -yy53: +yy75: yych = *++YYCURSOR; - if (yych == 'o') goto yy60; + if (yych == 'g') goto yy86; goto yy18; -yy54: +yy76: yych = *++YYCURSOR; - if (yych == 'd') goto yy61; + if (yych <= '\r') { + if (yych == '\n') goto yy18; + if (yych <= '\f') goto yy76; + goto yy18; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy76; + goto yy87; + } else { + if (yych == '\\') goto yy89; + goto yy76; + } + } +yy78: + yych = *++YYCURSOR; + if (yych == 'o') goto yy91; goto yy18; -yy55: - yyaccept = 2; +yy79: + yych = *++YYCURSOR; + if (yych == 'd') goto yy92; + goto yy18; +yy80: + yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy42; + goto yy53; } - if (yych <= '\r') goto yy37; - if (yych <= '"') goto yy48; - goto yy49; -yy56: + if (yych <= '\r') goto yy66; + if (yych <= '"') goto yy65; + goto yy67; +yy81: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '\r') { + if (yych == '\n') goto yy70; + if (yych <= '\f') goto yy56; + goto yy70; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy56; + goto yy69; + } else { + if (yych == '\\') goto yy71; + goto yy56; + } + } +yy82: + ++YYCURSOR; +yy83: + t1 = yyt1; + t2 = YYCURSOR; + { + TMPSTR(tmpstr, t2, t1); + cs_log_warning("[line %d]: %s", lineno, tmpstr); + goto yyc_init; + } +yy84: + yych = *++YYCURSOR; + if (yych <= '\r') { + if (yych == '\n') goto yy18; + if (yych <= '\f') goto yy73; + goto yy18; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy73; + goto yy93; + } else { + if (yych == '\\') goto yy84; + goto yy73; + } + } +yy86: + yych = *++YYCURSOR; + if (yych == '"') goto yy18; + goto yy59; +yy87: yych = *++YYCURSOR; yyt4 = YYCURSOR; - goto yy63; -yy57: + goto yy95; +yy88: t1 = yyt1; t2 = yyt2; t3 = yyt3; @@ -528,142 +717,158 @@ yy57: zend_hash_str_add_ptr(&vars, key, keylen, tmp); goto yyc_init; } -yy58: +yy89: yych = *++YYCURSOR; if (yych <= '\r') { if (yych == '\n') goto yy18; - if (yych <= '\f') goto yy51; + if (yych <= '\f') goto yy76; goto yy18; } else { if (yych <= '"') { - if (yych <= '!') goto yy51; - goto yy65; + if (yych <= '!') goto yy76; + goto yy97; } else { - if (yych == '\\') goto yy58; - goto yy51; + if (yych == '\\') goto yy89; + goto yy76; } } -yy60: +yy91: yych = *++YYCURSOR; - if (yych == 'n') goto yy66; + if (yych == 'n') goto yy98; goto yy18; -yy61: +yy92: yych = *++YYCURSOR; - if (yych == 'i') goto yy67; + if (yych == 'i') goto yy99; goto yy18; -yy62: +yy93: + yyaccept = 3; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '\r') { + if (yych == '\n') goto yy83; + if (yych <= '\f') goto yy73; + goto yy83; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy73; + goto yy82; + } else { + if (yych == '\\') goto yy84; + goto yy73; + } + } +yy94: yych = *++YYCURSOR; -yy63: +yy95: if (yych <= 0x1F) { - if (yych == '\t') goto yy62; - goto yy57; + if (yych == '\t') goto yy94; + goto yy88; } else { - if (yych <= ' ') goto yy62; - if (yych != ';') goto yy57; + if (yych <= ' ') goto yy94; + if (yych != ';') goto yy88; } ++YYCURSOR; - goto yy57; -yy65: - yyaccept = 3; + goto yy88; +yy97: + yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ' ') { if (yych <= '\n') { - if (yych <= 0x08) goto yy51; + if (yych <= 0x08) goto yy76; if (yych <= '\t') { yyt4 = YYCURSOR; - goto yy68; + goto yy100; } yyt4 = YYCURSOR; - goto yy57; + goto yy88; } else { if (yych == '\r') { yyt4 = YYCURSOR; - goto yy57; + goto yy88; } - if (yych <= 0x1F) goto yy51; + if (yych <= 0x1F) goto yy76; yyt4 = YYCURSOR; - goto yy68; + goto yy100; } } else { if (yych <= ':') { - if (yych == '"') goto yy56; - goto yy51; + if (yych == '"') goto yy87; + goto yy76; } else { if (yych <= ';') { yyt4 = YYCURSOR; - goto yy70; + goto yy102; } - if (yych == '\\') goto yy58; - goto yy51; + if (yych == '\\') goto yy89; + goto yy76; } } -yy66: +yy98: yych = *++YYCURSOR; - if (yych == '\t') goto yy71; - if (yych == ' ') goto yy71; + if (yych == '\t') goto yy103; + if (yych == ' ') goto yy103; goto yy18; -yy67: +yy99: yych = *++YYCURSOR; - if (yych == 't') goto yy74; + if (yych == 't') goto yy106; goto yy18; -yy68: - yyaccept = 4; +yy100: + yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ' ') { if (yych <= '\n') { - if (yych <= 0x08) goto yy51; - if (yych <= '\t') goto yy68; - goto yy57; + if (yych <= 0x08) goto yy76; + if (yych <= '\t') goto yy100; + goto yy88; } else { - if (yych == '\r') goto yy57; - if (yych <= 0x1F) goto yy51; - goto yy68; + if (yych == '\r') goto yy88; + if (yych <= 0x1F) goto yy76; + goto yy100; } } else { if (yych <= ':') { - if (yych == '"') goto yy56; - goto yy51; + if (yych == '"') goto yy87; + goto yy76; } else { - if (yych <= ';') goto yy70; - if (yych == '\\') goto yy58; - goto yy51; + if (yych <= ';') goto yy102; + if (yych == '\\') goto yy89; + goto yy76; } } -yy70: - yyaccept = 4; +yy102: + yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\r') { - if (yych == '\n') goto yy57; - if (yych <= '\f') goto yy51; - goto yy57; + if (yych == '\n') goto yy88; + if (yych <= '\f') goto yy76; + goto yy88; } else { if (yych <= '"') { - if (yych <= '!') goto yy51; - goto yy56; + if (yych <= '!') goto yy76; + goto yy87; } else { - if (yych == '\\') goto yy58; - goto yy51; + if (yych == '\\') goto yy89; + goto yy76; } } -yy71: +yy103: yych = *++YYCURSOR; - if (yych == '\t') goto yy71; - if (yych == ' ') goto yy71; + if (yych == '\t') goto yy103; + if (yych == ' ') goto yy103; { goto yyc_cond; } -yy74: +yy106: yych = *++YYCURSOR; if (yych != 'i') goto yy18; yych = *++YYCURSOR; if (yych != 'o') goto yy18; yych = *++YYCURSOR; if (yych != 'n') goto yy18; -yy77: +yy109: yych = *++YYCURSOR; if (yych <= 0x1F) { - if (yych == '\t') goto yy77; + if (yych == '\t') goto yy109; goto yy18; } else { - if (yych <= ' ') goto yy77; + if (yych <= ' ') goto yy109; if (yych != ';') goto yy18; } ++YYCURSOR; @@ -708,85 +913,85 @@ yyc_cond: }; yych = *YYCURSOR; if (yybm[0+yych] & 8) { - goto yy85; + goto yy117; } if (yych <= '(') { if (yych <= '\r') { - if (yych <= 0x08) goto yy83; - if (yych <= '\n') goto yy88; - if (yych >= '\r') goto yy90; + if (yych <= 0x08) goto yy115; + if (yych <= '\n') goto yy120; + if (yych >= '\r') goto yy122; } else { - if (yych <= 0x1F) goto yy83; - if (yych <= '!') goto yy91; - if (yych >= '(') goto yy93; + if (yych <= 0x1F) goto yy115; + if (yych <= '!') goto yy123; + if (yych >= '(') goto yy125; } } else { if (yych <= 'Z') { - if (yych <= '/') goto yy83; + if (yych <= '/') goto yy115; if (yych <= '9') { yyt1 = YYCURSOR; - goto yy95; + goto yy127; } if (yych >= 'A') { yyt1 = YYCURSOR; - goto yy98; + goto yy130; } } else { if (yych <= '_') { if (yych >= '_') { yyt1 = YYCURSOR; - goto yy98; + goto yy130; } } else { - if (yych <= '`') goto yy83; + if (yych <= '`') goto yy115; if (yych <= 'z') { yyt1 = YYCURSOR; - goto yy98; + goto yy130; } } } } -yy83: +yy115: ++YYCURSOR; -yy84: +yy116: { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } -yy85: +yy117: yych = *++YYCURSOR; if (yybm[0+yych] & 8) { - goto yy85; + goto yy117; } { goto yyc_cond; } -yy88: +yy120: ++YYCURSOR; { lineno++; goto yyc_cond; } -yy90: +yy122: yych = *++YYCURSOR; - if (yych == '\n') goto yy88; - goto yy84; -yy91: + if (yych == '\n') goto yy120; + goto yy116; +yy123: ++YYCURSOR; t1 = YYCURSOR - 1; { sy_op_push(*t1); goto yyc_cond; } -yy93: +yy125: ++YYCURSOR; t1 = YYCURSOR - 1; { sy_op_push(*t1); goto yyc_cond; } -yy95: +yy127: yych = *++YYCURSOR; if (yybm[0+yych] & 16) { - goto yy95; + goto yy127; } t1 = yyt1; t2 = YYCURSOR; { sy_res_push(atoi(t1)); goto yyc_cond_op; } -yy98: +yy130: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { - goto yy98; + goto yy130; } - if (yych == '(') goto yy101; -yy100: + if (yych == '(') goto yy133; +yy132: t1 = yyt1; t2 = YYCURSOR; { @@ -798,34 +1003,34 @@ yy100: sy_res_push(atoi(ZSTR_VAL(tmp))); goto yyc_cond_op; } -yy101: +yy133: yych = *++YYCURSOR; if (yych == '"') { yyt2 = YYCURSOR; - goto yy103; + goto yy135; } if (yych == ')') { yyt2 = YYCURSOR; - goto yy105; + goto yy137; } -yy102: +yy134: YYCURSOR = YYMARKER; if (yyaccept == 0) { - goto yy100; + goto yy132; } else { - goto yy106; + goto yy138; } -yy103: +yy135: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy103; + goto yy135; } - if (yych <= '\r') goto yy102; - if (yych <= '"') goto yy107; - goto yy108; -yy105: + if (yych <= '\r') goto yy134; + if (yych <= '"') goto yy139; + goto yy140; +yy137: ++YYCURSOR; -yy106: +yy138: t1 = yyt1; t3 = yyt2; t2 = yyt2 - 1; @@ -840,41 +1045,41 @@ yy106: } goto yyc_cond_op; } -yy107: +yy139: yych = *++YYCURSOR; - if (yych == ')') goto yy105; - goto yy102; -yy108: + if (yych == ')') goto yy137; + goto yy134; +yy140: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy103; + goto yy135; } - if (yych <= '\r') goto yy102; - if (yych >= '#') goto yy108; + if (yych <= '\r') goto yy134; + if (yych >= '#') goto yy140; yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy108; + goto yy140; } if (yych <= '\r') { - if (yych == '\n') goto yy102; - if (yych <= '\f') goto yy103; - goto yy102; + if (yych == '\n') goto yy134; + if (yych <= '\f') goto yy135; + goto yy134; } else { if (yych <= '"') { - if (yych <= '!') goto yy103; - goto yy107; + if (yych <= '!') goto yy135; + goto yy139; } else { - if (yych != ')') goto yy103; + if (yych != ')') goto yy135; } } yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy103; + goto yy135; } - if (yych <= '\r') goto yy106; - if (yych <= '"') goto yy107; - goto yy108; + if (yych <= '\r') goto yy138; + if (yych <= '"') goto yy139; + goto yy140; } /* *********************************** */ yyc_cond_op: @@ -915,63 +1120,63 @@ yyc_cond_op: }; yych = *YYCURSOR; if (yybm[0+yych] & 128) { - goto yy116; + goto yy148; } if (yych <= ')') { if (yych <= '\r') { - if (yych <= 0x08) goto yy114; - if (yych <= '\n') goto yy119; - if (yych >= '\r') goto yy121; + if (yych <= 0x08) goto yy146; + if (yych <= '\n') goto yy151; + if (yych >= '\r') goto yy153; } else { if (yych == '&') { yyt1 = YYCURSOR; - goto yy122; + goto yy154; } - if (yych >= ')') goto yy123; + if (yych >= ')') goto yy155; } } else { if (yych <= '=') { - if (yych <= ':') goto yy114; - if (yych <= ';') goto yy125; + if (yych <= ':') goto yy146; + if (yych <= ';') goto yy157; if (yych <= '<') { yyt1 = YYCURSOR; - goto yy127; + goto yy159; } yyt1 = YYCURSOR; - goto yy129; + goto yy161; } else { if (yych <= '>') { yyt1 = YYCURSOR; - goto yy127; + goto yy159; } if (yych == '|') { yyt1 = YYCURSOR; - goto yy130; + goto yy162; } } } -yy114: +yy146: ++YYCURSOR; -yy115: +yy147: { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } -yy116: +yy148: yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy116; + goto yy148; } { goto yyc_cond_op; } -yy119: +yy151: ++YYCURSOR; { lineno++; goto yyc_cond_op; } -yy121: +yy153: yych = *++YYCURSOR; - if (yych == '\n') goto yy119; - goto yy115; -yy122: + if (yych == '\n') goto yy151; + goto yy147; +yy154: yych = *++YYCURSOR; - if (yych == '&') goto yy131; - goto yy115; -yy123: + if (yych == '&') goto yy163; + goto yy147; +yy155: ++YYCURSOR; { while (cond_op_i && sy_op_peek() != '(') { @@ -983,7 +1188,7 @@ yy123: cond_op_i--; goto yyc_cond_op; } -yy125: +yy157: ++YYCURSOR; { while (cond_op_i) { @@ -993,10 +1198,10 @@ yy125: if (cond_res_i > 1) { cs_log_error("invalid condition on line %d", lineno); goto out; } goto yyc_init; } -yy127: +yy159: yych = *++YYCURSOR; - if (yych == '=') goto yy131; -yy128: + if (yych == '=') goto yy163; +yy160: t1 = yyt1; t2 = YYCURSOR; { @@ -1013,16 +1218,16 @@ yy128: sy_op_push(*t1); goto yyc_cond; } -yy129: +yy161: yych = *++YYCURSOR; - if (yych == '=') goto yy131; - goto yy115; -yy130: + if (yych == '=') goto yy163; + goto yy147; +yy162: yych = *++YYCURSOR; - if (yych != '|') goto yy115; -yy131: + if (yych != '|') goto yy147; +yy163: ++YYCURSOR; - goto yy128; + goto yy160; } /* *********************************** */ yyc_rule: @@ -1063,77 +1268,77 @@ yyc_rule: }; yych = *YYCURSOR; if (yybm[0+yych] & 8) { - goto yy136; + goto yy168; } if (yych <= '\r') { - if (yych <= 0x08) goto yy134; - if (yych <= '\n') goto yy139; - if (yych >= '\r') goto yy140; + if (yych <= 0x08) goto yy166; + if (yych <= '\n') goto yy171; + if (yych >= '\r') goto yy172; } else { if (yych <= '.') { - if (yych >= '.') goto yy141; + if (yych >= '.') goto yy173; } else { - if (yych == ';') goto yy142; + if (yych == ';') goto yy174; } } -yy134: +yy166: ++YYCURSOR; -yy135: +yy167: { goto end_of_rule; } -yy136: +yy168: yych = *++YYCURSOR; if (yybm[0+yych] & 8) { - goto yy136; + goto yy168; } { goto yyc_rule; } -yy139: +yy171: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\r') { - if (yych <= 0x08) goto yy135; + if (yych <= 0x08) goto yy167; if (yych <= '\n') { yyt1 = YYCURSOR; - goto yy144; + goto yy176; } - if (yych <= '\f') goto yy135; + if (yych <= '\f') goto yy167; yyt1 = YYCURSOR; - goto yy147; + goto yy179; } else { if (yych <= ' ') { - if (yych <= 0x1F) goto yy135; + if (yych <= 0x1F) goto yy167; yyt1 = YYCURSOR; - goto yy144; + goto yy176; } else { if (yych == '.') { yyt1 = YYCURSOR; - goto yy148; + goto yy180; } - goto yy135; + goto yy167; } } -yy140: +yy172: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == '\n') goto yy150; - goto yy135; -yy141: + if (yych == '\n') goto yy182; + goto yy167; +yy173: yych = *++YYCURSOR; if (yych <= '^') { - if (yych <= '@') goto yy135; + if (yych <= '@') goto yy167; if (yych <= 'Z') { yyt1 = YYCURSOR; - goto yy151; + goto yy183; } - goto yy135; + goto yy167; } else { - if (yych == '`') goto yy135; + if (yych == '`') goto yy167; if (yych <= 'z') { yyt1 = YYCURSOR; - goto yy151; + goto yy183; } - goto yy135; + goto yy167; } -yy142: +yy174: ++YYCURSOR; { end_of_rule: @@ -1144,71 +1349,71 @@ yy142: } goto yyc_init; } -yy144: +yy176: yych = *++YYCURSOR; if (yybm[0+yych] & 16) { - goto yy144; + goto yy176; } - if (yych == '\r') goto yy147; - if (yych == '.') goto yy148; -yy146: + if (yych == '\r') goto yy179; + if (yych == '.') goto yy180; +yy178: YYCURSOR = YYMARKER; if (yyaccept <= 1) { if (yyaccept == 0) { - goto yy135; + goto yy167; } else { yyt3 = yyt4 = NULL; yyt2 = YYCURSOR; - goto yy153; + goto yy185; } } else { - goto yy153; + goto yy185; } -yy147: +yy179: yych = *++YYCURSOR; - if (yych == '\n') goto yy144; - goto yy146; -yy148: + if (yych == '\n') goto yy176; + goto yy178; +yy180: ++YYCURSOR; YYCURSOR = yyt1; { lineno++; goto yyc_rule; } -yy150: +yy182: yych = *++YYCURSOR; if (yych <= '\r') { - if (yych <= 0x08) goto yy146; + if (yych <= 0x08) goto yy178; if (yych <= '\n') { yyt1 = YYCURSOR; - goto yy144; + goto yy176; } - if (yych <= '\f') goto yy146; + if (yych <= '\f') goto yy178; yyt1 = YYCURSOR; - goto yy147; + goto yy179; } else { if (yych <= ' ') { - if (yych <= 0x1F) goto yy146; + if (yych <= 0x1F) goto yy178; yyt1 = YYCURSOR; - goto yy144; + goto yy176; } else { if (yych == '.') { yyt1 = YYCURSOR; - goto yy148; + goto yy180; } - goto yy146; + goto yy178; } } -yy151: +yy183: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { - goto yy151; + goto yy183; } if (yych == '(') { yyt2 = YYCURSOR; - goto yy154; + goto yy186; } yyt3 = yyt4 = NULL; yyt2 = YYCURSOR; -yy153: +yy185: t1 = yyt1; t2 = yyt2; t3 = yyt3; @@ -1243,110 +1448,110 @@ yy153: parsed_rule[kw_i++] = kw; goto yyc_rule; } -yy154: +yy186: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '"') { - if (yych <= '!') goto yy146; + if (yych <= '!') goto yy178; yyt3 = YYCURSOR; } else { if (yych == ')') { yyt3 = yyt4 = YYCURSOR; - goto yy157; + goto yy189; } - goto yy146; + goto yy178; } } else { if (yych <= '_') { if (yych <= 'Z') { yyt3 = YYCURSOR; - goto yy158; + goto yy190; } - if (yych <= '^') goto yy146; + if (yych <= '^') goto yy178; yyt3 = YYCURSOR; - goto yy158; + goto yy190; } else { - if (yych <= '`') goto yy146; + if (yych <= '`') goto yy178; if (yych <= 'z') { yyt3 = YYCURSOR; - goto yy158; + goto yy190; } - goto yy146; + goto yy178; } } -yy155: +yy187: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy155; + goto yy187; } - if (yych <= '\r') goto yy146; - if (yych <= '"') goto yy160; - goto yy161; -yy157: + if (yych <= '\r') goto yy178; + if (yych <= '"') goto yy192; + goto yy193; +yy189: ++YYCURSOR; - goto yy153; -yy158: + goto yy185; +yy190: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= ')') { - if (yych <= '(') goto yy146; + if (yych <= '(') goto yy178; yyt4 = YYCURSOR; - goto yy157; + goto yy189; } else { - if (yych <= '/') goto yy146; - if (yych <= '9') goto yy158; - goto yy146; + if (yych <= '/') goto yy178; + if (yych <= '9') goto yy190; + goto yy178; } } else { if (yych <= '_') { - if (yych <= 'Z') goto yy158; - if (yych <= '^') goto yy146; - goto yy158; + if (yych <= 'Z') goto yy190; + if (yych <= '^') goto yy178; + goto yy190; } else { - if (yych <= '`') goto yy146; - if (yych <= 'z') goto yy158; - goto yy146; + if (yych <= '`') goto yy178; + if (yych <= 'z') goto yy190; + goto yy178; } } -yy160: +yy192: yych = *++YYCURSOR; if (yych == ')') { yyt4 = YYCURSOR; - goto yy157; + goto yy189; } - goto yy146; -yy161: + goto yy178; +yy193: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy155; + goto yy187; } - if (yych <= '\r') goto yy146; - if (yych >= '#') goto yy161; + if (yych <= '\r') goto yy178; + if (yych >= '#') goto yy193; yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy161; + goto yy193; } if (yych <= '\r') { - if (yych == '\n') goto yy146; - if (yych <= '\f') goto yy155; - goto yy146; + if (yych == '\n') goto yy178; + if (yych <= '\f') goto yy187; + goto yy178; } else { if (yych <= '"') { - if (yych <= '!') goto yy155; - goto yy160; + if (yych <= '!') goto yy187; + goto yy192; } else { - if (yych != ')') goto yy155; + if (yych != ')') goto yy187; yyt4 = YYCURSOR; } } yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy155; + goto yy187; } - if (yych <= '\r') goto yy153; - if (yych <= '"') goto yy160; - goto yy161; + if (yych <= '\r') goto yy185; + if (yych <= '"') goto yy192; + goto yy193; } } diff --git a/src/sp_config_scanner.re b/src/sp_config_scanner.re index 063d332..b0ee5d5 100644 --- a/src/sp_config_scanner.re +++ b/src/sp_config_scanner.re @@ -4,6 +4,8 @@ #define cs_log_error(fmt, ...) sp_log_err("config", fmt, ##__VA_ARGS__) #define cs_log_info(fmt, ...) sp_log_msg("config", SP_LOG_INFO, fmt, ##__VA_ARGS__) +#define cs_log_warning(fmt, ...) sp_log_warn("config", fmt, ##__VA_ARGS__) + zend_string *sp_get_arg_string(sp_parsed_keyword *kw) { if (!kw || !kw->arg) { @@ -126,6 +128,12 @@ static int sy_apply_op(char op, int a, int b) { int res = sy_apply_op(op, a, b); \ sy_res_push(res); +#define TMPSTR(tmpstr, t2, t1) \ + char tmpstr[1024]; \ + size_t tmplen = MIN(t2-t1-2, 1023); \ + strncpy(tmpstr, t1+1, tmplen); \ + tmpstr[tmplen] = 0; + zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_keyword*)) { @@ -186,14 +194,22 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key } "@condition" ws+ { goto yyc_cond; } "@end_condition" ws* ";" { cond_res[0] = 1; goto yyc_init; } - "@log" ws+ @t1 string? @t2 { - char tmpstr[1024]; - size_t tmplen = MIN(t2-t1-2, 1023); - strncpy(tmpstr, t1+1, tmplen); - tmpstr[tmplen] = 0; + ( "@log" | "@info" ) ws+ @t1 string @t2 { + TMPSTR(tmpstr, t2, t1); cs_log_info("[line %d]: %s", lineno, tmpstr); goto yyc_init; } + ( "@warn" | "@warning" ) ws+ @t1 string @t2 { + TMPSTR(tmpstr, t2, t1); + cs_log_warning("[line %d]: %s", lineno, tmpstr); + goto yyc_init; + } + ( "@err" | "@error" ) ws+ @t1 string @t2 { + TMPSTR(tmpstr, t2, t1); + cs_log_error("[line %d]: %s", lineno, tmpstr); + goto out; + } + ws+ { goto yyc_cond; } nl { lineno++; goto yyc_cond; } -- cgit v1.3 From 93c806a0e8e4b290a26ef62d726bfc936b2a5d1b Mon Sep 17 00:00:00 2001 From: Ben Fuhrmannek Date: Mon, 20 Dec 2021 17:57:32 +0100 Subject: updated cached scanner file --- src/sp_config_scanner.cached.c | 1 - 1 file changed, 1 deletion(-) (limited to 'src/sp_config_scanner.cached.c') diff --git a/src/sp_config_scanner.cached.c b/src/sp_config_scanner.cached.c index bd2fa3c..dd6f4f6 100644 --- a/src/sp_config_scanner.cached.c +++ b/src/sp_config_scanner.cached.c @@ -582,7 +582,6 @@ yy70: t2 = YYCURSOR; { TMPSTR(tmpstr, t2, t1); - sp_log_debug("tmplen: %d", tmplen); cs_log_info("[line %d]: %s", lineno, tmpstr); goto yyc_init; } -- cgit v1.3 From 578f879e26ce4e3f1cd7693cb9d9a8a6f35cc389 Mon Sep 17 00:00:00 2001 From: Ben Fuhrmannek Date: Mon, 20 Dec 2021 19:47:56 +0100 Subject: make set + @log/@info/@error conditional --- src/sp_config_scanner.cached.c | 718 ++++++++++++++++++++++++----------------- src/sp_config_scanner.re | 14 +- 2 files changed, 424 insertions(+), 308 deletions(-) (limited to 'src/sp_config_scanner.cached.c') diff --git a/src/sp_config_scanner.cached.c b/src/sp_config_scanner.cached.c index dd6f4f6..bb23cf9 100644 --- a/src/sp_config_scanner.cached.c +++ b/src/sp_config_scanner.cached.c @@ -297,26 +297,41 @@ yy17: if (yych == 'o') goto yy26; yy18: YYCURSOR = YYMARKER; - if (yyaccept <= 2) { - if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy5; + if (yyaccept <= 4) { + if (yyaccept <= 2) { + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy5; + } else { + yyt2 = YYCURSOR; + goto yy66; + } } else { - goto yy66; + yyt2 = YYCURSOR; + goto yy70; } } else { - goto yy70; + if (yyaccept == 3) { + goto yy66; + } else { + goto yy70; + } } } else { - if (yyaccept <= 4) { - if (yyaccept == 3) { - goto yy83; + if (yyaccept <= 6) { + if (yyaccept == 5) { + yyt2 = YYCURSOR; + goto yy85; } else { yyt4 = YYCURSOR; - goto yy88; + goto yy90; } } else { - goto yy88; + if (yyaccept == 7) { + goto yy85; + } else { + goto yy90; + } } } yy19: @@ -558,11 +573,14 @@ yy64: if (yych == 'n') goto yy79; goto yy18; yy65: - ++YYCURSOR; + yych = *++YYCURSOR; + yyt2 = YYCURSOR; + if (yych == ';') goto yy80; yy66: t1 = yyt1; - t2 = YYCURSOR; + t2 = yyt2; { + if (!cond_res[0]) { goto yyc_init; } TMPSTR(tmpstr, t2, t1); cs_log_error("[line %d]: %s", lineno, tmpstr); goto out; @@ -573,14 +591,17 @@ yy67: goto yy53; } if (yych <= '\r') goto yy18; - if (yych <= '"') goto yy80; + if (yych <= '"') goto yy81; goto yy67; yy69: - ++YYCURSOR; + yych = *++YYCURSOR; + yyt2 = YYCURSOR; + if (yych == ';') goto yy82; yy70: t1 = yyt1; - t2 = YYCURSOR; + t2 = yyt2; { + if (!cond_res[0]) { goto yyc_init; } TMPSTR(tmpstr, t2, t1); cs_log_info("[line %d]: %s", lineno, tmpstr); goto yyc_init; @@ -594,7 +615,7 @@ yy71: } else { if (yych <= '"') { if (yych <= '!') goto yy56; - goto yy81; + goto yy83; } else { if (yych == '\\') goto yy71; goto yy56; @@ -609,15 +630,15 @@ yy73: } else { if (yych <= '"') { if (yych <= '!') goto yy73; - goto yy82; + goto yy84; } else { - if (yych == '\\') goto yy84; + if (yych == '\\') goto yy86; goto yy73; } } yy75: yych = *++YYCURSOR; - if (yych == 'g') goto yy86; + if (yych == 'g') goto yy88; goto yy18; yy76: yych = *++YYCURSOR; @@ -628,56 +649,92 @@ yy76: } else { if (yych <= '"') { if (yych <= '!') goto yy76; - goto yy87; + goto yy89; } else { - if (yych == '\\') goto yy89; + if (yych == '\\') goto yy91; goto yy76; } } yy78: yych = *++YYCURSOR; - if (yych == 'o') goto yy91; + if (yych == 'o') goto yy93; goto yy18; yy79: yych = *++YYCURSOR; - if (yych == 'd') goto yy92; + if (yych == 'd') goto yy94; goto yy18; yy80: + ++YYCURSOR; + goto yy66; +yy81: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy53; + if (yybm[0+yych] & 128) { + goto yy67; } - if (yych <= '\r') goto yy66; - if (yych <= '"') goto yy65; - goto yy67; -yy81: - yyaccept = 2; - yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\r') { - if (yych == '\n') goto yy70; - if (yych <= '\f') goto yy56; - goto yy70; + if (yych == '\n') { + yyt2 = YYCURSOR; + goto yy66; + } + if (yych <= '\f') goto yy53; + yyt2 = YYCURSOR; + goto yy66; } else { if (yych <= '"') { - if (yych <= '!') goto yy56; - goto yy69; + if (yych <= '!') goto yy53; + goto yy65; } else { - if (yych == '\\') goto yy71; - goto yy56; + if (yych == ';') { + yyt2 = YYCURSOR; + goto yy95; + } + goto yy53; } } yy82: ++YYCURSOR; + goto yy70; yy83: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '!') { + if (yych <= '\n') { + if (yych <= '\t') goto yy56; + yyt2 = YYCURSOR; + goto yy70; + } else { + if (yych == '\r') { + yyt2 = YYCURSOR; + goto yy70; + } + goto yy56; + } + } else { + if (yych <= ';') { + if (yych <= '"') goto yy69; + if (yych <= ':') goto yy56; + yyt2 = YYCURSOR; + goto yy96; + } else { + if (yych == '\\') goto yy71; + goto yy56; + } + } +yy84: + yych = *++YYCURSOR; + yyt2 = YYCURSOR; + if (yych == ';') goto yy97; +yy85: t1 = yyt1; - t2 = YYCURSOR; + t2 = yyt2; { + if (!cond_res[0]) { goto yyc_init; } TMPSTR(tmpstr, t2, t1); cs_log_warning("[line %d]: %s", lineno, tmpstr); goto yyc_init; } -yy84: +yy86: yych = *++YYCURSOR; if (yych <= '\r') { if (yych == '\n') goto yy18; @@ -686,26 +743,27 @@ yy84: } else { if (yych <= '"') { if (yych <= '!') goto yy73; - goto yy93; + goto yy98; } else { - if (yych == '\\') goto yy84; + if (yych == '\\') goto yy86; goto yy73; } } -yy86: +yy88: yych = *++YYCURSOR; if (yych == '"') goto yy18; goto yy59; -yy87: +yy89: yych = *++YYCURSOR; yyt4 = YYCURSOR; - goto yy95; -yy88: + goto yy100; +yy90: t1 = yyt1; t2 = yyt2; t3 = yyt3; t4 = yyt4; { + if (!cond_res[0]) { goto yyc_init; } char *key = (char*)t1; int keylen = t2-t1; zend_string *tmp = zend_hash_str_find_ptr(&vars, key, keylen); @@ -716,7 +774,7 @@ yy88: zend_hash_str_add_ptr(&vars, key, keylen, tmp); goto yyc_init; } -yy89: +yy91: yych = *++YYCURSOR; if (yych <= '\r') { if (yych == '\n') goto yy18; @@ -725,153 +783,207 @@ yy89: } else { if (yych <= '"') { if (yych <= '!') goto yy76; - goto yy97; + goto yy102; } else { - if (yych == '\\') goto yy89; + if (yych == '\\') goto yy91; goto yy76; } } -yy91: +yy93: yych = *++YYCURSOR; - if (yych == 'n') goto yy98; + if (yych == 'n') goto yy103; goto yy18; -yy92: +yy94: yych = *++YYCURSOR; - if (yych == 'i') goto yy99; + if (yych == 'i') goto yy104; goto yy18; -yy93: +yy95: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy53; + } + if (yych <= '\r') goto yy66; + if (yych <= '"') goto yy65; + goto yy67; +yy96: + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\r') { - if (yych == '\n') goto yy83; - if (yych <= '\f') goto yy73; - goto yy83; + if (yych == '\n') goto yy70; + if (yych <= '\f') goto yy56; + goto yy70; } else { if (yych <= '"') { - if (yych <= '!') goto yy73; - goto yy82; + if (yych <= '!') goto yy56; + goto yy69; + } else { + if (yych == '\\') goto yy71; + goto yy56; + } + } +yy97: + ++YYCURSOR; + goto yy85; +yy98: + yyaccept = 5; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '!') { + if (yych <= '\n') { + if (yych <= '\t') goto yy73; + yyt2 = YYCURSOR; + goto yy85; + } else { + if (yych == '\r') { + yyt2 = YYCURSOR; + goto yy85; + } + goto yy73; + } + } else { + if (yych <= ';') { + if (yych <= '"') goto yy84; + if (yych <= ':') goto yy73; + yyt2 = YYCURSOR; + goto yy105; } else { - if (yych == '\\') goto yy84; + if (yych == '\\') goto yy86; goto yy73; } } -yy94: +yy99: yych = *++YYCURSOR; -yy95: +yy100: if (yych <= 0x1F) { - if (yych == '\t') goto yy94; - goto yy88; + if (yych == '\t') goto yy99; + goto yy90; } else { - if (yych <= ' ') goto yy94; - if (yych != ';') goto yy88; + if (yych <= ' ') goto yy99; + if (yych != ';') goto yy90; } ++YYCURSOR; - goto yy88; -yy97: - yyaccept = 4; + goto yy90; +yy102: + yyaccept = 6; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ' ') { if (yych <= '\n') { if (yych <= 0x08) goto yy76; if (yych <= '\t') { yyt4 = YYCURSOR; - goto yy100; + goto yy106; } yyt4 = YYCURSOR; - goto yy88; + goto yy90; } else { if (yych == '\r') { yyt4 = YYCURSOR; - goto yy88; + goto yy90; } if (yych <= 0x1F) goto yy76; yyt4 = YYCURSOR; - goto yy100; + goto yy106; } } else { if (yych <= ':') { - if (yych == '"') goto yy87; + if (yych == '"') goto yy89; goto yy76; } else { if (yych <= ';') { yyt4 = YYCURSOR; - goto yy102; + goto yy108; } - if (yych == '\\') goto yy89; + if (yych == '\\') goto yy91; goto yy76; } } -yy98: +yy103: yych = *++YYCURSOR; - if (yych == '\t') goto yy103; - if (yych == ' ') goto yy103; + if (yych == '\t') goto yy109; + if (yych == ' ') goto yy109; goto yy18; -yy99: +yy104: yych = *++YYCURSOR; - if (yych == 't') goto yy106; + if (yych == 't') goto yy112; goto yy18; -yy100: - yyaccept = 5; +yy105: + yyaccept = 7; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '\r') { + if (yych == '\n') goto yy85; + if (yych <= '\f') goto yy73; + goto yy85; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy73; + goto yy84; + } else { + if (yych == '\\') goto yy86; + goto yy73; + } + } +yy106: + yyaccept = 8; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ' ') { if (yych <= '\n') { if (yych <= 0x08) goto yy76; - if (yych <= '\t') goto yy100; - goto yy88; + if (yych <= '\t') goto yy106; + goto yy90; } else { - if (yych == '\r') goto yy88; + if (yych == '\r') goto yy90; if (yych <= 0x1F) goto yy76; - goto yy100; + goto yy106; } } else { if (yych <= ':') { - if (yych == '"') goto yy87; + if (yych == '"') goto yy89; goto yy76; } else { - if (yych <= ';') goto yy102; - if (yych == '\\') goto yy89; + if (yych <= ';') goto yy108; + if (yych == '\\') goto yy91; goto yy76; } } -yy102: - yyaccept = 5; +yy108: + yyaccept = 8; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\r') { - if (yych == '\n') goto yy88; + if (yych == '\n') goto yy90; if (yych <= '\f') goto yy76; - goto yy88; + goto yy90; } else { if (yych <= '"') { if (yych <= '!') goto yy76; - goto yy87; + goto yy89; } else { - if (yych == '\\') goto yy89; + if (yych == '\\') goto yy91; goto yy76; } } -yy103: +yy109: yych = *++YYCURSOR; - if (yych == '\t') goto yy103; - if (yych == ' ') goto yy103; - { goto yyc_cond; } -yy106: + if (yych == '\t') goto yy109; + if (yych == ' ') goto yy109; + { cond_res_i = 0; goto yyc_cond; } +yy112: yych = *++YYCURSOR; if (yych != 'i') goto yy18; yych = *++YYCURSOR; if (yych != 'o') goto yy18; yych = *++YYCURSOR; if (yych != 'n') goto yy18; -yy109: +yy115: yych = *++YYCURSOR; if (yych <= 0x1F) { - if (yych == '\t') goto yy109; + if (yych == '\t') goto yy115; goto yy18; } else { - if (yych <= ' ') goto yy109; + if (yych <= ' ') goto yy115; if (yych != ';') goto yy18; } ++YYCURSOR; - { cond_res[0] = 1; goto yyc_init; } + { cond_res[0] = 1; cond_res_i = 0; goto yyc_init; } } /* *********************************** */ yyc_cond: @@ -912,85 +1024,85 @@ yyc_cond: }; yych = *YYCURSOR; if (yybm[0+yych] & 8) { - goto yy117; + goto yy123; } if (yych <= '(') { if (yych <= '\r') { - if (yych <= 0x08) goto yy115; - if (yych <= '\n') goto yy120; - if (yych >= '\r') goto yy122; + if (yych <= 0x08) goto yy121; + if (yych <= '\n') goto yy126; + if (yych >= '\r') goto yy128; } else { - if (yych <= 0x1F) goto yy115; - if (yych <= '!') goto yy123; - if (yych >= '(') goto yy125; + if (yych <= 0x1F) goto yy121; + if (yych <= '!') goto yy129; + if (yych >= '(') goto yy131; } } else { if (yych <= 'Z') { - if (yych <= '/') goto yy115; + if (yych <= '/') goto yy121; if (yych <= '9') { yyt1 = YYCURSOR; - goto yy127; + goto yy133; } if (yych >= 'A') { yyt1 = YYCURSOR; - goto yy130; + goto yy136; } } else { if (yych <= '_') { if (yych >= '_') { yyt1 = YYCURSOR; - goto yy130; + goto yy136; } } else { - if (yych <= '`') goto yy115; + if (yych <= '`') goto yy121; if (yych <= 'z') { yyt1 = YYCURSOR; - goto yy130; + goto yy136; } } } } -yy115: +yy121: ++YYCURSOR; -yy116: +yy122: { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } -yy117: +yy123: yych = *++YYCURSOR; if (yybm[0+yych] & 8) { - goto yy117; + goto yy123; } { goto yyc_cond; } -yy120: +yy126: ++YYCURSOR; { lineno++; goto yyc_cond; } -yy122: +yy128: yych = *++YYCURSOR; - if (yych == '\n') goto yy120; - goto yy116; -yy123: + if (yych == '\n') goto yy126; + goto yy122; +yy129: ++YYCURSOR; t1 = YYCURSOR - 1; { sy_op_push(*t1); goto yyc_cond; } -yy125: +yy131: ++YYCURSOR; t1 = YYCURSOR - 1; { sy_op_push(*t1); goto yyc_cond; } -yy127: +yy133: yych = *++YYCURSOR; if (yybm[0+yych] & 16) { - goto yy127; + goto yy133; } t1 = yyt1; t2 = YYCURSOR; { sy_res_push(atoi(t1)); goto yyc_cond_op; } -yy130: +yy136: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { - goto yy130; + goto yy136; } - if (yych == '(') goto yy133; -yy132: + if (yych == '(') goto yy139; +yy138: t1 = yyt1; t2 = YYCURSOR; { @@ -1002,34 +1114,34 @@ yy132: sy_res_push(atoi(ZSTR_VAL(tmp))); goto yyc_cond_op; } -yy133: +yy139: yych = *++YYCURSOR; if (yych == '"') { yyt2 = YYCURSOR; - goto yy135; + goto yy141; } if (yych == ')') { yyt2 = YYCURSOR; - goto yy137; + goto yy143; } -yy134: +yy140: YYCURSOR = YYMARKER; if (yyaccept == 0) { - goto yy132; - } else { goto yy138; + } else { + goto yy144; } -yy135: +yy141: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy135; + goto yy141; } - if (yych <= '\r') goto yy134; - if (yych <= '"') goto yy139; - goto yy140; -yy137: + if (yych <= '\r') goto yy140; + if (yych <= '"') goto yy145; + goto yy146; +yy143: ++YYCURSOR; -yy138: +yy144: t1 = yyt1; t3 = yyt2; t2 = yyt2 - 1; @@ -1044,41 +1156,41 @@ yy138: } goto yyc_cond_op; } -yy139: +yy145: yych = *++YYCURSOR; - if (yych == ')') goto yy137; - goto yy134; -yy140: + if (yych == ')') goto yy143; + goto yy140; +yy146: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy135; + goto yy141; } - if (yych <= '\r') goto yy134; - if (yych >= '#') goto yy140; + if (yych <= '\r') goto yy140; + if (yych >= '#') goto yy146; yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy140; + goto yy146; } if (yych <= '\r') { - if (yych == '\n') goto yy134; - if (yych <= '\f') goto yy135; - goto yy134; + if (yych == '\n') goto yy140; + if (yych <= '\f') goto yy141; + goto yy140; } else { if (yych <= '"') { - if (yych <= '!') goto yy135; - goto yy139; + if (yych <= '!') goto yy141; + goto yy145; } else { - if (yych != ')') goto yy135; + if (yych != ')') goto yy141; } } yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy135; + goto yy141; } - if (yych <= '\r') goto yy138; - if (yych <= '"') goto yy139; - goto yy140; + if (yych <= '\r') goto yy144; + if (yych <= '"') goto yy145; + goto yy146; } /* *********************************** */ yyc_cond_op: @@ -1119,63 +1231,63 @@ yyc_cond_op: }; yych = *YYCURSOR; if (yybm[0+yych] & 128) { - goto yy148; + goto yy154; } if (yych <= ')') { if (yych <= '\r') { - if (yych <= 0x08) goto yy146; - if (yych <= '\n') goto yy151; - if (yych >= '\r') goto yy153; + if (yych <= 0x08) goto yy152; + if (yych <= '\n') goto yy157; + if (yych >= '\r') goto yy159; } else { if (yych == '&') { yyt1 = YYCURSOR; - goto yy154; + goto yy160; } - if (yych >= ')') goto yy155; + if (yych >= ')') goto yy161; } } else { if (yych <= '=') { - if (yych <= ':') goto yy146; - if (yych <= ';') goto yy157; + if (yych <= ':') goto yy152; + if (yych <= ';') goto yy163; if (yych <= '<') { yyt1 = YYCURSOR; - goto yy159; + goto yy165; } yyt1 = YYCURSOR; - goto yy161; + goto yy167; } else { if (yych <= '>') { yyt1 = YYCURSOR; - goto yy159; + goto yy165; } if (yych == '|') { yyt1 = YYCURSOR; - goto yy162; + goto yy168; } } } -yy146: +yy152: ++YYCURSOR; -yy147: +yy153: { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } -yy148: +yy154: yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy148; + goto yy154; } { goto yyc_cond_op; } -yy151: +yy157: ++YYCURSOR; { lineno++; goto yyc_cond_op; } -yy153: +yy159: yych = *++YYCURSOR; - if (yych == '\n') goto yy151; - goto yy147; -yy154: + if (yych == '\n') goto yy157; + goto yy153; +yy160: yych = *++YYCURSOR; - if (yych == '&') goto yy163; - goto yy147; -yy155: + if (yych == '&') goto yy169; + goto yy153; +yy161: ++YYCURSOR; { while (cond_op_i && sy_op_peek() != '(') { @@ -1187,7 +1299,7 @@ yy155: cond_op_i--; goto yyc_cond_op; } -yy157: +yy163: ++YYCURSOR; { while (cond_op_i) { @@ -1197,10 +1309,10 @@ yy157: if (cond_res_i > 1) { cs_log_error("invalid condition on line %d", lineno); goto out; } goto yyc_init; } -yy159: +yy165: yych = *++YYCURSOR; - if (yych == '=') goto yy163; -yy160: + if (yych == '=') goto yy169; +yy166: t1 = yyt1; t2 = YYCURSOR; { @@ -1217,16 +1329,16 @@ yy160: sy_op_push(*t1); goto yyc_cond; } -yy161: +yy167: yych = *++YYCURSOR; - if (yych == '=') goto yy163; - goto yy147; -yy162: + if (yych == '=') goto yy169; + goto yy153; +yy168: yych = *++YYCURSOR; - if (yych != '|') goto yy147; -yy163: + if (yych != '|') goto yy153; +yy169: ++YYCURSOR; - goto yy160; + goto yy166; } /* *********************************** */ yyc_rule: @@ -1267,77 +1379,77 @@ yyc_rule: }; yych = *YYCURSOR; if (yybm[0+yych] & 8) { - goto yy168; + goto yy174; } if (yych <= '\r') { - if (yych <= 0x08) goto yy166; - if (yych <= '\n') goto yy171; - if (yych >= '\r') goto yy172; + if (yych <= 0x08) goto yy172; + if (yych <= '\n') goto yy177; + if (yych >= '\r') goto yy178; } else { if (yych <= '.') { - if (yych >= '.') goto yy173; + if (yych >= '.') goto yy179; } else { - if (yych == ';') goto yy174; + if (yych == ';') goto yy180; } } -yy166: +yy172: ++YYCURSOR; -yy167: +yy173: { goto end_of_rule; } -yy168: +yy174: yych = *++YYCURSOR; if (yybm[0+yych] & 8) { - goto yy168; + goto yy174; } { goto yyc_rule; } -yy171: +yy177: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\r') { - if (yych <= 0x08) goto yy167; + if (yych <= 0x08) goto yy173; if (yych <= '\n') { yyt1 = YYCURSOR; - goto yy176; + goto yy182; } - if (yych <= '\f') goto yy167; + if (yych <= '\f') goto yy173; yyt1 = YYCURSOR; - goto yy179; + goto yy185; } else { if (yych <= ' ') { - if (yych <= 0x1F) goto yy167; + if (yych <= 0x1F) goto yy173; yyt1 = YYCURSOR; - goto yy176; + goto yy182; } else { if (yych == '.') { yyt1 = YYCURSOR; - goto yy180; + goto yy186; } - goto yy167; + goto yy173; } } -yy172: +yy178: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == '\n') goto yy182; - goto yy167; -yy173: + if (yych == '\n') goto yy188; + goto yy173; +yy179: yych = *++YYCURSOR; if (yych <= '^') { - if (yych <= '@') goto yy167; + if (yych <= '@') goto yy173; if (yych <= 'Z') { yyt1 = YYCURSOR; - goto yy183; + goto yy189; } - goto yy167; + goto yy173; } else { - if (yych == '`') goto yy167; + if (yych == '`') goto yy173; if (yych <= 'z') { yyt1 = YYCURSOR; - goto yy183; + goto yy189; } - goto yy167; + goto yy173; } -yy174: +yy180: ++YYCURSOR; { end_of_rule: @@ -1348,71 +1460,71 @@ yy174: } goto yyc_init; } -yy176: +yy182: yych = *++YYCURSOR; if (yybm[0+yych] & 16) { - goto yy176; + goto yy182; } - if (yych == '\r') goto yy179; - if (yych == '.') goto yy180; -yy178: + if (yych == '\r') goto yy185; + if (yych == '.') goto yy186; +yy184: YYCURSOR = YYMARKER; if (yyaccept <= 1) { if (yyaccept == 0) { - goto yy167; + goto yy173; } else { yyt3 = yyt4 = NULL; yyt2 = YYCURSOR; - goto yy185; + goto yy191; } } else { - goto yy185; + goto yy191; } -yy179: +yy185: yych = *++YYCURSOR; - if (yych == '\n') goto yy176; - goto yy178; -yy180: + if (yych == '\n') goto yy182; + goto yy184; +yy186: ++YYCURSOR; YYCURSOR = yyt1; { lineno++; goto yyc_rule; } -yy182: +yy188: yych = *++YYCURSOR; if (yych <= '\r') { - if (yych <= 0x08) goto yy178; + if (yych <= 0x08) goto yy184; if (yych <= '\n') { yyt1 = YYCURSOR; - goto yy176; + goto yy182; } - if (yych <= '\f') goto yy178; + if (yych <= '\f') goto yy184; yyt1 = YYCURSOR; - goto yy179; + goto yy185; } else { if (yych <= ' ') { - if (yych <= 0x1F) goto yy178; + if (yych <= 0x1F) goto yy184; yyt1 = YYCURSOR; - goto yy176; + goto yy182; } else { if (yych == '.') { yyt1 = YYCURSOR; - goto yy180; + goto yy186; } - goto yy178; + goto yy184; } } -yy183: +yy189: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { - goto yy183; + goto yy189; } if (yych == '(') { yyt2 = YYCURSOR; - goto yy186; + goto yy192; } yyt3 = yyt4 = NULL; yyt2 = YYCURSOR; -yy185: +yy191: t1 = yyt1; t2 = yyt2; t3 = yyt3; @@ -1447,110 +1559,110 @@ yy185: parsed_rule[kw_i++] = kw; goto yyc_rule; } -yy186: +yy192: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '"') { - if (yych <= '!') goto yy178; + if (yych <= '!') goto yy184; yyt3 = YYCURSOR; } else { if (yych == ')') { yyt3 = yyt4 = YYCURSOR; - goto yy189; + goto yy195; } - goto yy178; + goto yy184; } } else { if (yych <= '_') { if (yych <= 'Z') { yyt3 = YYCURSOR; - goto yy190; + goto yy196; } - if (yych <= '^') goto yy178; + if (yych <= '^') goto yy184; yyt3 = YYCURSOR; - goto yy190; + goto yy196; } else { - if (yych <= '`') goto yy178; + if (yych <= '`') goto yy184; if (yych <= 'z') { yyt3 = YYCURSOR; - goto yy190; + goto yy196; } - goto yy178; + goto yy184; } } -yy187: +yy193: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy187; + goto yy193; } - if (yych <= '\r') goto yy178; - if (yych <= '"') goto yy192; - goto yy193; -yy189: + if (yych <= '\r') goto yy184; + if (yych <= '"') goto yy198; + goto yy199; +yy195: ++YYCURSOR; - goto yy185; -yy190: + goto yy191; +yy196: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= ')') { - if (yych <= '(') goto yy178; + if (yych <= '(') goto yy184; yyt4 = YYCURSOR; - goto yy189; + goto yy195; } else { - if (yych <= '/') goto yy178; - if (yych <= '9') goto yy190; - goto yy178; + if (yych <= '/') goto yy184; + if (yych <= '9') goto yy196; + goto yy184; } } else { if (yych <= '_') { - if (yych <= 'Z') goto yy190; - if (yych <= '^') goto yy178; - goto yy190; + if (yych <= 'Z') goto yy196; + if (yych <= '^') goto yy184; + goto yy196; } else { - if (yych <= '`') goto yy178; - if (yych <= 'z') goto yy190; - goto yy178; + if (yych <= '`') goto yy184; + if (yych <= 'z') goto yy196; + goto yy184; } } -yy192: +yy198: yych = *++YYCURSOR; if (yych == ')') { yyt4 = YYCURSOR; - goto yy189; + goto yy195; } - goto yy178; -yy193: + goto yy184; +yy199: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy187; + goto yy193; } - if (yych <= '\r') goto yy178; - if (yych >= '#') goto yy193; + if (yych <= '\r') goto yy184; + if (yych >= '#') goto yy199; yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy193; + goto yy199; } if (yych <= '\r') { - if (yych == '\n') goto yy178; - if (yych <= '\f') goto yy187; - goto yy178; + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy193; + goto yy184; } else { if (yych <= '"') { - if (yych <= '!') goto yy187; - goto yy192; + if (yych <= '!') goto yy193; + goto yy198; } else { - if (yych != ')') goto yy187; + if (yych != ')') goto yy193; yyt4 = YYCURSOR; } } yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy187; + goto yy193; } - if (yych <= '\r') goto yy185; - if (yych <= '"') goto yy192; - goto yy193; + if (yych <= '\r') goto yy191; + if (yych <= '"') goto yy198; + goto yy199; } } diff --git a/src/sp_config_scanner.re b/src/sp_config_scanner.re index b0ee5d5..6b52b20 100644 --- a/src/sp_config_scanner.re +++ b/src/sp_config_scanner.re @@ -182,6 +182,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key "sp" { kw_i = 0; goto yyc_rule; } end { ret = SUCCESS; goto out; } "set" ws+ @t1 keyword @t2 ws+ @t3 string @t4 ws* ";"? { + if (!cond_res[0]) { goto yyc_init; } char *key = (char*)t1; int keylen = t2-t1; zend_string *tmp = zend_hash_str_find_ptr(&vars, key, keylen); @@ -192,19 +193,22 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key zend_hash_str_add_ptr(&vars, key, keylen, tmp); goto yyc_init; } - "@condition" ws+ { goto yyc_cond; } - "@end_condition" ws* ";" { cond_res[0] = 1; goto yyc_init; } - ( "@log" | "@info" ) ws+ @t1 string @t2 { + "@condition" ws+ { cond_res_i = 0; goto yyc_cond; } + "@end_condition" ws* ";" { cond_res[0] = 1; cond_res_i = 0; goto yyc_init; } + ( "@log" | "@info" ) ws+ @t1 string @t2 ";"? { + if (!cond_res[0]) { goto yyc_init; } TMPSTR(tmpstr, t2, t1); cs_log_info("[line %d]: %s", lineno, tmpstr); goto yyc_init; } - ( "@warn" | "@warning" ) ws+ @t1 string @t2 { + ( "@warn" | "@warning" ) ws+ @t1 string @t2 ";"? { + if (!cond_res[0]) { goto yyc_init; } TMPSTR(tmpstr, t2, t1); cs_log_warning("[line %d]: %s", lineno, tmpstr); goto yyc_init; } - ( "@err" | "@error" ) ws+ @t1 string @t2 { + ( "@err" | "@error" ) ws+ @t1 string @t2 ";"? { + if (!cond_res[0]) { goto yyc_init; } TMPSTR(tmpstr, t2, t1); cs_log_error("[line %d]: %s", lineno, tmpstr); goto out; -- cgit v1.3 From 3045f5adb916d4ef8520a2c88d82ff8c38ee6328 Mon Sep 17 00:00:00 2001 From: Ben Fuhrmannek Date: Mon, 20 Dec 2021 19:51:45 +0100 Subject: allow '@set' as a synonym for 'set' in rules files --- src/sp_config_scanner.cached.c | 919 +++++++++++++++++++++-------------------- src/sp_config_scanner.re | 2 +- 2 files changed, 463 insertions(+), 458 deletions(-) (limited to 'src/sp_config_scanner.cached.c') diff --git a/src/sp_config_scanner.cached.c b/src/sp_config_scanner.cached.c index bb23cf9..7617ebf 100644 --- a/src/sp_config_scanner.cached.c +++ b/src/sp_config_scanner.cached.c @@ -283,18 +283,19 @@ yy15: case 'e': goto yy19; case 'i': goto yy20; case 'l': goto yy21; - case 'w': goto yy22; + case 's': goto yy22; + case 'w': goto yy23; default: goto yy5; } yy16: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == 'e') goto yy23; - if (yych == 'p') goto yy24; + if (yych == 'e') goto yy24; + if (yych == 'p') goto yy25; goto yy5; yy17: yych = *++YYCURSOR; - if (yych == 'o') goto yy26; + if (yych == 'o') goto yy27; yy18: YYCURSOR = YYMARKER; if (yyaccept <= 4) { @@ -304,279 +305,283 @@ yy18: goto yy5; } else { yyt2 = YYCURSOR; - goto yy66; + goto yy67; } } else { yyt2 = YYCURSOR; - goto yy70; + goto yy71; } } else { if (yyaccept == 3) { - goto yy66; + goto yy67; } else { - goto yy70; + goto yy71; } } } else { if (yyaccept <= 6) { if (yyaccept == 5) { yyt2 = YYCURSOR; - goto yy85; + goto yy86; } else { yyt4 = YYCURSOR; - goto yy90; + goto yy91; } } else { if (yyaccept == 7) { - goto yy85; + goto yy86; } else { - goto yy90; + goto yy91; } } } yy19: yych = *++YYCURSOR; - if (yych == 'n') goto yy27; - if (yych == 'r') goto yy28; + if (yych == 'n') goto yy28; + if (yych == 'r') goto yy29; goto yy18; yy20: yych = *++YYCURSOR; - if (yych == 'n') goto yy29; + if (yych == 'n') goto yy30; goto yy18; yy21: yych = *++YYCURSOR; - if (yych == 'o') goto yy30; + if (yych == 'o') goto yy31; goto yy18; yy22: yych = *++YYCURSOR; - if (yych == 'a') goto yy31; + if (yych == 'e') goto yy24; goto yy18; yy23: yych = *++YYCURSOR; - if (yych == 't') goto yy32; + if (yych == 'a') goto yy32; goto yy18; yy24: - ++YYCURSOR; - { kw_i = 0; goto yyc_rule; } -yy26: yych = *++YYCURSOR; - if (yych == 'n') goto yy33; + if (yych == 't') goto yy33; goto yy18; +yy25: + ++YYCURSOR; + { kw_i = 0; goto yyc_rule; } yy27: yych = *++YYCURSOR; - if (yych == 'd') goto yy34; + if (yych == 'n') goto yy34; goto yy18; yy28: yych = *++YYCURSOR; - if (yych == 'r') goto yy35; + if (yych == 'd') goto yy35; goto yy18; yy29: yych = *++YYCURSOR; - if (yych == 'f') goto yy36; + if (yych == 'r') goto yy36; goto yy18; yy30: yych = *++YYCURSOR; - if (yych == 'g') goto yy37; + if (yych == 'f') goto yy37; goto yy18; yy31: yych = *++YYCURSOR; - if (yych == 'r') goto yy38; + if (yych == 'g') goto yy38; goto yy18; yy32: yych = *++YYCURSOR; - if (yych == '\t') goto yy39; - if (yych == ' ') goto yy39; + if (yych == 'r') goto yy39; goto yy18; yy33: yych = *++YYCURSOR; - if (yych == 'd') goto yy41; + if (yych == '\t') goto yy40; + if (yych == ' ') goto yy40; goto yy18; yy34: yych = *++YYCURSOR; - if (yych == '_') goto yy42; + if (yych == 'd') goto yy42; goto yy18; yy35: yych = *++YYCURSOR; - if (yych == '"') goto yy18; - if (yych == 'o') goto yy45; - goto yy44; + if (yych == '_') goto yy43; + goto yy18; yy36: yych = *++YYCURSOR; - if (yych != 'o') goto yy18; + if (yych == '"') goto yy18; + if (yych == 'o') goto yy46; + goto yy45; yy37: yych = *++YYCURSOR; - if (yych == '"') goto yy18; - goto yy47; + if (yych != 'o') goto yy18; yy38: yych = *++YYCURSOR; - if (yych == 'n') goto yy48; - goto yy18; + if (yych == '"') goto yy18; + goto yy48; yy39: + yych = *++YYCURSOR; + if (yych == 'n') goto yy49; + goto yy18; +yy40: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '\t') { if (yych <= 0x08) goto yy18; - goto yy39; + goto yy40; } else { - if (yych == ' ') goto yy39; + if (yych == ' ') goto yy40; goto yy18; } } else { if (yych <= '_') { if (yych <= 'Z') { yyt1 = YYCURSOR; - goto yy49; + goto yy50; } if (yych <= '^') goto yy18; yyt1 = YYCURSOR; - goto yy49; + goto yy50; } else { if (yych <= '`') goto yy18; if (yych <= 'z') { yyt1 = YYCURSOR; - goto yy49; + goto yy50; } goto yy18; } } -yy41: - yych = *++YYCURSOR; - if (yych == 'i') goto yy51; - goto yy18; yy42: yych = *++YYCURSOR; - if (yych == 'c') goto yy52; + if (yych == 'i') goto yy52; goto yy18; yy43: yych = *++YYCURSOR; + if (yych == 'c') goto yy53; + goto yy18; yy44: + yych = *++YYCURSOR; +yy45: if (yych <= 0x1F) { - if (yych == '\t') goto yy43; + if (yych == '\t') goto yy44; goto yy18; } else { - if (yych <= ' ') goto yy43; + if (yych <= ' ') goto yy44; if (yych == '"') { yyt1 = YYCURSOR; - goto yy53; + goto yy54; } goto yy18; } -yy45: - yych = *++YYCURSOR; - if (yych == 'r') goto yy55; - goto yy18; yy46: yych = *++YYCURSOR; + if (yych == 'r') goto yy56; + goto yy18; yy47: + yych = *++YYCURSOR; +yy48: if (yych <= 0x1F) { - if (yych == '\t') goto yy46; + if (yych == '\t') goto yy47; goto yy18; } else { - if (yych <= ' ') goto yy46; + if (yych <= ' ') goto yy47; if (yych == '"') { yyt1 = YYCURSOR; - goto yy56; + goto yy57; } goto yy18; } -yy48: +yy49: yych = *++YYCURSOR; if (yych == '"') goto yy18; - if (yych == 'i') goto yy60; - goto yy59; -yy49: + if (yych == 'i') goto yy61; + goto yy60; +yy50: yych = *++YYCURSOR; if (yybm[0+yych] & 32) { - goto yy49; + goto yy50; } if (yych == '\t') { yyt2 = YYCURSOR; - goto yy61; + goto yy62; } if (yych == ' ') { yyt2 = YYCURSOR; - goto yy61; + goto yy62; } goto yy18; -yy51: - yych = *++YYCURSOR; - if (yych == 't') goto yy63; - goto yy18; yy52: yych = *++YYCURSOR; - if (yych == 'o') goto yy64; + if (yych == 't') goto yy64; goto yy18; yy53: + yych = *++YYCURSOR; + if (yych == 'o') goto yy65; + goto yy18; +yy54: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy53; + goto yy54; } if (yych <= '\r') goto yy18; - if (yych <= '"') goto yy65; - goto yy67; -yy55: + if (yych <= '"') goto yy66; + goto yy68; +yy56: yych = *++YYCURSOR; if (yych == '"') goto yy18; - goto yy44; -yy56: + goto yy45; +yy57: yych = *++YYCURSOR; if (yych <= '\r') { if (yych == '\n') goto yy18; - if (yych <= '\f') goto yy56; + if (yych <= '\f') goto yy57; goto yy18; } else { if (yych <= '"') { - if (yych <= '!') goto yy56; - goto yy69; + if (yych <= '!') goto yy57; + goto yy70; } else { - if (yych == '\\') goto yy71; - goto yy56; + if (yych == '\\') goto yy72; + goto yy57; } } -yy58: - yych = *++YYCURSOR; yy59: + yych = *++YYCURSOR; +yy60: if (yych <= 0x1F) { - if (yych == '\t') goto yy58; + if (yych == '\t') goto yy59; goto yy18; } else { - if (yych <= ' ') goto yy58; + if (yych <= ' ') goto yy59; if (yych == '"') { yyt1 = YYCURSOR; - goto yy73; + goto yy74; } goto yy18; } -yy60: +yy61: yych = *++YYCURSOR; - if (yych == 'n') goto yy75; + if (yych == 'n') goto yy76; goto yy18; -yy61: +yy62: yych = *++YYCURSOR; if (yych <= 0x1F) { - if (yych == '\t') goto yy61; + if (yych == '\t') goto yy62; goto yy18; } else { - if (yych <= ' ') goto yy61; + if (yych <= ' ') goto yy62; if (yych == '"') { yyt3 = YYCURSOR; - goto yy76; + goto yy77; } goto yy18; } -yy63: - yych = *++YYCURSOR; - if (yych == 'i') goto yy78; - goto yy18; yy64: yych = *++YYCURSOR; - if (yych == 'n') goto yy79; + if (yych == 'i') goto yy79; goto yy18; yy65: yych = *++YYCURSOR; - yyt2 = YYCURSOR; - if (yych == ';') goto yy80; + if (yych == 'n') goto yy80; + goto yy18; yy66: + yych = *++YYCURSOR; + yyt2 = YYCURSOR; + if (yych == ';') goto yy81; +yy67: t1 = yyt1; t2 = yyt2; { @@ -585,19 +590,19 @@ yy66: cs_log_error("[line %d]: %s", lineno, tmpstr); goto out; } -yy67: +yy68: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy53; + goto yy54; } if (yych <= '\r') goto yy18; - if (yych <= '"') goto yy81; - goto yy67; -yy69: + if (yych <= '"') goto yy82; + goto yy68; +yy70: yych = *++YYCURSOR; yyt2 = YYCURSOR; - if (yych == ';') goto yy82; -yy70: + if (yych == ';') goto yy83; +yy71: t1 = yyt1; t2 = yyt2; { @@ -606,126 +611,126 @@ yy70: cs_log_info("[line %d]: %s", lineno, tmpstr); goto yyc_init; } -yy71: +yy72: yych = *++YYCURSOR; if (yych <= '\r') { if (yych == '\n') goto yy18; - if (yych <= '\f') goto yy56; + if (yych <= '\f') goto yy57; goto yy18; } else { if (yych <= '"') { - if (yych <= '!') goto yy56; - goto yy83; + if (yych <= '!') goto yy57; + goto yy84; } else { - if (yych == '\\') goto yy71; - goto yy56; + if (yych == '\\') goto yy72; + goto yy57; } } -yy73: +yy74: yych = *++YYCURSOR; if (yych <= '\r') { if (yych == '\n') goto yy18; - if (yych <= '\f') goto yy73; + if (yych <= '\f') goto yy74; goto yy18; } else { if (yych <= '"') { - if (yych <= '!') goto yy73; - goto yy84; + if (yych <= '!') goto yy74; + goto yy85; } else { - if (yych == '\\') goto yy86; - goto yy73; + if (yych == '\\') goto yy87; + goto yy74; } } -yy75: +yy76: yych = *++YYCURSOR; - if (yych == 'g') goto yy88; + if (yych == 'g') goto yy89; goto yy18; -yy76: +yy77: yych = *++YYCURSOR; if (yych <= '\r') { if (yych == '\n') goto yy18; - if (yych <= '\f') goto yy76; + if (yych <= '\f') goto yy77; goto yy18; } else { if (yych <= '"') { - if (yych <= '!') goto yy76; - goto yy89; + if (yych <= '!') goto yy77; + goto yy90; } else { - if (yych == '\\') goto yy91; - goto yy76; + if (yych == '\\') goto yy92; + goto yy77; } } -yy78: - yych = *++YYCURSOR; - if (yych == 'o') goto yy93; - goto yy18; yy79: yych = *++YYCURSOR; - if (yych == 'd') goto yy94; + if (yych == 'o') goto yy94; goto yy18; yy80: - ++YYCURSOR; - goto yy66; + yych = *++YYCURSOR; + if (yych == 'd') goto yy95; + goto yy18; yy81: + ++YYCURSOR; + goto yy67; +yy82: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 128) { - goto yy67; + goto yy68; } if (yych <= '\r') { if (yych == '\n') { yyt2 = YYCURSOR; - goto yy66; + goto yy67; } - if (yych <= '\f') goto yy53; + if (yych <= '\f') goto yy54; yyt2 = YYCURSOR; - goto yy66; + goto yy67; } else { if (yych <= '"') { - if (yych <= '!') goto yy53; - goto yy65; + if (yych <= '!') goto yy54; + goto yy66; } else { if (yych == ';') { yyt2 = YYCURSOR; - goto yy95; + goto yy96; } - goto yy53; + goto yy54; } } -yy82: - ++YYCURSOR; - goto yy70; yy83: + ++YYCURSOR; + goto yy71; +yy84: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '!') { if (yych <= '\n') { - if (yych <= '\t') goto yy56; + if (yych <= '\t') goto yy57; yyt2 = YYCURSOR; - goto yy70; + goto yy71; } else { if (yych == '\r') { yyt2 = YYCURSOR; - goto yy70; + goto yy71; } - goto yy56; + goto yy57; } } else { if (yych <= ';') { - if (yych <= '"') goto yy69; - if (yych <= ':') goto yy56; + if (yych <= '"') goto yy70; + if (yych <= ':') goto yy57; yyt2 = YYCURSOR; - goto yy96; + goto yy97; } else { - if (yych == '\\') goto yy71; - goto yy56; + if (yych == '\\') goto yy72; + goto yy57; } } -yy84: +yy85: yych = *++YYCURSOR; yyt2 = YYCURSOR; - if (yych == ';') goto yy97; -yy85: + if (yych == ';') goto yy98; +yy86: t1 = yyt1; t2 = yyt2; { @@ -734,30 +739,30 @@ yy85: cs_log_warning("[line %d]: %s", lineno, tmpstr); goto yyc_init; } -yy86: +yy87: yych = *++YYCURSOR; if (yych <= '\r') { if (yych == '\n') goto yy18; - if (yych <= '\f') goto yy73; + if (yych <= '\f') goto yy74; goto yy18; } else { if (yych <= '"') { - if (yych <= '!') goto yy73; - goto yy98; + if (yych <= '!') goto yy74; + goto yy99; } else { - if (yych == '\\') goto yy86; - goto yy73; + if (yych == '\\') goto yy87; + goto yy74; } } -yy88: +yy89: yych = *++YYCURSOR; if (yych == '"') goto yy18; - goto yy59; -yy89: + goto yy60; +yy90: yych = *++YYCURSOR; yyt4 = YYCURSOR; - goto yy100; -yy90: + goto yy101; +yy91: t1 = yyt1; t2 = yyt2; t3 = yyt3; @@ -774,212 +779,212 @@ yy90: zend_hash_str_add_ptr(&vars, key, keylen, tmp); goto yyc_init; } -yy91: +yy92: yych = *++YYCURSOR; if (yych <= '\r') { if (yych == '\n') goto yy18; - if (yych <= '\f') goto yy76; + if (yych <= '\f') goto yy77; goto yy18; } else { if (yych <= '"') { - if (yych <= '!') goto yy76; - goto yy102; + if (yych <= '!') goto yy77; + goto yy103; } else { - if (yych == '\\') goto yy91; - goto yy76; + if (yych == '\\') goto yy92; + goto yy77; } } -yy93: - yych = *++YYCURSOR; - if (yych == 'n') goto yy103; - goto yy18; yy94: yych = *++YYCURSOR; - if (yych == 'i') goto yy104; + if (yych == 'n') goto yy104; goto yy18; yy95: + yych = *++YYCURSOR; + if (yych == 'i') goto yy105; + goto yy18; +yy96: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy53; + goto yy54; } - if (yych <= '\r') goto yy66; - if (yych <= '"') goto yy65; - goto yy67; -yy96: + if (yych <= '\r') goto yy67; + if (yych <= '"') goto yy66; + goto yy68; +yy97: yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\r') { - if (yych == '\n') goto yy70; - if (yych <= '\f') goto yy56; - goto yy70; + if (yych == '\n') goto yy71; + if (yych <= '\f') goto yy57; + goto yy71; } else { if (yych <= '"') { - if (yych <= '!') goto yy56; - goto yy69; + if (yych <= '!') goto yy57; + goto yy70; } else { - if (yych == '\\') goto yy71; - goto yy56; + if (yych == '\\') goto yy72; + goto yy57; } } -yy97: - ++YYCURSOR; - goto yy85; yy98: + ++YYCURSOR; + goto yy86; +yy99: yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '!') { if (yych <= '\n') { - if (yych <= '\t') goto yy73; + if (yych <= '\t') goto yy74; yyt2 = YYCURSOR; - goto yy85; + goto yy86; } else { if (yych == '\r') { yyt2 = YYCURSOR; - goto yy85; + goto yy86; } - goto yy73; + goto yy74; } } else { if (yych <= ';') { - if (yych <= '"') goto yy84; - if (yych <= ':') goto yy73; + if (yych <= '"') goto yy85; + if (yych <= ':') goto yy74; yyt2 = YYCURSOR; - goto yy105; + goto yy106; } else { - if (yych == '\\') goto yy86; - goto yy73; + if (yych == '\\') goto yy87; + goto yy74; } } -yy99: - yych = *++YYCURSOR; yy100: + yych = *++YYCURSOR; +yy101: if (yych <= 0x1F) { - if (yych == '\t') goto yy99; - goto yy90; + if (yych == '\t') goto yy100; + goto yy91; } else { - if (yych <= ' ') goto yy99; - if (yych != ';') goto yy90; + if (yych <= ' ') goto yy100; + if (yych != ';') goto yy91; } ++YYCURSOR; - goto yy90; -yy102: + goto yy91; +yy103: yyaccept = 6; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ' ') { if (yych <= '\n') { - if (yych <= 0x08) goto yy76; + if (yych <= 0x08) goto yy77; if (yych <= '\t') { yyt4 = YYCURSOR; - goto yy106; + goto yy107; } yyt4 = YYCURSOR; - goto yy90; + goto yy91; } else { if (yych == '\r') { yyt4 = YYCURSOR; - goto yy90; + goto yy91; } - if (yych <= 0x1F) goto yy76; + if (yych <= 0x1F) goto yy77; yyt4 = YYCURSOR; - goto yy106; + goto yy107; } } else { if (yych <= ':') { - if (yych == '"') goto yy89; - goto yy76; + if (yych == '"') goto yy90; + goto yy77; } else { if (yych <= ';') { yyt4 = YYCURSOR; - goto yy108; + goto yy109; } - if (yych == '\\') goto yy91; - goto yy76; + if (yych == '\\') goto yy92; + goto yy77; } } -yy103: - yych = *++YYCURSOR; - if (yych == '\t') goto yy109; - if (yych == ' ') goto yy109; - goto yy18; yy104: yych = *++YYCURSOR; - if (yych == 't') goto yy112; + if (yych == '\t') goto yy110; + if (yych == ' ') goto yy110; goto yy18; yy105: + yych = *++YYCURSOR; + if (yych == 't') goto yy113; + goto yy18; +yy106: yyaccept = 7; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\r') { - if (yych == '\n') goto yy85; - if (yych <= '\f') goto yy73; - goto yy85; + if (yych == '\n') goto yy86; + if (yych <= '\f') goto yy74; + goto yy86; } else { if (yych <= '"') { - if (yych <= '!') goto yy73; - goto yy84; + if (yych <= '!') goto yy74; + goto yy85; } else { - if (yych == '\\') goto yy86; - goto yy73; + if (yych == '\\') goto yy87; + goto yy74; } } -yy106: +yy107: yyaccept = 8; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ' ') { if (yych <= '\n') { - if (yych <= 0x08) goto yy76; - if (yych <= '\t') goto yy106; - goto yy90; + if (yych <= 0x08) goto yy77; + if (yych <= '\t') goto yy107; + goto yy91; } else { - if (yych == '\r') goto yy90; - if (yych <= 0x1F) goto yy76; - goto yy106; + if (yych == '\r') goto yy91; + if (yych <= 0x1F) goto yy77; + goto yy107; } } else { if (yych <= ':') { - if (yych == '"') goto yy89; - goto yy76; + if (yych == '"') goto yy90; + goto yy77; } else { - if (yych <= ';') goto yy108; - if (yych == '\\') goto yy91; - goto yy76; + if (yych <= ';') goto yy109; + if (yych == '\\') goto yy92; + goto yy77; } } -yy108: +yy109: yyaccept = 8; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\r') { - if (yych == '\n') goto yy90; - if (yych <= '\f') goto yy76; - goto yy90; + if (yych == '\n') goto yy91; + if (yych <= '\f') goto yy77; + goto yy91; } else { if (yych <= '"') { - if (yych <= '!') goto yy76; - goto yy89; + if (yych <= '!') goto yy77; + goto yy90; } else { - if (yych == '\\') goto yy91; - goto yy76; + if (yych == '\\') goto yy92; + goto yy77; } } -yy109: +yy110: yych = *++YYCURSOR; - if (yych == '\t') goto yy109; - if (yych == ' ') goto yy109; + if (yych == '\t') goto yy110; + if (yych == ' ') goto yy110; { cond_res_i = 0; goto yyc_cond; } -yy112: +yy113: yych = *++YYCURSOR; if (yych != 'i') goto yy18; yych = *++YYCURSOR; if (yych != 'o') goto yy18; yych = *++YYCURSOR; if (yych != 'n') goto yy18; -yy115: +yy116: yych = *++YYCURSOR; if (yych <= 0x1F) { - if (yych == '\t') goto yy115; + if (yych == '\t') goto yy116; goto yy18; } else { - if (yych <= ' ') goto yy115; + if (yych <= ' ') goto yy116; if (yych != ';') goto yy18; } ++YYCURSOR; @@ -1024,85 +1029,85 @@ yyc_cond: }; yych = *YYCURSOR; if (yybm[0+yych] & 8) { - goto yy123; + goto yy124; } if (yych <= '(') { if (yych <= '\r') { - if (yych <= 0x08) goto yy121; - if (yych <= '\n') goto yy126; - if (yych >= '\r') goto yy128; + if (yych <= 0x08) goto yy122; + if (yych <= '\n') goto yy127; + if (yych >= '\r') goto yy129; } else { - if (yych <= 0x1F) goto yy121; - if (yych <= '!') goto yy129; - if (yych >= '(') goto yy131; + if (yych <= 0x1F) goto yy122; + if (yych <= '!') goto yy130; + if (yych >= '(') goto yy132; } } else { if (yych <= 'Z') { - if (yych <= '/') goto yy121; + if (yych <= '/') goto yy122; if (yych <= '9') { yyt1 = YYCURSOR; - goto yy133; + goto yy134; } if (yych >= 'A') { yyt1 = YYCURSOR; - goto yy136; + goto yy137; } } else { if (yych <= '_') { if (yych >= '_') { yyt1 = YYCURSOR; - goto yy136; + goto yy137; } } else { - if (yych <= '`') goto yy121; + if (yych <= '`') goto yy122; if (yych <= 'z') { yyt1 = YYCURSOR; - goto yy136; + goto yy137; } } } } -yy121: - ++YYCURSOR; yy122: - { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } + ++YYCURSOR; yy123: + { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } +yy124: yych = *++YYCURSOR; if (yybm[0+yych] & 8) { - goto yy123; + goto yy124; } { goto yyc_cond; } -yy126: +yy127: ++YYCURSOR; { lineno++; goto yyc_cond; } -yy128: - yych = *++YYCURSOR; - if (yych == '\n') goto yy126; - goto yy122; yy129: + yych = *++YYCURSOR; + if (yych == '\n') goto yy127; + goto yy123; +yy130: ++YYCURSOR; t1 = YYCURSOR - 1; { sy_op_push(*t1); goto yyc_cond; } -yy131: +yy132: ++YYCURSOR; t1 = YYCURSOR - 1; { sy_op_push(*t1); goto yyc_cond; } -yy133: +yy134: yych = *++YYCURSOR; if (yybm[0+yych] & 16) { - goto yy133; + goto yy134; } t1 = yyt1; t2 = YYCURSOR; { sy_res_push(atoi(t1)); goto yyc_cond_op; } -yy136: +yy137: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { - goto yy136; + goto yy137; } - if (yych == '(') goto yy139; -yy138: + if (yych == '(') goto yy140; +yy139: t1 = yyt1; t2 = YYCURSOR; { @@ -1114,34 +1119,34 @@ yy138: sy_res_push(atoi(ZSTR_VAL(tmp))); goto yyc_cond_op; } -yy139: +yy140: yych = *++YYCURSOR; if (yych == '"') { yyt2 = YYCURSOR; - goto yy141; + goto yy142; } if (yych == ')') { yyt2 = YYCURSOR; - goto yy143; + goto yy144; } -yy140: +yy141: YYCURSOR = YYMARKER; if (yyaccept == 0) { - goto yy138; + goto yy139; } else { - goto yy144; + goto yy145; } -yy141: +yy142: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy141; + goto yy142; } - if (yych <= '\r') goto yy140; - if (yych <= '"') goto yy145; - goto yy146; -yy143: - ++YYCURSOR; + if (yych <= '\r') goto yy141; + if (yych <= '"') goto yy146; + goto yy147; yy144: + ++YYCURSOR; +yy145: t1 = yyt1; t3 = yyt2; t2 = yyt2 - 1; @@ -1156,41 +1161,41 @@ yy144: } goto yyc_cond_op; } -yy145: - yych = *++YYCURSOR; - if (yych == ')') goto yy143; - goto yy140; yy146: + yych = *++YYCURSOR; + if (yych == ')') goto yy144; + goto yy141; +yy147: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy141; + goto yy142; } - if (yych <= '\r') goto yy140; - if (yych >= '#') goto yy146; + if (yych <= '\r') goto yy141; + if (yych >= '#') goto yy147; yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy146; + goto yy147; } if (yych <= '\r') { - if (yych == '\n') goto yy140; - if (yych <= '\f') goto yy141; - goto yy140; + if (yych == '\n') goto yy141; + if (yych <= '\f') goto yy142; + goto yy141; } else { if (yych <= '"') { - if (yych <= '!') goto yy141; - goto yy145; + if (yych <= '!') goto yy142; + goto yy146; } else { - if (yych != ')') goto yy141; + if (yych != ')') goto yy142; } } yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy141; + goto yy142; } - if (yych <= '\r') goto yy144; - if (yych <= '"') goto yy145; - goto yy146; + if (yych <= '\r') goto yy145; + if (yych <= '"') goto yy146; + goto yy147; } /* *********************************** */ yyc_cond_op: @@ -1231,63 +1236,63 @@ yyc_cond_op: }; yych = *YYCURSOR; if (yybm[0+yych] & 128) { - goto yy154; + goto yy155; } if (yych <= ')') { if (yych <= '\r') { - if (yych <= 0x08) goto yy152; - if (yych <= '\n') goto yy157; - if (yych >= '\r') goto yy159; + if (yych <= 0x08) goto yy153; + if (yych <= '\n') goto yy158; + if (yych >= '\r') goto yy160; } else { if (yych == '&') { yyt1 = YYCURSOR; - goto yy160; + goto yy161; } - if (yych >= ')') goto yy161; + if (yych >= ')') goto yy162; } } else { if (yych <= '=') { - if (yych <= ':') goto yy152; - if (yych <= ';') goto yy163; + if (yych <= ':') goto yy153; + if (yych <= ';') goto yy164; if (yych <= '<') { yyt1 = YYCURSOR; - goto yy165; + goto yy166; } yyt1 = YYCURSOR; - goto yy167; + goto yy168; } else { if (yych <= '>') { yyt1 = YYCURSOR; - goto yy165; + goto yy166; } if (yych == '|') { yyt1 = YYCURSOR; - goto yy168; + goto yy169; } } } -yy152: - ++YYCURSOR; yy153: - { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } + ++YYCURSOR; yy154: + { cs_log_error("Syntax error in condition on line %d", lineno); goto out; } +yy155: yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy154; + goto yy155; } { goto yyc_cond_op; } -yy157: +yy158: ++YYCURSOR; { lineno++; goto yyc_cond_op; } -yy159: - yych = *++YYCURSOR; - if (yych == '\n') goto yy157; - goto yy153; yy160: yych = *++YYCURSOR; - if (yych == '&') goto yy169; - goto yy153; + if (yych == '\n') goto yy158; + goto yy154; yy161: + yych = *++YYCURSOR; + if (yych == '&') goto yy170; + goto yy154; +yy162: ++YYCURSOR; { while (cond_op_i && sy_op_peek() != '(') { @@ -1299,7 +1304,7 @@ yy161: cond_op_i--; goto yyc_cond_op; } -yy163: +yy164: ++YYCURSOR; { while (cond_op_i) { @@ -1309,10 +1314,10 @@ yy163: if (cond_res_i > 1) { cs_log_error("invalid condition on line %d", lineno); goto out; } goto yyc_init; } -yy165: - yych = *++YYCURSOR; - if (yych == '=') goto yy169; yy166: + yych = *++YYCURSOR; + if (yych == '=') goto yy170; +yy167: t1 = yyt1; t2 = YYCURSOR; { @@ -1329,16 +1334,16 @@ yy166: sy_op_push(*t1); goto yyc_cond; } -yy167: - yych = *++YYCURSOR; - if (yych == '=') goto yy169; - goto yy153; yy168: yych = *++YYCURSOR; - if (yych != '|') goto yy153; + if (yych == '=') goto yy170; + goto yy154; yy169: + yych = *++YYCURSOR; + if (yych != '|') goto yy154; +yy170: ++YYCURSOR; - goto yy166; + goto yy167; } /* *********************************** */ yyc_rule: @@ -1379,77 +1384,77 @@ yyc_rule: }; yych = *YYCURSOR; if (yybm[0+yych] & 8) { - goto yy174; + goto yy175; } if (yych <= '\r') { - if (yych <= 0x08) goto yy172; - if (yych <= '\n') goto yy177; - if (yych >= '\r') goto yy178; + if (yych <= 0x08) goto yy173; + if (yych <= '\n') goto yy178; + if (yych >= '\r') goto yy179; } else { if (yych <= '.') { - if (yych >= '.') goto yy179; + if (yych >= '.') goto yy180; } else { - if (yych == ';') goto yy180; + if (yych == ';') goto yy181; } } -yy172: - ++YYCURSOR; yy173: - { goto end_of_rule; } + ++YYCURSOR; yy174: + { goto end_of_rule; } +yy175: yych = *++YYCURSOR; if (yybm[0+yych] & 8) { - goto yy174; + goto yy175; } { goto yyc_rule; } -yy177: +yy178: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\r') { - if (yych <= 0x08) goto yy173; + if (yych <= 0x08) goto yy174; if (yych <= '\n') { yyt1 = YYCURSOR; - goto yy182; + goto yy183; } - if (yych <= '\f') goto yy173; + if (yych <= '\f') goto yy174; yyt1 = YYCURSOR; - goto yy185; + goto yy186; } else { if (yych <= ' ') { - if (yych <= 0x1F) goto yy173; + if (yych <= 0x1F) goto yy174; yyt1 = YYCURSOR; - goto yy182; + goto yy183; } else { if (yych == '.') { yyt1 = YYCURSOR; - goto yy186; + goto yy187; } - goto yy173; + goto yy174; } } -yy178: +yy179: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych == '\n') goto yy188; - goto yy173; -yy179: + if (yych == '\n') goto yy189; + goto yy174; +yy180: yych = *++YYCURSOR; if (yych <= '^') { - if (yych <= '@') goto yy173; + if (yych <= '@') goto yy174; if (yych <= 'Z') { yyt1 = YYCURSOR; - goto yy189; + goto yy190; } - goto yy173; + goto yy174; } else { - if (yych == '`') goto yy173; + if (yych == '`') goto yy174; if (yych <= 'z') { yyt1 = YYCURSOR; - goto yy189; + goto yy190; } - goto yy173; + goto yy174; } -yy180: +yy181: ++YYCURSOR; { end_of_rule: @@ -1460,71 +1465,71 @@ yy180: } goto yyc_init; } -yy182: +yy183: yych = *++YYCURSOR; if (yybm[0+yych] & 16) { - goto yy182; + goto yy183; } - if (yych == '\r') goto yy185; - if (yych == '.') goto yy186; -yy184: + if (yych == '\r') goto yy186; + if (yych == '.') goto yy187; +yy185: YYCURSOR = YYMARKER; if (yyaccept <= 1) { if (yyaccept == 0) { - goto yy173; + goto yy174; } else { yyt3 = yyt4 = NULL; yyt2 = YYCURSOR; - goto yy191; + goto yy192; } } else { - goto yy191; + goto yy192; } -yy185: - yych = *++YYCURSOR; - if (yych == '\n') goto yy182; - goto yy184; yy186: + yych = *++YYCURSOR; + if (yych == '\n') goto yy183; + goto yy185; +yy187: ++YYCURSOR; YYCURSOR = yyt1; { lineno++; goto yyc_rule; } -yy188: +yy189: yych = *++YYCURSOR; if (yych <= '\r') { - if (yych <= 0x08) goto yy184; + if (yych <= 0x08) goto yy185; if (yych <= '\n') { yyt1 = YYCURSOR; - goto yy182; + goto yy183; } - if (yych <= '\f') goto yy184; + if (yych <= '\f') goto yy185; yyt1 = YYCURSOR; - goto yy185; + goto yy186; } else { if (yych <= ' ') { - if (yych <= 0x1F) goto yy184; + if (yych <= 0x1F) goto yy185; yyt1 = YYCURSOR; - goto yy182; + goto yy183; } else { if (yych == '.') { yyt1 = YYCURSOR; - goto yy186; + goto yy187; } - goto yy184; + goto yy185; } } -yy189: +yy190: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { - goto yy189; + goto yy190; } if (yych == '(') { yyt2 = YYCURSOR; - goto yy192; + goto yy193; } yyt3 = yyt4 = NULL; yyt2 = YYCURSOR; -yy191: +yy192: t1 = yyt1; t2 = yyt2; t3 = yyt3; @@ -1559,110 +1564,110 @@ yy191: parsed_rule[kw_i++] = kw; goto yyc_rule; } -yy192: +yy193: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '"') { - if (yych <= '!') goto yy184; + if (yych <= '!') goto yy185; yyt3 = YYCURSOR; } else { if (yych == ')') { yyt3 = yyt4 = YYCURSOR; - goto yy195; + goto yy196; } - goto yy184; + goto yy185; } } else { if (yych <= '_') { if (yych <= 'Z') { yyt3 = YYCURSOR; - goto yy196; + goto yy197; } - if (yych <= '^') goto yy184; + if (yych <= '^') goto yy185; yyt3 = YYCURSOR; - goto yy196; + goto yy197; } else { - if (yych <= '`') goto yy184; + if (yych <= '`') goto yy185; if (yych <= 'z') { yyt3 = YYCURSOR; - goto yy196; + goto yy197; } - goto yy184; + goto yy185; } } -yy193: +yy194: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy193; + goto yy194; } - if (yych <= '\r') goto yy184; - if (yych <= '"') goto yy198; - goto yy199; -yy195: - ++YYCURSOR; - goto yy191; + if (yych <= '\r') goto yy185; + if (yych <= '"') goto yy199; + goto yy200; yy196: + ++YYCURSOR; + goto yy192; +yy197: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= ')') { - if (yych <= '(') goto yy184; + if (yych <= '(') goto yy185; yyt4 = YYCURSOR; - goto yy195; + goto yy196; } else { - if (yych <= '/') goto yy184; - if (yych <= '9') goto yy196; - goto yy184; + if (yych <= '/') goto yy185; + if (yych <= '9') goto yy197; + goto yy185; } } else { if (yych <= '_') { - if (yych <= 'Z') goto yy196; - if (yych <= '^') goto yy184; - goto yy196; + if (yych <= 'Z') goto yy197; + if (yych <= '^') goto yy185; + goto yy197; } else { - if (yych <= '`') goto yy184; - if (yych <= 'z') goto yy196; - goto yy184; + if (yych <= '`') goto yy185; + if (yych <= 'z') goto yy197; + goto yy185; } } -yy198: +yy199: yych = *++YYCURSOR; if (yych == ')') { yyt4 = YYCURSOR; - goto yy195; + goto yy196; } - goto yy184; -yy199: + goto yy185; +yy200: yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy193; + goto yy194; } - if (yych <= '\r') goto yy184; - if (yych >= '#') goto yy199; + if (yych <= '\r') goto yy185; + if (yych >= '#') goto yy200; yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy199; + goto yy200; } if (yych <= '\r') { - if (yych == '\n') goto yy184; - if (yych <= '\f') goto yy193; - goto yy184; + if (yych == '\n') goto yy185; + if (yych <= '\f') goto yy194; + goto yy185; } else { if (yych <= '"') { - if (yych <= '!') goto yy193; - goto yy198; + if (yych <= '!') goto yy194; + goto yy199; } else { - if (yych != ')') goto yy193; + if (yych != ')') goto yy194; yyt4 = YYCURSOR; } } yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy193; + goto yy194; } - if (yych <= '\r') goto yy191; - if (yych <= '"') goto yy198; - goto yy199; + if (yych <= '\r') goto yy192; + if (yych <= '"') goto yy199; + goto yy200; } } diff --git a/src/sp_config_scanner.re b/src/sp_config_scanner.re index 6b52b20..d7c9884 100644 --- a/src/sp_config_scanner.re +++ b/src/sp_config_scanner.re @@ -181,7 +181,7 @@ zend_result sp_config_scan(char *data, zend_result (*process_rule)(sp_parsed_key nl { lineno++; goto yyc_init; } "sp" { kw_i = 0; goto yyc_rule; } end { ret = SUCCESS; goto out; } - "set" ws+ @t1 keyword @t2 ws+ @t3 string @t4 ws* ";"? { + "@"? "set" ws+ @t1 keyword @t2 ws+ @t3 string @t4 ws* ";"? { if (!cond_res[0]) { goto yyc_init; } char *key = (char*)t1; int keylen = t2-t1; -- cgit v1.3