Coverage Report

Created: 2025-12-14 06:09

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