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