#include "dom_properties.h"
#include "ext/standard/info.h"
+#include "ext/libxml/php_libxml.h"
#define PHP_XPATH 1
#define PHP_XPTR 2
REGISTER_LONG_CONSTANT("DOM_INVALID_ACCESS_ERR", INVALID_ACCESS_ERR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("DOM_VALIDATION_ERR", VALIDATION_ERR, CONST_CS | CONST_PERSISTENT);
- xmlInitParser();
+ php_libxml_initialize();
return SUCCESS;
}
#endif
#if defined(LIBXML_XPTR_ENABLED)
php_info_print_table_row(2, "XPointer Support", "enabled");
+#endif
+#ifdef LIBXML_SCHEMAS_ENABLED
+ php_info_print_table_row(2, "Schema Support", "enabled");
+ php_info_print_table_row(2, "RelaxNG Support", "enabled");
#endif
php_info_print_table_end();
}
PHP_MSHUTDOWN_FUNCTION(dom)
{
- xmlCleanupParser();
+ php_libxml_shutdown();
zend_hash_destroy(&dom_domstringlist_prop_handlers);
zend_hash_destroy(&dom_namelist_prop_handlers);
#include "php_libxml.h"
+/* a true global for initialization */
+int _php_libxml_initialized = 0;
+
#ifdef ZTS
int libxml_globals_id;
#else
int php_libxml_streams_IO_match_wrapper(const char *filename)
{
TSRMLS_FETCH();
- return php_stream_locate_url_wrapper(filename, NULL, STREAM_LOCATE_WRAPPERS_ONLY TSRMLS_CC) ? 1 : 0;
-
+ return php_stream_locate_url_wrapper(filename, NULL, 0 TSRMLS_CC) ? 1 : 0;
}
void *php_libxml_streams_IO_open_wrapper(const char *filename)
return php_stream_close((php_stream*)context);
}
+PHP_LIBXML_API void php_libxml_initialize() {
+ if (!_php_libxml_initialized) {
+ /* we should be the only one's to ever init!! */
+ xmlInitParser();
+
+ /* Enable php stream/wrapper support for libxml
+ we only use php streams, so we do not enable
+ the default io handlers in libxml.
+ */
+ xmlRegisterInputCallbacks(
+ php_libxml_streams_IO_match_wrapper,
+ php_libxml_streams_IO_open_wrapper,
+ php_libxml_streams_IO_read,
+ php_libxml_streams_IO_close);
+
+ xmlRegisterOutputCallbacks(
+ php_libxml_streams_IO_match_wrapper,
+ php_libxml_streams_IO_open_wrapper,
+ php_libxml_streams_IO_write,
+ php_libxml_streams_IO_close);
+
+ _php_libxml_initialized = 1;
+ }
+}
+
+PHP_LIBXML_API void php_libxml_shutdown() {
+ if (_php_libxml_initialized) {
+ xmlCleanupParser();
+ _php_libxml_initialized = 0;
+ }
+}
+
PHP_MINIT_FUNCTION(libxml)
{
- /* Enable php stream/wrapper support for libxml
- we only use php streams, so we disable the libxml builtin
- io support.
- */
- xmlCleanupInputCallbacks();
- xmlRegisterInputCallbacks(
- php_libxml_streams_IO_match_wrapper,
- php_libxml_streams_IO_open_wrapper,
- php_libxml_streams_IO_read,
- php_libxml_streams_IO_close);
-
- xmlCleanupOutputCallbacks();
- xmlRegisterOutputCallbacks(
- php_libxml_streams_IO_match_wrapper,
- php_libxml_streams_IO_open_wrapper,
- php_libxml_streams_IO_write,
- php_libxml_streams_IO_close);
-
+ php_libxml_initialize();
+
#ifdef ZTS
ts_allocate_id(&libxml_globals_id, sizeof(php_libxml_globals), (ts_allocate_ctor) php_libxml_init_globals, NULL);
#else
LIBXML(stream_context) = NULL;
#endif
+
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(libxml)
{
+ php_libxml_shutdown();
return SUCCESS;
}