From e43b856ed0f2fa3cb03a1335c9dc311b572e88e2 Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Mon, 16 Apr 2012 15:42:24 +1000 Subject: skin_engine: rework the parser to be closer to the langauge grammar. The parser was unconditionally scanning things which it thought were conditional/enum lists (or tag arg lists) when they couldn't possibly be (i.e < inside a param which should be valid). This change fixes it (i.e %?and(%if(%pv, <, -50), %if(%mp, > 1)) is perfectly valid now. This *may* break your exsiting skins if you were using %if with < or > Change-Id: Ibcb42bc6bb78908f79de024b61276b91b1ce02a0 Reviewed-on: http://gerrit.rockbox.org/214 Reviewed-by: Thomas Martitz --- lib/skin_parser/skin_parser.c | 65 ++++--------------------------------------- 1 file changed, 5 insertions(+), 60 deletions(-) (limited to 'lib/skin_parser/skin_parser.c') diff --git a/lib/skin_parser/skin_parser.c b/lib/skin_parser/skin_parser.c index a81bcded34..44a1c03245 100644 --- a/lib/skin_parser/skin_parser.c +++ b/lib/skin_parser/skin_parser.c @@ -182,26 +182,12 @@ static struct skin_element* skin_parse_viewport(const char** document) } else if(*cursor == TAGSYM) { - /* A ';' directly after a '%' doesn't count */ - cursor ++; - - if(*cursor == '\0') - break; - - cursor++; + skip_tag(&cursor); } else if(*cursor == COMMENTSYM) { skip_comment(&cursor); } - else if(*cursor == ARGLISTOPENSYM) - { - skip_arglist(&cursor); - } - else if(*cursor == ENUMLISTOPENSYM) - { - skip_enumlist(&cursor); - } else { /* Advancing the cursor as normal */ @@ -445,20 +431,9 @@ static struct skin_element* skin_parse_sublines_optional(const char** document, { skip_comment(&cursor); } - else if(*cursor == ENUMLISTOPENSYM) - { - skip_enumlist(&cursor); - } - else if(*cursor == ARGLISTOPENSYM) - { - skip_arglist(&cursor); - } else if(*cursor == TAGSYM) { - cursor++; - if(*cursor == '\0' || *cursor == '\n') - break; - cursor++; + skip_tag(&cursor); } else if(*cursor == MULTILINESYM) { @@ -595,19 +570,12 @@ static int skin_parse_tag(struct skin_element* element, const char** document) /* Skipping over escaped characters */ if(*cursor == TAGSYM) { - cursor++; - if(*cursor == '\0') - break; - cursor++; + skip_tag(&cursor); } else if(*cursor == COMMENTSYM) { skip_comment(&cursor); } - else if(*cursor == ARGLISTOPENSYM) - { - skip_arglist(&cursor); - } else if(*cursor == ARGLISTSEPARATESYM) { num_args++; @@ -974,18 +942,9 @@ static int skin_parse_conditional(struct skin_element* element, const char** doc { skip_comment(&cursor); } - else if(*cursor == ENUMLISTOPENSYM) - { - if (*cursor == '\n') - cursor++; - skip_enumlist(&cursor); - } else if(*cursor == TAGSYM) { - cursor++; - if(*cursor == '\0' || *cursor == '\n') - break; - cursor++; + skip_tag(&cursor); } else if(*cursor == ENUMLISTSEPARATESYM) { @@ -1139,21 +1098,7 @@ static struct skin_element* skin_parse_code_as_arg(const char** document) } else if(*cursor == TAGSYM) { - /* A ';' directly after a '%' doesn't count */ - cursor ++; - - if(*cursor == '\0') - break; - - cursor++; - } - else if(*cursor == ARGLISTOPENSYM) - { - skip_arglist(&cursor); - } - else if(*cursor == ENUMLISTOPENSYM) - { - skip_enumlist(&cursor); + skip_tag(&cursor); } else { -- cgit v1.2.3