summaryrefslogtreecommitdiff
path: root/ext/dom/document.c
diff options
context:
space:
mode:
authorStanley Sufficool <ssufficool@php.net>2014-10-20 21:33:32 -0700
committerStanley Sufficool <ssufficool@php.net>2014-10-20 21:33:32 -0700
commit8defcb855ab01d9c8ab4759cb793d80149b55a8c (patch)
treeed51eb30a2cbc92b102557498fb3e4113da1bb07 /ext/dom/document.c
parent9c7dbb0487f5991fde03873ea8f5e66d6688415f (diff)
parentbaddb1c73a170ef1d2c31bd54cddbc6e1ab596b9 (diff)
downloadphp-git-8defcb855ab01d9c8ab4759cb793d80149b55a8c.tar.gz
Merge branch 'master' of https://git.php.net/push/php-src
* 'master' of https://git.php.net/push/php-src: (6215 commits) Extra comma Moved proxy object support in ASSIGN_ADD (and family) from VM to slow paths of corresponding operators Simplification zend_get_property_info_quick() cleanup and optimization initialize lineno before calling compile file file in phar Use ADDREF instead of DUP, it must be enough. Removed old irrelevant comment fixed compilation error Fix bug #68262: Broken reference across cloned objects export functions needed for phpdbg Fixed compilation Optimized property access handlers. Removed EG(std_property_info). Fixed bug #68199 (PDO::pgsqlGetNotify doesn't support NOTIFY payloads) Don't make difference between undefined and unaccessible properies when call __get() and family Don't make useless CSE array_pop/array_shift optimization check for zlib headers as well as lib for mysqlnd a realpath cache key can be int or float, catching this News entry for new curl constants News entry for new curl constants ...
Diffstat (limited to 'ext/dom/document.c')
-rw-r--r--ext/dom/document.c554
1 files changed, 179 insertions, 375 deletions
diff --git a/ext/dom/document.c b/ext/dom/document.c
index efe6d9070f..133572af3f 100644
--- a/ext/dom/document.c
+++ b/ext/dom/document.c
@@ -1,8 +1,8 @@
/*
+----------------------------------------------------------------------+
- | PHP Version 5 |
+ | PHP Version 7 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2013 The PHP Group |
+ | Copyright (c) 1997-2014 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 |
@@ -240,33 +240,24 @@ readonly=yes
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-B63ED1A31
Since:
*/
-int dom_document_doctype_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_doctype_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- xmlDoc *docp;
+ xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
xmlDtdPtr dtdptr;
- int ret;
-
- docp = (xmlDocPtr) dom_object_get_node(obj);
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
return FAILURE;
}
- ALLOC_ZVAL(*retval);
-
dtdptr = xmlGetIntSubset(docp);
if (!dtdptr) {
- ZVAL_NULL(*retval);
+ ZVAL_NULL(retval);
return SUCCESS;
}
- if (NULL == (*retval = php_dom_create_object((xmlNodePtr) dtdptr, &ret, *retval, obj TSRMLS_CC))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
- return FAILURE;
- }
+ php_dom_create_object((xmlNodePtr) dtdptr, retval, obj TSRMLS_CC);
return SUCCESS;
-
}
/* }}} */
@@ -276,9 +267,8 @@ readonly=yes
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1B793EBA
Since:
*/
-int dom_document_implementation_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_implementation_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- ALLOC_ZVAL(*retval);
php_dom_create_implementation(retval TSRMLS_CC);
return SUCCESS;
}
@@ -290,31 +280,23 @@ readonly=yes
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-87CD092
Since:
*/
-int dom_document_document_element_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_document_element_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- xmlDoc *docp;
+ xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
xmlNode *root;
- int ret;
-
- docp = (xmlDocPtr) dom_object_get_node(obj);
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
return FAILURE;
}
- ALLOC_ZVAL(*retval);
-
root = xmlDocGetRootElement(docp);
if (!root) {
- ZVAL_NULL(*retval);
+ ZVAL_NULL(retval);
return SUCCESS;
}
- if (NULL == (*retval = php_dom_create_object(root, &ret, *retval, obj TSRMLS_CC))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
- return FAILURE;
- }
+ php_dom_create_object(root, retval, obj TSRMLS_CC);
return SUCCESS;
}
@@ -324,25 +306,22 @@ int dom_document_document_element_read(dom_object *obj, zval **retval TSRMLS_DC)
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-encoding
Since: DOM Level 3
*/
-int dom_document_encoding_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_encoding_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- xmlDoc *docp;
+ xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
char *encoding;
- docp = (xmlDocPtr) dom_object_get_node(obj);
-
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
return FAILURE;
}
encoding = (char *) docp->encoding;
- ALLOC_ZVAL(*retval);
if (encoding != NULL) {
- ZVAL_STRING(*retval, encoding, 1);
+ ZVAL_STRING(retval, encoding);
} else {
- ZVAL_NULL(*retval);
+ ZVAL_NULL(retval);
}
return SUCCESS;
@@ -350,25 +329,16 @@ int dom_document_encoding_read(dom_object *obj, zval **retval TSRMLS_DC)
int dom_document_encoding_write(dom_object *obj, zval *newval TSRMLS_DC)
{
- zval value_copy;
- xmlDoc *docp;
+ xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
+ zend_string *str;
xmlCharEncodingHandlerPtr handler;
- docp = (xmlDocPtr) dom_object_get_node(obj);
-
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
return FAILURE;
}
- if (newval->type != IS_STRING) {
- if(Z_REFCOUNT_P(newval) > 1) {
- value_copy = *newval;
- zval_copy_ctor(&value_copy);
- newval = &value_copy;
- }
- convert_to_string(newval);
- }
+ str = zval_get_string(newval);
handler = xmlFindCharEncodingHandler(Z_STRVAL_P(newval));
@@ -377,15 +347,12 @@ int dom_document_encoding_write(dom_object *obj, zval *newval TSRMLS_DC)
if (docp->encoding != NULL) {
xmlFree((xmlChar *)docp->encoding);
}
- docp->encoding = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval));
+ docp->encoding = xmlStrdup((const xmlChar *) str->val);
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Document Encoding");
}
- if (newval == &value_copy) {
- zval_dtor(newval);
- }
-
+ zend_string_release(str);
return SUCCESS;
}
@@ -396,10 +363,9 @@ readonly=no
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-standalone
Since: DOM Level 3
*/
-int dom_document_standalone_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_standalone_read(dom_object *obj, zval *retval TSRMLS_DC)
{
xmlDoc *docp;
- int standalone;
docp = (xmlDocPtr) dom_object_get_node(obj);
@@ -408,47 +374,22 @@ int dom_document_standalone_read(dom_object *obj, zval **retval TSRMLS_DC)
return FAILURE;
}
- ALLOC_ZVAL(*retval);
- standalone = docp->standalone;
- ZVAL_BOOL(*retval, standalone);
-
+ ZVAL_BOOL(retval, docp->standalone);
return SUCCESS;
}
int dom_document_standalone_write(dom_object *obj, zval *newval TSRMLS_DC)
{
- zval value_copy;
- xmlDoc *docp;
+ xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
int standalone;
- docp = (xmlDocPtr) dom_object_get_node(obj);
-
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
return FAILURE;
}
- if(Z_REFCOUNT_P(newval) > 1) {
- value_copy = *newval;
- zval_copy_ctor(&value_copy);
- newval = &value_copy;
- }
- convert_to_long(newval);
-
- standalone = Z_LVAL_P(newval);
- if (standalone > 0) {
- docp->standalone = 1;
- }
- else if (standalone < 0) {
- docp->standalone = -1;
- }
- else {
- docp->standalone = 0;
- }
-
- if (newval == &value_copy) {
- zval_dtor(newval);
- }
+ standalone = zval_get_long(newval);
+ docp->standalone = ZEND_NORMALIZE_BOOL(standalone);
return SUCCESS;
}
@@ -460,25 +401,22 @@ readonly=no
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-version
Since: DOM Level 3
*/
-int dom_document_version_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_version_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- xmlDoc *docp;
+ xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
char *version;
- docp = (xmlDocPtr) dom_object_get_node(obj);
-
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
return FAILURE;
}
version = (char *) docp->version;
- ALLOC_ZVAL(*retval);
if (version != NULL) {
- ZVAL_STRING(*retval, version, 1);
+ ZVAL_STRING(retval, version);
} else {
- ZVAL_NULL(*retval);
+ ZVAL_NULL(retval);
}
return SUCCESS;
@@ -486,10 +424,8 @@ int dom_document_version_read(dom_object *obj, zval **retval TSRMLS_DC)
int dom_document_version_write(dom_object *obj, zval *newval TSRMLS_DC)
{
- zval value_copy;
- xmlDoc *docp;
-
- docp = (xmlDocPtr) dom_object_get_node(obj);
+ xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
+ zend_string *str;
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
@@ -500,21 +436,11 @@ int dom_document_version_write(dom_object *obj, zval *newval TSRMLS_DC)
xmlFree((xmlChar *) docp->version );
}
- if (newval->type != IS_STRING) {
- if(Z_REFCOUNT_P(newval) > 1) {
- value_copy = *newval;
- zval_copy_ctor(&value_copy);
- newval = &value_copy;
- }
- convert_to_string(newval);
- }
-
- docp->version = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval));
+ str = zval_get_string(newval);
- if (newval == &value_copy) {
- zval_dtor(newval);
- }
+ docp->version = xmlStrdup((const xmlChar *) str->val);
+ zend_string_release(str);
return SUCCESS;
}
@@ -525,39 +451,23 @@ readonly=no
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-strictErrorChecking
Since: DOM Level 3
*/
-int dom_document_strict_error_checking_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_strict_error_checking_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- dom_doc_propsptr doc_prop;
-
- ALLOC_ZVAL(*retval);
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- ZVAL_BOOL(*retval, doc_prop->stricterror);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ ZVAL_BOOL(retval, doc_prop->stricterror);
} else {
- ZVAL_FALSE(*retval);
+ ZVAL_FALSE(retval);
}
return SUCCESS;
}
int dom_document_strict_error_checking_write(dom_object *obj, zval *newval TSRMLS_DC)
{
- zval value_copy;
- dom_doc_propsptr doc_prop;
-
- if(Z_REFCOUNT_P(newval) > 1) {
- value_copy = *newval;
- zval_copy_ctor(&value_copy);
- newval = &value_copy;
- }
- convert_to_boolean(newval);
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- doc_prop->stricterror = Z_LVAL_P(newval);
- }
-
- if (newval == &value_copy) {
- zval_dtor(newval);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ doc_prop->stricterror = zend_is_true(newval TSRMLS_CC);
}
return SUCCESS;
@@ -568,39 +478,22 @@ int dom_document_strict_error_checking_write(dom_object *obj, zval *newval TSRML
/* {{{ formatOutput boolean
readonly=no
*/
-int dom_document_format_output_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_format_output_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- dom_doc_propsptr doc_prop;
-
- ALLOC_ZVAL(*retval);
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- ZVAL_BOOL(*retval, doc_prop->formatoutput);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ ZVAL_BOOL(retval, doc_prop->formatoutput);
} else {
- ZVAL_FALSE(*retval);
+ ZVAL_FALSE(retval);
}
return SUCCESS;
}
int dom_document_format_output_write(dom_object *obj, zval *newval TSRMLS_DC)
{
- zval value_copy;
- dom_doc_propsptr doc_prop;
-
- if(Z_REFCOUNT_P(newval) > 1) {
- value_copy = *newval;
- zval_copy_ctor(&value_copy);
- newval = &value_copy;
- }
- convert_to_boolean(newval);
-
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- doc_prop->formatoutput = Z_LVAL_P(newval);
- }
-
- if (newval == &value_copy) {
- zval_dtor(newval);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ doc_prop->formatoutput = zend_is_true(newval TSRMLS_CC);
}
return SUCCESS;
@@ -610,39 +503,22 @@ int dom_document_format_output_write(dom_object *obj, zval *newval TSRMLS_DC)
/* {{{ validateOnParse boolean
readonly=no
*/
-int dom_document_validate_on_parse_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_validate_on_parse_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- dom_doc_propsptr doc_prop;
-
- ALLOC_ZVAL(*retval);
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- ZVAL_BOOL(*retval, doc_prop->validateonparse);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ ZVAL_BOOL(retval, doc_prop->validateonparse);
} else {
- ZVAL_FALSE(*retval);
+ ZVAL_FALSE(retval);
}
return SUCCESS;
}
int dom_document_validate_on_parse_write(dom_object *obj, zval *newval TSRMLS_DC)
{
- zval value_copy;
- dom_doc_propsptr doc_prop;
-
- if(Z_REFCOUNT_P(newval) > 1) {
- value_copy = *newval;
- zval_copy_ctor(&value_copy);
- newval = &value_copy;
- }
- convert_to_boolean(newval);
-
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- doc_prop->validateonparse = Z_LVAL_P(newval);
- }
-
- if (newval == &value_copy) {
- zval_dtor(newval);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ doc_prop->validateonparse = zend_is_true(newval TSRMLS_CC);
}
return SUCCESS;
@@ -652,39 +528,22 @@ int dom_document_validate_on_parse_write(dom_object *obj, zval *newval TSRMLS_DC
/* {{{ resolveExternals boolean
readonly=no
*/
-int dom_document_resolve_externals_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_resolve_externals_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- dom_doc_propsptr doc_prop;
-
- ALLOC_ZVAL(*retval);
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- ZVAL_BOOL(*retval, doc_prop->resolveexternals);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ ZVAL_BOOL(retval, doc_prop->resolveexternals);
} else {
- ZVAL_FALSE(*retval);
+ ZVAL_FALSE(retval);
}
return SUCCESS;
}
int dom_document_resolve_externals_write(dom_object *obj, zval *newval TSRMLS_DC)
{
- zval value_copy;
- dom_doc_propsptr doc_prop;
-
- if(Z_REFCOUNT_P(newval) > 1) {
- value_copy = *newval;
- zval_copy_ctor(&value_copy);
- newval = &value_copy;
- }
- convert_to_boolean(newval);
-
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- doc_prop->resolveexternals = Z_LVAL_P(newval);
- }
-
- if (newval == &value_copy) {
- zval_dtor(newval);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ doc_prop->resolveexternals = zend_is_true(newval TSRMLS_CC);
}
return SUCCESS;
@@ -694,39 +553,22 @@ int dom_document_resolve_externals_write(dom_object *obj, zval *newval TSRMLS_DC
/* {{{ preserveWhiteSpace boolean
readonly=no
*/
-int dom_document_preserve_whitespace_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_preserve_whitespace_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- dom_doc_propsptr doc_prop;
-
- ALLOC_ZVAL(*retval);
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- ZVAL_BOOL(*retval, doc_prop->preservewhitespace);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ ZVAL_BOOL(retval, doc_prop->preservewhitespace);
} else {
- ZVAL_FALSE(*retval);
+ ZVAL_FALSE(retval);
}
return SUCCESS;
}
int dom_document_preserve_whitespace_write(dom_object *obj, zval *newval TSRMLS_DC)
{
- zval value_copy;
- dom_doc_propsptr doc_prop;
-
- if(Z_REFCOUNT_P(newval) > 1) {
- value_copy = *newval;
- zval_copy_ctor(&value_copy);
- newval = &value_copy;
- }
- convert_to_boolean(newval);
-
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- doc_prop->preservewhitespace = Z_LVAL_P(newval);
- }
-
- if (newval == &value_copy) {
- zval_dtor(newval);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ doc_prop->preservewhitespace = zend_is_true(newval TSRMLS_CC);
}
return SUCCESS;
@@ -736,39 +578,22 @@ int dom_document_preserve_whitespace_write(dom_object *obj, zval *newval TSRMLS_
/* {{{ recover boolean
readonly=no
*/
-int dom_document_recover_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_recover_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- dom_doc_propsptr doc_prop;
-
- ALLOC_ZVAL(*retval);
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- ZVAL_BOOL(*retval, doc_prop->recover);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ ZVAL_BOOL(retval, doc_prop->recover);
} else {
- ZVAL_FALSE(*retval);
+ ZVAL_FALSE(retval);
}
return SUCCESS;
}
int dom_document_recover_write(dom_object *obj, zval *newval TSRMLS_DC)
{
- zval value_copy;
- dom_doc_propsptr doc_prop;
-
- if(Z_REFCOUNT_P(newval) > 1) {
- value_copy = *newval;
- zval_copy_ctor(&value_copy);
- newval = &value_copy;
- }
- convert_to_boolean(newval);
-
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- doc_prop->recover = Z_LVAL_P(newval);
- }
-
- if (newval == &value_copy) {
- zval_dtor(newval);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ doc_prop->recover = zend_is_true(newval TSRMLS_CC);
}
return SUCCESS;
@@ -778,39 +603,22 @@ int dom_document_recover_write(dom_object *obj, zval *newval TSRMLS_DC)
/* {{{ substituteEntities boolean
readonly=no
*/
-int dom_document_substitue_entities_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_substitue_entities_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- dom_doc_propsptr doc_prop;
-
- ALLOC_ZVAL(*retval);
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- ZVAL_BOOL(*retval, doc_prop->substituteentities);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ ZVAL_BOOL(retval, doc_prop->substituteentities);
} else {
- ZVAL_FALSE(*retval);
+ ZVAL_FALSE(retval);
}
return SUCCESS;
}
int dom_document_substitue_entities_write(dom_object *obj, zval *newval TSRMLS_DC)
{
- zval value_copy;
- dom_doc_propsptr doc_prop;
-
- if(Z_REFCOUNT_P(newval) > 1) {
- value_copy = *newval;
- zval_copy_ctor(&value_copy);
- newval = &value_copy;
- }
- convert_to_boolean(newval);
-
if (obj->document) {
- doc_prop = dom_get_doc_props(obj->document);
- doc_prop->substituteentities = Z_LVAL_P(newval);
- }
-
- if (newval == &value_copy) {
- zval_dtor(newval);
+ dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
+ doc_prop->substituteentities = zend_is_true(newval TSRMLS_CC);
}
return SUCCESS;
@@ -822,24 +630,21 @@ readonly=no
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-documentURI
Since: DOM Level 3
*/
-int dom_document_document_uri_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_document_uri_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- xmlDoc *docp;
+ xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
char *url;
- docp = (xmlDocPtr) dom_object_get_node(obj);
-
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
return FAILURE;
}
- ALLOC_ZVAL(*retval);
url = (char *) docp->URL;
if (url != NULL) {
- ZVAL_STRING(*retval, url, 1);
+ ZVAL_STRING(retval, url);
} else {
- ZVAL_NULL(*retval);
+ ZVAL_NULL(retval);
}
return SUCCESS;
@@ -847,10 +652,8 @@ int dom_document_document_uri_read(dom_object *obj, zval **retval TSRMLS_DC)
int dom_document_document_uri_write(dom_object *obj, zval *newval TSRMLS_DC)
{
- zval value_copy;
- xmlDoc *docp;
-
- docp = (xmlDocPtr) dom_object_get_node(obj);
+ xmlDoc *docp = (xmlDocPtr) dom_object_get_node(obj);
+ zend_string *str;
if (docp == NULL) {
php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
@@ -861,21 +664,11 @@ int dom_document_document_uri_write(dom_object *obj, zval *newval TSRMLS_DC)
xmlFree((xmlChar *) docp->URL);
}
- if (newval->type != IS_STRING) {
- if(Z_REFCOUNT_P(newval) > 1) {
- value_copy = *newval;
- zval_copy_ctor(&value_copy);
- newval = &value_copy;
- }
- convert_to_string(newval);
- }
+ str = zval_get_string(newval);
- docp->URL = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval));
-
- if (newval == &value_copy) {
- zval_dtor(newval);
- }
+ docp->URL = xmlStrdup((const xmlChar *) str->val);
+ zend_string_release(str);
return SUCCESS;
}
@@ -886,10 +679,9 @@ readonly=yes
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-config
Since: DOM Level 3
*/
-int dom_document_config_read(dom_object *obj, zval **retval TSRMLS_DC)
+int dom_document_config_read(dom_object *obj, zval *retval TSRMLS_DC)
{
- ALLOC_ZVAL(*retval);
- ZVAL_NULL(*retval);
+ ZVAL_NULL(retval);
return SUCCESS;
}
@@ -905,7 +697,8 @@ PHP_FUNCTION(dom_document_create_element)
xmlNode *node;
xmlDocPtr docp;
dom_object *intern;
- int ret, name_len, value_len;
+ int ret;
+ size_t name_len, value_len;
char *name, *value = NULL;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|s", &id, dom_document_class_entry, &name, &name_len, &value, &value_len) == FAILURE) {
@@ -919,7 +712,7 @@ PHP_FUNCTION(dom_document_create_element)
RETURN_FALSE;
}
- node = xmlNewDocNode(docp, NULL, name, value);
+ node = xmlNewDocNode(docp, NULL, (xmlChar *) name, (xmlChar *) value);
if (!node) {
RETURN_FALSE;
}
@@ -964,7 +757,8 @@ PHP_FUNCTION(dom_document_create_text_node)
zval *id;
xmlNode *node;
xmlDocPtr docp;
- int ret, value_len;
+ int ret;
+ size_t value_len;
dom_object *intern;
char *value;
@@ -992,7 +786,8 @@ PHP_FUNCTION(dom_document_create_comment)
zval *id;
xmlNode *node;
xmlDocPtr docp;
- int ret, value_len;
+ int ret;
+ size_t value_len;
dom_object *intern;
char *value;
@@ -1020,7 +815,8 @@ PHP_FUNCTION(dom_document_create_cdatasection)
zval *id;
xmlNode *node;
xmlDocPtr docp;
- int ret, value_len;
+ int ret;
+ size_t value_len;
dom_object *intern;
char *value;
@@ -1048,7 +844,8 @@ PHP_FUNCTION(dom_document_create_processing_instruction)
zval *id;
xmlNode *node;
xmlDocPtr docp;
- int ret, value_len, name_len = 0;
+ int ret;
+ size_t value_len, name_len = 0;
dom_object *intern;
char *name, *value = NULL;
@@ -1083,7 +880,8 @@ PHP_FUNCTION(dom_document_create_attribute)
zval *id;
xmlAttrPtr node;
xmlDocPtr docp;
- int ret, name_len;
+ int ret;
+ size_t name_len;
dom_object *intern;
char *name;
@@ -1118,7 +916,8 @@ PHP_FUNCTION(dom_document_create_entity_reference)
xmlNode *node;
xmlDocPtr docp = NULL;
dom_object *intern;
- int ret, name_len;
+ int ret;
+ size_t name_len;
char *name;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_document_class_entry, &name, &name_len) == FAILURE) {
@@ -1132,7 +931,7 @@ PHP_FUNCTION(dom_document_create_entity_reference)
RETURN_FALSE;
}
- node = xmlNewReference(docp, name);
+ node = xmlNewReference(docp, (xmlChar *) name);
if (!node) {
RETURN_FALSE;
}
@@ -1149,7 +948,7 @@ PHP_FUNCTION(dom_document_get_elements_by_tag_name)
{
zval *id;
xmlDocPtr docp;
- int name_len;
+ size_t name_len;
dom_object *intern, *namednode;
char *name;
xmlChar *local;
@@ -1161,7 +960,7 @@ PHP_FUNCTION(dom_document_get_elements_by_tag_name)
DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
php_dom_create_interator(return_value, DOM_NODELIST TSRMLS_CC);
- namednode = (dom_object *)zend_objects_get_address(return_value TSRMLS_CC);
+ namednode = Z_DOMOBJ_P(return_value);
local = xmlCharStrndup(name, name_len);
dom_namednode_iter(intern, 0, namednode, NULL, local, NULL TSRMLS_CC);
}
@@ -1178,7 +977,7 @@ PHP_FUNCTION(dom_document_import_node)
xmlNodePtr nodep, retnodep;
dom_object *intern, *nodeobj;
int ret;
- long recursive = 0;
+ zend_long recursive = 0;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO|l", &id, dom_document_class_entry, &node, dom_node_class_entry, &recursive) == FAILURE) {
return;
@@ -1232,7 +1031,8 @@ PHP_FUNCTION(dom_document_create_element_ns)
xmlDocPtr docp;
xmlNodePtr nodep = NULL;
xmlNsPtr nsptr = NULL;
- int ret, uri_len = 0, name_len = 0, value_len = 0;
+ int ret;
+ size_t uri_len = 0, name_len = 0, value_len = 0;
char *uri, *name, *value = NULL;
char *localname = NULL, *prefix = NULL;
int errorcode;
@@ -1248,9 +1048,9 @@ PHP_FUNCTION(dom_document_create_element_ns)
if (errorcode == 0) {
if (xmlValidateName((xmlChar *) localname, 0) == 0) {
- nodep = xmlNewDocNode (docp, NULL, localname, value);
+ nodep = xmlNewDocNode(docp, NULL, (xmlChar *) localname, (xmlChar *) value);
if (nodep != NULL && uri != NULL) {
- nsptr = xmlSearchNsByHref (nodep->doc, nodep, uri);
+ nsptr = xmlSearchNsByHref(nodep->doc, nodep, (xmlChar *) uri);
if (nsptr == NULL) {
nsptr = dom_get_ns(nodep, uri, &errorcode, prefix);
}
@@ -1295,7 +1095,8 @@ PHP_FUNCTION(dom_document_create_attribute_ns)
xmlDocPtr docp;
xmlNodePtr nodep = NULL, root;
xmlNsPtr nsptr;
- int ret, uri_len = 0, name_len = 0;
+ int ret;
+ size_t uri_len = 0, name_len = 0;
char *uri, *name;
char *localname = NULL, *prefix = NULL;
dom_object *intern;
@@ -1312,9 +1113,9 @@ PHP_FUNCTION(dom_document_create_attribute_ns)
errorcode = dom_check_qname(name, &localname, &prefix, uri_len, name_len);
if (errorcode == 0) {
if (xmlValidateName((xmlChar *) localname, 0) == 0) {
- nodep = (xmlNodePtr) xmlNewDocProp(docp, localname, NULL);
+ nodep = (xmlNodePtr) xmlNewDocProp(docp, (xmlChar *) localname, NULL);
if (nodep != NULL && uri_len > 0) {
- nsptr = xmlSearchNsByHref (nodep->doc, root, uri);
+ nsptr = xmlSearchNsByHref(nodep->doc, root, (xmlChar *) uri);
if (nsptr == NULL) {
nsptr = dom_get_ns(root, uri, &errorcode, prefix);
}
@@ -1358,7 +1159,7 @@ PHP_FUNCTION(dom_document_get_elements_by_tag_name_ns)
{
zval *id;
xmlDocPtr docp;
- int uri_len, name_len;
+ size_t uri_len, name_len;
dom_object *intern, *namednode;
char *uri, *name;
xmlChar *local, *nsuri;
@@ -1370,7 +1171,7 @@ PHP_FUNCTION(dom_document_get_elements_by_tag_name_ns)
DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
php_dom_create_interator(return_value, DOM_NODELIST TSRMLS_CC);
- namednode = (dom_object *)zend_objects_get_address(return_value TSRMLS_CC);
+ namednode = Z_DOMOBJ_P(return_value);
local = xmlCharStrndup(name, name_len);
nsuri = xmlCharStrndup(uri, uri_len);
dom_namednode_iter(intern, 0, namednode, NULL, local, nsuri TSRMLS_CC);
@@ -1386,7 +1187,8 @@ PHP_FUNCTION(dom_document_get_element_by_id)
zval *id;
xmlDocPtr docp;
xmlAttrPtr attrp;
- int ret, idname_len;
+ int ret;
+ size_t idname_len;
dom_object *intern;
char *idname;
@@ -1455,7 +1257,8 @@ PHP_METHOD(domdocument, __construct)
xmlDoc *docp = NULL, *olddoc;
dom_object *intern;
char *encoding, *version = NULL;
- int encoding_len = 0, version_len = 0, refcount;
+ size_t encoding_len = 0, version_len = 0;
+ int refcount;
zend_error_handling error_handling;
zend_replace_error_handling(EH_THROW, dom_domexception_class_entry, &error_handling TSRMLS_CC);
@@ -1465,7 +1268,7 @@ PHP_METHOD(domdocument, __construct)
}
zend_restore_error_handling(&error_handling TSRMLS_CC);
- docp = xmlNewDoc(version);
+ docp = xmlNewDoc((xmlChar *) version);
if (!docp) {
php_dom_throw_error(INVALID_STATE_ERR, 1 TSRMLS_CC);
@@ -1473,10 +1276,10 @@ PHP_METHOD(domdocument, __construct)
}
if (encoding_len > 0) {
- docp->encoding = (const xmlChar*)xmlStrdup(encoding);
+ docp->encoding = (const xmlChar *) xmlStrdup((xmlChar *) encoding);
}
- intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+ intern = Z_DOMOBJ_P(id);
if (intern != NULL) {
olddoc = (xmlDocPtr) dom_object_get_node(intern);
if (olddoc != NULL) {
@@ -1503,12 +1306,18 @@ char *_dom_get_valid_file_path(char *source, char *resolved_path, int resolved_p
int isFileUri = 0;
uri = xmlCreateURI();
- escsource = xmlURIEscapeStr(source, ":");
- xmlParseURIReference(uri, escsource);
+ escsource = xmlURIEscapeStr((xmlChar *) source, (xmlChar *) ":");
+ xmlParseURIReference(uri, (char *) escsource);
xmlFree(escsource);
if (uri->scheme != NULL) {
/* absolute file uris - libxml only supports localhost or empty host */
+#ifdef PHP_WIN32
+ if (strncasecmp(source, "file://",7) == 0 && ':' == source[8]) {
+ isFileUri = 1;
+ source += 7;
+ } else
+#endif
if (strncasecmp(source, "file:///",8) == 0) {
isFileUri = 1;
#ifdef PHP_WIN32
@@ -1543,7 +1352,7 @@ char *_dom_get_valid_file_path(char *source, char *resolved_path, int resolved_p
}
/* }}} */
-static xmlDocPtr dom_document_parser(zval *id, int mode, char *source, int source_len, int options TSRMLS_DC) /* {{{ */
+static xmlDocPtr dom_document_parser(zval *id, int mode, char *source, size_t source_len, size_t options TSRMLS_DC) /* {{{ */
{
xmlDocPtr ret;
xmlParserCtxtPtr ctxt = NULL;
@@ -1556,7 +1365,7 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source, int sourc
char *directory=NULL, resolved_path[MAXPATHLEN];
if (id != NULL) {
- intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+ intern = Z_DOMOBJ_P(id);
document = intern->document;
}
@@ -1645,7 +1454,7 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source, int sourc
}
/* If loading from memory, set the base reference uri for the document */
if (ret && ret->URL == NULL && ctxt->directory != NULL) {
- ret->URL = xmlStrdup(ctxt->directory);
+ ret->URL = xmlStrdup((xmlChar *) ctxt->directory);
}
} else {
ret = NULL;
@@ -1666,8 +1475,9 @@ static void dom_parse_document(INTERNAL_FUNCTION_PARAMETERS, int mode) {
dom_doc_propsptr doc_prop;
dom_object *intern;
char *source;
- int source_len, refcount, ret;
- long options = 0;
+ size_t source_len;
+ int refcount, ret;
+ zend_long options = 0;
id = getThis();
if (id != NULL && ! instanceof_function(Z_OBJCE_P(id), dom_document_class_entry TSRMLS_CC)) {
@@ -1689,7 +1499,7 @@ static void dom_parse_document(INTERNAL_FUNCTION_PARAMETERS, int mode) {
RETURN_FALSE;
if (id != NULL) {
- intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+ intern = Z_DOMOBJ_P(id);
if (intern != NULL) {
docp = (xmlDocPtr) dom_object_get_node(intern);
doc_prop = NULL;
@@ -1745,11 +1555,12 @@ PHP_FUNCTION(dom_document_save)
{
zval *id;
xmlDoc *docp;
- int file_len = 0, bytes, format, saveempty = 0;
+ size_t file_len = 0;
+ int bytes, format, saveempty = 0;
dom_object *intern;
dom_doc_propsptr doc_props;
char *file;
- long options = 0;
+ zend_long options = 0;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|l", &id, dom_document_class_entry, &file, &file_len, &options) == FAILURE) {
return;
@@ -1795,7 +1606,7 @@ PHP_FUNCTION(dom_document_savexml)
dom_object *intern, *nodeobj;
dom_doc_propsptr doc_props;
int size, format, saveempty = 0;
- long options = 0;
+ zend_long options = 0;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|O!l", &id, dom_document_class_entry, &nodep, dom_node_class_entry, &options) == FAILURE) {
return;
@@ -1831,7 +1642,7 @@ PHP_FUNCTION(dom_document_savexml)
xmlBufferFree(buf);
RETURN_FALSE;
}
- RETVAL_STRING(mem, 1);
+ RETVAL_STRING((char *) mem);
xmlBufferFree(buf);
} else {
if (options & LIBXML_SAVE_NOEMPTYTAG) {
@@ -1846,7 +1657,7 @@ PHP_FUNCTION(dom_document_savexml)
if (!size) {
RETURN_FALSE;
}
- RETVAL_STRINGL(mem, size, 1);
+ RETVAL_STRINGL((char *) mem, size);
xmlFree(mem);
}
}
@@ -1900,7 +1711,7 @@ PHP_FUNCTION(dom_document_xinclude)
zval *id;
xmlDoc *docp;
xmlNodePtr root;
- long flags = 0;
+ zend_long flags = 0;
int err;
dom_object *intern;
@@ -1973,8 +1784,9 @@ static void _dom_document_schema_validate(INTERNAL_FUNCTION_PARAMETERS, int type
xmlDoc *docp;
dom_object *intern;
char *source = NULL, *valid_file = NULL;
- int source_len = 0, valid_opts = 0;
- long flags = 0;
+ size_t source_len = 0;
+ int valid_opts = 0;
+ zend_long flags = 0;
xmlSchemaParserCtxtPtr parser;
xmlSchemaPtr sptr;
xmlSchemaValidCtxtPtr vptr;
@@ -2070,7 +1882,7 @@ static void _dom_document_relaxNG_validate(INTERNAL_FUNCTION_PARAMETERS, int typ
xmlDoc *docp;
dom_object *intern;
char *source = NULL, *valid_file = NULL;
- int source_len = 0;
+ size_t source_len = 0;
xmlRelaxNGParserCtxtPtr parser;
xmlRelaxNGPtr sptr;
xmlRelaxNGValidCtxtPtr vptr;
@@ -2164,8 +1976,9 @@ static void dom_load_html(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */
dom_object *intern;
dom_doc_propsptr doc_prop;
char *source;
- int source_len, refcount, ret;
- long options = 0;
+ size_t source_len;
+ int refcount, ret;
+ zend_long options = 0;
htmlParserCtxtPtr ctxt;
id = getThis();
@@ -2182,7 +1995,7 @@ static void dom_load_html(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */
if (mode == DOM_LOAD_FILE) {
ctxt = htmlCreateFileParserCtxt(source, NULL);
} else {
- source_len = xmlStrlen(source);
+ source_len = xmlStrlen((xmlChar *) source);
ctxt = htmlCreateMemoryParserCtxt(source, source_len);
}
@@ -2208,7 +2021,7 @@ static void dom_load_html(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */
RETURN_FALSE;
if (id != NULL && instanceof_function(Z_OBJCE_P(id), dom_document_class_entry TSRMLS_CC)) {
- intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+ intern = Z_DOMOBJ_P(id);
if (intern != NULL) {
docp = (xmlDocPtr) dom_object_get_node(intern);
doc_prop = NULL;
@@ -2262,7 +2075,8 @@ PHP_FUNCTION(dom_document_save_html_file)
{
zval *id;
xmlDoc *docp;
- int file_len, bytes, format;
+ size_t file_len;
+ int bytes, format;
dom_object *intern;
dom_doc_propsptr doc_props;
char *file;
@@ -2304,7 +2118,7 @@ PHP_FUNCTION(dom_document_save_html)
xmlBufferPtr buf;
dom_object *intern, *nodeobj;
xmlChar *mem = NULL;
- int size, format;
+ int size = 0, format;
dom_doc_propsptr doc_props;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
@@ -2332,13 +2146,28 @@ PHP_FUNCTION(dom_document_save_html)
RETURN_FALSE;
}
- size = htmlNodeDump(buf, docp, node);
+ if (node->type == XML_DOCUMENT_FRAG_NODE) {
+ int one_size;
+
+ for (node = node->children; node; node = node->next) {
+ one_size = htmlNodeDump(buf, docp, node);
+
+ if (one_size >= 0) {
+ size += one_size;
+ } else {
+ size = -1;
+ break;
+ }
+ }
+ } else {
+ size = htmlNodeDump(buf, docp, node);
+ }
if (size >= 0) {
mem = (xmlChar*) xmlBufferContent(buf);
if (!mem) {
RETVAL_FALSE;
} else {
- RETVAL_STRINGL((const char*) mem, size, 1);
+ RETVAL_STRINGL((const char*) mem, size);
}
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error dumping HTML node");
@@ -2354,7 +2183,7 @@ PHP_FUNCTION(dom_document_save_html)
if (!size) {
RETVAL_FALSE;
} else {
- RETVAL_STRINGL((const char*) mem, size, 1);
+ RETVAL_STRINGL((const char*) mem, size);
}
if (mem)
xmlFree(mem);
@@ -2371,47 +2200,22 @@ PHP_METHOD(domdocument, registerNodeClass)
{
zval *id;
xmlDoc *docp;
- char *baseclass = NULL, *extendedclass = NULL;
- int baseclass_len = 0, extendedclass_len = 0;
- zend_class_entry *basece = NULL, *ce = NULL;
+ zend_class_entry *basece = dom_node_class_entry, *ce = NULL;
dom_object *intern;
- if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oss!", &id, dom_document_class_entry, &baseclass, &baseclass_len, &extendedclass, &extendedclass_len) == FAILURE) {
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OCC!", &id, dom_document_class_entry, &basece, &ce) == FAILURE) {
return;
}
- if (baseclass_len) {
- zend_class_entry **pce;
- if (zend_lookup_class(baseclass, baseclass_len, &pce TSRMLS_CC) == FAILURE) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s does not exist", baseclass);
- return;
- }
- basece = *pce;
- }
-
- if (basece == NULL || ! instanceof_function(basece, dom_node_class_entry TSRMLS_CC)) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s is not derived from DOMNode.", baseclass);
- return;
- }
-
- if (extendedclass_len) {
- zend_class_entry **pce;
- if (zend_lookup_class(extendedclass, extendedclass_len, &pce TSRMLS_CC) == FAILURE) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s does not exist", extendedclass);
- }
- ce = *pce;
- }
-
if (ce == NULL || instanceof_function(ce, basece TSRMLS_CC)) {
-
DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
if (dom_set_doc_classmap(intern->document, basece, ce TSRMLS_CC) == FAILURE) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s could not be registered.", extendedclass);
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s could not be registered.", ce->name->val);
}
RETURN_TRUE;
} else {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s is not derived from %s.", extendedclass, baseclass);
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s is not derived from %s.", ce->name->val, basece->name->val);
}
RETURN_FALSE;