rrichards Fri Dec 5 14:21:07 2003 EDT
Modified files: (Branch: PHP_4_3)
/php-src/ext/domxml php_domxml.c
Log:
Fix bug #26531: get_elements_by_tag_name() wildcard fails
Index: php-src/ext/domxml/php_domxml.c
diff -u php-src/ext/domxml/php_domxml.c:1.218.2.42
php-src/ext/domxml/php_domxml.c:1.218.2.43
--- php-src/ext/domxml/php_domxml.c:1.218.2.42 Wed Dec 3 07:30:02 2003
+++ php-src/ext/domxml/php_domxml.c Fri Dec 5 14:21:05 2003
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_domxml.c,v 1.218.2.42 2003/12/03 12:30:02 rrichards Exp $ */
+/* $Id: php_domxml.c,v 1.218.2.43 2003/12/05 19:21:05 rrichards Exp $ */
/* TODO
* - Support Notation Nodes
@@ -708,9 +708,9 @@
Namespace support
*/
if ( n != NULL && name != NULL ) {
- cld = n->children;
+ cld = n;
while ( cld != NULL ) {
- if ( xmlStrcmp( name, cld->name ) == 0 ){
+ if (cld->type == XML_ELEMENT_NODE && (xmlStrEqual(name, "*")
|| xmlStrcmp(name, cld->name) == 0)){
if ( rv == NULL ) {
rv = xmlXPathNodeSetCreate( cld ) ;
}
@@ -718,7 +718,7 @@
xmlXPathNodeSetAdd( rv, cld );
}
}
- rv = php_get_elements_by_tagname(cld, name, rv);
+ rv = php_get_elements_by_tagname(cld->children, name, rv);
cld = cld->next;
}
}
@@ -3056,88 +3056,43 @@
PHP_FUNCTION(domxml_doc_get_elements_by_tagname)
{
zval *id, *rv, *contextnode = NULL,*ctxpin = NULL;
- xmlXPathContextPtr ctxp;
xmlDocPtr docp;
+ xmlNode *contextnodep = NULL, *nodep = NULL;
+ int name_len,i;
+ char *name;
+ xmlNodeSet *nodesetp = NULL;
- xmlXPathObjectPtr xpathobjp;
- xmlNode *contextnodep;
- int name_len;
- int free_context = 0;
- char *str,*name;
-
- contextnode = NULL;
- contextnodep = NULL;
-
- DOMXML_PARAM_FOUR(docp, id, le_domxmldocp, "s|oo", &name,
&name_len,&ctxpin,&contextnodep);
-
- /* if no xpath_context was submitted, create a new one */
- if (ctxpin == NULL) {
- ctxp = xmlXPathNewContext(docp);
- free_context = 1;
- } else {
- DOMXML_GET_OBJ(ctxp, ctxpin, le_xpathctxp);
- }
+ DOMXML_PARAM_FOUR(docp, id, le_domxmldocp, "s|oo", &name,
&name_len,&ctxpin,&contextnode);
if (contextnode) {
DOMXML_GET_OBJ(contextnodep, contextnode, le_domxmlnodep);
+ if (contextnodep->type == XML_ELEMENT_NODE) {
+ nodep = contextnodep->children;
+ }
+ } else {
+ nodep = xmlDocGetRootElement(docp);
}
- ctxp->node = contextnodep;
- str = (char*) emalloc((name_len+23) * sizeof(char)) ;
- if (str == NULL) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot allocate memory
for string");
- }
- sprintf(str ,"//*[local-name() = '%s']", name);
- xpathobjp = xmlXPathEval(str, ctxp);
- efree(str);
- ctxp->node = NULL;
- if (!xpathobjp) {
- RETURN_FALSE;
- }
MAKE_STD_ZVAL(rv);
- if(array_init(rv) != SUCCESS)
- {
+ if(array_init(rv) != SUCCESS) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required
array");
RETURN_FALSE;
}
- switch (Z_TYPE_P(xpathobjp)) {
-
- case XPATH_NODESET:
- {
- int i;
- xmlNodeSetPtr nodesetp;
-
- if (NULL == (nodesetp = xpathobjp->nodesetval)) {
- zval_dtor(rv);
- xmlXPathFreeObject (xpathobjp);
- if (free_context) {
- xmlXPathFreeContext(ctxp);
- }
- RETURN_FALSE;
- }
-
- for (i = 0; i < nodesetp->nodeNr; i++) {
- xmlNodePtr node = nodesetp->nodeTab[i];
- zval *child;
- int retnode;
+ nodesetp = php_get_elements_by_tagname(nodep, name, NULL);
- /* construct a node object */
- child = php_domobject_new(node, &retnode, NULL
TSRMLS_CC);
- zend_hash_next_index_insert(Z_ARRVAL_P(rv), &child,
sizeof(zval *), NULL);
- }
+ if(nodesetp) {
+ for (i = 0; i < nodesetp->nodeNr; i++) {
+ xmlNodePtr node = nodesetp->nodeTab[i];
+ zval *child;
+ int retnode;
- break;
+ child = php_domobject_new(node, &retnode, NULL TSRMLS_CC);
+ zend_hash_next_index_insert(Z_ARRVAL_P(rv), &child,
sizeof(zval *), NULL);
}
- default:
- break;
- }
-
- xmlXPathFreeObject(xpathobjp);
- if (free_context) {
- xmlXPathFreeContext(ctxp);
}
+ xmlXPathFreeNodeSet(nodesetp);
*return_value = *rv;
FREE_ZVAL(rv);
}
@@ -3205,7 +3160,7 @@
RETURN_FALSE;
}
- nodesetp = php_get_elements_by_tagname(nodep, name, NULL);
+ nodesetp = php_get_elements_by_tagname(nodep->children, name, NULL);
if(nodesetp) {
for (i = 0; i < nodesetp->nodeNr; i++) {
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php