From ca6caa0cb28b4e6d426f925e929baf06e29ae8dd Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 16 Sep 2018 11:07:40 +0200 Subject: [PATCH] Make ext/xml API private Also remove dead functions --- UPGRADING.INTERNALS | 5 ++ ext/xml/php_xml.h | 115 ++------------------------------ ext/xml/xml.c | 158 ++++++++++++++++++++++++++------------------ 3 files changed, 102 insertions(+), 176 deletions(-) diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index fdcb046a58..41acae6e1d 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -11,6 +11,7 @@ PHP 7.4 INTERNALS UPGRADE NOTES b. Windows build system changes 3. Module changes + a. ext/xml ======================== 1. Internal API changes @@ -54,3 +55,7 @@ PHP 7.4 INTERNALS UPGRADE NOTES ======================== 3. Module changes ======================== + + a. ext/xml + - The public (internal) API of the ext/xml extension has been removed. All + functions and structures are private to the extension now. diff --git a/ext/xml/php_xml.h b/ext/xml/php_xml.h index a4bdef8548..3ab77c4f6a 100644 --- a/ext/xml/php_xml.h +++ b/ext/xml/php_xml.h @@ -22,132 +22,25 @@ #define PHP_XML_H #ifdef HAVE_XML + extern zend_module_entry xml_module_entry; #define xml_module_ptr &xml_module_entry #include "php_version.h" #define PHP_XML_VERSION PHP_VERSION -#else -#define xml_module_ptr NULL -#endif - -#ifdef HAVE_XML - #include "expat_compat.h" #ifdef XML_UNICODE #error "UTF-16 Unicode support not implemented!" #endif -ZEND_BEGIN_MODULE_GLOBALS(xml) - XML_Char *default_encoding; -ZEND_END_MODULE_GLOBALS(xml) - -typedef struct { - int case_folding; - XML_Parser parser; - XML_Char *target_encoding; - - zval index; - zval startElementHandler; - zval endElementHandler; - zval characterDataHandler; - zval processingInstructionHandler; - zval defaultHandler; - zval unparsedEntityDeclHandler; - zval notationDeclHandler; - zval externalEntityRefHandler; - zval unknownEncodingHandler; - zval startNamespaceDeclHandler; - zval endNamespaceDeclHandler; - - zend_function *startElementPtr; - zend_function *endElementPtr; - zend_function *characterDataPtr; - zend_function *processingInstructionPtr; - zend_function *defaultPtr; - zend_function *unparsedEntityDeclPtr; - zend_function *notationDeclPtr; - zend_function *externalEntityRefPtr; - zend_function *unknownEncodingPtr; - zend_function *startNamespaceDeclPtr; - zend_function *endNamespaceDeclPtr; - - zval object; - - zval data; - zval info; - int level; - int toffset; - int curtag; - zval *ctag; - char **ltags; - int lastwasopen; - int skipwhite; - int isparsing; - - XML_Char *baseURI; -} xml_parser; - - -typedef struct { - XML_Char *name; - char (*decoding_function)(unsigned short); - unsigned short (*encoding_function)(unsigned char); -} xml_encoding; - - -enum php_xml_option { - PHP_XML_OPTION_CASE_FOLDING = 1, - PHP_XML_OPTION_TARGET_ENCODING, - PHP_XML_OPTION_SKIP_TAGSTART, - PHP_XML_OPTION_SKIP_WHITE -}; - -/* for xml_parse_into_struct */ - -#define XML_MAXLEVEL 255 /* XXX this should be dynamic */ - -PHP_FUNCTION(xml_parser_create); -PHP_FUNCTION(xml_parser_create_ns); -PHP_FUNCTION(xml_set_object); -PHP_FUNCTION(xml_set_element_handler); -PHP_FUNCTION(xml_set_character_data_handler); -PHP_FUNCTION(xml_set_processing_instruction_handler); -PHP_FUNCTION(xml_set_default_handler); -PHP_FUNCTION(xml_set_unparsed_entity_decl_handler); -PHP_FUNCTION(xml_set_notation_decl_handler); -PHP_FUNCTION(xml_set_external_entity_ref_handler); -PHP_FUNCTION(xml_set_start_namespace_decl_handler); -PHP_FUNCTION(xml_set_end_namespace_decl_handler); -PHP_FUNCTION(xml_parse); -PHP_FUNCTION(xml_get_error_code); -PHP_FUNCTION(xml_error_string); -PHP_FUNCTION(xml_get_current_line_number); -PHP_FUNCTION(xml_get_current_column_number); -PHP_FUNCTION(xml_get_current_byte_index); -PHP_FUNCTION(xml_parser_free); -PHP_FUNCTION(xml_parser_set_option); -PHP_FUNCTION(xml_parser_get_option); -PHP_FUNCTION(utf8_encode); -PHP_FUNCTION(utf8_decode); -PHP_FUNCTION(xml_parse_into_struct); - -PHP_XML_API char *_xml_zval_strdup(zval *); -PHP_XML_API zend_string *xml_utf8_decode(const XML_Char *, size_t, const XML_Char *); -PHP_XML_API zend_string *xml_utf8_encode(const char *, size_t, const XML_Char *); - -#endif /* HAVE_LIBEXPAT */ +#else +#define xml_module_ptr NULL +#endif /* HAVE_XML */ #define phpext_xml_ptr xml_module_ptr -#define XML(v) ZEND_MODULE_GLOBALS_ACCESSOR(xml, v) - -#if defined(ZTS) && defined(COMPILE_DL_XML) -ZEND_TSRMLS_CACHE_EXTERN() -#endif - #endif /* PHP_XML_H */ /* diff --git a/ext/xml/xml.c b/ext/xml/xml.c index 35a1b2984e..f09edf3eac 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -56,8 +56,75 @@ * - Weird things happen with sections. */ +ZEND_BEGIN_MODULE_GLOBALS(xml) + XML_Char *default_encoding; +ZEND_END_MODULE_GLOBALS(xml) + ZEND_DECLARE_MODULE_GLOBALS(xml) +#define XML(v) ZEND_MODULE_GLOBALS_ACCESSOR(xml, v) + +typedef struct { + int case_folding; + XML_Parser parser; + XML_Char *target_encoding; + + zval index; + zval startElementHandler; + zval endElementHandler; + zval characterDataHandler; + zval processingInstructionHandler; + zval defaultHandler; + zval unparsedEntityDeclHandler; + zval notationDeclHandler; + zval externalEntityRefHandler; + zval unknownEncodingHandler; + zval startNamespaceDeclHandler; + zval endNamespaceDeclHandler; + + zend_function *startElementPtr; + zend_function *endElementPtr; + zend_function *characterDataPtr; + zend_function *processingInstructionPtr; + zend_function *defaultPtr; + zend_function *unparsedEntityDeclPtr; + zend_function *notationDeclPtr; + zend_function *externalEntityRefPtr; + zend_function *unknownEncodingPtr; + zend_function *startNamespaceDeclPtr; + zend_function *endNamespaceDeclPtr; + + zval object; + + zval data; + zval info; + int level; + int toffset; + int curtag; + zval *ctag; + char **ltags; + int lastwasopen; + int skipwhite; + int isparsing; + + XML_Char *baseURI; +} xml_parser; + + +typedef struct { + XML_Char *name; + char (*decoding_function)(unsigned short); + unsigned short (*encoding_function)(unsigned char); +} xml_encoding; + + +enum php_xml_option { + PHP_XML_OPTION_CASE_FOLDING = 1, + PHP_XML_OPTION_TARGET_ENCODING, + PHP_XML_OPTION_SKIP_TAGSTART, + PHP_XML_OPTION_SKIP_WHITE +}; + /* {{{ dynamically loadable module stuff */ #ifdef COMPILE_DL_XML #ifdef ZTS @@ -67,6 +134,7 @@ ZEND_GET_MODULE(xml) #endif /* COMPILE_DL_XML */ /* }}} */ +#define XML_MAXLEVEL 255 /* XXX this should be dynamic */ #define SKIP_TAGSTART(str) ((str) + (parser->toffset > (int)strlen(str) ? strlen(str) : parser->toffset)) @@ -76,6 +144,30 @@ PHP_MINIT_FUNCTION(xml); PHP_MINFO_FUNCTION(xml); static PHP_GINIT_FUNCTION(xml); +PHP_FUNCTION(xml_parser_create); +PHP_FUNCTION(xml_parser_create_ns); +PHP_FUNCTION(xml_set_object); +PHP_FUNCTION(xml_set_element_handler); +PHP_FUNCTION(xml_set_character_data_handler); +PHP_FUNCTION(xml_set_processing_instruction_handler); +PHP_FUNCTION(xml_set_default_handler); +PHP_FUNCTION(xml_set_unparsed_entity_decl_handler); +PHP_FUNCTION(xml_set_notation_decl_handler); +PHP_FUNCTION(xml_set_external_entity_ref_handler); +PHP_FUNCTION(xml_set_start_namespace_decl_handler); +PHP_FUNCTION(xml_set_end_namespace_decl_handler); +PHP_FUNCTION(xml_parse); +PHP_FUNCTION(xml_get_error_code); +PHP_FUNCTION(xml_error_string); +PHP_FUNCTION(xml_get_current_line_number); +PHP_FUNCTION(xml_get_current_column_number); +PHP_FUNCTION(xml_get_current_byte_index); +PHP_FUNCTION(xml_parser_free); +PHP_FUNCTION(xml_parser_set_option); +PHP_FUNCTION(xml_parser_get_option); +PHP_FUNCTION(xml_parse_into_struct); + +static zend_string *xml_utf8_decode(const XML_Char *, size_t, const XML_Char *); static void xml_parser_dtor(zend_resource *rsrc); static void xml_set_handler(zval *, zval *); inline static unsigned short xml_encode_iso_8859_1(unsigned char); @@ -549,59 +641,8 @@ static const xml_encoding *xml_get_encoding(const XML_Char *name) } /* }}} */ -/* {{{ xml_utf8_encode() */ -PHP_XML_API zend_string *xml_utf8_encode(const char *s, size_t len, const XML_Char *encoding) -{ - size_t pos = len; - zend_string *str; - unsigned int c; - unsigned short (*encoder)(unsigned char) = NULL; - const xml_encoding *enc = xml_get_encoding(encoding); - - if (enc) { - encoder = enc->encoding_function; - } else { - /* If the target encoding was unknown, fail */ - return NULL; - } - if (encoder == NULL) { - /* If no encoder function was specified, return the data as-is. - */ - str = zend_string_init(s, len, 0); - return str; - } - /* This is the theoretical max (will never get beyond len * 2 as long - * as we are converting from single-byte characters, though) */ - str = zend_string_safe_alloc(len, 4, 0, 0); - ZSTR_LEN(str) = 0; - while (pos > 0) { - c = encoder ? encoder((unsigned char)(*s)) : (unsigned short)(*s); - if (c < 0x80) { - ZSTR_VAL(str)[ZSTR_LEN(str)++] = (char) c; - } else if (c < 0x800) { - ZSTR_VAL(str)[ZSTR_LEN(str)++] = (0xc0 | (c >> 6)); - ZSTR_VAL(str)[ZSTR_LEN(str)++] = (0x80 | (c & 0x3f)); - } else if (c < 0x10000) { - ZSTR_VAL(str)[ZSTR_LEN(str)++] = (0xe0 | (c >> 12)); - ZSTR_VAL(str)[ZSTR_LEN(str)++] = (0xc0 | ((c >> 6) & 0x3f)); - ZSTR_VAL(str)[ZSTR_LEN(str)++] = (0x80 | (c & 0x3f)); - } else if (c < 0x200000) { - ZSTR_VAL(str)[ZSTR_LEN(str)++] = (0xf0 | (c >> 18)); - ZSTR_VAL(str)[ZSTR_LEN(str)++] = (0xe0 | ((c >> 12) & 0x3f)); - ZSTR_VAL(str)[ZSTR_LEN(str)++] = (0xc0 | ((c >> 6) & 0x3f)); - ZSTR_VAL(str)[ZSTR_LEN(str)++] = (0x80 | (c & 0x3f)); - } - pos--; - s++; - } - ZSTR_VAL(str)[ZSTR_LEN(str)] = '\0'; - str = zend_string_truncate(str, ZSTR_LEN(str), 0); - return str; -} -/* }}} */ - /* {{{ xml_utf8_decode() */ -PHP_XML_API zend_string *xml_utf8_decode(const XML_Char *s, size_t len, const XML_Char *encoding) +static zend_string *xml_utf8_decode(const XML_Char *s, size_t len, const XML_Char *encoding) { size_t pos = 0; unsigned int c; @@ -655,19 +696,6 @@ static int _xml_xmlcharlen(const XML_Char *s) } /* }}} */ -/* {{{ _xml_zval_strdup() */ -PHP_XML_API char *_xml_zval_strdup(zval *val) -{ - if (Z_TYPE_P(val) == IS_STRING) { - char *buf = emalloc(Z_STRLEN_P(val) + 1); - memcpy(buf, Z_STRVAL_P(val), Z_STRLEN_P(val)); - buf[Z_STRLEN_P(val)] = '\0'; - return buf; - } - return NULL; -} -/* }}} */ - /* {{{ _xml_add_to_info() */ static void _xml_add_to_info(xml_parser *parser,char *name) { -- 2.40.0