PATCH [perl #74978] dot after } breaks \N{}
Karl Williamson [Sat, 8 May 2010 20:06:10 +0000 (14:06 -0600)]
The problem is that a dot can come between the braces in \N{foo.bar},
but when searching for it, I didn't stop looking at the right brace, so
it generated an error inappropriately.

This is essentially a minimum patch; efficiency could be improved
slightly with a little more work.

regcomp.c
t/re/pat.t

index f665f0b..be5acdb 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -6762,11 +6762,10 @@ S_reg_namedseq(pTHX_ RExC_state_t *pRExC_state, UV *valuep, I32 *flagp)
            | PERL_SCAN_DISALLOW_PREFIX
            | (SIZE_ONLY ? PERL_SCAN_SILENT_ILLDIGIT : 0);
     
-       char * endchar = strchr(RExC_parse, '.');
-       if (endchar) {
+       char * endchar = RExC_parse + strcspn(RExC_parse, ".}");
+       if (endchar < endbrace) {
            ckWARNreg(endchar, "Using just the first character returned by \\N{} in character class");
        }
-       else endchar = endbrace;
 
        length_of_hex = (STRLEN)(endchar - RExC_parse);
        *valuep = grok_hex(RExC_parse, &length_of_hex, &flags, NULL);
@@ -6817,8 +6816,7 @@ S_reg_namedseq(pTHX_ RExC_state_t *pRExC_state, UV *valuep, I32 *flagp)
 
            /* Code points are separated by dots.  If none, there is only one
             * code point, and is terminated by the brace */
-           endchar = strchr(RExC_parse, '.');
-           if (! endchar) endchar = endbrace;
+           endchar = RExC_parse + strcspn(RExC_parse, ".}");
 
            /* The values are Unicode even on EBCDIC machines */
            length_of_hex = (STRLEN)(endchar - RExC_parse);
index 40ae52e..7b9594c 100644 (file)
@@ -23,7 +23,7 @@ BEGIN {
 }
 
 
-plan tests => 297;  # Update this when adding/deleting tests.
+plan tests => 299;  # Update this when adding/deleting tests.
 
 run_tests() unless caller;
 
@@ -987,6 +987,12 @@ sub run_tests {
         ok "abbbbc" =~ m/\N{3,4}/ && $& eq "abbb", '"abbbbc" =~ m/\N{3,4}/ && $& eq "abbb"';
     }
 
+    {
+        use charnames ":full";
+        local $Message = '[perl #74982] Period coming after \N{}';
+        ok "\x{ff08}." =~ m/\N{FULLWIDTH LEFT PARENTHESIS}./ && $& eq "\x{ff08}.";
+        ok "\x{ff08}." =~ m/[\N{FULLWIDTH LEFT PARENTHESIS}]./ && $& eq "\x{ff08}.";
+    }
 
 } # End of sub run_tests