diff options
author | Karl Williamson <public@khwilliamson.com> | 2011-02-19 14:27:18 -0700 |
---|---|---|
committer | Karl Williamson <public@khwilliamson.com> | 2011-02-19 17:18:05 -0700 |
commit | de87c4fec898d44ec7ff4bdaba989015b8ec0089 (patch) | |
tree | 174d0d663a8f1145aaafa052b62f163a25fa4cfb /regexec.c | |
parent | 236d7867779a27dce9f2a12d974d7fba484394de (diff) | |
download | perl-de87c4fec898d44ec7ff4bdaba989015b8ec0089.tar.gz |
regexec.c: Fix utf8 e.g. [\s] under locale
locale rules are handled improperly for utf8-encoded strings in
bracketed character classes under locale. This fixes that.
Diffstat (limited to 'regexec.c')
-rw-r--r-- | regexec.c | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -6618,13 +6618,18 @@ S_reginclass(pTHX_ const regexp * const prog, register const regnode * const n, } /* If the bitmap didn't (or couldn't) match, and something outside the - * bitmap could match, try that */ + * bitmap could match, try that. Locale nodes specifiy completely the + * behavior of code points in the bit map (otherwise, a utf8 target would + * cause them to be treated as Unicode and not locale), except XXX in + * the very unlikely event when this node is a synthetic start class, which + * could be a combination of locale and non-locale nodes */ if (!match) { if (utf8_target && (flags & ANYOF_UNICODE_ALL) && c >= 256) { match = TRUE; /* Everything above 255 matches */ } else if ((flags & ANYOF_NONBITMAP_NON_UTF8 - || (utf8_target && flags & ANYOF_UTF8))) + || (utf8_target && flags & ANYOF_UTF8 + && (c >=256 || ! (flags & ANYOF_LOCALE))))) { AV *av; SV * const sw = regclass_swash(prog, n, TRUE, 0, (SV**)&av); |