The two loops in Perl_utf8_distance can be merged.
Nicholas Clark [Mon, 20 Mar 2006 12:13:46 +0000 (12:13 +0000)]
p4raw-id: //depot/perl@27552

utf8.c

diff --git a/utf8.c b/utf8.c
index e5079cb..af63ac3 100644 (file)
--- a/utf8.c
+++ b/utf8.c
@@ -705,41 +705,37 @@ Perl_utf8_distance(pTHX_ const U8 *a, const U8 *b)
 {
     dVAR;
     IV off = 0;
+    IV sign = 1;
 
     /* Note: cannot use UTF8_IS_...() too eagerly here since  e.g.
      * the bitops (especially ~) can create illegal UTF-8.
      * In other words: in Perl UTF-8 is not just for Unicode. */
 
     if (a < b) {
-       while (a < b) {
-           const U8 c = UTF8SKIP(a);
-           if (b - a < c)
-               goto warn_and_return;
-           a += c;
-           off--;
-       }
+       const U8 *const temp = a;
+       a = b;
+       b = temp;
+       sign = -1;
     }
-    else {
-       while (b < a) {
-           const U8 c = UTF8SKIP(b);
-
-           if (a - b < c) {
-               warn_and_return:
-               if (ckWARN_d(WARN_UTF8)) {
-                   if (PL_op)
-                       Perl_warner(aTHX_ packWARN(WARN_UTF8),
-                                   "%s in %s", unees, OP_DESC(PL_op));
-                   else
-                       Perl_warner(aTHX_ packWARN(WARN_UTF8), unees);
-               }
-               return off;
+
+    while (b < a) {
+       const U8 c = UTF8SKIP(b);
+
+       if (a - b < c) {
+           if (ckWARN_d(WARN_UTF8)) {
+               if (PL_op)
+                   Perl_warner(aTHX_ packWARN(WARN_UTF8),
+                               "%s in %s", unees, OP_DESC(PL_op));
+               else
+                   Perl_warner(aTHX_ packWARN(WARN_UTF8), unees);
            }
-           b += c;
-           off++;
+           return off * sign;
        }
+       b += c;
+       off++;
     }
 
-    return off;
+    return off * sign;
 }
 
 /*