Annotation of embedaddon/php/ext/simplexml/sxe.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1997-2012 The PHP Group |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 3.01 of the PHP license, |
! 8: | that is bundled with this package in the file LICENSE, and is |
! 9: | available through the world-wide-web at the following url: |
! 10: | http://www.php.net/license/3_01.txt |
! 11: | If you did not receive a copy of the PHP license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@php.net so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Authors: Marcus Boerger <helly@php.net> |
! 16: +----------------------------------------------------------------------+
! 17: */
! 18:
! 19: /* $Id: sxe.c 321634 2012-01-01 13:15:04Z felipe $ */
! 20:
! 21: #ifdef HAVE_CONFIG_H
! 22: # include "config.h"
! 23: #endif
! 24:
! 25: #include "php.h"
! 26: #include "php_ini.h"
! 27: #include "ext/standard/info.h"
! 28: #include "zend_interfaces.h"
! 29:
! 30: #include "ext/spl/php_spl.h"
! 31: #include "ext/spl/spl_iterators.h"
! 32: #include "sxe.h"
! 33:
! 34: zend_class_entry *ce_SimpleXMLIterator = NULL;
! 35: zend_class_entry *ce_SimpleXMLElement;
! 36:
! 37: #include "php_simplexml_exports.h"
! 38:
! 39: /* {{{ proto void SimpleXMLIterator::rewind()
! 40: Rewind to first element */
! 41: PHP_METHOD(ce_SimpleXMLIterator, rewind)
! 42: {
! 43: php_sxe_iterator iter;
! 44:
! 45: if (zend_parse_parameters_none() == FAILURE) {
! 46: return;
! 47: }
! 48:
! 49: iter.sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
! 50: ce_SimpleXMLElement->iterator_funcs.funcs->rewind((zend_object_iterator*)&iter TSRMLS_CC);
! 51: }
! 52: /* }}} */
! 53:
! 54: /* {{{ proto bool SimpleXMLIterator::valid()
! 55: Check whether iteration is valid */
! 56: PHP_METHOD(ce_SimpleXMLIterator, valid)
! 57: {
! 58: php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
! 59:
! 60: if (zend_parse_parameters_none() == FAILURE) {
! 61: return;
! 62: }
! 63:
! 64: RETURN_BOOL(sxe->iter.data);
! 65: }
! 66: /* }}} */
! 67:
! 68: /* {{{ proto SimpleXMLIterator SimpleXMLIterator::current()
! 69: Get current element */
! 70: PHP_METHOD(ce_SimpleXMLIterator, current)
! 71: {
! 72: php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
! 73:
! 74: if (zend_parse_parameters_none() == FAILURE) {
! 75: return;
! 76: }
! 77:
! 78: if (!sxe->iter.data) {
! 79: return; /* return NULL */
! 80: }
! 81:
! 82: RETURN_ZVAL(sxe->iter.data, 1, 0);
! 83: }
! 84: /* }}} */
! 85:
! 86: /* {{{ proto string SimpleXMLIterator::key()
! 87: Get name of current child element */
! 88: PHP_METHOD(ce_SimpleXMLIterator, key)
! 89: {
! 90: xmlNodePtr curnode;
! 91: php_sxe_object *intern;
! 92: php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
! 93:
! 94: if (zend_parse_parameters_none() == FAILURE) {
! 95: return;
! 96: }
! 97:
! 98: if (!sxe->iter.data) {
! 99: RETURN_FALSE;
! 100: }
! 101:
! 102: intern = (php_sxe_object *)zend_object_store_get_object(sxe->iter.data TSRMLS_CC);
! 103: if (intern != NULL && intern->node != NULL) {
! 104: curnode = (xmlNodePtr)((php_libxml_node_ptr *)intern->node)->node;
! 105: RETURN_STRINGL((char*)curnode->name, xmlStrlen(curnode->name), 1);
! 106: }
! 107:
! 108: RETURN_FALSE;
! 109: }
! 110: /* }}} */
! 111:
! 112: /* {{{ proto void SimpleXMLIterator::next()
! 113: Move to next element */
! 114: PHP_METHOD(ce_SimpleXMLIterator, next)
! 115: {
! 116: php_sxe_iterator iter;
! 117:
! 118: if (zend_parse_parameters_none() == FAILURE) {
! 119: return;
! 120: }
! 121:
! 122: iter.sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
! 123: ce_SimpleXMLElement->iterator_funcs.funcs->move_forward((zend_object_iterator*)&iter TSRMLS_CC);
! 124: }
! 125: /* }}} */
! 126:
! 127: /* {{{ proto bool SimpleXMLIterator::hasChildren()
! 128: Check whether element has children (elements) */
! 129: PHP_METHOD(ce_SimpleXMLIterator, hasChildren)
! 130: {
! 131: php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
! 132: php_sxe_object *child;
! 133: xmlNodePtr node;
! 134:
! 135: if (zend_parse_parameters_none() == FAILURE) {
! 136: return;
! 137: }
! 138:
! 139: if (!sxe->iter.data || sxe->iter.type == SXE_ITER_ATTRLIST) {
! 140: RETURN_FALSE;
! 141: }
! 142: child = php_sxe_fetch_object(sxe->iter.data TSRMLS_CC);
! 143:
! 144: GET_NODE(child, node);
! 145: if (node) {
! 146: node = node->children;
! 147: }
! 148: while (node && node->type != XML_ELEMENT_NODE) {
! 149: node = node->next;
! 150: }
! 151: RETURN_BOOL(node ? 1 : 0);
! 152: }
! 153: /* }}} */
! 154:
! 155: /* {{{ proto SimpleXMLIterator SimpleXMLIterator::getChildren()
! 156: Get child element iterator */
! 157: PHP_METHOD(ce_SimpleXMLIterator, getChildren)
! 158: {
! 159: php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
! 160:
! 161: if (zend_parse_parameters_none() == FAILURE) {
! 162: return;
! 163: }
! 164:
! 165: if (!sxe->iter.data || sxe->iter.type == SXE_ITER_ATTRLIST) {
! 166: return; /* return NULL */
! 167: }
! 168: RETURN_ZVAL(sxe->iter.data, 1, 0);
! 169: }
! 170:
! 171: /* {{{ arginfo */
! 172: ZEND_BEGIN_ARG_INFO(arginfo_simplexmliterator__void, 0)
! 173: ZEND_END_ARG_INFO()
! 174: /* }}} */
! 175:
! 176: static const zend_function_entry funcs_SimpleXMLIterator[] = {
! 177: PHP_ME(ce_SimpleXMLIterator, rewind, arginfo_simplexmliterator__void, ZEND_ACC_PUBLIC)
! 178: PHP_ME(ce_SimpleXMLIterator, valid, arginfo_simplexmliterator__void, ZEND_ACC_PUBLIC)
! 179: PHP_ME(ce_SimpleXMLIterator, current, arginfo_simplexmliterator__void, ZEND_ACC_PUBLIC)
! 180: PHP_ME(ce_SimpleXMLIterator, key, arginfo_simplexmliterator__void, ZEND_ACC_PUBLIC)
! 181: PHP_ME(ce_SimpleXMLIterator, next, arginfo_simplexmliterator__void, ZEND_ACC_PUBLIC)
! 182: PHP_ME(ce_SimpleXMLIterator, hasChildren, arginfo_simplexmliterator__void, ZEND_ACC_PUBLIC)
! 183: PHP_ME(ce_SimpleXMLIterator, getChildren, arginfo_simplexmliterator__void, ZEND_ACC_PUBLIC)
! 184: {NULL, NULL, NULL}
! 185: };
! 186: /* }}} */
! 187:
! 188: PHP_MINIT_FUNCTION(sxe) /* {{{ */
! 189: {
! 190: zend_class_entry **pce;
! 191: zend_class_entry sxi;
! 192:
! 193: if (zend_hash_find(CG(class_table), "simplexmlelement", sizeof("SimpleXMLElement"), (void **) &pce) == FAILURE) {
! 194: ce_SimpleXMLElement = NULL;
! 195: ce_SimpleXMLIterator = NULL;
! 196: return SUCCESS; /* SimpleXML must be initialized before */
! 197: }
! 198:
! 199: ce_SimpleXMLElement = *pce;
! 200:
! 201: INIT_CLASS_ENTRY_EX(sxi, "SimpleXMLIterator", strlen("SimpleXMLIterator"), funcs_SimpleXMLIterator);
! 202: ce_SimpleXMLIterator = zend_register_internal_class_ex(&sxi, ce_SimpleXMLElement, NULL TSRMLS_CC);
! 203: ce_SimpleXMLIterator->create_object = ce_SimpleXMLElement->create_object;
! 204:
! 205: zend_class_implements(ce_SimpleXMLIterator TSRMLS_CC, 1, spl_ce_RecursiveIterator);
! 206: zend_class_implements(ce_SimpleXMLIterator TSRMLS_CC, 1, spl_ce_Countable);
! 207:
! 208: return SUCCESS;
! 209: }
! 210: /* }}} */
! 211:
! 212: /*
! 213: * Local variables:
! 214: * tab-width: 4
! 215: * c-basic-offset: 4
! 216: * End:
! 217: * vim600: fdm=marker
! 218: * vim: noet sw=4 ts=4
! 219: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>