22#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
27#include <libxml/xmlsave.h>
31 const zend_long VALID_OPTIONS = XML_PARSE_RECOVER
33#if LIBXML_VERSION >= 21300
49 | XML_PARSE_BIG_LINES;
50 if ((
options & ~VALID_OPTIONS) != 0) {
83 xmlNodePtr node = doc->children;
84 while (node !=
NULL) {
89 node = php_dom_next_in_tree_order(node,
NULL);
95 const char *version =
NULL;
96 size_t encoding_len =
strlen(
"UTF-8");
103 xmlCharEncodingHandlerPtr
handler = xmlFindCharEncodingHandler(
encoding);
112 xmlDocPtr lxml_doc = xmlNewDoc((
const xmlChar *) version);
117 lxml_doc->encoding = xmlStrdup((
const xmlChar *)
encoding);
122 (xmlNodePtr) lxml_doc,
136 const char *source, *override_encoding =
NULL;
137 size_t source_len, override_encoding_len;
146 &override_encoding_len
167 if (!check_options_validity(2,
options)) {
172 if (override_encoding !=
NULL) {
173 encoding = xmlFindCharEncodingHandler(override_encoding);
178 options |= XML_PARSE_IGNORE_ENC;
196 if (lxml_doc->encoding ==
NULL) {
197 if (override_encoding) {
198 lxml_doc->encoding = xmlStrdup((
const xmlChar *) override_encoding);
200 lxml_doc->encoding = xmlStrdup((
const xmlChar *)
"UTF-8");
204 if (!php_is_stream_path((
char *) lxml_doc->URL)) {
206 if (
strncmp((
const char *) lxml_doc->URL,
"file:/",
sizeof(
"file:/") - 1) != 0) {
208 xmlChar *
buffer = xmlStrdup((
const xmlChar *)
"file:///");
210 xmlChar *
buffer = xmlStrdup((
const xmlChar *)
"file://");
213 xmlChar *new_buffer = xmlStrcat(
buffer, lxml_doc->URL);
214 if (new_buffer !=
NULL) {
215 xmlFree(BAD_CAST lxml_doc->URL);
216 lxml_doc->URL = new_buffer;
231 (xmlNodePtr) lxml_doc,
256static int php_new_dom_write_smart_str(
void *
context,
const char *
buffer,
int len)
266 return intern !=
NULL ? php_dom_get_private_data(intern) :
NULL;
274 xmlSaveCtxtPtr ctxt = xmlSaveToIO(php_new_dom_write_smart_str,
NULL, &str,
encoding, XML_SAVE_AS_XML |
options);
276 xmlCharEncodingHandlerPtr
handler = xmlFindCharEncodingHandler(
encoding);
277 xmlOutputBufferPtr
out = xmlOutputBufferCreateIO(php_new_dom_write_smart_str,
NULL, &str,
handler);
285 (
void) xmlSaveClose(ctxt);
289 smart_str_free_ex(&str,
false);
293 return smart_str_extract(&str);
296static zend_string *php_new_dom_dump_node_to_str(xmlDocPtr doc, xmlNodePtr node,
bool format,
const char *
encoding)
298 return php_new_dom_dump_node_to_str_ex(node, 0, format,
encoding);
306zend_long php_new_dom_dump_node_to_file(
const char *filename, xmlDocPtr doc, xmlNodePtr node,
bool format,
const char *
encoding)
308 xmlCharEncodingHandlerPtr
handler = xmlFindCharEncodingHandler(
encoding);
309 xmlOutputBufferPtr
out = xmlOutputBufferCreateFilename(filename,
handler, 0);
318 xmlSaveCtxtPtr ctxt = xmlSaveToIO(
out->writecallback,
NULL, stream,
encoding, XML_SAVE_AS_XML);
322 (
void) xmlSaveClose(ctxt);
327 (
void) xmlOutputBufferClose(
out);
332static zend_long php_new_dom_dump_doc_to_file(
const char *filename, xmlDocPtr doc,
bool format,
const char *
encoding)
334 return php_new_dom_dump_node_to_file(filename, doc, (xmlNodePtr) doc, format,
encoding);
337static const php_libxml_document_handlers php_new_dom_default_document_handlers = {
338 .dump_node_to_str = php_new_dom_dump_node_to_str,
339 .dump_doc_to_str = php_new_dom_dump_doc_to_str,
340 .dump_node_to_file = php_new_dom_dump_node_to_file,
341 .dump_doc_to_file = php_new_dom_dump_doc_to_file,
346 document->class_type = PHP_LIBXML_CLASS_MODERN;
347 document->handlers = &php_new_dom_default_document_handlers;
strstr(string $haystack, string $needle, bool $before_needle=false)
PHP_DOM_EXPORT zend_class_entry * dom_xml_document_class_entry
void php_dom_throw_error_with_message(dom_exception_code error_code, const char *error_message, bool strict_error)
void php_dom_throw_error(dom_exception_code error_code, bool strict_error)
PHP_DOM_EXPORT void php_dom_ns_compat_mark_attribute_list(php_dom_libxml_ns_mapper *mapper, xmlNodePtr node)
dom_object * php_dom_instantiate_object_helper(zval *return_value, zend_class_entry *ce, xmlNodePtr obj, dom_object *parent)
#define DOM_DOCUMENT_MALFORMED
void dom_set_xml_class(php_libxml_ref_obj *document)
xmlDocPtr dom_document_parser(zval *id, dom_load_mode mode, const char *source, size_t source_len, size_t options, xmlCharEncodingHandlerPtr encoding)
void dom_document_convert_to_modern(php_libxml_ref_obj *document, xmlDocPtr lxml_doc)
void dom_mark_namespaces_as_attributes_too(php_dom_libxml_ns_mapper *ns_mapper, xmlDocPtr doc)
xmlChar * php_dom_libxml_fix_file_path(xmlChar *path)
PHP_JSON_API size_t int options
xmlCharEncodingHandlerPtr encoding
struct _php_stream php_stream
#define php_stream_tell(stream)
php_dom_private_data * php_dom_private_data_create(void)
php_dom_libxml_ns_mapper * php_dom_ns_mapper_from_private(php_dom_private_data *private_data)
php_libxml_private_data_header * php_dom_libxml_private_data_header(php_dom_private_data *private_data)
php_libxml_ref_obj * document
struct _dom_object dom_object
PHP_DOM_EXPORT dom_object * php_dom_object_get_data(xmlNodePtr obj)
int dom_xml_serialize(xmlSaveCtxtPtr ctx, xmlOutputBufferPtr out, xmlNodePtr node, bool format, bool require_well_formed, php_dom_private_data *private_data)
#define INTERNAL_FUNCTION_PARAMETERS
#define INTERNAL_FUNCTION_PARAM_PASSTHRU
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
strncmp(string $string1, string $string2, int $length)
ZEND_API ZEND_COLD zend_object * zend_throw_exception_ex(zend_class_entry *exception_ce, zend_long code, const char *format,...)
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)
struct _zend_string zend_string
#define EXPECTED(condition)
#define UNEXPECTED(condition)
#define ZEND_SIZE_T_INT_OVFL(size)
fbc internal_function handler(call, ret)