Home modules.gotpike.org
Username: Password: [Create Account]
[Forgot Password?]

Modules

ADT
Database
GTK2
GUI
IP
PiJAX
Public
Sql
Stdio
Subversion
System
Tools
Xosd
lua
v4l2
wx

Recent Changes

Public.Parser.XML2 1.50
Public.ZeroMQ 1.1
Public.Template.Mustache 1.0
Public.Protocols.XMPP 1.4
Sql.Provider.jdbc 1.0

Popular Downloads

Public.Parser.JSON2 1.0
Public.Parser.JSON 0.2
GTK2 2.23
Public.Web.FCGI 1.8
Public.Parser.XML2 1.48


Module Information
Public.Parser.JSON2
Viewing contents of Public_Parser_JSON2-0.10/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)

#include "global.h"

#line 95 "src/json_string_utf8.rl"


static 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 19 "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 105 "src/json_string_utf8.rl"

    if (!state->validate)
		init_string_builder(&s, 0);

    
#line 32 "work/json_string_utf8.c"
	{
	cs = JSON_string_start;
	}
#line 110 "src/json_string_utf8.rl"
    
#line 38 "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 39 "src/json_string_utf8.rl"
	{
		mark = p;
    }
#line 45 "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 = ((p_wchar2)((*p) & (0xdf-0xc0))) << 6; }
	goto st3;
tr9:
#line 45 "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 = ((p_wchar2)((*p) & (0xdf-0xc0))) << 6; }
	goto st3;
st3:
	if ( ++p == pe )
		goto _out3;
case 3:
#line 103 "work/json_string_utf8.c"
	if ( (*p) <= -65 )
		goto tr8;
	goto st0;
tr5:
#line 39 "src/json_string_utf8.rl"
	{
		mark = p;
    }
	goto st4;
tr8:
#line 53 "src/json_string_utf8.rl"
	{ unicode |= (p_wchar2)((*p) & (0xbf-0x80)); }
#line 75 "src/json_string_utf8.rl"
	{
		if (!state->validate) { 
			string_builder_putchar(&s, unicode); 
		}
    }
#line 43 "src/json_string_utf8.rl"
	{ mark = p + 1; }
	goto st4;
tr16:
#line 57 "src/json_string_utf8.rl"
	{ 
	unicode |= (p_wchar2)((*p) & (0xbf-0x80));
		if ((unicode < 0x0800 || unicode > 0xd7ff) && (unicode < 0xe000 || unicode > 0xffff)) {
			goto failure;	
		}
    }
#line 75 "src/json_string_utf8.rl"
	{
		if (!state->validate) { 
			string_builder_putchar(&s, unicode); 
		}
    }
#line 43 "src/json_string_utf8.rl"
	{ mark = p + 1; }
	goto st4;
tr19:
#line 68 "src/json_string_utf8.rl"
	{ 
		unicode |= (p_wchar2)((*p) & (0xbf-0x80));
		if (unicode < 0x010000 || unicode > 0x10ffff) {
			goto failure;
		}
    }
#line 75 "src/json_string_utf8.rl"
	{
		if (!state->validate) { 
			string_builder_putchar(&s, unicode); 
		}
    }
#line 43 "src/json_string_utf8.rl"
	{ mark = p + 1; }
	goto st4;
