18
18
#include " config.h"
19
19
#endif
20
20
21
+ #include < unicode/brkiter.h>
22
+
21
23
#include " breakiterator_iterators.h"
24
+ #include " ../common/common_enum.h"
22
25
23
26
extern " C" {
24
27
#define USE_BREAKITERATOR_POINTER
@@ -28,6 +31,9 @@ extern "C" {
28
31
#include < zend_exceptions.h>
29
32
}
30
33
34
+ static zend_class_entry *IntlPartsIterator_ce_ptr;
35
+ static zend_object_handlers IntlPartsIterator_handlers;
36
+
31
37
/* BreakIterator's iterator */
32
38
33
39
inline BreakIterator *_breakiter_prolog (zend_object_iterator *iter TSRMLS_DC)
@@ -201,7 +207,7 @@ void IntlIterator_from_BreakIterator_parts(zval *break_iter_zv,
201
207
202
208
zval_add_ref (&break_iter_zv);
203
209
204
- object_init_ex (object, IntlIterator_ce_ptr );
210
+ object_init_ex (object, IntlPartsIterator_ce_ptr );
205
211
ii = (IntlIterator_object*)zend_object_store_get_object (object TSRMLS_CC);
206
212
207
213
ii->iterator = (zend_object_iterator*)emalloc (sizeof (zoi_break_iter_parts));
@@ -216,3 +222,94 @@ void IntlIterator_from_BreakIterator_parts(zval *break_iter_zv,
216
222
zend_object_store_get_object (break_iter_zv TSRMLS_CC);
217
223
assert (((zoi_break_iter_parts*)ii->iterator )->bio ->biter != NULL );
218
224
}
225
+
226
+ U_CFUNC zend_object_value IntlPartsIterator_object_create (zend_class_entry *ce TSRMLS_DC)
227
+ {
228
+ zend_object_value retval;
229
+
230
+ retval = IntlIterator_ce_ptr->create_object (ce TSRMLS_CC);
231
+ retval.handlers = &IntlPartsIterator_handlers;
232
+
233
+ return retval;
234
+ }
235
+
236
+ U_CFUNC zend_function *IntlPartsIterator_get_method (zval **object_ptr,
237
+ char *method, int method_len, const zend_literal *key TSRMLS_DC)
238
+ {
239
+ zend_literal local_literal = {0 };
240
+ zend_function *ret;
241
+ ALLOCA_FLAG (use_heap)
242
+
243
+ if (key == NULL ) {
244
+ Z_STRVAL (local_literal.constant ) = static_cast <char *>(
245
+ do_alloca (method_len + 1 , use_heap));
246
+ zend_str_tolower_copy (Z_STRVAL (local_literal.constant ),
247
+ method, method_len);
248
+ local_literal.hash_value = zend_hash_func (
249
+ Z_STRVAL (local_literal.constant ), method_len + 1 );
250
+ key = &local_literal;
251
+ }
252
+
253
+ if ((key->hash_value & 0xFFFFFFFF ) == 0xA2B486A1 /* hash of getrulestatus\0 */
254
+ && method_len == sizeof (" getrulestatus" ) - 1
255
+ && memcmp (" getrulestatus" , Z_STRVAL (key->constant ), method_len) == 0 ) {
256
+ IntlIterator_object *obj = (IntlIterator_object*)
257
+ zend_object_store_get_object (*object_ptr TSRMLS_CC);
258
+ if (obj->iterator && obj->iterator ->data ) {
259
+ zval *break_iter_zv = static_cast <zval*>(obj->iterator ->data );
260
+ *object_ptr = break_iter_zv;
261
+ ret = Z_OBJ_HANDLER_P (break_iter_zv, get_method)(object_ptr,
262
+ method, method_len, key TSRMLS_CC);
263
+ goto end;
264
+ }
265
+ }
266
+
267
+ ret = std_object_handlers.get_method (object_ptr,
268
+ method, method_len, key TSRMLS_CC);
269
+
270
+ end:
271
+ if (key == &local_literal) {
272
+ free_alloca (Z_STRVAL (local_literal.constant ), use_heap);
273
+ }
274
+
275
+ return ret;
276
+ }
277
+
278
+ U_CFUNC PHP_METHOD (IntlPartsIterator, getBreakIterator)
279
+ {
280
+ INTLITERATOR_METHOD_INIT_VARS;
281
+
282
+ if (zend_parse_parameters_none () == FAILURE) {
283
+ intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR,
284
+ " IntlPartsIterator::getBreakIterator: bad arguments" , 0 TSRMLS_CC);
285
+ return ;
286
+ }
287
+
288
+ INTLITERATOR_METHOD_FETCH_OBJECT;
289
+
290
+ zval *biter_zval = static_cast <zval*>(ii->iterator ->data );
291
+ RETURN_ZVAL (biter_zval, 1 , 0 );
292
+ }
293
+
294
+ ZEND_BEGIN_ARG_INFO_EX (ainfo_parts_it_void, 0 , 0 , 0 )
295
+ ZEND_END_ARG_INFO()
296
+
297
+ static const zend_function_entry IntlPartsIterator_class_functions[] = {
298
+ PHP_ME (IntlPartsIterator, getBreakIterator, ainfo_parts_it_void, ZEND_ACC_PUBLIC)
299
+ PHP_FE_END
300
+ };
301
+
302
+ U_CFUNC void breakiterator_register_IntlPartsIterator_class (TSRMLS_D)
303
+ {
304
+ zend_class_entry ce;
305
+
306
+ /* Create and register 'BreakIterator' class. */
307
+ INIT_CLASS_ENTRY (ce, " IntlPartsIterator" , IntlPartsIterator_class_functions);
308
+ IntlPartsIterator_ce_ptr = zend_register_internal_class_ex (&ce,
309
+ IntlIterator_ce_ptr, NULL TSRMLS_CC);
310
+ IntlPartsIterator_ce_ptr->create_object = IntlPartsIterator_object_create;
311
+
312
+ memcpy (&IntlPartsIterator_handlers, &IntlIterator_handlers,
313
+ sizeof IntlPartsIterator_handlers);
314
+ IntlPartsIterator_handlers.get_method = IntlPartsIterator_get_method;
315
+ }
0 commit comments