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