diff options
author | Chris Fallin <cfallin@c1f.net> | 2014-12-11 18:58:04 -0800 |
---|---|---|
committer | Chris Fallin <cfallin@c1f.net> | 2014-12-12 14:49:12 -0800 |
commit | b3f6daf83d8adf0040a1bf9401342c811502f690 (patch) | |
tree | 2b51257e4b9cebfc3640d98cda45f9b8be36fdb2 /upb/json/parser.c | |
parent | 56913be6bb57f81dbbf7baf9cc9a0a2cd1a36493 (diff) |
Amalgamated distribution (upb.c/upb.h) tool.
There are a number of tweaks to get this to work:
- The #include dependence graph wasn't quite complete, and I had to add
a few #includes to get the tool to work.
- I had to change a number of symbol names to avoid conflicts between
'static' definitions in different .c files. This could be avoided if
the tool were smart enough to rename static symbols to have unique
prefixes instead, but (i) this requires semantic understanding of C,
and (ii) the macro-defined static functions (e.g., handlers for
primitive types in several places) would probably trip this up.
Verified that the resulting upb.h/upb.c compiles and doesn't have any
unresolved references.
Diffstat (limited to 'upb/json/parser.c')
-rw-r--r-- | upb/json/parser.c | 99 |
1 files changed, 50 insertions, 49 deletions
diff --git a/upb/json/parser.c b/upb/json/parser.c index 78fc6c0..fe2b586 100644 --- a/upb/json/parser.c +++ b/upb/json/parser.c @@ -33,7 +33,7 @@ #include "upb/json/parser.h" -#define CHECK_RETURN(x) if (!(x)) return false +#define PARSER_CHECK_RETURN(x) if (!(x)) return false static upb_selector_t getsel_for_handlertype(upb_json_parser *p, upb_handlertype_t type) { @@ -43,7 +43,7 @@ static upb_selector_t getsel_for_handlertype(upb_json_parser *p, return sel; } -static upb_selector_t getsel(upb_json_parser *p) { +static upb_selector_t parser_getsel(upb_json_parser *p) { return getsel_for_handlertype( p, upb_handlers_getprimitivehandlertype(p->top->f)); } @@ -153,7 +153,7 @@ static void end_array(upb_json_parser *p) { static void clear_member(upb_json_parser *p) { p->top->f = NULL; } -static bool putbool(upb_json_parser *p, bool val) { +static bool parser_putbool(upb_json_parser *p, bool val) { if (upb_fielddef_type(p->top->f) != UPB_TYPE_BOOL) { upb_status_seterrf(p->status, "Boolean value specified for non-bool field: %s", @@ -161,7 +161,7 @@ static bool putbool(upb_json_parser *p, bool val) { return false; } - bool ok = upb_sink_putbool(&p->top->sink, getsel(p), val); + bool ok = upb_sink_putbool(&p->top->sink, parser_getsel(p), val); UPB_ASSERT_VAR(ok, ok); return true; } @@ -297,7 +297,8 @@ static bool end_text(upb_json_parser *p, const char *ptr, bool is_num) { // This is a string field (as opposed to a member name). upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_STRING); if (upb_fielddef_type(p->top->f) == UPB_TYPE_BYTES) { - CHECK_RETURN(base64_push(p, sel, p->accumulated, p->accumulated_len)); + PARSER_CHECK_RETURN(base64_push(p, sel, p->accumulated, + p->accumulated_len)); } else { upb_sink_putstring(&p->top->sink, sel, p->accumulated, p->accumulated_len, NULL); } @@ -313,7 +314,7 @@ static bool end_text(upb_json_parser *p, const char *ptr, bool is_num) { int32_t int_val = 0; if (upb_enumdef_ntoi(enumdef, p->accumulated, p->accumulated_len, &int_val)) { - upb_selector_t sel = getsel(p); + upb_selector_t sel = parser_getsel(p); upb_sink_putint32(&p->top->sink, sel, int_val); } else { upb_status_seterrmsg(p->status, "Enum value name unknown"); @@ -379,7 +380,7 @@ static void end_number(upb_json_parser *p, const char *ptr) { if (val > INT32_MAX || val < INT32_MIN || errno == ERANGE || end != myend) assert(false); else - upb_sink_putint32(&p->top->sink, getsel(p), val); + upb_sink_putint32(&p->top->sink, parser_getsel(p), val); break; } case UPB_TYPE_INT64: { @@ -387,7 +388,7 @@ static void end_number(upb_json_parser *p, const char *ptr) { if (val > INT64_MAX || val < INT64_MIN || errno == ERANGE || end != myend) assert(false); else - upb_sink_putint64(&p->top->sink, getsel(p), val); + upb_sink_putint64(&p->top->sink, parser_getsel(p), val); break; } case UPB_TYPE_UINT32: { @@ -395,7 +396,7 @@ static void end_number(upb_json_parser *p, const char *ptr) { if (val > UINT32_MAX || errno == ERANGE || end != myend) assert(false); else - upb_sink_putuint32(&p->top->sink, getsel(p), val); + upb_sink_putuint32(&p->top->sink, parser_getsel(p), val); break; } case UPB_TYPE_UINT64: { @@ -403,7 +404,7 @@ static void end_number(upb_json_parser *p, const char *ptr) { if (val > UINT64_MAX || errno == ERANGE || end != myend) assert(false); else - upb_sink_putuint64(&p->top->sink, getsel(p), val); + upb_sink_putuint64(&p->top->sink, parser_getsel(p), val); break; } case UPB_TYPE_DOUBLE: { @@ -411,7 +412,7 @@ static void end_number(upb_json_parser *p, const char *ptr) { if (errno == ERANGE || end != myend) assert(false); else - upb_sink_putdouble(&p->top->sink, getsel(p), val); + upb_sink_putdouble(&p->top->sink, parser_getsel(p), val); break; } case UPB_TYPE_FLOAT: { @@ -419,7 +420,7 @@ static void end_number(upb_json_parser *p, const char *ptr) { if (errno == ERANGE || end != myend) assert(false); else - upb_sink_putfloat(&p->top->sink, getsel(p), val); + upb_sink_putfloat(&p->top->sink, parser_getsel(p), val); break; } default: @@ -505,11 +506,11 @@ static void hex(upb_json_parser *p, const char *end) { // What follows is the Ragel parser itself. The language is specified in Ragel // and the actions call our C functions above. -#line 595 "upb/json/parser.rl" +#line 596 "upb/json/parser.rl" -#line 513 "upb/json/parser.c" +#line 514 "upb/json/parser.c" static const char _json_actions[] = { 0, 1, 0, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, @@ -662,7 +663,7 @@ static const int json_en_value_machine = 27; static const int json_en_main = 1; -#line 598 "upb/json/parser.rl" +#line 599 "upb/json/parser.rl" size_t parse(void *closure, const void *hd, const char *buf, size_t size, const upb_bufhandle *handle) { @@ -679,7 +680,7 @@ size_t parse(void *closure, const void *hd, const char *buf, size_t size, const char *pe = buf + size; -#line 683 "upb/json/parser.c" +#line 684 "upb/json/parser.c" { int _klen; unsigned int _trans; @@ -754,114 +755,114 @@ _match: switch ( *_acts++ ) { case 0: -#line 516 "upb/json/parser.rl" +#line 517 "upb/json/parser.rl" { p--; {cs = stack[--top]; goto _again;} } break; case 1: -#line 517 "upb/json/parser.rl" +#line 518 "upb/json/parser.rl" { p--; {stack[top++] = cs; cs = 10; goto _again;} } break; case 2: -#line 521 "upb/json/parser.rl" +#line 522 "upb/json/parser.rl" { start_text(parser, p); } break; case 3: -#line 522 "upb/json/parser.rl" +#line 523 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_text(parser, p, false)); } break; case 4: -#line 528 "upb/json/parser.rl" +#line 529 "upb/json/parser.rl" { start_hex(parser, p); } break; case 5: -#line 529 "upb/json/parser.rl" +#line 530 "upb/json/parser.rl" { hex(parser, p); } break; case 6: -#line 535 "upb/json/parser.rl" +#line 536 "upb/json/parser.rl" { escape(parser, p); } break; case 7: -#line 538 "upb/json/parser.rl" +#line 539 "upb/json/parser.rl" { {cs = stack[--top]; goto _again;} } break; case 8: -#line 539 "upb/json/parser.rl" +#line 540 "upb/json/parser.rl" { {stack[top++] = cs; cs = 19; goto _again;} } break; case 9: -#line 541 "upb/json/parser.rl" +#line 542 "upb/json/parser.rl" { p--; {stack[top++] = cs; cs = 27; goto _again;} } break; case 10: -#line 546 "upb/json/parser.rl" +#line 547 "upb/json/parser.rl" { start_member(parser); } break; case 11: -#line 547 "upb/json/parser.rl" +#line 548 "upb/json/parser.rl" { CHECK_RETURN_TOP(end_member(parser)); } break; case 12: -#line 550 "upb/json/parser.rl" +#line 551 "upb/json/parser.rl" { clear_member(parser); } break; case 13: -#line 556 "upb/json/parser.rl" +#line 557 "upb/json/parser.rl" { start_object(parser); } break; case 14: -#line 559 "upb/json/parser.rl" +#line 560 "upb/json/parser.rl" { end_object(parser); } break; case 15: -#line 565 "upb/json/parser.rl" +#line 566 "upb/json/parser.rl" { CHECK_RETURN_TOP(start_array(parser)); } break; case 16: -#line 569 "upb/json/parser.rl" +#line 570 "upb/json/parser.rl" { end_array(parser); } break; case 17: -#line 574 "upb/json/parser.rl" +#line 575 "upb/json/parser.rl" { start_number(parser, p); } break; case 18: -#line 575 "upb/json/parser.rl" +#line 576 "upb/json/parser.rl" { end_number(parser, p); } break; case 19: -#line 577 "upb/json/parser.rl" +#line 578 "upb/json/parser.rl" { CHECK_RETURN_TOP(start_stringval(parser)); } break; case 20: -#line 578 "upb/json/parser.rl" +#line 579 "upb/json/parser.rl" { end_stringval(parser); } break; case 21: -#line 580 "upb/json/parser.rl" - { CHECK_RETURN_TOP(putbool(parser, true)); } +#line 581 "upb/json/parser.rl" + { CHECK_RETURN_TOP(parser_putbool(parser, true)); } break; case 22: -#line 582 "upb/json/parser.rl" - { CHECK_RETURN_TOP(putbool(parser, false)); } +#line 583 "upb/json/parser.rl" + { CHECK_RETURN_TOP(parser_putbool(parser, false)); } break; case 23: -#line 584 "upb/json/parser.rl" +#line 585 "upb/json/parser.rl" { /* null value */ } break; case 24: -#line 586 "upb/json/parser.rl" +#line 587 "upb/json/parser.rl" { CHECK_RETURN_TOP(start_subobject(parser)); } break; case 25: -#line 587 "upb/json/parser.rl" +#line 588 "upb/json/parser.rl" { end_subobject(parser); } break; case 26: -#line 592 "upb/json/parser.rl" +#line 593 "upb/json/parser.rl" { p--; {cs = stack[--top]; goto _again;} } break; -#line 865 "upb/json/parser.c" +#line 866 "upb/json/parser.c" } } @@ -874,7 +875,7 @@ _again: _out: {} } -#line 614 "upb/json/parser.rl" +#line 615 "upb/json/parser.rl" if (p != pe) { upb_status_seterrf(parser->status, "Parse error at %s\n", p); @@ -915,13 +916,13 @@ void upb_json_parser_reset(upb_json_parser *p) { int top; // Emit Ragel initialization of the parser. -#line 919 "upb/json/parser.c" +#line 920 "upb/json/parser.c" { cs = json_start; top = 0; } -#line 654 "upb/json/parser.rl" +#line 655 "upb/json/parser.rl" p->current_state = cs; p->parser_top = top; p->text_begin = NULL; |