xref: /PHP-7.2/ext/json/json_scanner.c (revision 7a7ec01a)
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