cvs: php4 /ext/xml php_xml.h xml.c
| From: | Andrei Zmievski | Date: | Tue, 22 Aug 2000 19:32:07 +0000 |
| Subject: | cvs: php4 /ext/xml php_xml.h xml.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-1329@lists.php.net to get a copy of this message | ||
andrei Tue Aug 22 12:32:07 2000 EDT
Modified files:
/php4/ext/xml php_xml.h xml.c
Log:
@- Added ability for each xml_set_*_handler() function to take the
@ array($obj, 'method') syntax for the handler argument as well
@ as the normal function name. (Andrei)
Index: php4/ext/xml/php_xml.h
diff -u php4/ext/xml/php_xml.h:1.12 php4/ext/xml/php_xml.h:1.13
--- php4/ext/xml/php_xml.h:1.12 Sun Jul 2 16:46:49 2000
+++ php4/ext/xml/php_xml.h Tue Aug 22 12:32:07 2000
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_xml.h,v 1.12 2000/07/02 23:46:49 sas Exp $ */
+/* $Id: php_xml.h,v 1.13 2000/08/22 19:32:07 andrei Exp $ */
#ifndef PHP_XML_H
#define PHP_XML_H
@@ -58,15 +58,15 @@
int case_folding;
XML_Parser parser;
XML_Char *target_encoding;
- char *startElementHandler;
- char *endElementHandler;
- char *characterDataHandler;
- char *processingInstructionHandler;
- char *defaultHandler;
- char *unparsedEntityDeclHandler;
- char *notationDeclHandler;
- char *externalEntityRefHandler;
- char *unknownEncodingHandler;
+ zval *startElementHandler;
+ zval *endElementHandler;
+ zval *characterDataHandler;
+ zval *processingInstructionHandler;
+ zval *defaultHandler;
+ zval *unparsedEntityDeclHandler;
+ zval *notationDeclHandler;
+ zval *externalEntityRefHandler;
+ zval *unknownEncodingHandler;
zval *object;
Index: php4/ext/xml/xml.c
diff -u php4/ext/xml/xml.c:1.59 php4/ext/xml/xml.c:1.60
--- php4/ext/xml/xml.c:1.59 Sun Aug 20 08:59:54 2000
+++ php4/ext/xml/xml.c Tue Aug 22 12:32:07 2000
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: xml.c,v 1.59 2000/08/20 15:59:54 stas Exp $ */
+/* $Id: xml.c,v 1.60 2000/08/22 19:32:07 andrei Exp $ */
#define IS_EXT_MODULE
#include "php.h"
@@ -70,13 +70,13 @@
PHP_MINFO_FUNCTION(xml);
static void xml_parser_dtor(xml_parser *);
-static void xml_set_handler(char **, zval **);
+static void xml_set_handler(zval **, zval **);
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(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 zval *xml_call_handler(xml_parser *, char *, int, zval **);
+static zval *xml_call_handler(xml_parser *, zval *, int, zval **);
static zval *_xml_xmlchar_zval(const XML_Char *, int, const XML_Char *);
static int _xml_xmlcharlen(const XML_Char *);
static void _xml_add_to_info(xml_parser *parser,char *name);
@@ -295,31 +295,31 @@
efree(parser->ltags);
}
if (parser->startElementHandler) {
- efree(parser->startElementHandler);
+ zval_del_ref(&parser->startElementHandler);
}
if (parser->endElementHandler) {
- efree(parser->endElementHandler);
+ zval_del_ref(&parser->endElementHandler);
}
if (parser->characterDataHandler) {
- efree(parser->characterDataHandler);
+ zval_del_ref(&parser->characterDataHandler);
}
if (parser->processingInstructionHandler) {
- efree(parser->processingInstructionHandler);
+ zval_del_ref(&parser->processingInstructionHandler);
}
if (parser->defaultHandler) {
- efree(parser->defaultHandler);
+ zval_del_ref(&parser->defaultHandler);
}
if (parser->unparsedEntityDeclHandler) {
- efree(parser->unparsedEntityDeclHandler);
+ zval_del_ref(&parser->unparsedEntityDeclHandler);
}
if (parser->notationDeclHandler) {
- efree(parser->notationDeclHandler);
+ zval_del_ref(&parser->notationDeclHandler);
}
if (parser->externalEntityRefHandler) {
- efree(parser->externalEntityRefHandler);
+ zval_del_ref(&parser->externalEntityRefHandler);
}
if (parser->unknownEncodingHandler) {
- efree(parser->unknownEncodingHandler);
+ zval_del_ref(&parser->unknownEncodingHandler);
}
if (parser->baseURI) {
efree(parser->baseURI);
@@ -332,52 +332,53 @@
/* {{{ xml_set_handler() */
static void
-xml_set_handler(char **nameBufp, zval **data)
+xml_set_handler(zval **handler, zval **data)
{
- convert_to_string_ex(data);
-
- if ((*data)->value.str.len > 0) {
- if (*nameBufp != NULL) {
- efree(*nameBufp);
- }
- *nameBufp = estrndup((*data)->value.str.val, (*data)->value.str.len);
- } else {
- if (*nameBufp != NULL) {
- efree(*nameBufp);
- }
- *nameBufp = NULL;
+ /* IS_ARRAY might indicate that we're using array($obj, 'method') syntax */
+ if (Z_TYPE_PP(data) != IS_ARRAY) {
+ convert_to_string_ex(data);
}
+
+ zval_add_ref(data);
+ *handler = *data;
}
/* }}} */
/* {{{ xml_call_handler() */
static zval *
-xml_call_handler(xml_parser *parser, char *funcName, int argc, zval **argv)
+xml_call_handler(xml_parser *parser, zval *handler, int argc, zval **argv)
{
ELS_FETCH();
- if (parser && funcName) {
- zval *retval, *func;
+ if (parser && handler) {
+ zval *retval;
int i;
int result;
- func = _xml_string_zval(funcName);
-
MAKE_STD_ZVAL(retval);
retval->type = IS_BOOL;
retval->value.lval = 0;
- result = call_user_function(EG(function_table), parser->object, func, retval, argc, argv);
+ result = call_user_function(EG(function_table), parser->object, handler, retval, argc, argv);
if (result == FAILURE) {
- php_error(E_WARNING, "Unable to call %s()",funcName);
+ zval **method;
+ zval **obj;
+
+ if (Z_TYPE_P(handler) == IS_STRING) {
+ php_error(E_WARNING, "Unable to call handler %s()", Z_STRVAL_P(handler));
+ } else if (zend_hash_index_find(handler->value.ht, 0, (void **) &obj) == SUCCESS
&&
+ zend_hash_index_find(handler->value.ht, 1, (void **) &method) == SUCCESS &&
+ Z_TYPE_PP(obj) == IS_OBJECT &&
+ Z_TYPE_PP(method) == IS_STRING) {
+ php_error(E_WARNING, "Unable to call handler %s::%s()",
(*obj)->value.obj.ce->name, Z_STRVAL_PP(method));
+ } else
+ php_error(E_WARNING, "Unable to call handler");
zval_dtor(retval);
efree(retval);
}
-
- zval_del_ref(&func);
for (i = 0; i < argc; i++) {
zval_del_ref(&(argv[i]));