cvs: php4 /ext/xml xml.c
| From: | Moriyoshi Koizumi | Date: | Sun, 11 May 2003 09:04:05 +0000 |
| Subject: | cvs: php4 /ext/xml xml.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-20830@lists.php.net to get a copy of this message | ||
moriyoshi Sun May 11 05:04:05 2003 EDT
Modified files:
/php4/ext/xml xml.c
Log:
Added an encoding detection option for expat XML parser.
Index: php4/ext/xml/xml.c
diff -u php4/ext/xml/xml.c:1.123 php4/ext/xml/xml.c:1.124
--- php4/ext/xml/xml.c:1.123 Thu May 8 12:01:50 2003
+++ php4/ext/xml/xml.c Sun May 11 05:04:05 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: xml.c,v 1.123 2003/05/08 16:01:50 moriyoshi Exp $ */
+/* $Id: xml.c,v 1.124 2003/05/11 09:04:05 moriyoshi Exp $ */
#define IS_EXT_MODULE
@@ -1020,108 +1020,74 @@
/************************* 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);
}
/* }}} */