diff options
author | Stanley Sufficool <ssufficool@php.net> | 2014-10-20 21:33:32 -0700 |
---|---|---|
committer | Stanley Sufficool <ssufficool@php.net> | 2014-10-20 21:33:32 -0700 |
commit | 8defcb855ab01d9c8ab4759cb793d80149b55a8c (patch) | |
tree | ed51eb30a2cbc92b102557498fb3e4113da1bb07 /ext/dom/document.c | |
parent | 9c7dbb0487f5991fde03873ea8f5e66d6688415f (diff) | |
parent | baddb1c73a170ef1d2c31bd54cddbc6e1ab596b9 (diff) | |
download | php-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.c | 554 |
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; |