diff options
-rw-r--r-- | src/parse/parse.c | 82 | ||||
-rw-r--r-- | test/data/parse2/eof.dat | 119 |
2 files changed, 194 insertions, 7 deletions
diff --git a/src/parse/parse.c b/src/parse/parse.c index 4f0bc65..60106a5 100644 --- a/src/parse/parse.c +++ b/src/parse/parse.c @@ -934,6 +934,14 @@ css_error parseRuleset(css_parser *parser) if (error != CSS_OK) return error; + if (token->type == CSS_TOKEN_EOF) { + error = pushBack(parser, token); + if (error != CSS_OK) + return error; + + return done(parser); + } + if (token->type != CSS_TOKEN_CHAR || lwc_string_length(token->idata) != 1 || lwc_string_data(token->idata)[0] != '{') { @@ -977,6 +985,9 @@ css_error parseRulesetEnd(css_parser *parser) if (error != CSS_OK) return error; + if (token->type == CSS_TOKEN_EOF) + return done(parser); + /* If this can't possibly be the start of a decl-list, then * attempt to parse a declaration. This will catch any invalid * input at this point and read to the start of the next @@ -1005,8 +1016,13 @@ css_error parseRulesetEnd(css_parser *parser) if (error != CSS_OK) return error; - if (token->type == CSS_TOKEN_EOF) - break; + if (token->type == CSS_TOKEN_EOF) { + error = pushBack(parser, token); + if (error != CSS_OK) + return error; + + return done(parser); + } if (token->type != CSS_TOKEN_CHAR || lwc_string_length(token->idata) != 1 || @@ -1139,6 +1155,14 @@ css_error parseAtRuleEnd(css_parser *parser) if (error != CSS_OK) return error; + if (token->type == CSS_TOKEN_EOF) { + error = pushBack(parser, token); + if (error != CSS_OK) + return error; + + return done(parser); + } + if (token->type != CSS_TOKEN_CHAR || lwc_string_length(token->idata) != 1) { /* Should never happen FOLLOW(at-rule) == '{', ';'*/ @@ -1235,8 +1259,13 @@ css_error parseBlock(css_parser *parser) if (error != CSS_OK) return error; - if (token->type == CSS_TOKEN_EOF) - break; + if (token->type == CSS_TOKEN_EOF) { + error = pushBack(parser, token); + if (error != CSS_OK) + return error; + + return done(parser); + } if (token->type != CSS_TOKEN_CHAR || lwc_string_length(token->idata) != 1 || @@ -1316,6 +1345,11 @@ css_error parseBlockContent(css_parser *parser) parser->event_pw); } + unref_interned_strings_in_tokens( + parser); + parserutils_vector_clear( + parser->tokens); + return transition(parser, to, subsequent); } else if (lwc_string_length( @@ -1368,6 +1402,11 @@ css_error parseBlockContent(css_parser *parser) parser->event_pw); } + unref_interned_strings_in_tokens( + parser); + parserutils_vector_clear( + parser->tokens); + return done(parser); } } else if (token->type == CSS_TOKEN_EOF) { @@ -1385,6 +1424,9 @@ css_error parseBlockContent(css_parser *parser) parser->event_pw); } + unref_interned_strings_in_tokens(parser); + parserutils_vector_clear(parser->tokens); + return done(parser); } @@ -1469,6 +1511,14 @@ css_error parseDeclaration(css_parser *parser) if (error != CSS_OK) return error; + if (token->type == CSS_TOKEN_EOF) { + error = pushBack(parser, token); + if (error != CSS_OK) + return error; + + return done(parser); + } + if (token->type != CSS_TOKEN_CHAR || lwc_string_length(token->idata) != 1 || lwc_string_data(token->idata)[0] != ':') { @@ -1535,8 +1585,13 @@ css_error parseDeclList(css_parser *parser) if (error != CSS_OK) return error; - if (token->type == CSS_TOKEN_EOF) + if (token->type == CSS_TOKEN_EOF) { + error = pushBack(parser, token); + if (error != CSS_OK) + return error; + return done(parser); + } if (token->type != CSS_TOKEN_CHAR || lwc_string_length(token->idata) != 1 || @@ -1630,6 +1685,14 @@ css_error parseProperty(css_parser *parser) if (error != CSS_OK) return error; + if (token->type == CSS_TOKEN_EOF) { + error = pushBack(parser, token); + if (error != CSS_OK) + return error; + + return done(parser); + } + if (token->type != CSS_TOKEN_IDENT) { /* parse error */ parser->parseError = true; @@ -2498,8 +2561,13 @@ css_error parseISBody(css_parser *parser) if (error != CSS_OK) return error; - if (token->type == CSS_TOKEN_EOF) - break; + if (token->type == CSS_TOKEN_EOF) { + error = pushBack(parser, token); + if (error != CSS_OK) + return error; + + return done(parser); + } if (token->type != CSS_TOKEN_CHAR || lwc_string_length(token->idata) != 1 || diff --git a/test/data/parse2/eof.dat b/test/data/parse2/eof.dat index e19b42c..48190a6 100644 --- a/test/data/parse2/eof.dat +++ b/test/data/parse2/eof.dat @@ -177,6 +177,125 @@ f{clear:both} #reset #data +@media screen +#errors +#expected +| @media +#reset + +#data +@media screen +#errors +#expected +| @media +#reset + +#data +@media screen{ +#errors +#expected +| @media +#reset + +#data +@media screen{ +#errors +#expected +| @media +#reset + +#data +@media screen{{ +#errors +#expected +| @media +#reset + +#data +@media screen{; +#errors +#expected +| @media +#reset + +#data +@media screen{f +#errors +#expected +| @media +| f +#reset + +#data +@media screen{f{ +#errors +#expected +| @media +| f +#reset + +#data +@media screen{f{color +#errors +#expected +| @media +| f +#reset + +#data +@media screen{f{color: +#errors +#expected +| @media +| f +#reset + +#data +@media screen{f{color:blue +#errors +#expected +| @media +| f +| color: #0000ff00 +#reset + +#data +@media screen{f{color:blue; +#errors +#expected +| @media +| f +| color: #0000ff00 +#reset + +#data +@media screen{f{color:blue} +#errors +#expected +| @media +| f +| color: #0000ff00 +#reset + +#data +@media screen{f{color:blue;} +#errors +#expected +| @media +| f +| color: #0000ff00 +#reset + +#data +@media screen{f{color:blue;}} +#errors +#expected +| @media +| f +| color: #0000ff00 +#reset + +#data l( #errors #expected |