Coverage Report

Created: 2026-06-13 07:01

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
18.8M
#define YYCTYPE     php_json_ctype
23
221M
#define YYCURSOR    s->cursor
24
#define YYLIMIT     s->limit
25
87.5M
#define YYMARKER    s->marker
26
#define YYCTXMARKER s->ctxmarker
27
28
37.6M
#define YYGETCONDITION()        s->state
29
141k
#define YYSETCONDITION(yystate) s->state = yystate
30
31
#define YYFILL(n)
32
33
137k
#define PHP_JSON_CONDITION_SET(condition) YYSETCONDITION(yyc##condition)
34
49.1M
#define PHP_JSON_CONDITION_GOTO(condition) goto yyc_##condition
35
#define PHP_JSON_CONDITION_SET_AND_GOTO(condition) \
36
65.0k
  PHP_JSON_CONDITION_SET(condition); \
37
65.0k
  PHP_JSON_CONDITION_GOTO(condition)
38
#define PHP_JSON_CONDITION_GOTO_STR_P2() \
39
119k
  do { \
40
119k
    if (s->utf8_invalid) { \
41
0
      PHP_JSON_CONDITION_GOTO(STR_P2_BIN); \
42
119k
    } else { \
43
119k
      PHP_JSON_CONDITION_GOTO(STR_P2_UTF); \
44
119k
    } \
45
119k
  } while(0)
