/* * call-seq: parse() * * Parses the current JSON text _source_ and returns the complete data * structure as a result. */ static VALUE cParser_parse(VALUE self) { char *p, *pe; int cs = EVIL; VALUE result = Qnil; GET_STRUCT; #line 1524 "parser.c" { cs = JSON_start; } #line 548 "parser.rl" p = json->source; pe = p + json->len; #line 1532 "parser.c" { if ( p == pe ) goto _out; switch ( cs ) { st1: if ( ++p == pe ) goto _out1; case 1: switch( (*p) ) { case 13: goto st1; case 32: goto st1; case 47: goto st2; case 91: goto tr3; case 123: goto tr4; } if ( 9 <= (*p) && (*p) <= 10 ) goto st1; goto st0; st0: goto _out0; st2: if ( ++p == pe ) goto _out2; case 2: switch( (*p) ) { case 42: goto st3; case 47: goto st5; } goto st0; st3: if ( ++p == pe ) goto _out3; case 3: if ( (*p) == 42 ) goto st4; goto st3; st4: if ( ++p == pe ) goto _out4; case 4: switch( (*p) ) { case 42: goto st4; case 47: goto st1; } goto st3; st5: if ( ++p == pe ) goto _out5; case 5: if ( (*p) == 10 ) goto st1; goto st5; tr3: #line 434 "parser.rl" { char *np; json->current_nesting = 1; np = JSON_parse_array(json, p, pe, &result); if (np == NULL) goto _out10; else {p = (( np))-1;} } goto st10; tr4: #line 427 "parser.rl" { char *np; json->current_nesting = 1; np = JSON_parse_object(json, p, pe, &result); if (np == NULL) goto _out10; else {p = (( np))-1;} } goto st10; st10: if ( ++p == pe ) goto _out10; case 10: #line 1608 "parser.c" switch( (*p) ) { case 13: goto st10; case 32: goto st10; case 47: goto st6; } if ( 9 <= (*p) && (*p) <= 10 ) goto st10; goto st0; st6: if ( ++p == pe ) goto _out6; case 6: switch( (*p) ) { case 42: goto st7; case 47: goto st9; } goto st0; st7: if ( ++p == pe ) goto _out7; case 7: if ( (*p) == 42 ) goto st8; goto st7; st8: if ( ++p == pe ) goto _out8; case 8: switch( (*p) ) { case 42: goto st8; case 47: goto st10; } goto st7; st9: if ( ++p == pe ) goto _out9; case 9: if ( (*p) == 10 ) goto st10; goto st9; } _out1: cs = 1; goto _out; _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; _out10: cs = 10; goto _out; _out6: cs = 6; goto _out; _out7: cs = 7; goto _out; _out8: cs = 8; goto _out; _out9: cs = 9; goto _out; _out: {} } #line 551 "parser.rl" if (cs >= JSON_first_final && p == pe) { return result; } else { rb_raise(eParserError, "unexpected token at '%s'", p); } }