rrichards Thu Jun 12 16:02:06 2003 EDT Modified files: /php4/ext/dom php_dom.h php_dom.c node.c domimplementation.c document.c Log: add node->isSupported() add domimplementation->hasFeature() add formatOutput property (extends DOM) call xmlFreeDoc when doc is no longer referenced rather than custom code save and savexml now format based on formatOutput property
Index: php4/ext/dom/php_dom.h diff -u php4/ext/dom/php_dom.h:1.3 php4/ext/dom/php_dom.h:1.4 --- php4/ext/dom/php_dom.h:1.3 Tue Jun 10 16:03:27 2003 +++ php4/ext/dom/php_dom.h Thu Jun 12 16:02:05 2003 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_dom.h,v 1.3 2003/06/10 20:03:27 imajes Exp $ */ +/* $Id: php_dom.h,v 1.4 2003/06/12 20:02:05 rrichards Exp $ */ #ifndef PHP_DOM_H #define PHP_DOM_H @@ -73,6 +73,7 @@ void dom_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *local, zval **retval, dom_object *intern TSRMLS_DC); void php_dom_create_implementation(zval **retval TSRMLS_DC); int dom_hierarchy(xmlNodePtr parent, xmlNodePtr child); +int dom_has_feature(char *feature, char *version); #define DOM_NO_ARGS() \ if (ZEND_NUM_ARGS() != 0) { \ Index: php4/ext/dom/php_dom.c diff -u php4/ext/dom/php_dom.c:1.9 php4/ext/dom/php_dom.c:1.10 --- php4/ext/dom/php_dom.c:1.9 Tue Jun 10 16:03:27 2003 +++ php4/ext/dom/php_dom.c Thu Jun 12 16:02:05 2003 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_dom.c,v 1.9 2003/06/10 20:03:27 imajes Exp $ */ +/* $Id: php_dom.c,v 1.10 2003/06/12 20:02:05 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -102,8 +102,13 @@ object->document->refcount--; ret_refcount = object->document->refcount; if (ret_refcount == 0) { - dom_clean_nodes(object TSRMLS_CC); - node_free_resource(object->document->ptr TSRMLS_CC); + if (object->document->ptr != NULL) { + dom_clean_nodes(object TSRMLS_CC); + /* No references to Doc so can use xmlFreeDoc + node_free_resource(object->document->ptr TSRMLS_CC); */ + xmlFreeDoc((xmlDoc *) object->document->ptr); + object->document->ptr = NULL; + } efree(object->document); object->document = NULL; } @@ -590,7 +595,7 @@ php_info_print_table_start(); php_info_print_table_row(2, "DOM/XML", "enabled"); php_info_print_table_row(2, "DOM/XML API Version", DOM_API_VERSION); - php_info_print_table_row(2, "libxml Version", xmlParserVersion); + php_info_print_table_row(2, "libxml Version", LIBXML_DOTTED_VERSION); #if defined(LIBXML_HTML_ENABLED) php_info_print_table_row(2, "HTML Support", "enabled"); #endif @@ -979,6 +984,10 @@ object_init_ex(wrapper, ce); + /* Add object properties not needing function calls */ + if (obj->type == XML_DOCUMENT_NODE || obj->type == XML_HTML_DOCUMENT_NODE) { + add_property_bool(wrapper, "formatOutput", 0); + } intern = (dom_object *)zend_objects_get_address(wrapper TSRMLS_CC); if (obj->doc != NULL) { if (domobj != NULL) { @@ -1018,6 +1027,20 @@ return SUCCESS; } /* }}} end dom_hierarchy */ + +/* {{{ dom_has_feature(char *feature, char *version) */ +int dom_has_feature(char *feature, char *version) +{ + int retval = 0; + + if (!(strcmp (version, "1.0") && strcmp (version,"2.0") && strcmp(version, ""))) { + if ((!strcasecmp(feature, "Core") && strcmp (version, "1.0")) || !strcasecmp(feature, "XML")) + retval = 1; + } + + return retval; +} +/* }}} end dom_has_feature */ /* {{{ void dom_element_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *local, zval **retval TSRMLS_DC) */ void dom_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *local, zval **retval, dom_object *intern TSRMLS_DC) Index: php4/ext/dom/node.c diff -u php4/ext/dom/node.c:1.4 php4/ext/dom/node.c:1.5 --- php4/ext/dom/node.c:1.4 Tue Jun 10 16:03:27 2003 +++ php4/ext/dom/node.c Thu Jun 12 16:02:05 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: node.c,v 1.4 2003/06/10 20:03:27 imajes Exp $ */ +/* $Id: node.c,v 1.5 2003/06/12 20:02:05 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -1123,12 +1123,23 @@ /* {{{ proto boolean dom_node_is_supported(string feature, string version); -URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-Node-supports +URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Level-2-Core-Node-supports Since: DOM Level 2 */ PHP_FUNCTION(dom_node_is_supported) { - DOM_NOT_IMPLEMENTED(); + int feature_len, version_len; + char *feature, *version; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &feature, &feature_len, &version, &version_len) == FAILURE) { + return; + } + + if (dom_has_feature(feature, version)) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } } /* }}} end dom_node_is_supported */ Index: php4/ext/dom/domimplementation.c diff -u php4/ext/dom/domimplementation.c:1.3 php4/ext/dom/domimplementation.c:1.4 --- php4/ext/dom/domimplementation.c:1.3 Tue Jun 10 16:03:27 2003 +++ php4/ext/dom/domimplementation.c Thu Jun 12 16:02:05 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: domimplementation.c,v 1.3 2003/06/10 20:03:27 imajes Exp $ */ +/* $Id: domimplementation.c,v 1.4 2003/06/12 20:02:05 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -50,7 +50,18 @@ */ PHP_FUNCTION(dom_domimplementation_has_feature) { - DOM_NOT_IMPLEMENTED(); + int feature_len, version_len; + char *feature, *version; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &feature, &feature_len, &version, &version_len) == FAILURE) { + return; + } + + if (dom_has_feature(feature, version)) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } } /* }}} end dom_domimplementation_has_feature */ Index: php4/ext/dom/document.c diff -u php4/ext/dom/document.c:1.5 php4/ext/dom/document.c:1.6 --- php4/ext/dom/document.c:1.5 Tue Jun 10 16:03:27 2003 +++ php4/ext/dom/document.c Thu Jun 12 16:02:05 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: document.c,v 1.5 2003/06/10 20:03:27 imajes Exp $ */ +/* $Id: document.c,v 1.6 2003/06/12 20:02:05 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -75,6 +75,27 @@ }; +int dom_document_get_formatting(zval *id TSRMLS_DC) { + zval *format, *member; + zend_object_handlers *std_hnd; + int retformat = 0; + + MAKE_STD_ZVAL(member); + ZVAL_STRING(member, "formatOutput", 1); + + std_hnd = zend_get_std_object_handlers(); + format = std_hnd->read_property(id, member TSRMLS_CC); + + if (format->type == IS_BOOL) { + retformat = Z_BVAL_P(format); + } + + zval_dtor(member); + FREE_ZVAL(member); + + return retformat; +} + /* {{{ proto doctype documenttype readonly=yes URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-B63ED1A31 @@ -1070,7 +1091,7 @@ { zval *id; xmlDoc *docp; - int file_len, bytes; + int file_len, bytes, format; dom_object *intern; char *file; @@ -1084,7 +1105,9 @@ RETURN_FALSE; } - bytes = xmlSaveFile(file, docp); + /* encoding handled by property on doc */ + format = dom_document_get_formatting(id TSRMLS_CC); + bytes = xmlSaveFormatFileEnc(file, docp, NULL, format); if (bytes == -1) { RETURN_FALSE; @@ -1105,7 +1128,7 @@ xmlBufferPtr buf; xmlChar *mem; dom_object *intern, *nodeobj; - int size; + int size, format; DOM_GET_THIS_OBJ(docp, id, xmlDocPtr, intern); @@ -1113,6 +1136,8 @@ return; } + format = dom_document_get_formatting(id TSRMLS_CC); + if (nodep != NULL) { /* Dump contents of Node */ DOM_GET_OBJ(node, nodep, xmlNodePtr, nodeobj); @@ -1126,7 +1151,8 @@ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not fetch buffer"); RETURN_FALSE; } - xmlNodeDump(buf, docp, node, 0, 0); + + xmlNodeDump(buf, docp, node, 0, format); mem = (xmlChar*) xmlBufferContent(buf); if (!mem) { xmlBufferFree(buf); @@ -1135,9 +1161,8 @@ RETVAL_STRING(mem, 1); xmlBufferFree(buf); } else { - /* Dump Document Contents - Encoding is handled from the encoding property set on the document */ - xmlDocDumpMemory(docp, &mem, &size); + /* Encoding is handled from the encoding property set on the document */ + xmlDocDumpFormatMemory(docp, &mem, &size, format); if (!size) { RETURN_FALSE; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php