diff options
-rw-r--r-- | ext/json/json_scanner.c | 1155 | ||||
-rw-r--r-- | ext/json/php_json_scanner_defs.h | 7 |
2 files changed, 1162 insertions, 0 deletions
diff --git a/ext/json/json_scanner.c b/ext/json/json_scanner.c new file mode 100644 index 0000000000..6cd4d12fd6 --- /dev/null +++ b/ext/json/json_scanner.c @@ -0,0 +1,1155 @@ +/* Generated by re2c 0.13.6 */ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2015 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Jakub Zelenka <bukka@php.net> | + +----------------------------------------------------------------------+ +*/ + +#include "php.h" +#include "php_json_scanner.h" +#include "php_json_scanner_defs.h" +#include "php_json_parser.h" +#include "json_parser.tab.h" + +#define YYCTYPE php_json_ctype +#define YYCURSOR s->cursor +#define YYLIMIT s->limit +#define YYMARKER s->marker +#define YYCTXMARKER s->ctxmarker + +#define YYGETCONDITION() s->state +#define YYSETCONDITION(yystate) s->state = yystate + +#define YYFILL(n) + +#define PHP_JSON_CONDITION_SET(condition) YYSETCONDITION(yyc##condition) +#define PHP_JSON_CONDITION_GOTO(condition) goto yyc_##condition + +#define PHP_JSON_SCANNER_COPY_ESC() php_json_scanner_copy_string(s, 0) +#define PHP_JSON_SCANNER_COPY_UTF() php_json_scanner_copy_string(s, 5) +#define PHP_JSON_SCANNER_COPY_UTF_SP() php_json_scanner_copy_string(s, 11) + +#define PHP_JSON_INT_MAX_LENGTH (MAX_LENGTH_OF_LONG - 1) + + +static void php_json_scanner_copy_string(php_json_scanner *s, int esc_size) +{ + size_t len = s->cursor - s->str_start - esc_size - 1; + if (len) { + memcpy(s->pstr, s->str_start, len); + s->pstr += len; + } +} + +static int php_json_hex_to_int(char code) +{ + if (code >= '0' && code <= '9') { + return code - '0'; + } else if (code >= 'A' && code <= 'F') { + return code - ('A' - 10); + } else if (code >= 'a' && code <= 'f') { + return code - ('a' - 10); + } else { + /* this should never happened (just to suppress compiler warning) */ + return -1; + } +} + +static int php_json_ucs2_to_int_ex(php_json_scanner *s, int size, int start) +{ + int i, code = 0; + php_json_ctype *pc = s->cursor - start; + for (i = 0; i < size; i++) { + code |= php_json_hex_to_int(*(pc--)) << (i * 4); + } + return code; +} + +static int php_json_ucs2_to_int(php_json_scanner *s, int size) +{ + return php_json_ucs2_to_int_ex(s, size, 1); +} + +void php_json_scanner_init(php_json_scanner *s, char *str, int str_len, long options) +{ + s->cursor = (php_json_ctype *) str; + s->limit = (php_json_ctype *) str + str_len; + s->options = options; + PHP_JSON_CONDITION_SET(JS); +} + +int php_json_scan(php_json_scanner *s) +{ + ZVAL_NULL(&s->value); + +std: + s->token = s->cursor; + + + { + YYCTYPE yych; + unsigned int yyaccept = 0; + if (YYGETCONDITION() < 1) { + goto yyc_JS; + } else { + if (YYGETCONDITION() < 2) { + goto yyc_STR_P1; + } else { + goto yyc_STR_P2; + } + } +/* *********************************** */ +yyc_JS: + { + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *YYCURSOR; + if (yych <= '9') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy3; + if (yych <= 0x08) goto yy5; + if (yych <= '\t') goto yy7; + goto yy9; + } else { + if (yych == '\r') goto yy10; + if (yych <= 0x1F) goto yy5; + goto yy7; + } + } else { + if (yych <= ',') { + if (yych == '"') goto yy11; + if (yych <= '+') goto yy5; + goto yy13; + } else { + if (yych <= '-') goto yy15; + if (yych <= '/') goto yy5; + if (yych <= '0') goto yy16; + goto yy18; + } + } + } else { + if (yych <= 'm') { + if (yych <= '\\') { + if (yych <= ':') goto yy19; + if (yych == '[') goto yy21; + goto yy5; + } else { + if (yych <= ']') goto yy23; + if (yych == 'f') goto yy25; + goto yy5; + } + } else { + if (yych <= 'z') { + if (yych <= 'n') goto yy26; + if (yych == 't') goto yy27; + goto yy5; + } else { + if (yych <= '{') goto yy28; + if (yych == '}') goto yy30; + goto yy5; + } + } + } +yy3: + ++YYCURSOR; + { + if (s->limit < s->cursor) { + return PHP_JSON_T_EOI; + } else { + s->errcode = PHP_JSON_ERROR_SYNTAX; + return PHP_JSON_T_ERROR; + } + } +yy5: + ++YYCURSOR; +yy6: + { + s->errcode = PHP_JSON_ERROR_SYNTAX; + return PHP_JSON_T_ERROR; + } +yy7: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy58; +yy8: + { goto std; } +yy9: + yych = *++YYCURSOR; + goto yy8; +yy10: + yych = *++YYCURSOR; + if (yych == '\n') goto yy59; + goto yy58; +yy11: + ++YYCURSOR; + { + s->str_start = s->cursor; + s->str_esc = 0; + PHP_JSON_CONDITION_SET(STR_P1); + PHP_JSON_CONDITION_GOTO(STR_P1); + } +yy13: + ++YYCURSOR; + { return ','; } +yy15: + yych = *++YYCURSOR; + if (yych <= '/') goto yy6; + if (yych <= '0') goto yy56; + if (yych <= '9') goto yy46; + goto yy6; +yy16: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 'D') { + if (yych == '.') goto yy48; + } else { + if (yych <= 'E') goto yy49; + if (yych == 'e') goto yy49; + } +yy17: + { + zend_bool bigint = 0, negative = s->token[0] == '-'; + size_t digits = (size_t) (s->cursor - s->token - negative); + if (digits >= PHP_JSON_INT_MAX_LENGTH) { + if (digits == PHP_JSON_INT_MAX_LENGTH) { + int cmp = strncmp((char *) (s->token + negative), LONG_MIN_DIGITS, PHP_JSON_INT_MAX_LENGTH); + if (!(cmp < 0 || (cmp == 0 && negative))) { + bigint = 1; + } + } else { + bigint = 1; + } + } + if (!bigint) { + ZVAL_LONG(&s->value, strtol((char *) s->token, NULL, 10)); + return PHP_JSON_T_INT; + } else if (s->options & PHP_JSON_BIGINT_AS_STRING) { + ZVAL_STRINGL(&s->value, (char *) s->token, s->cursor - s->token); + return PHP_JSON_T_STRING; + } else { + ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL)); + return PHP_JSON_T_DOUBLE; + } + } +yy18: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy47; +yy19: + ++YYCURSOR; + { return ':'; } +yy21: + ++YYCURSOR; + { return '['; } +yy23: + ++YYCURSOR; + { return ']'; } +yy25: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'a') goto yy41; + goto yy6; +yy26: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'u') goto yy37; + goto yy6; +yy27: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'r') goto yy32; + goto yy6; +yy28: + ++YYCURSOR; + { return '{'; } +yy30: + ++YYCURSOR; + { return '}'; } +yy32: + yych = *++YYCURSOR; + if (yych == 'u') goto yy34; +yy33: + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy17; + } else { + goto yy6; + } + } else { + goto yy53; + } +yy34: + yych = *++YYCURSOR; + if (yych != 'e') goto yy33; + ++YYCURSOR; + { + ZVAL_TRUE(&s->value); + return PHP_JSON_T_TRUE; + } +yy37: + yych = *++YYCURSOR; + if (yych != 'l') goto yy33; + yych = *++YYCURSOR; + if (yych != 'l') goto yy33; + ++YYCURSOR; + { + ZVAL_NULL(&s->value); + return PHP_JSON_T_NUL; + } +yy41: + yych = *++YYCURSOR; + if (yych != 'l') goto yy33; + yych = *++YYCURSOR; + if (yych != 's') goto yy33; + yych = *++YYCURSOR; + if (yych != 'e') goto yy33; + ++YYCURSOR; + { + ZVAL_FALSE(&s->value); + return PHP_JSON_T_FALSE; + } +yy46: + yyaccept = 0; + YYMARKER = ++YYCURSOR; + yych = *YYCURSOR; +yy47: + if (yybm[0+yych] & 64) { + goto yy46; + } + if (yych <= 'D') { + if (yych != '.') goto yy17; + } else { + if (yych <= 'E') goto yy49; + if (yych == 'e') goto yy49; + goto yy17; + } +yy48: + yych = *++YYCURSOR; + if (yych <= '/') goto yy33; + if (yych <= '9') goto yy54; + goto yy33; +yy49: + yych = *++YYCURSOR; + if (yych <= ',') { + if (yych != '+') goto yy33; + } else { + if (yych <= '-') goto yy50; + if (yych <= '/') goto yy33; + if (yych <= '9') goto yy51; + goto yy33; + } +yy50: + yych = *++YYCURSOR; + if (yych <= '/') goto yy33; + if (yych >= ':') goto yy33; +yy51: + ++YYCURSOR; + yych = *YYCURSOR; + if (yych <= '/') goto yy53; + if (yych <= '9') goto yy51; +yy53: + { + ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL)); + return PHP_JSON_T_DOUBLE; + } +yy54: + yyaccept = 2; + YYMARKER = ++YYCURSOR; + yych = *YYCURSOR; + if (yych <= 'D') { + if (yych <= '/') goto yy53; + if (yych <= '9') goto yy54; + goto yy53; + } else { + if (yych <= 'E') goto yy49; + if (yych == 'e') goto yy49; + goto yy53; + } +yy56: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 'D') { + if (yych == '.') goto yy48; + goto yy17; + } else { + if (yych <= 'E') goto yy49; + if (yych == 'e') goto yy49; + goto yy17; + } +yy57: + ++YYCURSOR; + yych = *YYCURSOR; +yy58: + if (yybm[0+yych] & 128) { + goto yy57; + } + goto yy8; +yy59: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy8; + } +/* *********************************** */ +yyc_STR_P1: + yych = *YYCURSOR; + if (yych <= 0xDF) { + if (yych <= '[') { + if (yych <= 0x1F) goto yy62; + if (yych == '"') goto yy66; + goto yy64; + } else { + if (yych <= '\\') goto yy68; + if (yych <= 0x7F) goto yy64; + if (yych <= 0xC1) goto yy70; + goto yy72; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) goto yy73; + if (yych <= 0xEC) goto yy74; + if (yych <= 0xED) goto yy75; + goto yy76; + } else { + if (yych <= 0xF0) goto yy77; + if (yych <= 0xF3) goto yy78; + if (yych <= 0xF4) goto yy79; + goto yy70; + } + } +yy62: + ++YYCURSOR; + { + s->errcode = PHP_JSON_ERROR_CTRL_CHAR; + return PHP_JSON_T_ERROR; + } +yy64: + ++YYCURSOR; +yy65: + { PHP_JSON_CONDITION_GOTO(STR_P1); } +yy66: + ++YYCURSOR; + { + zend_string *str; + size_t len = s->cursor - s->str_start - s->str_esc - 1; + if (len == 0) { + PHP_JSON_CONDITION_SET(JS); + ZVAL_EMPTY_STRING(&s->value); + return PHP_JSON_T_ESTRING; + } + str = zend_string_alloc(len, 0); + str->val[len] = '\0'; + ZVAL_STR(&s->value, str); + if (s->str_esc) { + s->pstr = (php_json_ctype *) Z_STRVAL(s->value); + s->cursor = s->str_start; + PHP_JSON_CONDITION_SET(STR_P2); + PHP_JSON_CONDITION_GOTO(STR_P2); + } else { + memcpy(Z_STRVAL(s->value), s->str_start, len); + PHP_JSON_CONDITION_SET(JS); + return PHP_JSON_T_STRING; + } + } +yy68: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 'e') { + if (yych <= '/') { + if (yych == '"') goto yy92; + if (yych >= '/') goto yy92; + } else { + if (yych <= '\\') { + if (yych >= '\\') goto yy92; + } else { + if (yych == 'b') goto yy92; + } + } + } else { + if (yych <= 'q') { + if (yych <= 'f') goto yy92; + if (yych == 'n') goto yy92; + } else { + if (yych <= 's') { + if (yych <= 'r') goto yy92; + } else { + if (yych <= 't') goto yy92; + if (yych <= 'u') goto yy94; + } + } + } +yy69: + { + s->errcode = PHP_JSON_ERROR_SYNTAX; + return PHP_JSON_T_ERROR; + } +yy70: + ++YYCURSOR; +yy71: + { + s->errcode = PHP_JSON_ERROR_UTF8; + return PHP_JSON_T_ERROR; + } +yy72: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy71; + if (yych <= 0xBF) goto yy83; + goto yy71; +yy73: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x9F) goto yy71; + if (yych <= 0xBF) goto yy91; + goto yy71; +yy74: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy71; + if (yych <= 0xBF) goto yy90; + goto yy71; +yy75: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy71; + if (yych <= 0x9F) goto yy89; + goto yy71; +yy76: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy71; + if (yych <= 0xBF) goto yy88; + goto yy71; +yy77: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x8F) goto yy71; + if (yych <= 0xBF) goto yy86; + goto yy71; +yy78: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy71; + if (yych <= 0xBF) goto yy84; + goto yy71; +yy79: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy71; + if (yych >= 0x90) goto yy71; + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy81; + if (yych <= 0xBF) goto yy82; +yy81: + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy69; + } else { + goto yy71; + } + } else { + goto yy101; + } +yy82: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy81; + if (yych >= 0xC0) goto yy81; +yy83: + yych = *++YYCURSOR; + goto yy65; +yy84: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy81; + if (yych >= 0xC0) goto yy81; + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy81; + if (yych <= 0xBF) goto yy83; + goto yy81; +yy86: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy81; + if (yych >= 0xC0) goto yy81; + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy81; + if (yych <= 0xBF) goto yy83; + goto yy81; +yy88: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy81; + if (yych <= 0xBF) goto yy83; + goto yy81; +yy89: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy81; + if (yych <= 0xBF) goto yy83; + goto yy81; +yy90: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy81; + if (yych <= 0xBF) goto yy83; + goto yy81; +yy91: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy81; + if (yych <= 0xBF) goto yy83; + goto yy81; +yy92: + ++YYCURSOR; + { + s->str_esc++; + PHP_JSON_CONDITION_GOTO(STR_P1); + } +yy94: + yych = *++YYCURSOR; + if (yych <= 'D') { + if (yych <= '9') { + if (yych <= '/') goto yy81; + if (yych >= '1') goto yy97; + } else { + if (yych <= '@') goto yy81; + if (yych <= 'C') goto yy97; + goto yy96; + } + } else { + if (yych <= 'c') { + if (yych <= 'F') goto yy97; + if (yych <= '`') goto yy81; + goto yy97; + } else { + if (yych <= 'd') goto yy96; + if (yych <= 'f') goto yy97; + goto yy81; + } + } + yych = *++YYCURSOR; + if (yych <= '9') { + if (yych <= '/') goto yy81; + if (yych <= '0') goto yy112; + if (yych <= '7') goto yy113; + goto yy98; + } else { + if (yych <= 'F') { + if (yych <= '@') goto yy81; + goto yy98; + } else { + if (yych <= '`') goto yy81; + if (yych <= 'f') goto yy98; + goto yy81; + } + } +yy96: + yych = *++YYCURSOR; + if (yych <= 'B') { + if (yych <= '7') { + if (yych <= '/') goto yy81; + goto yy98; + } else { + if (yych <= '9') goto yy102; + if (yych <= '@') goto yy81; + goto yy102; + } + } else { + if (yych <= '`') { + if (yych <= 'F') goto yy98; + goto yy81; + } else { + if (yych <= 'b') goto yy102; + if (yych <= 'f') goto yy98; + goto yy81; + } + } +yy97: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy81; + if (yych >= ':') goto yy81; + } else { + if (yych <= 'F') goto yy98; + if (yych <= '`') goto yy81; + if (yych >= 'g') goto yy81; + } +yy98: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy81; + if (yych >= ':') goto yy81; + } else { + if (yych <= 'F') goto yy99; + if (yych <= '`') goto yy81; + if (yych >= 'g') goto yy81; + } +yy99: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy81; + if (yych >= ':') goto yy81; + } else { + if (yych <= 'F') goto yy100; + if (yych <= '`') goto yy81; + if (yych >= 'g') goto yy81; + } +yy100: + ++YYCURSOR; +yy101: + { + s->str_esc += 3; + PHP_JSON_CONDITION_GOTO(STR_P1); + } +yy102: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy81; + if (yych >= ':') goto yy81; + } else { + if (yych <= 'F') goto yy103; + if (yych <= '`') goto yy81; + if (yych >= 'g') goto yy81; + } +yy103: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy81; + if (yych >= ':') goto yy81; + } else { + if (yych <= 'F') goto yy104; + if (yych <= '`') goto yy81; + if (yych >= 'g') goto yy81; + } +yy104: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych != '\\') goto yy101; + yych = *++YYCURSOR; + if (yych != 'u') goto yy81; + yych = *++YYCURSOR; + if (yych == 'D') goto yy107; + if (yych != 'd') goto yy81; +yy107: + yych = *++YYCURSOR; + if (yych <= 'B') goto yy81; + if (yych <= 'F') goto yy108; + if (yych <= 'b') goto yy81; + if (yych >= 'g') goto yy81; +yy108: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy81; + if (yych >= ':') goto yy81; + } else { + if (yych <= 'F') goto yy109; + if (yych <= '`') goto yy81; + if (yych >= 'g') goto yy81; + } +yy109: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy81; + if (yych >= ':') goto yy81; + } else { + if (yych <= 'F') goto yy110; + if (yych <= '`') goto yy81; + if (yych >= 'g') goto yy81; + } +yy110: + ++YYCURSOR; + { + s->str_esc += 8; + PHP_JSON_CONDITION_GOTO(STR_P1); + } +yy112: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy81; + if (yych <= '7') goto yy117; + if (yych <= '9') goto yy114; + goto yy81; + } else { + if (yych <= 'F') goto yy114; + if (yych <= '`') goto yy81; + if (yych <= 'f') goto yy114; + goto yy81; + } +yy113: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy81; + if (yych >= ':') goto yy81; + } else { + if (yych <= 'F') goto yy114; + if (yych <= '`') goto yy81; + if (yych >= 'g') goto yy81; + } +yy114: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy81; + if (yych >= ':') goto yy81; + } else { + if (yych <= 'F') goto yy115; + if (yych <= '`') goto yy81; + if (yych >= 'g') goto yy81; + } +yy115: + ++YYCURSOR; + { + s->str_esc += 4; + PHP_JSON_CONDITION_GOTO(STR_P1); + } +yy117: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy81; + if (yych >= ':') goto yy81; + } else { + if (yych <= 'F') goto yy118; + if (yych <= '`') goto yy81; + if (yych >= 'g') goto yy81; + } +yy118: + ++YYCURSOR; + { + s->str_esc += 5; + PHP_JSON_CONDITION_GOTO(STR_P1); + } +/* *********************************** */ +yyc_STR_P2: + yych = *YYCURSOR; + if (yych == '"') goto yy124; + if (yych == '\\') goto yy126; + ++YYCURSOR; + { PHP_JSON_CONDITION_GOTO(STR_P2); } +yy124: + ++YYCURSOR; + YYSETCONDITION(yycJS); + { + PHP_JSON_SCANNER_COPY_ESC(); + return PHP_JSON_T_STRING; + } +yy126: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'u') goto yy128; +yy127: + { + char esc; + PHP_JSON_SCANNER_COPY_ESC(); + switch (*s->cursor) { + case 'b': + esc = '\b'; + break; + case 'f': + esc = '\f'; + break; + case 'n': + esc = '\n'; + break; + case 'r': + esc = '\r'; + break; + case 't': + esc = '\t'; + break; + case '\\': + case '/': + case '"': + esc = *s->cursor; + break; + default: + s->errcode = PHP_JSON_ERROR_SYNTAX; + return PHP_JSON_T_ERROR; + } + *(s->pstr++) = esc; + ++YYCURSOR; + s->str_start = s->cursor; + PHP_JSON_CONDITION_GOTO(STR_P2); + } +yy128: + yych = *++YYCURSOR; + if (yych <= 'D') { + if (yych <= '9') { + if (yych <= '/') goto yy129; + if (yych <= '0') goto yy130; + goto yy132; + } else { + if (yych <= '@') goto yy129; + if (yych <= 'C') goto yy132; + goto yy131; + } + } else { + if (yych <= 'c') { + if (yych <= 'F') goto yy132; + if (yych >= 'a') goto yy132; + } else { + if (yych <= 'd') goto yy131; + if (yych <= 'f') goto yy132; + } + } +yy129: + YYCURSOR = YYMARKER; + if (yyaccept == 0) { + goto yy127; + } else { + goto yy136; + } +yy130: + yych = *++YYCURSOR; + if (yych <= '9') { + if (yych <= '/') goto yy129; + if (yych <= '0') goto yy147; + if (yych <= '7') goto yy148; + goto yy133; + } else { + if (yych <= 'F') { + if (yych <= '@') goto yy129; + goto yy133; + } else { + if (yych <= '`') goto yy129; + if (yych <= 'f') goto yy133; + goto yy129; + } + } +yy131: + yych = *++YYCURSOR; + if (yych <= 'B') { + if (yych <= '7') { + if (yych <= '/') goto yy129; + goto yy133; + } else { + if (yych <= '9') goto yy137; + if (yych <= '@') goto yy129; + goto yy137; + } + } else { + if (yych <= '`') { + if (yych <= 'F') goto yy133; + goto yy129; + } else { + if (yych <= 'b') goto yy137; + if (yych <= 'f') goto yy133; + goto yy129; + } + } +yy132: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy129; + if (yych >= ':') goto yy129; + } else { + if (yych <= 'F') goto yy133; + if (yych <= '`') goto yy129; + if (yych >= 'g') goto yy129; + } +yy133: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy129; + if (yych >= ':') goto yy129; + } else { + if (yych <= 'F') goto yy134; + if (yych <= '`') goto yy129; + if (yych >= 'g') goto yy129; + } +yy134: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy129; + if (yych >= ':') goto yy129; + } else { + if (yych <= 'F') goto yy135; + if (yych <= '`') goto yy129; + if (yych >= 'g') goto yy129; + } +yy135: + ++YYCURSOR; +yy136: + { + int utf16 = php_json_ucs2_to_int(s, 4); + PHP_JSON_SCANNER_COPY_UTF(); + *(s->pstr++) = (char) (0xe0 | (utf16 >> 12)); + *(s->pstr++) = (char) (0x80 | ((utf16 >> 6) & 0x3f)); + *(s->pstr++) = (char) (0x80 | (utf16 & 0x3f)); + s->str_start = s->cursor; + PHP_JSON_CONDITION_GOTO(STR_P2); + } +yy137: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy129; + if (yych >= ':') goto yy129; + } else { + if (yych <= 'F') goto yy138; + if (yych <= '`') goto yy129; + if (yych >= 'g') goto yy129; + } +yy138: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy129; + if (yych >= ':') goto yy129; + } else { + if (yych <= 'F') goto yy139; + if (yych <= '`') goto yy129; + if (yych >= 'g') goto yy129; + } +yy139: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych != '\\') goto yy136; + yych = *++YYCURSOR; + if (yych != 'u') goto yy129; + yych = *++YYCURSOR; + if (yych == 'D') goto yy142; + if (yych != 'd') goto yy129; +yy142: + yych = *++YYCURSOR; + if (yych <= 'B') goto yy129; + if (yych <= 'F') goto yy143; + if (yych <= 'b') goto yy129; + if (yych >= 'g') goto yy129; +yy143: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy129; + if (yych >= ':') goto yy129; + } else { + if (yych <= 'F') goto yy144; + if (yych <= '`') goto yy129; + if (yych >= 'g') goto yy129; + } +yy144: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy129; + if (yych >= ':') goto yy129; + } else { + if (yych <= 'F') goto yy145; + if (yych <= '`') goto yy129; + if (yych >= 'g') goto yy129; + } +yy145: + ++YYCURSOR; + { + int utf32, utf16_hi, utf16_lo; + utf16_hi = php_json_ucs2_to_int(s, 4); + utf16_lo = php_json_ucs2_to_int_ex(s, 4, 7); + utf32 = ((utf16_lo & 0x3FF) << 10) + (utf16_hi & 0x3FF) + 0x10000; + PHP_JSON_SCANNER_COPY_UTF_SP(); + *(s->pstr++) = (char) (0xf0 | (utf32 >> 18)); + *(s->pstr++) = (char) (0x80 | ((utf32 >> 12) & 0x3f)); + *(s->pstr++) = (char) (0x80 | ((utf32 >> 6) & 0x3f)); + *(s->pstr++) = (char) (0x80 | (utf32 & 0x3f)); + s->str_start = s->cursor; + PHP_JSON_CONDITION_GOTO(STR_P2); + } +yy147: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy129; + if (yych <= '7') goto yy152; + if (yych <= '9') goto yy149; + goto yy129; + } else { + if (yych <= 'F') goto yy149; + if (yych <= '`') goto yy129; + if (yych <= 'f') goto yy149; + goto yy129; + } +yy148: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy129; + if (yych >= ':') goto yy129; + } else { + if (yych <= 'F') goto yy149; + if (yych <= '`') goto yy129; + if (yych >= 'g') goto yy129; + } +yy149: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy129; + if (yych >= ':') goto yy129; + } else { + if (yych <= 'F') goto yy150; + if (yych <= '`') goto yy129; + if (yych >= 'g') goto yy129; + } +yy150: + ++YYCURSOR; + { + int utf16 = php_json_ucs2_to_int(s, 3); + PHP_JSON_SCANNER_COPY_UTF(); + *(s->pstr++) = (char) (0xc0 | (utf16 >> 6)); + *(s->pstr++) = (char) (0x80 | (utf16 & 0x3f)); + s->str_start = s->cursor; + PHP_JSON_CONDITION_GOTO(STR_P2); + } +yy152: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy129; + if (yych >= ':') goto yy129; + } else { + if (yych <= 'F') goto yy153; + if (yych <= '`') goto yy129; + if (yych >= 'g') goto yy129; + } +yy153: + ++YYCURSOR; + { + int utf16 = php_json_ucs2_to_int(s, 2); + PHP_JSON_SCANNER_COPY_UTF(); + *(s->pstr++) = (char) utf16; + s->str_start = s->cursor; + PHP_JSON_CONDITION_GOTO(STR_P2); + } + } + + +} + diff --git a/ext/json/php_json_scanner_defs.h b/ext/json/php_json_scanner_defs.h new file mode 100644 index 0000000000..e1a5824dd3 --- /dev/null +++ b/ext/json/php_json_scanner_defs.h @@ -0,0 +1,7 @@ +/* Generated by re2c 0.13.6 */ + +enum YYCONDTYPE { + yycJS, + yycSTR_P1, + yycSTR_P2, +}; |