]> granicus.if.org Git - php/commitdiff
- Fixed some memleaks when using attributes
authorChristian Stocker <chregu@php.net>
Wed, 9 Apr 2003 07:29:39 +0000 (07:29 +0000)
committerChristian Stocker <chregu@php.net>
Wed, 9 Apr 2003 07:29:39 +0000 (07:29 +0000)
- Added attrnode->set_value()
(by Rob Richards)

ext/domxml/php_domxml.c
ext/domxml/php_domxml.h

index 41c25746f872ca15717a27c1ba95eab39d6f8b10..fc3b68b839a278905b2cc43ef0f3b14a44c8ccf8 100644 (file)
@@ -513,6 +513,7 @@ static zend_function_entry php_domxmlattr_class_functions[] = {
        PHP_FALIAS(name,                                        domxml_attr_name,                               NULL)
        PHP_FALIAS(value,                                       domxml_attr_value,                              NULL)
        PHP_FALIAS(specified,                           domxml_attr_specified,                  NULL)
+       PHP_FALIAS(set_value,                           domxml_attr_set_value,                  NULL)
 /*
        PHP_FALIAS(owner_element,                       domxml_attr_owner_element,              NULL)
 */
@@ -757,6 +758,8 @@ static void php_free_xml_attr(zend_rsrc_list_entry *rsrc TSRMLS_DC)
 {
        xmlNodePtr node = (xmlNodePtr) rsrc->ptr;
        if (node->parent == NULL) {
+               /* Attribute Nodes contain accessible children */
+               node_list_wrapper_dtor(node->children, 0);
                node_wrapper_dtor(node);
                xmlFreeProp((xmlAttrPtr) node);
        } else {
@@ -1818,12 +1821,42 @@ PHP_FUNCTION(domxml_attr_value)
 {
        zval *id;
        xmlAttrPtr attrp;
+       xmlChar *content;
 
        DOMXML_GET_THIS_OBJ(attrp, id, le_domxmlattrp);
 
        DOMXML_NO_ARGS();
 
-       RETURN_STRING((char *) xmlNodeGetContent((xmlNodePtr) attrp), 1);
+       /* RETURN_STRING((char *) xmlNodeGetContent((xmlNodePtr) attrp), 1); */
+       if (content = xmlNodeGetContent((xmlNodePtr) attrp)) {
+               RETVAL_STRING(content,1);
+       } else {
+               RETURN_EMPTY_STRING();
+       }
+       xmlFree(content);
+}
+/* }}} */
+
+/* {{{ proto bool domxml_attr_set_value(string content)
+   Set value of attribute */
+PHP_FUNCTION(domxml_attr_set_value)
+{
+       zval *id;
+       xmlAttrPtr attrp;
+       int content_len;
+       char *content;
+
+       DOMXML_PARAM_TWO(attrp, id, le_domxmlattrp, "s", &content, &content_len);
+
+       /*      If attribute has children unlink referenced nodes
+               Spec indicates that content is to be overwritten and not appended
+               xmlNodeSetContentLen will take care of removing and freeing the rest */
+       if (attrp->children) {
+               node_list_unlink(((xmlNodePtr) attrp) ->children);
+       }
+       xmlNodeSetContentLen((xmlNodePtr) attrp, content, content_len);
+       RETURN_TRUE;
+
 }
 /* }}} */
 
@@ -1869,12 +1902,19 @@ PHP_FUNCTION(domxml_pi_data)
 {
        zval *id;
        xmlNodePtr nodep;
+       xmlChar *content;
 
        DOMXML_GET_THIS_OBJ(nodep, id, le_domxmlpip);
 
        DOMXML_NO_ARGS();
 
-       RETURN_STRING(xmlNodeGetContent(nodep), 1);
+       /* RETURN_STRING(xmlNodeGetContent(nodep), 1); */
+       if (content = xmlNodeGetContent(nodep)) {
+               RETVAL_STRING(content,1);
+       } else {
+               RETURN_EMPTY_STRING();
+       }
+       xmlFree(content);
 }
 /* }}} */
 
index e7c6c8632379b3f9d989e4a292423e80b53b513c..b1b0cdb54180dbb3820296eb5b4f4338ef503bff 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    +----------------------------------------------------------------------+
    | PHP Version 4                                                        |
    +----------------------------------------------------------------------+
@@ -165,6 +165,7 @@ PHP_FUNCTION(domxml_is_blank_node);
 PHP_FUNCTION(domxml_attr_name);
 PHP_FUNCTION(domxml_attr_value);
 PHP_FUNCTION(domxml_attr_specified);
+PHP_FUNCTION(domxml_attr_set_value);
 
 /* Class Element methods */
 PHP_FUNCTION(domxml_elem_tagname);