Browse Source

Added an encoding detection option for expat XML parser.

migration/unlabaled-1.3.2
Moriyoshi Koizumi 24 years ago
parent
commit
ebd92654c1
  1. 106
      ext/xml/xml.c

106
ext/xml/xml.c

@ -1020,108 +1020,74 @@ void _xml_endNamespaceDeclHandler(void *userData, const XML_Char *prefix)
/************************* EXTENSION FUNCTIONS *************************/
/* {{{ proto resource xml_parser_create([string encoding])
Create an XML parser */
PHP_FUNCTION(xml_parser_create)
static void php_xml_parser_create_impl(INTERNAL_FUNCTION_PARAMETERS, int ns_support)
{
xml_parser *parser;
int argc;
zval **encodingArg;
int auto_detect = 0;
char *encoding_param = NULL;
int encoding_param_len = 0;
char *ns_param = NULL;
int ns_param_len = 0;
XML_Char *encoding;
argc = ZEND_NUM_ARGS();
if (argc > 1 || zend_get_parameters_ex(argc, &encodingArg) == FAILURE) {
WRONG_PARAM_COUNT;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, (ns_support ? "|ss": "|s"), &encoding_param, &encoding_param_len, &ns_param, &ns_param_len) == FAILURE) {
RETURN_FALSE;
}
if (argc == 1) {
convert_to_string_ex(encodingArg);
if (encoding_param != NULL) {
/* The supported encoding types are hardcoded here because
* we are limited to the encodings supported by expat/xmltok.
*/
if (strncasecmp(Z_STRVAL_PP(encodingArg), "ISO-8859-1",
Z_STRLEN_PP(encodingArg)) == 0) {
if (encoding_param_len == 0) {
encoding = XML(default_encoding);
auto_detect = 1;
} else if (strcasecmp(encoding_param, "ISO-8859-1") == 0) {
encoding = "ISO-8859-1";
} else if (strncasecmp(Z_STRVAL_PP(encodingArg), "UTF-8",
Z_STRLEN_PP(encodingArg)) == 0) {
} else if (strcasecmp(encoding_param, "UTF-8") == 0) {
encoding = "UTF-8";
} else if (strncasecmp(Z_STRVAL_PP(encodingArg), "US-ASCII",
Z_STRLEN_PP(encodingArg)) == 0) {
} else if (strcasecmp(encoding_param, "US-ASCII") == 0) {
encoding = "US-ASCII";
} else { /* UTF-16 not supported */
php_error_docref(NULL TSRMLS_CC, E_WARNING, "unsupported source encoding \"%s\"", Z_STRVAL_PP(encodingArg));
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "unsupported source encoding \"%s\"", encoding_param);
RETURN_FALSE;
}
} else {
encoding = XML(default_encoding);
}
if (ns_support && ns_param == NULL){
ns_param = ":";
}
parser = ecalloc(sizeof(xml_parser), 1);
parser->parser = XML_ParserCreate_MM(encoding, &php_xml_mem_hdlrs, NULL);
parser->parser = XML_ParserCreate_MM((auto_detect ? NULL : encoding),
&php_xml_mem_hdlrs, ns_param);
parser->target_encoding = encoding;
parser->case_folding = 1;
parser->object = NULL;
XML_SetUserData(parser->parser, parser);
ZEND_REGISTER_RESOURCE(return_value,parser,le_xml_parser);
ZEND_REGISTER_RESOURCE(return_value, parser,le_xml_parser);
parser->index = Z_LVAL_P(return_value);
}
/* {{{ proto resource xml_parser_create([string encoding])
Create an XML parser */
PHP_FUNCTION(xml_parser_create)
{
php_xml_parser_create_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
}
/* }}} */
/* {{{ proto resource xml_parser_create_ns([string encoding [, string sep]])
Create an XML parser */
PHP_FUNCTION(xml_parser_create_ns)
{
xml_parser *parser;
int argc;
zval **encodingArg, **sepArg;
XML_Char *encoding, *sep;
argc = ZEND_NUM_ARGS();
if (argc > 2 || zend_get_parameters_ex(argc, &encodingArg, &sepArg) == FAILURE) {
WRONG_PARAM_COUNT;
}
if (argc >= 1) {
convert_to_string_ex(encodingArg);
/* The supported encoding types are hardcoded here because
* we are limited to the encodings supported by expat/xmltok.
*/
if (strncasecmp(Z_STRVAL_PP(encodingArg), "ISO-8859-1",
Z_STRLEN_PP(encodingArg)) == 0) {
encoding = "ISO-8859-1";
} else if (strncasecmp(Z_STRVAL_PP(encodingArg), "UTF-8",
Z_STRLEN_PP(encodingArg)) == 0) {
encoding = "UTF-8";
} else if (strncasecmp(Z_STRVAL_PP(encodingArg), "US-ASCII",
Z_STRLEN_PP(encodingArg)) == 0) {
encoding = "US-ASCII";
} else { /* UTF-16 not supported */
php_error_docref(NULL TSRMLS_CC, E_WARNING, "unsupported source encoding \"%s\"", Z_STRVAL_PP(encodingArg));
RETURN_FALSE;
}
} else {
encoding = XML(default_encoding);
}
if (argc == 2){
convert_to_string_ex(sepArg);
sep = Z_STRVAL_PP(sepArg);
} else {
sep = ":";
}
parser = ecalloc(sizeof(xml_parser), 1);
parser->parser = XML_ParserCreate_MM(encoding, &php_xml_mem_hdlrs, sep);
parser->target_encoding = encoding;
parser->case_folding = 1;
parser->object = NULL;
XML_SetUserData(parser->parser, parser);
ZEND_REGISTER_RESOURCE(return_value,parser,le_xml_parser);
parser->index = Z_LVAL_P(return_value);
php_xml_parser_create_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
}
/* }}} */

Loading…
Cancel
Save