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