46
47
48
6.98k
#define PHP_JSON_SCANNER_COPY_ESC() php_json_scanner_copy_string(s, 0)
49
111k
#define PHP_JSON_SCANNER_COPY_UTF() php_json_scanner_copy_string(s, 5)
50
1.85k
#define PHP_JSON_SCANNER_COPY_UTF_SP() php_json_scanner_copy_string(s, 11)
51
52
5.34M
#define PHP_JSON_INT_MAX_LENGTH (MAX_LENGTH_OF_LONG - 1)
53
54
5.36M
#define PHP_JSON_TOKEN_LENGTH() ((size_t) (s->cursor - s->token))
55
88.2M
#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
119k
{
59
119k
  size_t len = (size_t)(s->cursor - s->str_start - esc_size - 1);
60
119k
  if (len) {
61
86.6k
    memcpy(s->pstr, s->str_start, len);
62
86.6k
    s->pstr += len;
63
86.6k
  }
64
119k
}
65
66
static int php_json_hex_to_int(unsigned char code)
67
311k
{
68
311k
  if (code >= '0' && code <= '9') {
69
164k
    return code - '0';
70
164k
  } else if (code >= 'A' && code <= 'F') {
71
137k
    return code - ('A' - 10);
72
137k
  } else if (code >= 'a' && code <= 'f') {
73
9.56k
    return code - ('a' - 10);
74
9.56k
  } else {
75
    /* this should never happened (just to suppress compiler warning) */
76
0
    return -1;
77
0
  }
78
311k
}
79
80
static int php_json_ucs2_to_int_ex(php_json_scanner *s, int size, int start)
81
114k
{
82
114k
  int i, code = 0;
83
114k
  php_json_ctype *pc = s->cursor - start;
84
426k
  for (i = 0; i < size; i++) {
85
311k
    code |= php_json_hex_to_int(*(pc--)) << (i * 4);
86
311k
  }
87
114k
  return code;
88
114k
}
89
90
static int php_json_ucs2_to_int(php_json_scanner *s, int size)
91
112k
{
92
112k
  return php_json_ucs2_to_int_ex(s, size, 1);
93
112k
}
94
95
void php_json_scanner_init(php_json_scanner *s, const char *str, size_t str_len, int options)
96
13.4k
{
97
13.4k
  s->cursor = (php_json_ctype *) str;
98
13.4k
  s->limit = (php_json_ctype *) str + str_len;
99
13.4k
  s->options = options;
100
13.4k
  PHP_JSON_TOKEN_LOCATION(first_column) = 1;
101
13.4k
  PHP_JSON_TOKEN_LOCATION(first_line) = 1;
102
13.4k
  PHP_JSON_TOKEN_LOCATION(last_column) = 1;
103
13.4k
  PHP_JSON_TOKEN_LOCATION(last_line) = 1;
104
13.4k
  PHP_JSON_CONDITION_SET(JS);
105
13.4k
}
106
107
int php_json_scan(php_json_scanner *s)
108
18.8M
{
109
18.8M
  ZVAL_NULL(&s->value);
110
111
18.8M
std:
112
18.8M
  PHP_JSON_TOKEN_LOCATION(first_column) = s->errloc.last_column;
113
18.8M
  PHP_JSON_TOKEN_LOCATION(first_line) = s->errloc.last_line;
114
18.8M
  s->token = s->cursor;
115
116
117
18.8M
  {
118
18.8M
    YYCTYPE yych;
119
18.8M
    unsigned int yyaccept = 0;
120
18.8M
    if (YYGETCONDITION() < 2) {
121
18.8M
      if (YYGETCONDITION() < 1) {
122
18.8M
        goto yyc_JS;
123
18.8M
      } else {
124
0
        goto yyc_STR_P1;
125
0
      }
126
18.8M
    } 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
18.8M
yyc_JS:
135
18.8M
    {
136
18.8M
      static const unsigned char yybm[] = {
137
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
138
18.8M
          0,  64,   0,   0,   0,  64,   0,   0, 
139
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
140
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
141
18.8M
         64,   0,   0,   0,   0,   0,   0,   0, 
142
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
143
18.8M
        128, 128, 128, 128, 128, 128, 128, 128, 
144
18.8M
        128, 128,   0,   0,   0,   0,   0,   0, 
145
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
146
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
147
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
148
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
149
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
150
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
151
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
152
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
153
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
154
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
155
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
156
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
157
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
158
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
159
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
160
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
161
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
162
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
163
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
164
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
165
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
166
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
167
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
168
18.8M
          0,   0,   0,   0,   0,   0,   0,   0, 
169
18.8M
      };
170
18.8M
      yych = *YYCURSOR;
171
18.8M
      if (yych <= ']') {
172
13.5M
        if (yych <= '"') {
173
74.4k
          if (yych <= '\f') {
174
8.56k
            if (yych <= 0x08) {
175
7.70k
              if (yych >= 0x01) goto yy5;
176
7.70k
            } else {
177
863
              if (yych <= '\t') goto yy7;
178
612
              if (yych <= '\n') goto yy10;
179
5
              goto yy5;
180
612
            }
181
65.8k
          } else {
182
65.8k
            if (yych <= 0x1F) {
183
462
              if (yych <= '\r') goto yy12;
184
35
              goto yy5;
185
65.3k
            } else {
186
65.3k
              if (yych <= ' ') goto yy7;
187
65.0k
              if (yych <= '!') goto yy13;
188
65.0k
              goto yy15;
189
65.0k
            }
190
65.8k
          }
191
13.4M
        } else {
192
13.4M
          if (yych <= '0') {
193
12.4M
            if (yych <= ',') {
194
8.00M
              if (yych <= '+') goto yy13;
195
8.00M
              goto yy17;
196
8.00M
            } else {
197
4.47M
              if (yych <= '-') goto yy19;
198
4.47M
              if (yych <= '/') goto yy13;
199
4.47M
              goto yy20;
200
4.47M
            }
201
12.4M
          } else {
202
964k
            if (yych <= 'Z') {
203
949k
              if (yych <= '9') goto yy22;
204
58.2k
              if (yych <= ':') goto yy24;
205
159
              goto yy13;
206
58.2k
            } else {
207
14.6k
              if (yych <= '[') goto yy26;
208
6.19k
              if (yych <= '\\') goto yy13;
209
6.17k
              goto yy28;
210
6.19k
            }
211
964k
          }
212
13.4M
        }
213
13.5M
      } else {
214
5.30M
        if (yych <= '}') {
215
5.30M
          if (yych <= 's') {
216
752
            if (yych <= 'f') {
217
441
              if (yych <= 'e') goto yy13;
218
266
              goto yy30;
219
441
            } else {
220
311
              if (yych == 'n') goto yy31;
221
39
              goto yy13;
222
311
            }
223
5.30M
          } else {
224
5.30M
            if (yych <= 'z') {
225
276
              if (yych <= 't') goto yy32;
226
26
              goto yy13;
227
5.30M
            } else {
228
5.30M
              if (yych <= '{') goto yy33;
229
2.65M
              if (yych <= '|') goto yy13;
230
2.65M
              goto yy35;
231
2.65M
            }
232
5.30M
          }
233
5.30M
        } else {
234
526
          if (yych <= 0xEC) {
235
263
            if (yych <= 0xC1) {
236
93
              if (yych <= 0x7F) goto yy13;
237
90
              goto yy37;
238
170
            } else {
239
170
              if (yych <= 0xDF) goto yy39;
240
91
              if (yych <= 0xE0) goto yy40;
241
55
              goto yy41;
242
91
            }
243
263
          } else {
244
263
            if (yych <= 0xF0) {
245
120
              if (yych <= 0xED) goto yy42;
246
79
              if (yych <= 0xEF) goto yy41;
247
61
              goto yy43;
248
143
            } else {
249
143
              if (yych <= 0xF3) goto yy44;
250
78
              if (yych <= 0xF4) goto yy45;
251
41
              goto yy37;
252
78
            }
253
263
          }
254
526
        }
255
5.30M
      }
256
7.67k
      ++YYCURSOR;
257
7.67k
      {
258
7.67k
    if (s->limit < s->cursor) {
259
7.65k
      return PHP_JSON_T_EOI;
260
7.65k
    } else {
261
19
      s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
262
19
      return PHP_JSON_T_ERROR;
263
19
    }
264
7.67k
  }
265
67
yy5:
266
67
      ++YYCURSOR;
267
67
      {
268
67
    s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
269
67
    return PHP_JSON_T_ERROR;
270
7.67k
  }
271
2.01k
yy7:
272
2.01k
      yych = *++YYCURSOR;
273
2.24k
yy8:
274
2.24k
      if (yybm[0+yych] & 64) {
275
1.45k
        goto yy7;
276
1.45k
      }
277
785
      {
278
785
    PHP_JSON_TOKEN_LOCATION(last_column) += PHP_JSON_TOKEN_LENGTH();
279
785
    goto std;
280
2.24k
  }
281
805
yy10:
282
805
      ++YYCURSOR;
283
805
      {
284
805
    PHP_JSON_TOKEN_LOCATION(last_line)++;
285
805
    PHP_JSON_TOKEN_LOCATION(last_column) = 1;
286
805
    goto std;
287
2.24k
  }
288
427
yy12:
289
427
      yych = *++YYCURSOR;
290
427
      if (yych == '\n') goto yy10;
291
229
      goto yy8;
292
565
yy13:
293
565
      ++YYCURSOR;
294
795
yy14:
295
795
      {
296
795
    s->errcode = PHP_JSON_ERROR_SYNTAX;
297
795
    return PHP_JSON_T_ERROR;
298
565
  }
299
65.0k
yy15:
300
65.0k
      ++YYCURSOR;
301
65.0k
      {
302
65.0k
    PHP_JSON_TOKEN_LOCATION(last_column)++;
303
65.0k
    s->str_start = s->cursor;
304
65.0k
    s->str_esc = 0;
305
65.0k
    s->utf8_invalid = 0;
306
65.0k
    s->utf8_invalid_count = 0;
307
65.0k
    PHP_JSON_CONDITION_SET_AND_GOTO(STR_P1);
308
565
  }
309
8.00M
yy17:
310
8.00M
      ++YYCURSOR;
311
8.00M
      { 
312
8.00M
    PHP_JSON_TOKEN_LOCATION(last_column)++;
313
8.00M
    return ','; 
314
565
  }
315
1.23k
yy19:
316
1.23k
      yych = *++YYCURSOR;
317
1.23k
      if (yych <= '/') goto yy14;
318
1.21k
      if (yych <= '0') goto yy20;
319
910
      if (yych <= '9') goto yy22;
320
15
      goto yy14;
321
4.47M
yy20:
322
4.47M
      yyaccept = 0;
323
4.47M
      yych = *(YYMARKER = ++YYCURSOR);
324
4.47M
      if (yych <= 'D') {
325
4.46M
        if (yych == '.') goto yy46;
326
4.46M
      } else {
327
4.31k
        if (yych <= 'E') goto yy48;
328
3.99k
        if (yych == 'e') goto yy48;
329
3.99k
      }
330
5.34M
yy21:
331
5.34M
      {
332
5.34M
    bool bigint = 0, negative = s->token[0] == '-';
333
5.34M
    size_t digits = PHP_JSON_TOKEN_LENGTH();
334
5.34M
    PHP_JSON_TOKEN_LOCATION(last_column) += digits;
335
5.34M
    digits -= negative;
336
5.34M
    if (digits >= PHP_JSON_INT_MAX_LENGTH) {
337
3.01k
      if (digits == PHP_JSON_INT_MAX_LENGTH) {
338
1.01k
        int cmp = strncmp((char *) (s->token + negative), LONG_MIN_DIGITS, PHP_JSON_INT_MAX_LENGTH);
339
1.01k
        if (!(cmp < 0 || (cmp == 0 && negative))) {
340
576
          bigint = 1;
341
576
        }
342
1.99k
      } else {
343
1.99k
        bigint = 1;
344
1.99k
      }
345
3.01k
    }
346
5.34M
    if (!bigint) {
347
5.34M
      ZVAL_LONG(&s->value, ZEND_STRTOL((char *) s->token, NULL, 10));
348
5.34M
      return PHP_JSON_T_INT;
349
5.34M
    } 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
2.57k
    } else {
353
2.57k
      ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL));
354
2.57k
      return PHP_JSON_T_DOUBLE;
355
2.57k
    }
356
5.34M
  }
357
22.9M
yy22:
358
22.9M
      yyaccept = 0;
359
22.9M
      yych = *(YYMARKER = ++YYCURSOR);
360
22.9M
      if (yybm[0+yych] & 128) {
361
22.0M
        goto yy22;
362
22.0M
      }
363
892k
      if (yych <= 'D') {
364
877k
        if (yych == '.') goto yy46;
365
869k
        goto yy21;
366
877k
      } else {
367
14.6k
        if (yych <= 'E') goto yy48;
368
13.0k
        if (yych == 'e') goto yy48;
369
3.25k
        goto yy21;
370
13.0k
      }
371
58.1k
yy24:
372
58.1k
      ++YYCURSOR;
