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)
committerRicardo Signes <rjbs@cpan.org>
Thu, 9 Aug 2012 20:04:11 +0000 (16:04 -0400)
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 1f1d4bd..304f70a 100644 (file)
@@ -315,6 +315,13 @@ pattern is in UTF-8, the target string is not, and a Latin-1 character
 precedes a character in the string that should match the pattern.  [perl
 #101710]
 
+=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 2354be1..021ab8e 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -1507,7 +1507,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 35a7220..ae12452 100644 (file)
@@ -1522,4 +1522,10 @@ abc\N{def        -       c       -       \\N{NAME} must be resolved by the lexer
 # See [perl #89750].  This makes sure that the simple fold gets generated
 # in that case, to DF.
 /[^\x{1E9E}]/i \x{DF}  n       -       -
+
+/ff/i  \x{FB00}\x{FB01}        y       $&      \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}        y       $&      \x{FB01}
+
 # vim: softtabstop=0 noexpandtab