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); +	} +	} + + +} + | 
