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