
Contents of /Public_Parser_JSON2-0.8/json_string_utf8.c:
#line 1 "src/json_string_utf8.rl"
// vim:syntax=ragel
#define HEX2DEC(x) ((x) <= '9' ? (x) - '0' : ((x) < 'G') ? (x) - 'A' + 10 : (x) - 'a' + 10)
#line 92 "src/json_string_utf8.rl"
char *_parse_JSON_string_utf8(char *p, char *pe, struct parser_state *state) {
char *mark = 0;
struct string_builder s;
int cs;
p_wchar2 temp = 0;
p_wchar2 unicode = 0;
#line 17 "work/json_string_utf8.c"
static const int JSON_string_start = 1;
static const int JSON_string_first_final = 15;
static const int JSON_string_error = 0;
static const int JSON_string_en_main = 1;
#line 102 "src/json_string_utf8.rl"
if (!state->validate)
init_string_builder(&s, 0);
#line 30 "work/json_string_utf8.c"
{
cs = JSON_string_start;
}
#line 107 "src/json_string_utf8.rl"
#line 36 "work/json_string_utf8.c"
{
if ( p == pe )
goto _out;
switch ( cs )
{
case 1:
if ( (*p) == 34 )
goto st2;
goto st0;
st0:
goto _out0;
st2:
if ( ++p == pe )
goto _out2;
case 2:
switch( (*p) ) {
case 34: goto tr6;
case 92: goto tr7;
}
if ( (*p) < -32 ) {
if ( (*p) > -63 ) {
if ( -62 <= (*p) && (*p) <= -33 )
goto tr2;
} else
goto st0;
} else if ( (*p) > -17 ) {
if ( (*p) > -12 ) {
if ( -11 <= (*p) && (*p) <= -1 )
goto st0;
} else if ( (*p) >= -16 )
goto tr4;
} else
goto tr3;
goto tr5;
tr2:
#line 36 "src/json_string_utf8.rl"
{
mark = p;
}
#line 42 "src/json_string_utf8.rl"
{
if (p - mark > 0) {
if (!state->validate)
string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
}
}
#line 49 "src/json_string_utf8.rl"
{ unicode = ((int)((*p) & (0xdf-0xc0))) << 6; }
goto st3;
tr9:
#line 42 "src/json_string_utf8.rl"
{
if (p - mark > 0) {
if (!state->validate)
string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
}
}
#line 49 "src/json_string_utf8.rl"
{ unicode = ((int)((*p) & (0xdf-0xc0))) << 6; }
goto st3;
st3:
if ( ++p == pe )
goto _out3;
case 3:
#line 101 "work/json_string_utf8.c"
if ( (*p) <= -65 )
goto tr8;
goto st0;
tr5:
#line 36 "src/json_string_utf8.rl"
{
mark = p;
}
goto st4;
tr8:
#line 50 "src/json_string_utf8.rl"
{ unicode |= (int)((*p) & (0xbf-0x80)); }
#line 72 "src/json_string_utf8.rl"
{
if (!state->validate) {
string_builder_putchar(&s, unicode);
}
}
#line 40 "src/json_string_utf8.rl"
{ mark = p + 1; }
goto st4;
tr16:
#line 54 "src/json_string_utf8.rl"
{
unicode |= (int)((*p) & (0xbf-0x80));
if ((unicode < 0x0800 || unicode > 0xd7ff) && (unicode < 0xe000 || unicode > 0xffff)) {
goto failure;
}
}
#line 72 "src/json_string_utf8.rl"
{
if (!state->validate) {
string_builder_putchar(&s, unicode);
}
}
#line 40 "src/json_string_utf8.rl"
{ mark = p + 1; }
goto st4;
tr19:
#line 65 "src/json_string_utf8.rl"
{
unicode |= (int)((*p) & (0xbf-0x80));
if (unicode < 0x010000 || unicode > 0x10ffff) {
goto failure;
}
}
#line 72 "src/json_string_utf8.rl"
{
if (!state->validate) {
string_builder_putchar(&s, unicode);
}
}
#line 40 "src/json_string_utf8.rl"
{ mark = p + 1; }
goto st4;
tr20:
#line 24 "src/json_string_utf8.rl"
{
if (!state->validate) switch((*p)) {
case '"':
case '\\': string_builder_putchar(&s, (*p)); break;
case 'b': string_builder_putchar(&s, '\b'); break;
case 'f': string_builder_putchar(&s, '\f'); break;
case 'n': string_builder_putchar(&s, '\n'); break;
case 'r': string_builder_putchar(&s, '\r'); break;
case 't': string_builder_putchar(&s, '\t'); break;
}
}
#line 40 "src/json_string_utf8.rl"
{ mark = p + 1; }
goto st4;
tr25:
#line 12 "src/json_string_utf8.rl"
{
temp *= 16;
temp += HEX2DEC((*p));
}
#line 17 "src/json_string_utf8.rl"
{
if (IS_NUNICODE(temp)) {
goto failure;
}
if (!state->validate) string_builder_putchar(&s, temp);
}
#line 40 "src/json_string_utf8.rl"
{ mark = p + 1; }
goto st4;
st4:
if ( ++p == pe )
goto _out4;
case 4:
#line 193 "work/json_string_utf8.c"
switch( (*p) ) {
case 34: goto tr13;
case 92: goto tr14;
}
if ( (*p) < -32 ) {
if ( (*p) > -63 ) {
if ( -62 <= (*p) && (*p) <= -33 )
goto tr9;
} else
goto st0;
} else if ( (*p) > -17 ) {
if ( (*p) > -12 ) {
if ( -11 <= (*p) && (*p) <= -1 )
goto st0;
} else if ( (*p) >= -16 )
goto tr11;
} else
goto tr10;
goto st4;
tr3:
#line 36 "src/json_string_utf8.rl"
{
mark = p;
}
#line 42 "src/json_string_utf8.rl"
{
if (p - mark > 0) {
if (!state->validate)
string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
}
}
#line 52 "src/json_string_utf8.rl"
{ unicode = ((int)((*p) & 0x0f)) << 12; }
goto st5;
tr10:
#line 42 "src/json_string_utf8.rl"
{
if (p - mark > 0) {
if (!state->validate)
string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
}
}
#line 52 "src/json_string_utf8.rl"
{ unicode = ((int)((*p) & 0x0f)) << 12; }
goto st5;
st5:
if ( ++p == pe )
goto _out5;
case 5:
#line 243 "work/json_string_utf8.c"
if ( (*p) <= -65 )
goto tr15;
goto st0;
tr15:
#line 53 "src/json_string_utf8.rl"
{ unicode |= ((int)((*p) & (0xbf-0x80))) << 6; }
goto st6;
st6:
if ( ++p == pe )
goto _out6;
case 6:
#line 255 "work/json_string_utf8.c"
if ( (*p) <= -65 )
goto tr16;
goto st0;
tr4:
#line 36 "src/json_string_utf8.rl"
{
mark = p;
}
#line 42 "src/json_string_utf8.rl"
{
if (p - mark > 0) {
if (!state->validate)
string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
}
}
#line 61 "src/json_string_utf8.rl"
{ unicode = ((int)((*p) & 0x07)) << 18; }
goto st7;
tr11:
#line 42 "src/json_string_utf8.rl"
{
if (p - mark > 0) {
if (!state->validate)
string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
}
}
#line 61 "src/json_string_utf8.rl"
{ unicode = ((int)((*p) & 0x07)) << 18; }
goto st7;
st7:
if ( ++p == pe )
goto _out7;
case 7:
#line 289 "work/json_string_utf8.c"
if ( (*p) <= -65 )
goto tr17;
goto st0;
tr17:
#line 62 "src/json_string_utf8.rl"
{ unicode |= ((int)((*p) & (0xbf-0x80))) << 12; }
goto st8;
st8:
if ( ++p == pe )
goto _out8;
case 8:
#line 301 "work/json_string_utf8.c"
if ( (*p) <= -65 )
goto tr18;
goto st0;
tr18:
#line 53 "src/json_string_utf8.rl"
{ unicode |= ((int)((*p) & (0xbf-0x80))) << 6; }
goto st9;
st9:
if ( ++p == pe )
goto _out9;
case 9:
#line 313 "work/json_string_utf8.c"
if ( (*p) <= -65 )
goto tr19;
goto st0;
tr6:
#line 36 "src/json_string_utf8.rl"
{
mark = p;
}
#line 42 "src/json_string_utf8.rl"
{
if (p - mark > 0) {
if (!state->validate)
string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
}
}
goto st15;
tr13:
#line 42 "src/json_string_utf8.rl"
{
if (p - mark > 0) {
if (!state->validate)
string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
}
}
goto st15;
st15:
if ( ++p == pe )
goto _out15;
case 15:
#line 91 "src/json_string_utf8.rl"
{ goto _out15; }
#line 345 "work/json_string_utf8.c"
goto st0;
tr7:
#line 36 "src/json_string_utf8.rl"
{
mark = p;
}
#line 42 "src/json_string_utf8.rl"
{
if (p - mark > 0) {
if (!state->validate)
string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
}
}
goto st10;
tr14:
#line 42 "src/json_string_utf8.rl"
{
if (p - mark > 0) {
if (!state->validate)
string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
}
}
goto st10;
st10:
if ( ++p == pe )
goto _out10;
case 10:
#line 373 "work/json_string_utf8.c"
switch( (*p) ) {
case 34: goto tr20;
case 47: goto tr20;
case 92: goto tr20;
case 98: goto tr20;
case 102: goto tr20;
case 110: goto tr20;
case 114: goto tr20;
case 116: goto tr20;
case 117: goto st11;
}
goto st0;
st11:
if ( ++p == pe )
goto _out11;
case 11:
if ( (*p) < 65 ) {
if ( 48 <= (*p) && (*p) <= 57 )
goto tr22;
} else if ( (*p) > 70 ) {
if ( 97 <= (*p) && (*p) <= 102 )
goto tr22;
} else
goto tr22;
goto st0;
tr22:
#line 8 "src/json_string_utf8.rl"
{
temp = HEX2DEC((*p));
}
goto st12;
st12:
if ( ++p == pe )
goto _out12;
case 12:
#line 409 "work/json_string_utf8.c"
if ( (*p) < 65 ) {
if ( 48 <= (*p) && (*p) <= 57 )
goto tr23;
} else if ( (*p) > 70 ) {
if ( 97 <= (*p) && (*p) <= 102 )
goto tr23;
} else
goto tr23;
goto st0;
tr23:
#line 12 "src/json_string_utf8.rl"
{
temp *= 16;
temp += HEX2DEC((*p));
}
goto st13;
st13:
if ( ++p == pe )
goto _out13;
case 13:
#line 430 "work/json_string_utf8.c"
if ( (*p) < 65 ) {
if ( 48 <= (*p) && (*p) <= 57 )
goto tr24;
} else if ( (*p) > 70 ) {
if ( 97 <= (*p) && (*p) <= 102 )
goto tr24;
} else
goto tr24;
goto st0;
tr24:
#line 12 "src/json_string_utf8.rl"
{
temp *= 16;
temp += HEX2DEC((*p));
}
goto st14;
st14:
if ( ++p == pe )
goto _out14;
case 14:
#line 451 "work/json_string_utf8.c"
if ( (*p) < 65 ) {
if ( 48 <= (*p) && (*p) <= 57 )
goto tr25;
} else if ( (*p) > 70 ) {
if ( 97 <= (*p) && (*p) <= 102 )
goto tr25;
} else
goto tr25;
goto st0;
}
_out0: cs = 0; goto _out;
_out2: cs = 2; goto _out;
_out3: cs = 3; goto _out;
_out4: cs = 4; goto _out;
_out5: cs = 5; goto _out;
_out6: cs = 6; goto _out;
_out7: cs = 7; goto _out;
_out8: cs = 8; goto _out;
_out9: cs = 9; goto _out;
_out15: cs = 15; goto _out;
_out10: cs = 10; goto _out;
_out11: cs = 11; goto _out;
_out12: cs = 12; goto _out;
_out13: cs = 13; goto _out;
_out14: cs = 14; goto _out;
_out: {}
}
#line 108 "src/json_string_utf8.rl"
if (cs >= JSON_string_first_final) {
if (!state->validate)
push_string(finish_string_builder(&s));
return p;
}
failure:
if (!state->validate) {
free_string_builder(&s);
}
push_int((int)p);
return NULL;
}
#undef HEX2DEC