Annotation of embedaddon/php/ext/simplexml/sxe.c, revision 1.1.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>