diff options
Diffstat (limited to 'ext/json/json_scanner.c')
-rw-r--r-- | ext/json/json_scanner.c | 1322 |
1 files changed, 1322 insertions, 0 deletions
diff --git a/ext/json/json_scanner.c b/ext/json/json_scanner.c new file mode 100644 index 0000000000..ee46a13198 --- /dev/null +++ b/ext/json/json_scanner.c @@ -0,0 +1,1322 @@ +/* Generated by re2c 0.14.3 */ +/* + +----------------------------------------------------------------------+ + | PHP Version 7 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2016 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, size_t str_len, int 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 <= ']') { + if (yych <= '"') { + if (yych <= '\f') { + if (yych <= 0x08) { + if (yych >= 0x01) goto yy5; + } else { + if (yych <= '\t') goto yy7; + if (yych <= '\n') goto yy9; + goto yy5; + } + } else { + if (yych <= 0x1F) { + if (yych <= '\r') goto yy10; + goto yy5; + } else { + if (yych <= ' ') goto yy11; + if (yych <= '!') goto yy12; + goto yy14; + } + } + } else { + if (yych <= '0') { + if (yych <= ',') { + if (yych <= '+') goto yy12; + goto yy16; + } else { + if (yych <= '-') goto yy18; + if (yych <= '/') goto yy12; + goto yy19; + } + } else { + if (yych <= 'Z') { + if (yych <= '9') goto yy21; + if (yych <= ':') goto yy22; + goto yy12; + } else { + if (yych <= '[') goto yy24; + if (yych <= '\\') goto yy12; + goto yy26; + } + } + } + } else { + if (yych <= '}') { + if (yych <= 's') { + if (yych <= 'f') { + if (yych <= 'e') goto yy12; + goto yy28; + } else { + if (yych == 'n') goto yy29; + goto yy12; + } + } else { + if (yych <= 'z') { + if (yych <= 't') goto yy30; + goto yy12; + } else { + if (yych <= '{') goto yy31; + if (yych <= '|') goto yy12; + goto yy33; + } + } + } else { + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x7F) goto yy12; + goto yy35; + } else { + if (yych <= 0xDF) goto yy37; + if (yych <= 0xE0) goto yy38; + goto yy39; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy40; + if (yych <= 0xEF) goto yy41; + goto yy42; + } else { + if (yych <= 0xF3) goto yy43; + if (yych <= 0xF4) goto yy44; + goto yy35; + } + } + } + } + ++YYCURSOR; + { + if (s->limit < s->cursor) { + return PHP_JSON_T_EOI; + } else { + s->errcode = PHP_JSON_ERROR_CTRL_CHAR; + return PHP_JSON_T_ERROR; + } + } +yy5: + ++YYCURSOR; + { + s->errcode = PHP_JSON_ERROR_CTRL_CHAR; + return PHP_JSON_T_ERROR; + } +yy7: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy82; +yy8: + { goto std; } +yy9: + yych = *++YYCURSOR; + goto yy8; +yy10: + yych = *++YYCURSOR; + if (yych == '\n') goto yy83; + goto yy82; +yy11: + yych = *++YYCURSOR; + goto yy82; +yy12: + ++YYCURSOR; +yy13: + { + s->errcode = PHP_JSON_ERROR_SYNTAX; + return PHP_JSON_T_ERROR; + } +yy14: + ++YYCURSOR; + { + s->str_start = s->cursor; + s->str_esc = 0; + PHP_JSON_CONDITION_SET(STR_P1); + PHP_JSON_CONDITION_GOTO(STR_P1); + } +yy16: + ++YYCURSOR; + { return ','; } +yy18: + yych = *++YYCURSOR; + if (yych <= '/') goto yy13; + if (yych <= '0') goto yy80; + if (yych <= '9') goto yy70; + goto yy13; +yy19: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 'D') { + if (yych == '.') goto yy72; + } else { + if (yych <= 'E') goto yy73; + if (yych == 'e') goto yy73; + } +yy20: + { + 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, ZEND_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; + } + } +yy21: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy71; +yy22: + ++YYCURSOR; + { return ':'; } +yy24: + ++YYCURSOR; + { return '['; } +yy26: + ++YYCURSOR; + { return ']'; } +yy28: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'a') goto yy65; + goto yy13; +yy29: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'u') goto yy61; + goto yy13; +yy30: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'r') goto yy57; + goto yy13; +yy31: + ++YYCURSOR; + { return '{'; } +yy33: + ++YYCURSOR; + { return '}'; } +yy35: + ++YYCURSOR; +yy36: + { + s->errcode = PHP_JSON_ERROR_UTF8; + return PHP_JSON_T_ERROR; + } +yy37: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy36; + if (yych <= 0xBF) goto yy48; + goto yy36; +yy38: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x9F) goto yy36; + if (yych <= 0xBF) goto yy56; + goto yy36; +yy39: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy36; + if (yych <= 0xBF) goto yy55; + goto yy36; +yy40: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy36; + if (yych <= 0x9F) goto yy54; + goto yy36; +yy41: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy36; + if (yych <= 0xBF) goto yy53; + goto yy36; +yy42: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x8F) goto yy36; + if (yych <= 0xBF) goto yy51; + goto yy36; +yy43: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy36; + if (yych <= 0xBF) goto yy49; + goto yy36; +yy44: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy36; + if (yych >= 0x90) goto yy36; + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy47; +yy46: + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy20; + } else { + goto yy13; + } + } else { + if (yyaccept == 2) { + goto yy36; + } else { + goto yy77; + } + } +yy47: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy46; + if (yych >= 0xC0) goto yy46; +yy48: + yych = *++YYCURSOR; + goto yy13; +yy49: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy46; + if (yych >= 0xC0) goto yy46; + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy48; + goto yy46; +yy51: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy46; + if (yych >= 0xC0) goto yy46; + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy48; + goto yy46; +yy53: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy48; + goto yy46; +yy54: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy48; + goto yy46; +yy55: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy48; + goto yy46; +yy56: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy46; + if (yych <= 0xBF) goto yy48; + goto yy46; +yy57: + yych = *++YYCURSOR; + if (yych != 'u') goto yy46; + yych = *++YYCURSOR; + if (yych != 'e') goto yy46; + ++YYCURSOR; + { + ZVAL_TRUE(&s->value); + return PHP_JSON_T_TRUE; + } +yy61: + yych = *++YYCURSOR; + if (yych != 'l') goto yy46; + yych = *++YYCURSOR; + if (yych != 'l') goto yy46; + ++YYCURSOR; + { + ZVAL_NULL(&s->value); + return PHP_JSON_T_NUL; + } +yy65: + yych = *++YYCURSOR; + if (yych != 'l') goto yy46; + yych = *++YYCURSOR; + if (yych != 's') goto yy46; + yych = *++YYCURSOR; + if (yych != 'e') goto yy46; + ++YYCURSOR; + { + ZVAL_FALSE(&s->value); + return PHP_JSON_T_FALSE; + } +yy70: + yyaccept = 0; + YYMARKER = ++YYCURSOR; + yych = *YYCURSOR; +yy71: + if (yybm[0+yych] & 64) { + goto yy70; + } + if (yych <= 'D') { + if (yych != '.') goto yy20; + } else { + if (yych <= 'E') goto yy73; + if (yych == 'e') goto yy73; + goto yy20; + } +yy72: + yych = *++YYCURSOR; + if (yych <= '/') goto yy46; + if (yych <= '9') goto yy78; + goto yy46; +yy73: + yych = *++YYCURSOR; + if (yych <= ',') { + if (yych != '+') goto yy46; + } else { + if (yych <= '-') goto yy74; + if (yych <= '/') goto yy46; + if (yych <= '9') goto yy75; + goto yy46; + } +yy74: + yych = *++YYCURSOR; + if (yych <= '/') goto yy46; + if (yych >= ':') goto yy46; +yy75: + ++YYCURSOR; + yych = *YYCURSOR; + if (yych <= '/') goto yy77; + if (yych <= '9') goto yy75; +yy77: + { + ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL)); + return PHP_JSON_T_DOUBLE; + } +yy78: + yyaccept = 3; + YYMARKER = ++YYCURSOR; + yych = *YYCURSOR; + if (yych <= 'D') { + if (yych <= '/') goto yy77; + if (yych <= '9') goto yy78; + goto yy77; + } else { + if (yych <= 'E') goto yy73; + if (yych == 'e') goto yy73; + goto yy77; + } +yy80: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 'D') { + if (yych == '.') goto yy72; + goto yy20; + } else { + if (yych <= 'E') goto yy73; + if (yych == 'e') goto yy73; + goto yy20; + } +yy81: + ++YYCURSOR; + yych = *YYCURSOR; +yy82: + if (yybm[0+yych] & 128) { + goto yy81; + } + goto yy8; +yy83: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy8; + } +/* *********************************** */ +yyc_STR_P1: + yych = *YYCURSOR; + if (yych <= 0xDF) { + if (yych <= '[') { + if (yych <= 0x1F) goto yy86; + if (yych == '"') goto yy90; + goto yy88; + } else { + if (yych <= '\\') goto yy92; + if (yych <= 0x7F) goto yy88; + if (yych <= 0xC1) goto yy94; + goto yy96; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) goto yy97; + if (yych <= 0xEC) goto yy98; + if (yych <= 0xED) goto yy99; + goto yy100; + } else { + if (yych <= 0xF0) goto yy101; + if (yych <= 0xF3) goto yy102; + if (yych <= 0xF4) goto yy103; + goto yy94; + } + } +yy86: + ++YYCURSOR; + { + s->errcode = PHP_JSON_ERROR_CTRL_CHAR; + return PHP_JSON_T_ERROR; + } +yy88: + ++YYCURSOR; +yy89: + { PHP_JSON_CONDITION_GOTO(STR_P1); } +yy90: + ++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); + ZSTR_VAL(str)[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; + } + } +yy92: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 'e') { + if (yych <= '/') { + if (yych == '"') goto yy116; + if (yych >= '/') goto yy116; + } else { + if (yych <= '\\') { + if (yych >= '\\') goto yy116; + } else { + if (yych == 'b') goto yy116; + } + } + } else { + if (yych <= 'q') { + if (yych <= 'f') goto yy116; + if (yych == 'n') goto yy116; + } else { + if (yych <= 's') { + if (yych <= 'r') goto yy116; + } else { + if (yych <= 't') goto yy116; + if (yych <= 'u') goto yy118; + } + } + } +yy93: + { + s->errcode = PHP_JSON_ERROR_SYNTAX; + return PHP_JSON_T_ERROR; + } +yy94: + ++YYCURSOR; +yy95: + { + s->errcode = PHP_JSON_ERROR_UTF8; + return PHP_JSON_T_ERROR; + } +yy96: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy95; + if (yych <= 0xBF) goto yy107; + goto yy95; +yy97: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x9F) goto yy95; + if (yych <= 0xBF) goto yy115; + goto yy95; +yy98: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy95; + if (yych <= 0xBF) goto yy114; + goto yy95; +yy99: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy95; + if (yych <= 0x9F) goto yy113; + goto yy95; +yy100: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy95; + if (yych <= 0xBF) goto yy112; + goto yy95; +yy101: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x8F) goto yy95; + if (yych <= 0xBF) goto yy110; + goto yy95; +yy102: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy95; + if (yych <= 0xBF) goto yy108; + goto yy95; +yy103: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x7F) goto yy95; + if (yych >= 0x90) goto yy95; + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy106; +yy105: + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy93; + } else { + goto yy95; + } + } else { + goto yy127; + } +yy106: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy105; + if (yych >= 0xC0) goto yy105; +yy107: + yych = *++YYCURSOR; + goto yy89; +yy108: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy105; + if (yych >= 0xC0) goto yy105; + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy107; + goto yy105; +yy110: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy105; + if (yych >= 0xC0) goto yy105; + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy107; + goto yy105; +yy112: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy107; + goto yy105; +yy113: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy107; + goto yy105; +yy114: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy107; + goto yy105; +yy115: + yych = *++YYCURSOR; + if (yych <= 0x7F) goto yy105; + if (yych <= 0xBF) goto yy107; + goto yy105; +yy116: + ++YYCURSOR; + { + s->str_esc++; + PHP_JSON_CONDITION_GOTO(STR_P1); + } +yy118: + yych = *++YYCURSOR; + if (yych <= 'D') { + if (yych <= '9') { + if (yych <= '/') goto yy105; + if (yych >= '1') goto yy120; + } else { + if (yych <= '@') goto yy105; + if (yych <= 'C') goto yy120; + goto yy121; + } + } else { + if (yych <= 'c') { + if (yych <= 'F') goto yy120; + if (yych <= '`') goto yy105; + goto yy120; + } else { + if (yych <= 'd') goto yy121; + if (yych <= 'f') goto yy120; + goto yy105; + } + } + yych = *++YYCURSOR; + if (yych <= '9') { + if (yych <= '/') goto yy105; + if (yych <= '0') goto yy140; + if (yych <= '7') goto yy141; + goto yy122; + } else { + if (yych <= 'F') { + if (yych <= '@') goto yy105; + goto yy122; + } else { + if (yych <= '`') goto yy105; + if (yych <= 'f') goto yy122; + goto yy105; + } + } +yy120: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy122; + goto yy105; + } else { + if (yych <= 'F') goto yy122; + if (yych <= '`') goto yy105; + if (yych <= 'f') goto yy122; + goto yy105; + } +yy121: + yych = *++YYCURSOR; + if (yych <= 'B') { + if (yych <= '7') { + if (yych <= '/') goto yy105; + } else { + if (yych <= '9') goto yy123; + if (yych <= '@') goto yy105; + goto yy123; + } + } else { + if (yych <= '`') { + if (yych <= 'F') goto yy124; + goto yy105; + } else { + if (yych <= 'b') goto yy123; + if (yych <= 'f') goto yy124; + goto yy105; + } + } +yy122: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy137; + goto yy105; + } else { + if (yych <= 'F') goto yy137; + if (yych <= '`') goto yy105; + if (yych <= 'f') goto yy137; + goto yy105; + } +yy123: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy128; + goto yy105; + } else { + if (yych <= 'F') goto yy128; + if (yych <= '`') goto yy105; + if (yych <= 'f') goto yy128; + goto yy105; + } +yy124: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; + } else { + if (yych <= 'F') goto yy125; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; + } +yy125: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; + } else { + if (yych <= 'F') goto yy126; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; + } +yy126: + ++YYCURSOR; +yy127: + { + s->errcode = PHP_JSON_ERROR_UTF16; + return PHP_JSON_T_ERROR; + } +yy128: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; + } else { + if (yych <= 'F') goto yy129; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; + } +yy129: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych != '\\') goto yy127; + yych = *++YYCURSOR; + if (yych != 'u') goto yy105; + yych = *++YYCURSOR; + if (yych == 'D') goto yy132; + if (yych != 'd') goto yy105; +yy132: + yych = *++YYCURSOR; + if (yych <= 'B') goto yy105; + if (yych <= 'F') goto yy133; + if (yych <= 'b') goto yy105; + if (yych >= 'g') goto yy105; +yy133: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; + } else { + if (yych <= 'F') goto yy134; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; + } +yy134: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; + } else { + if (yych <= 'F') goto yy135; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; + } +yy135: + ++YYCURSOR; + { + s->str_esc += 8; + PHP_JSON_CONDITION_GOTO(STR_P1); + } +yy137: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; + } else { + if (yych <= 'F') goto yy138; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; + } +yy138: + ++YYCURSOR; + { + s->str_esc += 3; + PHP_JSON_CONDITION_GOTO(STR_P1); + } +yy140: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych <= '7') goto yy145; + if (yych <= '9') goto yy142; + goto yy105; + } else { + if (yych <= 'F') goto yy142; + if (yych <= '`') goto yy105; + if (yych <= 'f') goto yy142; + goto yy105; + } +yy141: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; + } else { + if (yych <= 'F') goto yy142; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; + } +yy142: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; + } else { + if (yych <= 'F') goto yy143; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; + } +yy143: + ++YYCURSOR; + { + s->str_esc += 4; + PHP_JSON_CONDITION_GOTO(STR_P1); + } +yy145: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy105; + if (yych >= ':') goto yy105; + } else { + if (yych <= 'F') goto yy146; + if (yych <= '`') goto yy105; + if (yych >= 'g') goto yy105; + } +yy146: + ++YYCURSOR; + { + s->str_esc += 5; + PHP_JSON_CONDITION_GOTO(STR_P1); + } +/* *********************************** */ +yyc_STR_P2: + yych = *YYCURSOR; + if (yych == '"') goto yy152; + if (yych == '\\') goto yy154; + ++YYCURSOR; + { PHP_JSON_CONDITION_GOTO(STR_P2); } +yy152: + ++YYCURSOR; + YYSETCONDITION(yycJS); + { + PHP_JSON_SCANNER_COPY_ESC(); + return PHP_JSON_T_STRING; + } +yy154: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych == 'u') goto yy156; +yy155: + { + 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); + } +yy156: + yych = *++YYCURSOR; + if (yych <= 'D') { + if (yych <= '9') { + if (yych <= '/') goto yy157; + if (yych <= '0') goto yy158; + goto yy159; + } else { + if (yych <= '@') goto yy157; + if (yych <= 'C') goto yy159; + goto yy160; + } + } else { + if (yych <= 'c') { + if (yych <= 'F') goto yy159; + if (yych >= 'a') goto yy159; + } else { + if (yych <= 'd') goto yy160; + if (yych <= 'f') goto yy159; + } + } +yy157: + YYCURSOR = YYMARKER; + goto yy155; +yy158: + yych = *++YYCURSOR; + if (yych <= '9') { + if (yych <= '/') goto yy157; + if (yych <= '0') goto yy175; + if (yych <= '7') goto yy176; + goto yy162; + } else { + if (yych <= 'F') { + if (yych <= '@') goto yy157; + goto yy162; + } else { + if (yych <= '`') goto yy157; + if (yych <= 'f') goto yy162; + goto yy157; + } + } +yy159: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych <= '9') goto yy162; + goto yy157; + } else { + if (yych <= 'F') goto yy162; + if (yych <= '`') goto yy157; + if (yych <= 'f') goto yy162; + goto yy157; + } +yy160: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych <= '7') goto yy162; + if (yych >= ':') goto yy157; + } else { + if (yych <= 'B') goto yy161; + if (yych <= '`') goto yy157; + if (yych >= 'c') goto yy157; + } +yy161: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych <= '9') goto yy166; + goto yy157; + } else { + if (yych <= 'F') goto yy166; + if (yych <= '`') goto yy157; + if (yych <= 'f') goto yy166; + goto yy157; + } +yy162: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; + } else { + if (yych <= 'F') goto yy163; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; + } +yy163: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; + } else { + if (yych <= 'F') goto yy164; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; + } +yy164: + ++YYCURSOR; + { + 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); + } +yy166: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; + } else { + if (yych <= 'F') goto yy167; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; + } +yy167: + yych = *++YYCURSOR; + if (yych != '\\') goto yy157; + yych = *++YYCURSOR; + if (yych != 'u') goto yy157; + yych = *++YYCURSOR; + if (yych == 'D') goto yy170; + if (yych != 'd') goto yy157; +yy170: + yych = *++YYCURSOR; + if (yych <= 'B') goto yy157; + if (yych <= 'F') goto yy171; + if (yych <= 'b') goto yy157; + if (yych >= 'g') goto yy157; +yy171: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; + } else { + if (yych <= 'F') goto yy172; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; + } +yy172: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; + } else { + if (yych <= 'F') goto yy173; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; + } +yy173: + ++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); + } +yy175: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych <= '7') goto yy180; + if (yych <= '9') goto yy177; + goto yy157; + } else { + if (yych <= 'F') goto yy177; + if (yych <= '`') goto yy157; + if (yych <= 'f') goto yy177; + goto yy157; + } +yy176: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; + } else { + if (yych <= 'F') goto yy177; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; + } +yy177: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; + } else { + if (yych <= 'F') goto yy178; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; + } +yy178: + ++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); + } +yy180: + yych = *++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy157; + if (yych >= ':') goto yy157; + } else { + if (yych <= 'F') goto yy181; + if (yych <= '`') goto yy157; + if (yych >= 'g') goto yy157; + } +yy181: + ++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); + } + } + + +} + |