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>