aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/css.cc29
-rw-r--r--src/css.hh8
-rw-r--r--src/cssparser.cc2
3 files changed, 25 insertions, 14 deletions
diff --git a/src/css.cc b/src/css.cc
index b2e04877..d12aa3a7 100644
--- a/src/css.cc
+++ b/src/css.cc
@@ -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;
diff --git a/src/css.hh b/src/css.hh
index 122215f7..45245f43 100644
--- a/src/css.hh
+++ b/src/css.hh
@@ -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);