diff options
-rw-r--r-- | src/css.cc | 29 | ||||
-rw-r--r-- | src/css.hh | 8 | ||||
-rw-r--r-- | src/cssparser.cc | 2 |
3 files changed, 25 insertions, 14 deletions
@@ -55,13 +55,12 @@ CssSelector::CssSelector () { cs = selectorList->getRef (selectorList->size () - 1); cs->notMatchingBefore = -1; - cs->selector.element = CssSimpleSelector::ELEMENT_ANY; - cs->selector.klass = NULL; - cs->selector.pseudo = NULL; - cs->selector.id = NULL; + cs->selector = new CssSimpleSelector (); }; CssSelector::~CssSelector () { + for (int i = selectorList->size () - 1; i >= 0; i--) + delete selectorList->getRef (i)->selector; delete selectorList; } @@ -74,7 +73,7 @@ bool CssSelector::match (Doctree *docTree, const DoctreeNode *node) { for (int i = selectorList->size () - 1; i >= 0; i--) { struct CombinatorAndSelector *cs = selectorList->getRef (i); - sel = &cs->selector; + sel = cs->selector; notMatchingBefore = &cs->notMatchingBefore; if (node == NULL) @@ -119,15 +118,12 @@ void CssSelector::addSimpleSelector (Combinator c) { cs->combinator = c; cs->notMatchingBefore = -1; - cs->selector.element = CssSimpleSelector::ELEMENT_ANY; - cs->selector.klass = NULL; - cs->selector.pseudo = NULL; - cs->selector.id = NULL; + cs->selector = new CssSimpleSelector (); } void CssSelector::print () { for (int i = 0; i < selectorList->size (); i++) { - selectorList->getRef (i)->selector.print (); + selectorList->getRef (i)->selector->print (); if (i < selectorList->size () - 1) { switch (selectorList->getRef (i + 1)->combinator) { @@ -147,6 +143,19 @@ void CssSelector::print () { fprintf (stderr, "\n"); } +CssSimpleSelector::CssSimpleSelector () { + element = ELEMENT_ANY; + klass = NULL; + id = NULL; + pseudo = NULL; +} + +CssSimpleSelector::~CssSimpleSelector () { + dFree (klass); + dFree (id); + dFree (pseudo); +} + bool CssSimpleSelector::match (const DoctreeNode *n) { if (element != ELEMENT_ANY && element != n->element) return false; @@ -203,8 +203,10 @@ class CssSimpleSelector { }; int element; - const char *klass, *pseudo, *id; + char *klass, *pseudo, *id; + CssSimpleSelector (); + ~CssSimpleSelector (); bool match (const DoctreeNode *node); void print (); }; @@ -225,7 +227,7 @@ class CssSelector { struct CombinatorAndSelector { int notMatchingBefore; // used for optimizing CSS selector matching Combinator combinator; - CssSimpleSelector selector; + CssSimpleSelector *selector; }; int refCount; @@ -236,7 +238,7 @@ class CssSelector { ~CssSelector (); void addSimpleSelector (Combinator c); inline CssSimpleSelector *top () { - return &selectorList->getRef (selectorList->size () - 1)->selector; + return selectorList->getRef (selectorList->size () - 1)->selector; }; inline int size () { return selectorList->size (); }; bool match (Doctree *dt, const DoctreeNode *node); diff --git a/src/cssparser.cc b/src/cssparser.cc index 4eb6049b..8fe26d9c 100644 --- a/src/cssparser.cc +++ b/src/cssparser.cc @@ -973,7 +973,7 @@ static void Css_parse_declaration(CssParser * parser, static bool Css_parse_simple_selector(CssParser * parser, CssSimpleSelector *selector) { - const char *p, **pp; + char *p, **pp; if (parser->ttype == CSS_TK_SYMBOL) { selector->element = a_Html_tag_index(parser->tval); |