andrei Wed Jun 28 15:28:55 2006 UTC Modified files: /php-src/ext/unicode unicode_iterators.c Log: Fix codepoint iterators http://cvs.php.net/viewvc.cgi/php-src/ext/unicode/unicode_iterators.c?r1=1.28&r2=1.29&diff_format=u Index: php-src/ext/unicode/unicode_iterators.c diff -u php-src/ext/unicode/unicode_iterators.c:1.28 php-src/ext/unicode/unicode_iterators.c:1.29 --- php-src/ext/unicode/unicode_iterators.c:1.28 Wed Jun 28 14:44:36 2006 +++ php-src/ext/unicode/unicode_iterators.c Wed Jun 28 15:28:55 2006 @@ -14,7 +14,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: unicode_iterators.c,v 1.28 2006/06/28 14:44:36 andrei Exp $ */ +/* $Id: unicode_iterators.c,v 1.29 2006/06/28 15:28:55 andrei Exp $ */ /* * TODO @@ -105,11 +105,7 @@ static int text_iter_cp_valid(text_iter_obj* object, long flags TSRMLS_DC) { - if (flags & ITER_REVERSE) { - return (object->u.cp.offset > 0); - } else { - return (object->u.cp.offset < object->text_len); - } + return (object->u.cp.offset != UBRK_DONE); } static void text_iter_cp_current(text_iter_obj* object, long flags TSRMLS_DC) @@ -117,14 +113,18 @@ UChar32 cp = 0; int32_t tmp, buf_len = 0; - if (text_iter_cp_valid(object, flags TSRMLS_CC)) { - tmp = object->u.cp.offset; - if (flags & ITER_REVERSE) { + tmp = object->u.cp.offset; + + if (flags & ITER_REVERSE) { + if (object->u.cp.offset != UBRK_DONE && object->u.cp.offset > 0) { U16_PREV(object->text, 0, tmp, cp); - } else { + buf_len = zend_codepoint_to_uchar(cp, Z_USTRVAL_P(object->current)); + } + } else { + if (object->u.cp.offset != UBRK_DONE && object->u.cp.offset < object->text_len) { U16_NEXT(object->text, tmp, object->text_len, cp); + buf_len = zend_codepoint_to_uchar(cp, Z_USTRVAL_P(object->current)); } - buf_len = zend_codepoint_to_uchar(cp, Z_USTRVAL_P(object->current)); } Z_USTRVAL_P(object->current)[buf_len] = 0; Z_USTRLEN_P(object->current) = buf_len; @@ -145,10 +145,18 @@ if (text_iter_cp_valid(object, flags TSRMLS_CC)) { if (flags & ITER_REVERSE) { U16_BACK_1(object->text, 0, object->u.cp.offset); - object->u.cp.cp_offset--; + if (object->u.cp.offset <= object->text_len) { + object->u.cp.cp_offset--; + } else { + object->u.cp.offset = object->u.cp.cp_offset = UBRK_DONE; + } } else { U16_FWD_1(object->text, object->u.cp.offset, object->text_len); - object->u.cp.cp_offset++; + if (object->u.cp.offset <= object->text_len) { + object->u.cp.cp_offset++; + } else { + object->u.cp.offset = object->u.cp.cp_offset = UBRK_DONE; + } } object->u.cp.index++; } @@ -275,7 +283,7 @@ /* UBreakIterator Character Ops */ -static int text_iter_brk_char_valid(text_iter_obj* object, long flags TSRMLS_DC) +static int text_iter_brk_valid(text_iter_obj* object, long flags TSRMLS_DC) { if (flags & ITER_REVERSE) { return (object->u.brk.bound != UBRK_DONE); @@ -284,7 +292,7 @@ } } -static void text_iter_brk_char_current(text_iter_obj* object, long flags TSRMLS_DC) +static void text_iter_brk_current(text_iter_obj* object, long flags TSRMLS_DC) { UChar *start; int32_t length = -1; @@ -319,17 +327,17 @@ Z_USTRLEN_P(object->current) = length; } -static int text_iter_brk_char_key(text_iter_obj* object, long flags TSRMLS_DC) +static int text_iter_brk_key(text_iter_obj* object, long flags TSRMLS_DC) { return object->u.brk.index; } -static int text_iter_brk_char_offset(text_iter_obj* object, long flags TSRMLS_DC) +static int text_iter_brk_offset(text_iter_obj* object, long flags TSRMLS_DC) { return object->u.brk.cp_offset; } -static void text_iter_brk_char_next(text_iter_obj* object, long flags TSRMLS_DC) +static void text_iter_brk_next(text_iter_obj* object, long flags TSRMLS_DC) { int32_t tmp = object->u.brk.bound; @@ -365,7 +373,7 @@ object->u.brk.index++; } -static void text_iter_brk_char_rewind(text_iter_obj *object, long flags TSRMLS_DC) +static void text_iter_brk_rewind(text_iter_obj *object, long flags TSRMLS_DC) { if (flags & ITER_REVERSE) { object->u.brk.bound = ubrk_last(object->u.brk.iter); @@ -380,12 +388,12 @@ } static text_iter_ops text_iter_brk_ops = { - text_iter_brk_char_valid, - text_iter_brk_char_current, - text_iter_brk_char_key, - text_iter_brk_char_offset, - text_iter_brk_char_next, - text_iter_brk_char_rewind, + text_iter_brk_valid, + text_iter_brk_current, + text_iter_brk_key, + text_iter_brk_offset, + text_iter_brk_next, + text_iter_brk_rewind, };
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php