1
0
Fork 0
forked from len0rd/rockbox

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, >i, 1))
is perfectly valid now.

This *may* break your exsiting skins if you were using %if with < or >

Change-Id: Ia24dbdf0b11fc7d8a735c1111d648c3bebd68ac6
This commit is contained in:
Jonathan Gordon 2012-04-21 23:34:42 +10:00
parent 2315a23c04
commit 2d3c43dffe
3 changed files with 57 additions and 80 deletions

View file

@ -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
{