diff options
Diffstat (limited to 'ext/xml/xml.c')
| -rw-r--r-- | ext/xml/xml.c | 398 | 
1 files changed, 313 insertions, 85 deletions
diff --git a/ext/xml/xml.c b/ext/xml/xml.c index 299be2cfc3..f8127e8bd8 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -2,7 +2,7 @@     +----------------------------------------------------------------------+     | PHP HTML Embedded Scripting Language Version 3.0                     |     +----------------------------------------------------------------------+ -   | Copyright (c) 1997,1998 PHP Development Team (See Credits file)      | +   | Copyright (c) 1997-1999 PHP Development Team (See Credits file)      |     +----------------------------------------------------------------------+     | This program is free software; you can redistribute it and/or modify |     | it under the terms of one of the following licenses:                 | @@ -23,7 +23,7 @@     | If you did not, or have any questions about PHP licensing, please    |     | contact core@php.net.                                                |     +----------------------------------------------------------------------+ -   | Authors: Stig Sæther Bakken <ssb@guardian.no>                        | +   | Authors: Stig Sæther Bakken <ssb@fast.no>                            |     +----------------------------------------------------------------------+   */ @@ -109,13 +109,15 @@ static void xml_destroy_parser(xml_parser *);  static void xml_set_handler(char **, pval *);  inline static unsigned short xml_encode_iso_8859_1(unsigned char);  inline static char xml_decode_iso_8859_1(unsigned short); -inline static unsigned short xml_encode_us_ascii(char); +inline static unsigned short xml_encode_us_ascii(unsigned char);  inline static char xml_decode_us_ascii(unsigned short);  static XML_Char *xml_utf8_encode(const char *, int, int *, const XML_Char *);  static char *xml_utf8_decode(const XML_Char *, int, int *, const XML_Char *);  static pval *xml_call_handler(xml_parser *, char *, int, pval **);  static pval *php3i_xmlcharpval(const XML_Char *, int, const XML_Char *);  static int php3i_xmlcharlen(const XML_Char *); +static void php3i_add_to_info(xml_parser *parser,char *name); +  void php3i_xml_startElementHandler(void *, const char *, const char **);  void php3i_xml_endElementHandler(void *, const char *); @@ -139,6 +141,7 @@ function_entry xml_functions[] = {  	PHP_FE(xml_set_notation_decl_handler, NULL)  	PHP_FE(xml_set_external_entity_ref_handler, NULL)      PHP_FE(xml_parse, NULL) +    PHP_FE(xml_parse_into_struct, NULL)      PHP_FE(xml_get_error_code, NULL)      PHP_FE(xml_error_string, NULL)      PHP_FE(xml_get_current_line_number, NULL) @@ -229,6 +232,9 @@ int php3_minit_xml(INIT_FUNC_ARGS)  	REGISTER_LONG_CONSTANT("XML_OPTION_CASE_FOLDING", PHP3_XML_OPTION_CASE_FOLDING, CONST_CS|CONST_PERSISTENT);  	REGISTER_LONG_CONSTANT("XML_OPTION_TARGET_ENCODING", PHP3_XML_OPTION_TARGET_ENCODING, CONST_CS|CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("XML_OPTION_SKIP_TAGSTART", PHP3_XML_OPTION_SKIP_TAGSTART, CONST_CS|CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("XML_OPTION_SKIP_WHITE", PHP3_XML_OPTION_SKIP_WHITE, CONST_CS|CONST_PERSISTENT); +	  	return SUCCESS;  } @@ -311,6 +317,9 @@ xml_destroy_parser(xml_parser *parser)  	if (parser->parser) {  		XML_ParserFree(parser->parser);  	} +	if (parser->ltags) { +		efree(parser->ltags); +	}  	if (parser->startElementHandler) {  		efree(parser->startElementHandler);  	} @@ -403,7 +412,6 @@ xml_call_handler(xml_parser *parser, char *funcName, int argc, pval **argv)  inline static unsigned short  xml_encode_iso_8859_1(unsigned char c)  { -	php3_printf("c=%d ", c);  	return (unsigned short)c;  } @@ -420,7 +428,7 @@ xml_decode_iso_8859_1(unsigned short c)      /* {{{ xml_encode_us_ascii() */  inline static unsigned short -xml_encode_us_ascii(char c) +xml_encode_us_ascii(unsigned char c)  {  	return (unsigned short)c;  } @@ -459,7 +467,7 @@ xml_utf8_encode(const char *s, int len, int *newlen, const XML_Char *encoding)  	int pos = len;  	char *newbuf;  	unsigned short c; -	unsigned short (*encoder)(char) = NULL; +	unsigned short (*encoder)(unsigned char) = NULL;  	xml_encoding *enc = xml_get_encoding(encoding);  	*newlen = 0; @@ -511,7 +519,7 @@ static char *  xml_utf8_decode(const XML_Char *s, int len, int *newlen, const XML_Char *encoding)  {  	int pos = len; -	char *newbuf = emalloc(len); +	char *newbuf = emalloc(len + 1);  	unsigned short c;  	char (*decoder)(unsigned short) = NULL;  	xml_encoding *enc = xml_get_encoding(encoding); @@ -526,6 +534,7 @@ xml_utf8_decode(const XML_Char *s, int len, int *newlen, const XML_Char *encodin  		 */  		memcpy(newbuf, s, len);  		*newlen = len; +		newbuf[*newlen] = '\0';  		return newbuf;  	}  	while (pos > 0) { @@ -550,8 +559,9 @@ xml_utf8_decode(const XML_Char *s, int len, int *newlen, const XML_Char *encodin  		++*newlen;      }  	if (*newlen < len) { -		newbuf = erealloc(newbuf, *newlen); +		newbuf = erealloc(newbuf, *newlen + 1);  	} +	newbuf[*newlen] = '\0';  	return newbuf;  }  /* }}} */ @@ -588,40 +598,125 @@ static int php3i_xmlcharlen(const XML_Char *s)  }  /* }}} */ -    /* {{{ php3i_xml_startElementHandler() */ +/* {{{ php3i_add_to_info */ +static void php3i_add_to_info(xml_parser *parser,char *name) +{ +	pval *element, values; + +	if (! parser->info) { +		return; +	} + +	if (_php3_hash_find(parser->info->value.ht,name,strlen(name) + 1,(void **) &element) == FAILURE) { +		if (array_init(&values) == FAILURE) { +			php3_error(E_ERROR, "Unable to initialize array"); +			return; +		} +		 +		_php3_hash_update(parser->info->value.ht, name, strlen(name)+1, (void *) &values, sizeof(pval), (void **) &element); +	}  +			 +	add_next_index_long(element,parser->curtag); + +	 +	parser->curtag++; +} + +/* }}} */ +/* {{{ php3i_xml_startElementHandler() */  void php3i_xml_startElementHandler(void *userData, const char *name,  								   const char **attributes)  {  	xml_parser *parser = (xml_parser *)userData; +	const char **attrs = attributes;  	XML_TLS_VARS; -	if (parser && parser->startElementHandler) { +	if (parser) {  		pval *retval, *args[3]; +		parser->level++; +  		if (parser->case_folding) {  			name = _php3_strtoupper(estrdup(name));  		} -		args[0] = php3i_long_pval(parser->index); -		args[1] = php3i_string_pval(name); -		args[2] = emalloc(sizeof(pval)); -		array_init(args[2]); -		while (attributes && *attributes) { -			char *key = (char *)attributes[0]; -			char *value = (char *)attributes[1]; -			if (parser->case_folding) { -				key = _php3_strtoupper(estrdup(key)); + +		if (parser->startElementHandler) { +			args[0] = php3i_long_pval(parser->index); +			args[1] = php3i_string_pval(name); +			args[2] = emalloc(sizeof(pval)); +			array_init(args[2]); +			while (attributes && *attributes) { +				char *key = (char *)attributes[0]; +				char *value = (char *)attributes[1]; +				char *decoded_value; +				int decoded_len; +				if (parser->case_folding) { +					key = _php3_strtoupper(estrdup(key)); +				} +				decoded_value = xml_utf8_decode(value, strlen(value), +												&decoded_len, +												parser->target_encoding); +				 +				add_assoc_string(args[2], key, decoded_value, 0); +				if (parser->case_folding) { +					efree(key); +				} +				attributes += 2;  			} -			add_assoc_string(args[2], key, value, 1); -			if (parser->case_folding) { -				efree(key); +			 +			if ((retval = xml_call_handler(parser, parser->startElementHandler, 3, args))) { +				php3tls_pval_destructor(retval); +				efree(retval);  			} -			attributes += 2; -		} -		if ((retval = xml_call_handler(parser, parser->startElementHandler, 3, args))) { -			php3tls_pval_destructor(retval); -			efree(retval); +		}  + +		if (parser->data) { +			pval tag, atr; +			int atcnt = 0; + +			array_init(&tag); +			array_init(&atr); + +			php3i_add_to_info(parser,((char *) name) + parser->toffset); + +			add_assoc_string(&tag,"tag",((char *) name) + parser->toffset,1); /* cast to avoid gcc-warning */ +			add_assoc_string(&tag,"type","open",1); +			add_assoc_long(&tag,"level",parser->level); + +			parser->ltags[parser->level-1] = estrdup(name); +			parser->lastwasopen = 1; + +			attributes = attrs; +			while (attributes && *attributes) { +				char *key = (char *)attributes[0]; +				char *value = (char *)attributes[1]; +				char *decoded_value; +				int decoded_len; +				if (parser->case_folding) { +					key = _php3_strtoupper(estrdup(key)); +				} +				decoded_value = xml_utf8_decode(value, strlen(value), +												&decoded_len, +												parser->target_encoding); +				 +				add_assoc_stringl(&atr,key,decoded_value,decoded_len,0); +				atcnt++; +				if (parser->case_folding) { +					efree(key); +				} +				attributes += 2; +			} + +			if (atcnt) { +				_php3_hash_add(tag.value.ht,"attributes",sizeof("attributes"),&atr,sizeof(pval),NULL); +			} else { +				php3tls_pval_destructor(&atr); +			} + +			_php3_hash_next_index_insert(parser->data->value.ht,&tag,sizeof(pval),(void *) &parser->ctag);  		} +  		if (parser->case_folding) {  			efree((char *)name);  		} @@ -636,21 +731,50 @@ void php3i_xml_endElementHandler(void *userData, const char *name)  	xml_parser *parser = (xml_parser *)userData;  	XML_TLS_VARS; -	if (parser && parser->endElementHandler) { +	if (parser) {  		pval *retval, *args[2];  		if (parser->case_folding) {  			name = _php3_strtoupper(estrdup(name));  		} -		args[0] = php3i_long_pval(parser->index); -		args[1] = php3i_string_pval(name); -		if ((retval = xml_call_handler(parser, parser->endElementHandler, 2, args))) { -			php3tls_pval_destructor(retval); -			efree(retval); + +		if (parser->endElementHandler) { +			args[0] = php3i_long_pval(parser->index); +			args[1] = php3i_string_pval(name); + +			if ((retval = xml_call_handler(parser, parser->endElementHandler, 2, args))) { +				php3tls_pval_destructor(retval); +				efree(retval); +			} +		}  + +		if (parser->data) { +			pval tag; + +			if (parser->lastwasopen) { +				add_assoc_string(parser->ctag,"type","complete",1); +			} else { +				array_init(&tag); +				   +				php3i_add_to_info(parser,((char *) name) + parser->toffset); + +				add_assoc_string(&tag,"tag",((char *) name) + parser->toffset,1); /* cast to avoid gcc-warning */ +				add_assoc_string(&tag,"type","close",1); +				add_assoc_long(&tag,"level",parser->level); +				   +				_php3_hash_next_index_insert(parser->data->value.ht,&tag,sizeof(pval),NULL); +			} + +			parser->lastwasopen = 0;  		} +  		if (parser->case_folding) {  			efree((char *)name);  		} +		if (parser->ltags) { +			efree(parser->ltags[parser->level-1]); +		} +		parser->level--;  	}  } @@ -662,14 +786,60 @@ void php3i_xml_characterDataHandler(void *userData, const XML_Char *s, int len)  	xml_parser *parser = (xml_parser *)userData;  	XML_TLS_VARS; -	if (parser && parser->characterDataHandler) { +	if (parser) {  		pval *retval, *args[2]; -		args[0] = php3i_long_pval(parser->index); -		args[1] = php3i_xmlcharpval(s, len, parser->target_encoding); -		if ((retval = xml_call_handler(parser, parser->characterDataHandler, 2, args))) { -			php3tls_pval_destructor(retval); -			efree(retval); +		if (parser->characterDataHandler) { +			args[0] = php3i_long_pval(parser->index); +			args[1] = php3i_xmlcharpval(s, len, parser->target_encoding); +			if ((retval = xml_call_handler(parser, parser->characterDataHandler, 2, args))) { +				php3tls_pval_destructor(retval); +				efree(retval); +			} +		}  + +		if (parser->data) { +			int i; +			int doprint = 0; + +			char *decoded_value; +			int decoded_len; +			 +			decoded_value = xml_utf8_decode(s,len,&decoded_len,parser->target_encoding); +			for (i = 0; i < decoded_len; i++) { +				switch (decoded_value[i]) { +				case ' ': +				case '\t': +				case '\n': +					continue; +				default: +					doprint = 1; +					break; +				} +				if (doprint) { +					break; +				} +			} +			if (doprint || (! parser->skipwhite)) { +				if (parser->lastwasopen) { +					add_assoc_string(parser->ctag,"value",decoded_value,0); +				} else { +					pval tag; +					 +					array_init(&tag); +					 +					php3i_add_to_info(parser,parser->ltags[parser->level-1] + parser->toffset); + +					add_assoc_string(&tag,"tag",parser->ltags[parser->level-1] + parser->toffset,1); +					add_assoc_string(&tag,"value",decoded_value,0); +					add_assoc_string(&tag,"type","cdata",1); +					add_assoc_long(&tag,"level",parser->level); +					 +					_php3_hash_next_index_insert(parser->data->value.ht,&tag,sizeof(pval),NULL); +				} +			} else { +				efree(decoded_value); +			}  		}  	}  } @@ -813,8 +983,8 @@ php3i_xml_externalEntityRefHandler(XML_Parser parserPtr,  /************************* EXTENSION FUNCTIONS *************************/ -/* {{{ int    xml_parser_create() */ - +/* {{{ proto int xml_parser_create()  +   Create an XML parser */  PHP_FUNCTION(xml_parser_create)  {  	xml_parser *parser; @@ -857,13 +1027,6 @@ PHP_FUNCTION(xml_parser_create)  	parser->parser = XML_ParserCreate(encoding);  	parser->target_encoding = encoding;  	XML_SetUserData(parser->parser, parser); -	XML_SetElementHandler(parser->parser, php3i_xml_startElementHandler, php3i_xml_endElementHandler); -	XML_SetCharacterDataHandler(parser->parser, php3i_xml_characterDataHandler); -	XML_SetProcessingInstructionHandler(parser->parser, php3i_xml_processingInstructionHandler); -	XML_SetDefaultHandler(parser->parser, php3i_xml_defaultHandler); -	XML_SetUnparsedEntityDeclHandler(parser->parser, php3i_xml_unparsedEntityDeclHandler); -	XML_SetNotationDeclHandler(parser->parser, php3i_xml_notationDeclHandler); -	XML_SetExternalEntityRefHandler(parser->parser, php3i_xml_externalEntityRefHandler);  	id = php3_list_insert(parser, XML_GLOBAL(php3_xml_module).le_xml_parser);  	parser = xml_get_parser(id, thisfunc, list);  	parser->index = id; @@ -871,10 +1034,10 @@ PHP_FUNCTION(xml_parser_create)  	RETVAL_LONG(id);  } -  /* }}} */ -/* {{{ int    xml_set_element_handler(int pind, string shdl, string ehdl) */ +/* {{{ proto int xml_set_element_handler(int pind, string shdl, string ehdl)  +   Set up start and end element handlers */  PHP_FUNCTION(xml_set_element_handler)  {  	xml_parser *parser; @@ -894,12 +1057,13 @@ PHP_FUNCTION(xml_set_element_handler)  	}  	xml_set_handler(&parser->startElementHandler, shdl);  	xml_set_handler(&parser->endElementHandler, ehdl); +	XML_SetElementHandler(parser->parser, php3i_xml_startElementHandler, php3i_xml_endElementHandler);  	RETVAL_TRUE;  } -  /* }}} */ -/* {{{ int    xml_set_character_data_handler(int pind, string hdl) */ +/* {{{ proto int xml_set_character_data_handler(int pind, string hdl)  +   Set up character data handler */  PHP_FUNCTION(xml_set_character_data_handler)  {  	xml_parser *parser; @@ -916,12 +1080,13 @@ PHP_FUNCTION(xml_set_character_data_handler)  		RETURN_FALSE;  	}  	xml_set_handler(&parser->characterDataHandler, hdl); +	XML_SetCharacterDataHandler(parser->parser, php3i_xml_characterDataHandler);  	RETVAL_TRUE;  } -  /* }}} */ -/* {{{ int    xml_set_processing_instruction_handler(int pind, string hdl) */ +/* {{{ proto int xml_set_processing_instruction_handler(int pind, string hdl)  +   Set up processing instruction (PI) handler */  PHP_FUNCTION(xml_set_processing_instruction_handler)  {  	xml_parser *parser; @@ -938,12 +1103,13 @@ PHP_FUNCTION(xml_set_processing_instruction_handler)  		RETURN_FALSE;  	}  	xml_set_handler(&parser->processingInstructionHandler, hdl); +	XML_SetProcessingInstructionHandler(parser->parser, php3i_xml_processingInstructionHandler);  	RETVAL_TRUE;  } -  /* }}} */ -/* {{{ int    xml_set_default_handler(int pind, string hdl) */ +/* {{{ proto int xml_set_default_handler(int pind, string hdl)  +   Set up default handler */  PHP_FUNCTION(xml_set_default_handler)  {  	xml_parser *parser; @@ -960,12 +1126,13 @@ PHP_FUNCTION(xml_set_default_handler)  		RETURN_FALSE;  	}  	xml_set_handler(&parser->defaultHandler, hdl); +	XML_SetDefaultHandler(parser->parser, php3i_xml_defaultHandler);  	RETVAL_TRUE;  } -  /* }}} */ -/* {{{ int    xml_set_unparsed_entity_decl_handler(int pind, string hdl) */ +/* {{{ proto int xml_set_unparsed_entity_decl_handler(int pind, string hdl)  +   Set up unparsed entity declaration handler */  PHP_FUNCTION(xml_set_unparsed_entity_decl_handler)  {  	xml_parser *parser; @@ -982,12 +1149,13 @@ PHP_FUNCTION(xml_set_unparsed_entity_decl_handler)  		RETURN_FALSE;  	}  	xml_set_handler(&parser->unparsedEntityDeclHandler, hdl); +	XML_SetUnparsedEntityDeclHandler(parser->parser, php3i_xml_unparsedEntityDeclHandler);  	RETVAL_TRUE;  } -  /* }}} */ -/* {{{ int    xml_set_notation_decl_handler(int pind, string hdl) */ +/* {{{ proto int xml_set_notation_decl_handler(int pind, string hdl)  +   Set up notation declaration handler */  PHP_FUNCTION(xml_set_notation_decl_handler)  {  	xml_parser *parser; @@ -1004,12 +1172,13 @@ PHP_FUNCTION(xml_set_notation_decl_handler)  		RETURN_FALSE;  	}  	xml_set_handler(&parser->notationDeclHandler, hdl); +	XML_SetNotationDeclHandler(parser->parser, php3i_xml_notationDeclHandler);  	RETVAL_TRUE;  } -  /* }}} */ -/* {{{ int    xml_set_external_entity_ref_handler(int pind, string hdl) */ +/* {{{ proto int xml_set_external_entity_ref_handler(int pind, string hdl)  +   Set up external entity reference handler */  PHP_FUNCTION(xml_set_external_entity_ref_handler)  {  	xml_parser *parser; @@ -1026,12 +1195,13 @@ PHP_FUNCTION(xml_set_external_entity_ref_handler)  		RETURN_FALSE;  	}  	xml_set_handler(&parser->externalEntityRefHandler, hdl); +	XML_SetExternalEntityRefHandler(parser->parser, php3i_xml_externalEntityRefHandler);  	RETVAL_TRUE;  } -  /* }}} */ -/* {{{ int    xml_parse(int pind, string data[, int isFinal]) */ +/* {{{ proto int xml_parse(int pind, string data[, int isFinal])  +   Start parsing an XML document */  PHP_FUNCTION(xml_parse)  {  	xml_parser *parser; @@ -1055,14 +1225,64 @@ PHP_FUNCTION(xml_parse)  	if (parser == NULL) {  		RETURN_FALSE;  	} -	fflush(stdout); +	/* fflush(stdout); uups, that can't be serious?!?!?*/  	ret = XML_Parse(parser->parser, data->value.str.val, data->value.str.len, isFinal);  	RETVAL_LONG(ret);  }  /* }}} */ -/* {{{ int    xml_get_error_code(int pind) */ +/* {{{ proto int xml_parse_into_struct(int pind, string data,array &struct,array &index)  +   Parsing a XML document */ + +PHP_FUNCTION(xml_parse_into_struct) +{ +	xml_parser *parser; +	pval *pind, *data, *xdata,*info = 0; +	int argc, ret; +	XML_TLS_VARS; + +	argc = ARG_COUNT(ht); +	if (getParameters(ht, 4, &pind, &data, &xdata,&info) == SUCCESS) { +		if (!ParameterPassedByReference(ht, 4)) { +			php3_error(E_WARNING, "Array to be filled with values must be passed by reference."); +            RETURN_FALSE; +		} +		array_init(info); +	} else if (getParameters(ht, 3, &pind, &data, &xdata) == FAILURE) { +		WRONG_PARAM_COUNT; +	} + +	if (!ParameterPassedByReference(ht, 3)) { +		php3_error(E_WARNING, "Array to be filled with values must be passed by reference."); +		RETURN_FALSE; +	} + +	convert_to_long(pind); +	convert_to_string(data); +	array_init(xdata); + +	parser = xml_get_parser(pind->value.lval, "XML_Parse_Into_Struct", list); +	if (parser == NULL) { +		RETURN_FALSE; +	} + +	parser->data = xdata; +	parser->info = info; +	parser->level = 0; +	parser->ltags = emalloc(XML_MAXLEVEL * sizeof(char *)); + +	XML_SetDefaultHandler(parser->parser, php3i_xml_defaultHandler); +	XML_SetElementHandler(parser->parser, php3i_xml_startElementHandler, php3i_xml_endElementHandler); +	XML_SetCharacterDataHandler(parser->parser, php3i_xml_characterDataHandler); + +	ret = XML_Parse(parser->parser, data->value.str.val, data->value.str.len, 1); + +	RETVAL_LONG(ret); +} +/* }}} */ +/* {{{ proto int xml_get_error_code(int pind)  +   Get XML parser error code */  PHP_FUNCTION(xml_get_error_code)  {  	xml_parser *parser; @@ -1079,10 +1299,10 @@ PHP_FUNCTION(xml_get_error_code)  	}  	RETVAL_LONG((long)XML_GetErrorCode(parser->parser));  } -  /* }}} */ -/* {{{ string xml_error_string(int code) */ +/* {{{ proto string xml_error_string(int code) +   Get XML parser error string */  PHP_FUNCTION(xml_error_string)  {  	pval *code; @@ -1098,10 +1318,10 @@ PHP_FUNCTION(xml_error_string)  		RETVAL_STRING(str, 1);  	}  } -  /* }}} */ -/* {{{ int    xml_get_current_line_number(int pind) */ +/* {{{ proto int xml_get_current_line_number(int pind)  +   Get current line number for an XML parser */  PHP_FUNCTION(xml_get_current_line_number)  {  	xml_parser *parser; @@ -1118,10 +1338,11 @@ PHP_FUNCTION(xml_get_current_line_number)  	}  	RETVAL_LONG(XML_GetCurrentLineNumber(parser->parser));  } -  /* }}} */ -/* {{{ int    xml_get_current_column_number(int pind) */ +/* {{{ proto int xml_get_current_column_number(int pind) +   Get current column number for an XML parser +*/  PHP_FUNCTION(xml_get_current_column_number)  {  	xml_parser *parser; @@ -1138,10 +1359,10 @@ PHP_FUNCTION(xml_get_current_column_number)  	}  	RETVAL_LONG(XML_GetCurrentColumnNumber(parser->parser));  } -  /* }}} */ -/* {{{ int    xml_get_current_byte_index(int pind) */ +/* {{{ proto int xml_get_current_byte_index(int pind)  +   Get current byte index for an XML parser */  PHP_FUNCTION(xml_get_current_byte_index)  {  	xml_parser *parser; @@ -1158,10 +1379,10 @@ PHP_FUNCTION(xml_get_current_byte_index)  	}  	RETVAL_LONG(XML_GetCurrentByteIndex(parser->parser));  } -  /* }}} */ -/* {{{ int    xml_parser_free(int pind) */ +/* {{{ proto int xml_parser_free(int pind)  +   Free an XML parser */  PHP_FUNCTION(xml_parser_free)  {  	pval *pind; @@ -1176,10 +1397,10 @@ PHP_FUNCTION(xml_parser_free)  	}  	RETVAL_TRUE;  } -  /* }}} */ -/* {{{ int    xml_parser_set_option(int pind, int option, mixed value) */ +/* {{{ proto int xml_parser_set_option(int pind, int option, mixed value)  +   Set options in an XML parser */  PHP_FUNCTION(xml_parser_set_option)  {  	xml_parser *parser; @@ -1201,6 +1422,14 @@ PHP_FUNCTION(xml_parser_set_option)  			convert_to_long(val);  			parser->case_folding = val->value.lval;  			break; +		case PHP3_XML_OPTION_SKIP_TAGSTART: +			convert_to_long(val); +			parser->toffset = val->value.lval; +			break; +		case PHP3_XML_OPTION_SKIP_WHITE: +			convert_to_long(val); +			parser->skipwhite = val->value.lval; +			break;  		case PHP3_XML_OPTION_TARGET_ENCODING: {  			xml_encoding *enc = xml_get_encoding(val->value.str.val);  			if (enc == NULL) { @@ -1218,10 +1447,10 @@ PHP_FUNCTION(xml_parser_set_option)  	}  	RETVAL_TRUE;  } -  /* }}} */ -/* {{{ int    xml_parser_get_option(int pind, int option) */ +/* {{{ proto int xml_parser_get_option(int pind, int option)  +   Get options from an XML parser */  PHP_FUNCTION(xml_parser_get_option)  {  	xml_parser *parser; @@ -1252,10 +1481,10 @@ PHP_FUNCTION(xml_parser_get_option)  	}  	RETVAL_FALSE;  } -  /* }}} */ -/* {{{ string utf8_encode(string data) */ +/* {{{ proto string utf8_encode(string data)  +   Encodes an ISO-8859-1 string to UTF-8 */  PHP_FUNCTION(utf8_encode)  {  	pval *arg; @@ -1273,10 +1502,10 @@ PHP_FUNCTION(utf8_encode)  	}  	RETVAL_STRINGL(encoded, len, 0);  } -  /* }}} */ -/* {{{ string utf8_decode(string data) */ +/* {{{ proto string utf8_decode(string data)  +   Converts a UTF-8 encoded string to ISO-8859-1 */  PHP_FUNCTION(utf8_decode)  {  	pval *arg; @@ -1294,7 +1523,6 @@ PHP_FUNCTION(utf8_decode)  	}  	RETVAL_STRINGL(decoded, len, 0);  } -  /* }}} */  #endif  | 
