summaryrefslogtreecommitdiff
path: root/ext/dom/php_dom.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/dom/php_dom.c')
-rw-r--r--ext/dom/php_dom.c62
1 files changed, 54 insertions, 8 deletions
diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c
index 1060018eb..332ce66b2 100644
--- a/ext/dom/php_dom.c
+++ b/ext/dom/php_dom.c
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_dom.c,v 1.73.2.12 2006/05/03 08:43:04 rrichards Exp $ */
+/* $Id: php_dom.c,v 1.73.2.12.2.8 2006/10/04 12:02:49 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -149,12 +149,12 @@ int dom_node_children_valid(xmlNodePtr node) {
/* {{{ dom_get_doc_props() */
dom_doc_propsptr dom_get_doc_props(php_libxml_ref_obj *document)
{
- dom_doc_props *doc_props;
+ dom_doc_propsptr doc_props;
if (document && document->doc_props) {
return document->doc_props;
} else {
- doc_props = emalloc(sizeof(dom_doc_props));
+ doc_props = emalloc(sizeof(libxml_doc_props));
doc_props->formatoutput = 0;
doc_props->validateonparse = 0;
doc_props->resolveexternals = 0;
@@ -162,18 +162,58 @@ dom_doc_propsptr dom_get_doc_props(php_libxml_ref_obj *document)
doc_props->substituteentities = 0;
doc_props->stricterror = 1;
doc_props->recover = 0;
+ doc_props->classmap = NULL;
if (document) {
document->doc_props = doc_props;
}
return doc_props;
}
}
+
+int dom_set_doc_classmap(php_libxml_ref_obj *document, zend_class_entry *basece, zend_class_entry *ce TSRMLS_DC)
+{
+ dom_doc_propsptr doc_props;
+
+ if (document) {
+ doc_props = dom_get_doc_props(document);
+ if (doc_props->classmap == NULL) {
+ if (ce == NULL) {
+ return SUCCESS;
+ }
+ ALLOC_HASHTABLE(doc_props->classmap);
+ zend_hash_init(doc_props->classmap, 0, NULL, NULL, 0);
+ }
+ if (ce) {
+ return zend_hash_add(doc_props->classmap, basece->name, basece->name_length + 1, &ce, sizeof(ce), NULL);
+ } else {
+ return zend_hash_del(doc_props->classmap, basece->name, basece->name_length + 1);
+ }
+ }
+ return SUCCESS;
+}
+
+zend_class_entry *dom_get_doc_classmap(php_libxml_ref_obj *document, zend_class_entry *basece TSRMLS_DC)
+{
+ dom_doc_propsptr doc_props;
+ zend_class_entry **ce = NULL;
+
+ if (document) {
+ doc_props = dom_get_doc_props(document);
+ if (doc_props->classmap) {
+ if (zend_hash_find(doc_props->classmap, basece->name, basece->name_length + 1, (void**) &ce) == SUCCESS) {
+ return *ce;
+ }
+ }
+ }
+
+ return basece;
+}
/* }}} */
/* {{{ dom_get_strict_error() */
int dom_get_strict_error(php_libxml_ref_obj *document) {
int stricterror;
- dom_doc_props *doc_props;
+ dom_doc_propsptr doc_props;
doc_props = dom_get_doc_props(document);
stricterror = doc_props->stricterror;
@@ -188,7 +228,7 @@ int dom_get_strict_error(php_libxml_ref_obj *document) {
/* {{{ xmlNodePtr dom_object_get_node(dom_object *obj) */
PHP_DOM_EXPORT xmlNodePtr dom_object_get_node(dom_object *obj)
{
- if (obj->ptr != NULL) {
+ if (obj && obj->ptr != NULL) {
return ((php_libxml_node_ptr *)obj->ptr)->node;
} else {
return NULL;
@@ -199,7 +239,7 @@ PHP_DOM_EXPORT xmlNodePtr dom_object_get_node(dom_object *obj)
/* {{{ dom_object *php_dom_object_get_data(xmlNodePtr obj) */
PHP_DOM_EXPORT dom_object *php_dom_object_get_data(xmlNodePtr obj)
{
- if (obj->_private != NULL) {
+ if (obj && obj->_private != NULL) {
return (dom_object *) ((php_libxml_node_ptr *) obj->_private)->_private;
} else {
return NULL;
@@ -451,6 +491,7 @@ zend_object_value dom_objects_store_clone_obj(zval *zobject TSRMLS_DC)
return retval;
}
+
zend_object_value dom_objects_ze1_clone_obj(zval *zobject TSRMLS_DC)
{
php_error(E_ERROR, "Cannot clone object of class %s due to 'zend.ze1_compatibility_mode'", Z_OBJCE_P(zobject)->name);
@@ -510,14 +551,14 @@ PHP_MINIT_FUNCTION(dom)
memcpy(&dom_ze1_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
dom_ze1_object_handlers.read_property = dom_read_property;
dom_ze1_object_handlers.write_property = dom_write_property;
- dom_object_handlers.get_property_ptr_ptr = dom_get_property_ptr_ptr;
+ dom_ze1_object_handlers.get_property_ptr_ptr = dom_get_property_ptr_ptr;
dom_ze1_object_handlers.clone_obj = dom_objects_ze1_clone_obj;
dom_ze1_object_handlers.has_property = dom_property_exists;
zend_hash_init(&classes, 0, NULL, NULL, 1);
INIT_CLASS_ENTRY(ce, "DOMException", php_dom_domexception_class_functions);
- dom_domexception_class_entry = zend_register_internal_class_ex(&ce, zend_exception_get_default(), NULL TSRMLS_CC);
+ dom_domexception_class_entry = zend_register_internal_class_ex(&ce, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_CC);
dom_domexception_class_entry->ce_flags |= ZEND_ACC_FINAL;
zend_declare_property_long(dom_domexception_class_entry, "code", sizeof("code")-1, 0, ZEND_ACC_PUBLIC TSRMLS_CC);
@@ -879,6 +920,8 @@ void node_list_unlink(xmlNodePtr node TSRMLS_DC)
if (wrapper != NULL ) {
xmlUnlinkNode(node);
} else {
+ if (node->type == XML_ENTITY_REF_NODE)
+ break;
node_list_unlink(node->children TSRMLS_CC);
switch (node->type) {
@@ -1229,6 +1272,9 @@ PHP_DOM_EXPORT zval *php_dom_create_object(xmlNodePtr obj, int *found, zval *wra
return wrapper;
}
+ if (domobj && domobj->document) {
+ ce = dom_get_doc_classmap(domobj->document, ce TSRMLS_CC);
+ }
object_init_ex(wrapper, ce);
intern = (dom_object *)zend_objects_get_address(wrapper TSRMLS_CC);