diff options
author | Thies C. Arntzen <thies@php.net> | 1999-12-05 16:43:42 +0000 |
---|---|---|
committer | Thies C. Arntzen <thies@php.net> | 1999-12-05 16:43:42 +0000 |
commit | f17f3e4fa145d5b358bef68bd77e142fbc4394c2 (patch) | |
tree | 13c1d6f486073eeabe7b83cb2aaa99ffc25bbb28 /ext/xml/xml.c | |
parent | d9a86285f6a64c2298dfcf9ba42a1e72e3ee6caa (diff) | |
download | php-git-f17f3e4fa145d5b358bef68bd77e142fbc4394c2.tar.gz |
@- added XML_Set_Object() function, now you can use the XML-Parser from
@ within an object. (Thies)
(XML_Set_Object) new function.
Diffstat (limited to 'ext/xml/xml.c')
-rw-r--r-- | ext/xml/xml.c | 62 |
1 files changed, 53 insertions, 9 deletions
diff --git a/ext/xml/xml.c b/ext/xml/xml.c index 8886979bc0..047a0117d9 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -70,7 +70,7 @@ PHP_MSHUTDOWN_FUNCTION(xml); PHP_RSHUTDOWN_FUNCTION(xml); PHP_MINFO_FUNCTION(xml); -static void xml_destroy_parser(xml_parser *); +static void xml_parser_dtor(xml_parser *); static void xml_set_handler(char **, zval **); inline static unsigned short xml_encode_iso_8859_1(unsigned char); inline static char xml_decode_iso_8859_1(unsigned short); @@ -98,6 +98,7 @@ int _xml_externalEntityRefHandler(XML_Parser, const XML_Char *, const XML_Char function_entry xml_functions[] = { PHP_FE(xml_parser_create, NULL) + PHP_FE(xml_set_object, NULL) PHP_FE(xml_set_element_handler, NULL) PHP_FE(xml_set_character_data_handler, NULL) PHP_FE(xml_set_processing_instruction_handler, NULL) @@ -161,7 +162,7 @@ PHP_MINIT_FUNCTION(xml) ELS_FETCH(); - le_xml_parser = register_list_destructors(xml_destroy_parser, NULL); + le_xml_parser = register_list_destructors(xml_parser_dtor, NULL); #ifdef ZTS xml_globals_id = ts_allocate_id(sizeof(php_xml_globals), php_xml_init_globals, NULL); @@ -281,11 +282,18 @@ static zval *_xml_xmlchar_zval(const XML_Char *s, int len, const XML_Char *encod /* }}} */ -/* {{{ xml_destroy_parser() */ +/* {{{ xml_parser_dtor() */ static void -xml_destroy_parser(xml_parser *parser) +xml_parser_dtor(xml_parser *parser) { + + if (parser->object) { +/* + zval_del_ref(&parser->object); +*/ + } + if (parser->parser) { XML_ParserFree(parser->parser); } @@ -369,11 +377,7 @@ xml_call_handler(xml_parser *parser, char *funcName, int argc, zval **argv) retval->type = IS_BOOL; retval->value.lval = 0; - /* We cannot call internal variables from a function module as - it breaks any chance of compiling it as a module on windows. - Instead, we create a callback function. */ - - result = call_user_function(EG(function_table), NULL, func, retval, argc, argv); + result = call_user_function(EG(function_table), parser->object, func, retval, argc, argv); if (result == FAILURE) { php_error(E_WARNING, "Unable to call %s()",funcName); @@ -1026,6 +1030,7 @@ PHP_FUNCTION(xml_parser_create) parser->parser = XML_ParserCreate(encoding); 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); @@ -1033,6 +1038,45 @@ PHP_FUNCTION(xml_parser_create) } /* }}} */ +/* {{{ proto int xml_set_object(int pind,object &obj) + Set up object which should be used for callbacks */ +PHP_FUNCTION(xml_set_object) +{ + xml_parser *parser; + zval **pind, **mythis; + + if (ARG_COUNT(ht) != 2 || + getParametersEx(2, &pind, &mythis) == FAILURE) { + WRONG_PARAM_COUNT; + } + + if ((*mythis)->type != IS_OBJECT) { + php_error(E_WARNING,"arg 2 has wrong type"); + RETURN_FALSE; + } + + if (! ParameterPassedByReference(ht,2)) { + php_error(E_WARNING,"arg 2 not passed by reference"); + RETURN_FALSE; + } + + ZEND_FETCH_RESOURCE(parser,xml_parser *,pind, -1, "XML Parser", le_xml_parser); + + if (parser->object) { +/* + zval_del_ref(&parser->object); +*/ + } + + parser->object = *mythis; +/* + zval_add_ref(&parser->object); +*/ + + RETVAL_TRUE; +} +/* }}} */ + /* {{{ 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) |