@@ -70,7 +70,7 @@ PHP_MSHUTDOWN_FUNCTION(xml);
70
70
PHP_RSHUTDOWN_FUNCTION (xml );
71
71
PHP_MINFO_FUNCTION (xml );
72
72
73
- static void xml_destroy_parser (xml_parser * );
73
+ static void xml_parser_dtor (xml_parser * );
74
74
static void xml_set_handler (char * * , zval * * );
75
75
inline static unsigned short xml_encode_iso_8859_1 (unsigned char );
76
76
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
98
98
99
99
function_entry xml_functions [] = {
100
100
PHP_FE (xml_parser_create , NULL )
101
+ PHP_FE (xml_set_object , NULL )
101
102
PHP_FE (xml_set_element_handler , NULL )
102
103
PHP_FE (xml_set_character_data_handler , NULL )
103
104
PHP_FE (xml_set_processing_instruction_handler , NULL )
@@ -161,7 +162,7 @@ PHP_MINIT_FUNCTION(xml)
161
162
162
163
ELS_FETCH ();
163
164
164
- le_xml_parser = register_list_destructors (xml_destroy_parser , NULL );
165
+ le_xml_parser = register_list_destructors (xml_parser_dtor , NULL );
165
166
166
167
#ifdef ZTS
167
168
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
281
282
282
283
/* }}} */
283
284
284
- /* {{{ xml_destroy_parser () */
285
+ /* {{{ xml_parser_dtor () */
285
286
286
287
static void
287
- xml_destroy_parser (xml_parser * parser )
288
+ xml_parser_dtor (xml_parser * parser )
288
289
{
290
+
291
+ if (parser -> object ) {
292
+ /*
293
+ zval_del_ref(&parser->object);
294
+ */
295
+ }
296
+
289
297
if (parser -> parser ) {
290
298
XML_ParserFree (parser -> parser );
291
299
}
@@ -369,11 +377,7 @@ xml_call_handler(xml_parser *parser, char *funcName, int argc, zval **argv)
369
377
retval -> type = IS_BOOL ;
370
378
retval -> value .lval = 0 ;
371
379
372
- /* We cannot call internal variables from a function module as
373
- it breaks any chance of compiling it as a module on windows.
374
- Instead, we create a callback function. */
375
-
376
- result = call_user_function (EG (function_table ), NULL , func , retval , argc , argv );
380
+ result = call_user_function (EG (function_table ), parser -> object , func , retval , argc , argv );
377
381
378
382
if (result == FAILURE ) {
379
383
php_error (E_WARNING , "Unable to call %s()" ,funcName );
@@ -1026,13 +1030,53 @@ PHP_FUNCTION(xml_parser_create)
1026
1030
parser -> parser = XML_ParserCreate (encoding );
1027
1031
parser -> target_encoding = encoding ;
1028
1032
parser -> case_folding = 1 ;
1033
+ parser -> object = NULL ;
1029
1034
XML_SetUserData (parser -> parser , parser );
1030
1035
1031
1036
ZEND_REGISTER_RESOURCE (return_value ,parser ,le_xml_parser );
1032
1037
parser -> index = return_value -> value .lval ;
1033
1038
}
1034
1039
/* }}} */
1035
1040
1041
+ /* {{{ proto int xml_set_object(int pind,object &obj)
1042
+ Set up object which should be used for callbacks */
1043
+ PHP_FUNCTION (xml_set_object )
1044
+ {
1045
+ xml_parser * parser ;
1046
+ zval * * pind , * * mythis ;
1047
+
1048
+ if (ARG_COUNT (ht ) != 2 ||
1049
+ getParametersEx (2 , & pind , & mythis ) == FAILURE ) {
1050
+ WRONG_PARAM_COUNT ;
1051
+ }
1052
+
1053
+ if ((* mythis )-> type != IS_OBJECT ) {
1054
+ php_error (E_WARNING ,"arg 2 has wrong type" );
1055
+ RETURN_FALSE ;
1056
+ }
1057
+
1058
+ if (! ParameterPassedByReference (ht ,2 )) {
1059
+ php_error (E_WARNING ,"arg 2 not passed by reference" );
1060
+ RETURN_FALSE ;
1061
+ }
1062
+
1063
+ ZEND_FETCH_RESOURCE (parser ,xml_parser * ,pind , -1 , "XML Parser" , le_xml_parser );
1064
+
1065
+ if (parser -> object ) {
1066
+ /*
1067
+ zval_del_ref(&parser->object);
1068
+ */
1069
+ }
1070
+
1071
+ parser -> object = * mythis ;
1072
+ /*
1073
+ zval_add_ref(&parser->object);
1074
+ */
1075
+
1076
+ RETVAL_TRUE ;
1077
+ }
1078
+ /* }}} */
1079
+
1036
1080
/* {{{ proto int xml_set_element_handler(int pind, string shdl, string ehdl)
1037
1081
Set up start and end element handlers */
1038
1082
PHP_FUNCTION (xml_set_element_handler )
0 commit comments