373
58.1k
      { 
374
58.1k
    PHP_JSON_TOKEN_LOCATION(last_column)++;
375
58.1k
    return ':'; 
376
892k
  }
377
8.45k
yy26:
378
8.45k
      ++YYCURSOR;
379
8.45k
      { 
380
8.45k
    PHP_JSON_TOKEN_LOCATION(last_column)++;
381
8.45k
    return '['; 
382
892k
  }
383
6.17k
yy28:
384
6.17k
      ++YYCURSOR;
385
6.17k
      { 
386
6.17k
    PHP_JSON_TOKEN_LOCATION(last_column)++;
387
6.17k
    return ']'; 
388
892k
  }
389
266
yy30:
390
266
      yyaccept = 1;
391
266
      yych = *(YYMARKER = ++YYCURSOR);
392
266
      if (yych == 'a') goto yy49;
393
21
      goto yy14;
394
272
yy31:
395
272
      yyaccept = 1;
396
272
      yych = *(YYMARKER = ++YYCURSOR);
397
272
      if (yych == 'u') goto yy50;
398
25
      goto yy14;
399
250
yy32:
400
250
      yyaccept = 1;
401
250
      yych = *(YYMARKER = ++YYCURSOR);
402
250
      if (yych == 'r') goto yy51;
403
26
      goto yy14;
404
2.65M
yy33:
405
2.65M
      ++YYCURSOR;
406
2.65M
      { 
407
2.65M
    PHP_JSON_TOKEN_LOCATION(last_column)++;
408
2.65M
    return '{'; 
409
250
  }
410
2.65M
yy35:
411
2.65M
      ++YYCURSOR;
412
2.65M
      { 
413
2.65M
    PHP_JSON_TOKEN_LOCATION(last_column)++;
414
2.65M
    return '}';
415
250
  }
416
131
yy37:
417
131
      ++YYCURSOR;
418
487
yy38:
419
487
      {
420
487
    s->errcode = PHP_JSON_ERROR_UTF8;
421
487
    return PHP_JSON_T_ERROR;
422
131
  }
423
79
yy39:
424
79
      yych = *++YYCURSOR;
425
79
      if (yych <= 0x7F) goto yy38;
426
40
      if (yych <= 0xBF) goto yy13;
427
23
      goto yy38;
428
36
yy40:
429
36
      yyaccept = 2;
430
36
      yych = *(YYMARKER = ++YYCURSOR);
431
36
      if (yych <= 0x9F) goto yy38;
432
15
      if (yych <= 0xBF) goto yy52;
433
7
      goto yy38;
434
73
yy41:
435
73
      yyaccept = 2;
436
73
      yych = *(YYMARKER = ++YYCURSOR);
437
73
      if (yych <= 0x7F) goto yy38;
438
51
      if (yych <= 0xBF) goto yy52;
439
19
      goto yy38;
440
41
yy42:
441
41
      yyaccept = 2;
442
41
      yych = *(YYMARKER = ++YYCURSOR);
443
41
      if (yych <= 0x7F) goto yy38;
444
38
      if (yych <= 0x9F) goto yy52;
445
23
      goto yy38;
446
61
yy43:
447
61
      yyaccept = 2;
448
61
      yych = *(YYMARKER = ++YYCURSOR);
449
61
      if (yych <= 0x8F) goto yy38;
450
40
      if (yych <= 0xBF) goto yy53;
451
11
      goto yy38;
452
65
yy44:
453
65
      yyaccept = 2;
454
65
      yych = *(YYMARKER = ++YYCURSOR);
455
65
      if (yych <= 0x7F) goto yy38;
456
56
      if (yych <= 0xBF) goto yy53;
457
19
      goto yy38;
458
37
yy45:
459
37
      yyaccept = 2;
460
37
      yych = *(YYMARKER = ++YYCURSOR);
461
37
      if (yych <= 0x7F) goto yy38;
462
32
      if (yych <= 0x8F) goto yy53;
463
19
      goto yy38;
464
9.51k
yy46:
465
9.51k
      yych = *++YYCURSOR;
466
9.51k
      if (yych <= '/') goto yy47;
467
9.48k
      if (yych <= '9') goto yy54;
468
488
yy47:
469
488
      YYCURSOR = YYMARKER;
470
488
      if (yyaccept <= 1) {
471
305
        if (yyaccept == 0) {
472
183
          goto yy21;
473
183
        } else {
474
122
          goto yy14;
475
122
        }
476
305
      } else {
477
183
        if (yyaccept == 2) {
478
115
          goto yy38;
479
115
        } else {
480
68
          goto yy56;
481
68
        }
482
183
      }
483
14.3k
yy48:
484
14.3k
      yych = *++YYCURSOR;
485
14.3k
      if (yych <= ',') {
486
402
        if (yych == '+') goto yy57;
487
119
        goto yy47;
488
13.9k
      } else {
489
13.9k
        if (yych <= '-') goto yy57;
490
8.26k
        if (yych <= '/') goto yy47;
491
8.25k
        if (yych <= '9') goto yy58;
492
32
        goto yy47;
493
8.25k
      }
494
245
yy49:
495
245
      yych = *++YYCURSOR;
496
245
      if (yych == 'l') goto yy60;
497
23
      goto yy47;
498
247
yy50:
499
247
      yych = *++YYCURSOR;
500
247
      if (yych == 'l') goto yy61;
501
22
      goto yy47;
502
224
yy51:
503
224
      yych = *++YYCURSOR;
504
224
      if (yych == 'u') goto yy62;
505
5
      goto yy47;
506
72
yy52:
507
72
      yych = *++YYCURSOR;
508
72
      if (yych <= 0x7F) goto yy47;
509
28
      if (yych <= 0xBF) goto yy13;
510
9
      goto yy47;
511
79
yy53:
512
79
      yych = *++YYCURSOR;
513
79
      if (yych <= 0x7F) goto yy47;
514
36
      if (yych <= 0xBF) goto yy52;
515
19
      goto yy47;
516
59.9M
yy54:
517
59.9M
      yyaccept = 3;
518
59.9M
      yych = *(YYMARKER = ++YYCURSOR);
519
59.9M
      if (yych <= 'D') {
520
59.9M
        if (yych <= '/') goto yy56;
521
59.9M
        if (yych <= '9') goto yy54;
522
59.9M
      } else {
523
2.60k
        if (yych <= 'E') goto yy48;
524
2.28k
        if (yych == 'e') goto yy48;
525
2.28k
      }
526
21.7k
yy56:
527
21.7k
      {
528
21.7k
    PHP_JSON_TOKEN_LOCATION(last_column) += PHP_JSON_TOKEN_LENGTH();
529
21.7k
    ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL));
530
21.7k
    return PHP_JSON_T_DOUBLE;
531
59.9M
  }
532
5.93k
yy57:
533
5.93k
      yych = *++YYCURSOR;
534
5.93k
      if (yych <= '/') goto yy47;
535
5.90k
      if (yych >= ':') goto yy47;
536
2.67M
yy58:
537
2.67M
      yych = *++YYCURSOR;
538
2.67M
      if (yych <= '/') goto yy56;
539
2.66M
      if (yych <= '9') goto yy58;
540
292
      goto yy56;
541
292
yy60:
542
222
      yych = *++YYCURSOR;
