Commit 685bd9de813 for php.net
commit 685bd9de813a588e0536a7934cad915b2eeeb77f
Merge: c343ede18de 26b9395ad6b
Author: Ilija Tovilo <ilija.tovilo@me.com>
Date: Tue Dec 2 16:41:37 2025 +0100
Merge branch 'PHP-8.2' into PHP-8.3
* PHP-8.2:
Suppress libxml deprecations
diff --cc ext/dom/document.c
index faf6e210e2d,0bdd8262dcc..252e9ddd4e0
--- a/ext/dom/document.c
+++ b/ext/dom/document.c
@@@ -1538,11 -1439,13 +1538,13 @@@ PHP_METHOD(DOMDocument, save
/* encoding handled by property on doc */
- doc_props = dom_get_doc_props(intern->document);
+ libxml_doc_props const* doc_props = dom_get_doc_props_read_only(intern->document);
format = doc_props->formatoutput;
if (options & LIBXML_SAVE_NOEMPTYTAG) {
+ ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
saveempty = xmlSaveNoEmptyTags;
xmlSaveNoEmptyTags = 1;
+ ZEND_DIAGNOSTIC_IGNORED_END
}
bytes = xmlSaveFormatFileEnc(file, docp, NULL, format);
if (options & LIBXML_SAVE_NOEMPTYTAG) {
@@@ -1592,55 -1497,88 +1596,63 @@@ PHP_METHOD(DOMDocument, saveXML
php_error_docref(NULL, E_WARNING, "Could not fetch buffer");
RETURN_FALSE;
}
- if (options & LIBXML_SAVE_NOEMPTYTAG) {
- ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
- saveempty = xmlSaveNoEmptyTags;
- xmlSaveNoEmptyTags = 1;
- ZEND_DIAGNOSTIC_IGNORED_END
- }
+ /* Save libxml2 global, override its vaule, and restore after saving. */
++ ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
+ old_xml_save_no_empty_tags = xmlSaveNoEmptyTags;
+ xmlSaveNoEmptyTags = (options & LIBXML_SAVE_NOEMPTYTAG) ? 1 : 0;
++ ZEND_DIAGNOSTIC_IGNORED_END
xmlNodeDump(buf, docp, node, 0, format);
- if (options & LIBXML_SAVE_NOEMPTYTAG) {
- ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
- xmlSaveNoEmptyTags = saveempty;
- ZEND_DIAGNOSTIC_IGNORED_END
- }
- mem = (xmlChar*) xmlBufferContent(buf);
- if (!mem) {
- xmlBufferFree(buf);
++ ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
+ xmlSaveNoEmptyTags = old_xml_save_no_empty_tags;
++ ZEND_DIAGNOSTIC_IGNORED_END
+ } else {
+ buf = xmlBufferCreate();
+ if (!buf) {
+ php_error_docref(NULL, E_WARNING, "Could not fetch buffer");
RETURN_FALSE;
}
- RETVAL_STRING((char *) mem);
- xmlBufferFree(buf);
- } else {
- if (options & LIBXML_SAVE_NOEMPTYTAG) {
- ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
- saveempty = xmlSaveNoEmptyTags;
- xmlSaveNoEmptyTags = 1;
- ZEND_DIAGNOSTIC_IGNORED_END
+
+ int converted_options = XML_SAVE_AS_XML;
+ if (options & XML_SAVE_NO_DECL) {
+ converted_options |= XML_SAVE_NO_DECL;
}
+ if (format) {
+ converted_options |= XML_SAVE_FORMAT;
+ }
+ /* Save libxml2 global, override its vaule, and restore after saving. */
++ ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
+ old_xml_save_no_empty_tags = xmlSaveNoEmptyTags;
+ xmlSaveNoEmptyTags = (options & LIBXML_SAVE_NOEMPTYTAG) ? 1 : 0;
++ ZEND_DIAGNOSTIC_IGNORED_END
/* Encoding is handled from the encoding property set on the document */
- xmlDocDumpFormatMemory(docp, &mem, &size, format);
- if (options & LIBXML_SAVE_NOEMPTYTAG) {
- ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
- xmlSaveNoEmptyTags = saveempty;
- ZEND_DIAGNOSTIC_IGNORED_END
+ xmlSaveCtxtPtr ctxt = xmlSaveToBuffer(buf, (const char *) docp->encoding, converted_options);
++ ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations")
+ xmlSaveNoEmptyTags = old_xml_save_no_empty_tags;
++ ZEND_DIAGNOSTIC_IGNORED_END
+ if (UNEXPECTED(!ctxt)) {
+ xmlBufferFree(buf);
+ php_error_docref(NULL, E_WARNING, "Could not create save context");
+ RETURN_FALSE;
}
- if (!size || !mem) {
+ if (UNEXPECTED(xmlSaveDoc(ctxt, docp) < 0)) {
+ (void) xmlSaveClose(ctxt);
+ xmlBufferFree(buf);
+ php_error_docref(NULL, E_WARNING, "Could not save document");
RETURN_FALSE;
}
- RETVAL_STRINGL((char *) mem, size);
- xmlFree(mem);
+ (void) xmlSaveFlush(ctxt);
+ (void) xmlSaveClose(ctxt);
}
-}
-/* }}} end dom_document_savexml */
-
-static xmlNodePtr php_dom_free_xinclude_node(xmlNodePtr cur) /* {{{ */
-{
- xmlNodePtr xincnode;
-
- xincnode = cur;
- cur = cur->next;
- xmlUnlinkNode(xincnode);
- php_libxml_node_free_resource(xincnode);
-
- return cur;
-}
-/* }}} */
-
-static void php_dom_remove_xinclude_nodes(xmlNodePtr cur) /* {{{ */
-{
- while(cur) {
- if (cur->type == XML_XINCLUDE_START) {
- cur = php_dom_free_xinclude_node(cur);
-
- /* XML_XINCLUDE_END node will be a sibling of XML_XINCLUDE_START */
- while(cur && cur->type != XML_XINCLUDE_END) {
- /* remove xinclude processing nodes from recursive xincludes */
- if (cur->type == XML_ELEMENT_NODE) {
- php_dom_remove_xinclude_nodes(cur->children);
- }
- cur = cur->next;
- }
-
- if (cur && cur->type == XML_XINCLUDE_END) {
- cur = php_dom_free_xinclude_node(cur);
- }
- } else {
- if (cur->type == XML_ELEMENT_NODE) {
- php_dom_remove_xinclude_nodes(cur->children);
- }
- cur = cur->next;
- }
+ mem = xmlBufferContent(buf);
+ if (!mem) {
+ xmlBufferFree(buf);
+ RETURN_FALSE;
}
+ size = xmlBufferLength(buf);
+ RETVAL_STRINGL((const char *) mem, size);
+ xmlBufferFree(buf);
}
-/* }}} */
+/* }}} end dom_document_savexml */
/* Backported from master branch xml_common.h */
static zend_always_inline xmlNodePtr php_dom_next_in_tree_order(const xmlNode *nodep, const xmlNode *basep)