/* 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; }