543
222
      if (yych == 's') goto yy63;
544
21
      goto yy47;
545
225
yy61:
546
225
      yych = *++YYCURSOR;
547
225
      if (yych == 'l') goto yy64;
548
23
      goto yy47;
549
219
yy62:
550
219
      yych = *++YYCURSOR;
551
219
      if (yych == 'e') goto yy66;
552
23
      goto yy47;
553
201
yy63:
554
201
      yych = *++YYCURSOR;
555
201
      if (yych == 'e') goto yy68;
556
5
      goto yy47;
557
202
yy64:
558
202
      ++YYCURSOR;
559
202
      {
560
202
    PHP_JSON_TOKEN_LOCATION(last_column) += 4;
561
202
    ZVAL_NULL(&s->value);
562
202
    return PHP_JSON_T_NUL;
563
201
  }
564
196
yy66:
565
196
      ++YYCURSOR;
566
196
      {
567
196
    PHP_JSON_TOKEN_LOCATION(last_column) += 4;
568
196
    ZVAL_TRUE(&s->value);
569
196
    return PHP_JSON_T_TRUE;
570
201
  }
571
196
yy68:
572
196
      ++YYCURSOR;
573
196
      {
574
196
    PHP_JSON_TOKEN_LOCATION(last_column) += 5;
575
196
    ZVAL_FALSE(&s->value);
576
196
    return PHP_JSON_T_FALSE;
577
201
  }
578
201
    }
579
/* *********************************** */
580
31.7M
yyc_STR_P1:
581
31.7M
    yych = *YYCURSOR;
582
31.7M
    if (yych <= 0xDF) {
583
31.7M
      if (yych <= '[') {
584
16.5M
        if (yych <= 0x1F) goto yy72;
585
16.5M
        if (yych == '"') goto yy76;
586
16.4M
        goto yy74;
587
16.5M
      } else {
588
15.2M
        if (yych <= '\\') goto yy78;
589
15.1M
        if (yych <= 0x7F) goto yy74;
590
303
        if (yych <= 0xC1) goto yy80;
591
274
        goto yy82;
592
303
      }
593
31.7M
    } else {
594
1.97k
      if (yych <= 0xEF) {
595
939
        if (yych <= 0xE0) goto yy83;
596
670
        if (yych == 0xED) goto yy85;
597
426
        goto yy84;
598
1.03k
      } else {
599
1.03k
        if (yych <= 0xF0) goto yy86;
600
655
        if (yych <= 0xF3) goto yy87;
601
243
        if (yych <= 0xF4) goto yy88;
602
15
        goto yy80;
603
243
      }
604
1.97k
    }
605
494
yy72:
606
494
    ++YYCURSOR;
607
494
    {
608
494
    s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
609
494
    return PHP_JSON_T_ERROR;
610
31.7M
  }
611
31.5M
yy74:
612
31.5M
    ++YYCURSOR;
613
31.5M
    {
614
31.5M
    PHP_JSON_TOKEN_LOCATION(last_column)++;
615
31.5M
    PHP_JSON_CONDITION_GOTO(STR_P1);
616
31.7M
  }
617
62.6k
yy76:
618
62.6k
    ++YYCURSOR;
619
62.6k
    {
620
62.6k
    PHP_JSON_TOKEN_LOCATION(last_column)++;
621
62.6k
    zend_string *str;
622
62.6k
    size_t len = (size_t)(s->cursor - s->str_start - s->str_esc - 1 + s->utf8_invalid_count);
623
62.6k
    if (len == 0) {
624
20.4k
      PHP_JSON_CONDITION_SET(JS);
625
20.4k
      ZVAL_EMPTY_STRING(&s->value);
626
20.4k
      return PHP_JSON_T_ESTRING;
627
20.4k
    }
628
42.1k
    str = zend_string_alloc(len, 0);
629
42.1k
    ZSTR_VAL(str)[len] = '\0';
630
42.1k
    ZVAL_STR(&s->value, str);
631
42.1k
    if (s->str_esc || s->utf8_invalid) {
632
3.79k
      s->pstr = (php_json_ctype *) Z_STRVAL(s->value);
633
3.79k
      s->cursor = s->str_start;
634
3.79k
      PHP_JSON_CONDITION_GOTO_STR_P2();
635
38.3k
    } else {
636
38.3k
      memcpy(Z_STRVAL(s->value), s->str_start, len);
637
38.3k
      PHP_JSON_CONDITION_SET(JS);
638
38.3k
      return PHP_JSON_T_STRING;
639
38.3k
    }
640
42.1k
  }
641
121k
yy78:
642
121k
    yyaccept = 0;
643
121k
    yych = *(YYMARKER = ++YYCURSOR);
644
121k
    if (yych <= 'e') {
645
2.29k
      if (yych <= '/') {
646
1.00k
        if (yych == '"') goto yy89;
647
511
        if (yych >= '/') goto yy89;
648
1.28k
      } else {
649
1.28k
        if (yych <= '\\') {
650
752
          if (yych >= '\\') goto yy89;
651
752
        } else {
652
537
          if (yych == 'b') goto yy89;
653
537
        }
654
1.28k
      }
655
119k
    } else {
656
119k
      if (yych <= 'q') {
657
1.23k
        if (yych <= 'f') goto yy89;
658
432
        if (yych == 'n') goto yy89;
659
117k
      } else {
660
117k
        if (yych <= 's') {
661
426
          if (yych <= 'r') goto yy89;
662
117k
        } else {
663
117k
          if (yych <= 't') goto yy89;
664
117k
          if (yych <= 'u') goto yy91;
665
117k
        }
666
117k
      }
667
119k
    }
668
1.18k
yy79:
669
1.18k
    {
670
1.18k
    s->errcode = PHP_JSON_ERROR_SYNTAX;
671
1.18k
    return PHP_JSON_T_ERROR;
672
121k
  }
673
44
yy80:
674
44
    ++YYCURSOR;
675
435
yy81:
676
435
    {
677
435
    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
435
    s->errcode = PHP_JSON_ERROR_UTF8;
691
435
    return PHP_JSON_T_ERROR;
692
435
  }
693
274
yy82:
694
274
    yych = *++YYCURSOR;
695
274
    if (yych <= 0x7F) goto yy81;
696
259
    if (yych <= 0xBF) goto yy93;
697
18
    goto yy81;
698
269
yy83:
699
269
    yyaccept = 1;
700
269
    yych = *(YYMARKER = ++YYCURSOR);
701
269
    if (yych <= 0x9F) goto yy81;
702
254
    if (yych <= 0xBF) goto yy95;
703
17
    goto yy81;
704
426
yy84:
705
426
    yyaccept = 1;
706
426
    yych = *(YYMARKER = ++YYCURSOR);
707
426
    if (yych <= 0x7F) goto yy81;
708
413
    if (yych <= 0xBF) goto yy95;
709
13
    goto yy81;
710
244
yy85:
711
244
    yyaccept = 1;
712
244
    yych = *(YYMARKER = ++YYCURSOR);
713
244
    if (yych <= 0x7F) goto yy81;
714
241
    if (yych <= 0x9F) goto yy95;
715
19
    goto yy81;
716
383
yy86:
717
383
    yyaccept = 1;
718
383
    yych = *(YYMARKER = ++YYCURSOR);
