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);  }  /* }}} */ | 
