This source file includes following definitions.
- resourcebundle_iterator_read
- resourcebundle_iterator_invalidate
- resourcebundle_iterator_dtor
- resourcebundle_iterator_has_more
- resourcebundle_iterator_current
- resourcebundle_iterator_key
- resourcebundle_iterator_step
- resourcebundle_iterator_reset
- resourcebundle_get_iterator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #include <php.h>
18 #include <zend.h>
19 #include <zend_API.h>
20
21 #include "resourcebundle/resourcebundle.h"
22 #include "resourcebundle/resourcebundle_class.h"
23 #include "resourcebundle/resourcebundle_iterator.h"
24
25
26
27
28
29
30
31
32 static void resourcebundle_iterator_read( ResourceBundle_iterator *iterator )
33 {
34 UErrorCode icuerror = U_ZERO_ERROR;
35 ResourceBundle_object *rb = iterator->subject;
36
37 rb->child = ures_getByIndex( rb->me, iterator->i, rb->child, &icuerror );
38
39 if (U_SUCCESS(icuerror)) {
40
41 if (iterator->is_table) {
42 iterator->currentkey = estrdup( ures_getKey( rb->child ) );
43 }
44 resourcebundle_extract_value( &iterator->current, rb );
45 }
46 else {
47
48 ZVAL_UNDEF(&iterator->current);
49 }
50 }
51
52
53
54 static void resourcebundle_iterator_invalidate( zend_object_iterator *iter )
55 {
56 ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter;
57
58 if (!Z_ISUNDEF(iterator->current)) {
59 zval_ptr_dtor( &iterator->current );
60 ZVAL_UNDEF(&iterator->current);
61 }
62 if (iterator->currentkey) {
63 efree( iterator->currentkey );
64 iterator->currentkey = NULL;
65 }
66 }
67
68
69
70 static void resourcebundle_iterator_dtor( zend_object_iterator *iter )
71 {
72 ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter;
73 zval *object = &iterator->intern.data;
74
75 resourcebundle_iterator_invalidate( iter );
76
77 zval_ptr_dtor(object);
78 }
79
80
81
82 static int resourcebundle_iterator_has_more( zend_object_iterator *iter )
83 {
84 ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter;
85 return (iterator->i < iterator->length) ? SUCCESS : FAILURE;
86 }
87
88
89
90 static zval *resourcebundle_iterator_current( zend_object_iterator *iter )
91 {
92 ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter;
93 if (Z_ISUNDEF(iterator->current)) {
94 resourcebundle_iterator_read( iterator);
95 }
96 return &iterator->current;
97 }
98
99
100
101 static void resourcebundle_iterator_key( zend_object_iterator *iter, zval *key )
102 {
103 ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter;
104
105 if (Z_ISUNDEF(iterator->current)) {
106 resourcebundle_iterator_read( iterator);
107 }
108
109 if (iterator->is_table) {
110 ZVAL_STRING(key, iterator->currentkey);
111 } else {
112 ZVAL_LONG(key, iterator->i);
113 }
114 }
115
116
117
118 static void resourcebundle_iterator_step( zend_object_iterator *iter )
119 {
120 ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter;
121
122 iterator->i++;
123 resourcebundle_iterator_invalidate( iter );
124 }
125
126
127
128 static void resourcebundle_iterator_reset( zend_object_iterator *iter )
129 {
130 ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter;
131
132 iterator->i = 0;
133 resourcebundle_iterator_invalidate( iter );
134 }
135
136
137
138 static zend_object_iterator_funcs resourcebundle_iterator_funcs = {
139 resourcebundle_iterator_dtor,
140 resourcebundle_iterator_has_more,
141 resourcebundle_iterator_current,
142 resourcebundle_iterator_key,
143 resourcebundle_iterator_step,
144 resourcebundle_iterator_reset,
145 resourcebundle_iterator_invalidate
146 };
147
148
149
150 zend_object_iterator *resourcebundle_get_iterator( zend_class_entry *ce, zval *object, int byref )
151 {
152 ResourceBundle_object *rb = Z_INTL_RESOURCEBUNDLE_P(object );
153 ResourceBundle_iterator *iterator = emalloc( sizeof( ResourceBundle_iterator ) );
154
155 if (byref) {
156 php_error( E_ERROR, "ResourceBundle does not support writable iterators" );
157 }
158
159 zend_iterator_init(&iterator->intern);
160 ZVAL_COPY(&iterator->intern.data, object);
161 iterator->intern.funcs = &resourcebundle_iterator_funcs;
162
163 iterator->subject = rb;
164
165
166
167
168 iterator->is_table = (ures_getType( rb->me ) == URES_TABLE);
169 iterator->length = ures_getSize( rb->me );
170
171 ZVAL_UNDEF(&iterator->current);
172 iterator->currentkey = NULL;
173 iterator->i = 0;
174
175 return (zend_object_iterator *) iterator;
176 }
177
178
179
180
181
182
183
184
185
186