719
383
    if (yych <= 0x8F) goto yy81;
720
378
    if (yych <= 0xBF) goto yy96;
721
9
    goto yy81;
722
412
yy87:
723
412
    yyaccept = 1;
724
412
    yych = *(YYMARKER = ++YYCURSOR);
725
412
    if (yych <= 0x7F) goto yy81;
726
409
    if (yych <= 0xBF) goto yy96;
727
25
    goto yy81;
728
228
yy88:
729
228
    yyaccept = 1;
730
228
    yych = *(YYMARKER = ++YYCURSOR);
731
228
    if (yych <= 0x7F) goto yy81;
732
225
    if (yych <= 0x8F) goto yy96;
733
19
    goto yy81;
734
4.35k
yy89:
735
4.35k
    ++YYCURSOR;
736
4.35k
    {
737
4.35k
    PHP_JSON_TOKEN_LOCATION(last_column) += 2;
738
4.35k
    s->str_esc++;
739
4.35k
    PHP_JSON_CONDITION_GOTO(STR_P1);
740
225
  }
741
117k
yy91:
742
117k
    yych = *++YYCURSOR;
743
117k
    if (yych <= 'D') {
744
113k
      if (yych <= '9') {
745
110k
        if (yych <= '/') goto yy92;
746
110k
        if (yych <= '0') goto yy97;
747
1.21k
        goto yy98;
748
110k
      } else {
749
2.79k
        if (yych <= '@') goto yy92;
750
2.78k
        if (yych <= 'C') goto yy98;
751
2.31k
        goto yy99;
752
2.78k
      }
753
113k
    } else {
754
3.37k
      if (yych <= 'c') {
755
735
        if (yych <= 'F') goto yy98;
756
383
        if (yych >= 'a') goto yy98;
757
2.64k
      } else {
758
2.64k
        if (yych <= 'd') goto yy99;
759
401
        if (yych <= 'f') goto yy98;
760
401
      }
761
3.37k
    }
762
1.49k
yy92:
763
1.49k
    YYCURSOR = YYMARKER;
764
1.49k
    if (yyaccept <= 1) {
765
1.28k
      if (yyaccept == 0) {
766
1.07k
        goto yy79;
767
1.07k
      } else {
768
214
        goto yy81;
769
214
      }
770
1.28k
    } else {
771
212
      goto yy122;
772
212
    }
773
241
yy93:
774
241
    ++YYCURSOR;
775
241
    {
776
241
    PHP_JSON_TOKEN_LOCATION(last_column) += 1;
777
241
    PHP_JSON_CONDITION_GOTO(STR_P1);
778
1.49k
  }
779
859
yy95:
780
859
    yych = *++YYCURSOR;
781
859
    if (yych <= 0x7F) goto yy92;
782
781
    if (yych <= 0xBF) goto yy100;
783
15
    goto yy92;
784
959
yy96:
785
959
    yych = *++YYCURSOR;
786
959
    if (yych <= 0x7F) goto yy92;
787
883
    if (yych <= 0xBF) goto yy102;
788
13
    goto yy92;
789
109k
yy97:
790
109k
    yych = *++YYCURSOR;
791
109k
    if (yych <= '9') {
792
108k
      if (yych <= '/') goto yy92;
793
108k
      if (yych <= '0') goto yy103;
794
61.9k
      if (yych <= '7') goto yy104;
795
464
      goto yy105;
796
61.9k
    } else {
797
786
      if (yych <= 'F') {
798
266
        if (yych <= '@') goto yy92;
799
261
        goto yy105;
800
520
      } else {
801
520
        if (yych <= '`') goto yy92;
802
511
        if (yych <= 'f') goto yy105;
803
21
        goto yy92;
804
511
      }
805
786
    }
806
2.78k
yy98:
807
2.78k
    yych = *++YYCURSOR;
808
2.78k
    if (yych <= '@') {
809
1.23k
      if (yych <= '/') goto yy92;
810
1.15k
      if (yych <= '9') goto yy105;
811
9
      goto yy92;
812
1.55k
    } else {
813
1.55k
      if (yych <= 'F') goto yy105;
814
718
      if (yych <= '`') goto yy92;
815
715
      if (yych <= 'f') goto yy105;
816
15
      goto yy92;
817
715
    }
818
4.55k
yy99:
819
4.55k
    yych = *++YYCURSOR;
820
4.55k
    if (yych <= 'B') {
821
2.80k
      if (yych <= '7') {
822
956
        if (yych <= '/') goto yy92;
823
922
        goto yy105;
824
1.85k
      } else {
825
1.85k
        if (yych <= '9') goto yy106;
826
871
        if (yych <= '@') goto yy92;
827
866
        goto yy106;
828
871
      }
829
2.80k
    } else {
830
1.74k
      if (yych <= '`') {
831
103
        if (yych <= 'F') goto yy107;
832
13
        goto yy92;
833
1.64k
      } else {
834
1.64k
        if (yych <= 'b') goto yy106;
835
83
        if (yych <= 'f') goto yy107;
836
23
        goto yy92;
837
83
      }
838
1.74k
    }
839
766
yy100:
840
766
    ++YYCURSOR;
841
766
    {
842
766
    PHP_JSON_TOKEN_LOCATION(last_column) += 1;
843
766
    PHP_JSON_CONDITION_GOTO(STR_P1);
844
4.55k
  }
845
870
yy102:
846
870
    yych = *++YYCURSOR;
847
870
    if (yych <= 0x7F) goto yy92;
848
853
    if (yych <= 0xBF) goto yy108;
849
15
    goto yy92;
850
46.8k
yy103:
851
46.8k
    yych = *++YYCURSOR;
852
46.8k
    if (yych <= '@') {
853
40.3k
      if (yych <= '/') goto yy92;
854
40.3k
      if (yych <= '7') goto yy110;
855
342
      if (yych <= '9') goto yy111;
856
9
      goto yy92;
857
6.53k
    } else {
858
6.53k
      if (yych <= 'F') goto yy111;
859
447
      if (yych <= '`') goto yy92;
860
436
      if (yych <= 'f') goto yy111;
861
19
      goto yy92;
862
436
    }
863
61.5k
yy104:
864
61.5k
    yych = *++YYCURSOR;
865
61.5k
    if (yych <= '@') {
866
896
      if (yych <= '/') goto yy92;
867
875
      if (yych <= '9') goto yy111;
868
5
      goto yy92;
869
60.6k
    } else {
870
60.6k
      if (yych <= 'F') goto yy111;
871
447
      if (yych <= '`') goto yy92;
872
434
      if (yych <= 'f') goto yy111;
873
19
      goto yy92;
874
434
    }
875
4.82k
yy105:
876
4.82k
    yych = *++YYCURSOR;
877
4.82k
    if (yych <= '@') {
878
3.01k
      if (yych <= '/') goto yy92;
879
2.91k
      if (yych <= '9') goto yy112;
880
9
      goto yy92;
881
2.91k
    } else {
882
1.81k
      if (yych <= 'F') goto yy112;
883
820
      if (yych <= '`') goto yy92;
884
809
      if (yych <= 'f') goto yy112;
885
15
      goto yy92;
886
809
    }
887
3.40k
yy106:
888
3.40k
    yych = *++YYCURSOR;
