From: Michael Orlitzky Date: Tue, 17 Oct 2023 20:41:37 +0000 (-0400) Subject: src/svgtiny_css.c: implement named_ancestor_node() select handler X-Git-Url: http://gitweb.michael.orlitzky.com/?a=commitdiff_plain;h=1494831bf29ad3bcbc2c02cb50e0c95795a88005;p=libsvgtiny.git src/svgtiny_css.c: implement named_ancestor_node() select handler --- diff --git a/src/svgtiny_css.c b/src/svgtiny_css.c index f01c3b4..97d6307 100644 --- a/src/svgtiny_css.c +++ b/src/svgtiny_css.c @@ -8,6 +8,8 @@ static css_error node_name(void *pw, void *node, css_qname *qname); static css_error node_classes(void *pw, void *node, lwc_string ***classes, uint32_t *n_classes); static css_error node_id(void *pw, void *node, lwc_string **id); +static css_error named_ancestor_node(void *pw, void *node, + const css_qname *qname, void **ancestor); static css_error named_parent_node(void *pw, void *node, const css_qname *qname, void **parent); static css_error named_sibling_node(void *pw, void *node, @@ -240,6 +242,40 @@ css_error node_id(void *pw, void *node, lwc_string **id) } +/** + * Find the first ancestor of the given element having the given name + * + * This function thinly wraps dom_element_named_ancestor_node(), which + * performs exactly the search we want. + * + * \param pw Pointer to the current SVG parser state + * \param node Libdom SVG node whose ancestor we want + * \param qname Name of the ancestor node to search for + * \param ancestor Address at which to store the ancestor node pointer + * + * \return Always returns CSS_OK + * + * \post If a suitable element is found, a pointer to it will be + * stored at the address pointed to by \a ancestor; otherwise, + * NULL will be stored at the address pointed to by \a ancestor + */ +css_error named_ancestor_node(void *pw, void *node, + const css_qname *qname, void **ancestor) +{ + UNUSED(pw); + + /* It's OK if node isn't an element, libdom checks for it. */ + dom_element_named_ancestor_node((dom_element *)node, + qname->name, + (struct dom_element **)ancestor); + + /* A comment in named_parent_node() explains why we unref + * this here. */ + dom_node_unref(*ancestor); + + return CSS_OK; +} + /** * Find the first parent of the given element having the given name