From: Karl Williamson Date: Sat, 8 May 2010 20:06:10 +0000 (-0600) Subject: PATCH [perl #74978] dot after } breaks \N{} X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=37820adc4aeb8cb209843cf0abf3b24c8e5b59e8;p=p5sagit%2Fp5-mst-13.2.git PATCH [perl #74978] dot after } breaks \N{} 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. --- diff --git a/regcomp.c b/regcomp.c index f665f0b..be5acdb 100644 --- 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); diff --git a/t/re/pat.t b/t/re/pat.t index 40ae52e..7b9594c 100644 --- a/t/re/pat.t +++ b/t/re/pat.t @@ -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