PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LCOV - code coverage report
Current view: top level - ext/dom - element.c (source / functions) Hit Total Coverage
Test: PHP Code Coverage Lines: 371 510 72.7 %
Date: 2019-05-06 Functions: 24 24 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :    +----------------------------------------------------------------------+
       3             :    | PHP Version 7                                                        |
       4             :    +----------------------------------------------------------------------+
       5             :    | Copyright (c) The PHP Group                                          |
       6             :    +----------------------------------------------------------------------+
       7             :    | This source file is subject to version 3.01 of the PHP license,      |
       8             :    | that is bundled with this package in the file LICENSE, and is        |
       9             :    | available through the world-wide-web at the following url:           |
      10             :    | http://www.php.net/license/3_01.txt                                  |
      11             :    | If you did not receive a copy of the PHP license and are unable to   |
      12             :    | obtain it through the world-wide-web, please send a note to          |
      13             :    | license@php.net so we can mail you a copy immediately.               |
      14             :    +----------------------------------------------------------------------+
      15             :    | Authors: Christian Stocker <chregu@php.net>                          |
      16             :    |          Rob Richards <rrichards@php.net>                            |
      17             :    +----------------------------------------------------------------------+
      18             : */
      19             : 
      20             : #ifdef HAVE_CONFIG_H
      21             : #include "config.h"
      22             : #endif
      23             : 
      24             : #include "php.h"
      25             : #if HAVE_LIBXML && HAVE_DOM
      26             : #include "php_dom.h"
      27             : 
      28             : /* {{{ arginfo */
      29             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_get_attribute, 0, 0, 1)
      30             :         ZEND_ARG_INFO(0, name)
      31             : ZEND_END_ARG_INFO();
      32             : 
      33             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_attribute, 0, 0, 2)
      34             :         ZEND_ARG_INFO(0, name)
      35             :         ZEND_ARG_INFO(0, value)
      36             : ZEND_END_ARG_INFO();
      37             : 
      38             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_remove_attribute, 0, 0, 1)
      39             :         ZEND_ARG_INFO(0, name)
      40             : ZEND_END_ARG_INFO();
      41             : 
      42             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_get_attribute_node, 0, 0, 1)
      43             :         ZEND_ARG_INFO(0, name)
      44             : ZEND_END_ARG_INFO();
      45             : 
      46             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_attribute_node, 0, 0, 1)
      47             :         ZEND_ARG_OBJ_INFO(0, newAttr, DOMAttr, 0)
      48             : ZEND_END_ARG_INFO();
      49             : 
      50             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_remove_attribute_node, 0, 0, 1)
      51             :         ZEND_ARG_OBJ_INFO(0, oldAttr, DOMAttr, 0)
      52             : ZEND_END_ARG_INFO();
      53             : 
      54             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_get_elements_by_tag_name, 0, 0, 1)
      55             :         ZEND_ARG_INFO(0, name)
      56             : ZEND_END_ARG_INFO();
      57             : 
      58             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_get_attribute_ns, 0, 0, 2)
      59             :         ZEND_ARG_INFO(0, namespaceURI)
      60             :         ZEND_ARG_INFO(0, localName)
      61             : ZEND_END_ARG_INFO();
      62             : 
      63             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_attribute_ns, 0, 0, 3)
      64             :         ZEND_ARG_INFO(0, namespaceURI)
      65             :         ZEND_ARG_INFO(0, qualifiedName)
      66             :         ZEND_ARG_INFO(0, value)
      67             : ZEND_END_ARG_INFO();
      68             : 
      69             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_remove_attribute_ns, 0, 0, 2)
      70             :         ZEND_ARG_INFO(0, namespaceURI)
      71             :         ZEND_ARG_INFO(0, localName)
      72             : ZEND_END_ARG_INFO();
      73             : 
      74             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_get_attribute_node_ns, 0, 0, 2)
      75             :         ZEND_ARG_INFO(0, namespaceURI)
      76             :         ZEND_ARG_INFO(0, localName)
      77             : ZEND_END_ARG_INFO();
      78             : 
      79             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_attribute_node_ns, 0, 0, 1)
      80             :         ZEND_ARG_OBJ_INFO(0, newAttr, DOMAttr, 0)
      81             : ZEND_END_ARG_INFO();
      82             : 
      83             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_get_elements_by_tag_name_ns, 0, 0, 2)
      84             :         ZEND_ARG_INFO(0, namespaceURI)
      85             :         ZEND_ARG_INFO(0, localName)
      86             : ZEND_END_ARG_INFO();
      87             : 
      88             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_has_attribute, 0, 0, 1)
      89             :         ZEND_ARG_INFO(0, name)
      90             : ZEND_END_ARG_INFO();
      91             : 
      92             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_has_attribute_ns, 0, 0, 2)
      93             :         ZEND_ARG_INFO(0, namespaceURI)
      94             :         ZEND_ARG_INFO(0, localName)
      95             : ZEND_END_ARG_INFO();
      96             : 
      97             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_id_attribute, 0, 0, 2)
      98             :         ZEND_ARG_INFO(0, name)
      99             :         ZEND_ARG_INFO(0, isId)
     100             : ZEND_END_ARG_INFO();
     101             : 
     102             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_id_attribute_ns, 0, 0, 3)
     103             :         ZEND_ARG_INFO(0, namespaceURI)
     104             :         ZEND_ARG_INFO(0, localName)
     105             :         ZEND_ARG_INFO(0, isId)
     106             : ZEND_END_ARG_INFO();
     107             : 
     108             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_id_attribute_node, 0, 0, 2)
     109             :         ZEND_ARG_OBJ_INFO(0, attr, DOMAttr, 0)
     110             :         ZEND_ARG_INFO(0, isId)
     111             : ZEND_END_ARG_INFO();
     112             : 
     113             : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_construct, 0, 0, 1)
     114             :         ZEND_ARG_INFO(0, name)
     115             :         ZEND_ARG_INFO(0, value)
     116             :         ZEND_ARG_INFO(0, uri)
     117             : ZEND_END_ARG_INFO();
     118             : /* }}} */
     119             : 
     120             : /*
     121             : * class DOMElement extends DOMNode
     122             : *
     123             : * URL: https://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-745549614
     124             : * Since:
     125             : */
     126             : 
     127             : const zend_function_entry php_dom_element_class_functions[] = { /* {{{ */
     128             :         PHP_FALIAS(getAttribute, dom_element_get_attribute, arginfo_dom_element_get_attribute)
     129             :         PHP_FALIAS(setAttribute, dom_element_set_attribute, arginfo_dom_element_set_attribute)
     130             :         PHP_FALIAS(removeAttribute, dom_element_remove_attribute, arginfo_dom_element_remove_attribute)
     131             :         PHP_FALIAS(getAttributeNode, dom_element_get_attribute_node, arginfo_dom_element_get_attribute_node)
     132             :         PHP_FALIAS(setAttributeNode, dom_element_set_attribute_node, arginfo_dom_element_set_attribute_node)
     133             :         PHP_FALIAS(removeAttributeNode, dom_element_remove_attribute_node, arginfo_dom_element_remove_attribute_node)
     134             :         PHP_FALIAS(getElementsByTagName, dom_element_get_elements_by_tag_name, arginfo_dom_element_get_elements_by_tag_name)
     135             :         PHP_FALIAS(getAttributeNS, dom_element_get_attribute_ns, arginfo_dom_element_get_attribute_ns)
     136             :         PHP_FALIAS(setAttributeNS, dom_element_set_attribute_ns, arginfo_dom_element_set_attribute_ns)
     137             :         PHP_FALIAS(removeAttributeNS, dom_element_remove_attribute_ns, arginfo_dom_element_remove_attribute_ns)
     138             :         PHP_FALIAS(getAttributeNodeNS, dom_element_get_attribute_node_ns, arginfo_dom_element_get_attribute_node_ns)
     139             :         PHP_FALIAS(setAttributeNodeNS, dom_element_set_attribute_node_ns, arginfo_dom_element_set_attribute_node_ns)
     140             :         PHP_FALIAS(getElementsByTagNameNS, dom_element_get_elements_by_tag_name_ns, arginfo_dom_element_get_elements_by_tag_name_ns)
     141             :         PHP_FALIAS(hasAttribute, dom_element_has_attribute, arginfo_dom_element_has_attribute)
     142             :         PHP_FALIAS(hasAttributeNS, dom_element_has_attribute_ns, arginfo_dom_element_has_attribute_ns)
     143             :         PHP_FALIAS(setIdAttribute, dom_element_set_id_attribute, arginfo_dom_element_set_id_attribute)
     144             :         PHP_FALIAS(setIdAttributeNS, dom_element_set_id_attribute_ns, arginfo_dom_element_set_id_attribute_ns)
     145             :         PHP_FALIAS(setIdAttributeNode, dom_element_set_id_attribute_node, arginfo_dom_element_set_id_attribute_node)
     146             :         PHP_ME(domelement, __construct, arginfo_dom_element_construct, ZEND_ACC_PUBLIC)
     147             :         PHP_FE_END
     148             : };
     149             : /* }}} */
     150             : 
     151             : /* {{{ proto DOMElement::__construct(string name, [string value], [string uri]) */
     152          37 : PHP_METHOD(domelement, __construct)
     153             : {
     154          37 :         xmlNodePtr nodep = NULL, oldnode = NULL;
     155             :         dom_object *intern;
     156          37 :         char *name, *value = NULL, *uri = NULL;
     157          37 :         char *localname = NULL, *prefix = NULL;
     158          37 :         int errorcode = 0;
     159          37 :         size_t name_len, value_len = 0, uri_len = 0;
     160             :         int name_valid;
     161          37 :         xmlNsPtr nsptr = NULL;
     162             : 
     163          37 :         if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "s|s!s", &name, &name_len, &value, &value_len, &uri, &uri_len) == FAILURE) {
     164          12 :                 return;
     165             :         }
     166             : 
     167          37 :         name_valid = xmlValidateName((xmlChar *) name, 0);
     168          37 :         if (name_valid != 0) {
     169           4 :                 php_dom_throw_error(INVALID_CHARACTER_ERR, 1);
     170           4 :                 RETURN_FALSE;
     171             :         }
     172             : 
     173             :         /* Namespace logic is separate and only when uri passed in to insure no BC breakage */
     174          33 :         if (uri_len > 0) {
     175          12 :                 errorcode = dom_check_qname(name, &localname, &prefix, uri_len, name_len);
     176          12 :                 if (errorcode == 0) {
     177          10 :                         nodep = xmlNewNode (NULL, (xmlChar *)localname);
     178          10 :                         if (nodep != NULL && uri != NULL) {
     179          10 :                                 nsptr = dom_get_ns(nodep, uri, &errorcode, prefix);
     180          10 :                                 xmlSetNs(nodep, nsptr);
     181             :                         }
     182             :                 }
     183          12 :                 xmlFree(localname);
     184          12 :                 if (prefix != NULL) {
     185          11 :                         xmlFree(prefix);
     186             :                 }
     187          12 :                 if (errorcode != 0) {
     188           6 :                         if (nodep != NULL) {
     189           4 :                                 xmlFreeNode(nodep);
     190             :                         }
     191           6 :                         php_dom_throw_error(errorcode, 1);
     192           6 :                         RETURN_FALSE;
     193             :                 }
     194             :         } else {
     195             :             /* If you don't pass a namespace uri, then you can't set a prefix */
     196          21 :             localname = (char *) xmlSplitQName2((xmlChar *) name, (xmlChar **) &prefix);
     197          21 :             if (prefix != NULL) {
     198           2 :                         xmlFree(localname);
     199           2 :                         xmlFree(prefix);
     200           2 :                 php_dom_throw_error(NAMESPACE_ERR, 1);
     201           2 :                 RETURN_FALSE;
     202             :             }
     203          19 :                 nodep = xmlNewNode(NULL, (xmlChar *) name);
     204             :         }
     205             : 
     206          25 :         if (!nodep) {
     207           0 :                 php_dom_throw_error(INVALID_STATE_ERR, 1);
     208           0 :                 RETURN_FALSE;
     209             :         }
     210             : 
     211          25 :         if (value_len > 0) {
     212           3 :                 xmlNodeSetContentLen(nodep, (xmlChar *) value, value_len);
     213             :         }
     214             : 
     215          25 :         intern = Z_DOMOBJ_P(ZEND_THIS);
     216          25 :         oldnode = dom_object_get_node(intern);
     217          25 :         if (oldnode != NULL) {
     218           0 :                 php_libxml_node_free_resource(oldnode );
     219             :         }
     220          25 :         php_libxml_increment_node_ptr((php_libxml_node_object *)intern, nodep, (void *)intern);
     221             : }
     222             : /* }}} end DOMElement::__construct */
     223             : 
     224             : /* {{{ tagName  string
     225             : readonly=yes
     226             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-104682815
     227             : Since:
     228             : */
     229           6 : int dom_element_tag_name_read(dom_object *obj, zval *retval)
     230             : {
     231             :         xmlNodePtr nodep;
     232             :         xmlNsPtr ns;
     233             :         xmlChar *qname;
     234             : 
     235           6 :         nodep = dom_object_get_node(obj);
     236             : 
     237           6 :         if (nodep == NULL) {
     238           0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0);
     239           0 :                 return FAILURE;
     240             :         }
     241             : 
     242           6 :         ns = nodep->ns;
     243           6 :         if (ns != NULL && ns->prefix) {
     244           0 :                 qname = xmlStrdup(ns->prefix);
     245           0 :                 qname = xmlStrcat(qname, (xmlChar *)":");
     246           0 :                 qname = xmlStrcat(qname, nodep->name);
     247           0 :                 ZVAL_STRING(retval, (char *)qname);
     248           0 :                 xmlFree(qname);
     249             :         } else {
     250          12 :                 ZVAL_STRING(retval, (char *) nodep->name);
     251             :         }
     252             : 
     253           6 :         return SUCCESS;
     254             : }
     255             : 
     256             : /* }}} */
     257             : 
     258             : /* {{{ schemaTypeInfo   typeinfo
     259             : readonly=yes
     260             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Element-schemaTypeInfo
     261             : Since: DOM Level 3
     262             : */
     263           3 : int dom_element_schema_type_info_read(dom_object *obj, zval *retval)
     264             : {
     265           3 :         ZVAL_NULL(retval);
     266           3 :         return SUCCESS;
     267             : }
     268             : 
     269             : /* }}} */
     270             : 
     271          86 : static xmlNodePtr dom_get_dom1_attribute(xmlNodePtr elem, xmlChar *name) /* {{{ */
     272             : {
     273             :     int len;
     274             :     const xmlChar *nqname;
     275             : 
     276          86 :         nqname = xmlSplitQName3(name, &len);
     277          86 :         if (nqname != NULL) {
     278             :                 xmlNsPtr ns;
     279          12 :                 xmlChar *prefix = xmlStrndup(name, len);
     280          12 :                 if (prefix && xmlStrEqual(prefix, (xmlChar *)"xmlns")) {
     281           2 :                         ns = elem->nsDef;
     282           5 :                         while (ns) {
     283           2 :                                 if (xmlStrEqual(ns->prefix, nqname)) {
     284           1 :                                         break;
     285             :                                 }
     286           1 :                                 ns = ns->next;
     287             :                         }
     288           2 :                         xmlFree(prefix);
     289           2 :                         return (xmlNodePtr)ns;
     290             :                 }
     291          10 :                 ns = xmlSearchNs(elem->doc, elem, prefix);
     292          10 :                 if (prefix != NULL) {
     293          10 :                         xmlFree(prefix);
     294             :                 }
     295          10 :                 if (ns != NULL) {
     296           8 :                         return (xmlNodePtr)xmlHasNsProp(elem, nqname, ns->href);
     297             :                 }
     298             :         } else {
     299          74 :                 if (xmlStrEqual(name, (xmlChar *)"xmlns")) {
     300           2 :                         xmlNsPtr nsPtr = elem->nsDef;
     301           4 :                         while (nsPtr) {
     302           1 :                                 if (nsPtr->prefix == NULL) {
     303           1 :                                         return (xmlNodePtr)nsPtr;
     304             :                                 }
     305           0 :                                 nsPtr = nsPtr->next;
     306             :                         }
     307           1 :                         return NULL;
     308             :                 }
     309             :         }
     310          74 :         return (xmlNodePtr)xmlHasNsProp(elem, name, NULL);
     311             : }
     312             : /* }}} */
     313             : 
     314             : /* {{{ proto string dom_element_get_attribute(string name);
     315             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-666EE0F9
     316             : Since:
     317             : */
     318          36 : PHP_FUNCTION(dom_element_get_attribute)
     319             : {
     320             :         zval *id;
     321             :         xmlNode *nodep;
     322             :         char *name;
     323          36 :         xmlChar *value = NULL;
     324             :         dom_object *intern;
     325             :         xmlNodePtr attr;
     326             :         size_t name_len;
     327             : 
     328          36 :         id = ZEND_THIS;
     329          36 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
     330           8 :                 return;
     331             :         }
     332             : 
     333          36 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
     334             : 
     335          36 :         attr = dom_get_dom1_attribute(nodep, (xmlChar *)name);
     336          36 :         if (attr) {
     337          28 :                 switch (attr->type) {
     338          26 :                         case XML_ATTRIBUTE_NODE:
     339          26 :                                 value = xmlNodeListGetString(attr->doc, attr->children, 1);
     340          26 :                                 break;
     341           2 :                         case XML_NAMESPACE_DECL:
     342           2 :                                 value = xmlStrdup(((xmlNsPtr)attr)->href);
     343           2 :                                 break;
     344           0 :                         default:
     345           0 :                                 value = xmlStrdup(((xmlAttributePtr)attr)->defaultValue);
     346             :                 }
     347           8 :         }
     348             : 
     349          36 :         if (value == NULL) {
     350           8 :                 RETURN_EMPTY_STRING();
     351             :         } else {
     352          56 :                 RETVAL_STRING((char *)value);
     353          28 :                 xmlFree(value);
     354             :         }
     355             : }
     356             : /* }}} end dom_element_get_attribute */
     357             : 
     358             : /* {{{ proto void dom_element_set_attribute(string name, string value);
     359             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68F082
     360             : Since:
     361             : */
     362          28 : PHP_FUNCTION(dom_element_set_attribute)
     363             : {
     364             :         zval *id;
     365             :         xmlNode *nodep;
     366          28 :         xmlNodePtr attr = NULL;
     367             :         int ret, name_valid;
     368             :         size_t name_len, value_len;
     369             :         dom_object *intern;
     370             :         char *name, *value;
     371             : 
     372          28 :         id = ZEND_THIS;
     373          28 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &name, &name_len, &value, &value_len) == FAILURE) {
     374           1 :                 return;
     375             :         }
     376             : 
     377          28 :         if (name_len == 0) {
     378           0 :                 php_error_docref(NULL, E_WARNING, "Attribute Name is required");
     379           0 :                 RETURN_FALSE;
     380             :         }
     381             : 
     382          28 :         name_valid = xmlValidateName((xmlChar *) name, 0);
     383          28 :         if (name_valid != 0) {
     384           1 :                 php_dom_throw_error(INVALID_CHARACTER_ERR, 1);
     385           1 :                 RETURN_FALSE;
     386             :         }
     387             : 
     388          27 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
     389             : 
     390          27 :         if (dom_node_is_read_only(nodep) == SUCCESS) {
     391           0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document));
     392           0 :                 RETURN_FALSE;
     393             :         }
     394             : 
     395          27 :         attr = dom_get_dom1_attribute(nodep, (xmlChar *)name);
     396          27 :         if (attr != NULL) {
     397          10 :                 switch (attr->type) {
     398          10 :                         case XML_ATTRIBUTE_NODE:
     399          10 :                                 node_list_unlink(attr->children);
     400          10 :                                 break;
     401           0 :                         case XML_NAMESPACE_DECL:
     402           0 :                                 RETURN_FALSE;
     403           0 :                         default:
     404           0 :                                 break;
     405             :                 }
     406             : 
     407          17 :         }
     408             : 
     409          27 :         if (xmlStrEqual((xmlChar *)name, (xmlChar *)"xmlns")) {
     410           0 :                 if (xmlNewNs(nodep, (xmlChar *)value, NULL)) {
     411           0 :                         RETURN_TRUE;
     412             :                 }
     413             :         } else {
     414          27 :                 attr = (xmlNodePtr)xmlSetProp(nodep, (xmlChar *) name, (xmlChar *)value);
     415             :         }
     416          27 :         if (!attr) {
     417           0 :                 php_error_docref(NULL, E_WARNING, "No such attribute '%s'", name);
     418           0 :                 RETURN_FALSE;
     419             :         }
     420             : 
     421          27 :         DOM_RET_OBJ(attr, &ret, intern);
     422             : 
     423             : }
     424             : /* }}} end dom_element_set_attribute */
     425             : 
     426             : /* {{{ proto void dom_element_remove_attribute(string name);
     427             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D6AC0F9
     428             : Since:
     429             : */
     430           4 : PHP_FUNCTION(dom_element_remove_attribute)
     431             : {
     432             :         zval *id;
     433             :         xmlNodePtr nodep, attrp;
     434             :         dom_object *intern;
     435             :         size_t name_len;
     436             :         char *name;
     437             : 
     438           4 :         id = ZEND_THIS;
     439           4 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
     440           0 :                 return;
     441             :         }
     442             : 
     443           4 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
     444             : 
     445           4 :         if (dom_node_is_read_only(nodep) == SUCCESS) {
     446           0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document));
     447           0 :                 RETURN_FALSE;
     448             :         }
     449             : 
     450           4 :         attrp = dom_get_dom1_attribute(nodep, (xmlChar *)name);
     451           4 :         if (attrp == NULL) {
     452           0 :                 RETURN_FALSE;
     453             :         }
     454             : 
     455           4 :         switch (attrp->type) {
     456           4 :                 case XML_ATTRIBUTE_NODE:
     457           4 :                         if (php_dom_object_get_data(attrp) == NULL) {
     458           3 :                         node_list_unlink(attrp->children);
     459           3 :                                 xmlUnlinkNode(attrp);
     460           3 :                                 xmlFreeProp((xmlAttrPtr)attrp);
     461             :                 } else {
     462           1 :                                 xmlUnlinkNode(attrp);
     463             :                 }
     464           4 :                         break;
     465           0 :                 case XML_NAMESPACE_DECL:
     466           0 :                         RETURN_FALSE;
     467           0 :                 default:
     468           0 :                         break;
     469             :         }
     470             : 
     471           4 :         RETURN_TRUE;
     472             : }
     473             : /* }}} end dom_element_remove_attribute */
     474             : 
     475             : /* {{{ proto DOMAttr dom_element_get_attribute_node(string name);
     476             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-217A91B8
     477             : Since:
     478             : */
     479           8 : PHP_FUNCTION(dom_element_get_attribute_node)
     480             : {
     481             :         zval *id;
     482             :         xmlNodePtr nodep, attrp;
     483             :         size_t name_len;
     484             :         int ret;
     485             :         dom_object *intern;
     486             :         char *name;
     487             : 
     488           8 :         id = ZEND_THIS;
     489           8 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
     490           0 :                 return;
     491             :         }
     492             : 
     493           8 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
     494             : 
     495           8 :         attrp = dom_get_dom1_attribute(nodep, (xmlChar *)name);
     496           8 :         if (attrp == NULL) {
     497           0 :                 RETURN_FALSE;
     498             :         }
     499             : 
     500           8 :         if (attrp->type == XML_NAMESPACE_DECL) {
     501             :                 xmlNsPtr curns;
     502             :                 xmlNodePtr nsparent;
     503             : 
     504           0 :                 nsparent = attrp->_private;
     505           0 :                 curns = xmlNewNs(NULL, attrp->name, NULL);
     506           0 :                 if (attrp->children) {
     507           0 :                         curns->prefix = xmlStrdup((xmlChar *) attrp->children);
     508             :                 }
     509           0 :                 if (attrp->children) {
     510           0 :                         attrp = xmlNewDocNode(nodep->doc, NULL, (xmlChar *) attrp->children, attrp->name);
     511             :                 } else {
     512           0 :                         attrp = xmlNewDocNode(nodep->doc, NULL, (xmlChar *)"xmlns", attrp->name);
     513             :                 }
     514           0 :                 attrp->type = XML_NAMESPACE_DECL;
     515           0 :                 attrp->parent = nsparent;
     516           0 :                 attrp->ns = curns;
     517             :         }
     518             : 
     519           8 :         DOM_RET_OBJ((xmlNodePtr) attrp, &ret, intern);
     520             : }
     521             : /* }}} end dom_element_get_attribute_node */
     522             : 
     523             : /* {{{ proto DOMAttr dom_element_set_attribute_node(DOMAttr newAttr);
     524             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-887236154
     525             : Since:
     526             : */
     527           4 : PHP_FUNCTION(dom_element_set_attribute_node)
     528             : {
     529             :         zval *id, *node;
     530             :         xmlNode *nodep;
     531           4 :         xmlAttr *attrp, *existattrp = NULL;
     532             :         dom_object *intern, *attrobj, *oldobj;
     533             :         int ret;
     534             : 
     535           4 :         id = ZEND_THIS;
     536           4 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &node, dom_attr_class_entry) == FAILURE) {
     537           2 :                 return;
     538             :         }
     539             : 
     540           4 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
     541             : 
     542           4 :         if (dom_node_is_read_only(nodep) == SUCCESS) {
     543           0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document));
     544           0 :                 RETURN_FALSE;
     545             :         }
     546             : 
     547           4 :         DOM_GET_OBJ(attrp, node, xmlAttrPtr, attrobj);
     548             : 
     549           4 :         if (attrp->type != XML_ATTRIBUTE_NODE) {
     550           0 :                 php_error_docref(NULL, E_WARNING, "Attribute node is required");
     551           0 :                 RETURN_FALSE;
     552             :         }
     553             : 
     554           4 :         if (!(attrp->doc == NULL || attrp->doc == nodep->doc)) {
     555           1 :                 php_dom_throw_error(WRONG_DOCUMENT_ERR, dom_get_strict_error(intern->document));
     556           1 :                 RETURN_FALSE;
     557             :         }
     558             : 
     559           3 :         existattrp = xmlHasProp(nodep, attrp->name);
     560           3 :         if (existattrp != NULL && existattrp->type != XML_ATTRIBUTE_DECL) {
     561           2 :                 if ((oldobj = php_dom_object_get_data((xmlNodePtr) existattrp)) != NULL &&
     562           1 :                         ((php_libxml_node_ptr *)oldobj->ptr)->node == (xmlNodePtr) attrp)
     563             :                 {
     564           1 :                         RETURN_NULL();
     565             :                 }
     566           0 :                 xmlUnlinkNode((xmlNodePtr) existattrp);
     567             :         }
     568             : 
     569           2 :         if (attrp->parent != NULL) {
     570           1 :                 xmlUnlinkNode((xmlNodePtr) attrp);
     571             :         }
     572             : 
     573           2 :         if (attrp->doc == NULL && nodep->doc != NULL) {
     574           1 :                 attrobj->document = intern->document;
     575           1 :                 php_libxml_increment_doc_ref((php_libxml_node_object *)attrobj, NULL);
     576             :         }
     577             : 
     578           2 :         xmlAddChild(nodep, (xmlNodePtr) attrp);
     579             : 
     580             :         /* Returns old property if removed otherwise NULL */
     581           2 :         if (existattrp != NULL) {
     582           0 :                 DOM_RET_OBJ((xmlNodePtr) existattrp, &ret, intern);
     583             :         } else {
     584           2 :                 RETVAL_NULL();
     585             :         }
     586             : 
     587             : }
     588             : /* }}} end dom_element_set_attribute_node */
     589             : 
     590             : /* {{{ proto DOMAttr dom_element_remove_attribute_node(DOMAttr oldAttr);
     591             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D589198
     592             : Since:
     593             : */
     594           1 : PHP_FUNCTION(dom_element_remove_attribute_node)
     595             : {
     596             :         zval *id, *node;
     597             :         xmlNode *nodep;
     598             :         xmlAttr *attrp;
     599             :         dom_object *intern, *attrobj;
     600             :         int ret;
     601             : 
     602           1 :         id = ZEND_THIS;
     603           1 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &node, dom_attr_class_entry) == FAILURE) {
     604           0 :                 return;
     605             :         }
     606             : 
     607           1 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
     608             : 
     609           1 :         if (dom_node_is_read_only(nodep) == SUCCESS) {
     610           0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document));
     611           0 :                 RETURN_FALSE;
     612             :         }
     613             : 
     614           1 :         DOM_GET_OBJ(attrp, node, xmlAttrPtr, attrobj);
     615             : 
     616           1 :         if (attrp->type != XML_ATTRIBUTE_NODE || attrp->parent != nodep) {
     617           0 :                 php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document));
     618           0 :                 RETURN_FALSE;
     619             :         }
     620             : 
     621           1 :         xmlUnlinkNode((xmlNodePtr) attrp);
     622             : 
     623           1 :         DOM_RET_OBJ((xmlNodePtr) attrp, &ret, intern);
     624             : 
     625             : }
     626             : /* }}} end dom_element_remove_attribute_node */
     627             : 
     628             : /* {{{ proto DOMNodeList dom_element_get_elements_by_tag_name(string name);
     629             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1938918D
     630             : Since:
     631             : */
     632           5 : PHP_FUNCTION(dom_element_get_elements_by_tag_name)
     633             : {
     634             :         zval *id;
     635             :         xmlNodePtr elemp;
     636             :         size_t name_len;
     637             :         dom_object *intern, *namednode;
     638             :         char *name;
     639             :         xmlChar *local;
     640             : 
     641           5 :         id = ZEND_THIS;
     642           5 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
     643           0 :                 return;
     644             :         }
     645             : 
     646           5 :         DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
     647             : 
     648           5 :         php_dom_create_interator(return_value, DOM_NODELIST);
     649           5 :         namednode = Z_DOMOBJ_P(return_value);
     650           5 :         local = xmlCharStrndup(name, name_len);
     651           5 :         dom_namednode_iter(intern, 0, namednode, NULL, local, NULL);
     652             : }
     653             : /* }}} end dom_element_get_elements_by_tag_name */
     654             : 
     655             : /* {{{ proto string dom_element_get_attribute_ns(string namespaceURI, string localName);
     656             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElGetAttrNS
     657             : Since: DOM Level 2
     658             : */
     659           7 : PHP_FUNCTION(dom_element_get_attribute_ns)
     660             : {
     661             :         zval *id;
     662             :         xmlNodePtr elemp;
     663             :         xmlNsPtr nsptr;
     664             :         dom_object *intern;
     665           7 :         size_t uri_len = 0, name_len = 0;
     666             :         char *uri, *name;
     667             :         xmlChar *strattr;
     668             : 
     669           7 :         id = ZEND_THIS;
     670           7 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!s", &uri, &uri_len, &name, &name_len) == FAILURE) {
     671           0 :                 return;
     672             :         }
     673             : 
     674           7 :         DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
     675             : 
     676           7 :         strattr = xmlGetNsProp(elemp, (xmlChar *) name, (xmlChar *) uri);
     677             : 
     678           7 :         if (strattr != NULL) {
     679          10 :                 RETVAL_STRING((char *)strattr);
     680           5 :                 xmlFree(strattr);
     681             :         } else {
     682           2 :                 if (xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
     683           0 :                         nsptr = dom_get_nsdecl(elemp, (xmlChar *)name);
     684           0 :                         if (nsptr != NULL) {
     685           0 :                                 RETVAL_STRING((char *) nsptr->href);
     686             :                         } else {
     687           0 :                                 RETVAL_EMPTY_STRING();
     688             :                         }
     689             :                 } else {
     690           2 :                         RETVAL_EMPTY_STRING();
     691             :                 }
     692             :         }
     693             : 
     694             : }
     695             : /* }}} end dom_element_get_attribute_ns */
     696             : 
     697           1 : static xmlNsPtr _dom_new_reconNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns) /* {{{ */
     698             : {
     699             :     xmlNsPtr def;
     700             :     xmlChar prefix[50];
     701           1 :     int counter = 1;
     702             : 
     703           1 :         if ((tree == NULL) || (ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) {
     704           0 :                 return NULL;
     705             :         }
     706             : 
     707             :         /* Code taken from libxml2 (2.6.20) xmlNewReconciliedNs
     708             :          *
     709             :          * Find a close prefix which is not already in use.
     710             :          * Let's strip namespace prefixes longer than 20 chars !
     711             :          */
     712           1 :         if (ns->prefix == NULL)
     713           1 :                 snprintf((char *) prefix, sizeof(prefix), "default");
     714             :         else
     715           0 :                 snprintf((char *) prefix, sizeof(prefix), "%.20s", (char *)ns->prefix);
     716             : 
     717           1 :         def = xmlSearchNs(doc, tree, prefix);
     718           2 :         while (def != NULL) {
     719           0 :                 if (counter > 1000) return(NULL);
     720           0 :                 if (ns->prefix == NULL)
     721           0 :                         snprintf((char *) prefix, sizeof(prefix), "default%d", counter++);
     722             :                 else
     723           0 :                         snprintf((char *) prefix, sizeof(prefix), "%.20s%d",
     724           0 :                         (char *)ns->prefix, counter++);
     725           0 :                 def = xmlSearchNs(doc, tree, prefix);
     726             :         }
     727             : 
     728             :         /*
     729             :          * OK, now we are ready to create a new one.
     730             :          */
     731           1 :         def = xmlNewNs(tree, ns->href, prefix);
     732           1 :         return(def);
     733             : }
     734             : /* }}} */
     735             : 
     736             : /* {{{ proto void dom_element_set_attribute_ns(string namespaceURI, string qualifiedName, string value);
     737             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetAttrNS
     738             : Since: DOM Level 2
     739             : */
     740           9 : PHP_FUNCTION(dom_element_set_attribute_ns)
     741             : {
     742             :         zval *id;
     743           9 :         xmlNodePtr elemp, nodep = NULL;
     744             :         xmlNsPtr nsptr;
     745             :         xmlAttr *attr;
     746           9 :         size_t uri_len = 0, name_len = 0, value_len = 0;
     747             :         char *uri, *name, *value;
     748           9 :         char *localname = NULL, *prefix = NULL;
     749             :         dom_object *intern;
     750           9 :         int errorcode = 0, stricterror, is_xmlns = 0, name_valid;
     751             : 
     752           9 :         id = ZEND_THIS;
     753           9 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!ss", &uri, &uri_len, &name, &name_len, &value, &value_len) == FAILURE) {
     754           0 :                 return;
     755             :         }
     756             : 
     757           9 :         if (name_len == 0) {
     758           0 :                 php_error_docref(NULL, E_WARNING, "Attribute Name is required");
     759           0 :                 RETURN_FALSE;
     760             :         }
     761             : 
     762           9 :         DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
     763             : 
     764           9 :         stricterror = dom_get_strict_error(intern->document);
     765             : 
     766           9 :         if (dom_node_is_read_only(elemp) == SUCCESS) {
     767           0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror);
     768           0 :                 RETURN_NULL();
     769             :         }
     770             : 
     771           9 :         errorcode = dom_check_qname(name, &localname, &prefix, uri_len, name_len);
     772             : 
     773           9 :         if (errorcode == 0) {
     774           8 :                 if (uri_len > 0) {
     775           7 :                         nodep = (xmlNodePtr) xmlHasNsProp(elemp, (xmlChar *) localname, (xmlChar *) uri);
     776           7 :                         if (nodep != NULL && nodep->type != XML_ATTRIBUTE_DECL) {
     777           0 :                                 node_list_unlink(nodep->children);
     778             :                         }
     779             : 
     780          14 :                         if ((xmlStrEqual((xmlChar *) prefix, (xmlChar *)"xmlns") ||
     781          12 :                                 (prefix == NULL && xmlStrEqual((xmlChar *) localname, (xmlChar *)"xmlns"))) &&
     782           1 :                                 xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
     783           1 :                                 is_xmlns = 1;
     784           2 :                                 if (prefix == NULL) {
     785           1 :                                         nsptr = dom_get_nsdecl(elemp, NULL);
     786             :                                 } else {
     787           0 :                                         nsptr = dom_get_nsdecl(elemp, (xmlChar *)localname);
     788             :                                 }
     789             :                         } else {
     790           6 :                                 nsptr = xmlSearchNsByHref(elemp->doc, elemp, (xmlChar *)uri);
     791           6 :                                 if (nsptr && nsptr->prefix == NULL) {
     792             :                                         xmlNsPtr tmpnsptr;
     793             : 
     794           2 :                                         tmpnsptr = nsptr->next;
     795           6 :                                         while (tmpnsptr) {
     796           6 :                                                 if ((tmpnsptr->prefix != NULL) && (tmpnsptr->href != NULL) &&
     797           3 :                                                         (xmlStrEqual(tmpnsptr->href, (xmlChar *) uri))) {
     798           1 :                                                         nsptr = tmpnsptr;
     799           1 :                                                         break;
     800             :                                                 }
     801           2 :                                                 tmpnsptr = tmpnsptr->next;
     802             :                                         }
     803           2 :                                         if (tmpnsptr == NULL) {
     804           1 :                                                 nsptr = _dom_new_reconNs(elemp->doc, elemp, nsptr);
     805             :                                         }
     806             :                                 }
     807             :                         }
     808             : 
     809           7 :                         if (nsptr == NULL) {
     810           1 :                                 if (prefix == NULL) {
     811           1 :                                         if (is_xmlns == 1) {
     812           1 :                                                 xmlNewNs(elemp, (xmlChar *)value, NULL);
     813           1 :                                                 xmlReconciliateNs(elemp->doc, elemp);
     814             :                                         } else {
     815           0 :                                                 errorcode = NAMESPACE_ERR;
     816             :                                         }
     817             :                                 } else {
     818           0 :                                         if (is_xmlns == 1) {
     819           0 :                                                 xmlNewNs(elemp, (xmlChar *)value, (xmlChar *)localname);
     820             :                                         } else {
     821           0 :                                                 nsptr = dom_get_ns(elemp, uri, &errorcode, prefix);
     822             :                                         }
     823           0 :                                         xmlReconciliateNs(elemp->doc, elemp);
     824             :                                 }
     825             :                         } else {
     826           6 :                                 if (is_xmlns == 1) {
     827           0 :                                         if (nsptr->href) {
     828           0 :                                                 xmlFree((xmlChar *) nsptr->href);
     829             :                                         }
     830           0 :                                         nsptr->href = xmlStrdup((xmlChar *)value);
     831             :                                 }
     832             :                         }
     833             : 
     834           7 :                         if (errorcode == 0 && is_xmlns == 0) {
     835           6 :                                 xmlSetNsProp(elemp, nsptr, (xmlChar *)localname, (xmlChar *)value);
     836             :                         }
     837             :                 } else {
     838           1 :                         name_valid = xmlValidateName((xmlChar *) localname, 0);
     839           1 :                         if (name_valid != 0) {
     840           1 :                                 errorcode = INVALID_CHARACTER_ERR;
     841           1 :                                 stricterror = 1;
     842             :                         } else {
     843           0 :                                 attr = xmlHasProp(elemp, (xmlChar *)localname);
     844           0 :                                 if (attr != NULL && attr->type != XML_ATTRIBUTE_DECL) {
     845           0 :                                         node_list_unlink(attr->children);
     846             :                                 }
     847           0 :                                 xmlSetProp(elemp, (xmlChar *)localname, (xmlChar *)value);
     848             :                         }
     849             :                 }
     850             :         }
     851             : 
     852           9 :         xmlFree(localname);
     853           9 :         if (prefix != NULL) {
     854           4 :                 xmlFree(prefix);
     855             :         }
     856             : 
     857           9 :         if (errorcode != 0) {
     858           2 :                 php_dom_throw_error(errorcode, stricterror);
     859             :         }
     860             : 
     861           9 :         RETURN_NULL();
     862             : }
     863             : /* }}} end dom_element_set_attribute_ns */
     864             : 
     865             : /* {{{ proto void dom_element_remove_attribute_ns(string namespaceURI, string localName);
     866             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElRemAtNS
     867             : Since: DOM Level 2
     868             : */
     869           1 : PHP_FUNCTION(dom_element_remove_attribute_ns)
     870             : {
     871             :         zval *id;
     872             :         xmlNode *nodep;
     873             :         xmlAttr *attrp;
     874             :         xmlNsPtr nsptr;
     875             :         dom_object *intern;
     876             :         size_t name_len, uri_len;
     877             :         char *name, *uri;
     878             : 
     879           1 :         id = ZEND_THIS;
     880           1 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!s", &uri, &uri_len, &name, &name_len) == FAILURE) {
     881           0 :                 return;
     882             :         }
     883             : 
     884           1 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
     885             : 
     886           1 :         if (dom_node_is_read_only(nodep) == SUCCESS) {
     887           0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document));
     888           0 :                 RETURN_NULL();
     889             :         }
     890             : 
     891           1 :         attrp = xmlHasNsProp(nodep, (xmlChar *)name, (xmlChar *)uri);
     892             : 
     893           1 :         nsptr = dom_get_nsdecl(nodep, (xmlChar *)name);
     894           1 :         if (nsptr != NULL) {
     895           0 :                 if (xmlStrEqual((xmlChar *)uri, nsptr->href)) {
     896           0 :                         if (nsptr->href != NULL) {
     897           0 :                                 xmlFree((char *) nsptr->href);
     898           0 :                                 nsptr->href = NULL;
     899             :                         }
     900           0 :                         if (nsptr->prefix != NULL) {
     901           0 :                                 xmlFree((char *) nsptr->prefix);
     902           0 :                                 nsptr->prefix = NULL;
     903             :                         }
     904             :                 } else {
     905           0 :                         RETURN_NULL();
     906             :                 }
     907             :         }
     908             : 
     909           1 :         if (attrp && attrp->type != XML_ATTRIBUTE_DECL) {
     910           1 :                 if (php_dom_object_get_data((xmlNodePtr) attrp) == NULL) {
     911           1 :                         node_list_unlink(attrp->children);
     912           1 :                         xmlUnlinkNode((xmlNodePtr) attrp);
     913           1 :                         xmlFreeProp(attrp);
     914             :                 } else {
     915           0 :                         xmlUnlinkNode((xmlNodePtr) attrp);
     916             :                 }
     917             :         }
     918             : 
     919           1 :         RETURN_NULL();
     920             : }
     921             : /* }}} end dom_element_remove_attribute_ns */
     922             : 
     923             : /* {{{ proto DOMAttr dom_element_get_attribute_node_ns(string namespaceURI, string localName);
     924             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElGetAtNodeNS
     925             : Since: DOM Level 2
     926             : */
     927           2 : PHP_FUNCTION(dom_element_get_attribute_node_ns)
     928             : {
     929             :         zval *id;
     930             :         xmlNodePtr elemp, fakeAttrp;
     931             :         xmlAttrPtr attrp;
     932             :         dom_object *intern;
     933             :         size_t uri_len, name_len;
     934             :         int ret;
     935             :         char *uri, *name;
     936             : 
     937           2 :         id = ZEND_THIS;
     938           2 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!s", &uri, &uri_len, &name, &name_len) == FAILURE) {
     939           0 :                 return;
     940             :         }
     941             : 
     942           2 :         DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
     943             : 
     944           2 :         attrp = xmlHasNsProp(elemp, (xmlChar *)name, (xmlChar *)uri);
     945             : 
     946           2 :         if (attrp == NULL) {
     947           1 :                 if (xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
     948             :                         xmlNsPtr nsptr;
     949           1 :                         nsptr = dom_get_nsdecl(elemp, (xmlChar *)name);
     950           1 :                         if (nsptr != NULL) {
     951             :                                 xmlNsPtr curns;
     952           1 :                                 curns = xmlNewNs(NULL, nsptr->href, NULL);
     953           1 :                                 if (nsptr->prefix) {
     954           1 :                                         curns->prefix = xmlStrdup((xmlChar *) nsptr->prefix);
     955             :                                 }
     956           1 :                                 if (nsptr->prefix) {
     957           1 :                                         fakeAttrp = xmlNewDocNode(elemp->doc, NULL, (xmlChar *) nsptr->prefix, nsptr->href);
     958             :                                 } else {
     959           0 :                                         fakeAttrp = xmlNewDocNode(elemp->doc, NULL, (xmlChar *)"xmlns", nsptr->href);
     960             :                                 }
     961           1 :                                 fakeAttrp->type = XML_NAMESPACE_DECL;
     962           1 :                                 fakeAttrp->parent = elemp;
     963           1 :                                 fakeAttrp->ns = curns;
     964             : 
     965           1 :                                 DOM_RET_OBJ(fakeAttrp, &ret, intern);
     966             :                         } else {
     967           0 :                                 RETURN_NULL();
     968             :                         }
     969             :                 } else {
     970           0 :                    RETURN_NULL();
     971             :                 }
     972             :         } else {
     973           1 :                 DOM_RET_OBJ((xmlNodePtr) attrp, &ret, intern);
     974             :         }
     975             : 
     976             : }
     977             : /* }}} end dom_element_get_attribute_node_ns */
     978             : 
     979             : /* {{{ proto DOMAttr dom_element_set_attribute_node_ns(DOMAttr newAttr);
     980             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetAtNodeNS
     981             : Since: DOM Level 2
     982             : */
     983           1 : PHP_FUNCTION(dom_element_set_attribute_node_ns)
     984             : {
     985             :         zval *id, *node;
     986             :         xmlNode *nodep;
     987             :         xmlNs *nsp;
     988           1 :         xmlAttr *attrp, *existattrp = NULL;
     989             :         dom_object *intern, *attrobj, *oldobj;
     990             :         int ret;
     991             : 
     992           1 :         id = ZEND_THIS;
     993           1 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &node, dom_attr_class_entry) == FAILURE) {
     994           0 :                 return;
     995             :         }
     996             : 
     997           1 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
     998             : 
     999           1 :         if (dom_node_is_read_only(nodep) == SUCCESS) {
    1000           0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document));
    1001           0 :                 RETURN_FALSE;
    1002             :         }
    1003             : 
    1004           1 :         DOM_GET_OBJ(attrp, node, xmlAttrPtr, attrobj);
    1005             : 
    1006           1 :         if (attrp->type != XML_ATTRIBUTE_NODE) {
    1007           0 :                 php_error_docref(NULL, E_WARNING, "Attribute node is required");
    1008           0 :                 RETURN_FALSE;
    1009             :         }
    1010             : 
    1011           1 :         if (!(attrp->doc == NULL || attrp->doc == nodep->doc)) {
    1012           0 :                 php_dom_throw_error(WRONG_DOCUMENT_ERR, dom_get_strict_error(intern->document));
    1013           0 :                 RETURN_FALSE;
    1014             :         }
    1015             : 
    1016           1 :     nsp = attrp->ns;
    1017           1 :     if (nsp != NULL) {
    1018           1 :         existattrp = xmlHasNsProp(nodep, nsp->href, attrp->name);
    1019             :     } else {
    1020           0 :         existattrp = xmlHasProp(nodep, attrp->name);
    1021             :     }
    1022             : 
    1023           1 :         if (existattrp != NULL && existattrp->type != XML_ATTRIBUTE_DECL) {
    1024           0 :                 if ((oldobj = php_dom_object_get_data((xmlNodePtr) existattrp)) != NULL &&
    1025           0 :                         ((php_libxml_node_ptr *)oldobj->ptr)->node == (xmlNodePtr) attrp)
    1026             :                 {
    1027           0 :                         RETURN_NULL();
    1028             :                 }
    1029           0 :                 xmlUnlinkNode((xmlNodePtr) existattrp);
    1030             :         }
    1031             : 
    1032           1 :         if (attrp->parent != NULL) {
    1033           0 :                 xmlUnlinkNode((xmlNodePtr) attrp);
    1034             :         }
    1035             : 
    1036           1 :         if (attrp->doc == NULL && nodep->doc != NULL) {
    1037           0 :                 attrobj->document = intern->document;
    1038           0 :                 php_libxml_increment_doc_ref((php_libxml_node_object *)attrobj, NULL);
    1039             :         }
    1040             : 
    1041           1 :         xmlAddChild(nodep, (xmlNodePtr) attrp);
    1042             : 
    1043             :         /* Returns old property if removed otherwise NULL */
    1044           1 :         if (existattrp != NULL) {
    1045           0 :                 DOM_RET_OBJ((xmlNodePtr) existattrp, &ret, intern);
    1046             :         } else {
    1047           1 :                 RETVAL_NULL();
    1048             :         }
    1049             : 
    1050             : }
    1051             : /* }}} end dom_element_set_attribute_node_ns */
    1052             : 
    1053             : /* {{{ proto DOMNodeList dom_element_get_elements_by_tag_name_ns(string namespaceURI, string localName);
    1054             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-A6C90942
    1055             : Since: DOM Level 2
    1056             : */
    1057           2 : PHP_FUNCTION(dom_element_get_elements_by_tag_name_ns)
    1058             : {
    1059             :         zval *id;
    1060             :         xmlNodePtr elemp;
    1061             :         size_t uri_len, name_len;
    1062             :         dom_object *intern, *namednode;
    1063             :         char *uri, *name;
    1064             :         xmlChar *local, *nsuri;
    1065             : 
    1066           2 :         id = ZEND_THIS;
    1067           2 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &uri, &uri_len, &name, &name_len) == FAILURE) {
    1068           0 :                 return;
    1069             :         }
    1070             : 
    1071           2 :         DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
    1072             : 
    1073           2 :         php_dom_create_interator(return_value, DOM_NODELIST);
    1074           2 :         namednode = Z_DOMOBJ_P(return_value);
    1075           2 :         local = xmlCharStrndup(name, name_len);
    1076           2 :         nsuri = xmlCharStrndup(uri, uri_len);
    1077           2 :         dom_namednode_iter(intern, 0, namednode, NULL, local, nsuri);
    1078             : 
    1079             : }
    1080             : /* }}} end dom_element_get_elements_by_tag_name_ns */
    1081             : 
    1082             : /* {{{ proto bool dom_element_has_attribute(string name);
    1083             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElHasAttr
    1084             : Since: DOM Level 2
    1085             : */
    1086          11 : PHP_FUNCTION(dom_element_has_attribute)
    1087             : {
    1088             :         zval *id;
    1089             :         xmlNode *nodep;
    1090             :         dom_object *intern;
    1091             :         char *name;
    1092             :         size_t name_len;
    1093             :         xmlNodePtr attr;
    1094             : 
    1095          11 :         id = ZEND_THIS;
    1096          11 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
    1097           0 :                 return;
    1098             :         }
    1099             : 
    1100          11 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1101             : 
    1102          11 :         attr = dom_get_dom1_attribute(nodep, (xmlChar *)name);
    1103          11 :         if (attr == NULL) {
    1104           1 :                 RETURN_FALSE;
    1105             :         } else {
    1106          10 :                 RETURN_TRUE;
    1107             :         }
    1108             : }
    1109             : /* }}} end dom_element_has_attribute */
    1110             : 
    1111             : /* {{{ proto bool dom_element_has_attribute_ns(string namespaceURI, string localName);
    1112             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElHasAttrNS
    1113             : Since: DOM Level 2
    1114             : */
    1115           3 : PHP_FUNCTION(dom_element_has_attribute_ns)
    1116             : {
    1117             :         zval *id;
    1118             :         xmlNodePtr elemp;
    1119             :         xmlNs *nsp;
    1120             :         dom_object *intern;
    1121             :         size_t uri_len, name_len;
    1122             :         char *uri, *name;
    1123             :         xmlChar *value;
    1124             : 
    1125           3 :         id = ZEND_THIS;
    1126           3 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!s", &uri, &uri_len, &name, &name_len) == FAILURE) {
    1127           0 :                 return;
    1128             :         }
    1129             : 
    1130           3 :         DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
    1131             : 
    1132           3 :         value = xmlGetNsProp(elemp, (xmlChar *)name, (xmlChar *)uri);
    1133             : 
    1134           3 :         if (value != NULL) {
    1135           1 :                 xmlFree(value);
    1136           1 :                 RETURN_TRUE;
    1137             :         } else {
    1138           2 :                 if (xmlStrEqual((xmlChar *)uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
    1139           0 :                         nsp = dom_get_nsdecl(elemp, (xmlChar *)name);
    1140           0 :                         if (nsp != NULL) {
    1141           0 :                                 RETURN_TRUE;
    1142             :                         }
    1143             :                 }
    1144             :         }
    1145             : 
    1146           2 :         RETURN_FALSE;
    1147             : }
    1148             : /* }}} end dom_element_has_attribute_ns */
    1149             : 
    1150           6 : static void php_set_attribute_id(xmlAttrPtr attrp, zend_bool is_id) /* {{{ */
    1151             : {
    1152           9 :         if (is_id == 1 && attrp->atype != XML_ATTRIBUTE_ID) {
    1153             :                 xmlChar *id_val;
    1154             : 
    1155           3 :                 id_val = xmlNodeListGetString(attrp->doc, attrp->children, 1);
    1156           3 :                 if (id_val != NULL) {
    1157           3 :                         xmlAddID(NULL, attrp->doc, id_val, attrp);
    1158           3 :                         xmlFree(id_val);
    1159             :                 }
    1160             :         } else {
    1161           3 :                 if (attrp->atype == XML_ATTRIBUTE_ID) {
    1162           3 :                         xmlRemoveID(attrp->doc, attrp);
    1163           3 :                         attrp->atype = 0;
    1164             :                 }
    1165             :         }
    1166           6 : }
    1167             : /* }}} */
    1168             : 
    1169             : /* {{{ proto void dom_element_set_id_attribute(string name, bool isId);
    1170             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttr
    1171             : Since: DOM Level 3
    1172             : */
    1173           1 : PHP_FUNCTION(dom_element_set_id_attribute)
    1174             : {
    1175             :         zval *id;
    1176             :         xmlNode *nodep;
    1177             :         xmlAttrPtr attrp;
    1178             :         dom_object *intern;
    1179             :         char *name;
    1180             :         size_t name_len;
    1181             :         zend_bool is_id;
    1182             : 
    1183           1 :         id = ZEND_THIS;
    1184           1 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "sb", &name, &name_len, &is_id) == FAILURE) {
    1185           0 :                 return;
    1186             :         }
    1187             : 
    1188           1 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1189             : 
    1190           1 :         if (dom_node_is_read_only(nodep) == SUCCESS) {
    1191           0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document));
    1192           0 :                 RETURN_NULL();
    1193             :         }
    1194             : 
    1195           1 :         attrp = xmlHasNsProp(nodep, (xmlChar *)name, NULL);
    1196           1 :         if (attrp == NULL || attrp->type == XML_ATTRIBUTE_DECL) {
    1197           0 :                 php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document));
    1198             :         } else {
    1199           1 :                 php_set_attribute_id(attrp, is_id);
    1200             :         }
    1201             : 
    1202           1 :         RETURN_NULL();
    1203             : }
    1204             : /* }}} end dom_element_set_id_attribute */
    1205             : 
    1206             : /* {{{ proto void dom_element_set_id_attribute_ns(string namespaceURI, string localName, bool isId);
    1207             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttrNS
    1208             : Since: DOM Level 3
    1209             : */
    1210           4 : PHP_FUNCTION(dom_element_set_id_attribute_ns)
    1211             : {
    1212             :         zval *id;
    1213             :         xmlNodePtr elemp;
    1214             :         xmlAttrPtr attrp;
    1215             :         dom_object *intern;
    1216             :         size_t uri_len, name_len;
    1217             :         char *uri, *name;
    1218             :         zend_bool is_id;
    1219             : 
    1220           4 :         id = ZEND_THIS;
    1221           4 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssb", &uri, &uri_len, &name, &name_len, &is_id) == FAILURE) {
    1222           0 :                 return;
    1223             :         }
    1224             : 
    1225           4 :         DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
    1226             : 
    1227           4 :         if (dom_node_is_read_only(elemp) == SUCCESS) {
    1228           0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document));
    1229           0 :                 RETURN_NULL();
    1230             :         }
    1231             : 
    1232           4 :         attrp = xmlHasNsProp(elemp, (xmlChar *)name, (xmlChar *)uri);
    1233           4 :         if (attrp == NULL || attrp->type == XML_ATTRIBUTE_DECL) {
    1234           0 :                 php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document));
    1235             :         } else {
    1236           4 :                 php_set_attribute_id(attrp, is_id);
    1237             :         }
    1238             : 
    1239           4 :         RETURN_NULL();
    1240             : }
    1241             : /* }}} end dom_element_set_id_attribute_ns */
    1242             : 
    1243             : /* {{{ proto void dom_element_set_id_attribute_node(attr idAttr, bool isId);
    1244             : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttrNode
    1245             : Since: DOM Level 3
    1246             : */
    1247           1 : PHP_FUNCTION(dom_element_set_id_attribute_node)
    1248             : {
    1249             :         zval *id, *node;
    1250             :         xmlNode *nodep;
    1251             :         xmlAttrPtr attrp;
    1252             :         dom_object *intern, *attrobj;
    1253             :         zend_bool is_id;
    1254             : 
    1255           1 :         id = ZEND_THIS;
    1256           1 :         if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &node, dom_attr_class_entry, &is_id) == FAILURE) {
    1257           0 :                 return;
    1258             :         }
    1259             : 
    1260           1 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1261             : 
    1262           1 :         if (dom_node_is_read_only(nodep) == SUCCESS) {
    1263           0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document));
    1264           0 :                 RETURN_NULL();
    1265             :         }
    1266             : 
    1267           1 :         DOM_GET_OBJ(attrp, node, xmlAttrPtr, attrobj);
    1268             : 
    1269           1 :         if (attrp->parent != nodep) {
    1270           0 :                 php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document));
    1271             :         } else {
    1272           1 :                 php_set_attribute_id(attrp, is_id);
    1273             :         }
    1274             : 
    1275           1 :         RETURN_NULL();
    1276             : }
    1277             : /* }}} end dom_element_set_id_attribute_node */
    1278             : 
    1279             : #endif

Generated by: LCOV version 1.10

Generated at Mon, 06 May 2019 17:58:13 +0000 (998 days ago)

Copyright © 2005-2022 The PHP Group
All rights reserved.