summaryrefslogtreecommitdiff
path: root/ext/dom/xpath.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/dom/xpath.c')
-rw-r--r--ext/dom/xpath.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/ext/dom/xpath.c b/ext/dom/xpath.c
index fd0f72dc3a..2961ff4a09 100644
--- a/ext/dom/xpath.c
+++ b/ext/dom/xpath.c
@@ -128,10 +128,20 @@ PHP_FUNCTION(dom_xpath_register_ns)
RETURN_TRUE;
}
+static void dom_xpath_iter(zval *baseobj, dom_object *intern)
+{
+ dom_nnodemap_object *mapptr;
+
+ mapptr = (dom_nnodemap_object *)intern->ptr;
+ mapptr->baseobjptr = baseobj;
+ mapptr->nodetype = DOM_NODESET;
+
+}
+
/* {{{ proto domnodelist dom_xpath_query(string expr [,domNode context]); */
PHP_FUNCTION(dom_xpath_query)
{
- zval *id, *context = NULL;
+ zval *id, *retval, *context = NULL;
xmlXPathContextPtr ctxp;
xmlNodePtr nodep = NULL;
xmlXPathObjectPtr xpathobjp;
@@ -200,6 +210,10 @@ PHP_FUNCTION(dom_xpath_query)
if (! xpathobjp) {
RETURN_FALSE;
}
+
+ MAKE_STD_ZVAL(retval);
+ array_init(retval);
+
if (xpathobjp->type == XPATH_NODESET) {
int i;
xmlNodeSetPtr nodesetp;
@@ -209,8 +223,6 @@ PHP_FUNCTION(dom_xpath_query)
RETURN_FALSE;
}
- array_init(return_value);
-
for (i = 0; i < nodesetp->nodeNr; i++) {
xmlNodePtr node = nodesetp->nodeTab[i];
zval *child;
@@ -236,10 +248,14 @@ PHP_FUNCTION(dom_xpath_query)
node->ns = curns;
}
child = php_dom_create_object(node, &ret, NULL, child, intern TSRMLS_CC);
- add_next_index_zval(return_value, child);
+ add_next_index_zval(retval, child);
}
}
+ php_dom_create_interator(return_value, DOM_NODELIST TSRMLS_CC);
+ intern = (dom_object *)zend_objects_get_address(return_value TSRMLS_CC);
+ dom_xpath_iter(retval, intern);
+
xmlXPathFreeObject(xpathobjp);
}
/* }}} end dom_xpath_query */