Coverage Report

Created: 2026-01-18 06:46

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