diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2019-05-04 11:58:16 +0100 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2019-05-04 11:58:16 +0100 |
commit | 9bdbe6e64d12c514888457d466f625524627af19 (patch) | |
tree | 7d08fa1ebdeaaf5cfc069cae09a6d25df8956342 | |
parent | 41b0a260811a0880e2f84e29e20e3ebea9d0b6fe (diff) | |
download | libdom-9bdbe6e64d12c514888457d466f625524627af19.tar.gz libdom-9bdbe6e64d12c514888457d466f625524627af19.tar.bz2 |
Add dom_node_contains()
Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
-rw-r--r-- | include/dom/core/node.h | 10 | ||||
-rw-r--r-- | src/core/node.c | 30 |
2 files changed, 40 insertions, 0 deletions
diff --git a/include/dom/core/node.h b/include/dom/core/node.h index ba273af..9600e6d 100644 --- a/include/dom/core/node.h +++ b/include/dom/core/node.h @@ -202,6 +202,16 @@ static inline void dom_node_unref(dom_node *node) } #define dom_node_unref(n) dom_node_unref((dom_node *) (n)) +/* Contains is non-virtual since it doesn't need to be */ + +dom_exception _dom_node_contains(struct dom_node_internal *node, + struct dom_node_internal *other, + bool *contains); +#define dom_node_contains(n, o, c) \ + _dom_node_contains((dom_node_internal *)(n), (dom_node_internal *)(o), (c)) + +/* All the rest are virtual */ + static inline dom_exception dom_node_get_node_name(struct dom_node *node, dom_string **result) { diff --git a/src/core/node.c b/src/core/node.c index 17f93dd..2bd95d3 100644 --- a/src/core/node.c +++ b/src/core/node.c @@ -296,6 +296,36 @@ void _dom_node_finalise(dom_node_internal *node) /* ---------------------------------------------------------------------*/ +/* The public non-virtual function of this interface Node */ + +dom_exception _dom_node_contains(struct dom_node_internal *node, + struct dom_node_internal *other, + bool *contains) +{ + assert(node != NULL); + assert(other != NULL); + assert(contains != NULL); + + if (node->owner != other->owner) { + *contains = false; + return DOM_NO_ERR; + } + + while (other != NULL) { + if (other == node) { + *contains = true; + return DOM_NO_ERR; + } + other = other->parent; + } + + *contains = false; + return DOM_NO_ERR; +} + + +/* ---------------------------------------------------------------------*/ + /* The public virtual function of this interface Node */ /** |