889
3.40k
    if (yych <= '@') {
890
1.20k
      if (yych <= '/') goto yy92;
891
1.16k
      if (yych <= '9') goto yy113;
892
5
      goto yy92;
893
2.20k
    } else {
894
2.20k
      if (yych <= 'F') goto yy113;
895
1.31k
      if (yych <= '`') goto yy92;
896
1.29k
      if (yych <= 'f') goto yy113;
897
19
      goto yy92;
898
1.29k
    }
899
150
yy107:
900
150
    yych = *++YYCURSOR;
901
150
    if (yych <= '@') {
902
79
      if (yych <= '/') goto yy92;
903
57
      if (yych <= '9') goto yy114;
904
7
      goto yy92;
905
71
    } else {
906
71
      if (yych <= 'F') goto yy114;
907
46
      if (yych <= '`') goto yy92;
908
43
      if (yych <= 'f') goto yy114;
909
21
      goto yy92;
910
43
    }
911
838
yy108:
912
838
    ++YYCURSOR;
913
838
    {
914
838
    PHP_JSON_TOKEN_LOCATION(last_column) += 1;
915
838
    PHP_JSON_CONDITION_GOTO(STR_P1);
916
150
  }
917
39.9k
yy110:
918
39.9k
    yych = *++YYCURSOR;
919
39.9k
    if (yych <= '@') {
920
37.2k
      if (yych <= '/') goto yy92;
921
37.1k
      if (yych <= '9') goto yy115;
922
3
      goto yy92;
923
37.1k
    } else {
924
2.76k
      if (yych <= 'F') goto yy115;
925
577
      if (yych <= '`') goto yy92;
926
572
      if (yych <= 'f') goto yy115;
927
15
      goto yy92;
928
572
    }
929
68.2k
yy111:
930
68.2k
    yych = *++YYCURSOR;
931
68.2k
    if (yych <= '@') {
932
6.87k
      if (yych <= '/') goto yy92;
933
6.78k
      if (yych <= '9') goto yy117;
934
7
      goto yy92;
935
61.4k
    } else {
936
61.4k
      if (yych <= 'F') goto yy117;
937
685
      if (yych <= '`') goto yy92;
938
678
      if (yych <= 'f') goto yy117;
939
15
      goto yy92;
940
678
    }
941
4.68k
yy112:
942
4.68k
    yych = *++YYCURSOR;
943
4.68k
    if (yych <= '@') {
944
2.66k
      if (yych <= '/') goto yy92;
945
2.60k
      if (yych <= '9') goto yy119;
946
5
      goto yy92;
947
2.60k
    } else {
948
2.02k
      if (yych <= 'F') goto yy119;
949
950
      if (yych <= '`') goto yy92;
950
941
      if (yych <= 'f') goto yy119;
951
19
      goto yy92;
952
941
    }
953
3.33k
yy113:
954
3.33k
    yych = *++YYCURSOR;
955
3.33k
    if (yych <= '@') {
956
1.01k
      if (yych <= '/') goto yy92;
957
960
      if (yych <= '9') goto yy121;
958
9
      goto yy92;
959
2.31k
    } else {
960
2.31k
      if (yych <= 'F') goto yy121;
961
875
      if (yych <= '`') goto yy92;
962
870
      if (yych <= 'f') goto yy121;
963
25
      goto yy92;
964
870
    }
965
97
yy114:
966
97
    yych = *++YYCURSOR;
967
97
    if (yych <= '@') {
968
57
      if (yych <= '/') goto yy92;
969
22
      if (yych <= '9') goto yy123;
970
7
      goto yy92;
971
40
    } else {
972
40
      if (yych <= 'F') goto yy123;
973
35
      if (yych <= '`') goto yy92;
974
26
      if (yych <= 'f') goto yy123;
975
21
      goto yy92;
976
26
    }
977
39.9k
yy115:
978
39.9k
    ++YYCURSOR;
979
39.9k
    {
980
39.9k
    PHP_JSON_TOKEN_LOCATION(last_column) += 1;
981
39.9k
    s->str_esc += 5;
982
39.9k
    PHP_JSON_CONDITION_GOTO(STR_P1);
983
97
  }
984
68.1k
yy117:
985
68.1k
    ++YYCURSOR;
986
68.1k
    {
987
68.1k
    PHP_JSON_TOKEN_LOCATION(last_column) += 1;
988
68.1k
    s->str_esc += 4;
989
68.1k
    PHP_JSON_CONDITION_GOTO(STR_P1);
990
97
  }
991
4.59k
yy119:
992
4.59k
    ++YYCURSOR;
993
4.59k
    {
994
4.59k
    PHP_JSON_TOKEN_LOCATION(last_column) += 1;
995
4.59k
    s->str_esc += 3;
996
4.59k
    PHP_JSON_CONDITION_GOTO(STR_P1);
997
97
  }
998
3.23k
yy121:
999
3.23k
    yyaccept = 2;
1000
3.23k
    yych = *(YYMARKER = ++YYCURSOR);
1001
3.23k
    if (yych == '\\') goto yy124;
1002
299
yy122:
1003
299
    {
1004
299
    s->errcode = PHP_JSON_ERROR_UTF16;
1005
299
    return PHP_JSON_T_ERROR;
1006
3.23k
  }
1007
25
yy123:
1008
25
    ++YYCURSOR;
1009
25
    goto yy122;
1010
3.17k
yy124:
1011
3.17k
    yych = *++YYCURSOR;
1012
3.17k
    if (yych != 'u') goto yy92;
1013
3.15k
    yych = *++YYCURSOR;
1014
3.15k
    if (yych == 'D') goto yy126;
1015
892
    if (yych != 'd') goto yy92;
1016
3.12k
yy126:
1017
3.12k
    yych = *++YYCURSOR;
1018
3.12k
    if (yych <= 'B') goto yy92;
1019
3.09k
    if (yych <= 'F') goto yy127;
1020
1.45k
    if (yych <= 'b') goto yy92;
1021
1.44k
    if (yych >= 'g') goto yy92;
1022
3.07k
yy127:
1023
3.07k
    yych = *++YYCURSOR;
1024
3.07k
    if (yych <= '@') {
1025
985
      if (yych <= '/') goto yy92;
1026
965
      if (yych >= ':') goto yy92;
1027
2.09k
    } else {
1028
2.09k
      if (yych <= 'F') goto yy128;
1029
1.18k
      if (yych <= '`') goto yy92;
1030
1.17k
      if (yych >= 'g') goto yy92;
1031
1.17k
    }
1032
3.03k
yy128:
1033
3.03k
    yych = *++YYCURSOR;
1034
3.03k
    if (yych <= '@') {
1035
981
      if (yych <= '/') goto yy92;
1036
933
      if (yych >= ':') goto yy92;
1037
2.04k
    } else {
1038
2.04k
      if (yych <= 'F') goto yy129;
1039
1.09k
      if (yych <= '`') goto yy92;
1040
1.09k
      if (yych >= 'g') goto yy92;
1041
1.09k
    }
1042
2.96k
yy129:
1043
2.96k
    ++YYCURSOR;
1044
2.96k
    {
1045
2.96k
    PHP_JSON_TOKEN_LOCATION(last_column) += 1;
1046
2.96k
    s->str_esc += 8;
1047
2.96k
    PHP_JSON_CONDITION_GOTO(STR_P1);
1048
3.03k
  }
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
17.4M
yyc_STR_P2_UTF:
1434
17.4M
    yych = *YYCURSOR;
