mirror of
https://github.com/php/php-src.git
synced 2025-08-18 15:08:55 +02:00

This patch removes the so called local variables defined per file basis for certain editors to properly show tab width, and similar settings. These are mainly used by Vim and Emacs editors yet with recent changes the once working definitions don't work anymore in Vim without custom plugins or additional configuration. Neither are these settings synced across the PHP code base. A simpler and better approach is EditorConfig and fixing code using some code style fixing tools in the future instead. This patch also removes the so called modelines for Vim. Modelines allow Vim editor specifically to set some editor configuration such as syntax highlighting, indentation style and tab width to be set in the first line or the last 5 lines per file basis. Since the php test files have syntax highlighting already set in most editors properly and EditorConfig takes care of the indentation settings, this patch removes these as well for the Vim 6.0 and newer versions. With the removal of local variables for certain editors such as Emacs and Vim, the footer is also probably not needed anymore when creating extensions using ext_skel.php script. Additionally, Vim modelines for setting php syntax and some editor settings has been removed from some *.phpt files. All these are mostly not relevant for phpt files neither work properly in the middle of the file.
1916 lines
47 KiB
C
1916 lines
47 KiB
C
/*
|
|
+----------------------------------------------------------------------+
|
|
| PHP Version 7 |
|
|
+----------------------------------------------------------------------+
|
|
| Copyright (c) The PHP Group |
|
|
+----------------------------------------------------------------------+
|
|
| This source file is subject to version 3.01 of the PHP license, |
|
|
| that is bundled with this package in the file LICENSE, and is |
|
|
| available through the world-wide-web at the following url: |
|
|
| http://www.php.net/license/3_01.txt |
|
|
| If you did not receive a copy of the PHP license and are unable to |
|
|
| obtain it through the world-wide-web, please send a note to |
|
|
| license@php.net so we can mail you a copy immediately. |
|
|
+----------------------------------------------------------------------+
|
|
| Authors: Christian Stocker <chregu@php.net> |
|
|
| Rob Richards <rrichards@php.net> |
|
|
+----------------------------------------------------------------------+
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include "php.h"
|
|
#if HAVE_LIBXML && HAVE_DOM
|
|
#include "php_dom.h"
|
|
|
|
/* {{{ arginfo */
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_insert_before, 0, 0, 1)
|
|
ZEND_ARG_OBJ_INFO(0, newChild, DOMNode, 0)
|
|
ZEND_ARG_OBJ_INFO(0, refChild, DOMNode, 1)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_replace_child, 0, 0, 2)
|
|
ZEND_ARG_OBJ_INFO(0, newChild, DOMNode, 0)
|
|
ZEND_ARG_OBJ_INFO(0, oldChild, DOMNode, 0)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_remove_child, 0, 0, 1)
|
|
ZEND_ARG_OBJ_INFO(0, oldChild, DOMNode, 0)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_append_child, 0, 0, 1)
|
|
ZEND_ARG_OBJ_INFO(0, newChild, DOMNode, 0)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_has_child_nodes, 0, 0, 0)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_clone_node, 0, 0, 0)
|
|
ZEND_ARG_INFO(0, deep)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_normalize, 0, 0, 0)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_is_supported, 0, 0, 2)
|
|
ZEND_ARG_INFO(0, feature)
|
|
ZEND_ARG_INFO(0, version)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_has_attributes, 0, 0, 0)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_compare_document_position, 0, 0, 1)
|
|
ZEND_ARG_OBJ_INFO(0, other, DOMNode, 0)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_is_same_node, 0, 0, 1)
|
|
ZEND_ARG_OBJ_INFO(0, other, DOMNode, 0)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_lookup_prefix, 0, 0, 1)
|
|
ZEND_ARG_INFO(0, namespaceURI)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_is_default_namespace, 0, 0, 1)
|
|
ZEND_ARG_INFO(0, namespaceURI)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_lookup_namespace_uri, 0, 0, 1)
|
|
ZEND_ARG_INFO(0, prefix)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_is_equal_node, 0, 0, 1)
|
|
ZEND_ARG_OBJ_INFO(0, arg, DOMNode, 0)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_get_feature, 0, 0, 2)
|
|
ZEND_ARG_INFO(0, feature)
|
|
ZEND_ARG_INFO(0, version)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_set_user_data, 0, 0, 3)
|
|
ZEND_ARG_INFO(0, key)
|
|
ZEND_ARG_INFO(0, data)
|
|
ZEND_ARG_INFO(0, handler)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_get_user_data, 0, 0, 1)
|
|
ZEND_ARG_INFO(0, key)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_getNodePath, 0, 0, 0)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_getLineNo, 0, 0, 0)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_C14N, 0, 0, 0)
|
|
ZEND_ARG_INFO(0, exclusive)
|
|
ZEND_ARG_INFO(0, with_comments)
|
|
ZEND_ARG_ARRAY_INFO(0, xpath, 1)
|
|
ZEND_ARG_ARRAY_INFO(0, ns_prefixes, 1)
|
|
ZEND_END_ARG_INFO();
|
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_node_C14NFile, 0, 0, 1)
|
|
ZEND_ARG_INFO(0, uri)
|
|
ZEND_ARG_INFO(0, exclusive)
|
|
ZEND_ARG_INFO(0, with_comments)
|
|
ZEND_ARG_ARRAY_INFO(0, xpath, 1)
|
|
ZEND_ARG_ARRAY_INFO(0, ns_prefixes, 1)
|
|
ZEND_END_ARG_INFO();
|
|
/* }}} */
|
|
|
|
/*
|
|
* class DOMNode
|
|
*
|
|
* URL: https://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1950641247
|
|
* Since:
|
|
*/
|
|
|
|
const zend_function_entry php_dom_node_class_functions[] = { /* {{{ */
|
|
PHP_FALIAS(insertBefore, dom_node_insert_before, arginfo_dom_node_insert_before)
|
|
PHP_FALIAS(replaceChild, dom_node_replace_child, arginfo_dom_node_replace_child)
|
|
PHP_FALIAS(removeChild, dom_node_remove_child, arginfo_dom_node_remove_child)
|
|
PHP_FALIAS(appendChild, dom_node_append_child, arginfo_dom_node_append_child)
|
|
PHP_FALIAS(hasChildNodes, dom_node_has_child_nodes, arginfo_dom_node_has_child_nodes)
|
|
PHP_FALIAS(cloneNode, dom_node_clone_node, arginfo_dom_node_clone_node)
|
|
PHP_FALIAS(normalize, dom_node_normalize, arginfo_dom_node_normalize)
|
|
PHP_FALIAS(isSupported, dom_node_is_supported, arginfo_dom_node_is_supported)
|
|
PHP_FALIAS(hasAttributes, dom_node_has_attributes, arginfo_dom_node_has_attributes)
|
|
PHP_FALIAS(compareDocumentPosition, dom_node_compare_document_position, arginfo_dom_node_compare_document_position)
|
|
PHP_FALIAS(isSameNode, dom_node_is_same_node, arginfo_dom_node_is_same_node)
|
|
PHP_FALIAS(lookupPrefix, dom_node_lookup_prefix, arginfo_dom_node_lookup_prefix)
|
|
PHP_FALIAS(isDefaultNamespace, dom_node_is_default_namespace, arginfo_dom_node_is_default_namespace)
|
|
PHP_FALIAS(lookupNamespaceUri, dom_node_lookup_namespace_uri, arginfo_dom_node_lookup_namespace_uri)
|
|
PHP_FALIAS(isEqualNode, dom_node_is_equal_node, arginfo_dom_node_is_equal_node)
|
|
PHP_FALIAS(getFeature, dom_node_get_feature, arginfo_dom_node_get_feature)
|
|
PHP_FALIAS(setUserData, dom_node_set_user_data, arginfo_dom_node_set_user_data)
|
|
PHP_FALIAS(getUserData, dom_node_get_user_data, arginfo_dom_node_get_user_data)
|
|
PHP_ME(domnode, getNodePath, arginfo_dom_node_getNodePath, ZEND_ACC_PUBLIC)
|
|
PHP_ME(domnode, getLineNo, arginfo_dom_node_getLineNo, ZEND_ACC_PUBLIC)
|
|
PHP_ME(domnode, C14N, arginfo_dom_node_C14N, ZEND_ACC_PUBLIC)
|
|
PHP_ME(domnode, C14NFile, arginfo_dom_node_C14NFile, ZEND_ACC_PUBLIC)
|
|
PHP_FE_END
|
|
};
|
|
/* }}} */
|
|
|
|
static void dom_reconcile_ns(xmlDocPtr doc, xmlNodePtr nodep) /* {{{ */
|
|
{
|
|
xmlNsPtr nsptr, nsdftptr, curns, prevns = NULL;
|
|
|
|
if (nodep->type == XML_ELEMENT_NODE) {
|
|
/* Following if block primarily used for inserting nodes created via createElementNS */
|
|
if (nodep->nsDef != NULL) {
|
|
curns = nodep->nsDef;
|
|
while (curns) {
|
|
nsdftptr = curns->next;
|
|
if (curns->href != NULL) {
|
|
if((nsptr = xmlSearchNsByHref(doc, nodep->parent, curns->href)) &&
|
|
(curns->prefix == NULL || xmlStrEqual(nsptr->prefix, curns->prefix))) {
|
|
curns->next = NULL;
|
|
if (prevns == NULL) {
|
|
nodep->nsDef = nsdftptr;
|
|
} else {
|
|
prevns->next = nsdftptr;
|
|
}
|
|
dom_set_old_ns(doc, curns);
|
|
curns = prevns;
|
|
}
|
|
}
|
|
prevns = curns;
|
|
curns = nsdftptr;
|
|
}
|
|
}
|
|
xmlReconciliateNs(doc, nodep);
|
|
}
|
|
}
|
|
/* }}} */
|
|
|
|
/* {{{ nodeName string
|
|
readonly=yes
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68D095
|
|
Since:
|
|
*/
|
|
int dom_node_node_name_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep;
|
|
xmlNsPtr ns;
|
|
char *str = NULL;
|
|
xmlChar *qname = NULL;
|
|
|
|
nodep = dom_object_get_node(obj);
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
switch (nodep->type) {
|
|
case XML_ATTRIBUTE_NODE:
|
|
case XML_ELEMENT_NODE:
|
|
ns = nodep->ns;
|
|
if (ns != NULL && ns->prefix) {
|
|
qname = xmlStrdup(ns->prefix);
|
|
qname = xmlStrcat(qname, (xmlChar *) ":");
|
|
qname = xmlStrcat(qname, nodep->name);
|
|
str = (char *) qname;
|
|
} else {
|
|
str = (char *) nodep->name;
|
|
}
|
|
break;
|
|
case XML_NAMESPACE_DECL:
|
|
ns = nodep->ns;
|
|
if (ns != NULL && ns->prefix) {
|
|
qname = xmlStrdup((xmlChar *) "xmlns");
|
|
qname = xmlStrcat(qname, (xmlChar *) ":");
|
|
qname = xmlStrcat(qname, nodep->name);
|
|
str = (char *) qname;
|
|
} else {
|
|
str = (char *) nodep->name;
|
|
}
|
|
break;
|
|
case XML_DOCUMENT_TYPE_NODE:
|
|
case XML_DTD_NODE:
|
|
case XML_PI_NODE:
|
|
case XML_ENTITY_DECL:
|
|
case XML_ENTITY_REF_NODE:
|
|
case XML_NOTATION_NODE:
|
|
str = (char *) nodep->name;
|
|
break;
|
|
case XML_CDATA_SECTION_NODE:
|
|
str = "#cdata-section";
|
|
break;
|
|
case XML_COMMENT_NODE:
|
|
str = "#comment";
|
|
break;
|
|
case XML_HTML_DOCUMENT_NODE:
|
|
case XML_DOCUMENT_NODE:
|
|
str = "#document";
|
|
break;
|
|
case XML_DOCUMENT_FRAG_NODE:
|
|
str = "#document-fragment";
|
|
break;
|
|
case XML_TEXT_NODE:
|
|
str = "#text";
|
|
break;
|
|
default:
|
|
php_error_docref(NULL, E_WARNING, "Invalid Node Type");
|
|
}
|
|
|
|
if (str != NULL) {
|
|
ZVAL_STRING(retval, str);
|
|
} else {
|
|
ZVAL_EMPTY_STRING(retval);
|
|
}
|
|
|
|
if (qname != NULL) {
|
|
xmlFree(qname);
|
|
}
|
|
|
|
return SUCCESS;
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ nodeValue string
|
|
readonly=no
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68D080
|
|
Since:
|
|
*/
|
|
int dom_node_node_value_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep = dom_object_get_node(obj);
|
|
char *str = NULL;
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
/* Access to Element node is implemented as a convience method */
|
|
switch (nodep->type) {
|
|
case XML_ATTRIBUTE_NODE:
|
|
case XML_TEXT_NODE:
|
|
case XML_ELEMENT_NODE:
|
|
case XML_COMMENT_NODE:
|
|
case XML_CDATA_SECTION_NODE:
|
|
case XML_PI_NODE:
|
|
str = (char *) xmlNodeGetContent(nodep);
|
|
break;
|
|
case XML_NAMESPACE_DECL:
|
|
str = (char *) xmlNodeGetContent(nodep->children);
|
|
break;
|
|
default:
|
|
str = NULL;
|
|
break;
|
|
}
|
|
|
|
if(str != NULL) {
|
|
ZVAL_STRING(retval, str);
|
|
xmlFree(str);
|
|
} else {
|
|
ZVAL_NULL(retval);
|
|
}
|
|
|
|
return SUCCESS;
|
|
|
|
}
|
|
|
|
int dom_node_node_value_write(dom_object *obj, zval *newval)
|
|
{
|
|
xmlNode *nodep = dom_object_get_node(obj);
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
/* Access to Element node is implemented as a convience method */
|
|
switch (nodep->type) {
|
|
case XML_ELEMENT_NODE:
|
|
case XML_ATTRIBUTE_NODE:
|
|
if (nodep->children) {
|
|
node_list_unlink(nodep->children);
|
|
php_libxml_node_free_list((xmlNodePtr) nodep->children);
|
|
nodep->children = NULL;
|
|
}
|
|
case XML_TEXT_NODE:
|
|
case XML_COMMENT_NODE:
|
|
case XML_CDATA_SECTION_NODE:
|
|
case XML_PI_NODE:
|
|
{
|
|
zend_string *str = zval_get_string(newval);
|
|
xmlNodeSetContentLen(nodep, (xmlChar *) ZSTR_VAL(str), ZSTR_LEN(str) + 1);
|
|
zend_string_release_ex(str, 0);
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ nodeType int
|
|
readonly=yes
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-111237558
|
|
Since:
|
|
*/
|
|
int dom_node_node_type_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep;
|
|
|
|
nodep = dom_object_get_node(obj);
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
/* Specs dictate that they are both type XML_DOCUMENT_TYPE_NODE */
|
|
if (nodep->type == XML_DTD_NODE) {
|
|
ZVAL_LONG(retval, XML_DOCUMENT_TYPE_NODE);
|
|
} else {
|
|
ZVAL_LONG(retval, nodep->type);
|
|
}
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ parentNode DomNode
|
|
readonly=yes
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1060184317
|
|
Since:
|
|
*/
|
|
int dom_node_parent_node_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep, *nodeparent;
|
|
|
|
nodep = dom_object_get_node(obj);
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
nodeparent = nodep->parent;
|
|
if (!nodeparent) {
|
|
ZVAL_NULL(retval);
|
|
return SUCCESS;
|
|
}
|
|
|
|
php_dom_create_object(nodeparent, retval, obj);
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ childNodes DomNodeList
|
|
readonly=yes
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1451460987
|
|
Since:
|
|
*/
|
|
int dom_node_child_nodes_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep = dom_object_get_node(obj);
|
|
dom_object *intern;
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
if (dom_node_children_valid(nodep) == FAILURE) {
|
|
ZVAL_NULL(retval);
|
|
} else {
|
|
php_dom_create_interator(retval, DOM_NODELIST);
|
|
intern = Z_DOMOBJ_P(retval);
|
|
dom_namednode_iter(obj, XML_ELEMENT_NODE, intern, NULL, NULL, NULL);
|
|
}
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ firstChild DomNode
|
|
readonly=yes
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-169727388
|
|
Since:
|
|
*/
|
|
int dom_node_first_child_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep, *first = NULL;
|
|
|
|
nodep = dom_object_get_node(obj);
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
if (dom_node_children_valid(nodep) == SUCCESS) {
|
|
first = nodep->children;
|
|
}
|
|
|
|
if (!first) {
|
|
ZVAL_NULL(retval);
|
|
return SUCCESS;
|
|
}
|
|
|
|
php_dom_create_object(first, retval, obj);
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ lastChild DomNode
|
|
readonly=yes
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-61AD09FB
|
|
Since:
|
|
*/
|
|
int dom_node_last_child_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep, *last = NULL;
|
|
|
|
nodep = dom_object_get_node(obj);
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
if (dom_node_children_valid(nodep) == SUCCESS) {
|
|
last = nodep->last;
|
|
}
|
|
|
|
if (!last) {
|
|
ZVAL_NULL(retval);
|
|
return SUCCESS;
|
|
}
|
|
|
|
php_dom_create_object(last, retval, obj);
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ previousSibling DomNode
|
|
readonly=yes
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-640FB3C8
|
|
Since:
|
|
*/
|
|
int dom_node_previous_sibling_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep, *prevsib;
|
|
|
|
nodep = dom_object_get_node(obj);
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
prevsib = nodep->prev;
|
|
if (!prevsib) {
|
|
ZVAL_NULL(retval);
|
|
return SUCCESS;
|
|
}
|
|
|
|
php_dom_create_object(prevsib, retval, obj);
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ nextSibling DomNode
|
|
readonly=yes
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6AC54C2F
|
|
Since:
|
|
*/
|
|
int dom_node_next_sibling_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep, *nextsib;
|
|
|
|
nodep = dom_object_get_node(obj);
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
nextsib = nodep->next;
|
|
if (!nextsib) {
|
|
ZVAL_NULL(retval);
|
|
return SUCCESS;
|
|
}
|
|
|
|
php_dom_create_object(nextsib, retval, obj);
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ attributes DomNamedNodeMap
|
|
readonly=yes
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-84CF096
|
|
Since:
|
|
*/
|
|
int dom_node_attributes_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep = dom_object_get_node(obj);
|
|
dom_object *intern;
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
if (nodep->type == XML_ELEMENT_NODE) {
|
|
php_dom_create_interator(retval, DOM_NAMEDNODEMAP);
|
|
intern = Z_DOMOBJ_P(retval);
|
|
dom_namednode_iter(obj, XML_ATTRIBUTE_NODE, intern, NULL, NULL, NULL);
|
|
} else {
|
|
ZVAL_NULL(retval);
|
|
}
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ ownerDocument DomDocument
|
|
readonly=yes
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-node-ownerDoc
|
|
Since:
|
|
*/
|
|
int dom_node_owner_document_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep = dom_object_get_node(obj);
|
|
xmlDocPtr docp;
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
|
|
ZVAL_NULL(retval);
|
|
return SUCCESS;
|
|
}
|
|
|
|
docp = nodep->doc;
|
|
if (!docp) {
|
|
return FAILURE;
|
|
}
|
|
|
|
php_dom_create_object((xmlNodePtr) docp, retval, obj);
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ namespaceUri string
|
|
readonly=yes
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeNSname
|
|
Since: DOM Level 2
|
|
*/
|
|
int dom_node_namespace_uri_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep = dom_object_get_node(obj);
|
|
char *str = NULL;
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
switch (nodep->type) {
|
|
case XML_ELEMENT_NODE:
|
|
case XML_ATTRIBUTE_NODE:
|
|
case XML_NAMESPACE_DECL:
|
|
if (nodep->ns != NULL) {
|
|
str = (char *) nodep->ns->href;
|
|
}
|
|
break;
|
|
default:
|
|
str = NULL;
|
|
break;
|
|
}
|
|
|
|
if (str != NULL) {
|
|
ZVAL_STRING(retval, str);
|
|
} else {
|
|
ZVAL_NULL(retval);
|
|
}
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ prefix string
|
|
readonly=no
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeNSPrefix
|
|
Since: DOM Level 2
|
|
*/
|
|
int dom_node_prefix_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep = dom_object_get_node(obj);
|
|
xmlNsPtr ns;
|
|
char *str = NULL;
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
switch (nodep->type) {
|
|
case XML_ELEMENT_NODE:
|
|
case XML_ATTRIBUTE_NODE:
|
|
case XML_NAMESPACE_DECL:
|
|
ns = nodep->ns;
|
|
if (ns != NULL && ns->prefix) {
|
|
str = (char *) ns->prefix;
|
|
}
|
|
break;
|
|
default:
|
|
str = NULL;
|
|
break;
|
|
}
|
|
|
|
if (str == NULL) {
|
|
ZVAL_EMPTY_STRING(retval);
|
|
} else {
|
|
ZVAL_STRING(retval, str);
|
|
}
|
|
return SUCCESS;
|
|
|
|
}
|
|
|
|
int dom_node_prefix_write(dom_object *obj, zval *newval)
|
|
{
|
|
zend_string *str;
|
|
xmlNode *nodep, *nsnode = NULL;
|
|
xmlNsPtr ns = NULL, curns;
|
|
char *strURI;
|
|
char *prefix;
|
|
|
|
nodep = dom_object_get_node(obj);
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
switch (nodep->type) {
|
|
case XML_ELEMENT_NODE:
|
|
nsnode = nodep;
|
|
case XML_ATTRIBUTE_NODE:
|
|
if (nsnode == NULL) {
|
|
nsnode = nodep->parent;
|
|
if (nsnode == NULL) {
|
|
nsnode = xmlDocGetRootElement(nodep->doc);
|
|
}
|
|
}
|
|
str = zval_get_string(newval);
|
|
prefix = ZSTR_VAL(str);
|
|
if (nsnode && nodep->ns != NULL && !xmlStrEqual(nodep->ns->prefix, (xmlChar *)prefix)) {
|
|
strURI = (char *) nodep->ns->href;
|
|
if (strURI == NULL ||
|
|
(!strcmp(prefix, "xml") && strcmp(strURI, (char *) XML_XML_NAMESPACE)) ||
|
|
(nodep->type == XML_ATTRIBUTE_NODE && !strcmp(prefix, "xmlns") &&
|
|
strcmp(strURI, (char *) DOM_XMLNS_NAMESPACE)) ||
|
|
(nodep->type == XML_ATTRIBUTE_NODE && !strcmp((char *) nodep->name, "xmlns"))) {
|
|
ns = NULL;
|
|
} else {
|
|
curns = nsnode->nsDef;
|
|
while (curns != NULL) {
|
|
if (xmlStrEqual((xmlChar *)prefix, curns->prefix) && xmlStrEqual(nodep->ns->href, curns->href)) {
|
|
ns = curns;
|
|
break;
|
|
}
|
|
curns = curns->next;
|
|
}
|
|
if (ns == NULL) {
|
|
ns = xmlNewNs(nsnode, nodep->ns->href, (xmlChar *)prefix);
|
|
}
|
|
}
|
|
|
|
if (ns == NULL) {
|
|
zend_string_release_ex(str, 0);
|
|
php_dom_throw_error(NAMESPACE_ERR, dom_get_strict_error(obj->document));
|
|
return FAILURE;
|
|
}
|
|
|
|
xmlSetNs(nodep, ns);
|
|
}
|
|
zend_string_release_ex(str, 0);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ localName string
|
|
readonly=yes
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeNSLocalN
|
|
Since: DOM Level 2
|
|
*/
|
|
int dom_node_local_name_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep = dom_object_get_node(obj);
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
if (nodep->type == XML_ELEMENT_NODE || nodep->type == XML_ATTRIBUTE_NODE || nodep->type == XML_NAMESPACE_DECL) {
|
|
ZVAL_STRING(retval, (char *) (nodep->name));
|
|
} else {
|
|
ZVAL_NULL(retval);
|
|
}
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ baseURI string
|
|
readonly=yes
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-baseURI
|
|
Since: DOM Level 3
|
|
*/
|
|
int dom_node_base_uri_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep = dom_object_get_node(obj);
|
|
xmlChar *baseuri;
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
baseuri = xmlNodeGetBase(nodep->doc, nodep);
|
|
if (baseuri) {
|
|
ZVAL_STRING(retval, (char *) (baseuri));
|
|
xmlFree(baseuri);
|
|
} else {
|
|
ZVAL_NULL(retval);
|
|
}
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
/* {{{ textContent string
|
|
readonly=no
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-textContent
|
|
Since: DOM Level 3
|
|
*/
|
|
int dom_node_text_content_read(dom_object *obj, zval *retval)
|
|
{
|
|
xmlNode *nodep = dom_object_get_node(obj);
|
|
char *str = NULL;
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
str = (char *) xmlNodeGetContent(nodep);
|
|
|
|
if (str != NULL) {
|
|
ZVAL_STRING(retval, str);
|
|
xmlFree(str);
|
|
} else {
|
|
ZVAL_EMPTY_STRING(retval);
|
|
}
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
int dom_node_text_content_write(dom_object *obj, zval *newval)
|
|
{
|
|
xmlNode *nodep = dom_object_get_node(obj);
|
|
zend_string *str;
|
|
|
|
if (nodep == NULL) {
|
|
php_dom_throw_error(INVALID_STATE_ERR, 0);
|
|
return FAILURE;
|
|
}
|
|
|
|
if (nodep->type == XML_ELEMENT_NODE || nodep->type == XML_ATTRIBUTE_NODE) {
|
|
if (nodep->children) {
|
|
node_list_unlink(nodep->children);
|
|
php_libxml_node_free_list((xmlNodePtr) nodep->children);
|
|
nodep->children = NULL;
|
|
}
|
|
}
|
|
|
|
str = zval_get_string(newval);
|
|
/* we have to use xmlNodeAddContent() to get the same behavior as with xmlNewText() */
|
|
xmlNodeSetContent(nodep, (xmlChar *) "");
|
|
xmlNodeAddContent(nodep, (xmlChar *) ZSTR_VAL(str));
|
|
zend_string_release_ex(str, 0);
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
static xmlNodePtr _php_dom_insert_fragment(xmlNodePtr nodep, xmlNodePtr prevsib, xmlNodePtr nextsib, xmlNodePtr fragment, dom_object *intern, dom_object *childobj) /* {{{ */
|
|
{
|
|
xmlNodePtr newchild, node;
|
|
|
|
newchild = fragment->children;
|
|
|
|
if (newchild) {
|
|
if (prevsib == NULL) {
|
|
nodep->children = newchild;
|
|
} else {
|
|
prevsib->next = newchild;
|
|
}
|
|
newchild->prev = prevsib;
|
|
if (nextsib == NULL) {
|
|
nodep->last = fragment->last;
|
|
} else {
|
|
fragment->last->next = nextsib;
|
|
nextsib->prev = fragment->last;
|
|
}
|
|
|
|
node = newchild;
|
|
while (node != NULL) {
|
|
node->parent = nodep;
|
|
if (node->doc != nodep->doc) {
|
|
xmlSetTreeDoc(node, nodep->doc);
|
|
if (node->_private != NULL) {
|
|
childobj = node->_private;
|
|
childobj->document = intern->document;
|
|
php_libxml_increment_doc_ref((php_libxml_node_object *)childobj, NULL);
|
|
}
|
|
}
|
|
if (node == fragment->last) {
|
|
break;
|
|
}
|
|
node = node->next;
|
|
}
|
|
|
|
fragment->children = NULL;
|
|
fragment->last = NULL;
|
|
}
|
|
|
|
return newchild;
|
|
}
|
|
/* }}} */
|
|
|
|
/* {{{ proto domnode dom_node_insert_before(DomNode newChild, DomNode refChild);
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-952280727
|
|
Since:
|
|
*/
|
|
PHP_FUNCTION(dom_node_insert_before)
|
|
{
|
|
zval *id, *node, *ref = NULL;
|
|
xmlNodePtr child, new_child, parentp, refp;
|
|
dom_object *intern, *childobj, *refpobj;
|
|
int ret, stricterror;
|
|
|
|
id = ZEND_THIS;
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|O!", &node, dom_node_class_entry, &ref, dom_node_class_entry) == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
DOM_GET_OBJ(parentp, id, xmlNodePtr, intern);
|
|
|
|
if (dom_node_children_valid(parentp) == FAILURE) {
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
DOM_GET_OBJ(child, node, xmlNodePtr, childobj);
|
|
|
|
new_child = NULL;
|
|
|
|
stricterror = dom_get_strict_error(intern->document);
|
|
|
|
if (dom_node_is_read_only(parentp) == SUCCESS ||
|
|
(child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
|
|
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror);
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
if (dom_hierarchy(parentp, child) == FAILURE) {
|
|
php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror);
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
if (child->doc != parentp->doc && child->doc != NULL) {
|
|
php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror);
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
if (child->type == XML_DOCUMENT_FRAG_NODE && child->children == NULL) {
|
|
php_error_docref(NULL, E_WARNING, "Document Fragment is empty");
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
if (child->doc == NULL && parentp->doc != NULL) {
|
|
childobj->document = intern->document;
|
|
php_libxml_increment_doc_ref((php_libxml_node_object *)childobj, NULL);
|
|
}
|
|
|
|
if (ref != NULL) {
|
|
DOM_GET_OBJ(refp, ref, xmlNodePtr, refpobj);
|
|
if (refp->parent != parentp) {
|
|
php_dom_throw_error(NOT_FOUND_ERR, stricterror);
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
if (child->parent != NULL) {
|
|
xmlUnlinkNode(child);
|
|
}
|
|
|
|
if (child->type == XML_TEXT_NODE && (refp->type == XML_TEXT_NODE ||
|
|
(refp->prev != NULL && refp->prev->type == XML_TEXT_NODE))) {
|
|
if (child->doc == NULL) {
|
|
xmlSetTreeDoc(child, parentp->doc);
|
|
}
|
|
new_child = child;
|
|
new_child->parent = refp->parent;
|
|
new_child->next = refp;
|
|
new_child->prev = refp->prev;
|
|
refp->prev = new_child;
|
|
if (new_child->prev != NULL) {
|
|
new_child->prev->next = new_child;
|
|
}
|
|
if (new_child->parent != NULL) {
|
|
if (new_child->parent->children == refp) {
|
|
new_child->parent->children = new_child;
|
|
}
|
|
}
|
|
|
|
} else if (child->type == XML_ATTRIBUTE_NODE) {
|
|
xmlAttrPtr lastattr;
|
|
|
|
if (child->ns == NULL)
|
|
lastattr = xmlHasProp(refp->parent, child->name);
|
|
else
|
|
lastattr = xmlHasNsProp(refp->parent, child->name, child->ns->href);
|
|
if (lastattr != NULL && lastattr->type != XML_ATTRIBUTE_DECL) {
|
|
if (lastattr != (xmlAttrPtr) child) {
|
|
xmlUnlinkNode((xmlNodePtr) lastattr);
|
|
php_libxml_node_free_resource((xmlNodePtr) lastattr);
|
|
} else {
|
|
DOM_RET_OBJ(child, &ret, intern);
|
|
return;
|
|
}
|
|
}
|
|
} else if (child->type == XML_DOCUMENT_FRAG_NODE) {
|
|
new_child = _php_dom_insert_fragment(parentp, refp->prev, refp, child, intern, childobj);
|
|
}
|
|
|
|
if (new_child == NULL) {
|
|
new_child = xmlAddPrevSibling(refp, child);
|
|
}
|
|
} else {
|
|
if (child->parent != NULL){
|
|
xmlUnlinkNode(child);
|
|
}
|
|
if (child->type == XML_TEXT_NODE && parentp->last != NULL && parentp->last->type == XML_TEXT_NODE) {
|
|
child->parent = parentp;
|
|
if (child->doc == NULL) {
|
|
xmlSetTreeDoc(child, parentp->doc);
|
|
}
|
|
new_child = child;
|
|
if (parentp->children == NULL) {
|
|
parentp->children = child;
|
|
parentp->last = child;
|
|
} else {
|
|
child = parentp->last;
|
|
child->next = new_child;
|
|
new_child->prev = child;
|
|
parentp->last = new_child;
|
|
}
|
|
} else if (child->type == XML_ATTRIBUTE_NODE) {
|
|
xmlAttrPtr lastattr;
|
|
|
|
if (child->ns == NULL)
|
|
lastattr = xmlHasProp(parentp, child->name);
|
|
else
|
|
lastattr = xmlHasNsProp(parentp, child->name, child->ns->href);
|
|
if (lastattr != NULL && lastattr->type != XML_ATTRIBUTE_DECL) {
|
|
if (lastattr != (xmlAttrPtr) child) {
|
|
xmlUnlinkNode((xmlNodePtr) lastattr);
|
|
php_libxml_node_free_resource((xmlNodePtr) lastattr);
|
|
} else {
|
|
DOM_RET_OBJ(child, &ret, intern);
|
|
return;
|
|
}
|
|
}
|
|
} else if (child->type == XML_DOCUMENT_FRAG_NODE) {
|
|
new_child = _php_dom_insert_fragment(parentp, parentp->last, NULL, child, intern, childobj);
|
|
}
|
|
if (new_child == NULL) {
|
|
new_child = xmlAddChild(parentp, child);
|
|
}
|
|
}
|
|
|
|
if (NULL == new_child) {
|
|
php_error_docref(NULL, E_WARNING, "Couldn't add newnode as the previous sibling of refnode");
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
dom_reconcile_ns(parentp->doc, new_child);
|
|
|
|
DOM_RET_OBJ(new_child, &ret, intern);
|
|
|
|
}
|
|
/* }}} end dom_node_insert_before */
|
|
|
|
/* {{{ proto DomNode dom_node_replace_child(DomNode newChild, DomNode oldChild);
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-785887307
|
|
Since:
|
|
*/
|
|
PHP_FUNCTION(dom_node_replace_child)
|
|
{
|
|
zval *id, *newnode, *oldnode;
|
|
xmlNodePtr children, newchild, oldchild, nodep;
|
|
dom_object *intern, *newchildobj, *oldchildobj;
|
|
int foundoldchild = 0, stricterror;
|
|
|
|
int ret;
|
|
|
|
id = ZEND_THIS;
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &newnode, dom_node_class_entry, &oldnode, dom_node_class_entry) == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
|
|
|
|
if (dom_node_children_valid(nodep) == FAILURE) {
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
DOM_GET_OBJ(newchild, newnode, xmlNodePtr, newchildobj);
|
|
DOM_GET_OBJ(oldchild, oldnode, xmlNodePtr, oldchildobj);
|
|
|
|
children = nodep->children;
|
|
if (!children) {
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
stricterror = dom_get_strict_error(intern->document);
|
|
|
|
if (dom_node_is_read_only(nodep) == SUCCESS ||
|
|
(newchild->parent != NULL && dom_node_is_read_only(newchild->parent) == SUCCESS)) {
|
|
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror);
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
if (newchild->doc != nodep->doc && newchild->doc != NULL) {
|
|
php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror);
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
if (dom_hierarchy(nodep, newchild) == FAILURE) {
|
|
php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror);
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
/* check for the old child and whether the new child is already a child */
|
|
while (children) {
|
|
if (children == oldchild) {
|
|
foundoldchild = 1;
|
|
break;
|
|
}
|
|
children = children->next;
|
|
}
|
|
|
|
if (foundoldchild) {
|
|
if (newchild->type == XML_DOCUMENT_FRAG_NODE) {
|
|
xmlNodePtr prevsib, nextsib;
|
|
prevsib = oldchild->prev;
|
|
nextsib = oldchild->next;
|
|
|
|
xmlUnlinkNode(oldchild);
|
|
|
|
newchild = _php_dom_insert_fragment(nodep, prevsib, nextsib, newchild, intern, newchildobj);
|
|
if (newchild) {
|
|
dom_reconcile_ns(nodep->doc, newchild);
|
|
}
|
|
} else if (oldchild != newchild) {
|
|
if (newchild->doc == NULL && nodep->doc != NULL) {
|
|
xmlSetTreeDoc(newchild, nodep->doc);
|
|
newchildobj->document = intern->document;
|
|
php_libxml_increment_doc_ref((php_libxml_node_object *)newchildobj, NULL);
|
|
}
|
|
xmlReplaceNode(oldchild, newchild);
|
|
dom_reconcile_ns(nodep->doc, newchild);
|
|
}
|
|
DOM_RET_OBJ(oldchild, &ret, intern);
|
|
return;
|
|
} else {
|
|
php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document));
|
|
RETURN_FALSE;
|
|
}
|
|
}
|
|
/* }}} end dom_node_replace_child */
|
|
|
|
/* {{{ proto DomNode dom_node_remove_child(DomNode oldChild);
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1734834066
|
|
Since:
|
|
*/
|
|
PHP_FUNCTION(dom_node_remove_child)
|
|
{
|
|
zval *id, *node;
|
|
xmlNodePtr children, child, nodep;
|
|
dom_object *intern, *childobj;
|
|
int ret, stricterror;
|
|
|
|
id = ZEND_THIS;
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &node, dom_node_class_entry) == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
|
|
|
|
if (dom_node_children_valid(nodep) == FAILURE) {
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
DOM_GET_OBJ(child, node, xmlNodePtr, childobj);
|
|
|
|
stricterror = dom_get_strict_error(intern->document);
|
|
|
|
if (dom_node_is_read_only(nodep) == SUCCESS ||
|
|
(child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
|
|
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror);
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
children = nodep->children;
|
|
if (!children) {
|
|
php_dom_throw_error(NOT_FOUND_ERR, stricterror);
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
while (children) {
|
|
if (children == child) {
|
|
xmlUnlinkNode(child);
|
|
DOM_RET_OBJ(child, &ret, intern);
|
|
return;
|
|
}
|
|
children = children->next;
|
|
}
|
|
|
|
php_dom_throw_error(NOT_FOUND_ERR, stricterror);
|
|
RETURN_FALSE
|
|
}
|
|
/* }}} end dom_node_remove_child */
|
|
|
|
/* {{{ proto DomNode dom_node_append_child(DomNode newChild);
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-184E7107
|
|
Since:
|
|
*/
|
|
PHP_FUNCTION(dom_node_append_child)
|
|
{
|
|
zval *id, *node;
|
|
xmlNodePtr child, nodep, new_child = NULL;
|
|
dom_object *intern, *childobj;
|
|
int ret, stricterror;
|
|
|
|
id = ZEND_THIS;
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &node, dom_node_class_entry) == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
|
|
|
|
if (dom_node_children_valid(nodep) == FAILURE) {
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
DOM_GET_OBJ(child, node, xmlNodePtr, childobj);
|
|
|
|
stricterror = dom_get_strict_error(intern->document);
|
|
|
|
if (dom_node_is_read_only(nodep) == SUCCESS ||
|
|
(child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
|
|
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror);
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
if (dom_hierarchy(nodep, child) == FAILURE) {
|
|
php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror);
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
if (!(child->doc == NULL || child->doc == nodep->doc)) {
|
|
php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror);
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
if (child->type == XML_DOCUMENT_FRAG_NODE && child->children == NULL) {
|
|
php_error_docref(NULL, E_WARNING, "Document Fragment is empty");
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
if (child->doc == NULL && nodep->doc != NULL) {
|
|
childobj->document = intern->document;
|
|
php_libxml_increment_doc_ref((php_libxml_node_object *)childobj, NULL);
|
|
}
|
|
|
|
if (child->parent != NULL){
|
|
xmlUnlinkNode(child);
|
|
}
|
|
|
|
if (child->type == XML_TEXT_NODE && nodep->last != NULL && nodep->last->type == XML_TEXT_NODE) {
|
|
child->parent = nodep;
|
|
if (child->doc == NULL) {
|
|
xmlSetTreeDoc(child, nodep->doc);
|
|
}
|
|
new_child = child;
|
|
if (nodep->children == NULL) {
|
|
nodep->children = child;
|
|
nodep->last = child;
|
|
} else {
|
|
child = nodep->last;
|
|
child->next = new_child;
|
|
new_child->prev = child;
|
|
nodep->last = new_child;
|
|
}
|
|
} else if (child->type == XML_ATTRIBUTE_NODE) {
|
|
xmlAttrPtr lastattr;
|
|
|
|
if (child->ns == NULL)
|
|
lastattr = xmlHasProp(nodep, child->name);
|
|
else
|
|
lastattr = xmlHasNsProp(nodep, child->name, child->ns->href);
|
|
if (lastattr != NULL && lastattr->type != XML_ATTRIBUTE_DECL) {
|
|
if (lastattr != (xmlAttrPtr) child) {
|
|
xmlUnlinkNode((xmlNodePtr) lastattr);
|
|
php_libxml_node_free_resource((xmlNodePtr) lastattr);
|
|
}
|
|
}
|
|
} else if (child->type == XML_DOCUMENT_FRAG_NODE) {
|
|
new_child = _php_dom_insert_fragment(nodep, nodep->last, NULL, child, intern, childobj);
|
|
}
|
|
|
|
if (new_child == NULL) {
|
|
new_child = xmlAddChild(nodep, child);
|
|
if (new_child == NULL) {
|
|
php_error_docref(NULL, E_WARNING, "Couldn't append node");
|
|
RETURN_FALSE;
|
|
}
|
|
}
|
|
|
|
dom_reconcile_ns(nodep->doc, new_child);
|
|
|
|
DOM_RET_OBJ(new_child, &ret, intern);
|
|
}
|
|
/* }}} end dom_node_append_child */
|
|
|
|
/* {{{ proto bool dom_node_has_child_nodes();
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-810594187
|
|
Since:
|
|
*/
|
|
PHP_FUNCTION(dom_node_has_child_nodes)
|
|
{
|
|
zval *id;
|
|
xmlNode *nodep;
|
|
dom_object *intern;
|
|
|
|
id = ZEND_THIS;
|
|
if (zend_parse_parameters_none() == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
|
|
|
|
if (dom_node_children_valid(nodep) == FAILURE) {
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
if (nodep->children) {
|
|
RETURN_TRUE;
|
|
} else {
|
|
RETURN_FALSE;
|
|
}
|
|
}
|
|
/* }}} end dom_node_has_child_nodes */
|
|
|
|
/* {{{ proto DomNode dom_node_clone_node(bool deep);
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-3A0ED0A4
|
|
Since:
|
|
*/
|
|
PHP_FUNCTION(dom_node_clone_node)
|
|
{
|
|
zval *id;
|
|
xmlNode *n, *node;
|
|
int ret;
|
|
dom_object *intern;
|
|
zend_bool recursive = 0;
|
|
|
|
id = ZEND_THIS;
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &recursive) == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
DOM_GET_OBJ(n, id, xmlNodePtr, intern);
|
|
|
|
node = xmlDocCopyNode(n, n->doc, recursive);
|
|
|
|
if (!node) {
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
/* When deep is false Element nodes still require the attributes
|
|
Following taken from libxml as xmlDocCopyNode doesn't do this */
|
|
if (n->type == XML_ELEMENT_NODE && recursive == 0) {
|
|
if (n->nsDef != NULL) {
|
|
node->nsDef = xmlCopyNamespaceList(n->nsDef);
|
|
}
|
|
if (n->ns != NULL) {
|
|
xmlNsPtr ns;
|
|
ns = xmlSearchNs(n->doc, node, n->ns->prefix);
|
|
if (ns == NULL) {
|
|
ns = xmlSearchNs(n->doc, n, n->ns->prefix);
|
|
if (ns != NULL) {
|
|
xmlNodePtr root = node;
|
|
|
|
while (root->parent != NULL) {
|
|
root = root->parent;
|
|
}
|
|
node->ns = xmlNewNs(root, ns->href, ns->prefix);
|
|
}
|
|
} else {
|
|
node->ns = ns;
|
|
}
|
|
}
|
|
if (n->properties != NULL) {
|
|
node->properties = xmlCopyPropList(node, n->properties);
|
|
}
|
|
}
|
|
|
|
/* If document cloned we want a new document proxy */
|
|
if (node->doc != n->doc) {
|
|
intern = NULL;
|
|
}
|
|
|
|
DOM_RET_OBJ(node, &ret, intern);
|
|
}
|
|
/* }}} end dom_node_clone_node */
|
|
|
|
/* {{{ proto void dom_node_normalize();
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-normalize
|
|
Since:
|
|
*/
|
|
PHP_FUNCTION(dom_node_normalize)
|
|
{
|
|
zval *id;
|
|
xmlNode *nodep;
|
|
dom_object *intern;
|
|
|
|
id = ZEND_THIS;
|
|
if (zend_parse_parameters_none() == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
|
|
|
|
dom_normalize(nodep);
|
|
|
|
}
|
|
/* }}} end dom_node_normalize */
|
|
|
|
/* {{{ proto bool dom_node_is_supported(string feature, string version);
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Level-2-Core-Node-supports
|
|
Since: DOM Level 2
|
|
*/
|
|
PHP_FUNCTION(dom_node_is_supported)
|
|
{
|
|
size_t feature_len, version_len;
|
|
char *feature, *version;
|
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &feature, &feature_len, &version, &version_len) == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
if (dom_has_feature(feature, version)) {
|
|
RETURN_TRUE;
|
|
} else {
|
|
RETURN_FALSE;
|
|
}
|
|
}
|
|
/* }}} end dom_node_is_supported */
|
|
|
|
/* {{{ proto bool dom_node_has_attributes();
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeHasAttrs
|
|
Since: DOM Level 2
|
|
*/
|
|
PHP_FUNCTION(dom_node_has_attributes)
|
|
{
|
|
zval *id;
|
|
xmlNode *nodep;
|
|
dom_object *intern;
|
|
|
|
id = ZEND_THIS;
|
|
if (zend_parse_parameters_none() == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
|
|
|
|
if (nodep->type != XML_ELEMENT_NODE)
|
|
RETURN_FALSE;
|
|
|
|
if (nodep->properties) {
|
|
RETURN_TRUE;
|
|
} else {
|
|
RETURN_FALSE;
|
|
}
|
|
}
|
|
/* }}} end dom_node_has_attributes */
|
|
|
|
/* {{{ proto short dom_node_compare_document_position(DomNode other);
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-compareDocumentPosition
|
|
Since: DOM Level 3
|
|
*/
|
|
PHP_FUNCTION(dom_node_compare_document_position)
|
|
{
|
|
DOM_NOT_IMPLEMENTED();
|
|
}
|
|
/* }}} end dom_node_compare_document_position */
|
|
|
|
/* {{{ proto bool dom_node_is_same_node(DomNode other);
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isSameNode
|
|
Since: DOM Level 3
|
|
*/
|
|
PHP_FUNCTION(dom_node_is_same_node)
|
|
{
|
|
zval *id, *node;
|
|
xmlNodePtr nodeotherp, nodep;
|
|
dom_object *intern, *nodeotherobj;
|
|
|
|
id = ZEND_THIS;
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &node, dom_node_class_entry) == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
|
|
|
|
DOM_GET_OBJ(nodeotherp, node, xmlNodePtr, nodeotherobj);
|
|
|
|
if (nodep == nodeotherp) {
|
|
RETURN_TRUE;
|
|
} else {
|
|
RETURN_FALSE;
|
|
}
|
|
}
|
|
/* }}} end dom_node_is_same_node */
|
|
|
|
/* {{{ proto string dom_node_lookup_prefix(string namespaceURI);
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-lookupNamespacePrefix
|
|
Since: DOM Level 3
|
|
*/
|
|
PHP_FUNCTION(dom_node_lookup_prefix)
|
|
{
|
|
zval *id;
|
|
xmlNodePtr nodep, lookupp = NULL;
|
|
dom_object *intern;
|
|
xmlNsPtr nsptr;
|
|
size_t uri_len = 0;
|
|
char *uri;
|
|
|
|
id = ZEND_THIS;
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &uri, &uri_len) == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
|
|
|
|
if (uri_len > 0) {
|
|
switch (nodep->type) {
|
|
case XML_ELEMENT_NODE:
|
|
lookupp = nodep;
|
|
break;
|
|
case XML_DOCUMENT_NODE:
|
|
case XML_HTML_DOCUMENT_NODE:
|
|
lookupp = xmlDocGetRootElement((xmlDocPtr) nodep);
|
|
break;
|
|
case XML_ENTITY_NODE :
|
|
case XML_NOTATION_NODE:
|
|
case XML_DOCUMENT_FRAG_NODE:
|
|
case XML_DOCUMENT_TYPE_NODE:
|
|
case XML_DTD_NODE:
|
|
RETURN_NULL();
|
|
break;
|
|
default:
|
|
lookupp = nodep->parent;
|
|
}
|
|
|
|
if (lookupp != NULL) {
|
|
nsptr = xmlSearchNsByHref(lookupp->doc, lookupp, (xmlChar *) uri);
|
|
if (nsptr && nsptr->prefix != NULL) {
|
|
RETURN_STRING((char *) nsptr->prefix);
|
|
}
|
|
}
|
|
}
|
|
|
|
RETURN_NULL();
|
|
}
|
|
/* }}} end dom_node_lookup_prefix */
|
|
|
|
/* {{{ proto bool dom_node_is_default_namespace(string namespaceURI);
|
|
URL: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-isDefaultNamespace
|
|
Since: DOM Level 3
|
|
*/
|
|
PHP_FUNCTION(dom_node_is_default_namespace)
|
|
{
|
|
zval *id;
|
|
xmlNodePtr nodep;
|
|
dom_object *intern;
|
|
xmlNsPtr nsptr;
|
|
size_t uri_len = 0;
|
|
char *uri;
|
|
|
|
id = ZEND_THIS;
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &uri, &uri_len) == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
|
|
if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
|
|
nodep = xmlDocGetRootElement((xmlDocPtr) nodep);
|
|
}
|
|
|
|
if (nodep && uri_len > 0) {
|
|
nsptr = xmlSearchNs(nodep->doc, nodep, NULL);
|
|
if (nsptr && xmlStrEqual(nsptr->href, (xmlChar *) uri)) {
|
|
RETURN_TRUE;
|
|
}
|
|
}
|
|
|
|
RETURN_FALSE;
|
|
}
|
|
/* }}} end dom_node_is_default_namespace */
|
|
|
|
/* {{{ proto string dom_node_lookup_namespace_uri(string prefix);
|
|
URL: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespaceURI
|
|
Since: DOM Level 3
|
|
*/
|
|
PHP_FUNCTION(dom_node_lookup_namespace_uri)
|
|
{
|
|
zval *id;
|
|
xmlNodePtr nodep;
|
|
dom_object *intern;
|
|
xmlNsPtr nsptr;
|
|
size_t prefix_len;
|
|
char *prefix;
|
|
|
|
id = ZEND_THIS;
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!", &prefix, &prefix_len) == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
|
|
if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
|
|
nodep = xmlDocGetRootElement((xmlDocPtr) nodep);
|
|
if (nodep == NULL) {
|
|
RETURN_NULL();
|
|
}
|
|
}
|
|
|
|
nsptr = xmlSearchNs(nodep->doc, nodep, (xmlChar *) prefix);
|
|
if (nsptr && nsptr->href != NULL) {
|
|
RETURN_STRING((char *) nsptr->href);
|
|
}
|
|
|
|
RETURN_NULL();
|
|
}
|
|
/* }}} end dom_node_lookup_namespace_uri */
|
|
|
|
/* {{{ proto bool dom_node_is_equal_node(DomNode arg);
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isEqualNode
|
|
Since: DOM Level 3
|
|
*/
|
|
PHP_FUNCTION(dom_node_is_equal_node)
|
|
{
|
|
DOM_NOT_IMPLEMENTED();
|
|
}
|
|
/* }}} end dom_node_is_equal_node */
|
|
|
|
/* {{{ proto DomNode dom_node_get_feature(string feature, string version);
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-getFeature
|
|
Since: DOM Level 3
|
|
*/
|
|
PHP_FUNCTION(dom_node_get_feature)
|
|
{
|
|
DOM_NOT_IMPLEMENTED();
|
|
}
|
|
/* }}} end dom_node_get_feature */
|
|
|
|
/* {{{ proto mixed dom_node_set_user_data(string key, mixed data, userdatahandler handler);
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-setUserData
|
|
Since: DOM Level 3
|
|
*/
|
|
PHP_FUNCTION(dom_node_set_user_data)
|
|
{
|
|
DOM_NOT_IMPLEMENTED();
|
|
}
|
|
/* }}} end dom_node_set_user_data */
|
|
|
|
/* {{{ proto mixed dom_node_get_user_data(string key);
|
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-getUserData
|
|
Since: DOM Level 3
|
|
*/
|
|
PHP_FUNCTION(dom_node_get_user_data)
|
|
{
|
|
DOM_NOT_IMPLEMENTED();
|
|
}
|
|
/* }}} end dom_node_get_user_data */
|
|
|
|
static void dom_canonicalization(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */
|
|
{
|
|
zval *id;
|
|
zval *xpath_array=NULL, *ns_prefixes=NULL;
|
|
xmlNodePtr nodep;
|
|
xmlDocPtr docp;
|
|
xmlNodeSetPtr nodeset = NULL;
|
|
dom_object *intern;
|
|
zend_bool exclusive=0, with_comments=0;
|
|
xmlChar **inclusive_ns_prefixes = NULL;
|
|
char *file = NULL;
|
|
int ret = -1;
|
|
size_t file_len = 0;
|
|
xmlOutputBufferPtr buf;
|
|
xmlXPathContextPtr ctxp=NULL;
|
|
xmlXPathObjectPtr xpathobjp=NULL;
|
|
|
|
id = ZEND_THIS;
|
|
if (mode == 0) {
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS(),
|
|
"|bba!a!", &exclusive, &with_comments,
|
|
&xpath_array, &ns_prefixes) == FAILURE) {
|
|
return;
|
|
}
|
|
} else {
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS(),
|
|
"s|bba!a!", &file, &file_len, &exclusive,
|
|
&with_comments, &xpath_array, &ns_prefixes) == FAILURE) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
|
|
|
|
docp = nodep->doc;
|
|
|
|
if (! docp) {
|
|
php_error_docref(NULL, E_WARNING, "Node must be associated with a document");
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
if (xpath_array == NULL) {
|
|
if (nodep->type != XML_DOCUMENT_NODE) {
|
|
ctxp = xmlXPathNewContext(docp);
|
|
ctxp->node = nodep;
|
|
xpathobjp = xmlXPathEvalExpression((xmlChar *) "(.//. | .//@* | .//namespace::*)", ctxp);
|
|
ctxp->node = NULL;
|
|
if (xpathobjp && xpathobjp->type == XPATH_NODESET) {
|
|
nodeset = xpathobjp->nodesetval;
|
|
} else {
|
|
if (xpathobjp) {
|
|
xmlXPathFreeObject(xpathobjp);
|
|
}
|
|
xmlXPathFreeContext(ctxp);
|
|
php_error_docref(NULL, E_WARNING, "XPath query did not return a nodeset.");
|
|
RETURN_FALSE;
|
|
}
|
|
}
|
|
} else {
|
|
/*xpath query from xpath_array */
|
|
HashTable *ht = Z_ARRVAL_P(xpath_array);
|
|
zval *tmp;
|
|
char *xquery;
|
|
|
|
tmp = zend_hash_str_find(ht, "query", sizeof("query")-1);
|
|
if (tmp && Z_TYPE_P(tmp) == IS_STRING) {
|
|
xquery = Z_STRVAL_P(tmp);
|
|
} else {
|
|
php_error_docref(NULL, E_WARNING, "'query' missing from xpath array or is not a string");
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
ctxp = xmlXPathNewContext(docp);
|
|
ctxp->node = nodep;
|
|
|
|
tmp = zend_hash_str_find(ht, "namespaces", sizeof("namespaces")-1);
|
|
if (tmp && Z_TYPE_P(tmp) == IS_ARRAY) {
|
|
zval *tmpns;
|
|
zend_string *prefix;
|
|
|
|
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(tmp), prefix, tmpns) {
|
|
if (Z_TYPE_P(tmpns) == IS_STRING) {
|
|
if (prefix) {
|
|
xmlXPathRegisterNs(ctxp, (xmlChar *) ZSTR_VAL(prefix), (xmlChar *) Z_STRVAL_P(tmpns));
|
|
}
|
|
}
|
|
} ZEND_HASH_FOREACH_END();
|
|
}
|
|
|
|
xpathobjp = xmlXPathEvalExpression((xmlChar *) xquery, ctxp);
|
|
ctxp->node = NULL;
|
|
if (xpathobjp && xpathobjp->type == XPATH_NODESET) {
|
|
nodeset = xpathobjp->nodesetval;
|
|
} else {
|
|
if (xpathobjp) {
|
|
xmlXPathFreeObject(xpathobjp);
|
|
}
|
|
xmlXPathFreeContext(ctxp);
|
|
php_error_docref(NULL, E_WARNING, "XPath query did not return a nodeset.");
|
|
RETURN_FALSE;
|
|
}
|
|
}
|
|
|
|
if (ns_prefixes != NULL) {
|
|
if (exclusive) {
|
|
zval *tmpns;
|
|
int nscount = 0;
|
|
|
|
inclusive_ns_prefixes = safe_emalloc(zend_hash_num_elements(Z_ARRVAL_P(ns_prefixes)) + 1,
|
|
sizeof(xmlChar *), 0);
|
|
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(ns_prefixes), tmpns) {
|
|
if (Z_TYPE_P(tmpns) == IS_STRING) {
|
|
inclusive_ns_prefixes[nscount++] = (xmlChar *) Z_STRVAL_P(tmpns);
|
|
}
|
|
} ZEND_HASH_FOREACH_END();
|
|
inclusive_ns_prefixes[nscount] = NULL;
|
|
} else {
|
|
php_error_docref(NULL, E_NOTICE,
|
|
"Inclusive namespace prefixes only allowed in exclusive mode.");
|
|
}
|
|
}
|
|
|
|
if (mode == 1) {
|
|
buf = xmlOutputBufferCreateFilename(file, NULL, 0);
|
|
} else {
|
|
buf = xmlAllocOutputBuffer(NULL);
|
|
}
|
|
|
|
if (buf != NULL) {
|
|
ret = xmlC14NDocSaveTo(docp, nodeset, exclusive, inclusive_ns_prefixes,
|
|
with_comments, buf);
|
|
}
|
|
|
|
if (inclusive_ns_prefixes != NULL) {
|
|
efree(inclusive_ns_prefixes);
|
|
}
|
|
if (xpathobjp != NULL) {
|
|
xmlXPathFreeObject(xpathobjp);
|
|
}
|
|
if (ctxp != NULL) {
|
|
xmlXPathFreeContext(ctxp);
|
|
}
|
|
|
|
if (buf == NULL || ret < 0) {
|
|
RETVAL_FALSE;
|
|
} else {
|
|
if (mode == 0) {
|
|
#ifdef LIBXML2_NEW_BUFFER
|
|
ret = xmlOutputBufferGetSize(buf);
|
|
#else
|
|
ret = buf->buffer->use;
|
|
#endif
|
|
if (ret > 0) {
|
|
#ifdef LIBXML2_NEW_BUFFER
|
|
RETVAL_STRINGL((char *) xmlOutputBufferGetContent(buf), ret);
|
|
#else
|
|
RETVAL_STRINGL((char *) buf->buffer->content, ret);
|
|
#endif
|
|
} else {
|
|
RETVAL_EMPTY_STRING();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (buf) {
|
|
int bytes;
|
|
|
|
bytes = xmlOutputBufferClose(buf);
|
|
if (mode == 1 && (ret >= 0)) {
|
|
RETURN_LONG(bytes);
|
|
}
|
|
}
|
|
}
|
|
/* }}} */
|
|
|
|
/* {{{ proto string DOMNode::C14N([bool exclusive [, bool with_comments [, array xpath [, array ns_prefixes]]]])
|
|
Canonicalize nodes to a string */
|
|
PHP_METHOD(domnode, C14N)
|
|
{
|
|
dom_canonicalization(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
|
|
}
|
|
/* }}} */
|
|
|
|
/* {{{ proto int DOMNode::C14NFile(string uri [, bool exclusive [, bool with_comments [, array xpath [, array ns_prefixes]]]])
|
|
Canonicalize nodes to a file */
|
|
PHP_METHOD(domnode, C14NFile)
|
|
{
|
|
dom_canonicalization(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
|
|
}
|
|
/* }}} */
|
|
|
|
/* {{{ proto int DOMNode::getNodePath()
|
|
Gets an xpath for a node */
|
|
PHP_METHOD(domnode, getNodePath)
|
|
{
|
|
zval *id;
|
|
xmlNode *nodep;
|
|
dom_object *intern;
|
|
char *value;
|
|
|
|
DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
|
|
|
|
value = (char *) xmlGetNodePath(nodep);
|
|
if (value == NULL) {
|
|
RETURN_NULL();
|
|
} else {
|
|
RETVAL_STRING(value);
|
|
xmlFree(value);
|
|
}
|
|
}
|
|
/* }}} */
|
|
|
|
/* {{{ proto int DOMNode::getLineNo()
|
|
Gets line number for a node */
|
|
PHP_METHOD(domnode, getLineNo)
|
|
{
|
|
zval *id;
|
|
xmlNode *nodep;
|
|
dom_object *intern;
|
|
|
|
if (zend_parse_parameters_none() == FAILURE) {
|
|
return;
|
|
}
|
|
|
|
DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
|
|
|
|
RETURN_LONG(xmlGetLineNo(nodep));
|
|
}
|
|
/* }}} */
|
|
|
|
#endif
|