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
64
#define YYCTYPE     php_json_ctype
25
216
#define YYCURSOR    s->cursor
26
#define YYLIMIT     s->limit
27
12
#define YYMARKER    s->marker
28
#define YYCTXMARKER s->ctxmarker
29
30
128
#define YYGETCONDITION()        s->state
31
32
#define YYSETCONDITION(yystate) s->state = yystate
32
33
#define YYFILL(n)
34
35
32
#define PHP_JSON_CONDITION_SET(condition) YYSETCONDITION(yyc##condition)
36
44
#define PHP_JSON_CONDITION_GOTO(condition) goto yyc_##condition
37
#define PHP_JSON_CONDITION_SET_AND_GOTO(condition) \
38
12
  PHP_JSON_CONDITION_SET(condition); \
39
12
  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
12
#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
8
{
97
8
  s->cursor = (php_json_ctype *) str;
98
8
  s->limit = (php_json_ctype *) str + str_len;
99
8
  s->options = options;
100
8
  PHP_JSON_CONDITION_SET(JS);
101
8
}
102
103
int php_json_scan(php_json_scanner *s)
104
64
{
105
64
  ZVAL_NULL(&s->value);
106
107
64
std:
108
64
  s->token = s->cursor;
109
110
111
64
  {
112
64
    YYCTYPE yych;
113
64
    unsigned int yyaccept = 0;
114
64
    if (YYGETCONDITION() < 2) {
115
64
      if (YYGETCONDITION() < 1) {
116
64
        goto yyc_JS;
117
64
      } else {
118
0
        goto yyc_STR_P1;
119
0
      }
120
64
    } 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
64
yyc_JS:
129
64
    {
130
64
      static const unsigned char yybm[] = {
131
64
          0,   0,   0,   0,   0,   0,   0,   0, 
132
64
          0,  64,   0,   0,   0,  64,   0,   0, 
133
64
          0,   0,   0,   0,   0,   0,   0,   0, 
134
64
          0,   0,   0,   0,   0,   0,   0,   0, 
135
64
         64,   0,   0,   0,   0,   0,   0,   0, 
136
64
          0,   0,   0,   0,   0,   0,   0,   0, 
137
64
        128, 128, 128, 128, 128, 128, 128, 128, 
138
64
        128, 128,   0,   0,   0,   0,   0,   0, 
139
64
          0,   0,   0,   0,   0,   0,   0,   0, 
140
64
          0,   0,   0,   0,   0,   0,   0,   0, 
141
64
          0,   0,   0,   0,   0,   0,   0,   0, 
142
64
          0,   0,   0,   0,   0,   0,   0,   0, 
143
64
          0,   0,   0,   0,   0,   0,   0,   0, 
144
64
          0,   0,   0,   0,   0,   0,   0,   0, 
145
64
          0,   0,   0,   0,   0,   0,   0,   0, 
146
64
          0,   0,   0,   0,   0,   0,   0,   0, 
147
64
          0,   0,   0,   0,   0,   0,   0,   0, 
148
64
          0,   0,   0,   0,   0,   0,   0,   0, 
149
64
          0,   0,   0,   0,   0,   0,   0,   0, 
150
64
          0,   0,   0,   0,   0,   0,   0,   0, 
151
64
          0,   0,   0,   0,   0,   0,   0,   0, 
152
64
          0,   0,   0,   0,   0,   0,   0,   0, 
153
64
          0,   0,   0,   0,   0,   0,   0,   0, 
154
64
          0,   0,   0,   0,   0,   0,   0,   0, 
155
64
          0,   0,   0,   0,   0,   0,   0,   0, 
156
64
          0,   0,   0,   0,   0,   0,   0,   0, 
157
64
          0,   0,   0,   0,   0,   0,   0,   0, 
158
64
          0,   0,   0,   0,   0,   0,   0,   0, 
159
64
          0,   0,   0,   0,   0,   0,   0,   0, 
160
64
          0,   0,   0,   0,   0,   0,   0,   0, 
161
64
          0,   0,   0,   0,   0,   0,   0,   0, 
162
64
          0,   0,   0,   0,   0,   0,   0,   0, 
163
64
      };
164
64
      yych = *YYCURSOR;
165
64
      if (yych <= ']') {
166
48
        if (yych <= '"') {
167
20
          if (yych <= '\f') {
168
8
            if (yych <= 0x08) {
169
8
              if (yych >= 0x01) goto yy5;
170
8
            } else {
171
0
              if (yych <= '\t') goto yy7;
172
0
              if (yych <= '\n') goto yy10;
173
0
              goto yy5;
174
0
            }
175
12
          } else {
176
12
            if (yych <= 0x1F) {
177
0
              if (yych <= '\r') goto yy11;
178
0
              goto yy5;
179
12
            } else {
180
12
              if (yych <= ' ') goto yy7;
181
12
              if (yych <= '!') goto yy12;
182
12
              goto yy14;
183
12
            }
184
12
          }
185
28
        } else {
186
28
          if (yych <= '0') {
187
4
            if (yych <= ',') {
188
4
              if (yych <= '+') goto yy12;
189
4
              goto yy16;
190
4
            } else {
191
0
              if (yych <= '-') goto yy18;
192
0
              if (yych <= '/') goto yy12;
193
0
              goto yy19;
194
0
            }
195
24
          } else {
196
24
            if (yych <= 'Z') {
197
24
              if (yych <= '9') goto yy21;
198
12
              if (yych <= ':') goto yy23;
199
0
              goto yy12;
200
12
            } else {
201
0
              if (yych <= '[') goto yy25;
202
0
              if (yych <= '\\') goto yy12;
203
0
              goto yy27;
204
0
            }
205
24
          }
206
28
        }
207
48
      } else {
208
16
        if (yych <= '}') {
209
16
          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
16
          } else {
218
16
            if (yych <= 'z') {
219
0
              if (yych <= 't') goto yy31;
220
0
              goto yy12;
221
16
            } else {
222
16
              if (yych <= '{') goto yy32;
223
8
              if (yych <= '|') goto yy12;
224
8
              goto yy34;
225
8
            }
226
16
          }
227
16
        } 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
16
      }
250
8
      ++YYCURSOR;
251
8
      {
252
8
    if (s->limit < s->cursor) {
253
8
      return PHP_JSON_T_EOI;
254
8
    } else {
255
0
      s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
256
0
      return PHP_JSON_T_ERROR;
257
0
    }
258
8
  }
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
8
  }
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
12
yy14:
288
12
      ++YYCURSOR;
289
12
      {
290
12
    s->str_start = s->cursor;
291
12
    s->str_esc = 0;
292
12
    s->utf8_invalid = 0;
293
12
    s->utf8_invalid_count = 0;
294
12
    PHP_JSON_CONDITION_SET_AND_GOTO(STR_P1);
295
0
  }
296
4
yy16:
297
4
      ++YYCURSOR;
298
4
      { 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
12
yy20:
315
12
      {
316
12
    bool bigint = 0, negative = s->token[0] == '-';
317
12
    size_t digits = (size_t) (s->cursor - s->token - negative);
318
12
    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
12
    if (!bigint) {
329
12
      ZVAL_LONG(&s->value, ZEND_STRTOL((char *) s->token, NULL, 10));
330
12
      return PHP_JSON_T_INT;
331
12
    } 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
12
  }
339
12
yy21:
340
12
      yyaccept = 0;
341
12
      yych = *(YYMARKER = ++YYCURSOR);
342
12
      if (yybm[0+yych] & 128) {
343
0
        goto yy21;
344
0
      }
345
12
      if (yych <= 'D') {
346
4
        if (yych == '.') goto yy45;
347
4
        goto yy20;
348
8
      } else {
349
8
        if (yych <= 'E') goto yy47;
350
8
        if (yych == 'e') goto yy47;
351
8
        goto yy20;
352
8
      }
353
12
yy23:
354
12
      ++YYCURSOR;
355
12
      { 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
8
yy32:
378
8
      ++YYCURSOR;
379
8
      { return '{'; }
380
8
yy34:
381
8
      ++YYCURSOR;
382
8
      { 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
44
yyc_STR_P1:
544
44
    yych = *YYCURSOR;
545
44
    if (yych <= 0xDF) {
546
44
      if (yych <= '[') {
547
12
        if (yych <= 0x1F) goto yy71;
548
12
        if (yych == '"') goto yy75;
549
0
        goto yy73;
550
32
      } else {
551
32
        if (yych <= '\\') goto yy77;
552
32
        if (yych <= 0x7F) goto yy73;
553
0
        if (yych <= 0xC1) goto yy79;
554
0
        goto yy81;
555
0
      }
556
44
    } 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
44
  }
574
32
yy73:
575
32
    ++YYCURSOR;
576
32
    { PHP_JSON_CONDITION_GOTO(STR_P1); }
577
12
yy75:
578
12
    ++YYCURSOR;
579
12
    {
580
12
    zend_string *str;
581
12
    size_t len = (size_t)(s->cursor - s->str_start - s->str_esc - 1 + s->utf8_invalid_count);
582
12
    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
12
    str = zend_string_alloc(len, 0);
588
12
    ZSTR_VAL(str)[len] = '\0';
589
12
    ZVAL_STR(&s->value, str);
590
12
    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
12
    } else {
595
12
      memcpy(Z_STRVAL(s->value), s->str_start, len);
596
12
      PHP_JSON_CONDITION_SET(JS);
597
12
      return PHP_JSON_T_STRING;
598
12
    }
599
12
  }
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
}