diff options
author | Moriyoshi Koizumi <moriyoshi@php.net> | 2003-05-11 09:04:05 +0000 |
---|---|---|
committer | Moriyoshi Koizumi <moriyoshi@php.net> | 2003-05-11 09:04:05 +0000 |
commit | ebd92654c128921b0ffeadd95dd99205058494d3 (patch) | |
tree | 9fb7798bad5c623733f66cad8f2c18832805c0d0 /ext/xml/xml.c | |
parent | 4e9e9c6e21511c2abe993d5f1f8c5fef7a02f4d6 (diff) | |
download | php-git-ebd92654c128921b0ffeadd95dd99205058494d3.tar.gz |
Added an encoding detection option for expat XML parser.
Diffstat (limited to 'ext/xml/xml.c')
-rw-r--r-- | ext/xml/xml.c | 106 |
1 files changed, 36 insertions, 70 deletions
diff --git a/ext/xml/xml.c b/ext/xml/xml.c index 4d394ab2b8..378ae2f55a 100644 --- a/ext/xml/xml.c +++ b/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); } /* }}} */ |