tr20:
#line 26 "src/json_string_utf8.rl"
	{
		if (!state->validate) switch((*p)) {
			case '"':
			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 43 "src/json_string_utf8.rl"
	{ mark = p + 1; }
	goto st4;
tr25:
#line 14 "src/json_string_utf8.rl"
	{
		temp *= 16;
		temp += HEX2DEC((*p));
    }
#line 19 "src/json_string_utf8.rl"
	{
		if (IS_NUNICODE(temp)) {
			goto failure;	
		}
		if (!state->validate) string_builder_putchar(&s, temp);
    }
#line 43 "src/json_string_utf8.rl"
	{ mark = p + 1; }
	goto st4;
st4:
	if ( ++p == pe )
		goto _out4;
case 4:
#line 196 "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 39 "src/json_string_utf8.rl"
	{
		mark = p;
    }
#line 45 "src/json_string_utf8.rl"
	{
		if (p - mark > 0) {
			if (!state->validate)
				string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
        }
    }
#line 55 "src/json_string_utf8.rl"
	{ unicode = ((p_wchar2)((*p) & 0x0f)) << 12; }
	goto st5;
tr10:
#line 45 "src/json_string_utf8.rl"
	{
		if (p - mark > 0) {
			if (!state->validate)
				string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
        }
    }
#line 55 "src/json_string_utf8.rl"
	{ unicode = ((p_wchar2)((*p) & 0x0f)) << 12; }
	goto st5;
st5:
	if ( ++p == pe )
		goto _out5;
case 5:
#line 246 "work/json_string_utf8.c"
	if ( (*p) <= -65 )
		goto tr15;
	goto st0;
tr15:
#line 56 "src/json_string_utf8.rl"
	{ unicode |= ((p_wchar2)((*p) & (0xbf-0x80))) << 6; }
	goto st6;
st6:
	if ( ++p == pe )
		goto _out6;
case 6:
#line 258 "work/json_string_utf8.c"
	if ( (*p) <= -65 )
		goto tr16;
	goto st0;
tr4:
#line 39 "src/json_string_utf8.rl"
	{
		mark = p;
    }
#line 45 "src/json_string_utf8.rl"
	{
		if (p - mark > 0) {
			if (!state->validate)
				string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
        }
    }
#line 64 "src/json_string_utf8.rl"
	{ unicode = ((p_wchar2)((*p) & 0x07)) << 18; }
	goto st7;
tr11:
#line 45 "src/json_string_utf8.rl"
	{
		if (p - mark > 0) {
			if (!state->validate)
				string_builder_binary_strcat(&s, mark, (ptrdiff_t)(p - mark));
        }
    }
#line 64 "src/json_string_utf8.rl"
	{ unicode = ((p_wchar2)((*p) & 0x07)) << 18; }
	goto st7;
st7:
	if ( ++p == pe )
		goto _out7;
case 7:
#line 292 "work/json_string_utf8.c"
	if ( (*p) <= -65 )
		goto tr17;
	goto st0;
tr17:
#line 65 "src/json_string_utf8.rl"
	{ unicode |= ((p_wchar2)((*p) & (0xbf-0x80))) << 12; }
	goto st8;
st8:
	if ( ++p == pe )
		goto _out8;
case 8:
#line 304 "work/json_string_utf8.c"
	if ( (*p) <= -65 )
		goto tr18;
	goto st0;
tr18:
#line 56 "src/json_string_utf8.rl"
	{ unicode |= ((p_wchar2)((*p) & (0xbf-0x80))) << 6; }
	goto st9;
st9:
	if ( ++p == pe )
		goto _out9;
case 9:
#line 316 "work/json_string_utf8.c"
	if ( (*p) <= -65 )
		goto tr19;
	goto st0;
tr6:
#line 39 "src/json_string_utf8.rl"
	{
		mark = p;
    }
#line 45 "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 45 "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 94 "src/json_string_utf8.rl"
	{ goto _out15; }
#line 348 "work/json_string_utf8.c"
	goto st0;
tr7:
#line 39 "src/json_string_utf8.rl"
	{
		mark = p;
    }
#line 45 "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 45 "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 376 "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 10 "src/json_string_utf8.rl"
	{
		temp = HEX2DEC((*p));
    }
	goto st12;
st12:
	if ( ++p == pe )
		goto _out12;
case 12:
#line 412 "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 14 "src/json_string_utf8.rl"
	{
		temp *= 16;
		temp += HEX2DEC((*p));
    }
	goto st13;
st13:
	if ( ++p == pe )
		goto _out13;
case 13:
#line 433 "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 14 "src/json_string_utf8.rl"
	{
		temp *= 16;
		temp += HEX2DEC((*p));
    }
	goto st14;
st14:
	if ( ++p == pe )
		goto _out14;
case 14:
#line 454 "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 111 "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_TYPE)p);
    return NULL;
}

#undef HEX2DEC


gotpike.org | Copyright © 2004 - 2019 | Pike is a trademark of Department of Computer and Information Science, Linköping University