andrei Fri Jul 7 22:52:26 2006 UTC Modified files: /php-src/ext/unicode unicode_iterators.c Log: Implement isBoundary() for code point iterator. http://cvs.php.net/viewvc.cgi/php-src/ext/unicode/unicode_iterators.c?r1=1.32&r2=1.33&diff_format=u Index: php-src/ext/unicode/unicode_iterators.c diff -u php-src/ext/unicode/unicode_iterators.c:1.32 php-src/ext/unicode/unicode_iterators.c:1.33 --- php-src/ext/unicode/unicode_iterators.c:1.32 Fri Jul 7 22:34:46 2006 +++ php-src/ext/unicode/unicode_iterators.c Fri Jul 7 22:52:26 2006 @@ -14,7 +14,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: unicode_iterators.c,v 1.32 2006/07/07 22:34:46 andrei Exp $ */ +/* $Id: unicode_iterators.c,v 1.33 2006/07/07 22:52:26 andrei Exp $ */ /* * TODO @@ -176,6 +176,51 @@ object->u.cp.index = 0; } +static void text_iter_cp_following(text_iter_obj *object, int32_t offset, long flags TSRMLS_DC) +{ +} + +static zend_bool text_iter_cp_isBoundary(text_iter_obj *object, int32_t offset, long flags TSRMLS_DC) +{ + int32_t k; + + if (offset < 0) { + offset = 0; + } + + /* + * On invalid iterator we always want to start looking for the code unit + * offset from the beginning of the string. + */ + if (object->u.cp.cp_offset == UBRK_DONE) { + object->u.cp.cp_offset = 0; + object->u.cp.offset = 0; + } + + /* + * Try to locate the code unit position relative to the last known codepoint + * offset. + */ + k = object->u.cp.offset; + if (offset > object->u.cp.cp_offset) { + U16_FWD_N(object->text, k, object->text_len, offset - object->u.cp.cp_offset); + } else { + U16_BACK_N(object->text, 0, k, object->u.cp.cp_offset - offset); + } + + if (k == object->text_len) { + object->u.cp.cp_offset += u_countChar32(object->text + object->u.cp.offset, k - object->u.cp.offset); + } else { + object->u.cp.cp_offset = offset; + } + object->u.cp.offset = k; + + /* + * Every codepoint is a boundary. + */ + return TRUE; +} + static text_iter_ops text_iter_cp_ops = { text_iter_cp_valid, text_iter_cp_current, @@ -183,6 +228,8 @@ text_iter_cp_offset, text_iter_cp_next, text_iter_cp_rewind, + text_iter_cp_following, + text_iter_cp_isBoundary, }; /* Combining sequence ops */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php