Annotation of embedaddon/php/Zend/zend_iterators.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | Zend Engine |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 2.00 of the Zend 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.zend.com/license/2_00.txt. |
! 11: | If you did not receive a copy of the Zend license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@zend.com so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Author: Wez Furlong <wez@thebrainroom.com> |
! 16: | Marcus Boerger <helly@php.net> |
! 17: +----------------------------------------------------------------------+
! 18: */
! 19:
! 20: /* $Id: zend_iterators.c 321634 2012-01-01 13:15:04Z felipe $ */
! 21:
! 22: #include "zend.h"
! 23: #include "zend_API.h"
! 24:
! 25: static zend_class_entry zend_iterator_class_entry;
! 26:
! 27: static zend_object_handlers iterator_object_handlers = {
! 28: ZEND_OBJECTS_STORE_HANDLERS,
! 29: NULL, /* prop read */
! 30: NULL, /* prop write */
! 31: NULL, /* read dim */
! 32: NULL, /* write dim */
! 33: NULL,
! 34: NULL, /* get */
! 35: NULL, /* set */
! 36: NULL, /* has prop */
! 37: NULL, /* unset prop */
! 38: NULL, /* has dim */
! 39: NULL, /* unset dim */
! 40: NULL, /* props get */
! 41: NULL, /* method get */
! 42: NULL, /* call */
! 43: NULL, /* get ctor */
! 44: NULL, /* get_ce */
! 45: NULL, /* get class name */
! 46: NULL, /* compare */
! 47: NULL, /* cast */
! 48: NULL /* count */
! 49: };
! 50:
! 51: ZEND_API void zend_register_iterator_wrapper(TSRMLS_D)
! 52: {
! 53: INIT_CLASS_ENTRY(zend_iterator_class_entry, "__iterator_wrapper", NULL);
! 54: free(zend_iterator_class_entry.name);
! 55: zend_iterator_class_entry.name = "__iterator_wrapper";
! 56: }
! 57:
! 58: static void iter_wrapper_dtor(void *object, zend_object_handle handle TSRMLS_DC)
! 59: {
! 60: zend_object_iterator *iter = (zend_object_iterator*)object;
! 61: iter->funcs->dtor(iter TSRMLS_CC);
! 62: }
! 63:
! 64: ZEND_API zval *zend_iterator_wrap(zend_object_iterator *iter TSRMLS_DC)
! 65: {
! 66: zval *wrapped;
! 67:
! 68: MAKE_STD_ZVAL(wrapped);
! 69: Z_TYPE_P(wrapped) = IS_OBJECT;
! 70: Z_OBJ_HANDLE_P(wrapped) = zend_objects_store_put(iter, iter_wrapper_dtor, NULL, NULL TSRMLS_CC);
! 71: Z_OBJ_HT_P(wrapped) = &iterator_object_handlers;
! 72:
! 73: return wrapped;
! 74: }
! 75:
! 76: ZEND_API enum zend_object_iterator_kind zend_iterator_unwrap(
! 77: zval *array_ptr, zend_object_iterator **iter TSRMLS_DC)
! 78: {
! 79: switch (Z_TYPE_P(array_ptr)) {
! 80: case IS_OBJECT:
! 81: if (Z_OBJ_HT_P(array_ptr) == &iterator_object_handlers) {
! 82: *iter = (zend_object_iterator *)zend_object_store_get_object(array_ptr TSRMLS_CC);
! 83: return ZEND_ITER_OBJECT;
! 84: }
! 85: if (HASH_OF(array_ptr)) {
! 86: return ZEND_ITER_PLAIN_OBJECT;
! 87: }
! 88: return ZEND_ITER_INVALID;
! 89:
! 90: case IS_ARRAY:
! 91: if (HASH_OF(array_ptr)) {
! 92: return ZEND_ITER_PLAIN_ARRAY;
! 93: }
! 94: return ZEND_ITER_INVALID;
! 95:
! 96: default:
! 97: return ZEND_ITER_INVALID;
! 98: }
! 99: }
! 100:
! 101: /*
! 102: * Local variables:
! 103: * tab-width: 4
! 104: * c-basic-offset: 4
! 105: * indent-tabs-mode: t
! 106: * End:
! 107: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>