Annotation of embedaddon/php/ext/dom/nodelist.c, revision 1.1.1.3

1.1       misho       1: /*
                      2:    +----------------------------------------------------------------------+
                      3:    | PHP Version 5                                                        |
                      4:    +----------------------------------------------------------------------+
1.1.1.3 ! misho       5:    | Copyright (c) 1997-2013 The PHP Group                                |
1.1       misho       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: Christian Stocker <chregu@php.net>                          |
                     16:    |          Rob Richards <rrichards@php.net>                            |
                     17:    +----------------------------------------------------------------------+
                     18: */
                     19: 
1.1.1.2   misho      20: /* $Id$ */
1.1       misho      21: 
                     22: #ifdef HAVE_CONFIG_H
                     23: #include "config.h"
                     24: #endif
                     25: 
                     26: #include "php.h"
                     27: #if HAVE_LIBXML && HAVE_DOM
                     28: #include "php_dom.h"
                     29: 
                     30: 
                     31: /* {{{ arginfo */
                     32: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_nodelist_item, 0, 0, 1)
                     33:        ZEND_ARG_INFO(0, index)
                     34: ZEND_END_ARG_INFO();
                     35: /* }}} */
                     36: 
                     37: /*
                     38: * class DOMNodeList 
                     39: *
                     40: * URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-536297177
                     41: * Since: 
                     42: */
                     43: 
                     44: const zend_function_entry php_dom_nodelist_class_functions[] = {
                     45:        PHP_FALIAS(item, dom_nodelist_item, arginfo_dom_nodelist_item)
                     46:        PHP_FE_END
                     47: };
                     48: 
                     49: /* {{{ length  int     
                     50: readonly=yes 
                     51: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-203510337
                     52: Since: 
                     53: */
                     54: int dom_nodelist_length_read(dom_object *obj, zval **retval TSRMLS_DC)
                     55: {
                     56:        dom_nnodemap_object *objmap;
                     57:        xmlNodePtr nodep, curnode;
                     58:        int count = 0;
                     59:        HashTable *nodeht;
                     60: 
                     61:        objmap = (dom_nnodemap_object *)obj->ptr;
                     62:        if (objmap != NULL) {
                     63:                if (objmap->ht) {
                     64:                        count = xmlHashSize(objmap->ht);
                     65:                } else {
                     66:                        if (objmap->nodetype == DOM_NODESET) {
                     67:                                nodeht = HASH_OF(objmap->baseobjptr);
                     68:                                count = zend_hash_num_elements(nodeht);
                     69:                        } else {
                     70:                                nodep = dom_object_get_node(objmap->baseobj);
                     71:                                if (nodep) {
                     72:                                        if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) {
                     73:                                                curnode = nodep->children;
                     74:                                                if (curnode) {
                     75:                                                        count++;
                     76:                                                        while (curnode->next != NULL) {
                     77:                                                                count++;
                     78:                                                                curnode = curnode->next;
                     79:                                                        }
                     80:                                                }
                     81:                                        } else {
                     82:                                                if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
                     83:                                                        nodep = xmlDocGetRootElement((xmlDoc *) nodep);
                     84:                                                } else {
                     85:                                                        nodep = nodep->children;
                     86:                                                }
                     87:                                                curnode = dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &count, -1);
                     88:                                        }
                     89:                                }
                     90:                        }
                     91:                }
                     92:        }
                     93: 
                     94:        MAKE_STD_ZVAL(*retval);
                     95:        ZVAL_LONG(*retval, count);
                     96:        return SUCCESS;
                     97: }
                     98: 
                     99: /* }}} */
                    100: 
                    101: /* {{{ proto DOMNode dom_nodelist_item(int index);
                    102: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-844377136
                    103: Since: 
                    104: */
                    105: PHP_FUNCTION(dom_nodelist_item)
                    106: {
1.1.1.2   misho     107:        zval *id;
1.1       misho     108:        long index;
                    109:        int ret;
                    110:        dom_object *intern;
                    111:        xmlNodePtr itemnode = NULL;
                    112: 
                    113:        dom_nnodemap_object *objmap;
                    114:        xmlNodePtr nodep, curnode;
                    115:        int count = 0;
                    116:        HashTable *nodeht;
                    117:        zval **entry;
                    118: 
                    119:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &id, dom_nodelist_class_entry, &index) == FAILURE) {
                    120:                return;
                    121:        }
                    122: 
                    123:        if (index >= 0) {
                    124:                intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
                    125: 
                    126:                objmap = (dom_nnodemap_object *)intern->ptr;
                    127:                if (objmap != NULL) {
                    128:                        if (objmap->ht) {
                    129:                                if (objmap->nodetype == XML_ENTITY_NODE) {
                    130:                                        itemnode = php_dom_libxml_hash_iter(objmap->ht, index);
                    131:                                } else {
                    132:                                        itemnode = php_dom_libxml_notation_iter(objmap->ht, index);
                    133:                                }
                    134:                        } else {
                    135:                                if (objmap->nodetype == DOM_NODESET) {
                    136:                                        nodeht = HASH_OF(objmap->baseobjptr);
                    137:                                        if (zend_hash_index_find(nodeht, index, (void **) &entry)==SUCCESS) {
                    138:                                                *return_value = **entry;
                    139:                                                zval_copy_ctor(return_value);
                    140:                                                return;
                    141:                                        }
                    142:                                } else if (objmap->baseobj) {
                    143:                                        nodep = dom_object_get_node(objmap->baseobj);
                    144:                                        if (nodep) {
                    145:                                                if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) {
                    146:                                                        curnode = nodep->children;
                    147:                                                        while (count < index && curnode != NULL) {
                    148:                                                                count++;
                    149:                                                                curnode = curnode->next;
                    150:                                                        }
                    151:                                                        itemnode = curnode;
                    152:                                                } else {
                    153:                                                        if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
                    154:                                                                nodep = xmlDocGetRootElement((xmlDoc *) nodep);
                    155:                                                        } else {
                    156:                                                                nodep = nodep->children;
                    157:                                                        }
                    158:                                                        itemnode = dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &count, index);
                    159:                                                }
                    160:                                        }
                    161:                                }
                    162:                        }
                    163:                }
                    164: 
                    165:                if (itemnode) {
1.1.1.2   misho     166:                        DOM_RET_OBJ(itemnode, &ret, objmap->baseobj);
1.1       misho     167:                        return;
                    168:                }
                    169:        }
                    170: 
                    171:        RETVAL_NULL();
                    172: }
                    173: /* }}} end dom_nodelist_item */
                    174: 
                    175: #endif
                    176: 
                    177: /*
                    178:  * Local variables:
                    179:  * tab-width: 4
                    180:  * c-basic-offset: 4
                    181:  * End:
                    182:  * vim600: noet sw=4 ts=4 fdm=marker
                    183:  * vim<600: noet sw=4 ts=4
                    184:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>