This source file includes following definitions.
- php_json_scanner_copy_string
- php_json_hex_to_int
- php_json_ucs2_to_int_ex
- php_json_ucs2_to_int
- php_json_scanner_init
- php_json_scan
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
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