rrichards Wed Feb 18 15:37:31 2004 EDT Modified files: /php-src/ext/dom node.c Log: correct implementation of prefix write property http://cvs.php.net/diff.php/php-src/ext/dom/node.c?r1=1.25&r2=1.26&ty=u Index: php-src/ext/dom/node.c diff -u php-src/ext/dom/node.c:1.25 php-src/ext/dom/node.c:1.26 --- php-src/ext/dom/node.c:1.25 Tue Feb 17 06:13:47 2004 +++ php-src/ext/dom/node.c Wed Feb 18 15:37:30 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: node.c,v 1.25 2004/02/17 11:13:47 rrichards Exp $ */ +/* $Id: node.c,v 1.26 2004/02/18 20:37:30 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -674,9 +674,8 @@ int dom_node_prefix_write(dom_object *obj, zval *newval TSRMLS_DC) { zval value_copy; - xmlNode *nodep; - xmlDocPtr doc; - xmlNsPtr ns, curns = NULL; + xmlNode *nodep, *nsnode = NULL; + xmlNsPtr ns = NULL, curns; char *strURI; char *prefix; @@ -689,7 +688,14 @@ switch (nodep->type) { case XML_ELEMENT_NODE: + nsnode = nodep; case XML_ATTRIBUTE_NODE: + if (nsnode == NULL) { + nsnode = nodep->parent; + if (nsnode == NULL) { + nsnode = xmlDocGetRootElement(nodep->doc); + } + } if (newval->type != IS_STRING) { if(newval->refcount > 1) { value_copy = *newval; @@ -699,38 +705,37 @@ convert_to_string(newval); } prefix = Z_STRVAL_P(newval); - if (nodep->ns != NULL && !xmlStrEqual(nodep->ns->prefix, (xmlChar *)prefix)) { + if (nsnode && nodep->ns != NULL && !xmlStrEqual(nodep->ns->prefix, (xmlChar *)prefix)) { strURI = (char *) nodep->ns->href; if (strURI == NULL || (!strcmp (prefix, "xml") && strcmp(strURI, XML_XML_NAMESPACE)) || (nodep->type == XML_ATTRIBUTE_NODE && !strcmp (prefix, "xmlns") && strcmp (strURI, DOM_XMLNS_NAMESPACE)) || (nodep->type == XML_ATTRIBUTE_NODE && !strcmp (nodep->name, "xmlns"))) { - if (newval == &value_copy) { - zval_dtor(newval); + ns = NULL; + } else { + curns = nsnode->nsDef; + while (curns != NULL) { + if (xmlStrEqual((xmlChar *)prefix, curns->prefix) && xmlStrEqual(nodep->ns->href, curns->href)) { + ns = curns; + break; + } + curns = curns->next; } - php_dom_throw_error(NAMESPACE_ERR, dom_get_strict_error(obj->document) TSRMLS_CC); - return FAILURE; - } - ns = xmlNewNs(NULL, nodep->ns->href, (xmlChar *)prefix); - if (nodep->doc != NULL) { - doc = nodep->doc; - if (doc->oldNs == NULL) { - doc->oldNs = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); - memset(doc->oldNs, 0, sizeof(xmlNs)); - doc->oldNs->type = XML_LOCAL_NAMESPACE; - doc->oldNs->href = xmlStrdup(XML_XML_NAMESPACE); - doc->oldNs->prefix = xmlStrdup((const xmlChar *)"xml"); + if (ns == NULL) { + ns = xmlNewNs(nsnode, nodep->ns->href, (xmlChar *)prefix); } + } - curns = doc->oldNs; - while (curns->next != NULL) { - curns = curns->next; + if (ns == NULL) { + if (newval == &value_copy) { + zval_dtor(newval); } - curns->next = ns; + php_dom_throw_error(NAMESPACE_ERR, dom_get_strict_error(obj->document) TSRMLS_CC); + return FAILURE; } - nodep->ns = curns; + xmlSetNs(nodep, ns); } if (newval == &value_copy) { zval_dtor(newval);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php