summaryrefslogtreecommitdiff
path: root/ext/xmlreader
diff options
context:
space:
mode:
authorMark A. Hershberger <mah@debian.(none)>2009-03-25 00:35:28 -0400
committerMark A. Hershberger <mah@debian.(none)>2009-03-25 00:35:28 -0400
commitba50031707469046407a35b77a3cd81351e951b3 (patch)
tree5c03e723bdbfabae09d41a3ab1253dff41eeed4a /ext/xmlreader
parent0a36161e13484a99ccf69bb38f206462d27cc6d6 (diff)
downloadphp-ba50031707469046407a35b77a3cd81351e951b3.tar.gz
Imported Upstream version 5.1.5upstream/5.1.5
Diffstat (limited to 'ext/xmlreader')
-rw-r--r--ext/xmlreader/php_xmlreader.c79
-rw-r--r--ext/xmlreader/tests/011.phpt34
-rwxr-xr-xext/xmlreader/tests/012.dtd2
-rwxr-xr-xext/xmlreader/tests/012.phpt69
-rwxr-xr-xext/xmlreader/tests/012.xml3
-rw-r--r--ext/xmlreader/tests/bug36743.phpt25
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