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/Makefile.frag | 7 +- src/config.m4 | 2 +- src/sp_config_scanner.cached.c | 670 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 677 insertions(+), 2 deletions(-) create mode 100644 src/sp_config_scanner.cached.c (limited to 'src') diff --git a/src/Makefile.frag b/src/Makefile.frag index c8458ea..1236599 100644 --- a/src/Makefile.frag +++ b/src/Makefile.frag @@ -1,2 +1,7 @@ $(srcdir)/sp_config_scanner.c: $(srcdir)/sp_config_scanner.re - @$(RE2C) $(RE2C_FLAGS) --no-generation-date -bc -o $@ $< + if re2c -v |grep ' 2\.' 2>/dev/null; then \ + re2c -bc -o $@ $<; \ + re2c --no-generation-date --no-version -bci -o $(srcdir)/sp_config_scanner.cached.c $<; \ + else \ + cp $(srcdir)/sp_config_scanner.cached.c $@; \ + fi; diff --git a/src/config.m4 b/src/config.m4 index f825cea..a2301fd 100644 --- a/src/config.m4 +++ b/src/config.m4 @@ -41,5 +41,5 @@ if test "$PHP_SNUFFLEUPAGUS" = "yes"; then PHP_NEW_EXTENSION(snuffleupagus, $sources, $ext_shared,-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) fi -PHP_PROG_RE2C([2.0]) +# PHP_PROG_RE2C([2.0]) PHP_ADD_MAKEFILE_FRAGMENT() 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