Coverage Report

Created: 2026-06-02 06:39

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