Four wrongs can make a right.
Jarkko Hietaniemi [Sun, 30 Dec 2001 23:12:17 +0000 (23:12 +0000)]
p4raw-id: //depot/perl@13965

regexec.c
utf8.c

index 3860fd2..dfb01ed 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -979,8 +979,8 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                    while (s <= e) {
                        if ( utf8_to_uvchr((U8*)s, &len) == c1
                             && (ln == len ||
-                                ibcmp_utf8(s, do_utf8, (I32)(strend - s),
-                                           m, UTF, (I32)ln))
+                                !ibcmp_utf8(s, do_utf8, (I32)(strend - s),
+                                            m, UTF, (I32)ln))
                             && (norun || regtry(prog, s)) )
                            goto got_it;
                        s += len;
@@ -1002,8 +1002,9 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                            c == (UV)UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA)
                            c = (UV)UNICODE_GREEK_SMALL_LETTER_SIGMA;
                        if ( (c == c1 || c == c2 || f == c1 || f == c2)
-                            && ibcmp_utf8(s, do_utf8, (I32)(strend - s),
-                                          m, UTF, (I32)ln)
+                            && (ln == len ||
+                                !ibcmp_utf8(s, do_utf8, (I32)(strend - s),
+                                            m, UTF, (I32)ln))
                             && (norun || regtry(prog, s)) )
                            goto got_it;
                        s += len;
diff --git a/utf8.c b/utf8.c
index 27f86b6..0453d1b 100644 (file)
--- a/utf8.c
+++ b/utf8.c
@@ -1668,7 +1668,7 @@ Perl_ibcmp_utf8(pTHX_ const char *s1, bool u1, register I32 len1, const char *s2
 {
      register U8 *a  = (U8*)s1;
      register U8 *b  = (U8*)s2;
-     register U8 *ae = b + len1;
+     register U8 *ae = a + len1;
      register U8 *be = b + len2;
      STRLEN la, lb;
      UV ca, cb;
@@ -1703,7 +1703,8 @@ Perl_ibcmp_utf8(pTHX_ const char *s1, bool u1, register I32 len1, const char *s2
               else
                    ulen2 = 1;
               if (ulen1 != ulen2
-                  || (ulen1 == 1 && PL_fold[ca] != PL_fold[cb])
+                  || (ca < 256 && cb < 256 &&
+                      PL_fold[ca] != PL_fold[cb])
                   || memNE((char *)tmpbuf1, (char *)tmpbuf2, ulen1))
                    return 1; /* mismatch */
          }