Use common helper macro for getting the node in property handlers

This commit is contained in:
Niels Dossche 2024-03-09 18:05:28 +01:00
parent 649394d357
commit 539d8d9259
13 changed files with 123 additions and 458 deletions

View file

@ -24,6 +24,7 @@
#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
#include "php_dom.h"
#include "dom_properties.h"
/*
* class DOMAttr extends DOMNode
@ -77,12 +78,7 @@ Since:
*/
zend_result dom_attr_name_read(dom_object *obj, zval *retval)
{
xmlAttrPtr attrp = (xmlAttrPtr) dom_object_get_node(obj);
if (attrp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlAttrPtr, attrp, obj);
if (php_dom_follow_spec_intern(obj)) {
zend_string *str = dom_node_get_node_name_attribute_or_element((xmlNodePtr) attrp, false);
@ -117,14 +113,9 @@ Since:
*/
zend_result dom_attr_value_read(dom_object *obj, zval *retval)
{
xmlAttrPtr attrp = (xmlAttrPtr) dom_object_get_node(obj);
DOM_PROP_NODE(xmlAttrPtr, attrp, obj);
xmlChar *content;
if (attrp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
/* Can't avoid a content copy because it's an attribute node */
if ((content = xmlNodeGetContent((xmlNodePtr) attrp)) != NULL) {
ZVAL_STRING(retval, (char *) content);
@ -139,12 +130,7 @@ zend_result dom_attr_value_read(dom_object *obj, zval *retval)
zend_result dom_attr_value_write(dom_object *obj, zval *newval)
{
xmlAttrPtr attrp = (xmlAttrPtr) dom_object_get_node(obj);
if (attrp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlAttrPtr, attrp, obj);
/* Typed property, this is already a string */
ZEND_ASSERT(Z_TYPE_P(newval) == IS_STRING);
@ -171,16 +157,9 @@ Since: DOM Level 2
*/
zend_result dom_attr_owner_element_read(dom_object *obj, zval *retval)
{
xmlNodePtr nodep, nodeparent;
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
nodeparent = nodep->parent;
xmlNodePtr nodeparent = nodep->parent;
if (!nodeparent) {
ZVAL_NULL(retval);
return SUCCESS;
@ -188,7 +167,6 @@ zend_result dom_attr_owner_element_read(dom_object *obj, zval *retval)
php_dom_create_object(nodeparent, retval, obj);
return SUCCESS;
}
/* }}} */

View file

@ -22,6 +22,7 @@
#include "php.h"
#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
#include "php_dom.h"
#include "dom_properties.h"
/*
* class DOMCharacterData extends DOMNode
@ -55,26 +56,14 @@ Since:
*/
zend_result dom_characterdata_data_read(dom_object *obj, zval *retval)
{
xmlNodePtr nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
php_dom_get_content_into_zval(nodep, retval, false);
return SUCCESS;
}
zend_result dom_characterdata_data_write(dom_object *obj, zval *newval)
{
xmlNode *nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
/* Typed property, this is already a string */
ZEND_ASSERT(Z_TYPE_P(newval) == IS_STRING);
@ -94,14 +83,9 @@ Since:
*/
zend_result dom_characterdata_length_read(dom_object *obj, zval *retval)
{
xmlNodePtr nodep = dom_object_get_node(obj);
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
long length = 0;
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
if (nodep->content) {
length = xmlUTF8Strlen(nodep->content);
}

View file

@ -25,6 +25,7 @@
#include "namespace_compat.h"
#include "xml_serializer.h"
#include "internal_helpers.h"
#include "dom_properties.h"
#include <libxml/SAX.h>
#ifdef LIBXML_SCHEMAS_ENABLED
#include <libxml/relaxng.h>
@ -45,15 +46,9 @@ Since:
*/
zend_result dom_document_doctype_read(dom_object *obj, zval *retval)
{
xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
xmlDtdPtr dtdptr;
DOM_PROP_NODE(xmlDocPtr, docp, obj);
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
dtdptr = xmlGetIntSubset(docp);
xmlDtdPtr dtdptr = xmlGetIntSubset(docp);
if (!dtdptr) {
ZVAL_NULL(retval);
return SUCCESS;
@ -84,15 +79,9 @@ Since:
*/
zend_result dom_document_document_element_read(dom_object *obj, zval *retval)
{
xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
xmlNode *root;
DOM_PROP_NODE(xmlDocPtr, docp, obj);
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
root = xmlDocGetRootElement(docp);
xmlNodePtr root = xmlDocGetRootElement(docp);
if (!root) {
ZVAL_NULL(retval);
return SUCCESS;
@ -110,15 +99,9 @@ Since: DOM Level 3
*/
zend_result dom_document_encoding_read(dom_object *obj, zval *retval)
{
xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
char *encoding;
DOM_PROP_NODE(xmlDocPtr, docp, obj);
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
encoding = (char *) docp->encoding;
const char *encoding = (const char *) docp->encoding;
if (encoding != NULL) {
ZVAL_STRING(retval, encoding);
@ -131,13 +114,7 @@ zend_result dom_document_encoding_read(dom_object *obj, zval *retval)
zend_result dom_document_encoding_write(dom_object *obj, zval *newval)
{
xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
xmlCharEncodingHandlerPtr handler;
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlDocPtr, docp, obj);
/* Typed property, can only be IS_STRING or IS_NULL. */
ZEND_ASSERT(Z_TYPE_P(newval) == IS_STRING || Z_TYPE_P(newval) == IS_NULL);
@ -146,9 +123,9 @@ zend_result dom_document_encoding_write(dom_object *obj, zval *newval)
goto invalid_encoding;
}
zend_string *str = Z_STR_P(newval);
const zend_string *str = Z_STR_P(newval);
handler = xmlFindCharEncodingHandler(ZSTR_VAL(str));
xmlCharEncodingHandlerPtr handler = xmlFindCharEncodingHandler(ZSTR_VAL(str));
if (handler != NULL) {
xmlCharEncCloseFunc(handler);
@ -176,30 +153,16 @@ Since: DOM Level 3
*/
zend_result dom_document_standalone_read(dom_object *obj, zval *retval)
{
xmlDoc *docp;
docp = (xmlDocPtr) dom_object_get_node(obj);
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlDocPtr, docp, obj);
ZVAL_BOOL(retval, docp->standalone > 0);
return SUCCESS;
}
zend_result dom_document_standalone_write(dom_object *obj, zval *newval)
{
xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
zend_long standalone;
DOM_PROP_NODE(xmlDocPtr, docp, obj);
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
standalone = zval_get_long(newval);
zend_long standalone = zval_get_long(newval);
docp->standalone = ZEND_NORMALIZE_BOOL(standalone);
return SUCCESS;
@ -214,15 +177,9 @@ Since: DOM Level 3
*/
zend_result dom_document_version_read(dom_object *obj, zval *retval)
{
xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
char *version;
DOM_PROP_NODE(xmlDocPtr, docp, obj);
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
version = (char *) docp->version;
const char *version = (const char *) docp->version;
if (version != NULL) {
ZVAL_STRING(retval, version);
@ -235,15 +192,9 @@ zend_result dom_document_version_read(dom_object *obj, zval *retval)
zend_result dom_document_version_write(dom_object *obj, zval *newval)
{
xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
zend_string *str;
DOM_PROP_NODE(xmlDocPtr, docp, obj);
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
str = zval_try_get_string(newval);
zend_string *str = zval_try_get_string(newval);
if (UNEXPECTED(!str)) {
return FAILURE;
}
@ -425,15 +376,9 @@ Since: DOM Level 3
*/
zend_result dom_document_document_uri_read(dom_object *obj, zval *retval)
{
xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
char *url;
DOM_PROP_NODE(xmlDocPtr, docp, obj);
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
url = (char *) docp->URL;
const char *url = (const char *) docp->URL;
if (url != NULL) {
ZVAL_STRING(retval, url);
} else {
@ -449,15 +394,9 @@ zend_result dom_document_document_uri_read(dom_object *obj, zval *retval)
zend_result dom_document_document_uri_write(dom_object *obj, zval *newval)
{
xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
zend_string *str;
DOM_PROP_NODE(xmlDocPtr, docp, obj);
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
str = zval_try_get_string(newval);
zend_string *str = zval_try_get_string(newval);
if (UNEXPECTED(!str)) {
return FAILURE;
}

View file

@ -22,6 +22,7 @@
#include "php.h"
#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
#include "php_dom.h"
#include "dom_properties.h"
/* {{{ name string
readonly=yes
@ -30,15 +31,8 @@ Since:
*/
zend_result dom_documenttype_name_read(dom_object *obj, zval *retval)
{
xmlDtdPtr dtdptr = (xmlDtdPtr) dom_object_get_node(obj);
if (dtdptr == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
ZVAL_STRING(retval, dtdptr->name ? (char *) (dtdptr->name) : "");
return SUCCESS;
}
@ -51,20 +45,13 @@ Since:
*/
zend_result dom_documenttype_entities_read(dom_object *obj, zval *retval)
{
xmlDtdPtr doctypep = (xmlDtdPtr) dom_object_get_node(obj);
xmlHashTable *entityht;
dom_object *intern;
if (doctypep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
php_dom_create_iterator(retval, DOM_DTD_NAMEDNODEMAP, php_dom_follow_spec_intern(obj));
entityht = (xmlHashTable *) doctypep->entities;
xmlHashTable *entityht = (xmlHashTable *) dtdptr->entities;
intern = Z_DOMOBJ_P(retval);
dom_object *intern = Z_DOMOBJ_P(retval);
dom_namednode_iter(obj, XML_ENTITY_NODE, intern, entityht, NULL, 0, NULL, 0);
return SUCCESS;
@ -79,20 +66,13 @@ Since:
*/
zend_result dom_documenttype_notations_read(dom_object *obj, zval *retval)
{
xmlDtdPtr doctypep = (xmlDtdPtr) dom_object_get_node(obj);
xmlHashTable *notationht;
dom_object *intern;
if (doctypep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
php_dom_create_iterator(retval, DOM_DTD_NAMEDNODEMAP, php_dom_follow_spec_intern(obj));
notationht = (xmlHashTable *) doctypep->notations;
xmlHashTable *notationht = (xmlHashTable *) dtdptr->notations;
intern = Z_DOMOBJ_P(retval);
dom_object *intern = Z_DOMOBJ_P(retval);
dom_namednode_iter(obj, XML_NOTATION_NODE, intern, notationht, NULL, 0, NULL, 0);
return SUCCESS;
@ -107,20 +87,15 @@ Since: DOM Level 2
*/
zend_result dom_documenttype_public_id_read(dom_object *obj, zval *retval)
{
xmlDtdPtr dtdptr = (xmlDtdPtr) dom_object_get_node(obj);
if (dtdptr == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
if (dtdptr->ExternalID) {
ZVAL_STRING(retval, (char *) (dtdptr->ExternalID));
} else {
ZVAL_EMPTY_STRING(retval);
}
return SUCCESS;
return SUCCESS;
}
/* }}} */
@ -132,18 +107,14 @@ Since: DOM Level 2
*/
zend_result dom_documenttype_system_id_read(dom_object *obj, zval *retval)
{
xmlDtdPtr dtdptr = (xmlDtdPtr) dom_object_get_node(obj);
if (dtdptr == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
if (dtdptr->SystemID) {
ZVAL_STRING(retval, (char *) (dtdptr->SystemID));
} else {
ZVAL_EMPTY_STRING(retval);
}
return SUCCESS;
}
@ -156,14 +127,9 @@ Since: DOM Level 2
*/
zend_result dom_documenttype_internal_subset_read(dom_object *obj, zval *retval)
{
xmlDtdPtr dtdptr = (xmlDtdPtr) dom_object_get_node(obj);
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
xmlDtdPtr intsubset;
if (dtdptr == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
if (dtdptr->doc != NULL && ((intsubset = xmlGetIntSubset(dtdptr->doc)) != NULL)) {
smart_str ret_buf = {0};
xmlNodePtr cur = intsubset->children;
@ -192,7 +158,6 @@ zend_result dom_documenttype_internal_subset_read(dom_object *obj, zval *retval)
ZVAL_NULL(retval);
return SUCCESS;
}
/* }}} */

View file

@ -145,4 +145,11 @@ zend_result dom_xpath_register_node_ns_read(dom_object *obj, zval *retval);
zend_result dom_xpath_register_node_ns_write(dom_object *obj, zval *newval);
#endif
#define DOM_PROP_NODE(type, name, obj) \
type name = (type) dom_object_get_node(obj); \
if (UNEXPECTED(name == NULL)) { \
php_dom_throw_error(INVALID_STATE_ERR, true); \
return FAILURE; \
}
#endif /* DOM_PROPERTIES_H */

View file

@ -24,6 +24,7 @@
#include "php_dom.h"
#include "namespace_compat.h"
#include "internal_helpers.h"
#include "dom_properties.h"
/*
* class DOMElement extends DOMNode
@ -113,12 +114,7 @@ Since:
*/
zend_result dom_element_tag_name_read(dom_object *obj, zval *retval)
{
xmlNodePtr nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
bool uppercase = php_dom_follow_spec_intern(obj) && php_dom_ns_is_html_and_document_is_html(nodep);
@ -132,12 +128,7 @@ zend_result dom_element_tag_name_read(dom_object *obj, zval *retval)
static zend_result dom_element_reflected_attribute_read(dom_object *obj, zval *retval, const char *name)
{
xmlNodePtr nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
xmlChar *content = xmlGetNoNsProp(nodep, (const xmlChar *) name);
if (content == NULL) {

View file

@ -22,6 +22,7 @@
#include "php.h"
#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
#include "php_dom.h"
#include "dom_properties.h"
/*
@ -38,12 +39,7 @@ Since:
*/
zend_result dom_entity_public_id_read(dom_object *obj, zval *retval)
{
xmlEntity *nodep = (xmlEntity *) dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlEntityPtr, nodep, obj);
if (nodep->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY || !nodep->ExternalID) {
ZVAL_NULL(retval);
@ -63,12 +59,7 @@ Since:
*/
zend_result dom_entity_system_id_read(dom_object *obj, zval *retval)
{
xmlEntity *nodep = (xmlEntity *) dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlEntityPtr, nodep, obj);
if (nodep->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) {
ZVAL_NULL(retval);
@ -88,12 +79,7 @@ Since:
*/
zend_result dom_entity_notation_name_read(dom_object *obj, zval *retval)
{
xmlEntity *nodep = (xmlEntity *) dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlEntityPtr, nodep, obj);
if (nodep->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) {
ZVAL_NULL(retval);

View file

@ -24,6 +24,7 @@
#include "html5_parser.h"
#include "html5_serializer.h"
#include "namespace_compat.h"
#include "dom_properties.h"
#include <Zend/zend_smart_string.h>
#include <lexbor/html/encoding.h>
#include <lexbor/encoding/encoding.h>
@ -1313,11 +1314,7 @@ PHP_METHOD(DOM_HTMLDocument, saveHTML)
zend_result dom_html_document_encoding_write(dom_object *obj, zval *newval)
{
xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlDocPtr, docp, obj);
/* Typed property, can only be IS_STRING or IS_NULL. */
ZEND_ASSERT(Z_TYPE_P(newval) == IS_STRING || Z_TYPE_P(newval) == IS_NULL);

View file

@ -24,6 +24,7 @@
#include "php_dom.h"
#include "namespace_compat.h"
#include "internal_helpers.h"
#include "dom_properties.h"
/*
* class DOMNode
@ -77,12 +78,7 @@ Since:
*/
zend_result dom_node_node_name_read(dom_object *obj, zval *retval)
{
xmlNode *nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
bool uppercase = false;
@ -143,12 +139,7 @@ Since:
*/
zend_result dom_node_node_value_read(dom_object *obj, zval *retval)
{
xmlNode *nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
/* Access to Element node is implemented as a convenience method */
switch (nodep->type) {
@ -186,15 +177,9 @@ zend_result dom_node_node_value_read(dom_object *obj, zval *retval)
zend_result dom_node_node_value_write(dom_object *obj, zval *newval)
{
xmlNode *nodep = dom_object_get_node(obj);
zend_string *str;
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
str = zval_try_get_string(newval);
zend_string *str = zval_try_get_string(newval);
if (UNEXPECTED(!str)) {
return FAILURE;
}
@ -236,14 +221,7 @@ Since:
*/
zend_result 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, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
/* Specs dictate that they are both type XML_DOCUMENT_TYPE_NODE */
if (nodep->type == XML_DTD_NODE) {
@ -259,12 +237,7 @@ zend_result dom_node_node_type_read(dom_object *obj, zval *retval)
static zend_result dom_node_parent_get(dom_object *obj, zval *retval, bool only_element)
{
xmlNodePtr nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
xmlNodePtr nodeparent = nodep->parent;
if (!nodeparent || (only_element && nodeparent->type != XML_ELEMENT_NODE)) {
@ -307,16 +280,10 @@ Since:
*/
zend_result 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, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
php_dom_create_iterator(retval, DOM_NODELIST, php_dom_follow_spec_intern(obj));
intern = Z_DOMOBJ_P(retval);
dom_object *intern = Z_DOMOBJ_P(retval);
dom_namednode_iter(obj, XML_ELEMENT_NODE, intern, NULL, NULL, 0, NULL, 0);
return SUCCESS;
@ -330,15 +297,9 @@ Since:
*/
zend_result 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, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
xmlNodePtr first = NULL;
if (dom_node_children_valid(nodep)) {
first = nodep->children;
}
@ -361,15 +322,9 @@ Since:
*/
zend_result 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, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
xmlNodePtr last = NULL;
if (dom_node_children_valid(nodep)) {
last = nodep->last;
}
@ -392,16 +347,9 @@ Since:
*/
zend_result dom_node_previous_sibling_read(dom_object *obj, zval *retval)
{
xmlNode *nodep, *prevsib;
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
prevsib = nodep->prev;
xmlNodePtr prevsib = nodep->prev;
if (!prevsib) {
ZVAL_NULL(retval);
return SUCCESS;
@ -420,16 +368,9 @@ Since:
*/
zend_result dom_node_next_sibling_read(dom_object *obj, zval *retval)
{
xmlNode *nodep, *nextsib;
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
nextsib = nodep->next;
xmlNodePtr nextsib = nodep->next;
if (!nextsib) {
ZVAL_NULL(retval);
return SUCCESS;
@ -448,16 +389,9 @@ Since:
*/
zend_result dom_node_previous_element_sibling_read(dom_object *obj, zval *retval)
{
xmlNode *nodep, *prevsib;
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
prevsib = nodep->prev;
xmlNodePtr prevsib = nodep->prev;
while (prevsib && prevsib->type != XML_ELEMENT_NODE) {
prevsib = prevsib->prev;
@ -481,16 +415,9 @@ Since:
*/
zend_result dom_node_next_element_sibling_read(dom_object *obj, zval *retval)
{
xmlNode *nodep, *nextsib;
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
nextsib = nodep->next;
xmlNodePtr nextsib = nodep->next;
while (nextsib != NULL && nextsib->type != XML_ELEMENT_NODE) {
nextsib = nextsib->next;
@ -514,17 +441,11 @@ Since:
*/
zend_result 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, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
if (nodep->type == XML_ELEMENT_NODE) {
php_dom_create_iterator(retval, DOM_NAMEDNODEMAP, php_dom_follow_spec_intern(obj));
intern = Z_DOMOBJ_P(retval);
dom_object *intern = Z_DOMOBJ_P(retval);
dom_namednode_iter(obj, XML_ATTRIBUTE_NODE, intern, NULL, NULL, 0, NULL, 0);
} else {
ZVAL_NULL(retval);
@ -542,13 +463,7 @@ Since:
*/
zend_result dom_node_is_connected_read(dom_object *obj, zval *retval)
{
xmlNode *nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
ZVAL_BOOL(retval, php_dom_is_node_connected(nodep));
return SUCCESS;
}
@ -561,20 +476,14 @@ Since:
*/
zend_result 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, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
ZVAL_NULL(retval);
return SUCCESS;
}
docp = nodep->doc;
xmlDocPtr docp = nodep->doc;
if (!docp) {
return FAILURE;
}
@ -592,20 +501,15 @@ Since: DOM Level 2
*/
zend_result 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, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
const char *str = NULL;
switch (nodep->type) {
case XML_ELEMENT_NODE:
case XML_ATTRIBUTE_NODE:
case XML_NAMESPACE_DECL:
if (nodep->ns != NULL) {
str = (char *) nodep->ns->href;
str = (const char *) nodep->ns->href;
}
break;
default:
@ -632,24 +536,19 @@ Since: DOM Level 2
*/
zend_result 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, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
const char *str = NULL;
switch (nodep->type) {
case XML_ELEMENT_NODE:
case XML_ATTRIBUTE_NODE:
case XML_NAMESPACE_DECL:
ns = nodep->ns;
case XML_NAMESPACE_DECL: {
xmlNsPtr ns = nodep->ns;
if (ns != NULL && ns->prefix) {
str = (char *) ns->prefix;
}
break;
}
default:
str = NULL;
break;
@ -665,12 +564,7 @@ zend_result dom_node_prefix_read(dom_object *obj, zval *retval)
zend_result dom_modern_node_prefix_read(dom_object *obj, zval *retval)
{
xmlNode *nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
xmlNsPtr ns = nodep->ns;
if (ns != NULL && ns->prefix != NULL) {
@ -684,17 +578,12 @@ zend_result dom_modern_node_prefix_read(dom_object *obj, zval *retval)
zend_result dom_node_prefix_write(dom_object *obj, zval *newval)
{
zend_string *prefix_str;
xmlNode *nodep, *nsnode = NULL;
xmlNode *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, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
switch (nodep->type) {
case XML_ELEMENT_NODE:
@ -766,12 +655,7 @@ Since: DOM Level 2
*/
zend_result 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, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
if (nodep->type == XML_ELEMENT_NODE || nodep->type == XML_ATTRIBUTE_NODE || nodep->type == XML_NAMESPACE_DECL) {
ZVAL_STRING(retval, (char *) (nodep->name));
@ -791,15 +675,9 @@ Since: DOM Level 3
*/
zend_result dom_node_base_uri_read(dom_object *obj, zval *retval)
{
xmlNode *nodep = dom_object_get_node(obj);
xmlChar *baseuri;
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
baseuri = xmlNodeGetBase(nodep->doc, nodep);
xmlChar *baseuri = xmlNodeGetBase(nodep->doc, nodep);
if (baseuri) {
ZVAL_STRING(retval, (const char *) baseuri);
xmlFree(baseuri);
@ -842,12 +720,7 @@ static bool dom_skip_text_content(dom_object *obj, xmlNodePtr nodep)
zend_result dom_node_text_content_read(dom_object *obj, zval *retval)
{
xmlNode *nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
if (dom_skip_text_content(obj, nodep)) {
ZVAL_NULL(retval);
@ -860,12 +733,7 @@ zend_result dom_node_text_content_read(dom_object *obj, zval *retval)
zend_result dom_node_text_content_write(dom_object *obj, zval *newval)
{
xmlNode *nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
php_libxml_invalidate_node_list_cache(obj->document);

View file

@ -22,6 +22,7 @@
#include "php.h"
#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
#include "php_dom.h"
#include "dom_properties.h"
/*
* class DOMNotation extends DOMNode
@ -39,12 +40,7 @@ Since:
*/
zend_result dom_notation_public_id_read(dom_object *obj, zval *retval)
{
xmlEntityPtr nodep = (xmlEntityPtr) dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlEntityPtr, nodep, obj);
if (nodep->ExternalID) {
ZVAL_STRING(retval, (char *) (nodep->ExternalID));
@ -64,12 +60,7 @@ Since:
*/
zend_result dom_notation_system_id_read(dom_object *obj, zval *retval)
{
xmlEntityPtr nodep = (xmlEntityPtr) dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlEntityPtr, nodep, obj);
if (nodep->SystemID) {
ZVAL_STRING(retval, (char *) (nodep->SystemID));

View file

@ -25,6 +25,7 @@
#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
#include "php_dom.h"
#include "internal_helpers.h"
#include "dom_properties.h"
/* {{{ firstElementChild DomParentNode
readonly=yes
@ -32,15 +33,9 @@ URL: https://www.w3.org/TR/dom/#dom-parentnode-firstelementchild
*/
zend_result dom_parent_node_first_element_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, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
xmlNodePtr first = NULL;
if (dom_node_children_valid(nodep)) {
first = nodep->children;
@ -65,15 +60,9 @@ URL: https://www.w3.org/TR/dom/#dom-parentnode-lastelementchild
*/
zend_result dom_parent_node_last_element_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, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
xmlNodePtr last = NULL;
if (dom_node_children_valid(nodep)) {
last = nodep->last;
@ -98,18 +87,11 @@ https://www.w3.org/TR/dom/#dom-parentnode-childelementcount
*/
zend_result dom_parent_node_child_element_count(dom_object *obj, zval *retval)
{
xmlNode *nodep, *first = NULL;
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
zend_long count = 0;
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
if (dom_node_children_valid(nodep)) {
first = nodep->children;
xmlNodePtr first = nodep->children;
while (first != NULL) {
if (first->type == XML_ELEMENT_NODE) {

View file

@ -22,6 +22,7 @@
#include "php.h"
#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
#include "php_dom.h"
#include "dom_properties.h"
/*
* class DOMProcessingInstruction extends DOMNode
@ -72,15 +73,8 @@ Since:
*/
zend_result dom_processinginstruction_target_read(dom_object *obj, zval *retval)
{
xmlNodePtr nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
ZVAL_STRING(retval, (char *) (nodep->name));
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
ZVAL_STRING(retval, (const char *) nodep->name);
return SUCCESS;
}
@ -93,26 +87,14 @@ Since:
*/
zend_result dom_processinginstruction_data_read(dom_object *obj, zval *retval)
{
xmlNodePtr nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
php_dom_get_content_into_zval(nodep, retval, false);
return SUCCESS;
}
zend_result dom_processinginstruction_data_write(dom_object *obj, zval *newval)
{
xmlNode *nodep = dom_object_get_node(obj);
if (nodep == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
/* Typed property, this is already a string */
ZEND_ASSERT(Z_TYPE_P(newval) == IS_STRING);

View file

@ -23,6 +23,7 @@
#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
#include "php_dom.h"
#include "dom_ce.h"
#include "dom_properties.h"
/*
* class DOMText extends DOMCharacterData
@ -66,16 +67,10 @@ Since: DOM Level 3
*/
zend_result dom_text_whole_text_read(dom_object *obj, zval *retval)
{
xmlNodePtr node;
DOM_PROP_NODE(xmlNodePtr, node, obj);
xmlChar *wholetext = NULL;
node = dom_object_get_node(obj);
if (node == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, true);
return FAILURE;
}
/* Find starting text node */
while (node->prev && ((node->prev->type == XML_TEXT_NODE) || (node->prev->type == XML_CDATA_SECTION_NODE))) {
node = node->prev;