summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/parse/parse.c44
-rw-r--r--test/data/css/malformed.css1
-rw-r--r--test/data/css/simple.css4
-rw-r--r--test/parse.c2
4 files changed, 23 insertions, 28 deletions
diff --git a/src/parse/parse.c b/src/parse/parse.c
index 6e10ffc..b826b5c 100644
--- a/src/parse/parse.c
+++ b/src/parse/parse.c
@@ -543,7 +543,7 @@ css_error getToken(css_parser *parser, const css_token **token)
temp = *(*token);
- if (temp.data.ptr != NULL) {
+ if (temp.data.ptr != NULL && temp.data.len > 0) {
/* Insert token text into the dictionary */
perror = parserutils_dict_insert(parser->dictionary,
temp.data.ptr, temp.data.len, &interned);
@@ -1075,7 +1075,7 @@ css_error parseBlock(css_parser *parser)
if (token->type != CSS_TOKEN_CHAR || token->data.len != 1 ||
token->data.ptr[0] != '{') {
- /** \todo parse error */
+ /* This should never happen, as FIRST(block) == '{' */
assert(0 && "Expected {");
}
@@ -1102,7 +1102,8 @@ css_error parseBlock(css_parser *parser)
if (token->type != CSS_TOKEN_CHAR || token->data.len != 1 ||
token->data.ptr[0] != '}') {
- /** \todo parse error */
+ /* This should never happen, as
+ * FOLLOW(block-content) == '}' */
assert(0 && "Expected }");
}
@@ -1168,13 +1169,10 @@ css_error parseBlockContent(css_parser *parser)
__func__, tprinter);
#endif
if (parser->event != NULL) {
- if (parser->event(
+ parser->event(
CSS_PARSER_BLOCK_CONTENT,
parser->tokens,
- parser->event_pw) ==
- false) {
- /** \todo parse error */
- }
+ parser->event_pw);
}
return transition(parser, to,
@@ -1195,13 +1193,10 @@ css_error parseBlockContent(css_parser *parser)
__func__, tprinter);
#endif
if (parser->event != NULL) {
- if (parser->event(
+ parser->event(
CSS_PARSER_BLOCK_CONTENT,
parser->tokens,
- parser->event_pw) ==
- false) {
- /** \todo parse error */
- }
+ parser->event_pw);
}
return done(parser);
@@ -1218,13 +1213,9 @@ css_error parseBlockContent(css_parser *parser)
__func__, tprinter);
#endif
if (parser->event != NULL) {
- if (parser->event(
- CSS_PARSER_BLOCK_CONTENT,
+ parser->event(CSS_PARSER_BLOCK_CONTENT,
parser->tokens,
- parser->event_pw) ==
- false) {
- /** \todo parse error */
- }
+ parser->event_pw);
}
return done(parser);
@@ -1381,7 +1372,7 @@ css_error parseDeclList(css_parser *parser)
return error;
if (token->type != CSS_TOKEN_CHAR || token->data.len != 1) {
- /** \todo parse error */
+ /* Should never happen */
assert(0 && "Expected ; or }");
}
@@ -1394,7 +1385,7 @@ css_error parseDeclList(css_parser *parser)
} else if (token->data.ptr[0] == ';') {
state->substate = WS;
} else {
- /** \todo parse error */
+ /* Should never happen */
assert(0 && "Expected ; or }");
}
@@ -1429,7 +1420,10 @@ css_error parseDeclListEnd(css_parser *parser)
if (error != CSS_OK)
return error;
- if (token->type == CSS_TOKEN_IDENT) {
+ if (token->type != CSS_TOKEN_CHAR ||
+ token->data.len != 1 ||
+ (token->data.ptr[0] != ';' &&
+ token->data.ptr[0] != '}')) {
parser_state to = { sDeclaration, Initial };
parser_state subsequent =
{ sDeclListEnd, AfterDeclaration };
@@ -1439,12 +1433,6 @@ css_error parseDeclListEnd(css_parser *parser)
return error;
return transition(parser, to, subsequent);
- } else if (token->type != CSS_TOKEN_CHAR ||
- token->data.len != 1 ||
- (token->data.ptr[0] != ';' &&
- token->data.ptr[0] != '}')) {
- /** \todo parse error */
- assert(0 && "Expected ; or }");
} else {
error = pushBack(parser, token);
if (error != CSS_OK)
diff --git a/test/data/css/malformed.css b/test/data/css/malformed.css
index cfcbb23..4ff885b 100644
--- a/test/data/css/malformed.css
+++ b/test/data/css/malformed.css
@@ -5,6 +5,7 @@ p { color:green; color: } /* malformed declaration missing value */
p { color:red; color:; color:green } /* same with expected recovery */
p { color:green; color{;color:maroon} } /* unexpected tokens { } */
p { color:red; color{;color:maroon}; color:green } /* same with recovery */
+p { color:red; !important; color:green }
@blah <!-- ;
@foo --> { moose }
diff --git a/test/data/css/simple.css b/test/data/css/simple.css
index bfd33b1..aeba2f5 100644
--- a/test/data/css/simple.css
+++ b/test/data/css/simple.css
@@ -45,3 +45,7 @@ body { font-family: "foo \
*/
body { font-family: "unterminated string
foo }
+
+blah { baz: bat; foo: bar !important; }
+
+foo { bar: ""; }
diff --git a/test/parse.c b/test/parse.c
index 567c8c4..730ba44 100644
--- a/test/parse.c
+++ b/test/parse.c
@@ -91,6 +91,8 @@ int main(int argc, char **argv)
error = css_parser_parse_chunk(parser, buf, CHUNK_SIZE);
assert(error == CSS_OK || error == CSS_NEEDDATA);
+
+ len -= CHUNK_SIZE;
}
if (len > 0) {