aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2008-11-30 18:26:49 +0100
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2008-11-30 18:26:49 +0100
commita39d434e6169c62624ad24ad600e1ac62d6fb2ff (patch)
tree5315c2758ace09825e25a99cd8e9c5d9c5c810f6
parent8ecece7b09f61f4d39334ca66639f3ae865cf48e (diff)
factor out Css_parse_selector()
-rw-r--r--src/cssparser.cc119
1 files changed, 61 insertions, 58 deletions
diff --git a/src/cssparser.cc b/src/cssparser.cc
index 3578f56c..2edee0c6 100644
--- a/src/cssparser.cc
+++ b/src/cssparser.cc
@@ -922,78 +922,81 @@ static void Css_parse_declaration(CssParser * parser,
Css_next_token(parser);
}
-static void Css_parse_ruleset(CssParser * parser)
-{
- lout::misc::SimpleVector < CssSelector * >*list;
- CssPropertyList *props, *importantProps;
- CssSelector *selector;
+static CssSelector *Css_parse_selector(CssParser * parser) {
+ CssSelector *selector = new CssSelector ();
const char *p, **pp;
- list = new lout::misc::SimpleVector < CssSelector * >(1);
-
- while (true) {
- selector = new CssSelector();
- selector->ref();
-
- if (parser->ttype == CSS_TK_SYMBOL) {
- selector->top ()->element = a_Html_tag_index(parser->tval);
- Css_next_token(parser);
- } else if (parser->ttype == CSS_TK_CHAR && parser->tval[0] == '*') {
- selector->top ()->element = CssSimpleSelector::ELEMENT_ANY;
- Css_next_token(parser);
- }
+ if (parser->ttype == CSS_TK_SYMBOL) {
+ selector->top ()->element = a_Html_tag_index(parser->tval);
+ Css_next_token(parser);
+ } else if (parser->ttype == CSS_TK_CHAR && parser->tval[0] == '*') {
+ selector->top ()->element = CssSimpleSelector::ELEMENT_ANY;
+ Css_next_token(parser);
+ }
- do {
- pp = NULL;
- if (parser->ttype == CSS_TK_CHAR) {
- switch (parser->tval[0]) {
- case '#':
- pp = &selector->top ()->id;
- break;
- case '.':
- pp = &selector->top ()->klass;
- break;
+ do {
+ pp = NULL;
+ if (parser->ttype == CSS_TK_CHAR) {
+ switch (parser->tval[0]) {
+ case '#':
+ pp = &selector->top ()->id;
+ break;
+ case '.':
+ pp = &selector->top ()->klass;
+ break;
case ':':
- pp = &selector->top ()->pseudo;
- break;
- }
+ pp = &selector->top ()->pseudo;
+ break;
}
+ }
- if (pp) {
- Css_next_token(parser);
- if (parser->ttype == CSS_TK_SYMBOL ||
- parser->ttype == CSS_TK_DECINT) {
+ if (pp) {
+ Css_next_token(parser);
+ if (parser->ttype == CSS_TK_SYMBOL ||
+ parser->ttype == CSS_TK_DECINT) {
if (*pp == NULL)
*pp = dStrdup(parser->tval);
Css_next_token(parser);
- } else if (parser->ttype == CSS_TK_FLOAT) {
- /* In this case, we are actually interested in three tokens:
- * number, '.', number. Instead, we have a decimal fraction,
- * which we split up again. */
- p = strchr(parser->tval, '.');
- if (*pp == NULL)
- *pp = dStrndup(parser->tval, p - parser->tval);
- if (selector->top ()->klass == NULL)
- selector->top ()->klass = dStrdup(p + 1);
- Css_next_token(parser);
- }
+ } else if (parser->ttype == CSS_TK_FLOAT) {
+ /* In this case, we are actually interested in three tokens:
+ * number, '.', number. Instead, we have a decimal fraction,
+ * which we split up again. */
+ p = strchr(parser->tval, '.');
+ if (*pp == NULL)
+ *pp = dStrndup(parser->tval, p - parser->tval);
+ if (selector->top ()->klass == NULL)
+ selector->top ()->klass = dStrdup(p + 1);
+ Css_next_token(parser);
}
- } while (pp);
+ }
+ } while (pp);
- /* Skip all tokens which may "belong" to this selector. */
- while (!(parser->ttype == CSS_TK_END ||
- (parser->ttype == CSS_TK_CHAR &&
- (parser->tval[0] == ',' || parser->tval[0] == '{'))))
- Css_next_token(parser);
+ /* Skip all tokens which may "belong" to this selector. */
+ while (!(parser->ttype == CSS_TK_END ||
+ (parser->ttype == CSS_TK_CHAR &&
+ (parser->tval[0] == ',' || parser->tval[0] == '{'))))
+ Css_next_token(parser);
- if (selector)
- DEBUG_MSG(DEBUG_PARSE_LEVEL, "end of selector (%s, %s, %s, %d)\n",
- selector->top ()->id, selector->top ()->klass,
- selector->top ()->pseudo, selector->top ()->element);
- else
- DEBUG_MSG(DEBUG_PARSE_LEVEL, "not a %s\n", "selector");
+ DEBUG_MSG(DEBUG_PARSE_LEVEL, "end of selector (%s, %s, %s, %d)\n",
+ selector->top ()->id, selector->top ()->klass,
+ selector->top ()->pseudo, selector->top ()->element);
+
+ return selector;
+}
+
+static void Css_parse_ruleset(CssParser * parser)
+{
+ lout::misc::SimpleVector < CssSelector * >*list;
+ CssPropertyList *props, *importantProps;
+ CssSelector *selector;
+
+ list = new lout::misc::SimpleVector < CssSelector * >(1);
+
+ while (true) {
+ selector = Css_parse_selector(parser);
if (selector) {
+ selector->ref();
list->increase();
list->set(list->size() - 1, selector);
}