]> granicus.if.org Git - php/commitdiff
Added an encoding detection option for expat XML parser.
authorMoriyoshi Koizumi <moriyoshi@php.net>
Sun, 11 May 2003 09:04:05 +0000 (09:04 +0000)
committerMoriyoshi Koizumi <moriyoshi@php.net>
Sun, 11 May 2003 09:04:05 +0000 (09:04 +0000)
ext/xml/xml.c

index 4d394ab2b8da50df7a160323f8e398db0046a912..378ae2f55a5426dcc59930c9a36535f89e32b3ac 100644 (file)
@@ -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);
 }
 /* }}} */