1 /* Generated by re2c 0.16 */
2 /*
3 +----------------------------------------------------------------------+
4 | PHP Version 7 |
5 +----------------------------------------------------------------------+
6 | Copyright (c) 1997-2018 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 #define PHP_JSON_CONDITION_SET_AND_GOTO(condition) \
40 PHP_JSON_CONDITION_SET(condition); \
41 PHP_JSON_CONDITION_GOTO(condition)
42 #define PHP_JSON_CONDITION_GOTO_STR_P2() \
43 do { \
44 if (s->utf8_invalid) { \
45 PHP_JSON_CONDITION_GOTO(STR_P2_BIN); \
46 } else { \
47 PHP_JSON_CONDITION_GOTO(STR_P2_UTF); \
48 } \
49 } while(0)
50
51
52 #define PHP_JSON_SCANNER_COPY_ESC() php_json_scanner_copy_string(s, 0)
53 #define PHP_JSON_SCANNER_COPY_UTF() php_json_scanner_copy_string(s, 5)
54 #define PHP_JSON_SCANNER_COPY_UTF_SP() php_json_scanner_copy_string(s, 11)
55
56 #define PHP_JSON_INT_MAX_LENGTH (MAX_LENGTH_OF_LONG - 1)
57
58
php_json_scanner_copy_string(php_json_scanner * s,int esc_size)59 static void php_json_scanner_copy_string(php_json_scanner *s, int esc_size)
60 {
61 size_t len = s->cursor - s->str_start - esc_size - 1;
62 if (len) {
63 memcpy(s->pstr, s->str_start, len);
64 s->pstr += len;
65 }
66 }
67
php_json_hex_to_int(char code)68 static int php_json_hex_to_int(char code)
69 {
70 if (code >= '0' && code <= '9') {
71 return code - '0';
72 } else if (code >= 'A' && code <= 'F') {
73 return code - ('A' - 10);
74 } else if (code >= 'a' && code <= 'f') {
75 return code - ('a' - 10);
76 } else {
77 /* this should never happened (just to suppress compiler warning) */
78 return -1;
79 }
80 }
81
php_json_ucs2_to_int_ex(php_json_scanner * s,int size,int start)82 static int php_json_ucs2_to_int_ex(php_json_scanner *s, int size, int start)
83 {
84 int i, code = 0;
85 php_json_ctype *pc = s->cursor - start;
86 for (i = 0; i < size; i++) {
87 code |= php_json_hex_to_int(*(pc--)) << (i * 4);
88 }
89 return code;
90 }
91
php_json_ucs2_to_int(php_json_scanner * s,int size)92 static int php_json_ucs2_to_int(php_json_scanner *s, int size)
93 {
94 return php_json_ucs2_to_int_ex(s, size, 1);
95 }
96
php_json_scanner_init(php_json_scanner * s,char * str,size_t str_len,int options)97 void php_json_scanner_init(php_json_scanner *s, char *str, size_t str_len, int options)
98 {
99 s->cursor = (php_json_ctype *) str;
100 s->limit = (php_json_ctype *) str + str_len;
101 s->options = options;
102 PHP_JSON_CONDITION_SET(JS);
103 }
104
php_json_scan(php_json_scanner * s)105 int php_json_scan(php_json_scanner *s)
106 {
107 ZVAL_NULL(&s->value);
108
109 std:
110 s->token = s->cursor;
111
112
113 {
114 YYCTYPE yych;
115 unsigned int yyaccept = 0;
116 if (YYGETCONDITION() < 2) {
117 if (YYGETCONDITION() < 1) {
118 goto yyc_JS;
119 } else {
120 goto yyc_STR_P1;
121 }
122 } else {
123 if (YYGETCONDITION() < 3) {
124 goto yyc_STR_P2_BIN;
125 } else {
126 goto yyc_STR_P2_UTF;
127 }
128 }
129 /* *********************************** */
130 yyc_JS:
131 {
132 static const unsigned char yybm[] = {
133 0, 0, 0, 0, 0, 0, 0, 0,
134 0, 64, 0, 0, 0, 64, 0, 0,
135 0, 0, 0, 0, 0, 0, 0, 0,
136 0, 0, 0, 0, 0, 0, 0, 0,
137 64, 0, 0, 0, 0, 0, 0, 0,
138 0, 0, 0, 0, 0, 0, 0, 0,
139 128, 128, 128, 128, 128, 128, 128, 128,
140 128, 128, 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 0, 0, 0, 0, 0, 0, 0, 0,
150 0, 0, 0, 0, 0, 0, 0, 0,
151 0, 0, 0, 0, 0, 0, 0, 0,
152 0, 0, 0, 0, 0, 0, 0, 0,
153 0, 0, 0, 0, 0, 0, 0, 0,
154 0, 0, 0, 0, 0, 0, 0, 0,
155 0, 0, 0, 0, 0, 0, 0, 0,
156 0, 0, 0, 0, 0, 0, 0, 0,
157 0, 0, 0, 0, 0, 0, 0, 0,
158 0, 0, 0, 0, 0, 0, 0, 0,
159 0, 0, 0, 0, 0, 0, 0, 0,
160 0, 0, 0, 0, 0, 0, 0, 0,
161 0, 0, 0, 0, 0, 0, 0, 0,
162 0, 0, 0, 0, 0, 0, 0, 0,
163 0, 0, 0, 0, 0, 0, 0, 0,
164 0, 0, 0, 0, 0, 0, 0, 0,
165 };
166 yych = *YYCURSOR;
167 if (yych <= ']') {
168 if (yych <= '"') {
169 if (yych <= '\f') {
170 if (yych <= 0x08) {
171 if (yych >= 0x01) goto yy5;
172 } else {
173 if (yych <= '\t') goto yy7;
174 if (yych <= '\n') goto yy10;
175 goto yy5;
176 }
177 } else {
178 if (yych <= 0x1F) {
179 if (yych <= '\r') goto yy11;
180 goto yy5;
181 } else {
182 if (yych <= ' ') goto yy7;
183 if (yych <= '!') goto yy12;
184 goto yy14;
185 }
186 }
187 } else {
188 if (yych <= '0') {
189 if (yych <= ',') {
190 if (yych <= '+') goto yy12;
191 goto yy16;
192 } else {
193 if (yych <= '-') goto yy18;
194 if (yych <= '/') goto yy12;
195 goto yy19;
196 }
197 } else {
198 if (yych <= 'Z') {
199 if (yych <= '9') goto yy21;
200 if (yych <= ':') goto yy23;
201 goto yy12;
202 } else {
203 if (yych <= '[') goto yy25;
204 if (yych <= '\\') goto yy12;
205 goto yy27;
206 }
207 }
208 }
209 } else {
210 if (yych <= '}') {
211 if (yych <= 's') {
212 if (yych <= 'f') {
213 if (yych <= 'e') goto yy12;
214 goto yy29;
215 } else {
216 if (yych == 'n') goto yy30;
217 goto yy12;
218 }
219 } else {
220 if (yych <= 'z') {
221 if (yych <= 't') goto yy31;
222 goto yy12;
223 } else {
224 if (yych <= '{') goto yy32;
225 if (yych <= '|') goto yy12;
226 goto yy34;
227 }
228 }
229 } else {
230 if (yych <= 0xEC) {
231 if (yych <= 0xC1) {
232 if (yych <= 0x7F) goto yy12;
233 goto yy36;
234 } else {
235 if (yych <= 0xDF) goto yy38;
236 if (yych <= 0xE0) goto yy39;
237 goto yy40;
238 }
239 } else {
240 if (yych <= 0xF0) {
241 if (yych <= 0xED) goto yy41;
242 if (yych <= 0xEF) goto yy40;
243 goto yy42;
244 } else {
245 if (yych <= 0xF3) goto yy43;
246 if (yych <= 0xF4) goto yy44;
247 goto yy36;
248 }
249 }
250 }
251 }
252 ++YYCURSOR;
253 {
254 if (s->limit < s->cursor) {
255 return PHP_JSON_T_EOI;
256 } else {
257 s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
258 return PHP_JSON_T_ERROR;
259 }
260 }
261 yy5:
262 ++YYCURSOR;
263 {
264 s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
265 return PHP_JSON_T_ERROR;
266 }
267 yy7:
268 ++YYCURSOR;
269 yych = *YYCURSOR;
270 yy8:
271 if (yybm[0+yych] & 64) {
272 goto yy7;
273 }
274 yy9:
275 { goto std; }
276 yy10:
277 yych = *++YYCURSOR;
278 goto yy9;
279 yy11:
280 yych = *++YYCURSOR;
281 if (yych == '\n') goto yy10;
282 goto yy8;
283 yy12:
284 ++YYCURSOR;
285 yy13:
286 {
287 s->errcode = PHP_JSON_ERROR_SYNTAX;
288 return PHP_JSON_T_ERROR;
289 }
290 yy14:
291 ++YYCURSOR;
292 {
293 s->str_start = s->cursor;
294 s->str_esc = 0;
295 s->utf8_invalid = 0;
296 s->utf8_invalid_count = 0;
297 PHP_JSON_CONDITION_SET_AND_GOTO(STR_P1);
298 }
299 yy16:
300 ++YYCURSOR;
301 { return ','; }
302 yy18:
303 yych = *++YYCURSOR;
304 if (yych <= '/') goto yy13;
305 if (yych <= '0') goto yy19;
306 if (yych <= '9') goto yy21;
307 goto yy13;
308 yy19:
309 yyaccept = 0;
310 yych = *(YYMARKER = ++YYCURSOR);
311 if (yych <= 'D') {
312 if (yych == '.') goto yy45;
313 } else {
314 if (yych <= 'E') goto yy47;
315 if (yych == 'e') goto yy47;
316 }
317 yy20:
318 {
319 zend_bool bigint = 0, negative = s->token[0] == '-';
320 size_t digits = (size_t) (s->cursor - s->token - negative);
321 if (digits >= PHP_JSON_INT_MAX_LENGTH) {
322 if (digits == PHP_JSON_INT_MAX_LENGTH) {
323 int cmp = strncmp((char *) (s->token + negative), LONG_MIN_DIGITS, PHP_JSON_INT_MAX_LENGTH);
324 if (!(cmp < 0 || (cmp == 0 && negative))) {
325 bigint = 1;
326 }
327 } else {
328 bigint = 1;
329 }
330 }
331 if (!bigint) {
332 ZVAL_LONG(&s->value, ZEND_STRTOL((char *) s->token, NULL, 10));
333 return PHP_JSON_T_INT;
334 } else if (s->options & PHP_JSON_BIGINT_AS_STRING) {
335 ZVAL_STRINGL(&s->value, (char *) s->token, s->cursor - s->token);
336 return PHP_JSON_T_STRING;
337 } else {
338 ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL));
339 return PHP_JSON_T_DOUBLE;
340 }
341 }
342 yy21:
343 yyaccept = 0;
344 YYMARKER = ++YYCURSOR;
345 yych = *YYCURSOR;
346 if (yybm[0+yych] & 128) {
347 goto yy21;
348 }
349 if (yych <= 'D') {
350 if (yych == '.') goto yy45;
351 goto yy20;
352 } else {
353 if (yych <= 'E') goto yy47;
354 if (yych == 'e') goto yy47;
355 goto yy20;
356 }
357 yy23:
358 ++YYCURSOR;
359 { return ':'; }
360 yy25:
361 ++YYCURSOR;
362 { return '['; }
363 yy27:
364 ++YYCURSOR;
365 { return ']'; }
366 yy29:
367 yyaccept = 1;
368 yych = *(YYMARKER = ++YYCURSOR);
369 if (yych == 'a') goto yy48;
370 goto yy13;
371 yy30:
372 yyaccept = 1;
373 yych = *(YYMARKER = ++YYCURSOR);
374 if (yych == 'u') goto yy49;
375 goto yy13;
376 yy31:
377 yyaccept = 1;
378 yych = *(YYMARKER = ++YYCURSOR);
379 if (yych == 'r') goto yy50;
380 goto yy13;
381 yy32:
382 ++YYCURSOR;
383 { return '{'; }
384 yy34:
385 ++YYCURSOR;
386 { return '}'; }
387 yy36:
388 ++YYCURSOR;
389 yy37:
390 {
391 s->errcode = PHP_JSON_ERROR_UTF8;
392 return PHP_JSON_T_ERROR;
393 }
394 yy38:
395 yych = *++YYCURSOR;
396 if (yych <= 0x7F) goto yy37;
397 if (yych <= 0xBF) goto yy12;
398 goto yy37;
399 yy39:
400 yyaccept = 2;
401 yych = *(YYMARKER = ++YYCURSOR);
402 if (yych <= 0x9F) goto yy37;
403 if (yych <= 0xBF) goto yy51;
404 goto yy37;
405 yy40:
406 yyaccept = 2;
407 yych = *(YYMARKER = ++YYCURSOR);
408 if (yych <= 0x7F) goto yy37;
409 if (yych <= 0xBF) goto yy51;
410 goto yy37;
411 yy41:
412 yyaccept = 2;
413 yych = *(YYMARKER = ++YYCURSOR);
414 if (yych <= 0x7F) goto yy37;
415 if (yych <= 0x9F) goto yy51;
416 goto yy37;
417 yy42:
418 yyaccept = 2;
419 yych = *(YYMARKER = ++YYCURSOR);
420 if (yych <= 0x8F) goto yy37;
421 if (yych <= 0xBF) goto yy52;
422 goto yy37;
423 yy43:
424 yyaccept = 2;
425 yych = *(YYMARKER = ++YYCURSOR);
426 if (yych <= 0x7F) goto yy37;
427 if (yych <= 0xBF) goto yy52;
428 goto yy37;
429 yy44:
430 yyaccept = 2;
431 yych = *(YYMARKER = ++YYCURSOR);
432 if (yych <= 0x7F) goto yy37;
433 if (yych <= 0x8F) goto yy52;
434 goto yy37;
435 yy45:
436 yych = *++YYCURSOR;
437 if (yych <= '/') goto yy46;
438 if (yych <= '9') goto yy53;
439 yy46:
440 YYCURSOR = YYMARKER;
441 if (yyaccept <= 1) {
442 if (yyaccept == 0) {
443 goto yy20;
444 } else {
445 goto yy13;
446 }
447 } else {
448 if (yyaccept == 2) {
449 goto yy37;
450 } else {
451 goto yy55;
452 }
453 }
454 yy47:
455 yych = *++YYCURSOR;
456 if (yych <= ',') {
457 if (yych == '+') goto yy56;
458 goto yy46;
459 } else {
460 if (yych <= '-') goto yy56;
461 if (yych <= '/') goto yy46;
462 if (yych <= '9') goto yy57;
463 goto yy46;
464 }
465 yy48:
466 yych = *++YYCURSOR;
467 if (yych == 'l') goto yy59;
468 goto yy46;
469 yy49:
470 yych = *++YYCURSOR;
471 if (yych == 'l') goto yy60;
472 goto yy46;
473 yy50:
474 yych = *++YYCURSOR;
475 if (yych == 'u') goto yy61;
476 goto yy46;
477 yy51:
478 yych = *++YYCURSOR;
479 if (yych <= 0x7F) goto yy46;
480 if (yych <= 0xBF) goto yy12;
481 goto yy46;
482 yy52:
483 yych = *++YYCURSOR;
484 if (yych <= 0x7F) goto yy46;
485 if (yych <= 0xBF) goto yy51;
486 goto yy46;
487 yy53:
488 yyaccept = 3;
489 YYMARKER = ++YYCURSOR;
490 yych = *YYCURSOR;
491 if (yych <= 'D') {
492 if (yych <= '/') goto yy55;
493 if (yych <= '9') goto yy53;
494 } else {
495 if (yych <= 'E') goto yy47;
496 if (yych == 'e') goto yy47;
497 }
498 yy55:
499 {
500 ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL));
501 return PHP_JSON_T_DOUBLE;
502 }
503 yy56:
504 yych = *++YYCURSOR;
505 if (yych <= '/') goto yy46;
506 if (yych >= ':') goto yy46;
507 yy57:
508 ++YYCURSOR;
509 yych = *YYCURSOR;
510 if (yych <= '/') goto yy55;
511 if (yych <= '9') goto yy57;
512 goto yy55;
513 yy59:
514 yych = *++YYCURSOR;
515 if (yych == 's') goto yy62;
516 goto yy46;
517 yy60:
518 yych = *++YYCURSOR;
519 if (yych == 'l') goto yy63;
520 goto yy46;
521 yy61:
522 yych = *++YYCURSOR;
523 if (yych == 'e') goto yy65;
524 goto yy46;
525 yy62:
526 yych = *++YYCURSOR;
527 if (yych == 'e') goto yy67;
528 goto yy46;
529 yy63:
530 ++YYCURSOR;
531 {
532 ZVAL_NULL(&s->value);
533 return PHP_JSON_T_NUL;
534 }
535 yy65:
536 ++YYCURSOR;
537 {
538 ZVAL_TRUE(&s->value);
539 return PHP_JSON_T_TRUE;
540 }
541 yy67:
542 ++YYCURSOR;
543 {
544 ZVAL_FALSE(&s->value);
545 return PHP_JSON_T_FALSE;
546 }
547 }
548 /* *********************************** */
549 yyc_STR_P1:
550 yych = *YYCURSOR;
551 if (yych <= 0xDF) {
552 if (yych <= '[') {
553 if (yych <= 0x1F) goto yy71;
554 if (yych == '"') goto yy75;
555 goto yy73;
556 } else {
557 if (yych <= '\\') goto yy77;
558 if (yych <= 0x7F) goto yy73;
559 if (yych <= 0xC1) goto yy79;
560 goto yy81;
561 }
562 } else {
563 if (yych <= 0xEF) {
564 if (yych <= 0xE0) goto yy82;
565 if (yych == 0xED) goto yy84;
566 goto yy83;
567 } else {
568 if (yych <= 0xF0) goto yy85;
569 if (yych <= 0xF3) goto yy86;
570 if (yych <= 0xF4) goto yy87;
571 goto yy79;
572 }
573 }
574 yy71:
575 ++YYCURSOR;
576 {
577 s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
578 return PHP_JSON_T_ERROR;
579 }
580 yy73:
581 ++YYCURSOR;
582 { PHP_JSON_CONDITION_GOTO(STR_P1); }
583 yy75:
584 ++YYCURSOR;
585 {
586 zend_string *str;
587 size_t len = s->cursor - s->str_start - s->str_esc - 1 + s->utf8_invalid_count;
588 if (len == 0) {
589 PHP_JSON_CONDITION_SET(JS);
590 ZVAL_EMPTY_STRING(&s->value);
591 return PHP_JSON_T_ESTRING;
592 }
593 str = zend_string_alloc(len, 0);
594 ZSTR_VAL(str)[len] = '\0';
595 ZVAL_STR(&s->value, str);
596 if (s->str_esc || s->utf8_invalid) {
597 s->pstr = (php_json_ctype *) Z_STRVAL(s->value);
598 s->cursor = s->str_start;
599 PHP_JSON_CONDITION_GOTO_STR_P2();
600 } else {
601 memcpy(Z_STRVAL(s->value), s->str_start, len);
602 PHP_JSON_CONDITION_SET(JS);
603 return PHP_JSON_T_STRING;
604 }
605 }
606 yy77:
607 yyaccept = 0;
608 yych = *(YYMARKER = ++YYCURSOR);
609 if (yych <= 'e') {
610 if (yych <= '/') {
611 if (yych == '"') goto yy88;
612 if (yych >= '/') goto yy88;
613 } else {
614 if (yych <= '\\') {
615 if (yych >= '\\') goto yy88;
616 } else {
617 if (yych == 'b') goto yy88;
618 }
619 }
620 } else {
621 if (yych <= 'q') {
622 if (yych <= 'f') goto yy88;
623 if (yych == 'n') goto yy88;
624 } else {
625 if (yych <= 's') {
626 if (yych <= 'r') goto yy88;
627 } else {
628 if (yych <= 't') goto yy88;
629 if (yych <= 'u') goto yy90;
630 }
631 }
632 }
633 yy78:
634 {
635 s->errcode = PHP_JSON_ERROR_SYNTAX;
636 return PHP_JSON_T_ERROR;
637 }
638 yy79:
639 ++YYCURSOR;
640 yy80:
641 {
642 if (s->options & (PHP_JSON_INVALID_UTF8_IGNORE | PHP_JSON_INVALID_UTF8_SUBSTITUTE)) {
643 if (s->options & PHP_JSON_INVALID_UTF8_SUBSTITUTE) {
644 if (s->utf8_invalid_count > INT_MAX - 2) {
645 s->errcode = PHP_JSON_ERROR_UTF8;
646 return PHP_JSON_T_ERROR;
647 }
648 s->utf8_invalid_count += 2;
649 } else {
650 s->utf8_invalid_count--;
651 }
652 s->utf8_invalid = 1;
653 PHP_JSON_CONDITION_GOTO(STR_P1);
654 }
655 s->errcode = PHP_JSON_ERROR_UTF8;
656 return PHP_JSON_T_ERROR;
657 }
658 yy81:
659 yych = *++YYCURSOR;
660 if (yych <= 0x7F) goto yy80;
661 if (yych <= 0xBF) goto yy73;
662 goto yy80;
663 yy82:
664 yyaccept = 1;
665 yych = *(YYMARKER = ++YYCURSOR);
666 if (yych <= 0x9F) goto yy80;
667 if (yych <= 0xBF) goto yy92;
668 goto yy80;
669 yy83:
670 yyaccept = 1;
671 yych = *(YYMARKER = ++YYCURSOR);
672 if (yych <= 0x7F) goto yy80;
673 if (yych <= 0xBF) goto yy92;
674 goto yy80;
675 yy84:
676 yyaccept = 1;
677 yych = *(YYMARKER = ++YYCURSOR);
678 if (yych <= 0x7F) goto yy80;
679 if (yych <= 0x9F) goto yy92;
680 goto yy80;
681 yy85:
682 yyaccept = 1;
683 yych = *(YYMARKER = ++YYCURSOR);
684 if (yych <= 0x8F) goto yy80;
685 if (yych <= 0xBF) goto yy93;
686 goto yy80;
687 yy86:
688 yyaccept = 1;
689 yych = *(YYMARKER = ++YYCURSOR);
690 if (yych <= 0x7F) goto yy80;
691 if (yych <= 0xBF) goto yy93;
692 goto yy80;
693 yy87:
694 yyaccept = 1;
695 yych = *(YYMARKER = ++YYCURSOR);
696 if (yych <= 0x7F) goto yy80;
697 if (yych <= 0x8F) goto yy93;
698 goto yy80;
699 yy88:
700 ++YYCURSOR;
701 {
702 s->str_esc++;
703 PHP_JSON_CONDITION_GOTO(STR_P1);
704 }
705 yy90:
706 yych = *++YYCURSOR;
707 if (yych <= 'D') {
708 if (yych <= '9') {
709 if (yych <= '/') goto yy91;
710 if (yych <= '0') goto yy94;
711 goto yy95;
712 } else {
713 if (yych <= '@') goto yy91;
714 if (yych <= 'C') goto yy95;
715 goto yy96;
716 }
717 } else {
718 if (yych <= 'c') {
719 if (yych <= 'F') goto yy95;
720 if (yych >= 'a') goto yy95;
721 } else {
722 if (yych <= 'd') goto yy96;
723 if (yych <= 'f') goto yy95;
724 }
725 }
726 yy91:
727 YYCURSOR = YYMARKER;
728 if (yyaccept <= 1) {
729 if (yyaccept == 0) {
730 goto yy78;
731 } else {
732 goto yy80;
733 }
734 } else {
735 goto yy114;
736 }
737 yy92:
738 yych = *++YYCURSOR;
739 if (yych <= 0x7F) goto yy91;
740 if (yych <= 0xBF) goto yy73;
741 goto yy91;
742 yy93:
743 yych = *++YYCURSOR;
744 if (yych <= 0x7F) goto yy91;
745 if (yych <= 0xBF) goto yy92;
746 goto yy91;
747 yy94:
748 yych = *++YYCURSOR;
749 if (yych <= '9') {
750 if (yych <= '/') goto yy91;
751 if (yych <= '0') goto yy97;
752 if (yych <= '7') goto yy98;
753 goto yy99;
754 } else {
755 if (yych <= 'F') {
756 if (yych <= '@') goto yy91;
757 goto yy99;
758 } else {
759 if (yych <= '`') goto yy91;
760 if (yych <= 'f') goto yy99;
761 goto yy91;
762 }
763 }
764 yy95:
765 yych = *++YYCURSOR;
766 if (yych <= '@') {
767 if (yych <= '/') goto yy91;
768 if (yych <= '9') goto yy99;
769 goto yy91;
770 } else {
771 if (yych <= 'F') goto yy99;
772 if (yych <= '`') goto yy91;
773 if (yych <= 'f') goto yy99;
774 goto yy91;
775 }
776 yy96:
777 yych = *++YYCURSOR;
778 if (yych <= 'B') {
779 if (yych <= '7') {
780 if (yych <= '/') goto yy91;
781 goto yy99;
782 } else {
783 if (yych <= '9') goto yy100;
784 if (yych <= '@') goto yy91;
785 goto yy100;
786 }
787 } else {
788 if (yych <= '`') {
789 if (yych <= 'F') goto yy101;
790 goto yy91;
791 } else {
792 if (yych <= 'b') goto yy100;
793 if (yych <= 'f') goto yy101;
794 goto yy91;
795 }
796 }
797 yy97:
798 yych = *++YYCURSOR;
799 if (yych <= '@') {
800 if (yych <= '/') goto yy91;
801 if (yych <= '7') goto yy102;
802 if (yych <= '9') goto yy103;
803 goto yy91;
804 } else {
805 if (yych <= 'F') goto yy103;
806 if (yych <= '`') goto yy91;
807 if (yych <= 'f') goto yy103;
808 goto yy91;
809 }
810 yy98:
811 yych = *++YYCURSOR;
812 if (yych <= '@') {
813 if (yych <= '/') goto yy91;
814 if (yych <= '9') goto yy103;
815 goto yy91;
816 } else {
817 if (yych <= 'F') goto yy103;
818 if (yych <= '`') goto yy91;
819 if (yych <= 'f') goto yy103;
820 goto yy91;
821 }
822 yy99:
823 yych = *++YYCURSOR;
824 if (yych <= '@') {
825 if (yych <= '/') goto yy91;
826 if (yych <= '9') goto yy104;
827 goto yy91;
828 } else {
829 if (yych <= 'F') goto yy104;
830 if (yych <= '`') goto yy91;
831 if (yych <= 'f') goto yy104;
832 goto yy91;
833 }
834 yy100:
835 yych = *++YYCURSOR;
836 if (yych <= '@') {
837 if (yych <= '/') goto yy91;
838 if (yych <= '9') goto yy105;
839 goto yy91;
840 } else {
841 if (yych <= 'F') goto yy105;
842 if (yych <= '`') goto yy91;
843 if (yych <= 'f') goto yy105;
844 goto yy91;
845 }
846 yy101:
847 yych = *++YYCURSOR;
848 if (yych <= '@') {
849 if (yych <= '/') goto yy91;
850 if (yych <= '9') goto yy106;
851 goto yy91;
852 } else {
853 if (yych <= 'F') goto yy106;
854 if (yych <= '`') goto yy91;
855 if (yych <= 'f') goto yy106;
856 goto yy91;
857 }
858 yy102:
859 yych = *++YYCURSOR;
860 if (yych <= '@') {
861 if (yych <= '/') goto yy91;
862 if (yych <= '9') goto yy107;
863 goto yy91;
864 } else {
865 if (yych <= 'F') goto yy107;
866 if (yych <= '`') goto yy91;
867 if (yych <= 'f') goto yy107;
868 goto yy91;
869 }
870 yy103:
871 yych = *++YYCURSOR;
872 if (yych <= '@') {
873 if (yych <= '/') goto yy91;
874 if (yych <= '9') goto yy109;
875 goto yy91;
876 } else {
877 if (yych <= 'F') goto yy109;
878 if (yych <= '`') goto yy91;
879 if (yych <= 'f') goto yy109;
880 goto yy91;
881 }
882 yy104:
883 yych = *++YYCURSOR;
884 if (yych <= '@') {
885 if (yych <= '/') goto yy91;
886 if (yych <= '9') goto yy111;
887 goto yy91;
888 } else {
889 if (yych <= 'F') goto yy111;
890 if (yych <= '`') goto yy91;
891 if (yych <= 'f') goto yy111;
892 goto yy91;
893 }
894 yy105:
895 yych = *++YYCURSOR;
896 if (yych <= '@') {
897 if (yych <= '/') goto yy91;
898 if (yych <= '9') goto yy113;
899 goto yy91;
900 } else {
901 if (yych <= 'F') goto yy113;
902 if (yych <= '`') goto yy91;
903 if (yych <= 'f') goto yy113;
904 goto yy91;
905 }
906 yy106:
907 yych = *++YYCURSOR;
908 if (yych <= '@') {
909 if (yych <= '/') goto yy91;
910 if (yych <= '9') goto yy115;
911 goto yy91;
912 } else {
913 if (yych <= 'F') goto yy115;
914 if (yych <= '`') goto yy91;
915 if (yych <= 'f') goto yy115;
916 goto yy91;
917 }
918 yy107:
919 ++YYCURSOR;
920 {
921 s->str_esc += 5;
922 PHP_JSON_CONDITION_GOTO(STR_P1);
923 }
924 yy109:
925 ++YYCURSOR;
926 {
927 s->str_esc += 4;
928 PHP_JSON_CONDITION_GOTO(STR_P1);
929 }
930 yy111:
931 ++YYCURSOR;
932 {
933 s->str_esc += 3;
934 PHP_JSON_CONDITION_GOTO(STR_P1);
935 }
936 yy113:
937 yyaccept = 2;
938 yych = *(YYMARKER = ++YYCURSOR);
939 if (yych == '\\') goto yy116;
940 yy114:
941 {
942 s->errcode = PHP_JSON_ERROR_UTF16;
943 return PHP_JSON_T_ERROR;
944 }
945 yy115:
946 yych = *++YYCURSOR;
947 goto yy114;
948 yy116:
949 yych = *++YYCURSOR;
950 if (yych != 'u') goto yy91;
951 yych = *++YYCURSOR;
952 if (yych == 'D') goto yy118;
953 if (yych != 'd') goto yy91;
954 yy118:
955 yych = *++YYCURSOR;
956 if (yych <= 'B') goto yy91;
957 if (yych <= 'F') goto yy119;
958 if (yych <= 'b') goto yy91;
959 if (yych >= 'g') goto yy91;
960 yy119:
961 yych = *++YYCURSOR;
962 if (yych <= '@') {
963 if (yych <= '/') goto yy91;
964 if (yych >= ':') goto yy91;
965 } else {
966 if (yych <= 'F') goto yy120;
967 if (yych <= '`') goto yy91;
968 if (yych >= 'g') goto yy91;
969 }
970 yy120:
971 yych = *++YYCURSOR;
972 if (yych <= '@') {
973 if (yych <= '/') goto yy91;
974 if (yych >= ':') goto yy91;
975 } else {
976 if (yych <= 'F') goto yy121;
977 if (yych <= '`') goto yy91;
978 if (yych >= 'g') goto yy91;
979 }
980 yy121:
981 ++YYCURSOR;
982 {
983 s->str_esc += 8;
984 PHP_JSON_CONDITION_GOTO(STR_P1);
985 }
986 /* *********************************** */
987 yyc_STR_P2_BIN:
988 yych = *YYCURSOR;
989 if (yych <= 0xDF) {
990 if (yych <= '[') {
991 if (yych == '"') goto yy127;
992 } else {
993 if (yych <= '\\') goto yy129;
994 if (yych <= 0x7F) goto yy125;
995 if (yych <= 0xC1) goto yy131;
996 goto yy133;
997 }
998 } else {
999 if (yych <= 0xEF) {
1000 if (yych <= 0xE0) goto yy134;
1001 if (yych == 0xED) goto yy136;
1002 goto yy135;
1003 } else {
1004 if (yych <= 0xF0) goto yy137;
1005 if (yych <= 0xF3) goto yy138;
1006 if (yych <= 0xF4) goto yy139;
1007 goto yy131;
1008 }
1009 }
1010 yy125:
1011 ++YYCURSOR;
1012 { PHP_JSON_CONDITION_GOTO(STR_P2_BIN); }
1013 yy127:
1014 ++YYCURSOR;
1015 YYSETCONDITION(yycJS);
1016 {
1017 PHP_JSON_SCANNER_COPY_ESC();
1018 return PHP_JSON_T_STRING;
1019 }
1020 yy129:
1021 yyaccept = 0;
1022 yych = *(YYMARKER = ++YYCURSOR);
1023 if (yych == 'u') goto yy140;
1024 yy130:
1025 {
1026 char esc;
1027 PHP_JSON_SCANNER_COPY_ESC();
1028 switch (*s->cursor) {
1029 case 'b':
1030 esc = '\b';
1031 break;
1032 case 'f':
1033 esc = '\f'; break;
1034 case 'n':
1035 esc = '\n';
1036 break;
1037 case 'r':
1038 esc = '\r';
1039 break;
1040 case 't':
1041 esc = '\t';
1042 break;
1043 case '\\':
1044 case '/':
1045 case '"':
1046 esc = *s->cursor;
1047 break;
1048 default:
1049 s->errcode = PHP_JSON_ERROR_SYNTAX;
1050 return PHP_JSON_T_ERROR;
1051 }
1052 *(s->pstr++) = esc;
1053 ++YYCURSOR;
1054 s->str_start = s->cursor;
1055 PHP_JSON_CONDITION_GOTO_STR_P2();
1056 }
1057 yy131:
1058 ++YYCURSOR;
1059 yy132:
1060 {
1061 if (s->utf8_invalid) {
1062 PHP_JSON_SCANNER_COPY_ESC();
1063 if (s->options & PHP_JSON_INVALID_UTF8_SUBSTITUTE) {
1064 *(s->pstr++) = (char) (0xe0 | (0xfffd >> 12));
1065 *(s->pstr++) = (char) (0x80 | ((0xfffd >> 6) & 0x3f));
1066 *(s->pstr++) = (char) (0x80 | (0xfffd & 0x3f));
1067 }
1068 s->str_start = s->cursor;
1069 }
1070 PHP_JSON_CONDITION_GOTO(STR_P2_BIN);
1071 }
1072 yy133:
1073 yych = *++YYCURSOR;
1074 if (yych <= 0x7F) goto yy132;
1075 if (yych <= 0xBF) goto yy125;
1076 goto yy132;
1077 yy134:
1078 yyaccept = 1;
1079 yych = *(YYMARKER = ++YYCURSOR);
1080 if (yych <= 0x9F) goto yy132;
1081 if (yych <= 0xBF) goto yy142;
1082 goto yy132;
1083 yy135:
1084 yyaccept = 1;
1085 yych = *(YYMARKER = ++YYCURSOR);
1086 if (yych <= 0x7F) goto yy132;
1087 if (yych <= 0xBF) goto yy142;
1088 goto yy132;
1089 yy136:
1090 yyaccept = 1;
1091 yych = *(YYMARKER = ++YYCURSOR);
1092 if (yych <= 0x7F) goto yy132;
1093 if (yych <= 0x9F) goto yy142;
1094 goto yy132;
1095 yy137:
1096 yyaccept = 1;
1097 yych = *(YYMARKER = ++YYCURSOR);
1098 if (yych <= 0x8F) goto yy132;
1099 if (yych <= 0xBF) goto yy143;
1100 goto yy132;
1101 yy138:
1102 yyaccept = 1;
1103 yych = *(YYMARKER = ++YYCURSOR);
1104 if (yych <= 0x7F) goto yy132;
1105 if (yych <= 0xBF) goto yy143;
1106 goto yy132;
1107 yy139:
1108 yyaccept = 1;
1109 yych = *(YYMARKER = ++YYCURSOR);
1110 if (yych <= 0x7F) goto yy132;
1111 if (yych <= 0x8F) goto yy143;
1112 goto yy132;
1113 yy140:
1114 yych = *++YYCURSOR;
1115 if (yych <= 'D') {
1116 if (yych <= '9') {
1117 if (yych <= '/') goto yy141;
1118 if (yych <= '0') goto yy144;
1119 goto yy145;
1120 } else {
1121 if (yych <= '@') goto yy141;
1122 if (yych <= 'C') goto yy145;
1123 goto yy146;
1124 }
1125 } else {
1126 if (yych <= 'c') {
1127 if (yych <= 'F') goto yy145;
1128 if (yych >= 'a') goto yy145;
1129 } else {
1130 if (yych <= 'd') goto yy146;
1131 if (yych <= 'f') goto yy145;
1132 }
1133 }
1134 yy141:
1135 YYCURSOR = YYMARKER;
1136 if (yyaccept == 0) {
1137 goto yy130;
1138 } else {
1139 goto yy132;
1140 }
1141 yy142:
1142 yych = *++YYCURSOR;
1143 if (yych <= 0x7F) goto yy141;
1144 if (yych <= 0xBF) goto yy125;
1145 goto yy141;
1146 yy143:
1147 yych = *++YYCURSOR;
1148 if (yych <= 0x7F) goto yy141;
1149 if (yych <= 0xBF) goto yy142;
1150 goto yy141;
1151 yy144:
1152 yych = *++YYCURSOR;
1153 if (yych <= '9') {
1154 if (yych <= '/') goto yy141;
1155 if (yych <= '0') goto yy147;
1156 if (yych <= '7') goto yy148;
1157 goto yy149;
1158 } else {
1159 if (yych <= 'F') {
1160 if (yych <= '@') goto yy141;
1161 goto yy149;
1162 } else {
1163 if (yych <= '`') goto yy141;
1164 if (yych <= 'f') goto yy149;
1165 goto yy141;
1166 }
1167 }
1168 yy145:
1169 yych = *++YYCURSOR;
1170 if (yych <= '@') {
1171 if (yych <= '/') goto yy141;
1172 if (yych <= '9') goto yy149;
1173 goto yy141;
1174 } else {
1175 if (yych <= 'F') goto yy149;
1176 if (yych <= '`') goto yy141;
1177 if (yych <= 'f') goto yy149;
1178 goto yy141;
1179 }
1180 yy146:
1181 yych = *++YYCURSOR;
1182 if (yych <= '@') {
1183 if (yych <= '/') goto yy141;
1184 if (yych <= '7') goto yy149;
1185 if (yych <= '9') goto yy150;
1186 goto yy141;
1187 } else {
1188 if (yych <= 'B') goto yy150;
1189 if (yych <= '`') goto yy141;
1190 if (yych <= 'b') goto yy150;
1191 goto yy141;
1192 }
1193 yy147:
1194 yych = *++YYCURSOR;
1195 if (yych <= '@') {
1196 if (yych <= '/') goto yy141;
1197 if (yych <= '7') goto yy151;
1198 if (yych <= '9') goto yy152;
1199 goto yy141;
1200 } else {
1201 if (yych <= 'F') goto yy152;
1202 if (yych <= '`') goto yy141;
1203 if (yych <= 'f') goto yy152;
1204 goto yy141;
1205 }
1206 yy148:
1207 yych = *++YYCURSOR;
1208 if (yych <= '@') {
1209 if (yych <= '/') goto yy141;
1210 if (yych <= '9') goto yy152;
1211 goto yy141;
1212 } else {
1213 if (yych <= 'F') goto yy152;
1214 if (yych <= '`') goto yy141;
1215 if (yych <= 'f') goto yy152;
1216 goto yy141;
1217 }
1218 yy149:
1219 yych = *++YYCURSOR;
1220 if (yych <= '@') {
1221 if (yych <= '/') goto yy141;
1222 if (yych <= '9') goto yy153;
1223 goto yy141;
1224 } else {
1225 if (yych <= 'F') goto yy153;
1226 if (yych <= '`') goto yy141;
1227 if (yych <= 'f') goto yy153;
1228 goto yy141;
1229 }
1230 yy150:
1231 yych = *++YYCURSOR;
1232 if (yych <= '@') {
1233 if (yych <= '/') goto yy141;
1234 if (yych <= '9') goto yy154;
1235 goto yy141;
1236 } else {
1237 if (yych <= 'F') goto yy154;
1238 if (yych <= '`') goto yy141;
1239 if (yych <= 'f') goto yy154;
1240 goto yy141;
1241 }
1242 yy151:
1243 yych = *++YYCURSOR;
1244 if (yych <= '@') {
1245 if (yych <= '/') goto yy141;
1246 if (yych <= '9') goto yy155;
1247 goto yy141;
1248 } else {
1249 if (yych <= 'F') goto yy155;
1250 if (yych <= '`') goto yy141;
1251 if (yych <= 'f') goto yy155;
1252 goto yy141;
1253 }
1254 yy152:
1255 yych = *++YYCURSOR;
1256 if (yych <= '@') {
1257 if (yych <= '/') goto yy141;
1258 if (yych <= '9') goto yy157;
1259 goto yy141;
1260 } else {
1261 if (yych <= 'F') goto yy157;
1262 if (yych <= '`') goto yy141;
1263 if (yych <= 'f') goto yy157;
1264 goto yy141;
1265 }
1266 yy153:
1267 yych = *++YYCURSOR;
1268 if (yych <= '@') {
1269 if (yych <= '/') goto yy141;
1270 if (yych <= '9') goto yy159;
1271 goto yy141;
1272 } else {
1273 if (yych <= 'F') goto yy159;
1274 if (yych <= '`') goto yy141;
1275 if (yych <= 'f') goto yy159;
1276 goto yy141;
1277 }
1278 yy154:
1279 yych = *++YYCURSOR;
1280 if (yych <= '@') {
1281 if (yych <= '/') goto yy141;
1282 if (yych <= '9') goto yy161;
1283 goto yy141;
1284 } else {
1285 if (yych <= 'F') goto yy161;
1286 if (yych <= '`') goto yy141;
1287 if (yych <= 'f') goto yy161;
1288 goto yy141;
1289 }
1290 yy155:
1291 ++YYCURSOR;
1292 {
1293 int utf16 = php_json_ucs2_to_int(s, 2);
1294 PHP_JSON_SCANNER_COPY_UTF();
1295 *(s->pstr++) = (char) utf16;
1296 s->str_start = s->cursor;
1297 PHP_JSON_CONDITION_GOTO_STR_P2();
1298 }
1299 yy157:
1300 ++YYCURSOR;
1301 {
1302 int utf16 = php_json_ucs2_to_int(s, 3);
1303 PHP_JSON_SCANNER_COPY_UTF();
1304 *(s->pstr++) = (char) (0xc0 | (utf16 >> 6));
1305 *(s->pstr++) = (char) (0x80 | (utf16 & 0x3f));
1306 s->str_start = s->cursor;
1307 PHP_JSON_CONDITION_GOTO_STR_P2();
1308 }
1309 yy159:
1310 ++YYCURSOR;
1311 {
1312 int utf16 = php_json_ucs2_to_int(s, 4);
1313 PHP_JSON_SCANNER_COPY_UTF();
1314 *(s->pstr++) = (char) (0xe0 | (utf16 >> 12));
1315 *(s->pstr++) = (char) (0x80 | ((utf16 >> 6) & 0x3f));
1316 *(s->pstr++) = (char) (0x80 | (utf16 & 0x3f));
1317 s->str_start = s->cursor;
1318 PHP_JSON_CONDITION_GOTO_STR_P2();
1319 }
1320 yy161:
1321 yych = *++YYCURSOR;
1322 if (yych != '\\') goto yy141;
1323 yych = *++YYCURSOR;
1324 if (yych != 'u') goto yy141;
1325 yych = *++YYCURSOR;
1326 if (yych == 'D') goto yy164;
1327 if (yych != 'd') goto yy141;
1328 yy164:
1329 yych = *++YYCURSOR;
1330 if (yych <= 'B') goto yy141;
1331 if (yych <= 'F') goto yy165;
1332 if (yych <= 'b') goto yy141;
1333 if (yych >= 'g') goto yy141;
1334 yy165:
1335 yych = *++YYCURSOR;
1336 if (yych <= '@') {
1337 if (yych <= '/') goto yy141;
1338 if (yych >= ':') goto yy141;
1339 } else {
1340 if (yych <= 'F') goto yy166;
1341 if (yych <= '`') goto yy141;
1342 if (yych >= 'g') goto yy141;
1343 }
1344 yy166:
1345 yych = *++YYCURSOR;
1346 if (yych <= '@') {
1347 if (yych <= '/') goto yy141;
1348 if (yych >= ':') goto yy141;
1349 } else {
1350 if (yych <= 'F') goto yy167;
1351 if (yych <= '`') goto yy141;
1352 if (yych >= 'g') goto yy141;
1353 }
1354 yy167:
1355 ++YYCURSOR;
1356 {
1357 int utf32, utf16_hi, utf16_lo;
1358 utf16_hi = php_json_ucs2_to_int(s, 4);
1359 utf16_lo = php_json_ucs2_to_int_ex(s, 4, 7);
1360 utf32 = ((utf16_lo & 0x3FF) << 10) + (utf16_hi & 0x3FF) + 0x10000;
1361 PHP_JSON_SCANNER_COPY_UTF_SP();
1362 *(s->pstr++) = (char) (0xf0 | (utf32 >> 18));
1363 *(s->pstr++) = (char) (0x80 | ((utf32 >> 12) & 0x3f));
1364 *(s->pstr++) = (char) (0x80 | ((utf32 >> 6) & 0x3f));
1365 *(s->pstr++) = (char) (0x80 | (utf32 & 0x3f));
1366 s->str_start = s->cursor;
1367 PHP_JSON_CONDITION_GOTO_STR_P2();
1368 }
1369 /* *********************************** */
1370 yyc_STR_P2_UTF:
1371 yych = *YYCURSOR;
1372 if (yych == '"') goto yy173;
1373 if (yych == '\\') goto yy175;
1374 ++YYCURSOR;
1375 { PHP_JSON_CONDITION_GOTO(STR_P2_UTF); }
1376 yy173:
1377 ++YYCURSOR;
1378 YYSETCONDITION(yycJS);
1379 {
1380 PHP_JSON_SCANNER_COPY_ESC();
1381 return PHP_JSON_T_STRING;
1382 }
1383 yy175:
1384 yych = *(YYMARKER = ++YYCURSOR);
1385 if (yych == 'u') goto yy177;
1386 yy176:
1387 {
1388 char esc;
1389 PHP_JSON_SCANNER_COPY_ESC();
1390 switch (*s->cursor) {
1391 case 'b':
1392 esc = '\b';
1393 break;
1394 case 'f':
1395 esc = '\f'; break;
1396 case 'n':
1397 esc = '\n';
1398 break;
1399 case 'r':
1400 esc = '\r';
1401 break;
1402 case 't':
1403 esc = '\t';
1404 break;
1405 case '\\':
1406 case '/':
1407 case '"':
1408 esc = *s->cursor;
1409 break;
1410 default:
1411 s->errcode = PHP_JSON_ERROR_SYNTAX;
1412 return PHP_JSON_T_ERROR;
1413 }
1414 *(s->pstr++) = esc;
1415 ++YYCURSOR;
1416 s->str_start = s->cursor;
1417 PHP_JSON_CONDITION_GOTO_STR_P2();
1418 }
1419 yy177:
1420 yych = *++YYCURSOR;
1421 if (yych <= 'D') {
1422 if (yych <= '9') {
1423 if (yych <= '/') goto yy178;
1424 if (yych <= '0') goto yy179;
1425 goto yy180;
1426 } else {
1427 if (yych <= '@') goto yy178;
1428 if (yych <= 'C') goto yy180;
1429 goto yy181;
1430 }
1431 } else {
1432 if (yych <= 'c') {
1433 if (yych <= 'F') goto yy180;
1434 if (yych >= 'a') goto yy180;
1435 } else {
1436 if (yych <= 'd') goto yy181;
1437 if (yych <= 'f') goto yy180;
1438 }
1439 }
1440 yy178:
1441 YYCURSOR = YYMARKER;
1442 goto yy176;
1443 yy179:
1444 yych = *++YYCURSOR;
1445 if (yych <= '9') {
1446 if (yych <= '/') goto yy178;
1447 if (yych <= '0') goto yy182;
1448 if (yych <= '7') goto yy183;
1449 goto yy184;
1450 } else {
1451 if (yych <= 'F') {
1452 if (yych <= '@') goto yy178;
1453 goto yy184;
1454 } else {
1455 if (yych <= '`') goto yy178;
1456 if (yych <= 'f') goto yy184;
1457 goto yy178;
1458 }
1459 }
1460 yy180:
1461 yych = *++YYCURSOR;
1462 if (yych <= '@') {
1463 if (yych <= '/') goto yy178;
1464 if (yych <= '9') goto yy184;
1465 goto yy178;
1466 } else {
1467 if (yych <= 'F') goto yy184;
1468 if (yych <= '`') goto yy178;
1469 if (yych <= 'f') goto yy184;
1470 goto yy178;
1471 }
1472 yy181:
1473 yych = *++YYCURSOR;
1474 if (yych <= '@') {
1475 if (yych <= '/') goto yy178;
1476 if (yych <= '7') goto yy184;
1477 if (yych <= '9') goto yy185;
1478 goto yy178;
1479 } else {
1480 if (yych <= 'B') goto yy185;
1481 if (yych <= '`') goto yy178;
1482 if (yych <= 'b') goto yy185;
1483 goto yy178;
1484 }
1485 yy182:
1486 yych = *++YYCURSOR;
1487 if (yych <= '@') {
1488 if (yych <= '/') goto yy178;
1489 if (yych <= '7') goto yy186;
1490 if (yych <= '9') goto yy187;
1491 goto yy178;
1492 } else {
1493 if (yych <= 'F') goto yy187;
1494 if (yych <= '`') goto yy178;
1495 if (yych <= 'f') goto yy187;
1496 goto yy178;
1497 }
1498 yy183:
1499 yych = *++YYCURSOR;
1500 if (yych <= '@') {
1501 if (yych <= '/') goto yy178;
1502 if (yych <= '9') goto yy187;
1503 goto yy178;
1504 } else {
1505 if (yych <= 'F') goto yy187;
1506 if (yych <= '`') goto yy178;
1507 if (yych <= 'f') goto yy187;
1508 goto yy178;
1509 }
1510 yy184:
1511 yych = *++YYCURSOR;
1512 if (yych <= '@') {
1513 if (yych <= '/') goto yy178;
1514 if (yych <= '9') goto yy188;
1515 goto yy178;
1516 } else {
1517 if (yych <= 'F') goto yy188;
1518 if (yych <= '`') goto yy178;
1519 if (yych <= 'f') goto yy188;
1520 goto yy178;
1521 }
1522 yy185:
1523 yych = *++YYCURSOR;
1524 if (yych <= '@') {
1525 if (yych <= '/') goto yy178;
1526 if (yych <= '9') goto yy189;
1527 goto yy178;
1528 } else {
1529 if (yych <= 'F') goto yy189;
1530 if (yych <= '`') goto yy178;
1531 if (yych <= 'f') goto yy189;
1532 goto yy178;
1533 }
1534 yy186:
1535 yych = *++YYCURSOR;
1536 if (yych <= '@') {
1537 if (yych <= '/') goto yy178;
1538 if (yych <= '9') goto yy190;
1539 goto yy178;
1540 } else {
1541 if (yych <= 'F') goto yy190;
1542 if (yych <= '`') goto yy178;
1543 if (yych <= 'f') goto yy190;
1544 goto yy178;
1545 }
1546 yy187:
1547 yych = *++YYCURSOR;
1548 if (yych <= '@') {
1549 if (yych <= '/') goto yy178;
1550 if (yych <= '9') goto yy192;
1551 goto yy178;
1552 } else {
1553 if (yych <= 'F') goto yy192;
1554 if (yych <= '`') goto yy178;
1555 if (yych <= 'f') goto yy192;
1556 goto yy178;
1557 }
1558 yy188:
1559 yych = *++YYCURSOR;
1560 if (yych <= '@') {
1561 if (yych <= '/') goto yy178;
1562 if (yych <= '9') goto yy194;
1563 goto yy178;
1564 } else {
1565 if (yych <= 'F') goto yy194;
1566 if (yych <= '`') goto yy178;
1567 if (yych <= 'f') goto yy194;
1568 goto yy178;
1569 }
1570 yy189:
1571 yych = *++YYCURSOR;
1572 if (yych <= '@') {
1573 if (yych <= '/') goto yy178;
1574 if (yych <= '9') goto yy196;
1575 goto yy178;
1576 } else {
1577 if (yych <= 'F') goto yy196;
1578 if (yych <= '`') goto yy178;
1579 if (yych <= 'f') goto yy196;
1580 goto yy178;
1581 }
1582 yy190:
1583 ++YYCURSOR;
1584 {
1585 int utf16 = php_json_ucs2_to_int(s, 2);
1586 PHP_JSON_SCANNER_COPY_UTF();
1587 *(s->pstr++) = (char) utf16;
1588 s->str_start = s->cursor;
1589 PHP_JSON_CONDITION_GOTO_STR_P2();
1590 }
1591 yy192:
1592 ++YYCURSOR;
1593 {
1594 int utf16 = php_json_ucs2_to_int(s, 3);
1595 PHP_JSON_SCANNER_COPY_UTF();
1596 *(s->pstr++) = (char) (0xc0 | (utf16 >> 6));
1597 *(s->pstr++) = (char) (0x80 | (utf16 & 0x3f));
1598 s->str_start = s->cursor;
1599 PHP_JSON_CONDITION_GOTO_STR_P2();
1600 }
1601 yy194:
1602 ++YYCURSOR;
1603 {
1604 int utf16 = php_json_ucs2_to_int(s, 4);
1605 PHP_JSON_SCANNER_COPY_UTF();
1606 *(s->pstr++) = (char) (0xe0 | (utf16 >> 12));
1607 *(s->pstr++) = (char) (0x80 | ((utf16 >> 6) & 0x3f));
1608 *(s->pstr++) = (char) (0x80 | (utf16 & 0x3f));
1609 s->str_start = s->cursor;
1610 PHP_JSON_CONDITION_GOTO_STR_P2();
1611 }
1612 yy196:
1613 yych = *++YYCURSOR;
1614 if (yych != '\\') goto yy178;
1615 yych = *++YYCURSOR;
1616 if (yych != 'u') goto yy178;
1617 yych = *++YYCURSOR;
1618 if (yych == 'D') goto yy199;
1619 if (yych != 'd') goto yy178;
1620 yy199:
1621 yych = *++YYCURSOR;
1622 if (yych <= 'B') goto yy178;
1623 if (yych <= 'F') goto yy200;
1624 if (yych <= 'b') goto yy178;
1625 if (yych >= 'g') goto yy178;
1626 yy200:
1627 yych = *++YYCURSOR;
1628 if (yych <= '@') {
1629 if (yych <= '/') goto yy178;
1630 if (yych >= ':') goto yy178;
1631 } else {
1632 if (yych <= 'F') goto yy201;
1633 if (yych <= '`') goto yy178;
1634 if (yych >= 'g') goto yy178;
1635 }
1636 yy201:
1637 yych = *++YYCURSOR;
1638 if (yych <= '@') {
1639 if (yych <= '/') goto yy178;
1640 if (yych >= ':') goto yy178;
1641 } else {
1642 if (yych <= 'F') goto yy202;
1643 if (yych <= '`') goto yy178;
1644 if (yych >= 'g') goto yy178;
1645 }
1646 yy202:
1647 ++YYCURSOR;
1648 {
1649 int utf32, utf16_hi, utf16_lo;
1650 utf16_hi = php_json_ucs2_to_int(s, 4);
1651 utf16_lo = php_json_ucs2_to_int_ex(s, 4, 7);
1652 utf32 = ((utf16_lo & 0x3FF) << 10) + (utf16_hi & 0x3FF) + 0x10000;
1653 PHP_JSON_SCANNER_COPY_UTF_SP();
1654 *(s->pstr++) = (char) (0xf0 | (utf32 >> 18));
1655 *(s->pstr++) = (char) (0x80 | ((utf32 >> 12) & 0x3f));
1656 *(s->pstr++) = (char) (0x80 | ((utf32 >> 6) & 0x3f));
1657 *(s->pstr++) = (char) (0x80 | (utf32 & 0x3f));
1658 s->str_start = s->cursor;
1659 PHP_JSON_CONDITION_GOTO_STR_P2();
1660 }
1661 }
1662
1663
1664 }
1665
1666