summaryrefslogtreecommitdiff
path: root/universal.c
diff options
context:
space:
mode:
authorKarl Williamson <public@khwilliamson.com>2010-09-20 18:57:24 -0600
committerFather Chrysostomos <sprout@cpan.org>2010-09-22 22:54:23 -0700
commit9de15fec376a8ff90a38fad0ff322c72c2995765 (patch)
tree95729b4e82e14d795b481df7902da07be8c9ab67 /universal.c
parent4c2c679ff9fc18054795b9b7b28e37453e57d146 (diff)
downloadperl-9de15fec376a8ff90a38fad0ff322c72c2995765.tar.gz
Add /d, /l, /u (infixed) regex modifiers
This patch adds recognition of these modifiers, with appropriate action for d and l. u does nothing useful yet. This allows for the interpolation of a regex into another one without losing the character set semantics that it was compiled with, as for the first time, the semantics is now specified in the stringification as one of these modifiers. To this end, it allocates an unused bit in the structures. The off- sets change so as to not disturb other bits.
Diffstat (limited to 'universal.c')
-rw-r--r--universal.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/universal.c b/universal.c
index fe53969bcd..102ff91919 100644
--- a/universal.c
+++ b/universal.c
@@ -1189,16 +1189,23 @@ XS(XS_re_regexp_pattern)
{
/* Houston, we have a regex! */
SV *pattern;
- STRLEN left = 0;
- char reflags[sizeof(INT_PAT_MODS)];
if ( GIMME_V == G_ARRAY ) {
+ STRLEN left = 0;
+ char reflags[sizeof(INT_PAT_MODS) + 1]; /* The +1 is for the charset
+ modifier */
/*
we are in list context so stringify
the modifiers that apply. We ignore "negative
modifiers" in this scenario.
*/
+ if (RX_EXTFLAGS(re) & RXf_PMf_LOCALE) {
+ reflags[left++] = LOCALE_PAT_MOD;
+ }
+ else if (RX_EXTFLAGS(re) & RXf_PMf_UNICODE) {
+ reflags[left++] = UNICODE_PAT_MOD;
+ }
const char *fptr = INT_PAT_MODS;
char ch;
U16 match_flags = (U16)((RX_EXTFLAGS(re) & PMf_COMPILETIME)