Coverage Report

Created: 2026-06-02 06:36

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
0
#define YYCTYPE     php_json_ctype
23
0
#define YYCURSOR    s->cursor
24
#define YYLIMIT     s->limit
25
0
#define YYMARKER    s->marker
26
#define YYCTXMARKER s->ctxmarker
27
28
0
#define YYGETCONDITION()        s->state
29
0
#define YYSETCONDITION(yystate) s->state = yystate
30
31
#define YYFILL(n)
32
33
0
#define PHP_JSON_CONDITION_SET(condition) YYSETCONDITION(yyc##condition)
34
0
#define PHP_JSON_CONDITION_GOTO(condition) goto yyc_##condition
35
#define PHP_JSON_CONDITION_SET_AND_GOTO(condition) \
36
0
  PHP_JSON_CONDITION_SET(condition); \
37
0
  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
0
#define PHP_JSON_INT_MAX_LENGTH (MAX_LENGTH_OF_LONG - 1)
53
54
0
#define PHP_JSON_TOKEN_LENGTH() ((size_t) (s->cursor - s->token))
55
0
#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
0
{
97
0
  s->cursor = (php_json_ctype *) str;
98
0
  s->limit = (php_json_ctype *) str + str_len;
99
0
  s->options = options;
100
0
  PHP_JSON_TOKEN_LOCATION(first_column) = 1;
101
0
  PHP_JSON_TOKEN_LOCATION(first_line) = 1;
102
0
  PHP_JSON_TOKEN_LOCATION(last_column) = 1;
103
0
  PHP_JSON_TOKEN_LOCATION(last_line) = 1;
104
0
  PHP_JSON_CONDITION_SET(JS);
105
0
}
106
107
int php_json_scan(php_json_scanner *s)
108
0
{
109
0
  ZVAL_NULL(&s->value);
110
111
0
std:
112
0
  PHP_JSON_TOKEN_LOCATION(first_column) = s->errloc.last_column;
113
0
  PHP_JSON_TOKEN_LOCATION(first_line) = s->errloc.last_line;
114
0
  s->token = s->cursor;
115
116
117
0
  {
118
0
    YYCTYPE yych;
119
0
    unsigned int yyaccept = 0;
120
0
    if (YYGETCONDITION() < 2) {
121
0
      if (YYGETCONDITION() < 1) {
122
0
        goto yyc_JS;
123
0
      } else {
124
0
        goto yyc_STR_P1;
125
0
      }
126
0
    } 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
0
yyc_JS:
135
0
    {
136
0
      static const unsigned char yybm[] = {
137
0
          0,   0,   0,   0,   0,   0,   0,   0, 
138
0
          0,  64,   0,   0,   0,  64,   0,   0, 
139
0
          0,   0,   0,   0,   0,   0,   0,   0, 
140
0
          0,   0,   0,   0,   0,   0,   0,   0, 
141
0
         64,   0,   0,   0,   0,   0,   0,   0, 
142
0
          0,   0,   0,   0,   0,   0,   0,   0, 
143
0
        128, 128, 128, 128, 128, 128, 128, 128, 
144
0
        128, 128,   0,   0,   0,   0,   0,   0, 
145
0
          0,   0,   0,   0,   0,   0,   0,   0, 
146
0
          0,   0,   0,   0,   0,   0,   0,   0, 
147
0
          0,   0,   0,   0,   0,   0,   0,   0, 
148
0
          0,   0,   0,   0,   0,   0,   0,   0, 
149
0
          0,   0,   0,   0,   0,   0,   0,   0, 
150
0
          0,   0,   0,   0,   0,   0,   0,   0, 
151
0
          0,   0,   0,   0,   0,   0,   0,   0, 
152
0
          0,   0,   0,   0,   0,   0,   0,   0, 
153
0
          0,   0,   0,   0,   0,   0,   0,   0, 
154
0
          0,   0,   0,   0,   0,   0,   0,   0, 
155
0
          0,   0,   0,   0,   0,   0,   0,   0, 
156
0
          0,   0,   0,   0,   0,   0,   0,   0, 
157
0
          0,   0,   0,   0,   0,   0,   0,   0, 
158
0
          0,   0,   0,   0,   0,   0,   0,   0, 
159
0
          0,   0,   0,   0,   0,   0,   0,   0, 
160
0
          0,   0,   0,   0,   0,   0,   0,   0, 
161
0
          0,   0,   0,   0,   0,   0,   0,   0, 
162
0
          0,   0,   0,   0,   0,   0,   0,   0, 
163
0
          0,   0,   0,   0,   0,   0,   0,   0, 
164
0
          0,   0,   0,   0,   0,   0,   0,   0, 
165
0
          0,   0,   0,   0,   0,   0,   0,   0, 
166
0
          0,   0,   0,   0,   0,   0,   0,   0, 
167
0
          0,   0,   0,   0,   0,   0,   0,   0, 
168
0
          0,   0,   0,   0,   0,   0,   0,   0, 
169
0
      };
170
0
      yych = *YYCURSOR;
171
0
      if (yych <= ']') {
172
0
        if (yych <= '"') {
173
0
          if (yych <= '\f') {
174
0
            if (yych <= 0x08) {
175
0
              if (yych >= 0x01) goto yy5;
176
0
            } else {
177
0
              if (yych <= '\t') goto yy7;
178
0
              if (yych <= '\n') goto yy10;
179
0
              goto yy5;
180
0
            }
181
0
          } else {
182
0
            if (yych <= 0x1F) {
183
0
              if (yych <= '\r') goto yy12;
184
0
              goto yy5;
185
0
            } else {
186
0
              if (yych <= ' ') goto yy7;
187
0
              if (yych <= '!') goto yy13;
188
0
              goto yy15;
189
0
            }
190
0
          }
191
0
        } else {
192
0
          if (yych <= '0') {
193
0
            if (yych <= ',') {
194
0
              if (yych <= '+') goto yy13;
195
0
              goto yy17;
196
0
            } else {
197
0
              if (yych <= '-') goto yy19;
198
0
              if (yych <= '/') goto yy13;
199
0
              goto yy20;
200
0
            }
201
0
          } else {
202
0
            if (yych <= 'Z') {
203
0
              if (yych <= '9') goto yy22;
204
0
              if (yych <= ':') goto yy24;
205
0
              goto yy13;
206
0
            } else {
207
0
              if (yych <= '[') goto yy26;
208
0
              if (yych <= '\\') goto yy13;
209
0
              goto yy28;
210
0
            }
211
0
          }
212
0
        }
213
0
      } else {
214
0
        if (yych <= '}') {
215
0
          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
0
          } else {
224
0
            if (yych <= 'z') {
225
0
              if (yych <= 't') goto yy32;
226
0
              goto yy13;
227
0
            } else {
228
0
              if (yych <= '{') goto yy33;
229
0
              if (yych <= '|') goto yy13;
230
0
              goto yy35;
231
0
            }
232
0
          }
233
0
        } 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
0
      }
256
0
      ++YYCURSOR;
257
0
      {
258
0
    if (s->limit < s->cursor) {
259
0
      return PHP_JSON_T_EOI;
260
0
    } else {
261
0
      s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
262
0
      return PHP_JSON_T_ERROR;
263
0
    }
264
0
  }
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
0
  }
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
0
yy15:
300
0
      ++YYCURSOR;
301
0
      {
302
0
    PHP_JSON_TOKEN_LOCATION(last_column)++;
303
0
    s->str_start = s->cursor;
304
0
    s->str_esc = 0;
305
0
    s->utf8_invalid = 0;
306
0
    s->utf8_invalid_count = 0;
307
0
    PHP_JSON_CONDITION_SET_AND_GOTO(STR_P1);
308
0
  }
309
0
yy17:
310
0
      ++YYCURSOR;
311
0
      { 
312
0
    PHP_JSON_TOKEN_LOCATION(last_column)++;
313
0
    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
0
yy21:
331
0
      {
332
0
    bool bigint = 0, negative = s->token[0] == '-';
333
0
    size_t digits = PHP_JSON_TOKEN_LENGTH();
334
0
    PHP_JSON_TOKEN_LOCATION(last_column) += digits;
335
0
    digits -= negative;
336
0
    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
0
    if (!bigint) {
347
0
      ZVAL_LONG(&s->value, ZEND_STRTOL((char *) s->token, NULL, 10));
348
0
      return PHP_JSON_T_INT;
349
0
    } 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
0
  }
357
0
yy22:
358
0
      yyaccept = 0;
359
0
      yych = *(YYMARKER = ++YYCURSOR);
360
0
      if (yybm[0+yych] & 128) {
361
0
        goto yy22;
362
0
      }
363
0
      if (yych <= 'D') {
364
0
        if (yych == '.') goto yy46;
365
0
        goto yy21;
366
0
      } else {
367
0
        if (yych <= 'E') goto yy48;
368
0
        if (yych == 'e') goto yy48;
369
0
        goto yy21;
370
0
      }
371
0
yy24:
372
0
      ++YYCURSOR;
373
0
      { 
374
0
    PHP_JSON_TOKEN_LOCATION(last_column)++;
375
0
    return ':'; 
376
0
  }
377
0
yy26:
378
0
      ++YYCURSOR;
379
0
      { 
380
0
    PHP_JSON_TOKEN_LOCATION(last_column)++;
381
0
    return '['; 
382
0
  }
383
0
yy28:
384
0
      ++YYCURSOR;
385
0
      { 
386
0
    PHP_JSON_TOKEN_LOCATION(last_column)++;
387
0
    return ']'; 
388
0
  }
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
0
yy33:
405
0
      ++YYCURSOR;
406
0
      { 
407
0
    PHP_JSON_TOKEN_LOCATION(last_column)++;
408
0
    return '{'; 
409
0
  }
410
0
yy35:
411
0
      ++YYCURSOR;
412
0
      { 
413
0
    PHP_JSON_TOKEN_LOCATION(last_column)++;
414
0
    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
0
yyc_STR_P1:
581
0
    yych = *YYCURSOR;
582
0
    if (yych <= 0xDF) {
583
0
      if (yych <= '[') {
584
0
        if (yych <= 0x1F) goto yy72;
585
0
        if (yych == '"') goto yy76;
586
0
        goto yy74;
587
0
      } else {
588
0
        if (yych <= '\\') goto yy78;
589
0
        if (yych <= 0x7F) goto yy74;
590
0
        if (yych <= 0xC1) goto yy80;
591
0
        goto yy82;
592
0
      }
593
0
    } 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
0
  }
611
0
yy74:
612
0
    ++YYCURSOR;
613
0
    {
614
0
    PHP_JSON_TOKEN_LOCATION(last_column)++;
615
0
    PHP_JSON_CONDITION_GOTO(STR_P1);
616
0
  }
617
0
yy76:
618
0
    ++YYCURSOR;
619
0
    {
620
0
    PHP_JSON_TOKEN_LOCATION(last_column)++;
621
0
    zend_string *str;
622
0
    size_t len = (size_t)(s->cursor - s->str_start - s->str_esc - 1 + s->utf8_invalid_count);
623
0
    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
0
    str = zend_string_alloc(len, 0);
629
0
    ZSTR_VAL(str)[len] = '\0';
630
0
    ZVAL_STR(&s->value, str);
631
0
    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
0
    } else {
636
0
      memcpy(Z_STRVAL(s->value), s->str_start, len);
637
0
      PHP_JSON_CONDITION_SET(JS);
638
0
      return PHP_JSON_T_STRING;
639
0
    }
640
0
  }
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
}