summaryrefslogtreecommitdiff
path: root/src/parse/parse.c
diff options
context:
space:
mode:
authorJohn-Mark Bell <jmb@netsurf-browser.org>2019-03-10 13:16:38 +0000
committerMichael Drake <michael.drake@codethink.co.uk>2019-03-10 13:42:03 +0000
commit45c847d897e36d30c8d95b7729251454328cbd4b (patch)
treea90d564be396ec29c75531840f7721694fce923f /src/parse/parse.c
parentd0aefa94e80b0f2b2ad449d281d0fa9a68ab7d39 (diff)
downloadlibcss-45c847d897e36d30c8d95b7729251454328cbd4b.tar.gz
libcss-45c847d897e36d30c8d95b7729251454328cbd4b.tar.bz2
Parse: use an explicit state for media queries.
This simply wraps the existing at-rule parser but is able to clean up afterwards.
Diffstat (limited to 'src/parse/parse.c')
-rw-r--r--src/parse/parse.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/src/parse/parse.c b/src/parse/parse.c
index 670b88d..eb83963 100644
--- a/src/parse/parse.c
+++ b/src/parse/parse.c
@@ -67,7 +67,8 @@ enum {
sMalformedAtRule = 22,
sInlineStyle = 23,
sISBody0 = 24,
- sISBody = 25
+ sISBody = 25,
+ sMediaQuery = 26,
};
/**
@@ -144,6 +145,7 @@ static css_error parseMalformedAtRule(css_parser *parser);
static css_error parseInlineStyle(css_parser *parser);
static css_error parseISBody0(css_parser *parser);
static css_error parseISBody(css_parser *parser);
+static css_error parseMediaQuery(css_parser *parser);
static void unref_interned_strings_in_tokens(css_parser *parser);
@@ -176,7 +178,8 @@ static css_error (*parseFuncs[])(css_parser *parser) = {
parseMalformedAtRule,
parseInlineStyle,
parseISBody0,
- parseISBody
+ parseISBody,
+ parseMediaQuery,
};
/**
@@ -230,7 +233,7 @@ css_error css__parser_create_for_inline_style(const char *charset,
css_error css__parser_create_for_media_query(const char *charset,
css_charset_source cs_source, css_parser **parser)
{
- parser_state initial = { sAtRule, 0 };
+ parser_state initial = { sMediaQuery, 0 };
return css__parser_create_internal(charset, cs_source,
initial, parser);
@@ -2611,6 +2614,31 @@ css_error parseISBody(css_parser *parser)
return done(parser);
}
+css_error parseMediaQuery(css_parser *parser)
+{
+ enum { Initial = 0, AfterAtRule = 1 };
+ parser_state *state = parserutils_stack_get_current(parser->states);
+
+ /* media-query = at-rule */
+
+ switch (state->substate) {
+ case Initial:
+ {
+ parser_state to = { sAtRule, Initial };
+ parser_state subsequent = { sMediaQuery, AfterAtRule };
+
+ return transition(parser, to, subsequent);
+ }
+ case AfterAtRule:
+ /* Clean up any remaining tokens */
+ unref_interned_strings_in_tokens(parser);
+ parserutils_vector_clear(parser->tokens);
+ break;
+ }
+
+ return done(parser);
+}
+
/**
* Iterate the token vector and unref any interned strings in the tokens.
*