andrei Tue Jul 11 19:43:09 2006 UTC Modified files: /php-src/ext/unicode unicode_iterators.c Log: Implement getAll() that can be used to get all the pieces defined by the boundaries. http://cvs.php.net/viewvc.cgi/php-src/ext/unicode/unicode_iterators.c?r1=1.42&r2=1.43&diff_format=u Index: php-src/ext/unicode/unicode_iterators.c diff -u php-src/ext/unicode/unicode_iterators.c:1.42 php-src/ext/unicode/unicode_iterators.c:1.43 --- php-src/ext/unicode/unicode_iterators.c:1.42 Tue Jul 11 17:59:46 2006 +++ php-src/ext/unicode/unicode_iterators.c Tue Jul 11 19:43:08 2006 @@ -14,7 +14,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: unicode_iterators.c,v 1.42 2006/07/11 17:59:46 andrei Exp $ */ +/* $Id: unicode_iterators.c,v 1.43 2006/07/11 19:43:08 andrei Exp $ */ /* * TODO @@ -85,7 +85,7 @@ int (*valid) (text_iter_obj* object, long flags TSRMLS_DC); void (*current) (text_iter_obj* object, long flags TSRMLS_DC); int (*key) (text_iter_obj* object, long flags TSRMLS_DC); - int (*offset) (text_iter_obj* object, long flags TSRMLS_DC); + int (*offset) (text_iter_obj* object, long flags, int32_t *cp_offset TSRMLS_DC); void (*next) (text_iter_obj* object, long flags TSRMLS_DC); void (*rewind) (text_iter_obj* object, long flags TSRMLS_DC); void (*following) (text_iter_obj* object, int32_t offset, long flags TSRMLS_DC); @@ -144,9 +144,12 @@ return object->u.cp.index; } -static int text_iter_cp_offset(text_iter_obj* object, long flags TSRMLS_DC) +static int text_iter_cp_offset(text_iter_obj* object, long flags, int32_t *cp_offset TSRMLS_DC) { - return object->u.cp.cp_offset; + if (cp_offset) { + *cp_offset = object->u.cp.cp_offset; + } + return object->u.cp.offset; } static void text_iter_cp_next(text_iter_obj* object, long flags TSRMLS_DC) @@ -427,9 +430,12 @@ return object->u.cs.index; } -static int text_iter_cs_offset(text_iter_obj* object, long flags TSRMLS_DC) +static int text_iter_cs_offset(text_iter_obj* object, long flags, int32_t *cp_offset TSRMLS_DC) { - return object->u.cs.start_cp_offset; + if (cp_offset) { + *cp_offset = object->u.cs.start_cp_offset; + } + return object->u.cs.start; } static void text_iter_cs_next(text_iter_obj* object, long flags TSRMLS_DC) @@ -639,9 +645,12 @@ return object->u.brk.index; } -static int text_iter_brk_offset(text_iter_obj* object, long flags TSRMLS_DC) +static int text_iter_brk_offset(text_iter_obj* object, long flags, int32_t *cp_offset TSRMLS_DC) { - return object->u.brk.cp_offset; + if (cp_offset) { + *cp_offset = object->u.brk.cp_offset; + } + return object->u.brk.bound; } static void text_iter_brk_next(text_iter_obj* object, long flags TSRMLS_DC) @@ -1036,6 +1045,7 @@ PHP_METHOD(TextIterator, next) { long i, step = 1; + int32_t cp_offset; zval *object = getThis(); text_iter_obj *intern = (text_iter_obj*) zend_object_store_get_object(object TSRMLS_CC); @@ -1052,7 +1062,8 @@ } if (return_value_used) { - RETURN_LONG(iter_ops[intern->type]->offset(intern, intern->flags TSRMLS_CC)); + iter_ops[intern->type]->offset(intern, intern->flags, &cp_offset TSRMLS_CC); + RETURN_LONG(cp_offset); } } @@ -1074,35 +1085,48 @@ PHP_METHOD(TextIterator, rewind) { + int32_t cp_offset; zval *object = getThis(); text_iter_obj *intern = (text_iter_obj*) zend_object_store_get_object(object TSRMLS_CC); iter_ops[intern->type]->rewind(intern, intern->flags TSRMLS_CC); - RETURN_LONG(iter_ops[intern->type]->offset(intern, intern->flags TSRMLS_CC)); + + if (return_value_used) { + iter_ops[intern->type]->offset(intern, intern->flags, &cp_offset TSRMLS_CC); + RETURN_LONG(cp_offset); + } } PHP_METHOD(TextIterator, last) { long flags; + int32_t cp_offset; zval *object = getThis(); text_iter_obj *intern = (text_iter_obj*) zend_object_store_get_object(object TSRMLS_CC); flags = intern->flags ^ ITER_REVERSE; iter_ops[intern->type]->rewind(intern, flags TSRMLS_CC); - RETURN_LONG(iter_ops[intern->type]->offset(intern, flags TSRMLS_CC)); + + if (return_value_used) { + iter_ops[intern->type]->offset(intern, flags, &cp_offset TSRMLS_CC); + RETURN_LONG(cp_offset); + } } PHP_METHOD(TextIterator, offset) { + int32_t cp_offset; zval *object = getThis(); text_iter_obj *intern = (text_iter_obj*) zend_object_store_get_object(object TSRMLS_CC); - RETURN_LONG(iter_ops[intern->type]->offset(intern, intern->flags TSRMLS_CC)); + iter_ops[intern->type]->offset(intern, intern->flags, &cp_offset TSRMLS_CC); + RETURN_LONG(cp_offset); } PHP_METHOD(TextIterator, previous) { long flags, i, step = 1; + int32_t cp_offset; zval *object = getThis(); text_iter_obj *intern = (text_iter_obj*) zend_object_store_get_object(object TSRMLS_CC); @@ -1120,13 +1144,15 @@ } if (return_value_used) { - RETURN_LONG(iter_ops[intern->type]->offset(intern, flags TSRMLS_CC)); + iter_ops[intern->type]->offset(intern, flags, &cp_offset TSRMLS_CC); + RETURN_LONG(cp_offset); } } PHP_METHOD(TextIterator, following) { long offset; + int32_t cp_offset; zval *object = getThis(); text_iter_obj *intern = (text_iter_obj*) zend_object_store_get_object(object TSRMLS_CC); @@ -1135,12 +1161,14 @@ } iter_ops[intern->type]->following(intern, offset, intern->flags TSRMLS_CC); - RETURN_LONG(iter_ops[intern->type]->offset(intern, intern->flags TSRMLS_CC)); + iter_ops[intern->type]->offset(intern, intern->flags, &cp_offset TSRMLS_CC); + RETURN_LONG(cp_offset); } PHP_METHOD(TextIterator, preceding) { long flags, offset; + int32_t cp_offset; zval *object = getThis(); text_iter_obj *intern = (text_iter_obj*) zend_object_store_get_object(object TSRMLS_CC); @@ -1153,7 +1181,8 @@ */ flags = intern->flags | ITER_REVERSE; iter_ops[intern->type]->following(intern, offset, flags TSRMLS_CC); - RETURN_LONG(iter_ops[intern->type]->offset(intern, flags TSRMLS_CC)); + iter_ops[intern->type]->offset(intern, flags, &cp_offset TSRMLS_CC); + RETURN_LONG(cp_offset); } PHP_METHOD(TextIterator, isBoundary) @@ -1237,6 +1266,31 @@ } } +PHP_METHOD(TextIterator, getAll) +{ + int32_t start, end; + zval *object = getThis(); + text_iter_obj *intern = (text_iter_obj*) zend_object_store_get_object(object TSRMLS_CC); + text_iter_ops *ops = iter_ops[intern->type]; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + return; + } + + array_init(return_value); + ops->rewind(intern, intern->flags TSRMLS_CC); + start = ops->offset(intern, intern->flags, NULL TSRMLS_CC); + for (ops->next(intern, intern->flags TSRMLS_CC), end = ops->offset(intern, intern->flags, NULL TSRMLS_CC); + end != UBRK_DONE; + start = end, ops->next(intern, intern->flags TSRMLS_CC), end = ops->offset(intern, intern->flags, NULL TSRMLS_CC)) { + if (end > start) { + add_next_index_unicodel(return_value, intern->text + start, end - start, 1); + } else { + add_next_index_unicodel(return_value, intern->text + end, start - end, 1); + } + } +} + static zend_function_entry text_iterator_funcs[] = { PHP_ME(TextIterator, __construct, NULL, ZEND_ACC_PUBLIC) @@ -1255,6 +1309,8 @@ PHP_ME(TextIterator, preceding, NULL, ZEND_ACC_PUBLIC) PHP_ME(TextIterator, isBoundary, NULL, ZEND_ACC_PUBLIC) + PHP_ME(TextIterator, getAll, NULL, ZEND_ACC_PUBLIC) + PHP_ME(TextIterator, getRuleStatus, NULL, ZEND_ACC_PUBLIC) PHP_ME(TextIterator, getRuleStatusArray, NULL, ZEND_ACC_PUBLIC)
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php