summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/dom/core/node.h10
-rw-r--r--src/core/node.c30
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 */
/**