From 9de15fec376a8ff90a38fad0ff322c72c2995765 Mon Sep 17 00:00:00 2001 From: Karl Williamson Date: Mon, 20 Sep 2010 18:57:24 -0600 Subject: 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. --- universal.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'universal.c') 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) -- cgit v1.2.1