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