summaryrefslogtreecommitdiff
path: root/ext/dom/nodelist.c
diff options
context:
space:
mode:
authorRob Richards <rrichards@php.net>2004-01-10 11:50:25 +0000
committerRob Richards <rrichards@php.net>2004-01-10 11:50:25 +0000
commit394bf2ba5b457a5befed5a7fbadae0ce50e024d4 (patch)
tree478abdaee2e072445bf18504a0f4e34bbf1cd2fe /ext/dom/nodelist.c
parenta72c1ab93be75e9e206e6ba90fe04c2676110e72 (diff)
downloadphp-git-394bf2ba5b457a5befed5a7fbadae0ce50e024d4.tar.gz
XPath query returns nodelist object rather than array
Diffstat (limited to 'ext/dom/nodelist.c')
-rw-r--r--ext/dom/nodelist.c73
1 files changed, 45 insertions, 28 deletions
diff --git a/ext/dom/nodelist.c b/ext/dom/nodelist.c
index 9c56e48844..a15228b376 100644
--- a/ext/dom/nodelist.c
+++ b/ext/dom/nodelist.c
@@ -52,29 +52,35 @@ int dom_nodelist_length_read(dom_object *obj, zval **retval TSRMLS_DC)
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 @@ PHP_FUNCTION(dom_nodelist_item)
dom_nnodemap_object *objmap;
xmlNodePtr nodep, curnode;
int count = 0;
+ HashTable *nodeht;
+ pval **entry;
id = getThis();
@@ -119,22 +127,31 @@ PHP_FUNCTION(dom_nodelist_item)
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);
}
}
}