rrichards Sat Jan 10 06:50:25 2004 EDT
Modified files:
/php-src/ext/dom dom_iterators.c nodelist.c php_dom.h xpath.c
Log:
XPath query returns nodelist object rather than array
Index: php-src/ext/dom/dom_iterators.c
diff -u php-src/ext/dom/dom_iterators.c:1.4 php-src/ext/dom/dom_iterators.c:1.5
--- php-src/ext/dom/dom_iterators.c:1.4 Thu Jan 8 03:15:16 2004
+++ php-src/ext/dom/dom_iterators.c Sat Jan 10 06:50:25 2004
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: dom_iterators.c,v 1.4 2004/01/08 08:15:16 andi Exp $ */
+/* $Id: dom_iterators.c,v 1.5 2004/01/10 11:50:25 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -188,6 +188,8 @@
dom_object *nnmap;
dom_nnodemap_object *objmap;
int ret, previndex=1;
+ HashTable *nodeht;
+ pval **entry;
php_dom_iterator *iterator = (php_dom_iterator *)iter;
@@ -199,18 +201,26 @@
intern = (dom_object *)zend_object_store_get_object(curobj TSRMLS_CC);
if (intern != NULL && intern->ptr != NULL) {
if (objmap->ht == NULL) {
- curnode = (xmlNodePtr)((php_libxml_node_ptr
*)intern->ptr)->node;
- if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype
== XML_ELEMENT_NODE) {
- curnode = curnode->next;
+ if (objmap->nodetype == DOM_NODESET) {
+ nodeht = HASH_OF(objmap->baseobjptr);
+ zend_hash_move_forward(nodeht);
+ if (zend_hash_get_current_data(nodeht, (void **)
&entry)==SUCCESS) {
+ curattr = *entry;
+ }
} else {
- /* Nav the tree evey time as this is LIVE */
- basenode = dom_object_get_node(objmap->baseobj);
- if (basenode && (basenode->type == XML_DOCUMENT_NODE
|| basenode->type == XML_HTML_DOCUMENT_NODE)) {
- basenode = xmlDocGetRootElement((xmlDoc *)
basenode);
+ curnode = (xmlNodePtr)((php_libxml_node_ptr
*)intern->ptr)->node;
+ if (objmap->nodetype == XML_ATTRIBUTE_NODE ||
objmap->nodetype == XML_ELEMENT_NODE) {
+ curnode = curnode->next;
} else {
- basenode = basenode->children;
+ /* Nav the tree evey time as this is LIVE */
+ basenode =
dom_object_get_node(objmap->baseobj);
+ if (basenode && (basenode->type ==
XML_DOCUMENT_NODE || basenode->type == XML_HTML_DOCUMENT_NODE)) {
+ basenode =
xmlDocGetRootElement((xmlDoc *) basenode);
+ } else {
+ basenode = basenode->children;
+ }
+ curnode =
dom_get_elements_by_tag_name_ns_raw(basenode, objmap->ns, objmap->local, &previndex,
iter->index);
}
- curnode =
dom_get_elements_by_tag_name_ns_raw(basenode, objmap->ns, objmap->local, &previndex,
iter->index);
}
} else {
if (objmap->nodetype == XML_ENTITY_NODE) {
@@ -243,9 +253,11 @@
{
dom_object *intern;
dom_nnodemap_object *objmap;
- xmlNodePtr nodep, curnode;
+ xmlNodePtr nodep, curnode=NULL;
zval *curattr = NULL;
int ret, curindex = 0;
+ HashTable *nodeht;
+ pval **entry;
php_dom_iterator *iterator = emalloc(sizeof(php_dom_iterator));
@@ -256,20 +268,28 @@
intern = (dom_object *)zend_object_store_get_object(object TSRMLS_CC);
objmap = (dom_nnodemap_object *)intern->ptr;
if (objmap->ht == NULL) {
- nodep = (xmlNode *)dom_object_get_node(objmap->baseobj);
- if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype ==
XML_ELEMENT_NODE) {
- if (objmap->nodetype == XML_ATTRIBUTE_NODE) {
- curnode = (xmlNodePtr) nodep->properties;
- } else {
- curnode = (xmlNodePtr) nodep->children;
+ if (objmap->nodetype == DOM_NODESET) {
+ nodeht = HASH_OF(objmap->baseobjptr);
+ zend_hash_internal_pointer_reset(nodeht);
+ if (zend_hash_get_current_data(nodeht, (void **)
&entry)==SUCCESS) {
+ curattr = *entry;
}
} else {
- if (nodep->type == XML_DOCUMENT_NODE || nodep->type ==
XML_HTML_DOCUMENT_NODE) {
- nodep = xmlDocGetRootElement((xmlDoc *) nodep);
+ nodep = (xmlNode *)dom_object_get_node(objmap->baseobj);
+ if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype
== XML_ELEMENT_NODE) {
+ if (objmap->nodetype == XML_ATTRIBUTE_NODE) {
+ curnode = (xmlNodePtr) nodep->properties;
+ } else {
+ curnode = (xmlNodePtr) nodep->children;
+ }
} else {
- nodep = nodep->children;
+ if (nodep->type == XML_DOCUMENT_NODE || nodep->type ==
XML_HTML_DOCUMENT_NODE) {
+ nodep = xmlDocGetRootElement((xmlDoc *) nodep);
+ } else {
+ nodep = nodep->children;
+ }
+ curnode = dom_get_elements_by_tag_name_ns_raw(nodep,
objmap->ns, objmap->local, &curindex, 0);
}
- curnode = dom_get_elements_by_tag_name_ns_raw(nodep,
objmap->ns, objmap->local, &curindex, 0);
}
} else {
curnode = php_dom_libxml_hash_iter(objmap->ht, 0);
Index: php-src/ext/dom/nodelist.c
diff -u php-src/ext/dom/nodelist.c:1.8 php-src/ext/dom/nodelist.c:1.9
--- php-src/ext/dom/nodelist.c:1.8 Thu Jan 8 03:15:17 2004
+++ php-src/ext/dom/nodelist.c Sat Jan 10 06:50:25 2004
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: nodelist.c,v 1.8 2004/01/08 08:15:17 andi Exp $ */
+/* $Id: nodelist.c,v 1.9 2004/01/10 11:50:25 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -52,29 +52,35 @@
dom_nnodemap_object *objmap;
xmlNodePtr nodep, curnode;
int count = 0;
+ HashTable *nodeht;
objmap = (dom_nnodemap_object *)obj->ptr;
if (objmap->ht) {
count = xmlHashSize(objmap->ht);
} else {
- nodep = dom_object_get_node(objmap->baseobj);
- if (nodep) {
- if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype
== XML_ELEMENT_NODE) {
- curnode = nodep->children;
- if (curnode) {
- count++;
- while (curnode->next != NULL) {
+ if (objmap->nodetype == DOM_NODESET) {
+ nodeht = HASH_OF(objmap->baseobjptr);
+ count = zend_hash_num_elements(nodeht);
+ } else {
+ nodep = dom_object_get_node(objmap->baseobj);
+ if (nodep) {
+ if (objmap->nodetype == XML_ATTRIBUTE_NODE ||
objmap->nodetype == XML_ELEMENT_NODE) {
+ curnode = nodep->children;
+ if (curnode) {
count++;
- curnode = curnode->next;
+ while (curnode->next != NULL) {
+ count++;
+ curnode = curnode->next;
+ }
}
- }
- } else {
- if (nodep->type == XML_DOCUMENT_NODE || nodep->type ==
XML_HTML_DOCUMENT_NODE) {
- nodep = xmlDocGetRootElement((xmlDoc *) nodep);
} else {
- nodep = nodep->children;
+ if (nodep->type == XML_DOCUMENT_NODE ||
nodep->type == XML_HTML_DOCUMENT_NODE) {
+ nodep = xmlDocGetRootElement((xmlDoc
*) nodep);
+ } else {
+ nodep = nodep->children;
+ }
+ curnode =
dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &count, -1);
}
- curnode = dom_get_elements_by_tag_name_ns_raw(nodep,
objmap->ns, objmap->local, &count, -1);
}
}
}
@@ -101,6 +107,8 @@
dom_nnodemap_object *objmap;
xmlNodePtr nodep, curnode;
int count = 0;
+ HashTable *nodeht;
+ pval **entry;
id = getThis();
@@ -119,22 +127,31 @@
itemnode = php_dom_libxml_notation_iter(objmap->ht,
index);
}
} else {
- nodep = dom_object_get_node(objmap->baseobj);
- if (nodep) {
- if (objmap->nodetype == XML_ATTRIBUTE_NODE ||
objmap->nodetype == XML_ELEMENT_NODE) {
- curnode = nodep->children;
- while (count < index && curnode != NULL) {
- count++;
- curnode = curnode->next;
- }
- itemnode = curnode;
- } else {
- if (nodep->type == XML_DOCUMENT_NODE ||
nodep->type == XML_HTML_DOCUMENT_NODE) {
- nodep = xmlDocGetRootElement((xmlDoc
*) nodep);
+ if (objmap->nodetype == DOM_NODESET) {
+ nodeht = HASH_OF(objmap->baseobjptr);
+ if (zend_hash_index_find(nodeht, index, (void **)
&entry)==SUCCESS) {
+ *return_value = **entry;
+ zval_copy_ctor(return_value);
+ return;
+ }
+ } else {
+ nodep = dom_object_get_node(objmap->baseobj);
+ if (nodep) {
+ if (objmap->nodetype == XML_ATTRIBUTE_NODE ||
objmap->nodetype == XML_ELEMENT_NODE) {
+ curnode = nodep->children;
+ while (count < index && curnode !=
NULL) {
+ count++;
+ curnode = curnode->next;
+ }
+ itemnode = curnode;
} else {
- nodep = nodep->children;
+ if (nodep->type == XML_DOCUMENT_NODE
|| nodep->type == XML_HTML_DOCUMENT_NODE) {
+ nodep =
xmlDocGetRootElement((xmlDoc *) nodep);
+ } else {
+ nodep = nodep->children;
+ }
+ itemnode =
dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &count, index);
}
- itemnode =
dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &count, index);
}
}
}
Index: php-src/ext/dom/php_dom.h
diff -u php-src/ext/dom/php_dom.h:1.21 php-src/ext/dom/php_dom.h:1.22
--- php-src/ext/dom/php_dom.h:1.21 Thu Jan 8 12:32:03 2004
+++ php-src/ext/dom/php_dom.h Sat Jan 10 06:50:25 2004
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_dom.h,v 1.21 2004/01/08 17:32:03 sniper Exp $ */
+/* $Id: php_dom.h,v 1.22 2004/01/10 11:50:25 rrichards Exp $ */
#ifndef PHP_DOM_H
#define PHP_DOM_H
@@ -62,6 +62,8 @@
Can be checked with phpversion("dom");
*/
#define DOM_API_VERSION "20031129"
+/* Define a custom type for iterating using an unused nodetype */
+#define DOM_NODESET XML_XINCLUDE_START
typedef struct _dom_nnodemap_object {
dom_object *baseobj;
Index: php-src/ext/dom/xpath.c
diff -u php-src/ext/dom/xpath.c:1.10 php-src/ext/dom/xpath.c:1.11
--- php-src/ext/dom/xpath.c:1.10 Thu Jan 8 03:15:17 2004
+++ php-src/ext/dom/xpath.c Sat Jan 10 06:50:25 2004
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: xpath.c,v 1.10 2004/01/08 08:15:17 andi Exp $ */
+/* $Id: xpath.c,v 1.11 2004/01/10 11:50:25 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -128,10 +128,20 @@
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 @@
if (! xpathobjp) {
RETURN_FALSE;
}
+
+ MAKE_STD_ZVAL(retval);
+ array_init(retval);
+
if (xpathobjp->type == XPATH_NODESET) {
int i;
xmlNodeSetPtr nodesetp;
@@ -209,8 +223,6 @@
RETURN_FALSE;
}
- array_init(return_value);
-
for (i = 0; i < nodesetp->nodeNr; i++) {
xmlNodePtr node = nodesetp->nodeTab[i];
zval *child;
@@ -236,10 +248,14 @@
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 */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php