summaryrefslogtreecommitdiff
path: root/ext/dom/php_dom.c
diff options
context:
space:
mode:
authorRob Richards <rrichards@php.net>2003-10-26 15:57:02 +0000
committerRob Richards <rrichards@php.net>2003-10-26 15:57:02 +0000
commit207dc90924f69b662efedd83a95970fda4685cb0 (patch)
treefbc237f51941ffa0835ce068f3a02a653a27372d /ext/dom/php_dom.c
parentd29fb55bbb6c33aa10861f312176c07dafe61046 (diff)
downloadphp-git-207dc90924f69b662efedd83a95970fda4685cb0.tar.gz
add interop with simplexml - dom_import_simplexml
fix cloneNode with elements
Diffstat (limited to 'ext/dom/php_dom.c')
-rw-r--r--ext/dom/php_dom.c311
1 files changed, 50 insertions, 261 deletions
diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c
index 159cb804c0..04409f294f 100644
--- a/ext/dom/php_dom.c
+++ b/ext/dom/php_dom.c
@@ -32,7 +32,6 @@
#include "dom_properties.h"
#include "ext/standard/info.h"
-#include "ext/libxml/php_libxml.h"
#define PHP_XPATH 1
#define PHP_XPTR 2
@@ -71,10 +70,6 @@ typedef struct _dom_prop_handler {
dom_write_t write_func;
} dom_prop_handler;
-static zend_function_entry dom_functions[] = {
- {NULL, NULL, NULL}
-};
-
/* {{{ int dom_node_is_read_only(xmlNodePtr node) */
int dom_node_is_read_only(xmlNodePtr node) {
switch (node->type) {
@@ -117,7 +112,7 @@ int dom_node_children_valid(xmlNodePtr node) {
/* }}} end dom_node_children_valid */
/* {{{ dom_get_doc_props() */
-dom_doc_propsptr dom_get_doc_props(dom_ref_obj *document)
+dom_doc_propsptr dom_get_doc_props(php_libxml_ref_obj *document)
{
dom_doc_props *doc_props;
@@ -140,7 +135,7 @@ dom_doc_propsptr dom_get_doc_props(dom_ref_obj *document)
/* }}} */
/* {{{ dom_get_strict_error() */
-int dom_get_strict_error(dom_ref_obj *document) {
+int dom_get_strict_error(php_libxml_ref_obj *document) {
int stricterror;
dom_doc_props *doc_props;
@@ -154,151 +149,28 @@ int dom_get_strict_error(dom_ref_obj *document) {
}
/* }}} */
-/* {{{ increment_document_reference() */
-int increment_document_reference(dom_object *object, xmlDocPtr docp TSRMLS_DC) {
- int ret_refcount = -1;
-
- if (object->document != NULL) {
- object->document->refcount++;
- ret_refcount = object->document->refcount;
- } else if (docp != NULL) {
- ret_refcount = 1;
- object->document = emalloc(sizeof(dom_ref_obj));
- object->document->ptr = docp;
- object->document->refcount = ret_refcount;
- object->document->doc_props = NULL;
- }
-
- return ret_refcount;
-}
-/* }}} end increment_document_reference */
-
-/* {{{ int decrement_document_reference(dom_object *object) */
-int decrement_document_reference(dom_object *object TSRMLS_DC) {
- int ret_refcount = -1;
-
- if (object != NULL && object->document != NULL) {
- object->document->refcount--;
- ret_refcount = object->document->refcount;
- if (ret_refcount == 0) {
- if (object->document->ptr != NULL) {
- xmlFreeDoc((xmlDoc *) object->document->ptr);
- object->document->ptr = NULL;
- }
- if (object->document->doc_props != NULL) {
- efree(object->document->doc_props);
- }
- efree(object->document);
- }
- object->document = NULL;
- }
-
- return ret_refcount;
-}
-/* }}} end decrement_document_reference */
-
-/* {{{ int decrement_node_ptr(dom_object *object) */
-int decrement_node_ptr(dom_object *object TSRMLS_DC) {
- int ret_refcount = -1;
- node_ptr *obj_node;
-
- if (object != NULL && object->ptr != NULL) {
- obj_node = (node_ptr *) object->ptr;
- ret_refcount = --obj_node->refcount;
- if (ret_refcount == 0) {
- if (obj_node->node != NULL) {
- obj_node->node->_private = NULL;
- }
- efree(object->ptr);
- }
- object->ptr = NULL;
- }
-
- return ret_refcount;
-}
-/* }}} end decrement_node_ptr */
-
/* {{{ xmlNodePtr dom_object_get_node(dom_object *obj) */
xmlNodePtr dom_object_get_node(dom_object *obj)
{
if (obj->ptr != NULL) {
- return ((node_ptr *)obj->ptr)->node;
+ return ((php_libxml_node_ptr *)obj->ptr)->node;
} else {
return NULL;
}
}
/* }}} end dom_object_get_node */
-/* {{{ dom_object_set_data */
-static void dom_object_set_data(xmlNodePtr obj, dom_object *wrapper TSRMLS_DC)
-{
- if (wrapper == NULL) {
- obj->_private = NULL;
- } else {
- obj->_private = wrapper->ptr;
- }
-}
-/* }}} end dom_object_set_data */
-
/* {{{ dom_object *dom_object_get_data(xmlNodePtr obj) */
dom_object *dom_object_get_data(xmlNodePtr obj)
{
if (obj->_private != NULL) {
- return (dom_object *) ((node_ptr *) obj->_private)->_private;
+ return (dom_object *) ((php_libxml_node_ptr *) obj->_private)->_private;
} else {
return NULL;
}
}
/* }}} end dom_object_get_data */
-/* {{{ php_dom_clear_object */
-static int php_dom_clear_object(dom_object *object TSRMLS_DC)
-{
- if (object->prop_handler) {
- object->prop_handler = NULL;
- }
- decrement_node_ptr(object TSRMLS_CC);
- return decrement_document_reference(object TSRMLS_CC);
-}
-/* }}} end php_dom_clear_object */
-
-/* {{{ void php_dom_set_object(dom_object *object, xmlNodePtr obj TSRMLS_DC) */
-void php_dom_set_object(dom_object *object, xmlNodePtr obj TSRMLS_DC)
-{
- node_ptr *obj_node;
-
- if (obj->_private == NULL) {
- object->ptr = emalloc(sizeof(node_ptr));
- obj_node = (node_ptr *)object->ptr;
- obj_node->node = obj;
- obj_node->refcount = 1;
- obj_node->_private = object;
- dom_object_set_data(obj, object TSRMLS_CC);
- } else if (object->ptr == NULL) {
- (node_ptr *)object->ptr = obj->_private;
- obj_node = (node_ptr *)object->ptr;
- obj_node->refcount++;
- if (obj_node->_private == NULL) {
- obj_node->_private = object;
- }
- }
-}
-/* }}} end php_dom_set_object */
-
-/* {{{ dom_unregister_node */
-static int dom_unregister_node(xmlNodePtr nodep TSRMLS_DC)
-{
- dom_object *wrapper;
-
- wrapper = dom_object_get_data(nodep);
- if (wrapper != NULL ) {
- return php_dom_clear_object(wrapper TSRMLS_CC);
- }
-
- return -1;
-}
-/* }}} end dom_unregister_node */
-
/* {{{ dom_read_na */
static int dom_read_na(dom_object *obj, zval **retval TSRMLS_DC)
{
@@ -409,6 +281,41 @@ void dom_write_property(zval *object, zval *member, zval *value TSRMLS_DC)
}
/* }}} */
+/* {{{ proto somNode dom_import_simplexml(sxeobject node)
+ Get a simplexml_element object from dom to allow for processing */
+PHP_FUNCTION(dom_import_simplexml)
+{
+#ifdef HAVE_SIMPLEXML
+ zval *rv = NULL;
+ zval *node;
+ xmlNodePtr nodep;
+ php_libxml_node_object *nodeobj;
+ int ret;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &node) == FAILURE) {
+ return;
+ }
+
+ NODE_GET_OBJ(nodep, node, xmlNodePtr, nodeobj);
+
+ if (nodep->type == XML_ELEMENT_NODE || nodep->type == XML_ATTRIBUTE_NODE) {
+ DOM_RET_OBJ(rv, (xmlNodePtr) nodep, &ret, (dom_object *)nodeobj);
+ } else {
+ php_error(E_WARNING, "Invalid Nodetype to import");
+ RETURN_NULL();
+ }
+#else
+ php_error(E_WARNING, "SimpleXML support is not enabled");
+ return;
+#endif
+}
+/* }}} */
+
+static zend_function_entry dom_functions[] = {
+ PHP_FE(dom_import_simplexml, NULL)
+ {NULL, NULL, NULL}
+};
+
zend_module_entry dom_module_entry = {
STANDARD_MODULE_HEADER,
"dom",
@@ -815,125 +722,6 @@ void node_list_unlink(xmlNodePtr node TSRMLS_DC)
}
/* }}} end node_list_unlink */
-
-/* {{{ void dom_node_free(xmlNodePtr node) */
-void dom_node_free(xmlNodePtr node)
-{
- if(node) {
- if (node->_private != NULL) {
- ((node_ptr *) node->_private)->node = NULL;
- }
- switch (node->type) {
- case XML_ATTRIBUTE_NODE:
- xmlFreeProp((xmlAttrPtr) node);
- break;
- case XML_ENTITY_DECL:
- case XML_ELEMENT_DECL:
- case XML_ATTRIBUTE_DECL:
- break;
- case XML_NOTATION_NODE:
- /* These require special handling */
- if (node->name != NULL) {
- xmlFree((char *) node->name);
- }
- if (((xmlEntityPtr) node)->ExternalID != NULL) {
- xmlFree((char *) ((xmlEntityPtr) node)->ExternalID);
- }
- if (((xmlEntityPtr) node)->SystemID != NULL) {
- xmlFree((char *) ((xmlEntityPtr) node)->SystemID);
- }
- xmlFree(node);
- break;
- case XML_NAMESPACE_DECL:
- if (node->ns) {
- xmlFreeNs(node->ns);
- node->ns = NULL;
- }
- node->type = XML_ELEMENT_NODE;
- default:
- xmlFreeNode(node);
- }
- }
-}
-/* }}} end dom_node_free */
-
-/* {{{ node_free_list */
-void node_free_list(xmlNodePtr node TSRMLS_DC)
-{
- xmlNodePtr curnode;
-
- if (node != NULL) {
- curnode = node;
- while (curnode != NULL) {
- node = curnode;
- switch (node->type) {
- /* Skip property freeing for the following types */
- case XML_NOTATION_NODE:
- break;
- case XML_ENTITY_REF_NODE:
- node_free_list((xmlNodePtr) node->properties TSRMLS_CC);
- break;
- case XML_ATTRIBUTE_DECL:
- case XML_DTD_NODE:
- case XML_DOCUMENT_TYPE_NODE:
- case XML_ENTITY_DECL:
- case XML_ATTRIBUTE_NODE:
- case XML_NAMESPACE_DECL:
- node_free_list(node->children TSRMLS_CC);
- break;
- default:
- node_free_list(node->children TSRMLS_CC);
- node_free_list((xmlNodePtr) node->properties TSRMLS_CC);
- }
-
- curnode = node->next;
- xmlUnlinkNode(node);
- if (dom_unregister_node(node TSRMLS_CC) == 0) {
- node->doc = NULL;
- }
- dom_node_free(node);
- }
- }
-}
-/* }}} end node_free_list */
-
-/* {{{ node_free_resource */
-void node_free_resource(xmlNodePtr node TSRMLS_DC)
-{
- if (!node) {
- return;
- }
-
- switch (node->type) {
- case XML_DOCUMENT_NODE:
- case XML_HTML_DOCUMENT_NODE:
- break;
- default:
- if (node->parent == NULL || node->type == XML_NAMESPACE_DECL) {
- node_free_list((xmlNodePtr) node->children TSRMLS_CC);
- switch (node->type) {
- /* Skip property freeing for the following types */
- case XML_ATTRIBUTE_DECL:
- case XML_DTD_NODE:
- case XML_DOCUMENT_TYPE_NODE:
- case XML_ENTITY_DECL:
- case XML_ATTRIBUTE_NODE:
- case XML_NAMESPACE_DECL:
- break;
- default:
- node_free_list((xmlNodePtr) node->properties TSRMLS_CC);
- }
- if (dom_unregister_node(node TSRMLS_CC) == 0) {
- node->doc = NULL;
- }
- dom_node_free(node);
- } else {
- dom_unregister_node(node TSRMLS_CC);
- }
- }
-}
-/* }}} */
-
/* {{{ dom_objects_clone */
void dom_objects_clone(void *object, void **object_clone TSRMLS_DC)
{
@@ -952,7 +740,7 @@ void dom_xpath_objects_dtor(void *object, zend_object_handle handle TSRMLS_DC)
if (intern->ptr != NULL) {
xmlXPathFreeContext((xmlXPathContextPtr) intern->ptr);
- decrement_document_reference((dom_object *) intern TSRMLS_CC);
+ php_libxml_decrement_doc_ref((php_libxml_node_object *) intern TSRMLS_CC);
intern->ptr = NULL;
}
@@ -970,12 +758,13 @@ void dom_objects_dtor(void *object, zend_object_handle handle TSRMLS_DC)
zend_hash_destroy(intern->std.properties);
FREE_HASHTABLE(intern->std.properties);
- if (intern->ptr != NULL && ((node_ptr *)intern->ptr)->node != NULL) {
- if (((xmlNodePtr) ((node_ptr *)intern->ptr)->node)->type != XML_DOCUMENT_NODE && ((xmlNodePtr) ((node_ptr *)intern->ptr)->node)->type != XML_HTML_DOCUMENT_NODE) {
- node_free_resource(dom_object_get_node(intern) TSRMLS_CC);
+ if (intern->ptr != NULL && ((php_libxml_node_ptr *)intern->ptr)->node != NULL) {
+ if (((xmlNodePtr) ((php_libxml_node_ptr *)intern->ptr)->node)->type != XML_DOCUMENT_NODE && ((xmlNodePtr) ((php_libxml_node_ptr *)intern->ptr)->node)->type != XML_HTML_DOCUMENT_NODE) {
+ // php_libxml_node_free_resource(dom_object_get_node(intern) TSRMLS_CC);
+ php_libxml_node_decrement_resource((php_libxml_node_object *) intern TSRMLS_CC);
} else {
- decrement_node_ptr(intern TSRMLS_CC);
- retcount = decrement_document_reference(intern TSRMLS_CC);
+ php_libxml_decrement_node_ptr((php_libxml_node_object *) intern TSRMLS_CC);
+ retcount = php_libxml_decrement_doc_ref((php_libxml_node_object *)intern TSRMLS_CC);
}
intern->ptr = NULL;
}
@@ -1004,7 +793,7 @@ static dom_object* dom_objects_set_class(zend_class_entry *class_type TSRMLS_DC)
base_class = base_class->parent;
}
- zend_hash_find(&classes, base_class->name , base_class->name_length + 1, (void **) &intern->prop_handler);
+ zend_hash_find(&classes, base_class->name, base_class->name_length + 1, (void **) &intern->prop_handler);
ALLOC_HASHTABLE(intern->std.properties);
zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
@@ -1157,10 +946,10 @@ zval *php_dom_create_object(xmlNodePtr obj, int *found, zval *wrapper_in, zval *
if (domobj != NULL) {
intern->document = domobj->document;
}
- increment_document_reference(intern, obj->doc TSRMLS_CC);
+ php_libxml_increment_doc_ref((php_libxml_node_object *)intern, obj->doc TSRMLS_CC);
}
- php_dom_set_object(intern, (void *) obj TSRMLS_CC);
+ php_libxml_increment_node_ptr((php_libxml_node_object *)intern, obj, (void *)intern TSRMLS_CC);
return (wrapper);
}
/* }}} end php_domobject_new */
@@ -1247,7 +1036,7 @@ void dom_normalize (xmlNodePtr nodep TSRMLS_DC)
xmlNodeAddContent(child, strContent);
xmlFree(strContent);
xmlUnlinkNode(nextp);
- node_free_resource(nextp TSRMLS_CC);
+ php_libxml_node_free_resource(nextp TSRMLS_CC);
nextp = newnextp;
} else {
break;