From edfdfee20a06e0e5e0029042bc67575e82f42ea9 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Fri, 31 Jul 2009 23:19:21 +0000 Subject: More rigorous handling of EOF. Expand test data for this. svn path=/trunk/libcss/; revision=8931 --- src/parse/parse.c | 82 +++++++++++++++++++++++++++++--- 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 @@ -176,6 +176,125 @@ f{clear:both} #expected #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 -- cgit v1.2.3