Coverage Report

Created: 2025-12-14 06:05

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