andrei          Wed Feb  8 00:16:50 2006 UTC

  Modified files:              
    /php-src/ext/unicode        unicode_iterators.c 
  Log:
  Reverse iteration for combining sequences.
  
  
http://cvs.php.net/viewcvs.cgi/php-src/ext/unicode/unicode_iterators.c?r1=1.16&r2=1.17&diff_format=u
Index: php-src/ext/unicode/unicode_iterators.c
diff -u php-src/ext/unicode/unicode_iterators.c:1.16 
php-src/ext/unicode/unicode_iterators.c:1.17
--- php-src/ext/unicode/unicode_iterators.c:1.16        Tue Feb  7 20:01:28 2006
+++ php-src/ext/unicode/unicode_iterators.c     Wed Feb  8 00:16:50 2006
@@ -14,7 +14,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: unicode_iterators.c,v 1.16 2006/02/07 20:01:28 andrei Exp $ */
+/* $Id: unicode_iterators.c,v 1.17 2006/02/08 00:16:50 andrei Exp $ */
 
 /*
  * TODO
@@ -49,16 +49,16 @@
        long                    flags;
        union {
                struct {
-                       uint32_t index;
-                       uint32_t offset;
+                       int32_t index;
+                       int32_t offset;
                } cp;
                struct {
                        int32_t index;
                } cu;
                struct {
-                       uint32_t index;
-                       uint32_t start;
-                       uint32_t end;
+                       int32_t index;
+                       int32_t start;
+                       int32_t end;
                } cs;
        } u;
 } text_iter_obj;
@@ -200,7 +200,11 @@
 
 static int text_iter_cs_valid(text_iter_obj* object TSRMLS_DC)
 {
-       return (object->u.cs.end <= object->text_len);
+       if (object->flags & ITER_REVERSE) {
+               return (object->u.cs.end > 0);
+       } else {
+               return (object->u.cs.end <= object->text_len);
+       }
 }
 
 static void text_iter_cs_current(text_iter_obj* object TSRMLS_DC)
@@ -223,18 +227,28 @@
 static void text_iter_cs_next(text_iter_obj* object TSRMLS_DC)
 {
        UChar32 cp;
-       uint32_t end;
+       uint32_t tmp;
 
-       object->u.cs.start = object->u.cs.end;
-       U16_NEXT(object->text, object->u.cs.end, object->text_len, cp);
-       if (u_getCombiningClass(cp) == 0) {
-               end = object->u.cs.end;
-               while (end < object->text_len) {
-                       U16_NEXT(object->text, end, object->text_len, cp);
-                       if (u_getCombiningClass(cp) == 0) {
-                               break;
-                       } else {
-                               object->u.cs.end = end;
+       if (object->flags & ITER_REVERSE) {
+               object->u.cs.end = object->u.cs.start;
+               U16_PREV(object->text, 0, object->u.cs.start, cp);
+               if (u_getCombiningClass(cp) != 0) {
+                       do {
+                               U16_PREV(object->text, 0, object->u.cs.start, 
cp);
+                       } while (object->u.cs.start > 0 && 
u_getCombiningClass(cp) != 0);
+               }
+       } else {
+               object->u.cs.start = object->u.cs.end;
+               U16_NEXT(object->text, object->u.cs.end, object->text_len, cp);
+               if (u_getCombiningClass(cp) == 0) {
+                       tmp = object->u.cs.end;
+                       while (tmp < object->text_len) {
+                               U16_NEXT(object->text, tmp, object->text_len, 
cp);
+                               if (u_getCombiningClass(cp) == 0) {
+                                       break;
+                               } else {
+                                       object->u.cs.end = tmp;
+                               }
                        }
                }
        }
@@ -243,8 +257,11 @@
 
 static void text_iter_cs_rewind(text_iter_obj *object TSRMLS_DC)
 {
-       object->u.cs.start = 0;
-       object->u.cs.end   = 0;
+       if (object->flags & ITER_REVERSE) {
+               object->u.cs.start = object->u.cs.end = object->text_len;
+       } else {
+               object->u.cs.start = object->u.cs.end = 0;
+       }
        text_iter_cs_next(object TSRMLS_CC); /* find first sequence */
        object->u.cs.index = 0; /* because _next increments index */
 }

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to