1 /* 2 +----------------------------------------------------------------------+ 3 | PHP Version 5 | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 1997-2013 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$ */ 20 21 #ifndef SPL_ITERATORS_H 22 #define SPL_ITERATORS_H 23 24 #include "php.h" 25 #include "php_spl.h" 26 #if HAVE_PCRE || HAVE_BUNDLED_PCRE 27 #include "ext/pcre/php_pcre.h" 28 #endif 29 30 #define spl_ce_Traversable zend_ce_traversable 31 #define spl_ce_Iterator zend_ce_iterator 32 #define spl_ce_Aggregate zend_ce_aggregate 33 #define spl_ce_ArrayAccess zend_ce_arrayaccess 34 #define spl_ce_Serializable zend_ce_serializable 35 36 extern PHPAPI zend_class_entry *spl_ce_RecursiveIterator; 37 extern PHPAPI zend_class_entry *spl_ce_RecursiveIteratorIterator; 38 extern PHPAPI zend_class_entry *spl_ce_RecursiveTreeIterator; 39 extern PHPAPI zend_class_entry *spl_ce_FilterIterator; 40 extern PHPAPI zend_class_entry *spl_ce_RecursiveFilterIterator; 41 extern PHPAPI zend_class_entry *spl_ce_ParentIterator; 42 extern PHPAPI zend_class_entry *spl_ce_SeekableIterator; 43 extern PHPAPI zend_class_entry *spl_ce_LimitIterator; 44 extern PHPAPI zend_class_entry *spl_ce_CachingIterator; 45 extern PHPAPI zend_class_entry *spl_ce_RecursiveCachingIterator; 46 extern PHPAPI zend_class_entry *spl_ce_OuterIterator; 47 extern PHPAPI zend_class_entry *spl_ce_IteratorIterator; 48 extern PHPAPI zend_class_entry *spl_ce_NoRewindIterator; 49 extern PHPAPI zend_class_entry *spl_ce_InfiniteIterator; 50 extern PHPAPI zend_class_entry *spl_ce_EmptyIterator; 51 extern PHPAPI zend_class_entry *spl_ce_AppendIterator; 52 extern PHPAPI zend_class_entry *spl_ce_RegexIterator; 53 extern PHPAPI zend_class_entry *spl_ce_RecursiveRegexIterator; 54 extern PHPAPI zend_class_entry *spl_ce_Countable; 55 56 PHP_MINIT_FUNCTION(spl_iterators); 57 58 PHP_FUNCTION(iterator_to_array); 59 PHP_FUNCTION(iterator_count); 60 PHP_FUNCTION(iterator_apply); 61 62 typedef enum { 63 DIT_Default = 0, 64 DIT_FilterIterator = DIT_Default, 65 DIT_RecursiveFilterIterator = DIT_Default, 66 DIT_ParentIterator = DIT_Default, 67 DIT_LimitIterator, 68 DIT_CachingIterator, 69 DIT_RecursiveCachingIterator, 70 DIT_IteratorIterator, 71 DIT_NoRewindIterator, 72 DIT_InfiniteIterator, 73 DIT_AppendIterator, 74 #if HAVE_PCRE || HAVE_BUNDLED_PCRE 75 DIT_RegexIterator, 76 DIT_RecursiveRegexIterator, 77 #endif 78 DIT_Unknown = ~0 79 } dual_it_type; 80 81 typedef enum { 82 RIT_Default = 0, 83 RIT_RecursiveIteratorIterator = RIT_Default, 84 RIT_RecursiveTreeIterator, 85 RIT_Unknow = ~0 86 } recursive_it_it_type; 87 88 enum { 89 /* public */ 90 CIT_CALL_TOSTRING = 0x00000001, 91 CIT_TOSTRING_USE_KEY = 0x00000002, 92 CIT_TOSTRING_USE_CURRENT = 0x00000004, 93 CIT_TOSTRING_USE_INNER = 0x00000008, 94 CIT_CATCH_GET_CHILD = 0x00000010, 95 CIT_FULL_CACHE = 0x00000100, 96 CIT_PUBLIC = 0x0000FFFF, 97 /* private */ 98 CIT_VALID = 0x00010000, 99 CIT_HAS_CHILDREN = 0x00020000 100 }; 101 102 enum { 103 /* public */ 104 REGIT_USE_KEY = 0x00000001, 105 REGIT_INVERTED = 0x00000002 106 }; 107 108 typedef enum { 109 REGIT_MODE_MATCH, 110 REGIT_MODE_GET_MATCH, 111 REGIT_MODE_ALL_MATCHES, 112 REGIT_MODE_SPLIT, 113 REGIT_MODE_REPLACE, 114 REGIT_MODE_MAX 115 } regex_mode; 116 117 typedef struct _spl_dual_it_object { 118 zend_object std; 119 struct { 120 zval *zobject; 121 zend_class_entry *ce; 122 zend_object *object; 123 zend_object_iterator *iterator; 124 } inner; 125 struct { 126 zval *data; 127 char *str_key; 128 uint str_key_len; 129 ulong int_key; 130 int key_type; /* HASH_KEY_IS_STRING or HASH_KEY_IS_LONG */ 131 int pos; 132 } current; 133 dual_it_type dit_type; 134 union { 135 struct { 136 long offset; 137 long count; 138 } limit; 139 struct { 140 long flags; /* CIT_* */ 141 zval *zstr; 142 zval *zchildren; 143 zval *zcache; 144 } caching; 145 struct { 146 zval *zarrayit; 147 zend_object_iterator *iterator; 148 } append; 149 #if HAVE_PCRE || HAVE_BUNDLED_PCRE 150 struct { 151 int use_flags; 152 long flags; 153 regex_mode mode; 154 long preg_flags; 155 pcre_cache_entry *pce; 156 char *regex; 157 } regex; 158 #endif 159 } u; 160 } spl_dual_it_object; 161 162 typedef int (*spl_iterator_apply_func_t)(zend_object_iterator *iter, void *puser TSRMLS_DC); 163 164 PHPAPI int spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, void *puser TSRMLS_DC); 165 166 #endif /* SPL_ITERATORS_H */ 167 168 /* 169 * Local Variables: 170 * c-basic-offset: 4 171 * tab-width: 4 172 * End: 173 * vim600: fdm=marker 174 * vim: noet sw=4 ts=4 175 */ 176