/* Generated by re2c 0.16 */ /* +----------------------------------------------------------------------+ | PHP Version 7 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2018 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 | +----------------------------------------------------------------------+ */ #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_CONDITION_SET_AND_GOTO(condition) \ PHP_JSON_CONDITION_SET(condition); \ PHP_JSON_CONDITION_GOTO(condition) #define PHP_JSON_CONDITION_GOTO_STR_P2() \ do { \ if (s->utf8_invalid) { \ PHP_JSON_CONDITION_GOTO(STR_P2_BIN); \ } else { \ PHP_JSON_CONDITION_GOTO(STR_P2_UTF); \ } \ } while(0) #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() < 2) { if (YYGETCONDITION() < 1) { goto yyc_JS; } else { goto yyc_STR_P1; } } else { if (YYGETCONDITION() < 3) { goto yyc_STR_P2_BIN; } else { goto yyc_STR_P2_UTF; } } /* *********************************** */ yyc_JS: { static const unsigned char yybm[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 yy10; goto yy5; } } else { if (yych <= 0x1F) { if (yych <= '\r') goto yy11; goto yy5; } else { if (yych <= ' ') goto yy7; 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 yy23; goto yy12; } else { if (yych <= '[') goto yy25; if (yych <= '\\') goto yy12; goto yy27; } } } } else { if (yych <= '}') { if (yych <= 's') { if (yych <= 'f') { if (yych <= 'e') goto yy12; goto yy29; } else { if (yych == 'n') goto yy30; goto yy12; } } else { if (yych <= 'z') { if (yych <= 't') goto yy31; goto yy12; } else { if (yych <= '{') goto yy32; if (yych <= '|') goto yy12; goto yy34; } } } else { if (yych <= 0xEC) { if (yych <= 0xC1) { if (yych <= 0x7F) goto yy12; goto yy36; } else { if (yych <= 0xDF) goto yy38; if (yych <= 0xE0) goto yy39; goto yy40; } } else { if (yych <= 0xF0) { if (yych <= 0xED) goto yy41; if (yych <= 0xEF) goto yy40; goto yy42; } else { if (yych <= 0xF3) goto yy43; if (yych <= 0xF4) goto yy44; goto yy36; } } } } ++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; yy8: if (yybm[0+yych] & 64) { goto yy7; } yy9: { goto std; } yy10: yych = *++YYCURSOR; goto yy9; yy11: yych = *++YYCURSOR; if (yych == '\n') goto yy10; goto yy8; 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; s->utf8_invalid = 0; s->utf8_invalid_count = 0; PHP_JSON_CONDITION_SET_AND_GOTO(STR_P1); } yy16: ++YYCURSOR; { return ','; } yy18: yych = *++YYCURSOR; if (yych <= '/') goto yy13; if (yych <= '0') goto yy19; if (yych <= '9') goto yy21; goto yy13; yy19: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { if (yych == '.') goto yy45; } else { if (yych <= 'E') goto yy47; if (yych == 'e') goto yy47; } 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; YYMARKER = ++YYCURSOR; yych = *YYCURSOR; if (yybm[0+yych] & 128) { goto yy21; } if (yych <= 'D') { if (yych == '.') goto yy45; goto yy20; } else { if (yych <= 'E') goto yy47; if (yych == 'e') goto yy47; goto yy20; } yy23: ++YYCURSOR; { return ':'; } yy25: ++YYCURSOR; { return '['; } yy27: ++YYCURSOR; { return ']'; } yy29: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'a') goto yy48; goto yy13; yy30: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'u') goto yy49; goto yy13; yy31: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'r') goto yy50; goto yy13; yy32: ++YYCURSOR; { return '{'; } yy34: ++YYCURSOR; { return '}'; } yy36: ++YYCURSOR; yy37: { s->errcode = PHP_JSON_ERROR_UTF8; return PHP_JSON_T_ERROR; } yy38: yych = *++YYCURSOR; if (yych <= 0x7F) goto yy37; if (yych <= 0xBF) goto yy12; goto yy37; yy39: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x9F) goto yy37; if (yych <= 0xBF) goto yy51; goto yy37; yy40: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x7F) goto yy37; if (yych <= 0xBF) goto yy51; goto yy37; yy41: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x7F) goto yy37; if (yych <= 0x9F) goto yy51; goto yy37; yy42: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x8F) goto yy37; if (yych <= 0xBF) goto yy52; goto yy37; yy43: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x7F) goto yy37; if (yych <= 0xBF) goto yy52; goto yy37; yy44: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x7F) goto yy37; if (yych <= 0x8F) goto yy52; goto yy37; yy45: yych = *++YYCURSOR; if (yych <= '/') goto yy46; if (yych <= '9') goto yy53; yy46: YYCURSOR = YYMARKER; if (yyaccept <= 1) { if (yyaccept == 0) { goto yy20; } else { goto yy13; } } else { if (yyaccept == 2) { goto yy37; } else { goto yy55; } } yy47: yych = *++YYCURSOR; if (yych <= ',') { if (yych == '+') goto yy56; goto yy46; } else { if (yych <= '-') goto yy56; if (yych <= '/') goto yy46; if (yych <= '9') goto yy57; goto yy46; } yy48: yych = *++YYCURSOR; if (yych == 'l') goto yy59; goto yy46; yy49: yych = *++YYCURSOR; if (yych == 'l') goto yy60; goto yy46; yy50: yych = *++YYCURSOR; if (yych == 'u') goto yy61; goto yy46; yy51: yych = *++YYCURSOR; if (yych <= 0x7F) goto yy46; if (yych <= 0xBF) goto yy12; goto yy46; yy52: yych = *++YYCURSOR; if (yych <= 0x7F) goto yy46; if (yych <= 0xBF) goto yy51; goto yy46; yy53: yyaccept = 3; YYMARKER = ++YYCURSOR; yych = *YYCURSOR; if (yych <= 'D') { if (yych <= '/') goto yy55; if (yych <= '9') goto yy53; } else { if (yych <= 'E') goto yy47; if (yych == 'e') goto yy47; } yy55: { ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL)); return PHP_JSON_T_DOUBLE; } yy56: yych = *++YYCURSOR; if (yych <= '/') goto yy46; if (yych >= ':') goto yy46; yy57: ++YYCURSOR; yych = *YYCURSOR; if (yych <= '/') goto yy55; if (yych <= '9') goto yy57; goto yy55; yy59: yych = *++YYCURSOR; if (yych == 's') goto yy62; goto yy46; yy60: yych = *++YYCURSOR; if (yych == 'l') goto yy63; goto yy46; yy61: yych = *++YYCURSOR; if (yych == 'e') goto yy65; goto yy46; yy62: yych = *++YYCURSOR; if (yych == 'e') goto yy67; goto yy46; yy63: ++YYCURSOR; { ZVAL_NULL(&s->value); return PHP_JSON_T_NUL; } yy65: ++YYCURSOR; { ZVAL_TRUE(&s->value); return PHP_JSON_T_TRUE; } yy67: ++YYCURSOR; { ZVAL_FALSE(&s->value); return PHP_JSON_T_FALSE; } } /* *********************************** */ yyc_STR_P1: yych = *YYCURSOR; if (yych <= 0xDF) { if (yych <= '[') { if (yych <= 0x1F) goto yy71; if (yych == '"') goto yy75; goto yy73; } else { if (yych <= '\\') goto yy77; if (yych <= 0x7F) goto yy73; if (yych <= 0xC1) goto yy79; goto yy81; } } else { if (yych <= 0xEF) { if (yych <= 0xE0) goto yy82; if (yych == 0xED) goto yy84; goto yy83; } else { if (yych <= 0xF0) goto yy85; if (yych <= 0xF3) goto yy86; if (yych <= 0xF4) goto yy87; goto yy79; } } yy71: ++YYCURSOR; { s->errcode = PHP_JSON_ERROR_CTRL_CHAR; return PHP_JSON_T_ERROR; } yy73: ++YYCURSOR; { PHP_JSON_CONDITION_GOTO(STR_P1); } yy75: ++YYCURSOR; { zend_string *str; size_t len = s->cursor - s->str_start - s->str_esc - 1 + s->utf8_invalid_count; 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->utf8_invalid) { s->pstr = (php_json_ctype *) Z_STRVAL(s->value); s->cursor = s->str_start; 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; } } yy77: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'e') { if (yych <= '/') { if (yych == '"') goto yy88; if (yych >= '/') goto yy88; } else { if (yych <= '\\') { if (yych >= '\\') goto yy88; } else { if (yych == 'b') goto yy88; } } } else { if (yych <= 'q') { if (yych <= 'f') goto yy88; if (yych == 'n') goto yy88; } else { if (yych <= 's') { if (yych <= 'r') goto yy88; } else { if (yych <= 't') goto yy88; if (yych <= 'u') goto yy90; } } } yy78: { s->errcode = PHP_JSON_ERROR_SYNTAX; return PHP_JSON_T_ERROR; } yy79: ++YYCURSOR; yy80: { if (s->options & (PHP_JSON_INVALID_UTF8_IGNORE | PHP_JSON_INVALID_UTF8_SUBSTITUTE)) { if (s->options & PHP_JSON_INVALID_UTF8_SUBSTITUTE) { if (s->utf8_invalid_count > INT_MAX - 2) { s->errcode = PHP_JSON_ERROR_UTF8; return PHP_JSON_T_ERROR; } s->utf8_invalid_count += 2; } else { s->utf8_invalid_count--; } s->utf8_invalid = 1; PHP_JSON_CONDITION_GOTO(STR_P1); } s->errcode = PHP_JSON_ERROR_UTF8; return PHP_JSON_T_ERROR; } yy81: yych = *++YYCURSOR; if (yych <= 0x7F) goto yy80; if (yych <= 0xBF) goto yy73; goto yy80; yy82: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x9F) goto yy80; if (yych <= 0xBF) goto yy92; goto yy80; yy83: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x7F) goto yy80; if (yych <= 0xBF) goto yy92; goto yy80; yy84: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x7F) goto yy80; if (yych <= 0x9F) goto yy92; goto yy80; yy85: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x8F) goto yy80; if (yych <= 0xBF) goto yy93; goto yy80; yy86: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x7F) goto yy80; if (yych <= 0xBF) goto yy93; goto yy80; yy87: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x7F) goto yy80; if (yych <= 0x8F) goto yy93; goto yy80; yy88: ++YYCURSOR; { s->str_esc++; PHP_JSON_CONDITION_GOTO(STR_P1); } yy90: yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= '9') { if (yych <= '/') goto yy91; if (yych <= '0') goto yy94; goto yy95; } else { if (yych <= '@') goto yy91; if (yych <= 'C') goto yy95; goto yy96; } } else { if (yych <= 'c') { if (yych <= 'F') goto yy95; if (yych >= 'a') goto yy95; } else { if (yych <= 'd') goto yy96; if (yych <= 'f') goto yy95; } } yy91: YYCURSOR = YYMARKER; if (yyaccept <= 1) { if (yyaccept == 0) { goto yy78; } else { goto yy80; } } else { goto yy114; } yy92: yych = *++YYCURSOR; if (yych <= 0x7F) goto yy91; if (yych <= 0xBF) goto yy73; goto yy91; yy93: yych = *++YYCURSOR; if (yych <= 0x7F) goto yy91; if (yych <= 0xBF) goto yy92; goto yy91; yy94: yych = *++YYCURSOR; if (yych <= '9') { if (yych <= '/') goto yy91; if (yych <= '0') goto yy97; if (yych <= '7') goto yy98; goto yy99; } else { if (yych <= 'F') { if (yych <= '@') goto yy91; goto yy99; } else { if (yych <= '`') goto yy91; if (yych <= 'f') goto yy99; goto yy91; } } yy95: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy91; if (yych <= '9') goto yy99; goto yy91; } else { if (yych <= 'F') goto yy99; if (yych <= '`') goto yy91; if (yych <= 'f') goto yy99; goto yy91; } yy96: yych = *++YYCURSOR; if (yych <= 'B') { if (yych <= '7') { if (yych <= '/') goto yy91; goto yy99; } else { if (yych <= '9') goto yy100; if (yych <= '@') goto yy91; goto yy100; } } else { if (yych <= '`') { if (yych <= 'F') goto yy101; goto yy91; } else { if (yych <= 'b') goto yy100; if (yych <= 'f') goto yy101; goto yy91; } } yy97: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy91; if (yych <= '7') goto yy102; if (yych <= '9') goto yy103; goto yy91; } else { if (yych <= 'F') goto yy103; if (yych <= '`') goto yy91; if (yych <= 'f') goto yy103; goto yy91; } yy98: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy91; if (yych <= '9') goto yy103; goto yy91; } else { if (yych <= 'F') goto yy103; if (yych <= '`') goto yy91; if (yych <= 'f') goto yy103; goto yy91; } yy99: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy91; if (yych <= '9') goto yy104; goto yy91; } else { if (yych <= 'F') goto yy104; if (yych <= '`') goto yy91; if (yych <= 'f') goto yy104; goto yy91; } yy100: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy91; if (yych <= '9') goto yy105; goto yy91; } else { if (yych <= 'F') goto yy105; if (yych <= '`') goto yy91; if (yych <= 'f') goto yy105; goto yy91; } yy101: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy91; if (yych <= '9') goto yy106; goto yy91; } else { if (yych <= 'F') goto yy106; if (yych <= '`') goto yy91; if (yych <= 'f') goto yy106; goto yy91; } yy102: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy91; if (yych <= '9') goto yy107; goto yy91; } else { if (yych <= 'F') goto yy107; if (yych <= '`') goto yy91; if (yych <= 'f') goto yy107; goto yy91; } yy103: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy91; if (yych <= '9') goto yy109; goto yy91; } else { if (yych <= 'F') goto yy109; if (yych <= '`') goto yy91; if (yych <= 'f') goto yy109; goto yy91; } yy104: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy91; if (yych <= '9') goto yy111; goto yy91; } else { if (yych <= 'F') goto yy111; if (yych <= '`') goto yy91; if (yych <= 'f') goto yy111; goto yy91; } yy105: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy91; if (yych <= '9') goto yy113; goto yy91; } else { if (yych <= 'F') goto yy113; if (yych <= '`') goto yy91; if (yych <= 'f') goto yy113; goto yy91; } yy106: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy91; if (yych <= '9') goto yy115; goto yy91; } else { if (yych <= 'F') goto yy115; if (yych <= '`') goto yy91; if (yych <= 'f') goto yy115; goto yy91; } yy107: ++YYCURSOR; { s->str_esc += 5; PHP_JSON_CONDITION_GOTO(STR_P1); } yy109: ++YYCURSOR; { s->str_esc += 4; PHP_JSON_CONDITION_GOTO(STR_P1); } yy111: ++YYCURSOR; { s->str_esc += 3; PHP_JSON_CONDITION_GOTO(STR_P1); } yy113: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych == '\\') goto yy116; yy114: { s->errcode = PHP_JSON_ERROR_UTF16; return PHP_JSON_T_ERROR; } yy115: yych = *++YYCURSOR; goto yy114; yy116: yych = *++YYCURSOR; if (yych != 'u') goto yy91; yych = *++YYCURSOR; if (yych == 'D') goto yy118; if (yych != 'd') goto yy91; yy118: yych = *++YYCURSOR; if (yych <= 'B') goto yy91; if (yych <= 'F') goto yy119; if (yych <= 'b') goto yy91; if (yych >= 'g') goto yy91; yy119: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy91; if (yych >= ':') goto yy91; } else { if (yych <= 'F') goto yy120; if (yych <= '`') goto yy91; if (yych >= 'g') goto yy91; } yy120: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy91; if (yych >= ':') goto yy91; } else { if (yych <= 'F') goto yy121; if (yych <= '`') goto yy91; if (yych >= 'g') goto yy91; } yy121: ++YYCURSOR; { s->str_esc += 8; PHP_JSON_CONDITION_GOTO(STR_P1); } /* *********************************** */ yyc_STR_P2_BIN: yych = *YYCURSOR; if (yych <= 0xDF) { if (yych <= '[') { if (yych == '"') goto yy127; } else { if (yych <= '\\') goto yy129; if (yych <= 0x7F) goto yy125; if (yych <= 0xC1) goto yy131; goto yy133; } } else { if (yych <= 0xEF) { if (yych <= 0xE0) goto yy134; if (yych == 0xED) goto yy136; goto yy135; } else { if (yych <= 0xF0) goto yy137; if (yych <= 0xF3) goto yy138; if (yych <= 0xF4) goto yy139; goto yy131; } } yy125: ++YYCURSOR; { PHP_JSON_CONDITION_GOTO(STR_P2_BIN); } yy127: ++YYCURSOR; YYSETCONDITION(yycJS); { PHP_JSON_SCANNER_COPY_ESC(); return PHP_JSON_T_STRING; } yy129: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'u') goto yy140; yy130: { 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(); } yy131: ++YYCURSOR; yy132: { if (s->utf8_invalid) { PHP_JSON_SCANNER_COPY_ESC(); if (s->options & PHP_JSON_INVALID_UTF8_SUBSTITUTE) { *(s->pstr++) = (char) (0xe0 | (0xfffd >> 12)); *(s->pstr++) = (char) (0x80 | ((0xfffd >> 6) & 0x3f)); *(s->pstr++) = (char) (0x80 | (0xfffd & 0x3f)); } s->str_start = s->cursor; } PHP_JSON_CONDITION_GOTO(STR_P2_BIN); } yy133: yych = *++YYCURSOR; if (yych <= 0x7F) goto yy132; if (yych <= 0xBF) goto yy125; goto yy132; yy134: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x9F) goto yy132; if (yych <= 0xBF) goto yy142; goto yy132; yy135: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x7F) goto yy132; if (yych <= 0xBF) goto yy142; goto yy132; yy136: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x7F) goto yy132; if (yych <= 0x9F) goto yy142; goto yy132; yy137: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x8F) goto yy132; if (yych <= 0xBF) goto yy143; goto yy132; yy138: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x7F) goto yy132; if (yych <= 0xBF) goto yy143; goto yy132; yy139: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x7F) goto yy132; if (yych <= 0x8F) goto yy143; goto yy132; yy140: yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= '9') { if (yych <= '/') goto yy141; if (yych <= '0') goto yy144; goto yy145; } else { if (yych <= '@') goto yy141; if (yych <= 'C') goto yy145; goto yy146; } } else { if (yych <= 'c') { if (yych <= 'F') goto yy145; if (yych >= 'a') goto yy145; } else { if (yych <= 'd') goto yy146; if (yych <= 'f') goto yy145; } } yy141: YYCURSOR = YYMARKER; if (yyaccept == 0) { goto yy130; } else { goto yy132; } yy142: yych = *++YYCURSOR; if (yych <= 0x7F) goto yy141; if (yych <= 0xBF) goto yy125; goto yy141; yy143: yych = *++YYCURSOR; if (yych <= 0x7F) goto yy141; if (yych <= 0xBF) goto yy142; goto yy141; yy144: yych = *++YYCURSOR; if (yych <= '9') { if (yych <= '/') goto yy141; if (yych <= '0') goto yy147; if (yych <= '7') goto yy148; goto yy149; } else { if (yych <= 'F') { if (yych <= '@') goto yy141; goto yy149; } else { if (yych <= '`') goto yy141; if (yych <= 'f') goto yy149; goto yy141; } } yy145: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy141; if (yych <= '9') goto yy149; goto yy141; } else { if (yych <= 'F') goto yy149; if (yych <= '`') goto yy141; if (yych <= 'f') goto yy149; goto yy141; } yy146: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy141; if (yych <= '7') goto yy149; if (yych <= '9') goto yy150; goto yy141; } else { if (yych <= 'B') goto yy150; if (yych <= '`') goto yy141; if (yych <= 'b') goto yy150; goto yy141; } yy147: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy141; if (yych <= '7') goto yy151; if (yych <= '9') goto yy152; goto yy141; } else { if (yych <= 'F') goto yy152; if (yych <= '`') goto yy141; if (yych <= 'f') goto yy152; goto yy141; } yy148: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy141; if (yych <= '9') goto yy152; goto yy141; } else { if (yych <= 'F') goto yy152; if (yych <= '`') goto yy141; if (yych <= 'f') goto yy152; goto yy141; } yy149: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy141; if (yych <= '9') goto yy153; goto yy141; } else { if (yych <= 'F') goto yy153; if (yych <= '`') goto yy141; if (yych <= 'f') goto yy153; goto yy141; } yy150: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy141; if (yych <= '9') goto yy154; goto yy141; } else { if (yych <= 'F') goto yy154; if (yych <= '`') goto yy141; if (yych <= 'f') goto yy154; goto yy141; } yy151: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy141; if (yych <= '9') goto yy155; goto yy141; } else { if (yych <= 'F') goto yy155; if (yych <= '`') goto yy141; if (yych <= 'f') goto yy155; goto yy141; } yy152: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy141; if (yych <= '9') goto yy157; goto yy141; } else { if (yych <= 'F') goto yy157; if (yych <= '`') goto yy141; if (yych <= 'f') goto yy157; goto yy141; } yy153: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy141; if (yych <= '9') goto yy159; goto yy141; } else { if (yych <= 'F') goto yy159; if (yych <= '`') goto yy141; if (yych <= 'f') goto yy159; goto yy141; } yy154: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy141; if (yych <= '9') goto yy161; goto yy141; } else { if (yych <= 'F') goto yy161; if (yych <= '`') goto yy141; if (yych <= 'f') goto yy161; goto yy141; } yy155: ++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(); } yy157: ++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(); } yy159: ++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(); } yy161: yych = *++YYCURSOR; if (yych != '\\') goto yy141; yych = *++YYCURSOR; if (yych != 'u') goto yy141; yych = *++YYCURSOR; if (yych == 'D') goto yy164; if (yych != 'd') goto yy141; yy164: yych = *++YYCURSOR; if (yych <= 'B') goto yy141; if (yych <= 'F') goto yy165; if (yych <= 'b') goto yy141; if (yych >= 'g') goto yy141; yy165: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy141; if (yych >= ':') goto yy141; } else { if (yych <= 'F') goto yy166; if (yych <= '`') goto yy141; if (yych >= 'g') goto yy141; } yy166: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy141; if (yych >= ':') goto yy141; } else { if (yych <= 'F') goto yy167; if (yych <= '`') goto yy141; if (yych >= 'g') goto yy141; } yy167: ++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(); } /* *********************************** */ yyc_STR_P2_UTF: yych = *YYCURSOR; if (yych == '"') goto yy173; if (yych == '\\') goto yy175; ++YYCURSOR; { PHP_JSON_CONDITION_GOTO(STR_P2_UTF); } yy173: ++YYCURSOR; YYSETCONDITION(yycJS); { PHP_JSON_SCANNER_COPY_ESC(); return PHP_JSON_T_STRING; } yy175: yych = *(YYMARKER = ++YYCURSOR); if (yych == 'u') goto yy177; yy176: { 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(); } yy177: yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= '9') { if (yych <= '/') goto yy178; if (yych <= '0') goto yy179; goto yy180; } else { if (yych <= '@') goto yy178; if (yych <= 'C') goto yy180; goto yy181; } } else { if (yych <= 'c') { if (yych <= 'F') goto yy180; if (yych >= 'a') goto yy180; } else { if (yych <= 'd') goto yy181; if (yych <= 'f') goto yy180; } } yy178: YYCURSOR = YYMARKER; goto yy176; yy179: yych = *++YYCURSOR; if (yych <= '9') { if (yych <= '/') goto yy178; if (yych <= '0') goto yy182; if (yych <= '7') goto yy183; goto yy184; } else { if (yych <= 'F') { if (yych <= '@') goto yy178; goto yy184; } else { if (yych <= '`') goto yy178; if (yych <= 'f') goto yy184; goto yy178; } } yy180: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy178; if (yych <= '9') goto yy184; goto yy178; } else { if (yych <= 'F') goto yy184; if (yych <= '`') goto yy178; if (yych <= 'f') goto yy184; goto yy178; } yy181: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy178; if (yych <= '7') goto yy184; if (yych <= '9') goto yy185; goto yy178; } else { if (yych <= 'B') goto yy185; if (yych <= '`') goto yy178; if (yych <= 'b') goto yy185; goto yy178; } yy182: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy178; if (yych <= '7') goto yy186; if (yych <= '9') goto yy187; goto yy178; } else { if (yych <= 'F') goto yy187; if (yych <= '`') goto yy178; if (yych <= 'f') goto yy187; goto yy178; } yy183: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy178; if (yych <= '9') goto yy187; goto yy178; } else { if (yych <= 'F') goto yy187; if (yych <= '`') goto yy178; if (yych <= 'f') goto yy187; goto yy178; } yy184: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy178; if (yych <= '9') goto yy188; goto yy178; } else { if (yych <= 'F') goto yy188; if (yych <= '`') goto yy178; if (yych <= 'f') goto yy188; goto yy178; } yy185: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy178; if (yych <= '9') goto yy189; goto yy178; } else { if (yych <= 'F') goto yy189; if (yych <= '`') goto yy178; if (yych <= 'f') goto yy189; goto yy178; } yy186: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy178; if (yych <= '9') goto yy190; goto yy178; } else { if (yych <= 'F') goto yy190; if (yych <= '`') goto yy178; if (yych <= 'f') goto yy190; goto yy178; } yy187: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy178; if (yych <= '9') goto yy192; goto yy178; } else { if (yych <= 'F') goto yy192; if (yych <= '`') goto yy178; if (yych <= 'f') goto yy192; goto yy178; } yy188: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy178; if (yych <= '9') goto yy194; goto yy178; } else { if (yych <= 'F') goto yy194; if (yych <= '`') goto yy178; if (yych <= 'f') goto yy194; goto yy178; } yy189: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy178; if (yych <= '9') goto yy196; goto yy178; } else { if (yych <= 'F') goto yy196; if (yych <= '`') goto yy178; if (yych <= 'f') goto yy196; goto yy178; } yy190: ++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(); } yy192: ++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(); } yy194: ++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(); } yy196: yych = *++YYCURSOR; if (yych != '\\') goto yy178; yych = *++YYCURSOR; if (yych != 'u') goto yy178; yych = *++YYCURSOR; if (yych == 'D') goto yy199; if (yych != 'd') goto yy178; yy199: yych = *++YYCURSOR; if (yych <= 'B') goto yy178; if (yych <= 'F') goto yy200; if (yych <= 'b') goto yy178; if (yych >= 'g') goto yy178; yy200: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy178; if (yych >= ':') goto yy178; } else { if (yych <= 'F') goto yy201; if (yych <= '`') goto yy178; if (yych >= 'g') goto yy178; } yy201: yych = *++YYCURSOR; if (yych <= '@') { if (yych <= '/') goto yy178; if (yych >= ':') goto yy178; } else { if (yych <= 'F') goto yy202; if (yych <= '`') goto yy178; if (yych >= 'g') goto yy178; } yy202: ++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(); } } }