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

LTP GCOV extension - code coverage report
Current view: directory - dom - node.c
Test: PHP Code Coverage
Date: 2009-11-23 Instrumented lines: 840
Code covered: 60.2 % Executed lines: 506
Legend: not executed executed

       1                 : /*
       2                 :    +----------------------------------------------------------------------+
       3                 :    | PHP Version 6                                                        |
       4                 :    +----------------------------------------------------------------------+
       5                 :    | Copyright (c) 1997-2009 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                 : /* $Id: node.c 288654 2009-09-24 13:18:22Z rrichards $ */
      21                 : 
      22                 : #ifdef HAVE_CONFIG_H
      23                 : #include "config.h"
      24                 : #endif
      25                 : 
      26                 : #include "php.h"
      27                 : #if HAVE_LIBXML && HAVE_DOM
      28                 : #include "php_dom.h"
      29                 : 
      30                 : /* {{{ arginfo */
      31                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_insert_before, 0, 0, 1)
      32                 :         ZEND_ARG_OBJ_INFO(0, newChild, DOMNode, 0)
      33                 :         ZEND_ARG_OBJ_INFO(0, refChild, DOMNode, 1)
      34                 : ZEND_END_ARG_INFO();
      35                 : 
      36                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_replace_child, 0, 0, 2)
      37                 :         ZEND_ARG_OBJ_INFO(0, newChild, DOMNode, 0)
      38                 :         ZEND_ARG_OBJ_INFO(0, oldChild, DOMNode, 0)
      39                 : ZEND_END_ARG_INFO();
      40                 : 
      41                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_remove_child, 0, 0, 1)
      42                 :         ZEND_ARG_OBJ_INFO(0, oldChild, DOMNode, 0)
      43                 : ZEND_END_ARG_INFO();
      44                 : 
      45                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_append_child, 0, 0, 1)
      46                 :         ZEND_ARG_OBJ_INFO(0, newChild, DOMNode, 0)
      47                 : ZEND_END_ARG_INFO();
      48                 : 
      49                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_has_child_nodes, 0, 0, 0)
      50                 : ZEND_END_ARG_INFO();
      51                 : 
      52                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_clone_node, 0, 0, 1)
      53                 :         ZEND_ARG_INFO(0, deep)
      54                 : ZEND_END_ARG_INFO();
      55                 : 
      56                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_normalize, 0, 0, 0)
      57                 : ZEND_END_ARG_INFO();
      58                 : 
      59                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_is_supported, 0, 0, 2)
      60                 :         ZEND_ARG_INFO(0, feature)
      61                 :         ZEND_ARG_INFO(0, version)
      62                 : ZEND_END_ARG_INFO();
      63                 : 
      64                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_has_attributes, 0, 0, 0)
      65                 : ZEND_END_ARG_INFO();
      66                 : 
      67                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_compare_document_position, 0, 0, 1)
      68                 :         ZEND_ARG_OBJ_INFO(0, other, DOMNode, 0)
      69                 : ZEND_END_ARG_INFO();
      70                 : 
      71                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_is_same_node, 0, 0, 1)
      72                 :         ZEND_ARG_OBJ_INFO(0, other, DOMNode, 0)
      73                 : ZEND_END_ARG_INFO();
      74                 : 
      75                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_lookup_prefix, 0, 0, 1)
      76                 :         ZEND_ARG_INFO(0, namespaceURI)
      77                 : ZEND_END_ARG_INFO();
      78                 : 
      79                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_is_default_namespace, 0, 0, 1)
      80                 :         ZEND_ARG_INFO(0, namespaceURI)
      81                 : ZEND_END_ARG_INFO();
      82                 : 
      83                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_lookup_namespace_uri, 0, 0, 1)
      84                 :         ZEND_ARG_INFO(0, prefix)
      85                 : ZEND_END_ARG_INFO();
      86                 : 
      87                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_is_equal_node, 0, 0, 1)
      88                 :         ZEND_ARG_OBJ_INFO(0, arg, DOMNode, 0)
      89                 : ZEND_END_ARG_INFO();
      90                 : 
      91                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_get_feature, 0, 0, 2)
      92                 :         ZEND_ARG_INFO(0, feature)
      93                 :         ZEND_ARG_INFO(0, version)
      94                 : ZEND_END_ARG_INFO();
      95                 : 
      96                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_set_user_data, 0, 0, 3)
      97                 :         ZEND_ARG_INFO(0, key)
      98                 :         ZEND_ARG_INFO(0, data)
      99                 :         ZEND_ARG_INFO(0, handler)
     100                 : ZEND_END_ARG_INFO();
     101                 : 
     102                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_get_user_data, 0, 0, 1)
     103                 :         ZEND_ARG_INFO(0, key)
     104                 : ZEND_END_ARG_INFO();
     105                 : 
     106                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_getNodePath, 0, 0, 0)
     107                 : ZEND_END_ARG_INFO();
     108                 : 
     109                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_getLineNo, 0, 0, 0)
     110                 : ZEND_END_ARG_INFO();
     111                 : 
     112                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_C14N, 0, 0, 0)
     113                 :         ZEND_ARG_INFO(0, exclusive)
     114                 :         ZEND_ARG_INFO(0, with_comments)
     115                 :         ZEND_ARG_ARRAY_INFO(0, xpath, 1)
     116                 :         ZEND_ARG_ARRAY_INFO(0, ns_prefixes, 1)
     117                 : ZEND_END_ARG_INFO();
     118                 : 
     119                 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_C14NFile, 0, 0, 1)
     120                 :         ZEND_ARG_INFO(0, uri)
     121                 :         ZEND_ARG_INFO(0, exclusive)
     122                 :         ZEND_ARG_INFO(0, with_comments)
     123                 :         ZEND_ARG_ARRAY_INFO(0, xpath, 1)
     124                 :         ZEND_ARG_ARRAY_INFO(0, ns_prefixes, 1)
     125                 : ZEND_END_ARG_INFO();
     126                 : /* }}} */
     127                 : 
     128                 : /*
     129                 : * class DOMNode 
     130                 : *
     131                 : * URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1950641247
     132                 : * Since: 
     133                 : */
     134                 : 
     135                 : const zend_function_entry php_dom_node_class_functions[] = { /* {{{ */
     136                 :         PHP_FALIAS(insertBefore, dom_node_insert_before, arginfo_dom_node_insert_before)
     137                 :         PHP_FALIAS(replaceChild, dom_node_replace_child, arginfo_dom_node_replace_child)
     138                 :         PHP_FALIAS(removeChild, dom_node_remove_child, arginfo_dom_node_remove_child)
     139                 :         PHP_FALIAS(appendChild, dom_node_append_child, arginfo_dom_node_append_child)
     140                 :         PHP_FALIAS(hasChildNodes, dom_node_has_child_nodes, arginfo_dom_node_has_child_nodes)
     141                 :         PHP_FALIAS(cloneNode, dom_node_clone_node, arginfo_dom_node_clone_node)
     142                 :         PHP_FALIAS(normalize, dom_node_normalize, arginfo_dom_node_normalize)
     143                 :         PHP_FALIAS(isSupported, dom_node_is_supported, arginfo_dom_node_is_supported)
     144                 :         PHP_FALIAS(hasAttributes, dom_node_has_attributes, arginfo_dom_node_has_attributes)
     145                 :         PHP_FALIAS(compareDocumentPosition, dom_node_compare_document_position, arginfo_dom_node_compare_document_position)
     146                 :         PHP_FALIAS(isSameNode, dom_node_is_same_node, arginfo_dom_node_is_same_node)
     147                 :         PHP_FALIAS(lookupPrefix, dom_node_lookup_prefix, arginfo_dom_node_lookup_prefix)
     148                 :         PHP_FALIAS(isDefaultNamespace, dom_node_is_default_namespace, arginfo_dom_node_is_default_namespace)
     149                 :         PHP_FALIAS(lookupNamespaceUri, dom_node_lookup_namespace_uri, arginfo_dom_node_lookup_namespace_uri)
     150                 :         PHP_FALIAS(isEqualNode, dom_node_is_equal_node, arginfo_dom_node_is_equal_node)
     151                 :         PHP_FALIAS(getFeature, dom_node_get_feature, arginfo_dom_node_get_feature)
     152                 :         PHP_FALIAS(setUserData, dom_node_set_user_data, arginfo_dom_node_set_user_data)
     153                 :         PHP_FALIAS(getUserData, dom_node_get_user_data, arginfo_dom_node_get_user_data)
     154                 :         PHP_ME(domnode, getNodePath, arginfo_dom_node_getNodePath, ZEND_ACC_PUBLIC)
     155                 :         PHP_ME(domnode, getLineNo, arginfo_dom_node_getLineNo, ZEND_ACC_PUBLIC)
     156                 :         PHP_ME(domnode, C14N, arginfo_dom_node_C14N, ZEND_ACC_PUBLIC)
     157                 :         PHP_ME(domnode, C14NFile, arginfo_dom_node_C14NFile, ZEND_ACC_PUBLIC)
     158                 :         {NULL, NULL, NULL}
     159                 : };
     160                 : /* }}} */
     161                 : 
     162                 : static void dom_reconcile_ns(xmlDocPtr doc, xmlNodePtr nodep) /* {{{ */
     163             176 : {
     164             176 :         xmlNsPtr nsptr, nsdftptr, curns, prevns = NULL;
     165                 : 
     166             176 :         if (nodep->type == XML_ELEMENT_NODE) {
     167                 :                 /* Following if block primarily used for inserting nodes created via createElementNS */
     168             113 :                 if (nodep->nsDef != NULL) {
     169              11 :                         curns = nodep->nsDef;
     170              34 :                         while (curns) {
     171              12 :                                 nsdftptr = curns->next;
     172              12 :                                 if (curns->href != NULL) {
     173              12 :                                         if((nsptr = xmlSearchNsByHref(doc, nodep->parent, curns->href)) && 
     174                 :                                                 (curns->prefix == NULL || xmlStrEqual(nsptr->prefix, curns->prefix))) {
     175               6 :                                                 curns->next = NULL;
     176               6 :                                                 if (prevns == NULL) {
     177               6 :                                                         nodep->nsDef = nsdftptr;
     178                 :                                                 } else {
     179               0 :                                                         prevns->next = nsdftptr;
     180                 :                                                 }
     181               6 :                                                 dom_set_old_ns(doc, curns);
     182               6 :                                                 curns = prevns;
     183                 :                                         }
     184                 :                                 }
     185              12 :                                 prevns = curns;
     186              12 :                                 curns = nsdftptr;
     187                 :                         }
     188                 :                 }
     189             113 :                 xmlReconciliateNs(doc, nodep);
     190                 :         }
     191             176 : }
     192                 : /* }}} */
     193                 : 
     194                 : /* {{{ nodeName string  
     195                 : readonly=yes 
     196                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68D095
     197                 : Since: 
     198                 : */
     199                 : int dom_node_node_name_read(dom_object *obj, zval **retval TSRMLS_DC)
     200             282 : {
     201                 :         xmlNode *nodep;
     202                 :         xmlNsPtr ns;
     203             282 :         char *str = NULL;
     204             282 :         xmlChar *qname = NULL;
     205                 : 
     206             282 :         nodep = dom_object_get_node(obj);
     207                 : 
     208             282 :         if (nodep == NULL) {
     209               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     210               0 :                 return FAILURE;
     211                 :         }
     212                 : 
     213             282 :         switch (nodep->type) {
     214                 :                 case XML_ATTRIBUTE_NODE:
     215                 :                 case XML_ELEMENT_NODE:
     216             167 :                         ns = nodep->ns;
     217             184 :                         if (ns != NULL && ns->prefix) {
     218              17 :                                 qname = xmlStrdup(ns->prefix);
     219              17 :                                 qname = xmlStrcat(qname, ":");
     220              17 :                                 qname = xmlStrcat(qname, nodep->name);
     221              17 :                                 str = qname;
     222                 :                         } else {
     223             150 :                                 str = (char *) nodep->name;
     224                 :                         }
     225             167 :                         break;
     226                 :                 case XML_NAMESPACE_DECL:
     227               0 :                         ns = nodep->ns;
     228               0 :                         if (ns != NULL && ns->prefix) {
     229               0 :                                 qname = xmlStrdup("xmlns");
     230               0 :                                 qname = xmlStrcat(qname, ":");
     231               0 :                                 qname = xmlStrcat(qname, nodep->name);
     232               0 :                                 str = qname;
     233                 :                         } else {
     234               0 :                                 str = (char *) nodep->name;
     235                 :                         }
     236               0 :                         break;
     237                 :                 case XML_DOCUMENT_TYPE_NODE:
     238                 :                 case XML_DTD_NODE:
     239                 :                 case XML_PI_NODE:
     240                 :                 case XML_ENTITY_DECL:
     241                 :                 case XML_ENTITY_REF_NODE:
     242                 :                 case XML_NOTATION_NODE:
     243              11 :                         str = (char *) nodep->name;
     244              11 :                         break;
     245                 :                 case XML_CDATA_SECTION_NODE:
     246               0 :                         str = "#cdata-section";
     247               0 :                         break;
     248                 :                 case XML_COMMENT_NODE:
     249               0 :                         str = "#comment";
     250               0 :                         break;
     251                 :                 case XML_HTML_DOCUMENT_NODE:
     252                 :                 case XML_DOCUMENT_NODE:
     253               0 :                         str = "#document";
     254               0 :                         break;
     255                 :                 case XML_DOCUMENT_FRAG_NODE:
     256               5 :                         str = "#document-fragment";
     257               5 :                         break;
     258                 :                 case XML_TEXT_NODE:
     259              99 :                         str = "#text";
     260              99 :                         break;
     261                 :                 default:
     262               0 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Node Type");
     263                 :         }
     264                 : 
     265             282 :         ALLOC_ZVAL(*retval);
     266                 : 
     267             282 :         if(str != NULL) {
     268             282 :                 ZVAL_XML_STRING(*retval, str, ZSTR_DUPLICATE);
     269                 :         } else {
     270               0 :                 ZVAL_EMPTY_UNICODE(*retval);
     271                 :         }
     272                 :         
     273             282 :         if (qname != NULL) {
     274              17 :                 xmlFree(qname);
     275                 :         }
     276                 : 
     277             282 :         return SUCCESS;
     278                 : 
     279                 : }
     280                 : 
     281                 : /* }}} */
     282                 : 
     283                 : /* {{{ nodeValue        string  
     284                 : readonly=no 
     285                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68D080
     286                 : Since: 
     287                 : */
     288                 : int dom_node_node_value_read(dom_object *obj, zval **retval TSRMLS_DC)
     289             217 : {
     290                 :         xmlNode *nodep;
     291             217 :         char *str = NULL;
     292                 : 
     293             217 :         nodep = dom_object_get_node(obj);
     294                 : 
     295             217 :         if (nodep == NULL) {
     296               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     297               0 :                 return FAILURE;
     298                 :         }
     299                 : 
     300                 :         /* Access to Element node is implemented as a convience method */
     301             217 :         switch (nodep->type) {
     302                 :                 case XML_ATTRIBUTE_NODE:
     303                 :                 case XML_TEXT_NODE:
     304                 :                 case XML_ELEMENT_NODE:
     305                 :                 case XML_COMMENT_NODE:
     306                 :                 case XML_CDATA_SECTION_NODE:
     307                 :                 case XML_PI_NODE:
     308             212 :                         str = xmlNodeGetContent(nodep);
     309             212 :                         break;
     310                 :                 case XML_NAMESPACE_DECL:
     311               0 :                         str = xmlNodeGetContent(nodep->children);
     312               0 :                         break;
     313                 :                 default:
     314               5 :                         str = NULL;
     315                 :                         break;
     316                 :         }
     317                 : 
     318             217 :         ALLOC_ZVAL(*retval);
     319                 : 
     320             217 :         if(str != NULL) {
     321             212 :                 ZVAL_XML_STRING(*retval, str, ZSTR_DUPLICATE);
     322             212 :                 xmlFree(str);
     323                 :         } else {
     324               5 :                 ZVAL_NULL(*retval);
     325                 :         }
     326                 : 
     327                 : 
     328             217 :         return SUCCESS;
     329                 : 
     330                 : }
     331                 : 
     332                 : int dom_node_node_value_write(dom_object *obj, zval *newval TSRMLS_DC)
     333               2 : {
     334                 :         xmlNode *nodep;
     335                 :         zval value_copy;
     336                 : 
     337               2 :         nodep = dom_object_get_node(obj);
     338                 : 
     339               2 :         if (nodep == NULL) {
     340               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     341               0 :                 return FAILURE;
     342                 :         }
     343                 : 
     344                 :         /* Access to Element node is implemented as a convience method */
     345               2 :         switch (nodep->type) {
     346                 :                 case XML_ELEMENT_NODE:
     347                 :                 case XML_ATTRIBUTE_NODE:
     348               2 :                         if (nodep->children) {
     349               1 :                                 node_list_unlink(nodep->children TSRMLS_CC);
     350                 :                         }
     351                 :                 case XML_TEXT_NODE:
     352                 :                 case XML_COMMENT_NODE:
     353                 :                 case XML_CDATA_SECTION_NODE:
     354                 :                 case XML_PI_NODE:
     355               2 :                         if (newval->type != IS_STRING) {
     356               2 :                                 if(Z_REFCOUNT_P(newval) > 1) {
     357               0 :                                         value_copy = *newval;
     358               0 :                                         zval_copy_ctor(&value_copy);
     359               0 :                                         newval = &value_copy;
     360                 :                                 }
     361               2 :                                 convert_to_string_with_converter(newval, UG(utf8_conv));
     362                 :                         }
     363               2 :                         xmlNodeSetContentLen(nodep, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1);
     364               2 :                         if (newval == &value_copy) {
     365               0 :                                 zval_dtor(newval);
     366                 :                         }
     367                 :                         break;
     368                 :                 default:
     369                 :                         break;
     370                 :         }
     371                 : 
     372               2 :         return SUCCESS;
     373                 : }
     374                 : 
     375                 : /* }}} */
     376                 : 
     377                 : /* {{{ nodeType int
     378                 : readonly=yes 
     379                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-111237558
     380                 : Since:
     381                 : */
     382                 : int dom_node_node_type_read(dom_object *obj, zval **retval TSRMLS_DC)
     383              69 : {
     384                 :         xmlNode *nodep;
     385                 : 
     386              69 :         nodep = dom_object_get_node(obj);
     387                 : 
     388              69 :         if (nodep == NULL) {
     389               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     390               0 :                 return FAILURE;
     391                 :         }
     392                 : 
     393              69 :         ALLOC_ZVAL(*retval);
     394                 : 
     395                 :         /* Specs dictate that they are both type XML_DOCUMENT_TYPE_NODE */
     396              69 :         if (nodep->type == XML_DTD_NODE) {
     397               0 :                 ZVAL_LONG(*retval, XML_DOCUMENT_TYPE_NODE);
     398                 :         } else {
     399              69 :                 ZVAL_LONG(*retval, nodep->type);
     400                 :         }
     401                 : 
     402              69 :         return SUCCESS;
     403                 : }
     404                 : 
     405                 : /* }}} */
     406                 : 
     407                 : /* {{{ parentNode       DomNode 
     408                 : readonly=yes 
     409                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1060184317
     410                 : Since: 
     411                 : */
     412                 : int dom_node_parent_node_read(dom_object *obj, zval **retval TSRMLS_DC)
     413             131 : {
     414                 :         xmlNode *nodep, *nodeparent;
     415                 :         int ret;
     416                 : 
     417             131 :         nodep = dom_object_get_node(obj);
     418                 : 
     419             131 :         if (nodep == NULL) {
     420               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     421               0 :                 return FAILURE;
     422                 :         }
     423                 : 
     424             131 :         ALLOC_ZVAL(*retval);
     425                 : 
     426             131 :         nodeparent = nodep->parent;
     427             131 :         if (!nodeparent) {
     428              11 :                 ZVAL_NULL(*retval);
     429              11 :                 return SUCCESS;
     430                 :         }
     431                 : 
     432             120 :         if (NULL == (*retval = php_dom_create_object(nodeparent, &ret, NULL, *retval, obj TSRMLS_CC))) {
     433               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
     434               0 :                 return FAILURE;
     435                 :         }
     436             120 :         return SUCCESS;
     437                 : }
     438                 : 
     439                 : /* }}} */
     440                 : 
     441                 : /* {{{ childNodes       DomNodeList     
     442                 : readonly=yes 
     443                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1451460987
     444                 : Since: 
     445                 : */
     446                 : int dom_node_child_nodes_read(dom_object *obj, zval **retval TSRMLS_DC)
     447             124 : {
     448                 :         xmlNode *nodep;
     449                 :         dom_object *intern;
     450                 : 
     451             124 :         nodep = dom_object_get_node(obj);
     452                 : 
     453             124 :         if (nodep == NULL) {
     454               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     455               0 :                 return FAILURE;
     456                 :         }
     457                 : 
     458             124 :         ALLOC_ZVAL(*retval);
     459                 :         
     460             124 :         if (dom_node_children_valid(nodep) == FAILURE) {
     461               0 :                 ZVAL_NULL(*retval);
     462                 :         } else {
     463             124 :                 php_dom_create_interator(*retval, DOM_NODELIST TSRMLS_CC);
     464             124 :                 intern = (dom_object *)zend_objects_get_address(*retval TSRMLS_CC);
     465             124 :                 dom_namednode_iter(obj, XML_ELEMENT_NODE, intern, NULL, NULL, NULL TSRMLS_CC);
     466                 :         }
     467                 : 
     468             124 :         return SUCCESS;
     469                 : }
     470                 : 
     471                 : /* }}} */
     472                 : 
     473                 : /* {{{ firstChild DomNode       
     474                 : readonly=yes 
     475                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-169727388
     476                 : Since: 
     477                 : */
     478                 : int dom_node_first_child_read(dom_object *obj, zval **retval TSRMLS_DC)
     479              49 : {
     480              49 :         xmlNode *nodep, *first = NULL;
     481                 :         int ret;
     482                 : 
     483              49 :         nodep = dom_object_get_node(obj);
     484                 : 
     485              49 :         if (nodep == NULL) {
     486               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     487               0 :                 return FAILURE;
     488                 :         }
     489                 : 
     490              49 :         if (dom_node_children_valid(nodep) == SUCCESS) {
     491              49 :                 first = nodep->children;
     492                 :         }
     493                 : 
     494              49 :         ALLOC_ZVAL(*retval);
     495                 : 
     496              49 :         if (!first) {
     497               1 :                 ZVAL_NULL(*retval);
     498               1 :                 return SUCCESS;
     499                 :         }
     500                 : 
     501              48 :         if (NULL == (*retval = php_dom_create_object(first, &ret, NULL, *retval, obj TSRMLS_CC))) {
     502               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
     503               0 :                 return FAILURE;
     504                 :         }
     505              48 :         return SUCCESS;
     506                 : }
     507                 : 
     508                 : /* }}} */
     509                 : 
     510                 : /* {{{ lastChild        DomNode 
     511                 : readonly=yes 
     512                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-61AD09FB
     513                 : Since: 
     514                 : */
     515                 : int dom_node_last_child_read(dom_object *obj, zval **retval TSRMLS_DC)
     516               3 : {
     517               3 :         xmlNode *nodep, *last = NULL;
     518                 :         int ret;
     519                 : 
     520               3 :         nodep = dom_object_get_node(obj);
     521                 : 
     522               3 :         if (nodep == NULL) {
     523               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     524               0 :                 return FAILURE;
     525                 :         }
     526                 : 
     527               3 :         if (dom_node_children_valid(nodep) == SUCCESS) {
     528               3 :                 last = nodep->last;
     529                 :         }
     530                 : 
     531               3 :         ALLOC_ZVAL(*retval);
     532                 : 
     533               3 :         if (!last) {
     534               0 :                 ZVAL_NULL(*retval);
     535               0 :                 return SUCCESS;
     536                 :         }
     537                 : 
     538               3 :         if (NULL == (*retval = php_dom_create_object(last, &ret, NULL, *retval, obj TSRMLS_CC))) {
     539               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
     540               0 :                 return FAILURE;
     541                 :         }
     542               3 :         return SUCCESS;
     543                 : }
     544                 : 
     545                 : /* }}} */
     546                 : 
     547                 : /* {{{ previousSibling  DomNode 
     548                 : readonly=yes 
     549                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-640FB3C8
     550                 : Since: 
     551                 : */
     552                 : int dom_node_previous_sibling_read(dom_object *obj, zval **retval TSRMLS_DC)
     553             105 : {
     554                 :         xmlNode *nodep, *prevsib;
     555                 :         int ret;
     556                 : 
     557             105 :         nodep = dom_object_get_node(obj);
     558                 : 
     559             105 :         if (nodep == NULL) {
     560               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     561               0 :                 return FAILURE;
     562                 :         }
     563                 : 
     564             105 :         ALLOC_ZVAL(*retval);
     565                 : 
     566             105 :         prevsib = nodep->prev;
     567             105 :         if (!prevsib) {
     568              35 :                 ZVAL_NULL(*retval);
     569              35 :                 return SUCCESS;
     570                 :         }
     571                 : 
     572              70 :         if (NULL == (*retval = php_dom_create_object(prevsib, &ret, NULL, *retval, obj TSRMLS_CC))) {
     573               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
     574               0 :                 return FAILURE;
     575                 :         }
     576              70 :         return SUCCESS;
     577                 : }
     578                 : 
     579                 : /* }}} */
     580                 : 
     581                 : /* {{{ nextSibling      DomNode
     582                 : readonly=yes 
     583                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6AC54C2F
     584                 : Since:
     585                 : */
     586                 : int dom_node_next_sibling_read(dom_object *obj, zval **retval TSRMLS_DC)
     587             109 : {
     588                 :         xmlNode *nodep, *nextsib;
     589                 :         int ret;
     590                 : 
     591             109 :         nodep = dom_object_get_node(obj);
     592                 : 
     593             109 :         if (nodep == NULL) {
     594               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     595               0 :                 return FAILURE;
     596                 :         }
     597                 : 
     598             109 :         nextsib = nodep->next;
     599             109 :         if (!nextsib) {
     600              33 :                 return FAILURE;
     601                 :         }
     602                 : 
     603              76 :         ALLOC_ZVAL(*retval);
     604                 : 
     605              76 :         if (NULL == (*retval = php_dom_create_object(nextsib, &ret, NULL, *retval, obj TSRMLS_CC))) {
     606               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
     607               0 :                 return FAILURE;
     608                 :         }
     609              76 :         return SUCCESS;
     610                 : }
     611                 : 
     612                 : /* }}} */
     613                 : 
     614                 : /* {{{ attributes       DomNamedNodeMap 
     615                 : readonly=yes 
     616                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-84CF096
     617                 : Since: 
     618                 : */
     619                 : int dom_node_attributes_read(dom_object *obj, zval **retval TSRMLS_DC)
     620               3 : {
     621                 :         xmlNode *nodep;
     622                 :         dom_object *intern;
     623                 : 
     624               3 :         nodep = dom_object_get_node(obj);
     625                 : 
     626               3 :         if (nodep == NULL) {
     627               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     628               0 :                 return FAILURE;
     629                 :         }
     630                 : 
     631               3 :         ALLOC_ZVAL(*retval);
     632                 : 
     633               3 :         if (nodep->type == XML_ELEMENT_NODE) {
     634               3 :                 php_dom_create_interator(*retval, DOM_NAMEDNODEMAP TSRMLS_CC);
     635               3 :                 intern = (dom_object *)zend_objects_get_address(*retval TSRMLS_CC);
     636               3 :                 dom_namednode_iter(obj, XML_ATTRIBUTE_NODE, intern, NULL, NULL, NULL TSRMLS_CC);
     637                 :         } else {
     638               0 :                 ZVAL_NULL(*retval);
     639                 :         }
     640                 : 
     641               3 :         return SUCCESS;
     642                 : }
     643                 : 
     644                 : /* }}} */
     645                 : 
     646                 : /* {{{ ownerDocument    DomDocument     
     647                 : readonly=yes 
     648                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-node-ownerDoc
     649                 : Since: 
     650                 : */
     651                 : int dom_node_owner_document_read(dom_object *obj, zval **retval TSRMLS_DC)
     652               3 : {
     653                 :         xmlNode *nodep;
     654                 :         xmlDocPtr docp;
     655                 :         int ret;
     656                 : 
     657               3 :         nodep = dom_object_get_node(obj);
     658                 : 
     659               3 :         if (nodep == NULL) {
     660               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     661               0 :                 return FAILURE;
     662                 :         }
     663                 : 
     664               3 :         if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
     665               0 :                 ALLOC_ZVAL(*retval);
     666               0 :                 ZVAL_NULL(*retval);
     667               0 :                 return SUCCESS;
     668                 :         }
     669                 : 
     670               3 :         docp = nodep->doc;
     671               3 :         if (!docp) {
     672               0 :                 return FAILURE;
     673                 :         }
     674                 : 
     675               3 :         ALLOC_ZVAL(*retval);
     676                 : 
     677               3 :         if (NULL == (*retval = php_dom_create_object((xmlNodePtr) docp, &ret, NULL, *retval, obj TSRMLS_CC))) {
     678               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
     679               0 :                 return FAILURE;
     680                 :         }
     681               3 :         return SUCCESS;
     682                 : }
     683                 : 
     684                 : /* }}} */
     685                 : 
     686                 : /* {{{ namespaceUri     string  
     687                 : readonly=yes 
     688                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeNSname
     689                 : Since: DOM Level 2
     690                 : */
     691                 : int dom_node_namespace_uri_read(dom_object *obj, zval **retval TSRMLS_DC)
     692               0 : {
     693                 :         xmlNode *nodep;
     694               0 :         char *str = NULL;
     695                 : 
     696               0 :         nodep = dom_object_get_node(obj);
     697                 : 
     698               0 :         if (nodep == NULL) {
     699               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     700               0 :                 return FAILURE;
     701                 :         }
     702                 : 
     703               0 :         switch (nodep->type) {
     704                 :                 case XML_ELEMENT_NODE:
     705                 :                 case XML_ATTRIBUTE_NODE:
     706                 :                 case XML_NAMESPACE_DECL:
     707               0 :                         if (nodep->ns != NULL) {
     708               0 :                                 str = (char *) nodep->ns->href;
     709                 :                         }
     710               0 :                         break;
     711                 :                 default:
     712               0 :                         str = NULL;
     713                 :                         break;
     714                 :         }
     715                 : 
     716               0 :         ALLOC_ZVAL(*retval);
     717                 : 
     718               0 :         if(str != NULL) {
     719               0 :                 ZVAL_XML_STRING(*retval, str, ZSTR_DUPLICATE);
     720                 :         } else {
     721               0 :                 ZVAL_NULL(*retval);
     722                 :         }
     723                 : 
     724               0 :         return SUCCESS;
     725                 : }
     726                 : 
     727                 : /* }}} */
     728                 : 
     729                 : /* {{{ prefix   string  
     730                 : readonly=no 
     731                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeNSPrefix
     732                 : Since: DOM Level 2
     733                 : */
     734                 : int dom_node_prefix_read(dom_object *obj, zval **retval TSRMLS_DC)
     735               0 : {
     736                 :         xmlNode *nodep;
     737                 :         xmlNsPtr ns;
     738               0 :         char *str = NULL;
     739                 : 
     740               0 :         nodep = dom_object_get_node(obj);
     741                 : 
     742               0 :         if (nodep == NULL) {
     743               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     744               0 :                 return FAILURE;
     745                 :         }
     746                 : 
     747               0 :         switch (nodep->type) {
     748                 :                 case XML_ELEMENT_NODE:
     749                 :                 case XML_ATTRIBUTE_NODE:
     750                 :                 case XML_NAMESPACE_DECL:
     751               0 :                         ns = nodep->ns;
     752               0 :                         if (ns != NULL && ns->prefix) {
     753               0 :                                 str = (char *) ns->prefix;
     754                 :                         }
     755               0 :                         break;
     756                 :                 default:
     757               0 :                         str = NULL;
     758                 :                         break;
     759                 :         }
     760                 : 
     761               0 :         ALLOC_ZVAL(*retval);
     762                 : 
     763               0 :         if (str == NULL) {
     764               0 :                 ZVAL_EMPTY_UNICODE(*retval);
     765                 :         } else {
     766               0 :                 ZVAL_XML_STRING(*retval, str, ZSTR_DUPLICATE);
     767                 :         }
     768               0 :         return SUCCESS;
     769                 : 
     770                 : }
     771                 : 
     772                 : int dom_node_prefix_write(dom_object *obj, zval *newval TSRMLS_DC)
     773               0 : {
     774                 :         zval value_copy;
     775               0 :         xmlNode *nodep, *nsnode = NULL;
     776               0 :         xmlNsPtr ns = NULL, curns;
     777                 :         char *strURI;
     778                 :         char *prefix;
     779                 : 
     780               0 :         nodep = dom_object_get_node(obj);
     781                 : 
     782               0 :         if (nodep == NULL) {
     783               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     784               0 :                 return FAILURE;
     785                 :         }
     786                 : 
     787               0 :         switch (nodep->type) {
     788                 :                 case XML_ELEMENT_NODE:
     789               0 :                         nsnode = nodep;
     790                 :                 case XML_ATTRIBUTE_NODE:
     791               0 :                         if (nsnode == NULL) {
     792               0 :                                 nsnode = nodep->parent;
     793               0 :                                 if (nsnode == NULL) {
     794               0 :                                         nsnode = xmlDocGetRootElement(nodep->doc);
     795                 :                                 }
     796                 :                         }
     797               0 :                         if (newval->type != IS_STRING) {
     798               0 :                                 if(Z_REFCOUNT_P(newval) > 1) {
     799               0 :                                         value_copy = *newval;
     800               0 :                                         zval_copy_ctor(&value_copy);
     801               0 :                                         newval = &value_copy;
     802                 :                                 }
     803               0 :                                 convert_to_string_with_converter(newval, UG(utf8_conv));
     804                 :                         }
     805               0 :                         prefix = Z_STRVAL_P(newval);
     806               0 :                         if (nsnode && nodep->ns != NULL && !xmlStrEqual(nodep->ns->prefix, (xmlChar *)prefix)) {
     807               0 :                                 strURI = (char *) nodep->ns->href;
     808               0 :                                 if (strURI == NULL || 
     809                 :                                         (!strcmp (prefix, "xml") && strcmp(strURI, XML_XML_NAMESPACE)) ||
     810                 :                                         (nodep->type == XML_ATTRIBUTE_NODE && !strcmp (prefix, "xmlns") &&
     811                 :                                          strcmp (strURI, DOM_XMLNS_NAMESPACE)) ||
     812                 :                                         (nodep->type == XML_ATTRIBUTE_NODE && !strcmp (nodep->name, "xmlns"))) {
     813               0 :                                         ns = NULL;
     814                 :                                 } else {
     815               0 :                                         curns = nsnode->nsDef;
     816               0 :                                         while (curns != NULL) {
     817               0 :                                                 if (xmlStrEqual((xmlChar *)prefix, curns->prefix) && xmlStrEqual(nodep->ns->href, curns->href)) {
     818               0 :                                                         ns = curns;
     819               0 :                                                         break;
     820                 :                                                 }
     821               0 :                                                 curns = curns->next;
     822                 :                                         }
     823               0 :                                         if (ns == NULL) {
     824               0 :                                                 ns = xmlNewNs(nsnode, nodep->ns->href, (xmlChar *)prefix);
     825                 :                                         }
     826                 :                                 }
     827                 : 
     828               0 :                                 if (ns == NULL) {
     829               0 :                                         if (newval == &value_copy) {
     830               0 :                                                 zval_dtor(newval);
     831                 :                                         }
     832               0 :                                         php_dom_throw_error(NAMESPACE_ERR, dom_get_strict_error(obj->document) TSRMLS_CC);
     833               0 :                                         return FAILURE;
     834                 :                                 }
     835                 : 
     836               0 :                                 xmlSetNs(nodep, ns);
     837                 :                         }
     838               0 :                         if (newval == &value_copy) {
     839               0 :                                 zval_dtor(newval);
     840                 :                         }
     841                 :                         break;
     842                 :                 default:
     843                 :                         break;
     844                 :         }
     845                 : 
     846               0 :         return SUCCESS;
     847                 : }
     848                 : 
     849                 : /* }}} */
     850                 : 
     851                 : /* {{{ localName        string  
     852                 : readonly=yes 
     853                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeNSLocalN
     854                 : Since: DOM Level 2
     855                 : */
     856                 : int dom_node_local_name_read(dom_object *obj, zval **retval TSRMLS_DC)
     857               2 : {
     858                 :         xmlNode *nodep;
     859                 : 
     860               2 :         nodep = dom_object_get_node(obj);
     861                 : 
     862               2 :         if (nodep == NULL) {
     863               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     864               0 :                 return FAILURE;
     865                 :         }
     866                 : 
     867               2 :         ALLOC_ZVAL(*retval);
     868                 : 
     869               4 :         if (nodep->type == XML_ELEMENT_NODE || nodep->type == XML_ATTRIBUTE_NODE || nodep->type == XML_NAMESPACE_DECL) {
     870               2 :                 ZVAL_XML_STRING(*retval, (char *) (nodep->name), ZSTR_DUPLICATE);
     871                 :         } else {
     872               0 :                 ZVAL_NULL(*retval);
     873                 :         }
     874                 : 
     875               2 :         return SUCCESS;
     876                 : }
     877                 : 
     878                 : /* }}} */
     879                 : 
     880                 : /* {{{ baseURI  string
     881                 : readonly=yes
     882                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-baseURI
     883                 : Since: DOM Level 3
     884                 : */
     885                 : int dom_node_base_uri_read(dom_object *obj, zval **retval TSRMLS_DC)
     886               0 : {
     887                 :         xmlNode *nodep;
     888                 :         xmlChar *baseuri;
     889                 : 
     890               0 :         nodep = dom_object_get_node(obj);
     891                 : 
     892               0 :         if (nodep == NULL) {
     893               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     894               0 :                 return FAILURE;
     895                 :         }
     896                 : 
     897               0 :         ALLOC_ZVAL(*retval);
     898                 : 
     899               0 :         baseuri = xmlNodeGetBase(nodep->doc, nodep);
     900               0 :         if (baseuri) {
     901               0 :                 ZVAL_XML_STRING(*retval, (char *) (baseuri), ZSTR_DUPLICATE);
     902               0 :                 xmlFree(baseuri);
     903                 :         } else {
     904               0 :                 ZVAL_NULL(*retval);
     905                 :         }
     906                 : 
     907               0 :         return SUCCESS;
     908                 : }
     909                 : 
     910                 : /* }}} */
     911                 : 
     912                 : /* {{{ textContent      string  
     913                 : readonly=no 
     914                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-textContent
     915                 : Since: DOM Level 3
     916                 : */
     917                 : int dom_node_text_content_read(dom_object *obj, zval **retval TSRMLS_DC)
     918              26 : {
     919                 :         xmlNode *nodep;
     920              26 :         char *str = NULL;
     921                 : 
     922              26 :         nodep = dom_object_get_node(obj);
     923                 : 
     924              26 :         if (nodep == NULL) {
     925               0 :                 php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
     926               0 :                 return FAILURE;
     927                 :         }
     928                 : 
     929              26 :         str = xmlNodeGetContent(nodep);
     930                 : 
     931              26 :         ALLOC_ZVAL(*retval);
     932                 : 
     933              26 :         if(str != NULL) {
     934              26 :                 ZVAL_XML_STRING(*retval, str, ZSTR_DUPLICATE);
     935              26 :                 xmlFree(str);
     936                 :         } else {
     937               0 :                 ZVAL_EMPTY_UNICODE(*retval);
     938                 :         }
     939                 : 
     940              26 :         return SUCCESS;
     941                 : }
     942                 : 
     943                 : int dom_node_text_content_write(dom_object *obj, zval *newval TSRMLS_DC)
     944               0 : {
     945               0 :         return SUCCESS;
     946                 : }
     947                 : 
     948                 : /* }}} */
     949                 : 
     950                 : static xmlNodePtr _php_dom_insert_fragment(xmlNodePtr nodep, xmlNodePtr prevsib, xmlNodePtr nextsib, xmlNodePtr fragment, dom_object *intern, dom_object *childobj TSRMLS_DC) /* {{{ */
     951              18 : {
     952                 :         xmlNodePtr newchild, node;
     953                 : 
     954              18 :         newchild = fragment->children;
     955                 : 
     956              18 :         if (newchild) {
     957              17 :                 if (prevsib == NULL) {
     958               7 :                         nodep->children = newchild;
     959                 :                 } else {
     960              10 :                         prevsib->next = newchild;
     961                 :                 }
     962              17 :                 newchild->prev = prevsib;
     963              17 :                 if (nextsib == NULL) {
     964              11 :                         nodep->last = fragment->last;
     965                 :                 } else {
     966               6 :                         fragment->last->next = nextsib;
     967               6 :                         nextsib->prev = fragment->last;
     968                 :                 }
     969                 : 
     970              17 :                 node = newchild;
     971              37 :                 while (node != NULL) {
     972              20 :                         node->parent = nodep;
     973              20 :                         if (node->doc != nodep->doc) {
     974               0 :                                 xmlSetTreeDoc(node, nodep->doc);
     975               0 :                                 if (node->_private != NULL) {
     976               0 :                                         childobj = node->_private;
     977               0 :                                         childobj->document = intern->document;
     978               0 :                                         php_libxml_increment_doc_ref((php_libxml_node_object *)childobj, NULL TSRMLS_CC);
     979                 :                                 }
     980                 :                         }
     981              20 :                         if (node == fragment->last) {
     982              17 :                                 break;
     983                 :                         }
     984               3 :                         node = node->next;
     985                 :                 }
     986                 : 
     987              17 :                 fragment->children = NULL;
     988              17 :                 fragment->last = NULL;
     989                 :         }
     990                 : 
     991              18 :         return newchild;
     992                 : }
     993                 : /* }}} */
     994                 : 
     995                 : /* {{{ proto domnode dom_node_insert_before(DomNode newChild, DomNode refChild) U
     996                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-952280727
     997                 : Since:
     998                 : */
     999                 : PHP_FUNCTION(dom_node_insert_before)
    1000              11 : {
    1001              11 :         zval *id, *node, *ref = NULL, *rv = NULL;
    1002                 :         xmlNodePtr child, new_child, parentp, refp;
    1003                 :         dom_object *intern, *childobj, *refpobj;
    1004                 :         int ret, stricterror;
    1005                 : 
    1006              11 :         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO|O!", &id, dom_node_class_entry, &node, dom_node_class_entry, &ref, dom_node_class_entry) == FAILURE) {
    1007               0 :                 return;
    1008                 :         }
    1009                 : 
    1010              11 :         DOM_GET_OBJ(parentp, id, xmlNodePtr, intern);
    1011                 : 
    1012              11 :         if (dom_node_children_valid(parentp) == FAILURE) {
    1013               0 :                 RETURN_FALSE;
    1014                 :         }
    1015                 : 
    1016              11 :         DOM_GET_OBJ(child, node, xmlNodePtr, childobj);
    1017                 : 
    1018              11 :         new_child = NULL;
    1019                 : 
    1020              11 :         stricterror = dom_get_strict_error(intern->document);
    1021                 : 
    1022              11 :         if (dom_node_is_read_only(parentp) == SUCCESS ||
    1023                 :                 (child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
    1024               0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror TSRMLS_CC);
    1025               0 :                 RETURN_FALSE;
    1026                 :         }
    1027                 : 
    1028              11 :         if (dom_hierarchy(parentp, child) == FAILURE) {
    1029               0 :                 php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror TSRMLS_CC);
    1030               0 :                 RETURN_FALSE;
    1031                 :         }
    1032                 : 
    1033              11 :         if (child->doc != parentp->doc && child->doc != NULL) {
    1034               0 :                 php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror TSRMLS_CC);
    1035               0 :                 RETURN_FALSE;
    1036                 :         }
    1037                 : 
    1038              11 :         if (child->type == XML_DOCUMENT_FRAG_NODE && child->children == NULL) {
    1039               1 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Document Fragment is empty");
    1040               1 :                 RETURN_FALSE;
    1041                 :         }
    1042                 : 
    1043              10 :         if (child->doc == NULL && parentp->doc != NULL) {
    1044               0 :                 childobj->document = intern->document;
    1045               0 :                 php_libxml_increment_doc_ref((php_libxml_node_object *)childobj, NULL TSRMLS_CC);
    1046                 :         }
    1047                 : 
    1048              10 :         if (ref != NULL) {
    1049               7 :                 DOM_GET_OBJ(refp, ref, xmlNodePtr, refpobj);
    1050               7 :                 if (refp->parent != parentp) {
    1051               0 :                         php_dom_throw_error(NOT_FOUND_ERR, stricterror TSRMLS_CC);
    1052               0 :                         RETURN_FALSE;
    1053                 :                 }
    1054                 : 
    1055               7 :                 if (child->parent != NULL) {
    1056               1 :                         xmlUnlinkNode(child);
    1057                 :                 }
    1058                 : 
    1059               9 :                 if (child->type == XML_TEXT_NODE && (refp->type == XML_TEXT_NODE || 
    1060                 :                         (refp->prev != NULL && refp->prev->type == XML_TEXT_NODE))) {
    1061               2 :                         if (child->doc == NULL) {
    1062               0 :                                 xmlSetTreeDoc(child, parentp->doc);
    1063                 :                         }
    1064               2 :                         new_child = child;
    1065               2 :                         new_child->parent = refp->parent;
    1066               2 :                         new_child->next = refp;
    1067               2 :                         new_child->prev = refp->prev;
    1068               2 :                         refp->prev = new_child;
    1069               2 :                         if (new_child->prev != NULL) {
    1070               1 :                                 new_child->prev->next = new_child;
    1071                 :                         }
    1072               2 :                         if (new_child->parent != NULL) {
    1073               2 :                                 if (new_child->parent->children == refp) {
    1074               1 :                                         new_child->parent->children = new_child;
    1075                 :                                 }
    1076                 :                         }
    1077                 : 
    1078               5 :                 } else if (child->type == XML_ATTRIBUTE_NODE) {
    1079                 :                         xmlAttrPtr lastattr;
    1080                 : 
    1081               0 :                         if (child->ns == NULL)
    1082               0 :                                 lastattr = xmlHasProp(refp->parent, child->name);
    1083                 :                         else
    1084               0 :                                 lastattr = xmlHasNsProp(refp->parent, child->name, child->ns->href);
    1085               0 :                         if (lastattr != NULL && lastattr->type != XML_ATTRIBUTE_DECL) {
    1086               0 :                                 if (lastattr != (xmlAttrPtr) child) {
    1087               0 :                                         xmlUnlinkNode((xmlNodePtr) lastattr);
    1088               0 :                                         php_libxml_node_free_resource((xmlNodePtr) lastattr TSRMLS_CC);
    1089                 :                                 } else {
    1090               0 :                                         DOM_RET_OBJ(rv, child, &ret, intern);
    1091               0 :                                         return;
    1092                 :                                 }
    1093                 :                         }
    1094               5 :                 } else if (child->type == XML_DOCUMENT_FRAG_NODE) {
    1095               3 :                         new_child = _php_dom_insert_fragment(parentp, refp->prev, refp, child, intern, childobj TSRMLS_CC);
    1096                 :                 }
    1097                 : 
    1098               7 :                 if (new_child == NULL) {
    1099               2 :                         new_child = xmlAddPrevSibling(refp, child);
    1100                 :                 }
    1101                 :         } else {
    1102               3 :                 if (child->parent != NULL){
    1103               1 :                         xmlUnlinkNode(child);
    1104                 :                 }
    1105               4 :                 if (child->type == XML_TEXT_NODE && parentp->last != NULL && parentp->last->type == XML_TEXT_NODE) {
    1106               1 :                         child->parent = parentp;
    1107               1 :                         if (child->doc == NULL) {
    1108               0 :                                 xmlSetTreeDoc(child, parentp->doc);
    1109                 :                         }
    1110               1 :                         new_child = child;
    1111               1 :                         if (parentp->children == NULL) {
    1112               0 :                                 parentp->children = child;
    1113               0 :                                 parentp->last = child;
    1114                 :                         } else {
    1115               1 :                                 child = parentp->last;
    1116               1 :                                 child->next = new_child;
    1117               1 :                                 new_child->prev = child;
    1118               1 :                                 parentp->last = new_child;
    1119                 :                         }
    1120               2 :                 } else  if (child->type == XML_ATTRIBUTE_NODE) {
    1121                 :                         xmlAttrPtr lastattr;
    1122                 : 
    1123               0 :                         if (child->ns == NULL)
    1124               0 :                                 lastattr = xmlHasProp(parentp, child->name);
    1125                 :                         else
    1126               0 :                                 lastattr = xmlHasNsProp(parentp, child->name, child->ns->href);
    1127               0 :                         if (lastattr != NULL && lastattr->type != XML_ATTRIBUTE_DECL) {
    1128               0 :                                 if (lastattr != (xmlAttrPtr) child) {
    1129               0 :                                         xmlUnlinkNode((xmlNodePtr) lastattr);
    1130               0 :                                         php_libxml_node_free_resource((xmlNodePtr) lastattr TSRMLS_CC);
    1131                 :                                 } else {
    1132               0 :                                         DOM_RET_OBJ(rv, child, &ret, intern);
    1133               0 :                                         return;
    1134                 :                                 }
    1135                 :                         }
    1136               2 :                 } else if (child->type == XML_DOCUMENT_FRAG_NODE) {
    1137               2 :                         new_child = _php_dom_insert_fragment(parentp, parentp->last, NULL, child, intern, childobj TSRMLS_CC);
    1138                 :                 }
    1139               3 :                 if (new_child == NULL) {
    1140               0 :                         new_child = xmlAddChild(parentp, child);
    1141                 :                 }
    1142                 :         }
    1143                 : 
    1144              10 :         if (NULL == new_child) {
    1145               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't add newnode as the previous sibling of refnode");
    1146               0 :                 RETURN_FALSE;
    1147                 :         }
    1148                 : 
    1149              10 :         dom_reconcile_ns(parentp->doc, new_child);
    1150                 : 
    1151              10 :         DOM_RET_OBJ(rv, new_child, &ret, intern);
    1152                 : 
    1153                 : }
    1154                 : /* }}} end dom_node_insert_before */
    1155                 : 
    1156                 : /* {{{ proto DomNode dom_node_replace_child(DomNode newChild, DomNode oldChild) U
    1157                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-785887307
    1158                 : Since: 
    1159                 : */
    1160                 : PHP_FUNCTION(dom_node_replace_child)
    1161              10 : {
    1162                 :         zval *id, *newnode, *oldnode;
    1163                 :         xmlNodePtr children, newchild, oldchild, nodep;
    1164                 :         dom_object *intern, *newchildobj, *oldchildobj;
    1165              10 :         int foundoldchild = 0, stricterror;
    1166                 : 
    1167                 :         int ret;
    1168                 : 
    1169              10 :         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OOO", &id, dom_node_class_entry, &newnode, dom_node_class_entry, &oldnode, dom_node_class_entry) == FAILURE) {
    1170               0 :                 return;
    1171                 :         }
    1172                 : 
    1173              10 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1174                 : 
    1175              10 :         if (dom_node_children_valid(nodep) == FAILURE) {
    1176               0 :                 RETURN_FALSE;
    1177                 :         }
    1178                 : 
    1179              10 :         DOM_GET_OBJ(newchild, newnode, xmlNodePtr, newchildobj);
    1180              10 :         DOM_GET_OBJ(oldchild, oldnode, xmlNodePtr, oldchildobj);
    1181                 : 
    1182              10 :         children = nodep->children;
    1183              10 :         if (!children) {
    1184               0 :                 RETURN_FALSE;
    1185                 :         }
    1186                 : 
    1187              10 :         stricterror = dom_get_strict_error(intern->document);
    1188                 : 
    1189              10 :         if (dom_node_is_read_only(nodep) == SUCCESS || 
    1190                 :                 (newchild->parent != NULL && dom_node_is_read_only(newchild->parent) == SUCCESS)) {
    1191               0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror TSRMLS_CC);
    1192               0 :                 RETURN_FALSE;
    1193                 :         }
    1194                 : 
    1195              10 :         if (newchild->doc != nodep->doc && newchild->doc != NULL) {
    1196               0 :                 php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror TSRMLS_CC);
    1197               0 :                 RETURN_FALSE;
    1198                 :         }
    1199                 : 
    1200              10 :         if (dom_hierarchy(nodep, newchild) == FAILURE) {
    1201               0 :                 php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror TSRMLS_CC);
    1202               0 :                 RETURN_FALSE;
    1203                 :         }
    1204                 : 
    1205                 :         /* check for the old child and whether the new child is already a child */
    1206              29 :         while (children) {
    1207              19 :                 if (children == oldchild) {
    1208              10 :                         foundoldchild = 1;
    1209              10 :                         break;
    1210                 :                 }
    1211               9 :                 children = children->next;
    1212                 :         }
    1213                 : 
    1214              10 :         if (foundoldchild) {
    1215                 :                 xmlNodePtr node;
    1216              10 :                 zval *rv = NULL;
    1217                 : 
    1218              10 :                 if (newchild->type == XML_DOCUMENT_FRAG_NODE) {
    1219                 :                         xmlNodePtr prevsib, nextsib;
    1220               6 :                         prevsib = oldchild->prev;
    1221               6 :                         nextsib = oldchild->next;
    1222                 : 
    1223               6 :                         xmlUnlinkNode(oldchild);
    1224                 : 
    1225               6 :                         newchild = _php_dom_insert_fragment(nodep, prevsib, nextsib, newchild, intern, newchildobj TSRMLS_CC);
    1226               6 :                         if (newchild) {
    1227               5 :                                 dom_reconcile_ns(nodep->doc, newchild);
    1228                 :                         }
    1229               4 :                 } else if (oldchild != newchild) {
    1230               4 :                         if (newchild->doc == NULL && nodep->doc != NULL) {
    1231               0 :                                 xmlSetTreeDoc(newchild, nodep->doc);
    1232               0 :                                 newchildobj->document = intern->document;
    1233               0 :                                 php_libxml_increment_doc_ref((php_libxml_node_object *)newchildobj, NULL TSRMLS_CC);
    1234                 :                         }
    1235               4 :                         node = xmlReplaceNode(oldchild, newchild);
    1236               4 :                         dom_reconcile_ns(nodep->doc, newchild);
    1237                 :                 }
    1238              10 :                 DOM_RET_OBJ(rv, oldchild, &ret, intern);
    1239              10 :                 return;
    1240                 :         } else {
    1241               0 :                 php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
    1242               0 :                 RETURN_FALSE;
    1243                 :         }
    1244                 : }
    1245                 : /* }}} end dom_node_replace_child */
    1246                 : 
    1247                 : /* {{{ proto DomNode dom_node_remove_child(DomNode oldChild) U
    1248                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1734834066
    1249                 : Since: 
    1250                 : */
    1251                 : PHP_FUNCTION(dom_node_remove_child)
    1252              18 : {
    1253                 :         zval *id, *node;
    1254                 :         xmlNodePtr children, child, nodep;
    1255                 :         dom_object *intern, *childobj;
    1256                 :         int ret, stricterror;
    1257                 : 
    1258              18 :         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &id, dom_node_class_entry, &node, dom_node_class_entry) == FAILURE) {
    1259               0 :                 return;
    1260                 :         }
    1261                 : 
    1262              18 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1263                 : 
    1264              18 :         if (dom_node_children_valid(nodep) == FAILURE) {
    1265               0 :                 RETURN_FALSE;
    1266                 :         }
    1267                 : 
    1268              18 :         DOM_GET_OBJ(child, node, xmlNodePtr, childobj);
    1269                 : 
    1270              18 :         stricterror = dom_get_strict_error(intern->document);
    1271                 : 
    1272              18 :         if (dom_node_is_read_only(nodep) == SUCCESS || 
    1273                 :                 (child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
    1274               0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror TSRMLS_CC);
    1275               0 :                 RETURN_FALSE;
    1276                 :         }
    1277                 : 
    1278              18 :         children = nodep->children;
    1279              18 :         if (!children) {
    1280               0 :                 php_dom_throw_error(NOT_FOUND_ERR, stricterror TSRMLS_CC);
    1281               0 :                 RETURN_FALSE;
    1282                 :         }
    1283                 : 
    1284              53 :         while (children) {
    1285              35 :                 if (children == child) {
    1286              18 :                         zval *rv = NULL;
    1287              18 :                         xmlUnlinkNode(child);
    1288              18 :                         DOM_RET_OBJ(rv, child, &ret, intern);
    1289              18 :                         return;
    1290                 :                 }
    1291              17 :                 children = children->next;
    1292                 :         }
    1293                 : 
    1294               0 :         php_dom_throw_error(NOT_FOUND_ERR, stricterror TSRMLS_CC);
    1295               0 :         RETURN_FALSE
    1296                 : }
    1297                 : /* }}} end dom_node_remove_child */
    1298                 : 
    1299                 : /* {{{ proto DomNode dom_node_append_child(DomNode newChild) U
    1300                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-184E7107
    1301                 : Since: 
    1302                 : */
    1303                 : PHP_FUNCTION(dom_node_append_child)
    1304             160 : {
    1305             160 :         zval *id, *node, *rv = NULL;
    1306             160 :         xmlNodePtr child, nodep, new_child = NULL;
    1307                 :         dom_object *intern, *childobj;
    1308                 :         int ret, stricterror;
    1309                 : 
    1310             160 :         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &id, dom_node_class_entry, &node, dom_node_class_entry) == FAILURE) {
    1311               0 :                 return;
    1312                 :         }
    1313                 : 
    1314             160 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1315                 : 
    1316             160 :         if (dom_node_children_valid(nodep) == FAILURE) {
    1317               0 :                 RETURN_FALSE;
    1318                 :         }
    1319                 : 
    1320             160 :         DOM_GET_OBJ(child, node, xmlNodePtr, childobj);
    1321                 : 
    1322             160 :         stricterror = dom_get_strict_error(intern->document);
    1323                 : 
    1324             160 :         if (dom_node_is_read_only(nodep) == SUCCESS ||
    1325                 :                 (child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
    1326               0 :                 php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror TSRMLS_CC);
    1327               0 :                 RETURN_FALSE;
    1328                 :         }
    1329                 : 
    1330             160 :         if (dom_hierarchy(nodep, child) == FAILURE) {
    1331               2 :                 php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror TSRMLS_CC);
    1332               2 :                 RETURN_FALSE;
    1333                 :         }
    1334                 : 
    1335             158 :         if (!(child->doc == NULL || child->doc == nodep->doc)) {
    1336               0 :                 php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror TSRMLS_CC);
    1337               0 :                 RETURN_FALSE;
    1338                 :         }
    1339                 : 
    1340             158 :         if (child->type == XML_DOCUMENT_FRAG_NODE && child->children == NULL) {
    1341               1 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Document Fragment is empty");
    1342               1 :                 RETURN_FALSE;
    1343                 :         }
    1344                 : 
    1345             157 :         if (child->doc == NULL && nodep->doc != NULL) {
    1346              26 :                 childobj->document = intern->document;
    1347              26 :                 php_libxml_increment_doc_ref((php_libxml_node_object *)childobj, NULL TSRMLS_CC);
    1348                 :         }
    1349                 : 
    1350             157 :         if (child->parent != NULL){
    1351               2 :                 xmlUnlinkNode(child);
    1352                 :         }
    1353                 : 
    1354             162 :         if (child->type == XML_TEXT_NODE && nodep->last != NULL && nodep->last->type == XML_TEXT_NODE) {
    1355               5 :                 child->parent = nodep;
    1356               5 :                 if (child->doc == NULL) {
    1357               0 :                         xmlSetTreeDoc(child, nodep->doc);
    1358                 :                 }
    1359               5 :                 new_child = child;
    1360               5 :                 if (nodep->children == NULL) {
    1361               0 :                         nodep->children = child;
    1362               0 :                         nodep->last = child;
    1363                 :                 } else {
    1364               5 :                         child = nodep->last;
    1365               5 :                         child->next = new_child;
    1366               5 :                         new_child->prev = child;
    1367               5 :                         nodep->last = new_child;
    1368                 :                 }
    1369             152 :         } else  if (child->type == XML_ATTRIBUTE_NODE) {
    1370                 :                 xmlAttrPtr lastattr;
    1371                 : 
    1372               1 :                 if (child->ns == NULL)
    1373               1 :                         lastattr = xmlHasProp(nodep, child->name);
    1374                 :                 else
    1375               0 :                         lastattr = xmlHasNsProp(nodep, child->name, child->ns->href);
    1376               1 :                 if (lastattr != NULL && lastattr->type != XML_ATTRIBUTE_DECL) {
    1377               0 :                         if (lastattr != (xmlAttrPtr) child) {
    1378               0 :                                 xmlUnlinkNode((xmlNodePtr) lastattr);
    1379               0 :                                 php_libxml_node_free_resource((xmlNodePtr) lastattr TSRMLS_CC);
    1380                 :                         }
    1381                 :                 }
    1382             151 :         } else if (child->type == XML_DOCUMENT_FRAG_NODE) {
    1383               7 :                 new_child = _php_dom_insert_fragment(nodep, nodep->last, NULL, child, intern, childobj TSRMLS_CC);
    1384                 :         }
    1385                 : 
    1386             157 :         if (new_child == NULL) {
    1387             145 :                 new_child = xmlAddChild(nodep, child);
    1388             145 :                 if (new_child == NULL) {
    1389               0 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't append node");
    1390               0 :                         RETURN_FALSE;
    1391                 :                 }
    1392                 :         }
    1393                 : 
    1394             157 :         dom_reconcile_ns(nodep->doc, new_child);
    1395                 : 
    1396             157 :         DOM_RET_OBJ(rv, new_child, &ret, intern);
    1397                 : }
    1398                 : /* }}} end dom_node_append_child */
    1399                 : 
    1400                 : /* {{{ proto boolean dom_node_has_child_nodes() U
    1401                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-810594187
    1402                 : Since: 
    1403                 : */
    1404                 : PHP_FUNCTION(dom_node_has_child_nodes)
    1405              84 : {
    1406                 :         zval *id;
    1407                 :         xmlNode *nodep;
    1408                 :         dom_object *intern;
    1409                 : 
    1410              84 :         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &id, dom_node_class_entry) == FAILURE) {
    1411               0 :                 return;
    1412                 :         }
    1413                 : 
    1414              84 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1415                 : 
    1416              84 :         if (dom_node_children_valid(nodep) == FAILURE) {
    1417              42 :                 RETURN_FALSE;
    1418                 :         }
    1419                 : 
    1420              42 :         if (nodep->children) {
    1421              33 :                 RETURN_TRUE;
    1422                 :         } else {
    1423               9 :                 RETURN_FALSE;
    1424                 :         }
    1425                 : }
    1426                 : /* }}} end dom_node_has_child_nodes */
    1427                 : 
    1428                 : /* {{{ proto DomNode dom_node_clone_node(boolean deep) U
    1429                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-3A0ED0A4
    1430                 : Since: 
    1431                 : */
    1432                 : PHP_FUNCTION(dom_node_clone_node)
    1433               5 : {
    1434               5 :         zval *rv = NULL;
    1435                 :         zval *id;
    1436                 :         xmlNode *n, *node;
    1437                 :         int ret;
    1438                 :         dom_object *intern;
    1439               5 :         long recursive = 0;
    1440                 : 
    1441               5 :         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l", &id, dom_node_class_entry, &recursive) == FAILURE) {
    1442               0 :                 return;
    1443                 :         }
    1444                 : 
    1445               5 :         DOM_GET_OBJ(n, id, xmlNodePtr, intern);
    1446                 : 
    1447               5 :         node = xmlDocCopyNode(n, n->doc, recursive);
    1448                 : 
    1449               5 :         if (!node) {
    1450               0 :                 RETURN_FALSE;
    1451                 :         }
    1452                 : 
    1453                 :         /* When deep is false Element nodes still require the attributes 
    1454                 :         Following taken from libxml as xmlDocCopyNode doesnt do this */
    1455               5 :         if (n->type == XML_ELEMENT_NODE && recursive == 0) {
    1456               3 :                 if (n->nsDef != NULL) {
    1457               0 :                         node->nsDef = xmlCopyNamespaceList(n->nsDef);
    1458                 :                 }
    1459               3 :                 if (n->ns != NULL) {
    1460                 :                         xmlNsPtr ns;
    1461               0 :                         ns = xmlSearchNs(n->doc, node, n->ns->prefix);
    1462               0 :                         if (ns == NULL) {
    1463               0 :                                 ns = xmlSearchNs(n->doc, n, n->ns->prefix);
    1464               0 :                                 if (ns != NULL) {
    1465               0 :                                         xmlNodePtr root = node;
    1466                 : 
    1467               0 :                                         while (root->parent != NULL) {
    1468               0 :                                                 root = root->parent;
    1469                 :                                         }
    1470               0 :                                         node->ns = xmlNewNs(root, ns->href, ns->prefix);
    1471                 :                                 }
    1472                 :                         } else {
    1473               0 :                                 node->ns = ns;
    1474                 :                         }
    1475                 :                 }
    1476               3 :                 if (n->properties != NULL) {
    1477               3 :                         node->properties = xmlCopyPropList(node, n->properties);
    1478                 :                 }
    1479                 :         }
    1480                 : 
    1481                 :         /* If document cloned we want a new document proxy */
    1482               5 :         if (node->doc != n->doc) {
    1483               0 :                 intern = NULL;
    1484                 :         }
    1485                 : 
    1486               5 :         DOM_RET_OBJ(rv, node, &ret, intern);
    1487                 : }
    1488                 : /* }}} end dom_node_clone_node */
    1489                 : 
    1490                 : /* {{{ proto void dom_node_normalize() U
    1491                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-normalize
    1492                 : Since: 
    1493                 : */
    1494                 : PHP_FUNCTION(dom_node_normalize)
    1495               2 : {
    1496                 :         zval *id;
    1497                 :         xmlNode *nodep;
    1498                 :         dom_object *intern;
    1499                 : 
    1500               2 :         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &id, dom_node_class_entry) == FAILURE) {
    1501               0 :                 return;
    1502                 :         }
    1503                 : 
    1504               2 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1505                 : 
    1506               2 :         dom_normalize(nodep TSRMLS_CC);
    1507                 : 
    1508                 : }
    1509                 : /* }}} end dom_node_normalize */
    1510                 : 
    1511                 : /* {{{ proto boolean dom_node_is_supported(string feature, string version);
    1512                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Level-2-Core-Node-supports
    1513                 : Since: DOM Level 2
    1514                 : */
    1515                 : PHP_FUNCTION(dom_node_is_supported)
    1516               0 : {
    1517                 :         zval *id;
    1518                 :         int feature_len, version_len;
    1519                 :         char *feature, *version;
    1520                 : 
    1521               0 :         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oss", &id, dom_node_class_entry, &feature, &feature_len, &version, &version_len) == FAILURE) {
    1522               0 :                 return;
    1523                 :         }
    1524                 : 
    1525               0 :         if (dom_has_feature(feature, version)) {
    1526               0 :                 RETURN_TRUE;
    1527                 :         } else {
    1528               0 :                 RETURN_FALSE;
    1529                 :         }
    1530                 : }
    1531                 : /* }}} end dom_node_is_supported */
    1532                 : 
    1533                 : /* {{{ proto boolean dom_node_has_attributes() U
    1534                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeHasAttrs
    1535                 : Since: DOM Level 2
    1536                 : */
    1537                 : PHP_FUNCTION(dom_node_has_attributes)
    1538               3 : {
    1539                 :         zval *id;
    1540                 :         xmlNode *nodep;
    1541                 :         dom_object *intern;
    1542                 : 
    1543               3 :         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &id, dom_node_class_entry) == FAILURE) {
    1544               0 :                 return;
    1545                 :         }
    1546                 : 
    1547               3 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1548                 : 
    1549               3 :         if (nodep->type != XML_ELEMENT_NODE)
    1550               0 :                 RETURN_FALSE;
    1551                 : 
    1552               3 :         if (nodep->properties) {
    1553               2 :                 RETURN_TRUE;
    1554                 :         } else {
    1555               1 :                 RETURN_FALSE;
    1556                 :         }
    1557                 : }
    1558                 : /* }}} end dom_node_has_attributes */
    1559                 : 
    1560                 : /* {{{ proto short dom_node_compare_document_position(DomNode other) U
    1561                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-compareDocumentPosition
    1562                 : Since: DOM Level 3
    1563                 : */
    1564                 : PHP_FUNCTION(dom_node_compare_document_position)
    1565               0 : {
    1566               0 :  DOM_NOT_IMPLEMENTED();
    1567                 : }
    1568                 : /* }}} end dom_node_compare_document_position */
    1569                 : 
    1570                 : /* {{{ proto boolean dom_node_is_same_node(DomNode other) U
    1571                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isSameNode
    1572                 : Since: DOM Level 3
    1573                 : */
    1574                 : PHP_FUNCTION(dom_node_is_same_node)
    1575               3 : {
    1576                 :         zval *id, *node;
    1577                 :         xmlNodePtr nodeotherp, nodep;
    1578                 :         dom_object *intern, *nodeotherobj;
    1579                 : 
    1580               3 :         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &id, dom_node_class_entry, &node, dom_node_class_entry) == FAILURE) {
    1581               0 :                 return;
    1582                 :         }
    1583                 : 
    1584               3 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1585                 : 
    1586               3 :         DOM_GET_OBJ(nodeotherp, node, xmlNodePtr, nodeotherobj);
    1587                 : 
    1588               3 :         if (nodep == nodeotherp) {
    1589               2 :                 RETURN_TRUE;
    1590                 :         } else {
    1591               1 :                 RETURN_FALSE;
    1592                 :         }
    1593                 : }
    1594                 : /* }}} end dom_node_is_same_node */
    1595                 : 
    1596                 : /* {{{ proto string dom_node_lookup_prefix(string namespaceURI) U
    1597                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-lookupNamespacePrefix
    1598                 : Since: DOM Level 3
    1599                 : */
    1600                 : PHP_FUNCTION(dom_node_lookup_prefix)
    1601               2 : {
    1602                 :         zval *id;
    1603               2 :         xmlNodePtr nodep, lookupp = NULL;
    1604                 :         dom_object *intern;
    1605                 :         xmlNsPtr nsptr;
    1606               2 :         int uri_len = 0;
    1607                 :         char *uri;
    1608                 : 
    1609               2 :         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &id, dom_node_class_entry, &uri, &uri_len, UG(utf8_conv)) == FAILURE) {
    1610               0 :                 return;
    1611                 :         }
    1612                 : 
    1613               2 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1614                 : 
    1615               2 :         if (uri_len > 0) {
    1616               2 :                 switch (nodep->type) { 
    1617                 :                         case XML_ELEMENT_NODE:
    1618               1 :                                 lookupp = nodep;
    1619               1 :                                 break; 
    1620                 :                         case XML_DOCUMENT_NODE:
    1621                 :                         case XML_HTML_DOCUMENT_NODE:
    1622               1 :                                 lookupp = xmlDocGetRootElement((xmlDocPtr) nodep);
    1623               1 :                                 break;
    1624                 :                         case XML_ENTITY_NODE : 
    1625                 :                         case XML_NOTATION_NODE: 
    1626                 :                         case XML_DOCUMENT_FRAG_NODE: 
    1627                 :                         case XML_DOCUMENT_TYPE_NODE:
    1628                 :                         case XML_DTD_NODE:
    1629               0 :                                 RETURN_NULL();
    1630                 :                                 break;
    1631                 :                         default:
    1632               0 :                                 lookupp =  nodep->parent;
    1633                 :                 } 
    1634                 : 
    1635               2 :                 if (lookupp != NULL && (nsptr = xmlSearchNsByHref(lookupp->doc, lookupp, uri))) {
    1636               2 :                         if (nsptr->prefix != NULL) {
    1637               2 :                                 RETVAL_XML_STRING((char *) nsptr->prefix, ZSTR_DUPLICATE);
    1638               2 :                                 return;
    1639                 :                         }
    1640                 :                 }
    1641                 :         }
    1642                 :                 
    1643               0 :         RETURN_NULL();
    1644                 : }
    1645                 : /* }}} end dom_node_lookup_prefix */
    1646                 : 
    1647                 : /* {{{ proto boolean dom_node_is_default_namespace(string namespaceURI) U
    1648                 : URL: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-isDefaultNamespace
    1649                 : Since: DOM Level 3
    1650                 : */
    1651                 : PHP_FUNCTION(dom_node_is_default_namespace)
    1652               2 : {
    1653                 :         zval *id;
    1654                 :         xmlNodePtr nodep;
    1655                 :         dom_object *intern;
    1656                 :         xmlNsPtr nsptr;
    1657               2 :         int uri_len = 0;
    1658                 :         char *uri;
    1659                 : 
    1660               2 :         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &id, dom_node_class_entry, &uri, &uri_len, UG(utf8_conv)) == FAILURE) {
    1661               0 :                 return;
    1662                 :         }
    1663                 : 
    1664               2 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1665               2 :         if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
    1666               1 :                 nodep = xmlDocGetRootElement((xmlDocPtr) nodep);
    1667                 :         }
    1668                 : 
    1669               2 :         if (nodep && uri_len > 0) {
    1670               2 :                 nsptr = xmlSearchNs(nodep->doc, nodep, NULL);
    1671               2 :                 if (nsptr && xmlStrEqual(nsptr->href, uri)) {
    1672               2 :                         RETURN_TRUE;
    1673                 :                 }
    1674                 :         }
    1675                 : 
    1676               0 :         RETURN_FALSE;
    1677                 : }
    1678                 : /* }}} end dom_node_is_default_namespace */
    1679                 : 
    1680                 : /* {{{ proto string dom_node_lookup_namespace_uri(string prefix) U
    1681                 : URL: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespaceURI
    1682                 : Since: DOM Level 3
    1683                 : */
    1684                 : PHP_FUNCTION(dom_node_lookup_namespace_uri)
    1685               3 : {
    1686                 :         zval *id;
    1687                 :         xmlNodePtr nodep;
    1688                 :         dom_object *intern;
    1689                 :         xmlNsPtr nsptr;
    1690               3 :         int prefix_len = 0;
    1691               3 :         char *prefix=NULL;
    1692                 : 
    1693               3 :         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os!&", &id, dom_node_class_entry, &prefix, &prefix_len, UG(utf8_conv)) == FAILURE) {
    1694               0 :                 return;
    1695                 :         }
    1696                 : 
    1697               3 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1698               3 :         if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
    1699               1 :                 nodep = xmlDocGetRootElement((xmlDocPtr) nodep);
    1700               1 :                 if (nodep == NULL) {
    1701               0 :                         RETURN_NULL();
    1702                 :                 }
    1703                 :         }
    1704                 : 
    1705               3 :         nsptr = xmlSearchNs(nodep->doc, nodep, prefix);
    1706               3 :         if (nsptr && nsptr->href != NULL) {
    1707               3 :                 RETVAL_XML_STRING((char *) nsptr->href, ZSTR_DUPLICATE);
    1708               3 :                 return;
    1709                 :         }
    1710                 : 
    1711               0 :         RETURN_NULL();
    1712                 : }
    1713                 : /* }}} end dom_node_lookup_namespace_uri */
    1714                 : 
    1715                 : /* {{{ proto boolean dom_node_is_equal_node(DomNode arg) U
    1716                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isEqualNode
    1717                 : Since: DOM Level 3
    1718                 : */
    1719                 : PHP_FUNCTION(dom_node_is_equal_node)
    1720               0 : {
    1721               0 :  DOM_NOT_IMPLEMENTED();
    1722                 : }
    1723                 : /* }}} end dom_node_is_equal_node */
    1724                 : 
    1725                 : /* {{{ proto DomNode dom_node_get_feature(string feature, string version) U
    1726                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-getFeature
    1727                 : Since: DOM Level 3
    1728                 : */
    1729                 : PHP_FUNCTION(dom_node_get_feature)
    1730               0 : {
    1731               0 :  DOM_NOT_IMPLEMENTED();
    1732                 : }
    1733                 : /* }}} end dom_node_get_feature */
    1734                 : 
    1735                 : /* {{{ proto mixed dom_node_set_user_data(string key, mixed data, userdatahandler handler) U
    1736                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-setUserData
    1737                 : Since: DOM Level 3
    1738                 : */
    1739                 : PHP_FUNCTION(dom_node_set_user_data)
    1740               0 : {
    1741               0 :  DOM_NOT_IMPLEMENTED();
    1742                 : }
    1743                 : /* }}} end dom_node_set_user_data */
    1744                 : 
    1745                 : /* {{{ proto mixed dom_node_get_user_data(string key) U
    1746                 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-getUserData
    1747                 : Since: DOM Level 3
    1748                 : */
    1749                 : PHP_FUNCTION(dom_node_get_user_data)
    1750               0 : {
    1751               0 :  DOM_NOT_IMPLEMENTED();
    1752                 : }
    1753                 : /* }}} end dom_node_get_user_data */
    1754                 : 
    1755                 : static void dom_canonicalization(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */
    1756               7 : {
    1757                 :         zval *id;
    1758               7 :         zval *xpath_array=NULL, *ns_prefixes=NULL;
    1759                 :         xmlNodePtr nodep;
    1760                 :         xmlDocPtr docp;
    1761               7 :         xmlNodeSetPtr nodeset = NULL;
    1762                 :         dom_object *intern;
    1763               7 :         zend_bool exclusive=0, with_comments=0;
    1764               7 :         xmlChar **inclusive_ns_prefixes = NULL;
    1765               7 :         char *file = NULL;
    1766               7 :         int ret = -1, file_len = 0;
    1767                 :         xmlOutputBufferPtr buf;
    1768               7 :         xmlXPathContextPtr ctxp=NULL;
    1769               7 :         xmlXPathObjectPtr xpathobjp=NULL;
    1770               7 :         zend_uchar file_type = IS_STRING;
    1771                 : 
    1772               7 :         if (mode == 0) {
    1773               7 :                 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), 
    1774                 :                         "O|bba!a!", &id, dom_node_class_entry, &exclusive, &with_comments, 
    1775                 :                         &xpath_array, &ns_prefixes) == FAILURE) {
    1776               0 :                         return;
    1777                 :                 }
    1778                 :         } else {
    1779               0 :                 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), 
    1780                 :                         "Ot|bba!a!", &id, dom_node_class_entry, &file, &file_len, &file_type, &exclusive, 
    1781                 :                         &with_comments, &xpath_array, &ns_prefixes) == FAILURE) {
    1782               0 :                         return;
    1783                 :                 }
    1784                 :         }
    1785                 : 
    1786               7 :         DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
    1787                 : 
    1788               7 :         docp = nodep->doc;
    1789                 : 
    1790               7 :         if (! docp) {
    1791               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Node must be associated with a document");
    1792               0 :                 RETURN_FALSE;
    1793                 :         }
    1794                 : 
    1795               7 :         if (file_type == IS_UNICODE) {
    1796               0 :                 if (php_stream_path_encode(NULL, &file, &file_len, (UChar*)file, file_len, REPORT_ERRORS, NULL) == FAILURE) {
    1797               0 :                         RETURN_FALSE;
    1798                 :                 }
    1799                 :         }
    1800                 : 
    1801               7 :         if (xpath_array == NULL) {
    1802               5 :                 if (nodep->type != XML_DOCUMENT_NODE) {
    1803               5 :                         ctxp = xmlXPathNewContext(docp);
    1804               5 :                         ctxp->node = nodep;
    1805               5 :                         xpathobjp = xmlXPathEvalExpression("(.//. | .//@* | .//namespace::*)", ctxp);
    1806               5 :                         ctxp->node = NULL;
    1807              10 :                         if (xpathobjp && xpathobjp->type == XPATH_NODESET) {
    1808               5 :                                 nodeset = xpathobjp->nodesetval;
    1809                 :                         } else {
    1810               0 :                                 if (xpathobjp) {
    1811               0 :                                         xmlXPathFreeObject(xpathobjp);
    1812                 :                                 }
    1813               0 :                                 xmlXPathFreeContext(ctxp);
    1814               0 :                                 if (file_type == IS_UNICODE) {
    1815               0 :                                         efree(file);
    1816                 :                                 }
    1817               0 :                                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "XPath query did not return a nodeset");
    1818               0 :                                 RETURN_FALSE;
    1819                 :                         }
    1820                 :                 }
    1821                 :         } else {
    1822                 :                 /*xpath query from xpath_array */
    1823               2 :                 HashTable *ht = Z_ARRVAL_P(xpath_array);
    1824                 :                 zval **tmp, **zxquery;
    1825                 :                 char *xquery;
    1826                 :                 int xquery_len;
    1827                 : 
    1828               2 :                 if (zend_ascii_hash_find(ht, "query", sizeof("query"), (void**)&tmp) == SUCCESS &&
    1829                 :                     (Z_TYPE_PP(tmp) == IS_STRING || Z_TYPE_PP(tmp) == IS_UNICODE)) {
    1830               2 :                                 zxquery = tmp;
    1831                 : /*
    1832                 :                         if (Z_TYPE_PP(tmp) == IS_STRING) {
    1833                 :                                 xquery = Z_STRVAL_PP(tmp);
    1834                 :                         } else {
    1835                 :                                 
    1836                 :                         }
    1837                 : */
    1838                 :                 } else {
    1839               0 :                         if (file_type == IS_UNICODE) {
    1840               0 :                                 efree(file);
    1841                 :                         }
    1842               0 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "'query' missing from xpath array or is not a string");
    1843               0 :                         RETURN_FALSE;
    1844                 :                 }
    1845                 : 
    1846               2 :                 ctxp = xmlXPathNewContext(docp);
    1847               2 :                 ctxp->node = nodep;
    1848                 : 
    1849               3 :                 if (zend_ascii_hash_find(ht, "namespaces", sizeof("namespaces"), (void**)&tmp) == SUCCESS &&
    1850                 :                     Z_TYPE_PP(tmp) == IS_ARRAY) {
    1851                 :                         zval **tmpns;
    1852                 :                         char *nschar;
    1853                 :                         int nschar_len;
    1854                 : 
    1855               3 :                         while (zend_hash_get_current_data(Z_ARRVAL_PP(tmp), (void **)&tmpns) == SUCCESS) {
    1856               1 :                                 if (Z_TYPE_PP(tmpns) == IS_STRING || Z_TYPE_PP(tmpns) == IS_UNICODE) {
    1857               1 :                                         zstr prefix = NULL_ZSTR;
    1858                 :                                         ulong idx;
    1859                 :                                         uint prefix_key_len;
    1860                 :                                         zend_uchar htype;
    1861               1 :                                         UErrorCode errCode = 0;
    1862                 : 
    1863               1 :                                         if (Z_TYPE_PP(tmpns) == IS_UNICODE) {
    1864               1 :                                                 zend_unicode_to_string_ex(UG(utf8_conv), &nschar, &nschar_len, Z_USTRVAL_PP(tmpns), Z_USTRLEN_PP(tmpns), &errCode);
    1865                 :                                         } else {
    1866               0 :                                                 nschar = Z_STRVAL_PP(tmpns);
    1867                 :                                         }
    1868                 : 
    1869               1 :                                         htype = zend_hash_get_current_key_ex(Z_ARRVAL_PP(tmp), 
    1870                 :                                                 &prefix, &prefix_key_len, &idx, 0, NULL);
    1871               1 :                                         if (htype == HASH_KEY_IS_STRING) {
    1872               0 :                                                 xmlXPathRegisterNs(ctxp, (xmlChar *)prefix.s, (xmlChar *)nschar);
    1873                 :                                         } else
    1874               1 :                                                 if (htype == HASH_KEY_IS_UNICODE) {
    1875                 :                                                         char *tmp_prefix;
    1876                 :                                                         int tmp_prefix_len;
    1877               1 :                                                         errCode = 0;
    1878                 : 
    1879               1 :                                                         zend_unicode_to_string_ex(UG(utf8_conv), &tmp_prefix, &tmp_prefix_len, prefix.u, prefix_key_len, &errCode);
    1880               1 :                                                         xmlXPathRegisterNs(ctxp, (xmlChar *)tmp_prefix, (xmlChar *)nschar);
    1881               1 :                                                         efree(tmp_prefix);
    1882                 :                                                 }
    1883                 : 
    1884               1 :                                         if (Z_TYPE_PP(tmpns) == IS_UNICODE) {
    1885               1 :                                                 efree(nschar);
    1886                 :                                         }
    1887                 :                                 }
    1888               1 :                                 zend_hash_move_forward(Z_ARRVAL_PP(tmp));
    1889                 :                         }
    1890                 :                 }
    1891                 : 
    1892               2 :                 if (Z_TYPE_PP(zxquery) == IS_UNICODE) {
    1893               2 :                         UErrorCode errCode = 0;
    1894               2 :                         zend_unicode_to_string_ex(UG(utf8_conv), &xquery, &xquery_len, Z_USTRVAL_PP(zxquery), Z_USTRLEN_PP(zxquery), &errCode);
    1895                 :                 } else {
    1896               0 :                         xquery = Z_STRVAL_PP(zxquery);
    1897                 :                 }
    1898                 : 
    1899               2 :                 xpathobjp = xmlXPathEvalExpression(xquery, ctxp);
    1900                 : 
    1901               2 :                 if (Z_TYPE_PP(zxquery) == IS_UNICODE) {
    1902               2 :                         efree(xquery);
    1903                 :                 }
    1904                 : 
    1905               2 :                 ctxp->node = NULL;
    1906               4 :                 if (xpathobjp && xpathobjp->type == XPATH_NODESET) {
    1907               2 :                         nodeset = xpathobjp->nodesetval;
    1908                 :                 } else {
    1909               0 :                         if (file_type == IS_UNICODE) {
    1910               0 :                                 efree(file);
    1911                 :                         }
    1912               0 :                         if (xpathobjp) {
    1913               0 :                                 xmlXPathFreeObject(xpathobjp);
    1914                 :                         }
    1915               0 :                         xmlXPathFreeContext(ctxp);
    1916               0 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "XPath query did not return a nodeset");
    1917               0 :                         RETURN_FALSE;
    1918                 :                 }
    1919                 :         }
    1920                 : 
    1921               7 :         if (ns_prefixes != NULL) {
    1922               2 :                 if (exclusive) {
    1923                 :                         zval **tmpns;
    1924               2 :                         int nscount = 0;
    1925                 : 
    1926               2 :                         inclusive_ns_prefixes = safe_emalloc(zend_hash_num_elements(Z_ARRVAL_P(ns_prefixes)) + 1,
    1927                 :                                 sizeof(xmlChar *), 0);
    1928               6 :                         while (zend_hash_get_current_data(Z_ARRVAL_P(ns_prefixes), (void **)&tmpns) == SUCCESS) {
    1929               2 :                                 if (Z_TYPE_PP(tmpns) == IS_STRING) {
    1930               0 :                                         inclusive_ns_prefixes[nscount++] = estrndup(Z_STRVAL_PP(tmpns), strlen(Z_STRVAL_PP(tmpns)));
    1931                 :                                 } else {
    1932               2 :                                         UErrorCode errCode = 0;
    1933                 :                                         char *prefix;
    1934                 :                                         int prfeix_len;
    1935                 : 
    1936               2 :                                         zend_unicode_to_string_ex(UG(utf8_conv), &prefix, &prfeix_len, Z_USTRVAL_PP(tmpns), Z_USTRLEN_PP(tmpns), &errCode);
    1937               2 :                                         inclusive_ns_prefixes[nscount++] = prefix;
    1938                 :                                 }
    1939               2 :                                 zend_hash_move_forward(Z_ARRVAL_P(ns_prefixes));
    1940                 :                         }
    1941               2 :                         inclusive_ns_prefixes[nscount] = NULL;
    1942                 :                 } else {
    1943               0 :                         php_error_docref(NULL TSRMLS_CC, E_NOTICE, 
    1944                 :                                 "Inclusive namespace prefixes only allowed in exlcusive mode.");
    1945                 :                 }
    1946                 :         }
    1947                 : 
    1948               7 :         if (mode == 1) {
    1949               0 :                 buf = xmlOutputBufferCreateFilename(file, NULL, 0);
    1950                 :         } else {
    1951               7 :                 buf = xmlAllocOutputBuffer(NULL);
    1952                 :         }
    1953                 : 
    1954               7 :     if (buf != NULL) {
    1955               7 :                 ret = xmlC14NDocSaveTo(docp, nodeset, exclusive, inclusive_ns_prefixes,
    1956                 :                         with_comments, buf);
    1957                 :         }
    1958                 : 
    1959               7 :         if (file_type == IS_UNICODE) {
    1960               0 :                 efree(file);
    1961                 :         }
    1962                 : 
    1963               7 :         if (inclusive_ns_prefixes != NULL) {
    1964               2 :                 int nscount = 0;
    1965               6 :                 while(inclusive_ns_prefixes[nscount] != NULL) {
    1966               2 :                         efree(inclusive_ns_prefixes[nscount++]);
    1967                 :                 }
    1968               2 :                 efree(inclusive_ns_prefixes);
    1969                 :         }
    1970               7 :         if (xpathobjp != NULL) {
    1971               7 :                 xmlXPathFreeObject(xpathobjp);
    1972                 :         }
    1973               7 :         if (ctxp != NULL) {
    1974               7 :                 xmlXPathFreeContext(ctxp);
    1975                 :         }
    1976                 : 
    1977               7 :     if (buf == NULL || ret < 0) {
    1978               0 :         RETVAL_FALSE;
    1979                 :     } else {
    1980               7 :                 if (mode == 0) {
    1981               7 :                         ret = buf->buffer->use;
    1982               7 :                         if (ret > 0) {
    1983               7 :                                 RETVAL_STRINGL((char *) buf->buffer->content, ret, 1);
    1984                 :                         } else {
    1985               0 :                                 RETVAL_EMPTY_STRING();
    1986                 :                         }
    1987                 :                 }
    1988                 :     }
    1989                 : 
    1990               7 :         if (buf) {
    1991                 :                 int bytes;
    1992                 : 
    1993               7 :                 bytes = xmlOutputBufferClose(buf);
    1994               7 :                 if (mode == 1 && (ret >= 0)) {
    1995               0 :                         RETURN_LONG(bytes);
    1996                 :                 }
    1997                 :         }
    1998                 : }
    1999                 : /* }}} */
    2000                 : 
    2001                 : /* {{{ proto string DOMNode::C14N([bool exclusive [, bool with_comments [, array xpath [, array ns_prefixes]]]]) U
    2002                 :    Canonicalize nodes to a string */
    2003                 : PHP_METHOD(domnode, C14N)
    2004               7 : {
    2005               7 :         dom_canonicalization(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
    2006               7 : }
    2007                 : /* }}} */
    2008                 : 
    2009                 : /* {{{ proto int DOMNode::C14NFile(string uri [, bool exclusive [, bool with_comments [, array xpath [, array ns_prefixes]]]]) U
    2010                 :    Canonicalize nodes to a file */
    2011                 : PHP_METHOD(domnode, C14NFile)
    2012               0 : {
    2013               0 :         dom_canonicalization(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
    2014               0 : }
    2015                 : /* }}} */
    2016                 : 
    2017                 : /* {{{ proto int DOMNode::getNodePath() U
    2018                 :    Gets an xpath for a node */
    2019                 : 
    2020                 : PHP_METHOD(domnode, getNodePath)
    2021               0 : {
    2022                 :         zval *id;
    2023                 :         xmlNode *nodep;
    2024                 :         dom_object *intern;
    2025                 :         char *value;
    2026                 :         
    2027               0 :         DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
    2028                 : 
    2029               0 :         value = (char *)xmlGetNodePath(nodep);
    2030               0 :         if (value == NULL) {
    2031               0 :                 RETURN_NULL();
    2032                 :         } else {
    2033               0 :                 RETVAL_XML_STRING(value, ZSTR_DUPLICATE);
    2034               0 :                 xmlFree(value);
    2035                 :         }
    2036                 : }
    2037                 : /* }}} */
    2038                 : 
    2039                 : /* {{{ proto int DOMNode::getLineNo()
    2040                 :    Gets line number for a node */
    2041                 : PHP_METHOD(domnode, getLineNo)
    2042               0 : {
    2043                 :         zval *id;
    2044                 :         xmlNode *nodep;
    2045                 :         dom_object *intern;
    2046                 :         
    2047               0 :         if (zend_parse_parameters_none() == FAILURE) {
    2048               0 :                 return;
    2049                 :         }
    2050                 : 
    2051               0 :         DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
    2052                 : 
    2053               0 :         RETURN_LONG(xmlGetLineNo(nodep));
    2054                 : }
    2055                 : /* }}} */
    2056                 : 
    2057                 : #endif
    2058                 : 
    2059                 : /*
    2060                 :  * Local variables:
    2061                 :  * tab-width: 4
    2062                 :  * c-basic-offset: 4
    2063                 :  * End:
    2064                 :  * vim600: noet sw=4 ts=4 fdm=marker
    2065                 :  * vim<600: noet sw=4 ts=4
    2066                 :  */

Generated by: LTP GCOV extension version 1.5

Generated at Mon, 23 Nov 2009 17:39:29 +0000 (36 hours ago)

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