regexec.c: Fix "\x{FB01}\x{FB00}" =~ /ff/i
authorKarl Williamson <public@khwilliamson.com>
Fri, 14 Oct 2011 01:56:45 +0000 (19:56 -0600)
committerKarl Williamson <public@khwilliamson.com>
Fri, 14 Oct 2011 02:44:11 +0000 (20:44 -0600)
Only the first character of the string was being checked when scanning
for the beginning position of the pattern match.

This was so wrong, it looks like it has to be a regression.  I
experimented a little and did not find any.  I believe (but am not
certain) that a multi-char fold has to be involved.  The the handling of
these was so broken before 5.14 that there very well may not be a
regression.

pod/perldelta.pod
regexec.c
t/re/re_tests

index 4e24e25..5204b37 100644 (file)
@@ -606,6 +606,13 @@ A minor regression, introduced Perl 5.15.0, has been fixed in which some
 regular expression Unicode property matches (C<\p{...}>) matched
 non-Unicode code points.
 
+=item *
+
+In case-insensitive regular expression pattern matching, no longer on
+UTF-8 encoded strings does the scan for the start of match only look at
+the first possible position.  This caused matches such as
+C<"f\x{FB00}" =~ /ff/i> to fail.
+
 =back
 
 =head1 Known Problems
index 95462e4..d063308 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -1535,7 +1535,8 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
                    ? utf8_length((U8 *) pat_string, (U8 *) pat_end)
                    : ln;
 
-           e = HOP3c(strend, -((I32)lnc), s);
+           /* Set the end position to the final character available */
+           e = HOP3c(strend, -1, s);
 
            if (!reginfo && e < s) {
                e = s;                  /* Due to minlen logic of intuit() */
index 5a9b5db..9b65f55 100644 (file)
@@ -1542,8 +1542,8 @@ abc\N{def -       c       -       \\N{NAME} must be resolved by the lexer
 /^\R\x0A$/     \x0D\x0A        yT      $&      \x0D\x0A
 
 /ff/i  \x{FB00}\x{FB01}        y       $&      \x{FB00}
-/ff/i  \x{FB01}\x{FB00}        yT      $&      \x{FB00}
+/ff/i  \x{FB01}\x{FB00}        y       $&      \x{FB00}
 /fi/i  \x{FB01}\x{FB00}        y       $&      \x{FB01}
-/fi/i  \x{FB00}\x{FB01}        yT      $&      \x{FB01}
+/fi/i  \x{FB00}\x{FB01}        y       $&      \x{FB01}
 
 # vim: softtabstop=0 noexpandtab