1435
17.4M
    if (yych == '"') goto yy181;
1436
17.4M
    if (yych == '\\') goto yy183;
1437
17.3M
    ++YYCURSOR;
1438
17.3M
    { PHP_JSON_CONDITION_GOTO(STR_P2_UTF); }
1439
3.79k
yy181:
1440
3.79k
    ++YYCURSOR;
1441
3.79k
    YYSETCONDITION(yycJS);
1442
3.79k
    {
1443
3.79k
    PHP_JSON_SCANNER_COPY_ESC();
1444
3.79k
    return PHP_JSON_T_STRING;
1445
17.4M
  }
1446
116k
yy183:
1447
116k
    yych = *(YYMARKER = ++YYCURSOR);
1448
116k
    if (yych == 'u') goto yy185;
1449
3.19k
yy184:
1450
3.19k
    {
1451
3.19k
    unsigned char esc;
1452
3.19k
    PHP_JSON_SCANNER_COPY_ESC();
1453
3.19k
    switch (*s->cursor) {
1454
325
      case 'b':
1455
325
        esc = '\b';
1456
325
        break;
1457
735
      case 'f':
1458
735
        esc = '\f';       break;
1459
353
      case 'n':
1460
353
        esc = '\n';
1461
353
        break;
1462
231
      case 'r':
1463
231
        esc = '\r';
1464
231
        break;
1465
292
      case 't':
1466
292
        esc = '\t';
1467
292
        break;
1468
531
      case '\\':
1469
958
      case '/':
1470
1.26k
      case '"':
1471
1.26k
        esc = *s->cursor;
1472
1.26k
        break;
1473
0
      default:
1474
0
        s->errcode = PHP_JSON_ERROR_SYNTAX;
1475
0
        return PHP_JSON_T_ERROR;
1476
3.19k
    }
1477
3.19k
    *(s->pstr++) = esc;
1478
3.19k
    ++YYCURSOR;
1479
3.19k
    s->str_start = s->cursor;
1480
3.19k
    PHP_JSON_CONDITION_GOTO_STR_P2();
1481
3.19k
  }
1482
112k
yy185:
1483
112k
    yych = *++YYCURSOR;
1484
112k
    if (yych <= 'D') {
1485
111k
      if (yych <= '9') {
1486
109k
        if (yych <= '/') goto yy186;
1487
109k
        if (yych <= '0') goto yy187;
1488
868
        goto yy188;
1489
109k
      } else {
1490
1.84k
        if (yych <= '@') goto yy186;
1491
1.84k
        if (yych <= 'C') goto yy188;
1492
1.52k
        goto yy189;
1493
1.84k
      }
1494
111k
    } else {
1495
1.81k
      if (yych <= 'c') {
1496
441
        if (yych <= 'F') goto yy188;
1497
220
        if (yych >= 'a') goto yy188;
1498
1.37k
      } else {
1499
1.37k
        if (yych <= 'd') goto yy189;
1500
259
        if (yych <= 'f') goto yy188;
1501
259
      }
1502
1.81k
    }
1503
0
yy186:
1504
0
    YYCURSOR = YYMARKER;
1505
0
    goto yy184;
1506
108k
yy187:
1507
108k
    yych = *++YYCURSOR;
1508
108k
    if (yych <= '9') {
1509
107k
      if (yych <= '/') goto yy186;
1510
107k
      if (yych <= '0') goto yy190;
1511
61.3k
      if (yych <= '7') goto yy191;
1512
254
      goto yy192;
1513
61.3k
    } else {
1514
652
      if (yych <= 'F') {
1515
213
        if (yych <= '@') goto yy186;
1516
213
        goto yy192;
1517
439
      } else {
1518
439
        if (yych <= '`') goto yy186;
1519
439
        if (yych <= 'f') goto yy192;
1520
0
        goto yy186;
1521
439
      }
1522
652
    }
1523
1.88k
yy188:
1524
1.88k
    yych = *++YYCURSOR;
1525
1.88k
    if (yych <= '@') {
1526
773
      if (yych <= '/') goto yy186;
1527
773
      if (yych <= '9') goto yy192;
1528
0
      goto yy186;
1529
1.11k
    } else {
1530
1.11k
      if (yych <= 'F') goto yy192;
1531
459
      if (yych <= '`') goto yy186;
1532
459
      if (yych <= 'f') goto yy192;
1533
0
      goto yy186;
1534
459
    }
1535
2.64k
yy189:
1536
2.64k
    yych = *++YYCURSOR;
1537
2.64k
    if (yych <= '@') {
1538
1.59k
      if (yych <= '/') goto yy186;
1539
1.59k
      if (yych <= '7') goto yy192;
1540
797
      if (yych <= '9') goto yy193;
1541
0
      goto yy186;
1542
1.05k
    } else {
1543
1.05k
      if (yych <= 'B') goto yy193;
1544
573
      if (yych <= '`') goto yy186;
1545
573
      if (yych <= 'b') goto yy193;
1546
0
      goto yy186;
1547
573
    }
1548
46.3k
yy190:
1549
46.3k
    yych = *++YYCURSOR;
1550
46.3k
    if (yych <= '@') {
1551
40.0k
      if (yych <= '/') goto yy186;
1552
40.0k
      if (yych <= '7') goto yy194;
1553
286
      if (yych <= '9') goto yy195;
1554
0
      goto yy186;
1555
6.33k
    } else {
1556
6.33k
      if (yych <= 'F') goto yy195;
1557
324
      if (yych <= '`') goto yy186;
1558
324
      if (yych <= 'f') goto yy195;
1559
0
      goto yy186;
1560
324
    }
1561
61.0k
yy191:
1562
61.0k
    yych = *++YYCURSOR;
1563
61.0k
    if (yych <= '@') {
1564
769
      if (yych <= '/') goto yy186;
1565
769
      if (yych <= '9') goto yy195;
1566
0
      goto yy186;
1567
60.3k
    } else {
1568
60.3k
      if (yych <= 'F') goto yy195;
1569
309
      if (yych <= '`') goto yy186;
1570
309
      if (yych <= 'f') goto yy195;
1571
0
      goto yy186;
1572
309
    }
1573
3.58k
yy192:
1574
3.58k
    yych = *++YYCURSOR;
1575
3.58k
    if (yych <= '@') {
1576
2.21k
      if (yych <= '/') goto yy186;
1577
2.21k
      if (yych <= '9') goto yy196;
1578
0
      goto yy186;
1579
2.21k
    } else {
1580
1.37k
      if (yych <= 'F') goto yy196;
1581
565
      if (yych <= '`') goto yy186;
1582
565
      if (yych <= 'f') goto yy196;
1583
0
      goto yy186;
1584
565
    }
1585
1.85k
yy193:
1586
1.85k
    yych = *++YYCURSOR;
1587
1.85k
    if (yych <= '@') {
1588
978
      if (yych <= '/') goto yy186;
1589
978
      if (yych <= '9') goto yy197;
1590
0
      goto yy186;
1591
978
    } else {
1592
873
      if (yych <= 'F') goto yy197;
1593
597
      if (yych <= '`') goto yy186;
1594
597
      if (yych <= 'f') goto yy197;
1595
0
      goto yy186;
1596
597
    }
