helly Mon Oct 31 15:06:29 2005 EDT
Modified files:
/php-src/ext/simplexml simplexml.c
/php-src/ext/simplexml/tests 000.phpt
Log:
- Implement count interface
http://cvs.php.net/diff.php/php-src/ext/simplexml/simplexml.c?r1=1.172&r2=1.173&ty=u
Index: php-src/ext/simplexml/simplexml.c
diff -u php-src/ext/simplexml/simplexml.c:1.172
php-src/ext/simplexml/simplexml.c:1.173
--- php-src/ext/simplexml/simplexml.c:1.172 Mon Oct 31 14:51:40 2005
+++ php-src/ext/simplexml/simplexml.c Mon Oct 31 15:06:23 2005
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: simplexml.c,v 1.172 2005/10/31 19:51:40 rrichards Exp $ */
+/* $Id: simplexml.c,v 1.173 2005/10/31 20:06:23 helly Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -53,6 +53,8 @@
static php_sxe_object* php_sxe_object_new(zend_class_entry *ce TSRMLS_DC);
static zend_object_value php_sxe_register_object(php_sxe_object * TSRMLS_DC);
+static xmlNodePtr php_sxe_reset_iterator(php_sxe_object *sxe, int use_data
TSRMLS_DC);
+static xmlNodePtr php_sxe_iterator_fetch(php_sxe_object *sxe, xmlNodePtr node,
int use_data TSRMLS_DC);
/* {{{ _node_as_zval()
*/
@@ -103,7 +105,7 @@
xmlNodePtr retnode = NULL;
if (sxe && sxe->iter.type != SXE_ITER_NONE) {
- php_sxe_reset_iterator(sxe TSRMLS_CC);
+ php_sxe_reset_iterator(sxe, 1 TSRMLS_CC);
if (sxe->iter.data) {
intern = (php_sxe_object
*)zend_object_store_get_object(sxe->iter.data TSRMLS_CC);
GET_NODE(intern, retnode)
@@ -1332,6 +1334,26 @@
}
/* }}} */
+static int sxe_count_elements(zval *object, long *count TSRMLS_DC) /* {{{ */
+{
+ php_sxe_object *sxe;
+ xmlNodePtr node;
+
+ *count = 0;
+ sxe = php_sxe_fetch_object(object TSRMLS_CC);
+ node = php_sxe_reset_iterator(sxe, 0 TSRMLS_CC);
+
+ while (node)
+ {
+ (*count)++;
+ node = php_sxe_iterator_fetch(sxe, node->next, 0 TSRMLS_CC);
+ }
+
+
+ return SUCCESS;
+}
+/* }}} */
+
static zval *sxe_get_value(zval *z TSRMLS_DC)
{
zval *retval;
@@ -1369,7 +1391,7 @@
NULL, /* zend_get_std_object_handlers()->get_class_name,*/
sxe_objects_compare,
sxe_object_cast,
- NULL
+ sxe_count_elements
};
static zend_object_handlers sxe_ze1_object_handlers = {
@@ -1393,7 +1415,7 @@
NULL, /* zend_get_std_object_handlers()->get_class_name,*/
sxe_objects_compare,
sxe_object_cast,
- NULL
+ sxe_count_elements
};
static zend_object_value sxe_object_ze1_clone(zval *zobject TSRMLS_DC)
@@ -1664,7 +1686,7 @@
php_sxe_iterator_rewind,
};
-static void php_sxe_iterator_fetch(php_sxe_object *sxe, xmlNodePtr node
TSRMLS_DC)
+static xmlNodePtr php_sxe_iterator_fetch(php_sxe_object *sxe, xmlNodePtr node,
int use_data TSRMLS_DC)
{
char *prefix = sxe->iter.nsprefix;
int test_elem = sxe->iter.type == SXE_ITER_ELEMENT && sxe->iter.name;
@@ -1685,13 +1707,15 @@
node = node->next;
}
- if (node) {
+ if (node && use_data) {
ALLOC_INIT_ZVAL(sxe->iter.data);
_node_as_zval(sxe, node, sxe->iter.data, SXE_ITER_NONE, NULL,
sxe->iter.nsprefix TSRMLS_CC);
}
+
+ return node;
}
-ZEND_API void php_sxe_reset_iterator(php_sxe_object *sxe TSRMLS_DC)
+static xmlNodePtr php_sxe_reset_iterator(php_sxe_object *sxe, int use_data
TSRMLS_DC)
{
xmlNodePtr node;
@@ -1712,8 +1736,9 @@
case SXE_ITER_ATTRLIST:
node = (xmlNodePtr) node->properties;
}
- php_sxe_iterator_fetch(sxe, node TSRMLS_CC);
+ return php_sxe_iterator_fetch(sxe, node, use_data TSRMLS_CC);
}
+ return NULL;
}
zend_object_iterator *php_sxe_get_iterator(zend_class_entry *ce, zval *object
TSRMLS_DC)
@@ -1798,7 +1823,7 @@
}
if (node) {
- php_sxe_iterator_fetch(sxe, node->next TSRMLS_CC);
+ php_sxe_iterator_fetch(sxe, node->next, 1 TSRMLS_CC);
}
}
@@ -1815,10 +1840,9 @@
php_sxe_iterator *iterator = (php_sxe_iterator *)iter;
sxe = iterator->sxe;
- php_sxe_reset_iterator(sxe TSRMLS_CC);
+ php_sxe_reset_iterator(sxe, 1 TSRMLS_CC);
}
-
void *simplexml_export_node(zval *object TSRMLS_DC)
{
php_sxe_object *sxe;
@@ -1979,7 +2003,7 @@
{
php_info_print_table_start();
php_info_print_table_header(2, "Simplexml support", "enabled");
- php_info_print_table_row(2, "Revision", "$Revision: 1.172 $");
+ php_info_print_table_row(2, "Revision", "$Revision: 1.173 $");
php_info_print_table_row(2, "Schema support",
#ifdef LIBXML_SCHEMAS_ENABLED
"enabled");
http://cvs.php.net/diff.php/php-src/ext/simplexml/tests/000.phpt?r1=1.3&r2=1.4&ty=u
Index: php-src/ext/simplexml/tests/000.phpt
diff -u php-src/ext/simplexml/tests/000.phpt:1.3
php-src/ext/simplexml/tests/000.phpt:1.4
--- php-src/ext/simplexml/tests/000.phpt:1.3 Sun Oct 30 15:37:22 2005
+++ php-src/ext/simplexml/tests/000.phpt Mon Oct 31 15:06:28 2005
@@ -13,6 +13,7 @@
echo "===$what\n";
eval("var_dump(isset(\$$what));");
eval("var_dump((bool)\$$what);");
+ eval("var_dump(count(\$$what));");
eval("var_dump(\$$what);");
}
@@ -40,6 +41,7 @@
===sxe
bool(true)
bool(true)
+int(3)
object(SimpleXMLElement)#%d (3) {
["@attributes"]=>
array(1) {
@@ -74,6 +76,7 @@
===sxe->elem1
bool(true)
bool(true)
+int(2)
object(SimpleXMLElement)#%d (3) {
["@attributes"]=>
array(2) {
@@ -108,6 +111,7 @@
===sxe->elem1[0]
bool(true)
bool(true)
+int(1)
object(SimpleXMLElement)#%d (3) {
["@attributes"]=>
array(2) {
@@ -142,6 +146,7 @@
===sxe->elem1[0]->elem2
bool(true)
bool(true)
+int(1)
object(SimpleXMLElement)#%d (2) {
["@attributes"]=>
array(2) {
@@ -163,11 +168,13 @@
===sxe->elem1[0]->elem2->bla
bool(false)
bool(false)
+int(0)
object(SimpleXMLElement)#%d (0) {
}
===sxe->elem1[0]["attr1"]
bool(true)
bool(true)
+int(0)
object(SimpleXMLElement)#%d (1) {
[0]=>
string(5) "first"
@@ -175,11 +182,13 @@
===sxe->elem1[0]->attr1
bool(false)
bool(false)
+int(0)
object(SimpleXMLElement)#%d (0) {
}
===sxe->elem1[1]
bool(true)
bool(true)
+int(0)
object(SimpleXMLElement)#%d (1) {
["@attributes"]=>
array(2) {
@@ -192,10 +201,12 @@
===sxe->elem1[2]
bool(false)
bool(false)
+int(0)
NULL
===sxe->elem11
bool(true)
bool(true)
+int(1)
object(SimpleXMLElement)#%d (1) {
["elem111"]=>
object(SimpleXMLElement)#%d (1) {
@@ -207,6 +218,7 @@
===sxe->elem11->elem111
bool(true)
bool(true)
+int(1)
object(SimpleXMLElement)#%d (1) {
["elem1111"]=>
object(SimpleXMLElement)#%d (0) {
@@ -215,30 +227,36 @@
===sxe->elem11->elem111->elem1111
bool(true)
bool(true)
+int(1)
object(SimpleXMLElement)#%d (0) {
}
===sxe->elem22
bool(false)
bool(false)
+int(0)
object(SimpleXMLElement)#%d (0) {
}
===sxe->elem22->elem222
bool(false)
bool(false)
+int(0)
NULL
===sxe->elem22->attr22
bool(false)
bool(false)
+int(0)
NULL
===sxe->elem22["attr22"]
bool(false)
bool(false)
+int(0)
NULL
===DONE===
--UEXPECTF--
===sxe
bool(true)
bool(true)
+int(3)
object(SimpleXMLElement)#%d (3) {
[u"@attributes"]=>
array(1) {
@@ -273,6 +291,7 @@
===sxe->elem1
bool(true)
bool(true)
+int(2)
object(SimpleXMLElement)#%d (3) {
[u"@attributes"]=>
array(2) {
@@ -307,6 +326,7 @@
===sxe->elem1[0]
bool(true)
bool(true)
+int(1)
object(SimpleXMLElement)#%d (3) {
[u"@attributes"]=>
array(2) {
@@ -341,6 +361,7 @@
===sxe->elem1[0]->elem2
bool(true)
bool(true)
+int(1)
object(SimpleXMLElement)#%d (2) {
[u"@attributes"]=>
array(2) {
@@ -362,16 +383,19 @@
===sxe->elem1[0]->elem2->bla
bool(false)
bool(false)
+int(0)
object(SimpleXMLElement)#%d (0) {
}
===sxe->elem1[0]->attr1
bool(false)
bool(false)
+int(0)
object(SimpleXMLElement)#%d (0) {
}
===sxe->elem1[1]
bool(true)
bool(true)
+int(0)
object(SimpleXMLElement)#%d (1) {
[u"@attributes"]=>
array(2) {
@@ -384,10 +408,12 @@
===sxe->elem1[2]
bool(false)
bool(false)
+int(0)
NULL
===sxe->elem11
bool(true)
bool(true)
+int(1)
object(SimpleXMLElement)#%d (1) {
[u"elem111"]=>
object(SimpleXMLElement)#%d (1) {
@@ -399,6 +425,7 @@
===sxe->elem11->elem111
bool(true)
bool(true)
+int(1)
object(SimpleXMLElement)#%d (1) {
[u"elem1111"]=>
object(SimpleXMLElement)#%d (0) {
@@ -407,23 +434,28 @@
===sxe->elem11->elem111->elem1111
bool(true)
bool(true)
+int(1)
object(SimpleXMLElement)#%d (0) {
}
===sxe->elem22
bool(false)
bool(false)
+int(0)
object(SimpleXMLElement)#%d (0) {
}
===sxe->elem22->elem222
bool(false)
bool(false)
+int(0)
NULL
===sxe->elem22->attr22
bool(false)
bool(false)
+int(0)
NULL
===sxe->elem22["attr22"]
bool(false)
bool(false)
+int(0)
NULL
===DONE===
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php