summaryrefslogtreecommitdiff
path: root/ext/json/json_scanner.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/json/json_scanner.c')
-rw-r--r--ext/json/json_scanner.c1322
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);
+ }
+ }
+
+
+}
+