diff options
| author | Mark A. Hershberger <mah@debian.(none)> | 2009-03-25 00:35:28 -0400 |
|---|---|---|
| committer | Mark A. Hershberger <mah@debian.(none)> | 2009-03-25 00:35:28 -0400 |
| commit | ba50031707469046407a35b77a3cd81351e951b3 (patch) | |
| tree | 5c03e723bdbfabae09d41a3ab1253dff41eeed4a /ext/xmlreader | |
| parent | 0a36161e13484a99ccf69bb38f206462d27cc6d6 (diff) | |
| download | php-ba50031707469046407a35b77a3cd81351e951b3.tar.gz | |
Imported Upstream version 5.1.5upstream/5.1.5
Diffstat (limited to 'ext/xmlreader')
| -rw-r--r-- | ext/xmlreader/php_xmlreader.c | 79 | ||||
| -rw-r--r-- | ext/xmlreader/tests/011.phpt | 34 | ||||
| -rwxr-xr-x | ext/xmlreader/tests/012.dtd | 2 | ||||
| -rwxr-xr-x | ext/xmlreader/tests/012.phpt | 69 | ||||
| -rwxr-xr-x | ext/xmlreader/tests/012.xml | 3 | ||||
| -rw-r--r-- | ext/xmlreader/tests/bug36743.phpt | 25 |
6 files changed, 199 insertions, 13 deletions
diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index d70fb9d93..1f764b49d 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_xmlreader.c,v 1.13.2.8 2006/01/01 12:50:16 sniper Exp $ */ +/* $Id: php_xmlreader.c,v 1.13.2.14 2006/04/03 14:59:30 tony2001 Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -110,6 +110,40 @@ static int xmlreader_property_reader(xmlreader_object *obj, xmlreader_prop_handl } /* }}} */ +/* {{{ xmlreader_get_property_ptr_ptr */ +zval **xmlreader_get_property_ptr_ptr(zval *object, zval *member TSRMLS_DC) +{ + xmlreader_object *obj; + zval tmp_member; + zval **retval = NULL; + xmlreader_prop_handler *hnd; + zend_object_handlers *std_hnd; + int ret = FAILURE; + + if (member->type != IS_STRING) { + tmp_member = *member; + zval_copy_ctor(&tmp_member); + convert_to_string(&tmp_member); + member = &tmp_member; + } + + obj = (xmlreader_object *)zend_objects_get_address(object TSRMLS_CC); + + if (obj->prop_handler != NULL) { + ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd); + } + if (ret == FAILURE) { + std_hnd = zend_get_std_object_handlers(); + retval = std_hnd->get_property_ptr_ptr(object, member TSRMLS_CC); + } + + if (member == &tmp_member) { + zval_dtor(member); + } + return retval; +} +/* }}} */ + /* {{{ xmlreader_read_property */ zval *xmlreader_read_property(zval *object, zval *member, int type TSRMLS_DC) { @@ -343,9 +377,20 @@ void xmlreader_objects_free_storage(void *object TSRMLS_DC) { xmlreader_object *intern = (xmlreader_object *)object; - zend_hash_destroy(intern->std.properties); - FREE_HASHTABLE(intern->std.properties); - +#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION == 1 && PHP_RELEASE_VERSION > 2) || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) + zend_object_std_dtor(&intern->std TSRMLS_CC); +#else + if (intern->std.guards) { + zend_hash_destroy(intern->std.guards); + FREE_HASHTABLE(intern->std.guards); + } + + if (intern->std.properties) { + zend_hash_destroy(intern->std.properties); + FREE_HASHTABLE(intern->std.properties); + } +#endif + xmlreader_free_resources(intern); efree(object); @@ -360,15 +405,21 @@ zend_object_value xmlreader_objects_new(zend_class_entry *class_type TSRMLS_DC) zval *tmp; intern = emalloc(sizeof(xmlreader_object)); - intern->std.ce = class_type; - intern->std.guards = NULL; intern->ptr = NULL; intern->input = NULL; intern->schema = NULL; intern->prop_handler = &xmlreader_prop_handlers; +#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION == 1 && PHP_RELEASE_VERSION > 2) || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) + zend_object_std_init(&intern->std, class_type TSRMLS_CC); +#else ALLOC_HASHTABLE(intern->std.properties); zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + + intern->std.ce = class_type; + intern->std.guards = NULL; +#endif + zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) xmlreader_objects_free_storage, xmlreader_objects_clone TSRMLS_CC); intern->handle = retval.handle; @@ -405,7 +456,7 @@ static void php_xmlreader_string_arg(INTERNAL_FUNCTION_PARAMETERS, xmlreader_rea xmlFree(retchar); return; } else { - RETVAL_EMPTY_STRING(); + RETVAL_NULL(); } } /* }}} */ @@ -537,7 +588,7 @@ Get value of an attribute at index from current element */ PHP_METHOD(xmlreader, getAttributeNo) { zval *id; - int attr_pos; + long attr_pos; char *retchar = NULL; xmlreader_object *intern; @@ -600,7 +651,8 @@ Indicates whether given property (one of the parser option constants) is set or PHP_METHOD(xmlreader, getParserProperty) { zval *id; - int property, retval = -1; + long property; + int retval = -1; xmlreader_object *intern; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &property) == FAILURE) { @@ -678,7 +730,8 @@ Returns TRUE on success and FALSE on failure */ PHP_METHOD(xmlreader, moveToAttributeNo) { zval *id; - int attr_pos, retval; + long attr_pos; + int retval; xmlreader_object *intern; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &attr_pos) == FAILURE) { @@ -829,7 +882,7 @@ PHP_METHOD(xmlreader, open) { zval *id; int source_len = 0; - xmlreader_object *intern; + xmlreader_object *intern = NULL; char *source, *valid_file = NULL; char resolved_path[MAXPATHLEN + 1]; xmlTextReaderPtr reader = NULL; @@ -951,7 +1004,7 @@ PHP_METHOD(xmlreader, XML) { zval *id; int source_len = 0; - xmlreader_object *intern; + xmlreader_object *intern = NULL; char *source, *uri = NULL; int resolved_path_len; char *directory=NULL, resolved_path[MAXPATHLEN]; @@ -1096,7 +1149,7 @@ PHP_MINIT_FUNCTION(xmlreader) memcpy(&xmlreader_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); xmlreader_object_handlers.read_property = xmlreader_read_property; xmlreader_object_handlers.write_property = xmlreader_write_property; - xmlreader_object_handlers.get_property_ptr_ptr = NULL; + xmlreader_object_handlers.get_property_ptr_ptr = xmlreader_get_property_ptr_ptr; INIT_CLASS_ENTRY(ce, "XMLReader", xmlreader_functions); ce.create_object = xmlreader_objects_new; diff --git a/ext/xmlreader/tests/011.phpt b/ext/xmlreader/tests/011.phpt new file mode 100644 index 000000000..be31bbe47 --- /dev/null +++ b/ext/xmlreader/tests/011.phpt @@ -0,0 +1,34 @@ +--TEST-- +XMLReader: libxml2 XML Reader, string data +--SKIPIF-- +<?php if (!extension_loaded("xmlreader")) print "skip"; +$reader = new XMLReader(); +if (!method_exists($reader, 'readInnerXml')) print "skip"; +?> +--FILE-- +<?php +/* $Id: 011.phpt,v 1.2.2.2 2006/03/30 21:47:21 helly Exp $ */ + +$xmlstring = '<?xml version="1.0" encoding="UTF-8"?> +<books><book>test</book></books>'; + +$reader = new XMLReader(); +$reader->XML($xmlstring); +$reader->read(); +echo $reader->readInnerXml(); +echo "\n"; +$reader->close(); + + +$reader = new XMLReader(); +$reader->XML($xmlstring); +$reader->read(); +echo $reader->readOuterXml(); +echo "\n"; +$reader->close(); +?> +===DONE=== +--EXPECT-- +<book>test</book> +<books><book>test</book></books> +===DONE=== diff --git a/ext/xmlreader/tests/012.dtd b/ext/xmlreader/tests/012.dtd new file mode 100755 index 000000000..b65412af0 --- /dev/null +++ b/ext/xmlreader/tests/012.dtd @@ -0,0 +1,2 @@ +<!ELEMENT foo EMPTY> +<!ATTLIST foo bar CDATA '' baz CDATA ''> diff --git a/ext/xmlreader/tests/012.phpt b/ext/xmlreader/tests/012.phpt new file mode 100755 index 000000000..ccd9d3b0b --- /dev/null +++ b/ext/xmlreader/tests/012.phpt @@ -0,0 +1,69 @@ +--TEST-- +XMLReader: accessing empty and non existing attributes +--SKIPIF-- +<?php if (!extension_loaded("xmlreader")) print "skip"; ?> +--FILE-- +<?php +/* $Id: 012.phpt,v 1.1.2.2 2006/03/30 21:47:21 helly Exp $ */ + +$xmlstring =<<<EOF +<?xml version="1.0" encoding="UTF-8"?> +<foo bar=""/> +EOF; + +$reader = new XMLReader(); +$reader->XML($xmlstring); +$reader->read(); +var_dump($reader->getAttribute('bar')); +var_dump($reader->getAttribute('baz')); +$reader->close(); + +$xmlstring =<<<EOF +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE foo SYSTEM "012.dtd"> +<foo bar=""/> +EOF; + +$xmlstring = str_replace('012.dtd', dirname(__FILE__).'/012.dtd', $xmlstring); + +$reader = new XMLReader(); +$reader->XML($xmlstring); +$reader->setParserProperty(XMLReader::DEFAULTATTRS, true); +while($reader->read() && $reader->nodeType != XMLReader::ELEMENT); +var_dump($reader->getAttribute('bar')); +var_dump($reader->getAttribute('baz')); +$reader->close(); + +?> +===FILE=== +<?php + +$reader = new XMLReader(); +$reader->open(dirname(__FILE__) . '/012.xml'); +//$reader->setParserProperty(XMLReader::DEFAULTATTRS, true); +while($reader->read() && $reader->nodeType != XMLReader::ELEMENT); +var_dump($reader->getAttribute('bar')); +var_dump($reader->getAttribute('baz')); +$reader->close(); + +$reader = new XMLReader(); +$reader->open(dirname(__FILE__) . '/012.xml'); +$reader->setParserProperty(XMLReader::DEFAULTATTRS, true); +while($reader->read() && $reader->nodeType != XMLReader::ELEMENT); +var_dump($reader->getAttribute('bar')); +var_dump($reader->getAttribute('baz')); +$reader->close(); + +?> +===DONE=== +--EXPECT-- +string(0) "" +NULL +string(0) "" +string(0) "" +===FILE=== +string(0) "" +NULL +string(0) "" +string(0) "" +===DONE=== diff --git a/ext/xmlreader/tests/012.xml b/ext/xmlreader/tests/012.xml new file mode 100755 index 000000000..5012bd5ef --- /dev/null +++ b/ext/xmlreader/tests/012.xml @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE foo SYSTEM "012.dtd"> +<foo bar=""/> diff --git a/ext/xmlreader/tests/bug36743.phpt b/ext/xmlreader/tests/bug36743.phpt new file mode 100644 index 000000000..45747d49f --- /dev/null +++ b/ext/xmlreader/tests/bug36743.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #36743 (In a class extending XMLReader array properties are not writable) +--FILE-- +<?php + +class Test extends XMLReader +{ + private $testArr = array(); + public function __construct() + { + $this->testArr[] = 1; + var_dump($this->testArr); + } +} + +$t = new test; + +echo "Done\n"; +?> +--EXPECT-- +array(1) { + [0]=> + int(1) +} +Done |
