From ada198a836a6ac92feac806f85385327efe4f622 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 25 Jan 2009 21:59:06 +0000 Subject: Destroy rules svn path=/trunk/libcss/; revision=6269 --- src/stylesheet.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 4 deletions(-) (limited to 'src/stylesheet.c') diff --git a/src/stylesheet.c b/src/stylesheet.c index e95f61e..56556e8 100644 --- a/src/stylesheet.c +++ b/src/stylesheet.c @@ -630,11 +630,88 @@ css_error css_stylesheet_rule_create(css_stylesheet *sheet, css_rule_type type, */ css_error css_stylesheet_rule_destroy(css_stylesheet *sheet, css_rule *rule) { - UNUSED(sheet); - UNUSED(rule); + if (sheet == NULL || rule == NULL) + return CSS_BADPARM; + + /* Must be detached from parent/siblings */ + if (rule->parent != NULL || rule->next != NULL || rule->prev != NULL) + return CSS_INVALID; + + /* Destroy type-specific contents */ + switch (rule->type) { + case CSS_RULE_UNKNOWN: + break; + case CSS_RULE_SELECTOR: + { + css_rule_selector *s = (css_rule_selector *) rule; + uint32_t i; + + for (i = 0; i < rule->items; i++) { + css_selector *sel = s->selectors[i]; + + /* Detach from rule */ + sel->rule = NULL; + + css_stylesheet_selector_destroy(sheet, sel); + } + + css_stylesheet_style_destroy(sheet, s->style); + } + break; + case CSS_RULE_CHARSET: + break; + case CSS_RULE_IMPORT: + { + css_rule_import *import = (css_rule_import *) rule; + + css_stylesheet_destroy(import->sheet); + } + break; + case CSS_RULE_MEDIA: + { + css_rule_media *media = (css_rule_media *) rule; + css_rule *c, *d; + + for (c = media->first_child; c != NULL; c = d) { + d = c->next; + + /* Detach from list */ + c->parent = NULL; + c->prev = NULL; + c->next = NULL; + + css_stylesheet_rule_destroy(sheet, c); + } + } + break; + case CSS_RULE_FONT_FACE: + { + css_rule_font_face *font_face = (css_rule_font_face *) rule; + + css_stylesheet_style_destroy(sheet, font_face->style); + } + break; + case CSS_RULE_PAGE: + { + css_rule_page *page = (css_rule_page *) rule; + uint32_t i; + + for (i = 0; i < rule->items; i++) { + css_selector *sel = page->selectors[i]; + + /* Detach from rule */ + sel->rule = NULL; + + css_stylesheet_selector_destroy(sheet, sel); + } + + css_stylesheet_style_destroy(sheet, page->style); + } + break; + } - /** \todo should this be recursive? */ - /** \todo what happens to non-rule objects owned by this rule? */ + /* Destroy rule */ + sheet->alloc(rule, 0, sheet->pw); return CSS_OK; } -- cgit v1.2.3