1597
39.7k
yy194:
1598
39.7k
    yych = *++YYCURSOR;
1599
39.7k
    if (yych <= '@') {
1600
37.0k
      if (yych <= '/') goto yy186;
1601
37.0k
      if (yych <= '9') goto yy198;
1602
0
      goto yy186;
1603
37.0k
    } else {
1604
2.62k
      if (yych <= 'F') goto yy198;
1605
512
      if (yych <= '`') goto yy186;
1606
512
      if (yych <= 'f') goto yy198;
1607
0
      goto yy186;
1608
512
    }
1609
67.7k
yy195:
1610
67.7k
    yych = *++YYCURSOR;
1611
67.7k
    if (yych <= '@') {
1612
6.63k
      if (yych <= '/') goto yy186;
1613
6.63k
      if (yych <= '9') goto yy200;
1614
0
      goto yy186;
1615
61.0k
    } else {
1616
61.0k
      if (yych <= 'F') goto yy200;
1617
536
      if (yych <= '`') goto yy186;
1618
536
      if (yych <= 'f') goto yy200;
1619
0
      goto yy186;
1620
536
    }
1621
3.58k
yy196:
1622
3.58k
    yych = *++YYCURSOR;
1623
3.58k
    if (yych <= '@') {
1624
2.00k
      if (yych <= '/') goto yy186;
1625
2.00k
      if (yych <= '9') goto yy202;
1626
0
      goto yy186;
1627
2.00k
    } else {
1628
1.57k
      if (yych <= 'F') goto yy202;
1629
740
      if (yych <= '`') goto yy186;
1630
740
      if (yych <= 'f') goto yy202;
1631
0
      goto yy186;
1632
740
    }
1633
1.85k
yy197:
1634
1.85k
    yych = *++YYCURSOR;
1635
1.85k
    if (yych <= '@') {
1636
803
      if (yych <= '/') goto yy186;
1637
803
      if (yych <= '9') goto yy204;
1638
0
      goto yy186;
1639
1.04k
    } else {
1640
1.04k
      if (yych <= 'F') goto yy204;
1641
397
      if (yych <= '`') goto yy186;
1642
397
      if (yych <= 'f') goto yy204;
1643
0
      goto yy186;
1644
397
    }
1645
39.7k
yy198:
1646
39.7k
    ++YYCURSOR;
1647
39.7k
    {
1648
39.7k
    int utf16 = php_json_ucs2_to_int(s, 2);
1649
39.7k
    PHP_JSON_SCANNER_COPY_UTF();
1650
39.7k
    *(s->pstr++) = (unsigned char) utf16;
1651
39.7k
    s->str_start = s->cursor;
1652
39.7k
    PHP_JSON_CONDITION_GOTO_STR_P2();
1653
39.7k
  }
1654
67.7k
yy200:
1655
67.7k
    ++YYCURSOR;
1656
67.7k
    {
1657
67.7k
    int utf16 = php_json_ucs2_to_int(s, 3);
1658
67.7k
    PHP_JSON_SCANNER_COPY_UTF();
1659
67.7k
    *(s->pstr++) = (unsigned char) (0xc0 | (utf16 >> 6));
1660
67.7k
    *(s->pstr++) = (unsigned char) (0x80 | (utf16 & 0x3f));
1661
67.7k
    s->str_start = s->cursor;
1662
67.7k
    PHP_JSON_CONDITION_GOTO_STR_P2();
1663
67.7k
  }
1664
3.58k
yy202:
1665
3.58k
    ++YYCURSOR;
1666
3.58k
    {
1667
3.58k
    int utf16 = php_json_ucs2_to_int(s, 4);
1668
3.58k
    PHP_JSON_SCANNER_COPY_UTF();
1669
3.58k
    *(s->pstr++) = (unsigned char) (0xe0 | (utf16 >> 12));
1670
3.58k
    *(s->pstr++) = (unsigned char) (0x80 | ((utf16 >> 6) & 0x3f));
1671
3.58k
    *(s->pstr++) = (unsigned char) (0x80 | (utf16 & 0x3f));
1672
3.58k
    s->str_start = s->cursor;
1673
3.58k
    PHP_JSON_CONDITION_GOTO_STR_P2();
1674
3.58k
  }
1675
1.85k
yy204:
1676
1.85k
    yych = *++YYCURSOR;
1677
1.85k
    if (yych != '\\') goto yy186;
1678
1.85k
    yych = *++YYCURSOR;
1679
1.85k
    if (yych != 'u') goto yy186;
1680
1.85k
    yych = *++YYCURSOR;
1681
1.85k
    if (yych == 'D') goto yy207;
1682
439
    if (yych != 'd') goto yy186;
1683
1.85k
yy207:
1684
1.85k
    yych = *++YYCURSOR;
1685
1.85k
    if (yych <= 'B') goto yy186;
1686
1.85k
    if (yych <= 'F') goto yy208;
1687
805
    if (yych <= 'b') goto yy186;
1688
805
    if (yych >= 'g') goto yy186;
1689
1.85k
yy208:
1690
1.85k
    yych = *++YYCURSOR;
1691
1.85k
    if (yych <= '@') {
1692
785
      if (yych <= '/') goto yy186;
1693
785
      if (yych >= ':') goto yy186;
1694
1.06k
    } else {
1695
1.06k
      if (yych <= 'F') goto yy209;
1696
658
      if (yych <= '`') goto yy186;
1697
658
      if (yych >= 'g') goto yy186;
1698
658
    }
1699
1.85k
yy209:
1700
1.85k
    yych = *++YYCURSOR;
1701
1.85k
    if (yych <= '@') {
1702
777
      if (yych <= '/') goto yy186;
1703
777
      if (yych >= ':') goto yy186;
1704
1.07k
    } else {
1705
1.07k
      if (yych <= 'F') goto yy210;
1706
620
      if (yych <= '`') goto yy186;
1707
620
      if (yych >= 'g') goto yy186;
1708
620
    }
1709
1.85k
yy210:
1710
1.85k
    ++YYCURSOR;
1711
1.85k
    {
1712
1.85k
    int utf32, utf16_hi, utf16_lo;
1713
1.85k
    utf16_hi = php_json_ucs2_to_int(s, 4);
1714
1.85k
    utf16_lo = php_json_ucs2_to_int_ex(s, 4, 7);
1715
1.85k
    utf32 = ((utf16_lo & 0x3FF) << 10) + (utf16_hi & 0x3FF) + 0x10000;
1716
1.85k
    PHP_JSON_SCANNER_COPY_UTF_SP();
1717
1.85k
    *(s->pstr++) = (unsigned char) (0xf0 | (utf32 >> 18));
1718
1.85k
    *(s->pstr++) = (unsigned char) (0x80 | ((utf32 >> 12) & 0x3f));
1719
1.85k
    *(s->pstr++) = (unsigned char) (0x80 | ((utf32 >> 6) & 0x3f));
1720
1.85k
    *(s->pstr++) = (unsigned char) (0x80 | (utf32 & 0x3f));
1721
1.85k
    s->str_start = s->cursor;
1722
1.85k
    PHP_JSON_CONDITION_GOTO_STR_P2();
1723
1.85k
  }
1724
1.85k
  }
1725
1726
1727
1.85k
}