root/ext/json/json_scanner.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. php_json_scanner_copy_string
  2. php_json_hex_to_int
  3. php_json_ucs2_to_int_ex
  4. php_json_ucs2_to_int
  5. php_json_scanner_init
  6. php_json_scan

   1 /* Generated by re2c 0.14.3 */
   2 /*
   3   +----------------------------------------------------------------------+
   4   | PHP Version 7                                                        |
   5   +----------------------------------------------------------------------+
   6   | Copyright (c) 1997-2016 The PHP Group                                |
   7   +----------------------------------------------------------------------+
   8   | This source file is subject to version 3.01 of the PHP license,      |
   9   | that is bundled with this package in the file LICENSE, and is        |
  10   | available through the world-wide-web at the following url:           |
  11   | http://www.php.net/license/3_01.txt                                  |
  12   | If you did not receive a copy of the PHP license and are unable to   |
  13   | obtain it through the world-wide-web, please send a note to          |
  14   | license@php.net so we can mail you a copy immediately.               |
  15   +----------------------------------------------------------------------+
  16   | Author: Jakub Zelenka <bukka@php.net>                                |
  17   +----------------------------------------------------------------------+
  18 */
  19 
  20 #include "php.h"
  21 #include "php_json_scanner.h"
  22 #include "php_json_scanner_defs.h"
  23 #include "php_json_parser.h"
  24 #include "json_parser.tab.h"
  25 
  26 #define YYCTYPE     php_json_ctype
  27 #define YYCURSOR    s->cursor
  28 #define YYLIMIT     s->limit
  29 #define YYMARKER    s->marker
  30 #define YYCTXMARKER s->ctxmarker
  31 
  32 #define YYGETCONDITION()        s->state
  33 #define YYSETCONDITION(yystate) s->state = yystate
  34 
  35 #define YYFILL(n)
  36 
  37 #define PHP_JSON_CONDITION_SET(condition) YYSETCONDITION(yyc##condition)
  38 #define PHP_JSON_CONDITION_GOTO(condition) goto yyc_##condition
  39 
  40 #define PHP_JSON_SCANNER_COPY_ESC() php_json_scanner_copy_string(s, 0)
  41 #define PHP_JSON_SCANNER_COPY_UTF() php_json_scanner_copy_string(s, 5)
  42 #define PHP_JSON_SCANNER_COPY_UTF_SP() php_json_scanner_copy_string(s, 11)
  43 
  44 #define PHP_JSON_INT_MAX_LENGTH (MAX_LENGTH_OF_LONG - 1)
  45 
  46 
  47 static void php_json_scanner_copy_string(php_json_scanner *s, int esc_size)
  48 {
  49         size_t len = s->cursor - s->str_start - esc_size - 1;
  50         if (len) {
  51                 memcpy(s->pstr, s->str_start, len);
  52                 s->pstr += len;
  53         }
  54 }
  55 
  56 static int php_json_hex_to_int(char code)
  57 {
  58         if (code >= '0' && code <= '9') {
  59                 return code - '0';
  60         } else if (code >= 'A' && code <= 'F') {
  61                 return code - ('A' - 10);
  62         } else if (code >= 'a' && code <= 'f') {
  63                 return code - ('a' - 10);
  64         } else {
  65                 /* this should never happened (just to suppress compiler warning) */
  66                 return -1;
  67         }
  68 }
  69 
  70 static int php_json_ucs2_to_int_ex(php_json_scanner *s, int size, int start)
  71 {
  72         int i, code = 0;
  73         php_json_ctype *pc = s->cursor - start;
  74         for (i = 0; i < size; i++) {
  75                 code |= php_json_hex_to_int(*(pc--)) << (i * 4);
  76         }
  77         return code;
  78 }
  79 
  80 static int php_json_ucs2_to_int(php_json_scanner *s, int size)
  81 {
  82         return php_json_ucs2_to_int_ex(s, size, 1);
  83 }
  84 
  85 void php_json_scanner_init(php_json_scanner *s, char *str, size_t str_len, int options)
  86 {
  87         s->cursor = (php_json_ctype *) str;
  88         s->limit = (php_json_ctype *) str + str_len;
  89         s->options = options;
  90         PHP_JSON_CONDITION_SET(JS);
  91 }
  92 
  93 int php_json_scan(php_json_scanner *s)
  94 {
  95         ZVAL_NULL(&s->value);
  96         
  97 std:
  98         s->token = s->cursor;
  99 
 100 
 101         {
 102                 YYCTYPE yych;
 103                 unsigned int yyaccept = 0;
 104                 if (YYGETCONDITION() < 1) {
 105                         goto yyc_JS;
 106                 } else {
 107                         if (YYGETCONDITION() < 2) {
 108                                 goto yyc_STR_P1;
 109                         } else {
 110                                 goto yyc_STR_P2;
 111                         }
 112                 }
 113 /* *********************************** */
 114 yyc_JS:
 115                 {
 116                         static const unsigned char yybm[] = {
 117                                   0,   0,   0,   0,   0,   0,   0,   0, 
 118                                   0, 128,   0,   0,   0, 128,   0,   0, 
 119                                   0,   0,   0,   0,   0,   0,   0,   0, 
 120                                   0,   0,   0,   0,   0,   0,   0,   0, 
 121                                 128,   0,   0,   0,   0,   0,   0,   0, 
 122                                   0,   0,   0,   0,   0,   0,   0,   0, 
 123                                  64,  64,  64,  64,  64,  64,  64,  64, 
 124                                  64,  64,   0,   0,   0,   0,   0,   0, 
 125                                   0,   0,   0,   0,   0,   0,   0,   0, 
 126                                   0,   0,   0,   0,   0,   0,   0,   0, 
 127                                   0,   0,   0,   0,   0,   0,   0,   0, 
 128                                   0,   0,   0,   0,   0,   0,   0,   0, 
 129                                   0,   0,   0,   0,   0,   0,   0,   0, 
 130                                   0,   0,   0,   0,   0,   0,   0,   0, 
 131                                   0,   0,   0,   0,   0,   0,   0,   0, 
 132                                   0,   0,   0,   0,   0,   0,   0,   0, 
 133                                   0,   0,   0,   0,   0,   0,   0,   0, 
 134                                   0,   0,   0,   0,   0,   0,   0,   0, 
 135                                   0,   0,   0,   0,   0,   0,   0,   0, 
 136                                   0,   0,   0,   0,   0,   0,   0,   0, 
 137                                   0,   0,   0,   0,   0,   0,   0,   0, 
 138                                   0,   0,   0,   0,   0,   0,   0,   0, 
 139                                   0,   0,   0,   0,   0,   0,   0,   0, 
 140                                   0,   0,   0,   0,   0,   0,   0,   0, 
 141                                   0,   0,   0,   0,   0,   0,   0,   0, 
 142                                   0,   0,   0,   0,   0,   0,   0,   0, 
 143                                   0,   0,   0,   0,   0,   0,   0,   0, 
 144                                   0,   0,   0,   0,   0,   0,   0,   0, 
 145                                   0,   0,   0,   0,   0,   0,   0,   0, 
 146                                   0,   0,   0,   0,   0,   0,   0,   0, 
 147                                   0,   0,   0,   0,   0,   0,   0,   0, 
 148                                   0,   0,   0,   0,   0,   0,   0,   0, 
 149                         };
 150                         yych = *YYCURSOR;
 151                         if (yych <= ']') {
 152                                 if (yych <= '"') {
 153                                         if (yych <= '\f') {
 154                                                 if (yych <= 0x08) {
 155                                                         if (yych >= 0x01) goto yy5;
 156                                                 } else {
 157                                                         if (yych <= '\t') goto yy7;
 158                                                         if (yych <= '\n') goto yy9;
 159                                                         goto yy5;
 160                                                 }
 161                                         } else {
 162                                                 if (yych <= 0x1F) {
 163                                                         if (yych <= '\r') goto yy10;
 164                                                         goto yy5;
 165                                                 } else {
 166                                                         if (yych <= ' ') goto yy11;
 167                                                         if (yych <= '!') goto yy12;
 168                                                         goto yy14;
 169                                                 }
 170                                         }
 171                                 } else {
 172                                         if (yych <= '0') {
 173                                                 if (yych <= ',') {
 174                                                         if (yych <= '+') goto yy12;
 175                                                         goto yy16;
 176                                                 } else {
 177                                                         if (yych <= '-') goto yy18;
 178                                                         if (yych <= '/') goto yy12;
 179                                                         goto yy19;
 180                                                 }
 181                                         } else {
 182                                                 if (yych <= 'Z') {
 183                                                         if (yych <= '9') goto yy21;
 184                                                         if (yych <= ':') goto yy22;
 185                                                         goto yy12;
 186                                                 } else {
 187                                                         if (yych <= '[') goto yy24;
 188                                                         if (yych <= '\\') goto yy12;
 189                                                         goto yy26;
 190                                                 }
 191                                         }
 192                                 }
 193                         } else {
 194                                 if (yych <= '}') {
 195                                         if (yych <= 's') {
 196                                                 if (yych <= 'f') {
 197                                                         if (yych <= 'e') goto yy12;
 198                                                         goto yy28;
 199                                                 } else {
 200                                                         if (yych == 'n') goto yy29;
 201                                                         goto yy12;
 202                                                 }
 203                                         } else {
 204                                                 if (yych <= 'z') {
 205                                                         if (yych <= 't') goto yy30;
 206                                                         goto yy12;
 207                                                 } else {
 208                                                         if (yych <= '{') goto yy31;
 209                                                         if (yych <= '|') goto yy12;
 210                                                         goto yy33;
 211                                                 }
 212                                         }
 213                                 } else {
 214                                         if (yych <= 0xEC) {
 215                                                 if (yych <= 0xC1) {
 216                                                         if (yych <= 0x7F) goto yy12;
 217                                                         goto yy35;
 218                                                 } else {
 219                                                         if (yych <= 0xDF) goto yy37;
 220                                                         if (yych <= 0xE0) goto yy38;
 221                                                         goto yy39;
 222                                                 }
 223                                         } else {
 224                                                 if (yych <= 0xF0) {
 225                                                         if (yych <= 0xED) goto yy40;
 226                                                         if (yych <= 0xEF) goto yy41;
 227                                                         goto yy42;
 228                                                 } else {
 229                                                         if (yych <= 0xF3) goto yy43;
 230                                                         if (yych <= 0xF4) goto yy44;
 231                                                         goto yy35;
 232                                                 }
 233                                         }
 234                                 }
 235                         }
 236                         ++YYCURSOR;
 237                         {
 238                 if (s->limit < s->cursor) {
 239                         return PHP_JSON_T_EOI;
 240                 } else {
 241                         s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
 242                         return PHP_JSON_T_ERROR;
 243                 }
 244         }
 245 yy5:
 246                         ++YYCURSOR;
 247                         {
 248                 s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
 249                 return PHP_JSON_T_ERROR;
 250         }
 251 yy7:
 252                         ++YYCURSOR;
 253                         yych = *YYCURSOR;
 254                         goto yy82;
 255 yy8:
 256                         { goto std; }
 257 yy9:
 258                         yych = *++YYCURSOR;
 259                         goto yy8;
 260 yy10:
 261                         yych = *++YYCURSOR;
 262                         if (yych == '\n') goto yy83;
 263                         goto yy82;
 264 yy11:
 265                         yych = *++YYCURSOR;
 266                         goto yy82;
 267 yy12:
 268                         ++YYCURSOR;
 269 yy13:
 270                         {
 271                 s->errcode = PHP_JSON_ERROR_SYNTAX;
 272                 return PHP_JSON_T_ERROR;
 273         }
 274 yy14:
 275                         ++YYCURSOR;
 276                         {
 277                 s->str_start = s->cursor;
 278                 s->str_esc = 0;
 279                 PHP_JSON_CONDITION_SET(STR_P1);
 280                 PHP_JSON_CONDITION_GOTO(STR_P1);
 281         }
 282 yy16:
 283                         ++YYCURSOR;
 284                         { return ','; }
 285 yy18:
 286                         yych = *++YYCURSOR;
 287                         if (yych <= '/') goto yy13;
 288                         if (yych <= '0') goto yy80;
 289                         if (yych <= '9') goto yy70;
 290                         goto yy13;
 291 yy19:
 292                         yyaccept = 0;
 293                         yych = *(YYMARKER = ++YYCURSOR);
 294                         if (yych <= 'D') {
 295                                 if (yych == '.') goto yy72;
 296                         } else {
 297                                 if (yych <= 'E') goto yy73;
 298                                 if (yych == 'e') goto yy73;
 299                         }
 300 yy20:
 301                         {
 302                 zend_bool bigint = 0, negative = s->token[0] == '-';
 303                 size_t digits = (size_t) (s->cursor - s->token - negative);
 304                 if (digits >= PHP_JSON_INT_MAX_LENGTH) {
 305                         if (digits == PHP_JSON_INT_MAX_LENGTH) {
 306                                 int cmp = strncmp((char *) (s->token + negative), LONG_MIN_DIGITS, PHP_JSON_INT_MAX_LENGTH);
 307                                 if (!(cmp < 0 || (cmp == 0 && negative))) {
 308                                         bigint = 1;
 309                                 }
 310                         } else {
 311                                 bigint = 1;
 312                         }
 313                 }
 314                 if (!bigint) {
 315                         ZVAL_LONG(&s->value, ZEND_STRTOL((char *) s->token, NULL, 10));
 316                         return PHP_JSON_T_INT;
 317                 } else if (s->options & PHP_JSON_BIGINT_AS_STRING) {
 318                         ZVAL_STRINGL(&s->value, (char *) s->token, s->cursor - s->token);
 319                         return PHP_JSON_T_STRING;
 320                 } else {
 321                         ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL));
 322                         return PHP_JSON_T_DOUBLE;
 323                 }
 324         }
 325 yy21:
 326                         yyaccept = 0;
 327                         yych = *(YYMARKER = ++YYCURSOR);
 328                         goto yy71;
 329 yy22:
 330                         ++YYCURSOR;
 331                         { return ':'; }
 332 yy24:
 333                         ++YYCURSOR;
 334                         { return '['; }
 335 yy26:
 336                         ++YYCURSOR;
 337                         { return ']'; }
 338 yy28:
 339                         yyaccept = 1;
 340                         yych = *(YYMARKER = ++YYCURSOR);
 341                         if (yych == 'a') goto yy65;
 342                         goto yy13;
 343 yy29:
 344                         yyaccept = 1;
 345                         yych = *(YYMARKER = ++YYCURSOR);
 346                         if (yych == 'u') goto yy61;
 347                         goto yy13;
 348 yy30:
 349                         yyaccept = 1;
 350                         yych = *(YYMARKER = ++YYCURSOR);
 351                         if (yych == 'r') goto yy57;
 352                         goto yy13;
 353 yy31:
 354                         ++YYCURSOR;
 355                         { return '{'; }
 356 yy33:
 357                         ++YYCURSOR;
 358                         { return '}'; }
 359 yy35:
 360                         ++YYCURSOR;
 361 yy36:
 362                         {
 363                 s->errcode = PHP_JSON_ERROR_UTF8;
 364                 return PHP_JSON_T_ERROR;
 365         }
 366 yy37:
 367                         yych = *++YYCURSOR;
 368                         if (yych <= 0x7F) goto yy36;
 369                         if (yych <= 0xBF) goto yy48;
 370                         goto yy36;
 371 yy38:
 372                         yyaccept = 2;
 373                         yych = *(YYMARKER = ++YYCURSOR);
 374                         if (yych <= 0x9F) goto yy36;
 375                         if (yych <= 0xBF) goto yy56;
 376                         goto yy36;
 377 yy39:
 378                         yyaccept = 2;
 379                         yych = *(YYMARKER = ++YYCURSOR);
 380                         if (yych <= 0x7F) goto yy36;
 381                         if (yych <= 0xBF) goto yy55;
 382                         goto yy36;
 383 yy40:
 384                         yyaccept = 2;
 385                         yych = *(YYMARKER = ++YYCURSOR);
 386                         if (yych <= 0x7F) goto yy36;
 387                         if (yych <= 0x9F) goto yy54;
 388                         goto yy36;
 389 yy41:
 390                         yyaccept = 2;
 391                         yych = *(YYMARKER = ++YYCURSOR);
 392                         if (yych <= 0x7F) goto yy36;
 393                         if (yych <= 0xBF) goto yy53;
 394                         goto yy36;
 395 yy42:
 396                         yyaccept = 2;
 397                         yych = *(YYMARKER = ++YYCURSOR);
 398                         if (yych <= 0x8F) goto yy36;
 399                         if (yych <= 0xBF) goto yy51;
 400                         goto yy36;
 401 yy43:
 402                         yyaccept = 2;
 403                         yych = *(YYMARKER = ++YYCURSOR);
 404                         if (yych <= 0x7F) goto yy36;
 405                         if (yych <= 0xBF) goto yy49;
 406                         goto yy36;
 407 yy44:
 408                         yyaccept = 2;
 409                         yych = *(YYMARKER = ++YYCURSOR);
 410                         if (yych <= 0x7F) goto yy36;
 411                         if (yych >= 0x90) goto yy36;
 412                         yych = *++YYCURSOR;
 413                         if (yych <= 0x7F) goto yy46;
 414                         if (yych <= 0xBF) goto yy47;
 415 yy46:
 416                         YYCURSOR = YYMARKER;
 417                         if (yyaccept <= 1) {
 418                                 if (yyaccept == 0) {
 419                                         goto yy20;
 420                                 } else {
 421                                         goto yy13;
 422                                 }
 423                         } else {
 424                                 if (yyaccept == 2) {
 425                                         goto yy36;
 426                                 } else {
 427                                         goto yy77;
 428                                 }
 429                         }
 430 yy47:
 431                         yych = *++YYCURSOR;
 432                         if (yych <= 0x7F) goto yy46;
 433                         if (yych >= 0xC0) goto yy46;
 434 yy48:
 435                         yych = *++YYCURSOR;
 436                         goto yy13;
 437 yy49:
 438                         yych = *++YYCURSOR;
 439                         if (yych <= 0x7F) goto yy46;
 440                         if (yych >= 0xC0) goto yy46;
 441                         yych = *++YYCURSOR;
 442                         if (yych <= 0x7F) goto yy46;
 443                         if (yych <= 0xBF) goto yy48;
 444                         goto yy46;
 445 yy51:
 446                         yych = *++YYCURSOR;
 447                         if (yych <= 0x7F) goto yy46;
 448                         if (yych >= 0xC0) goto yy46;
 449                         yych = *++YYCURSOR;
 450                         if (yych <= 0x7F) goto yy46;
 451                         if (yych <= 0xBF) goto yy48;
 452                         goto yy46;
 453 yy53:
 454                         yych = *++YYCURSOR;
 455                         if (yych <= 0x7F) goto yy46;
 456                         if (yych <= 0xBF) goto yy48;
 457                         goto yy46;
 458 yy54:
 459                         yych = *++YYCURSOR;
 460                         if (yych <= 0x7F) goto yy46;
 461                         if (yych <= 0xBF) goto yy48;
 462                         goto yy46;
 463 yy55:
 464                         yych = *++YYCURSOR;
 465                         if (yych <= 0x7F) goto yy46;
 466                         if (yych <= 0xBF) goto yy48;
 467                         goto yy46;
 468 yy56:
 469                         yych = *++YYCURSOR;
 470                         if (yych <= 0x7F) goto yy46;
 471                         if (yych <= 0xBF) goto yy48;
 472                         goto yy46;
 473 yy57:
 474                         yych = *++YYCURSOR;
 475                         if (yych != 'u') goto yy46;
 476                         yych = *++YYCURSOR;
 477                         if (yych != 'e') goto yy46;
 478                         ++YYCURSOR;
 479                         {
 480                 ZVAL_TRUE(&s->value);
 481                 return PHP_JSON_T_TRUE;
 482         }
 483 yy61:
 484                         yych = *++YYCURSOR;
 485                         if (yych != 'l') goto yy46;
 486                         yych = *++YYCURSOR;
 487                         if (yych != 'l') goto yy46;
 488                         ++YYCURSOR;
 489                         {
 490                 ZVAL_NULL(&s->value);
 491                 return PHP_JSON_T_NUL;
 492         }
 493 yy65:
 494                         yych = *++YYCURSOR;
 495                         if (yych != 'l') goto yy46;
 496                         yych = *++YYCURSOR;
 497                         if (yych != 's') goto yy46;
 498                         yych = *++YYCURSOR;
 499                         if (yych != 'e') goto yy46;
 500                         ++YYCURSOR;
 501                         {
 502                 ZVAL_FALSE(&s->value);
 503                 return PHP_JSON_T_FALSE;
 504         }
 505 yy70:
 506                         yyaccept = 0;
 507                         YYMARKER = ++YYCURSOR;
 508                         yych = *YYCURSOR;
 509 yy71:
 510                         if (yybm[0+yych] & 64) {
 511                                 goto yy70;
 512                         }
 513                         if (yych <= 'D') {
 514                                 if (yych != '.') goto yy20;
 515                         } else {
 516                                 if (yych <= 'E') goto yy73;
 517                                 if (yych == 'e') goto yy73;
 518                                 goto yy20;
 519                         }
 520 yy72:
 521                         yych = *++YYCURSOR;
 522                         if (yych <= '/') goto yy46;
 523                         if (yych <= '9') goto yy78;
 524                         goto yy46;
 525 yy73:
 526                         yych = *++YYCURSOR;
 527                         if (yych <= ',') {
 528                                 if (yych != '+') goto yy46;
 529                         } else {
 530                                 if (yych <= '-') goto yy74;
 531                                 if (yych <= '/') goto yy46;
 532                                 if (yych <= '9') goto yy75;
 533                                 goto yy46;
 534                         }
 535 yy74:
 536                         yych = *++YYCURSOR;
 537                         if (yych <= '/') goto yy46;
 538                         if (yych >= ':') goto yy46;
 539 yy75:
 540                         ++YYCURSOR;
 541                         yych = *YYCURSOR;
 542                         if (yych <= '/') goto yy77;
 543                         if (yych <= '9') goto yy75;
 544 yy77:
 545                         {
 546                 ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL));
 547                 return PHP_JSON_T_DOUBLE;
 548         }
 549 yy78:
 550                         yyaccept = 3;
 551                         YYMARKER = ++YYCURSOR;
 552                         yych = *YYCURSOR;
 553                         if (yych <= 'D') {
 554                                 if (yych <= '/') goto yy77;
 555                                 if (yych <= '9') goto yy78;
 556                                 goto yy77;
 557                         } else {
 558                                 if (yych <= 'E') goto yy73;
 559                                 if (yych == 'e') goto yy73;
 560                                 goto yy77;
 561                         }
 562 yy80:
 563                         yyaccept = 0;
 564                         yych = *(YYMARKER = ++YYCURSOR);
 565                         if (yych <= 'D') {
 566                                 if (yych == '.') goto yy72;
 567                                 goto yy20;
 568                         } else {
 569                                 if (yych <= 'E') goto yy73;
 570                                 if (yych == 'e') goto yy73;
 571                                 goto yy20;
 572                         }
 573 yy81:
 574                         ++YYCURSOR;
 575                         yych = *YYCURSOR;
 576 yy82:
 577                         if (yybm[0+yych] & 128) {
 578                                 goto yy81;
 579                         }
 580                         goto yy8;
 581 yy83:
 582                         ++YYCURSOR;
 583                         yych = *YYCURSOR;
 584                         goto yy8;
 585                 }
 586 /* *********************************** */
 587 yyc_STR_P1:
 588                 yych = *YYCURSOR;
 589                 if (yych <= 0xDF) {
 590                         if (yych <= '[') {
 591                                 if (yych <= 0x1F) goto yy86;
 592                                 if (yych == '"') goto yy90;
 593                                 goto yy88;
 594                         } else {
 595                                 if (yych <= '\\') goto yy92;
 596                                 if (yych <= 0x7F) goto yy88;
 597                                 if (yych <= 0xC1) goto yy94;
 598                                 goto yy96;
 599                         }
 600                 } else {
 601                         if (yych <= 0xEF) {
 602                                 if (yych <= 0xE0) goto yy97;
 603                                 if (yych <= 0xEC) goto yy98;
 604                                 if (yych <= 0xED) goto yy99;
 605                                 goto yy100;
 606                         } else {
 607                                 if (yych <= 0xF0) goto yy101;
 608                                 if (yych <= 0xF3) goto yy102;
 609                                 if (yych <= 0xF4) goto yy103;
 610                                 goto yy94;
 611                         }
 612                 }
 613 yy86:
 614                 ++YYCURSOR;
 615                 {
 616                 s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
 617                 return PHP_JSON_T_ERROR;
 618         }
 619 yy88:
 620                 ++YYCURSOR;
 621 yy89:
 622                 { PHP_JSON_CONDITION_GOTO(STR_P1); }
 623 yy90:
 624                 ++YYCURSOR;
 625                 {
 626                 zend_string *str;
 627                 size_t len = s->cursor - s->str_start - s->str_esc - 1;
 628                 if (len == 0) {
 629                         PHP_JSON_CONDITION_SET(JS);
 630                         ZVAL_EMPTY_STRING(&s->value);
 631                         return PHP_JSON_T_ESTRING;
 632                 }
 633                 str = zend_string_alloc(len, 0);
 634                 ZSTR_VAL(str)[len] = '\0';
 635                 ZVAL_STR(&s->value, str);
 636                 if (s->str_esc) {
 637                         s->pstr = (php_json_ctype *) Z_STRVAL(s->value);
 638                         s->cursor = s->str_start;
 639                         PHP_JSON_CONDITION_SET(STR_P2);
 640                         PHP_JSON_CONDITION_GOTO(STR_P2);
 641                 } else {
 642                         memcpy(Z_STRVAL(s->value), s->str_start, len);
 643                         PHP_JSON_CONDITION_SET(JS);
 644                         return PHP_JSON_T_STRING;
 645                 }
 646         }
 647 yy92:
 648                 yyaccept = 0;
 649                 yych = *(YYMARKER = ++YYCURSOR);
 650                 if (yych <= 'e') {
 651                         if (yych <= '/') {
 652                                 if (yych == '"') goto yy116;
 653                                 if (yych >= '/') goto yy116;
 654                         } else {
 655                                 if (yych <= '\\') {
 656                                         if (yych >= '\\') goto yy116;
 657                                 } else {
 658                                         if (yych == 'b') goto yy116;
 659                                 }
 660                         }
 661                 } else {
 662                         if (yych <= 'q') {
 663                                 if (yych <= 'f') goto yy116;
 664                                 if (yych == 'n') goto yy116;
 665                         } else {
 666                                 if (yych <= 's') {
 667                                         if (yych <= 'r') goto yy116;
 668                                 } else {
 669                                         if (yych <= 't') goto yy116;
 670                                         if (yych <= 'u') goto yy118;
 671                                 }
 672                         }
 673                 }
 674 yy93:
 675                 {
 676                 s->errcode = PHP_JSON_ERROR_SYNTAX;
 677                 return PHP_JSON_T_ERROR;
 678         }
 679 yy94:
 680                 ++YYCURSOR;
 681 yy95:
 682                 {
 683                 s->errcode = PHP_JSON_ERROR_UTF8;
 684                 return PHP_JSON_T_ERROR;
 685         }
 686 yy96:
 687                 yych = *++YYCURSOR;
 688                 if (yych <= 0x7F) goto yy95;
 689                 if (yych <= 0xBF) goto yy107;
 690                 goto yy95;
 691 yy97:
 692                 yyaccept = 1;
 693                 yych = *(YYMARKER = ++YYCURSOR);
 694                 if (yych <= 0x9F) goto yy95;
 695                 if (yych <= 0xBF) goto yy115;
 696                 goto yy95;
 697 yy98:
 698                 yyaccept = 1;
 699                 yych = *(YYMARKER = ++YYCURSOR);
 700                 if (yych <= 0x7F) goto yy95;
 701                 if (yych <= 0xBF) goto yy114;
 702                 goto yy95;
 703 yy99:
 704                 yyaccept = 1;
 705                 yych = *(YYMARKER = ++YYCURSOR);
 706                 if (yych <= 0x7F) goto yy95;
 707                 if (yych <= 0x9F) goto yy113;
 708                 goto yy95;
 709 yy100:
 710                 yyaccept = 1;
 711                 yych = *(YYMARKER = ++YYCURSOR);
 712                 if (yych <= 0x7F) goto yy95;
 713                 if (yych <= 0xBF) goto yy112;
 714                 goto yy95;
 715 yy101:
 716                 yyaccept = 1;
 717                 yych = *(YYMARKER = ++YYCURSOR);
 718                 if (yych <= 0x8F) goto yy95;
 719                 if (yych <= 0xBF) goto yy110;
 720                 goto yy95;
 721 yy102:
 722                 yyaccept = 1;
 723                 yych = *(YYMARKER = ++YYCURSOR);
 724                 if (yych <= 0x7F) goto yy95;
 725                 if (yych <= 0xBF) goto yy108;
 726                 goto yy95;
 727 yy103:
 728                 yyaccept = 1;
 729                 yych = *(YYMARKER = ++YYCURSOR);
 730                 if (yych <= 0x7F) goto yy95;
 731                 if (yych >= 0x90) goto yy95;
 732                 yych = *++YYCURSOR;
 733                 if (yych <= 0x7F) goto yy105;
 734                 if (yych <= 0xBF) goto yy106;
 735 yy105:
 736                 YYCURSOR = YYMARKER;
 737                 if (yyaccept <= 1) {
 738                         if (yyaccept == 0) {
 739                                 goto yy93;
 740                         } else {
 741                                 goto yy95;
 742                         }
 743                 } else {
 744                         goto yy127;
 745                 }
 746 yy106:
 747                 yych = *++YYCURSOR;
 748                 if (yych <= 0x7F) goto yy105;
 749                 if (yych >= 0xC0) goto yy105;
 750 yy107:
 751                 yych = *++YYCURSOR;
 752                 goto yy89;
 753 yy108:
 754                 yych = *++YYCURSOR;
 755                 if (yych <= 0x7F) goto yy105;
 756                 if (yych >= 0xC0) goto yy105;
 757                 yych = *++YYCURSOR;
 758                 if (yych <= 0x7F) goto yy105;
 759                 if (yych <= 0xBF) goto yy107;
 760                 goto yy105;
 761 yy110:
 762                 yych = *++YYCURSOR;
 763                 if (yych <= 0x7F) goto yy105;
 764                 if (yych >= 0xC0) goto yy105;
 765                 yych = *++YYCURSOR;
 766                 if (yych <= 0x7F) goto yy105;
 767                 if (yych <= 0xBF) goto yy107;
 768                 goto yy105;
 769 yy112:
 770                 yych = *++YYCURSOR;
 771                 if (yych <= 0x7F) goto yy105;
 772                 if (yych <= 0xBF) goto yy107;
 773                 goto yy105;
 774 yy113:
 775                 yych = *++YYCURSOR;
 776                 if (yych <= 0x7F) goto yy105;
 777                 if (yych <= 0xBF) goto yy107;
 778                 goto yy105;
 779 yy114:
 780                 yych = *++YYCURSOR;
 781                 if (yych <= 0x7F) goto yy105;
 782                 if (yych <= 0xBF) goto yy107;
 783                 goto yy105;
 784 yy115:
 785                 yych = *++YYCURSOR;
 786                 if (yych <= 0x7F) goto yy105;
 787                 if (yych <= 0xBF) goto yy107;
 788                 goto yy105;
 789 yy116:
 790                 ++YYCURSOR;
 791                 {
 792                 s->str_esc++;
 793                 PHP_JSON_CONDITION_GOTO(STR_P1);
 794         }
 795 yy118:
 796                 yych = *++YYCURSOR;
 797                 if (yych <= 'D') {
 798                         if (yych <= '9') {
 799                                 if (yych <= '/') goto yy105;
 800                                 if (yych >= '1') goto yy120;
 801                         } else {
 802                                 if (yych <= '@') goto yy105;
 803                                 if (yych <= 'C') goto yy120;
 804                                 goto yy121;
 805                         }
 806                 } else {
 807                         if (yych <= 'c') {
 808                                 if (yych <= 'F') goto yy120;
 809                                 if (yych <= '`') goto yy105;
 810                                 goto yy120;
 811                         } else {
 812                                 if (yych <= 'd') goto yy121;
 813                                 if (yych <= 'f') goto yy120;
 814                                 goto yy105;
 815                         }
 816                 }
 817                 yych = *++YYCURSOR;
 818                 if (yych <= '9') {
 819                         if (yych <= '/') goto yy105;
 820                         if (yych <= '0') goto yy140;
 821                         if (yych <= '7') goto yy141;
 822                         goto yy122;
 823                 } else {
 824                         if (yych <= 'F') {
 825                                 if (yych <= '@') goto yy105;
 826                                 goto yy122;
 827                         } else {
 828                                 if (yych <= '`') goto yy105;
 829                                 if (yych <= 'f') goto yy122;
 830                                 goto yy105;
 831                         }
 832                 }
 833 yy120:
 834                 yych = *++YYCURSOR;
 835                 if (yych <= '@') {
 836                         if (yych <= '/') goto yy105;
 837                         if (yych <= '9') goto yy122;
 838                         goto yy105;
 839                 } else {
 840                         if (yych <= 'F') goto yy122;
 841                         if (yych <= '`') goto yy105;
 842                         if (yych <= 'f') goto yy122;
 843                         goto yy105;
 844                 }
 845 yy121:
 846                 yych = *++YYCURSOR;
 847                 if (yych <= 'B') {
 848                         if (yych <= '7') {
 849                                 if (yych <= '/') goto yy105;
 850                         } else {
 851                                 if (yych <= '9') goto yy123;
 852                                 if (yych <= '@') goto yy105;
 853                                 goto yy123;
 854                         }
 855                 } else {
 856                         if (yych <= '`') {
 857                                 if (yych <= 'F') goto yy124;
 858                                 goto yy105;
 859                         } else {
 860                                 if (yych <= 'b') goto yy123;
 861                                 if (yych <= 'f') goto yy124;
 862                                 goto yy105;
 863                         }
 864                 }
 865 yy122:
 866                 yych = *++YYCURSOR;
 867                 if (yych <= '@') {
 868                         if (yych <= '/') goto yy105;
 869                         if (yych <= '9') goto yy137;
 870                         goto yy105;
 871                 } else {
 872                         if (yych <= 'F') goto yy137;
 873                         if (yych <= '`') goto yy105;
 874                         if (yych <= 'f') goto yy137;
 875                         goto yy105;
 876                 }
 877 yy123:
 878                 yych = *++YYCURSOR;
 879                 if (yych <= '@') {
 880                         if (yych <= '/') goto yy105;
 881                         if (yych <= '9') goto yy128;
 882                         goto yy105;
 883                 } else {
 884                         if (yych <= 'F') goto yy128;
 885                         if (yych <= '`') goto yy105;
 886                         if (yych <= 'f') goto yy128;
 887                         goto yy105;
 888                 }
 889 yy124:
 890                 yych = *++YYCURSOR;
 891                 if (yych <= '@') {
 892                         if (yych <= '/') goto yy105;
 893                         if (yych >= ':') goto yy105;
 894                 } else {
 895                         if (yych <= 'F') goto yy125;
 896                         if (yych <= '`') goto yy105;
 897                         if (yych >= 'g') goto yy105;
 898                 }
 899 yy125:
 900                 yych = *++YYCURSOR;
 901                 if (yych <= '@') {
 902                         if (yych <= '/') goto yy105;
 903                         if (yych >= ':') goto yy105;
 904                 } else {
 905                         if (yych <= 'F') goto yy126;
 906                         if (yych <= '`') goto yy105;
 907                         if (yych >= 'g') goto yy105;
 908                 }
 909 yy126:
 910                 ++YYCURSOR;
 911 yy127:
 912                 {
 913                 s->errcode = PHP_JSON_ERROR_UTF16;
 914                 return PHP_JSON_T_ERROR;
 915         }
 916 yy128:
 917                 yych = *++YYCURSOR;
 918                 if (yych <= '@') {
 919                         if (yych <= '/') goto yy105;
 920                         if (yych >= ':') goto yy105;
 921                 } else {
 922                         if (yych <= 'F') goto yy129;
 923                         if (yych <= '`') goto yy105;
 924                         if (yych >= 'g') goto yy105;
 925                 }
 926 yy129:
 927                 yyaccept = 2;
 928                 yych = *(YYMARKER = ++YYCURSOR);
 929                 if (yych != '\\') goto yy127;
 930                 yych = *++YYCURSOR;
 931                 if (yych != 'u') goto yy105;
 932                 yych = *++YYCURSOR;
 933                 if (yych == 'D') goto yy132;
 934                 if (yych != 'd') goto yy105;
 935 yy132:
 936                 yych = *++YYCURSOR;
 937                 if (yych <= 'B') goto yy105;
 938                 if (yych <= 'F') goto yy133;
 939                 if (yych <= 'b') goto yy105;
 940                 if (yych >= 'g') goto yy105;
 941 yy133:
 942                 yych = *++YYCURSOR;
 943                 if (yych <= '@') {
 944                         if (yych <= '/') goto yy105;
 945                         if (yych >= ':') goto yy105;
 946                 } else {
 947                         if (yych <= 'F') goto yy134;
 948                         if (yych <= '`') goto yy105;
 949                         if (yych >= 'g') goto yy105;
 950                 }
 951 yy134:
 952                 yych = *++YYCURSOR;
 953                 if (yych <= '@') {
 954                         if (yych <= '/') goto yy105;
 955                         if (yych >= ':') goto yy105;
 956                 } else {
 957                         if (yych <= 'F') goto yy135;
 958                         if (yych <= '`') goto yy105;
 959                         if (yych >= 'g') goto yy105;
 960                 }
 961 yy135:
 962                 ++YYCURSOR;
 963                 {
 964                 s->str_esc += 8;
 965                 PHP_JSON_CONDITION_GOTO(STR_P1);
 966         }
 967 yy137:
 968                 yych = *++YYCURSOR;
 969                 if (yych <= '@') {
 970                         if (yych <= '/') goto yy105;
 971                         if (yych >= ':') goto yy105;
 972                 } else {
 973                         if (yych <= 'F') goto yy138;
 974                         if (yych <= '`') goto yy105;
 975                         if (yych >= 'g') goto yy105;
 976                 }
 977 yy138:
 978                 ++YYCURSOR;
 979                 {
 980                 s->str_esc += 3;
 981                 PHP_JSON_CONDITION_GOTO(STR_P1);
 982         }
 983 yy140:
 984                 yych = *++YYCURSOR;
 985                 if (yych <= '@') {
 986                         if (yych <= '/') goto yy105;
 987                         if (yych <= '7') goto yy145;
 988                         if (yych <= '9') goto yy142;
 989                         goto yy105;
 990                 } else {
 991                         if (yych <= 'F') goto yy142;
 992                         if (yych <= '`') goto yy105;
 993                         if (yych <= 'f') goto yy142;
 994                         goto yy105;
 995                 }
 996 yy141:
 997                 yych = *++YYCURSOR;
 998                 if (yych <= '@') {
 999                         if (yych <= '/') goto yy105;
1000                         if (yych >= ':') goto yy105;
1001                 } else {
1002                         if (yych <= 'F') goto yy142;
1003                         if (yych <= '`') goto yy105;
1004                         if (yych >= 'g') goto yy105;
1005                 }
1006 yy142:
1007                 yych = *++YYCURSOR;
1008                 if (yych <= '@') {
1009                         if (yych <= '/') goto yy105;
1010                         if (yych >= ':') goto yy105;
1011                 } else {
1012                         if (yych <= 'F') goto yy143;
1013                         if (yych <= '`') goto yy105;
1014                         if (yych >= 'g') goto yy105;
1015                 }
1016 yy143:
1017                 ++YYCURSOR;
1018                 {
1019                 s->str_esc += 4;
1020                 PHP_JSON_CONDITION_GOTO(STR_P1);
1021         }
1022 yy145:
1023                 yych = *++YYCURSOR;
1024                 if (yych <= '@') {
1025                         if (yych <= '/') goto yy105;
1026                         if (yych >= ':') goto yy105;
1027                 } else {
1028                         if (yych <= 'F') goto yy146;
1029                         if (yych <= '`') goto yy105;
1030                         if (yych >= 'g') goto yy105;
1031                 }
1032 yy146:
1033                 ++YYCURSOR;
1034                 {
1035                 s->str_esc += 5;
1036                 PHP_JSON_CONDITION_GOTO(STR_P1);
1037         }
1038 /* *********************************** */
1039 yyc_STR_P2:
1040                 yych = *YYCURSOR;
1041                 if (yych == '"') goto yy152;
1042                 if (yych == '\\') goto yy154;
1043                 ++YYCURSOR;
1044                 { PHP_JSON_CONDITION_GOTO(STR_P2); }
1045 yy152:
1046                 ++YYCURSOR;
1047                 YYSETCONDITION(yycJS);
1048                 {
1049                 PHP_JSON_SCANNER_COPY_ESC();
1050                 return PHP_JSON_T_STRING;
1051         }
1052 yy154:
1053                 yyaccept = 0;
1054                 yych = *(YYMARKER = ++YYCURSOR);
1055                 if (yych == 'u') goto yy156;
1056 yy155:
1057                 {
1058                 char esc;
1059                 PHP_JSON_SCANNER_COPY_ESC();
1060                 switch (*s->cursor) {
1061                         case 'b':
1062                                 esc = '\b';
1063                                 break;
1064                         case 'f':
1065                                 esc = '\f';
1066                                 break;
1067                         case 'n':
1068                                 esc = '\n';
1069                                 break;
1070                         case 'r':
1071                                 esc = '\r';
1072                                 break;
1073                         case 't':
1074                                 esc = '\t';
1075                                 break;
1076                         case '\\':
1077                         case '/':
1078                         case '"':
1079                                 esc = *s->cursor;
1080                                 break;
1081                         default:
1082                                 s->errcode = PHP_JSON_ERROR_SYNTAX;
1083                                 return PHP_JSON_T_ERROR;
1084                 }
1085                 *(s->pstr++) = esc;
1086                 ++YYCURSOR;
1087                 s->str_start = s->cursor;
1088                 PHP_JSON_CONDITION_GOTO(STR_P2);
1089         }
1090 yy156:
1091                 yych = *++YYCURSOR;
1092                 if (yych <= 'D') {
1093                         if (yych <= '9') {
1094                                 if (yych <= '/') goto yy157;
1095                                 if (yych <= '0') goto yy158;
1096                                 goto yy159;
1097                         } else {
1098                                 if (yych <= '@') goto yy157;
1099                                 if (yych <= 'C') goto yy159;
1100                                 goto yy160;
1101                         }
1102                 } else {
1103                         if (yych <= 'c') {
1104                                 if (yych <= 'F') goto yy159;
1105                                 if (yych >= 'a') goto yy159;
1106                         } else {
1107                                 if (yych <= 'd') goto yy160;
1108                                 if (yych <= 'f') goto yy159;
1109                         }
1110                 }
1111 yy157:
1112                 YYCURSOR = YYMARKER;
1113                 goto yy155;
1114 yy158:
1115                 yych = *++YYCURSOR;
1116                 if (yych <= '9') {
1117                         if (yych <= '/') goto yy157;
1118                         if (yych <= '0') goto yy175;
1119                         if (yych <= '7') goto yy176;
1120                         goto yy162;
1121                 } else {
1122                         if (yych <= 'F') {
1123                                 if (yych <= '@') goto yy157;
1124                                 goto yy162;
1125                         } else {
1126                                 if (yych <= '`') goto yy157;
1127                                 if (yych <= 'f') goto yy162;
1128                                 goto yy157;
1129                         }
1130                 }
1131 yy159:
1132                 yych = *++YYCURSOR;
1133                 if (yych <= '@') {
1134                         if (yych <= '/') goto yy157;
1135                         if (yych <= '9') goto yy162;
1136                         goto yy157;
1137                 } else {
1138                         if (yych <= 'F') goto yy162;
1139                         if (yych <= '`') goto yy157;
1140                         if (yych <= 'f') goto yy162;
1141                         goto yy157;
1142                 }
1143 yy160:
1144                 yych = *++YYCURSOR;
1145                 if (yych <= '@') {
1146                         if (yych <= '/') goto yy157;
1147                         if (yych <= '7') goto yy162;
1148                         if (yych >= ':') goto yy157;
1149                 } else {
1150                         if (yych <= 'B') goto yy161;
1151                         if (yych <= '`') goto yy157;
1152                         if (yych >= 'c') goto yy157;
1153                 }
1154 yy161:
1155                 yych = *++YYCURSOR;
1156                 if (yych <= '@') {
1157                         if (yych <= '/') goto yy157;
1158                         if (yych <= '9') goto yy166;
1159                         goto yy157;
1160                 } else {
1161                         if (yych <= 'F') goto yy166;
1162                         if (yych <= '`') goto yy157;
1163                         if (yych <= 'f') goto yy166;
1164                         goto yy157;
1165                 }
1166 yy162:
1167                 yych = *++YYCURSOR;
1168                 if (yych <= '@') {
1169                         if (yych <= '/') goto yy157;
1170                         if (yych >= ':') goto yy157;
1171                 } else {
1172                         if (yych <= 'F') goto yy163;
1173                         if (yych <= '`') goto yy157;
1174                         if (yych >= 'g') goto yy157;
1175                 }
1176 yy163:
1177                 yych = *++YYCURSOR;
1178                 if (yych <= '@') {
1179                         if (yych <= '/') goto yy157;
1180                         if (yych >= ':') goto yy157;
1181                 } else {
1182                         if (yych <= 'F') goto yy164;
1183                         if (yych <= '`') goto yy157;
1184                         if (yych >= 'g') goto yy157;
1185                 }
1186 yy164:
1187                 ++YYCURSOR;
1188                 {
1189                 int utf16 = php_json_ucs2_to_int(s, 4);
1190                 PHP_JSON_SCANNER_COPY_UTF();
1191                 *(s->pstr++) = (char) (0xe0 | (utf16 >> 12));
1192                 *(s->pstr++) = (char) (0x80 | ((utf16 >> 6) & 0x3f));
1193                 *(s->pstr++) = (char) (0x80 | (utf16 & 0x3f));
1194                 s->str_start = s->cursor;
1195                 PHP_JSON_CONDITION_GOTO(STR_P2);
1196         }
1197 yy166:
1198                 yych = *++YYCURSOR;
1199                 if (yych <= '@') {
1200                         if (yych <= '/') goto yy157;
1201                         if (yych >= ':') goto yy157;
1202                 } else {
1203                         if (yych <= 'F') goto yy167;
1204                         if (yych <= '`') goto yy157;
1205                         if (yych >= 'g') goto yy157;
1206                 }
1207 yy167:
1208                 yych = *++YYCURSOR;
1209                 if (yych != '\\') goto yy157;
1210                 yych = *++YYCURSOR;
1211                 if (yych != 'u') goto yy157;
1212                 yych = *++YYCURSOR;
1213                 if (yych == 'D') goto yy170;
1214                 if (yych != 'd') goto yy157;
1215 yy170:
1216                 yych = *++YYCURSOR;
1217                 if (yych <= 'B') goto yy157;
1218                 if (yych <= 'F') goto yy171;
1219                 if (yych <= 'b') goto yy157;
1220                 if (yych >= 'g') goto yy157;
1221 yy171:
1222                 yych = *++YYCURSOR;
1223                 if (yych <= '@') {
1224                         if (yych <= '/') goto yy157;
1225                         if (yych >= ':') goto yy157;
1226                 } else {
1227                         if (yych <= 'F') goto yy172;
1228                         if (yych <= '`') goto yy157;
1229                         if (yych >= 'g') goto yy157;
1230                 }
1231 yy172:
1232                 yych = *++YYCURSOR;
1233                 if (yych <= '@') {
1234                         if (yych <= '/') goto yy157;
1235                         if (yych >= ':') goto yy157;
1236                 } else {
1237                         if (yych <= 'F') goto yy173;
1238                         if (yych <= '`') goto yy157;
1239                         if (yych >= 'g') goto yy157;
1240                 }
1241 yy173:
1242                 ++YYCURSOR;
1243                 {
1244                 int utf32, utf16_hi, utf16_lo;
1245                 utf16_hi = php_json_ucs2_to_int(s, 4);
1246                 utf16_lo = php_json_ucs2_to_int_ex(s, 4, 7);
1247                 utf32 = ((utf16_lo & 0x3FF) << 10) + (utf16_hi & 0x3FF) + 0x10000;
1248                 PHP_JSON_SCANNER_COPY_UTF_SP();
1249                 *(s->pstr++) = (char) (0xf0 | (utf32 >> 18));
1250                 *(s->pstr++) = (char) (0x80 | ((utf32 >> 12) & 0x3f));
1251                 *(s->pstr++) = (char) (0x80 | ((utf32 >> 6) & 0x3f));
1252                 *(s->pstr++) = (char) (0x80 | (utf32 & 0x3f));
1253                 s->str_start = s->cursor;
1254                 PHP_JSON_CONDITION_GOTO(STR_P2);
1255         }
1256 yy175:
1257                 yych = *++YYCURSOR;
1258                 if (yych <= '@') {
1259                         if (yych <= '/') goto yy157;
1260                         if (yych <= '7') goto yy180;
1261                         if (yych <= '9') goto yy177;
1262                         goto yy157;
1263                 } else {
1264                         if (yych <= 'F') goto yy177;
1265                         if (yych <= '`') goto yy157;
1266                         if (yych <= 'f') goto yy177;
1267                         goto yy157;
1268                 }
1269 yy176:
1270                 yych = *++YYCURSOR;
1271                 if (yych <= '@') {
1272                         if (yych <= '/') goto yy157;
1273                         if (yych >= ':') goto yy157;
1274                 } else {
1275                         if (yych <= 'F') goto yy177;
1276                         if (yych <= '`') goto yy157;
1277                         if (yych >= 'g') goto yy157;
1278                 }
1279 yy177:
1280                 yych = *++YYCURSOR;
1281                 if (yych <= '@') {
1282                         if (yych <= '/') goto yy157;
1283                         if (yych >= ':') goto yy157;
1284                 } else {
1285                         if (yych <= 'F') goto yy178;
1286                         if (yych <= '`') goto yy157;
1287                         if (yych >= 'g') goto yy157;
1288                 }
1289 yy178:
1290                 ++YYCURSOR;
1291                 {
1292                 int utf16 = php_json_ucs2_to_int(s, 3);
1293                 PHP_JSON_SCANNER_COPY_UTF();
1294                 *(s->pstr++) = (char) (0xc0 | (utf16 >> 6));
1295                 *(s->pstr++) = (char) (0x80 | (utf16 & 0x3f));
1296                 s->str_start = s->cursor;
1297                 PHP_JSON_CONDITION_GOTO(STR_P2);
1298         }
1299 yy180:
1300                 yych = *++YYCURSOR;
1301                 if (yych <= '@') {
1302                         if (yych <= '/') goto yy157;
1303                         if (yych >= ':') goto yy157;
1304                 } else {
1305                         if (yych <= 'F') goto yy181;
1306                         if (yych <= '`') goto yy157;
1307                         if (yych >= 'g') goto yy157;
1308                 }
1309 yy181:
1310                 ++YYCURSOR;
1311                 {
1312                 int utf16 = php_json_ucs2_to_int(s, 2);
1313                 PHP_JSON_SCANNER_COPY_UTF();
1314                 *(s->pstr++) = (char) utf16;
1315                 s->str_start = s->cursor;
1316                 PHP_JSON_CONDITION_GOTO(STR_P2);
1317         }
1318         }
1319 
1320 
1321 }
1322 

/* [<][>][^][v][top][bottom][index][help] */