summaryrefslogtreecommitdiff
path: root/systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/regexp.h
diff options
context:
space:
mode:
Diffstat (limited to 'systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/regexp.h')
-rw-r--r--systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/regexp.h391
1 files changed, 209 insertions, 182 deletions
diff --git a/systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/regexp.h b/systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/regexp.h
index e12c6a9ffa..c4210edf84 100644
--- a/systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/regexp.h
+++ b/systems/texlive/tlnet/tlpkg/tlperl/lib/CORE/regexp.h
@@ -18,7 +18,7 @@
/* we don't want to include this stuff if we are inside of
an external regex engine based on the core one - like re 'debug'*/
-#include "utf8.h"
+# include "utf8.h"
typedef SSize_t regnode_offset;
@@ -49,11 +49,11 @@ struct reg_substr_data {
struct reg_substr_datum data[3]; /* Actual array */
};
-#ifdef PERL_ANY_COW
-#define SV_SAVED_COPY SV *saved_copy; /* If non-NULL, SV which is COW from original */
-#else
-#define SV_SAVED_COPY
-#endif
+# ifdef PERL_ANY_COW
+# define SV_SAVED_COPY SV *saved_copy; /* If non-NULL, SV which is COW from original */
+# else
+# define SV_SAVED_COPY
+# endif
/* offsets within a string of a particular /(.)/ capture */
@@ -69,14 +69,14 @@ typedef struct regexp_paren_pair {
SSize_t start_tmp;
} regexp_paren_pair;
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_UTF8_C)
-#define _invlist_union(a, b, output) _invlist_union_maybe_complement_2nd(a, b, FALSE, output)
-#define _invlist_intersection(a, b, output) _invlist_intersection_maybe_complement_2nd(a, b, FALSE, output)
+# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_UTF8_C)
+# define _invlist_union(a, b, output) _invlist_union_maybe_complement_2nd(a, b, FALSE, output)
+# define _invlist_intersection(a, b, output) _invlist_intersection_maybe_complement_2nd(a, b, FALSE, output)
/* Subtracting b from a leaves in a everything that was there that isn't in b,
* that is the intersection of a with b's complement */
-#define _invlist_subtract(a, b, output) _invlist_intersection_maybe_complement_2nd(a, b, TRUE, output)
-#endif
+# define _invlist_subtract(a, b, output) _invlist_intersection_maybe_complement_2nd(a, b, TRUE, output)
+# endif
/* record the position of a (?{...}) within a pattern */
@@ -97,6 +97,7 @@ struct reg_code_blocks {
/*
+= for apidoc AyT||regexp
The regexp/REGEXP struct, see L<perlreapi> for further documentation
on the individual fields. The struct is ordered so that the most
commonly used fields are placed at the start.
@@ -166,7 +167,7 @@ typedef struct regexp {
} regexp;
-#define RXp_PAREN_NAMES(rx) ((rx)->paren_names)
+# define RXp_PAREN_NAMES(rx) ((rx)->paren_names)
/* used for high speed searches */
typedef struct re_scream_pos_data_s
@@ -204,9 +205,9 @@ typedef struct regexp_engine {
SV* (*named_buff_iter) (pTHX_ REGEXP * const rx, const SV * const lastkey,
const U32 flags);
SV* (*qr_package)(pTHX_ REGEXP * const rx);
-#ifdef USE_ITHREADS
+# ifdef USE_ITHREADS
void* (*dupe) (pTHX_ REGEXP * const rx, CLONE_PARAMS *param);
-#endif
+# endif
REGEXP* (*op_comp) (pTHX_ SV ** const patternp, int pat_count,
OP *expr, const struct regexp_engine* eng,
REGEXP *old_re,
@@ -218,12 +219,12 @@ typedef struct regexp_engine {
paren name. >= 1 is reserved for actual numbered captures, i.e. $1,
$2 etc.
*/
-#define RX_BUFF_IDX_CARET_PREMATCH -5 /* ${^PREMATCH} */
-#define RX_BUFF_IDX_CARET_POSTMATCH -4 /* ${^POSTMATCH} */
-#define RX_BUFF_IDX_CARET_FULLMATCH -3 /* ${^MATCH} */
-#define RX_BUFF_IDX_PREMATCH -2 /* $` */
-#define RX_BUFF_IDX_POSTMATCH -1 /* $' */
-#define RX_BUFF_IDX_FULLMATCH 0 /* $& */
+# define RX_BUFF_IDX_CARET_PREMATCH -5 /* ${^PREMATCH} */
+# define RX_BUFF_IDX_CARET_POSTMATCH -4 /* ${^POSTMATCH} */
+# define RX_BUFF_IDX_CARET_FULLMATCH -3 /* ${^MATCH} */
+# define RX_BUFF_IDX_PREMATCH -2 /* $` */
+# define RX_BUFF_IDX_POSTMATCH -1 /* $' */
+# define RX_BUFF_IDX_FULLMATCH 0 /* $& */
/*
Flags that are passed to the named_buff and named_buff_iter
@@ -233,27 +234,25 @@ typedef struct regexp_engine {
*/
/* The Tie::Hash::NamedCapture operation this is part of, if any */
-#define RXapif_FETCH 0x0001
-#define RXapif_STORE 0x0002
-#define RXapif_DELETE 0x0004
-#define RXapif_CLEAR 0x0008
-#define RXapif_EXISTS 0x0010
-#define RXapif_SCALAR 0x0020
-#define RXapif_FIRSTKEY 0x0040
-#define RXapif_NEXTKEY 0x0080
+# define RXapif_FETCH 0x0001
+# define RXapif_STORE 0x0002
+# define RXapif_DELETE 0x0004
+# define RXapif_CLEAR 0x0008
+# define RXapif_EXISTS 0x0010
+# define RXapif_SCALAR 0x0020
+# define RXapif_FIRSTKEY 0x0040
+# define RXapif_NEXTKEY 0x0080
/* Whether %+ or %- is being operated on */
-#define RXapif_ONE 0x0100 /* %+ */
-#define RXapif_ALL 0x0200 /* %- */
+# define RXapif_ONE 0x0100 /* %+ */
+# define RXapif_ALL 0x0200 /* %- */
/* Whether this is being called from a re:: function */
-#define RXapif_REGNAME 0x0400
-#define RXapif_REGNAMES 0x0800
-#define RXapif_REGNAMES_COUNT 0x1000
+# define RXapif_REGNAME 0x0400
+# define RXapif_REGNAMES 0x0800
+# define RXapif_REGNAMES_COUNT 0x1000
/*
-=head1 REGEXP Functions
-
=for apidoc Am|REGEXP *|SvRX|SV *sv
Convenience macro to get the REGEXP from a SV. This is approximately
@@ -279,8 +278,8 @@ and check for NULL.
=cut
*/
-#define SvRX(sv) (Perl_get_re_arg(aTHX_ sv))
-#define SvRXOK(sv) cBOOL(Perl_get_re_arg(aTHX_ sv))
+# define SvRX(sv) (Perl_get_re_arg(aTHX_ sv))
+# define SvRXOK(sv) cBOOL(Perl_get_re_arg(aTHX_ sv))
/* Flags stored in regexp->extflags
@@ -294,11 +293,11 @@ and check for NULL.
*
*/
-#include "op_reg_common.h"
+# include "op_reg_common.h"
-#define RXf_PMf_STD_PMMOD (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_FOLD|RXf_PMf_EXTENDED|RXf_PMf_EXTENDED_MORE|RXf_PMf_NOCAPTURE)
+# define RXf_PMf_STD_PMMOD (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_FOLD|RXf_PMf_EXTENDED|RXf_PMf_EXTENDED_MORE|RXf_PMf_NOCAPTURE)
-#define CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl, x_count) \
+# define CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl, x_count) \
case IGNORE_PAT_MOD: *(pmfl) |= RXf_PMf_FOLD; break; \
case MULTILINE_PAT_MOD: *(pmfl) |= RXf_PMf_MULTILINE; break; \
case SINGLE_PAT_MOD: *(pmfl) |= RXf_PMf_SINGLELINE; break; \
@@ -314,7 +313,7 @@ and check for NULL.
case NOCAPTURE_PAT_MOD: *(pmfl) |= RXf_PMf_NOCAPTURE; break;
/* Note, includes charset ones, assumes 0 is the default for them */
-#define STD_PMMOD_FLAGS_CLEAR(pmfl) \
+# define STD_PMMOD_FLAGS_CLEAR(pmfl) \
*(pmfl) &= ~(RXf_PMf_FOLD|RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_EXTENDED|RXf_PMf_EXTENDED_MORE|RXf_PMf_CHARSET|RXf_PMf_NOCAPTURE)
/* chars and strings used as regex pattern modifiers
@@ -324,51 +323,51 @@ and check for NULL.
* for compatibility reasons with Regexp::Common which highjacked (?k:...)
* for its own uses. So 'k' is out as well.
*/
-#define DEFAULT_PAT_MOD '^' /* Short for all the default modifiers */
-#define EXEC_PAT_MOD 'e'
-#define KEEPCOPY_PAT_MOD 'p'
-#define NOCAPTURE_PAT_MOD 'n'
-#define ONCE_PAT_MOD 'o'
-#define GLOBAL_PAT_MOD 'g'
-#define CONTINUE_PAT_MOD 'c'
-#define MULTILINE_PAT_MOD 'm'
-#define SINGLE_PAT_MOD 's'
-#define IGNORE_PAT_MOD 'i'
-#define XTENDED_PAT_MOD 'x'
-#define NONDESTRUCT_PAT_MOD 'r'
-#define LOCALE_PAT_MOD 'l'
-#define UNICODE_PAT_MOD 'u'
-#define DEPENDS_PAT_MOD 'd'
-#define ASCII_RESTRICT_PAT_MOD 'a'
-
-#define ONCE_PAT_MODS "o"
-#define KEEPCOPY_PAT_MODS "p"
-#define NOCAPTURE_PAT_MODS "n"
-#define EXEC_PAT_MODS "e"
-#define LOOP_PAT_MODS "gc"
-#define NONDESTRUCT_PAT_MODS "r"
-#define LOCALE_PAT_MODS "l"
-#define UNICODE_PAT_MODS "u"
-#define DEPENDS_PAT_MODS "d"
-#define ASCII_RESTRICT_PAT_MODS "a"
-#define ASCII_MORE_RESTRICT_PAT_MODS "aa"
+# define DEFAULT_PAT_MOD '^' /* Short for all the default modifiers */
+# define EXEC_PAT_MOD 'e'
+# define KEEPCOPY_PAT_MOD 'p'
+# define NOCAPTURE_PAT_MOD 'n'
+# define ONCE_PAT_MOD 'o'
+# define GLOBAL_PAT_MOD 'g'
+# define CONTINUE_PAT_MOD 'c'
+# define MULTILINE_PAT_MOD 'm'
+# define SINGLE_PAT_MOD 's'
+# define IGNORE_PAT_MOD 'i'
+# define XTENDED_PAT_MOD 'x'
+# define NONDESTRUCT_PAT_MOD 'r'
+# define LOCALE_PAT_MOD 'l'
+# define UNICODE_PAT_MOD 'u'
+# define DEPENDS_PAT_MOD 'd'
+# define ASCII_RESTRICT_PAT_MOD 'a'
+
+# define ONCE_PAT_MODS "o"
+# define KEEPCOPY_PAT_MODS "p"
+# define NOCAPTURE_PAT_MODS "n"
+# define EXEC_PAT_MODS "e"
+# define LOOP_PAT_MODS "gc"
+# define NONDESTRUCT_PAT_MODS "r"
+# define LOCALE_PAT_MODS "l"
+# define UNICODE_PAT_MODS "u"
+# define DEPENDS_PAT_MODS "d"
+# define ASCII_RESTRICT_PAT_MODS "a"
+# define ASCII_MORE_RESTRICT_PAT_MODS "aa"
/* This string is expected by regcomp.c to be ordered so that the first
* character is the flag in bit RXf_PMf_STD_PMMOD_SHIFT of extflags; the next
* character is bit +1, etc. */
-#define STD_PAT_MODS "msixxn"
+# define STD_PAT_MODS "msixxn"
-#define CHARSET_PAT_MODS ASCII_RESTRICT_PAT_MODS DEPENDS_PAT_MODS LOCALE_PAT_MODS UNICODE_PAT_MODS
+# define CHARSET_PAT_MODS ASCII_RESTRICT_PAT_MODS DEPENDS_PAT_MODS LOCALE_PAT_MODS UNICODE_PAT_MODS
/* This string is expected by XS_re_regexp_pattern() in universal.c to be ordered
* so that the first character is the flag in bit RXf_PMf_STD_PMMOD_SHIFT of
* extflags; the next character is in bit +1, etc. */
-#define INT_PAT_MODS STD_PAT_MODS KEEPCOPY_PAT_MODS
+# define INT_PAT_MODS STD_PAT_MODS KEEPCOPY_PAT_MODS
-#define EXT_PAT_MODS ONCE_PAT_MODS KEEPCOPY_PAT_MODS NOCAPTURE_PAT_MODS
-#define QR_PAT_MODS STD_PAT_MODS EXT_PAT_MODS CHARSET_PAT_MODS
-#define M_PAT_MODS QR_PAT_MODS LOOP_PAT_MODS
-#define S_PAT_MODS M_PAT_MODS EXEC_PAT_MODS NONDESTRUCT_PAT_MODS
+# define EXT_PAT_MODS ONCE_PAT_MODS KEEPCOPY_PAT_MODS NOCAPTURE_PAT_MODS
+# define QR_PAT_MODS STD_PAT_MODS EXT_PAT_MODS CHARSET_PAT_MODS
+# define M_PAT_MODS QR_PAT_MODS LOOP_PAT_MODS
+# define S_PAT_MODS M_PAT_MODS EXEC_PAT_MODS NONDESTRUCT_PAT_MODS
/*
* NOTE: if you modify any RXf flags you should run regen.pl or
@@ -380,7 +379,7 @@ and check for NULL.
Set in Perl_pmruntime for a split. Will be used by regex engines to
check whether they should set RXf_SKIPWHITE
*/
-#define RXf_SPLIT RXf_PMf_SPLIT
+# define RXf_SPLIT RXf_PMf_SPLIT
/* Currently the regex flags occupy a single 32-bit word. Not all bits are
* currently used. The lower bits are shared with their corresponding PMf flag
@@ -415,50 +414,50 @@ and check for NULL.
* For the regexp bits, PL_reg_extflags_name[] in regnodes.h has a comment
* giving which bits are used/unused */
-#define RXf_BASE_SHIFT (_RXf_PMf_SHIFT_NEXT + 2)
+# define RXf_BASE_SHIFT (_RXf_PMf_SHIFT_NEXT + 2)
/* What we have seen */
-#define RXf_NO_INPLACE_SUBST (1U<<(RXf_BASE_SHIFT+2))
-#define RXf_EVAL_SEEN (1U<<(RXf_BASE_SHIFT+3))
+# define RXf_NO_INPLACE_SUBST (1U<<(RXf_BASE_SHIFT+2))
+# define RXf_EVAL_SEEN (1U<<(RXf_BASE_SHIFT+3))
/* Special */
-#define RXf_UNBOUNDED_QUANTIFIER_SEEN (1U<<(RXf_BASE_SHIFT+4))
-#define RXf_CHECK_ALL (1U<<(RXf_BASE_SHIFT+5))
+# define RXf_UNBOUNDED_QUANTIFIER_SEEN (1U<<(RXf_BASE_SHIFT+4))
+# define RXf_CHECK_ALL (1U<<(RXf_BASE_SHIFT+5))
/* UTF8 related */
-#define RXf_MATCH_UTF8 (1U<<(RXf_BASE_SHIFT+6)) /* $1 etc are utf8 */
+# define RXf_MATCH_UTF8 (1U<<(RXf_BASE_SHIFT+6)) /* $1 etc are utf8 */
/* Intuit related */
-#define RXf_USE_INTUIT_NOML (1U<<(RXf_BASE_SHIFT+7))
-#define RXf_USE_INTUIT_ML (1U<<(RXf_BASE_SHIFT+8))
-#define RXf_INTUIT_TAIL (1U<<(RXf_BASE_SHIFT+9))
-#define RXf_USE_INTUIT (RXf_USE_INTUIT_NOML|RXf_USE_INTUIT_ML)
+# define RXf_USE_INTUIT_NOML (1U<<(RXf_BASE_SHIFT+7))
+# define RXf_USE_INTUIT_ML (1U<<(RXf_BASE_SHIFT+8))
+# define RXf_INTUIT_TAIL (1U<<(RXf_BASE_SHIFT+9))
+# define RXf_USE_INTUIT (RXf_USE_INTUIT_NOML|RXf_USE_INTUIT_ML)
/* Do we have some sort of anchor? */
-#define RXf_IS_ANCHORED (1U<<(RXf_BASE_SHIFT+10))
+# define RXf_IS_ANCHORED (1U<<(RXf_BASE_SHIFT+10))
/* Copy and tainted info */
-#define RXf_COPY_DONE (1U<<(RXf_BASE_SHIFT+11))
+# define RXf_COPY_DONE (1U<<(RXf_BASE_SHIFT+11))
/* post-execution: $1 et al are tainted */
-#define RXf_TAINTED_SEEN (1U<<(RXf_BASE_SHIFT+12))
+# define RXf_TAINTED_SEEN (1U<<(RXf_BASE_SHIFT+12))
/* this pattern was tainted during compilation */
-#define RXf_TAINTED (1U<<(RXf_BASE_SHIFT+13))
+# define RXf_TAINTED (1U<<(RXf_BASE_SHIFT+13))
/* Flags indicating special patterns */
-#define RXf_START_ONLY (1U<<(RXf_BASE_SHIFT+14)) /* Pattern is /^/ */
-#define RXf_SKIPWHITE (1U<<(RXf_BASE_SHIFT+15)) /* Pattern is for a */
+# define RXf_START_ONLY (1U<<(RXf_BASE_SHIFT+14)) /* Pattern is /^/ */
+# define RXf_SKIPWHITE (1U<<(RXf_BASE_SHIFT+15)) /* Pattern is for a */
/* split " " */
-#define RXf_WHITE (1U<<(RXf_BASE_SHIFT+16)) /* Pattern is /\s+/ */
-#define RXf_NULL (1U<<(RXf_BASE_SHIFT+17)) /* Pattern is // */
+# define RXf_WHITE (1U<<(RXf_BASE_SHIFT+16)) /* Pattern is /\s+/ */
+# define RXf_NULL (1U<<(RXf_BASE_SHIFT+17)) /* Pattern is // */
/* See comments at the beginning of these defines about adding bits. The
* highest bit position should be used, so that if RXf_BASE_SHIFT gets
* increased, the #error below will be triggered so that you will be reminded
* to adjust things at the other end to keep the bit positions unchanged */
-#if RXf_BASE_SHIFT+17 > 31
-# error Too many RXf_PMf bits used. See comments at beginning of these for what to do
-#endif
+# if RXf_BASE_SHIFT+17 > 31
+# error Too many RXf_PMf bits used. See comments at beginning of these for what to do
+# endif
/*
* NOTE: if you modify any RXf flags you should run regen.pl or
@@ -466,99 +465,99 @@ and check for NULL.
*
*/
-#ifdef NO_TAINT_SUPPORT
-# define RX_ISTAINTED(rx_sv) 0
-# define RXp_ISTAINTED(prog) 0
-# define RX_TAINT_on(rx_sv) NOOP
-# define RXp_MATCH_TAINTED(prog) 0
-# define RX_MATCH_TAINTED(rx_sv) 0
-# define RXp_MATCH_TAINTED_on(prog) NOOP
-# define RX_MATCH_TAINTED_on(rx_sv) NOOP
-# define RXp_MATCH_TAINTED_off(prog) NOOP
-# define RX_MATCH_TAINTED_off(rx_sv) NOOP
-#else
-# define RX_ISTAINTED(rx_sv) (RX_EXTFLAGS(rx_sv) & RXf_TAINTED)
-# define RXp_ISTAINTED(prog) (RXp_EXTFLAGS(prog) & RXf_TAINTED)
-# define RX_TAINT_on(rx_sv) (RX_EXTFLAGS(rx_sv) |= RXf_TAINTED)
-# define RXp_MATCH_TAINTED(prog) (RXp_EXTFLAGS(prog) & RXf_TAINTED_SEEN)
-# define RX_MATCH_TAINTED(rx_sv) (RX_EXTFLAGS(rx_sv) & RXf_TAINTED_SEEN)
-# define RXp_MATCH_TAINTED_on(prog) (RXp_EXTFLAGS(prog) |= RXf_TAINTED_SEEN)
-# define RX_MATCH_TAINTED_on(rx_sv) (RX_EXTFLAGS(rx_sv) |= RXf_TAINTED_SEEN)
-# define RXp_MATCH_TAINTED_off(prog) (RXp_EXTFLAGS(prog) &= ~RXf_TAINTED_SEEN)
-# define RX_MATCH_TAINTED_off(rx_sv) (RX_EXTFLAGS(rx_sv) &= ~RXf_TAINTED_SEEN)
-#endif
-
-#define RXp_HAS_CUTGROUP(prog) ((prog)->intflags & PREGf_CUTGROUP_SEEN)
-
-#define RX_MATCH_TAINTED_set(rx_sv, t) ((t) \
+# ifdef NO_TAINT_SUPPORT
+# define RX_ISTAINTED(rx_sv) 0
+# define RXp_ISTAINTED(prog) 0
+# define RX_TAINT_on(rx_sv) NOOP
+# define RXp_MATCH_TAINTED(prog) 0
+# define RX_MATCH_TAINTED(rx_sv) 0
+# define RXp_MATCH_TAINTED_on(prog) NOOP
+# define RX_MATCH_TAINTED_on(rx_sv) NOOP
+# define RXp_MATCH_TAINTED_off(prog) NOOP
+# define RX_MATCH_TAINTED_off(rx_sv) NOOP
+# else
+# define RX_ISTAINTED(rx_sv) (RX_EXTFLAGS(rx_sv) & RXf_TAINTED)
+# define RXp_ISTAINTED(prog) (RXp_EXTFLAGS(prog) & RXf_TAINTED)
+# define RX_TAINT_on(rx_sv) (RX_EXTFLAGS(rx_sv) |= RXf_TAINTED)
+# define RXp_MATCH_TAINTED(prog) (RXp_EXTFLAGS(prog) & RXf_TAINTED_SEEN)
+# define RX_MATCH_TAINTED(rx_sv) (RX_EXTFLAGS(rx_sv) & RXf_TAINTED_SEEN)
+# define RXp_MATCH_TAINTED_on(prog) (RXp_EXTFLAGS(prog) |= RXf_TAINTED_SEEN)
+# define RX_MATCH_TAINTED_on(rx_sv) (RX_EXTFLAGS(rx_sv) |= RXf_TAINTED_SEEN)
+# define RXp_MATCH_TAINTED_off(prog) (RXp_EXTFLAGS(prog) &= ~RXf_TAINTED_SEEN)
+# define RX_MATCH_TAINTED_off(rx_sv) (RX_EXTFLAGS(rx_sv) &= ~RXf_TAINTED_SEEN)
+# endif
+
+# define RXp_HAS_CUTGROUP(prog) ((prog)->intflags & PREGf_CUTGROUP_SEEN)
+
+# define RX_MATCH_TAINTED_set(rx_sv, t) ((t) \
? RX_MATCH_TAINTED_on(rx_sv) \
: RX_MATCH_TAINTED_off(rx_sv))
-#define RXp_MATCH_COPIED(prog) (RXp_EXTFLAGS(prog) & RXf_COPY_DONE)
-#define RX_MATCH_COPIED(rx_sv) (RX_EXTFLAGS(rx_sv) & RXf_COPY_DONE)
-#define RXp_MATCH_COPIED_on(prog) (RXp_EXTFLAGS(prog) |= RXf_COPY_DONE)
-#define RX_MATCH_COPIED_on(rx_sv) (RX_EXTFLAGS(rx_sv) |= RXf_COPY_DONE)
-#define RXp_MATCH_COPIED_off(prog) (RXp_EXTFLAGS(prog) &= ~RXf_COPY_DONE)
-#define RX_MATCH_COPIED_off(rx_sv) (RX_EXTFLAGS(rx_sv) &= ~RXf_COPY_DONE)
-#define RX_MATCH_COPIED_set(rx_sv,t) ((t) \
+# define RXp_MATCH_COPIED(prog) (RXp_EXTFLAGS(prog) & RXf_COPY_DONE)
+# define RX_MATCH_COPIED(rx_sv) (RX_EXTFLAGS(rx_sv) & RXf_COPY_DONE)
+# define RXp_MATCH_COPIED_on(prog) (RXp_EXTFLAGS(prog) |= RXf_COPY_DONE)
+# define RX_MATCH_COPIED_on(rx_sv) (RX_EXTFLAGS(rx_sv) |= RXf_COPY_DONE)
+# define RXp_MATCH_COPIED_off(prog) (RXp_EXTFLAGS(prog) &= ~RXf_COPY_DONE)
+# define RX_MATCH_COPIED_off(rx_sv) (RX_EXTFLAGS(rx_sv) &= ~RXf_COPY_DONE)
+# define RX_MATCH_COPIED_set(rx_sv,t) ((t) \
? RX_MATCH_COPIED_on(rx_sv) \
: RX_MATCH_COPIED_off(rx_sv))
-#define RXp_EXTFLAGS(rx) ((rx)->extflags)
-#define RXp_COMPFLAGS(rx) ((rx)->compflags)
+# define RXp_EXTFLAGS(rx) ((rx)->extflags)
+# define RXp_COMPFLAGS(rx) ((rx)->compflags)
/* For source compatibility. We used to store these explicitly. */
-#define RX_PRECOMP(rx_sv) (RX_WRAPPED(rx_sv) \
+# define RX_PRECOMP(rx_sv) (RX_WRAPPED(rx_sv) \
+ ReANY(rx_sv)->pre_prefix)
-#define RX_PRECOMP_const(rx_sv) (RX_WRAPPED_const(rx_sv) \
+# define RX_PRECOMP_const(rx_sv) (RX_WRAPPED_const(rx_sv) \
+ ReANY(rx_sv)->pre_prefix)
/* FIXME? Are we hardcoding too much here and constraining plugin extension
writers? Specifically, the value 1 assumes that the wrapped version always
has exactly one character at the end, a ')'. Will that always be true? */
-#define RX_PRELEN(rx_sv) (RX_WRAPLEN(rx_sv) \
+# define RX_PRELEN(rx_sv) (RX_WRAPLEN(rx_sv) \
- ReANY(rx_sv)->pre_prefix - 1)
-#define RX_WRAPPED(rx_sv) SvPVX(rx_sv)
-#define RX_WRAPPED_const(rx_sv) SvPVX_const(rx_sv)
-#define RX_WRAPLEN(rx_sv) SvCUR(rx_sv)
-#define RX_CHECK_SUBSTR(rx_sv) (ReANY(rx_sv)->check_substr)
-#define RX_REFCNT(rx_sv) SvREFCNT(rx_sv)
-#define RX_EXTFLAGS(rx_sv) RXp_EXTFLAGS(ReANY(rx_sv))
-#define RX_COMPFLAGS(rx_sv) RXp_COMPFLAGS(ReANY(rx_sv))
-#define RXp_ENGINE(prog) ((prog)->engine)
-#define RX_ENGINE(rx_sv) (RXp_ENGINE(ReANY(rx_sv)))
-#define RXp_SUBBEG(prog) (prog->subbeg)
-#define RX_SUBBEG(rx_sv) (RXp_SUBBEG(ReANY(rx_sv)))
-#define RXp_SUBOFFSET(prog) (prog->suboffset)
-#define RX_SUBOFFSET(rx_sv) (RXp_SUBOFFSET(ReANY(rx_sv)))
-#define RX_SUBCOFFSET(rx_sv) (ReANY(rx_sv)->subcoffset)
-#define RXp_OFFS(prog) (prog->offs)
-#define RX_OFFS(rx_sv) (RXp_OFFS(ReANY(rx_sv)))
-#define RXp_NPARENS(prog) (prog->nparens)
-#define RX_NPARENS(rx_sv) (RXp_NPARENS(ReANY(rx_sv)))
-#define RX_SUBLEN(rx_sv) (ReANY(rx_sv)->sublen)
-#define RXp_MINLEN(prog) (prog->minlen)
-#define RX_MINLEN(rx_sv) (RXp_MINLEN(ReANY(rx_sv)))
-#define RXp_MINLENRET(prog) (prog->minlenret)
-#define RX_MINLENRET(rx_sv) (RXp_MINLENRET(ReANY(rx_sv)))
-#define RXp_GOFS(prog) (prog->gofs)
-#define RX_GOFS(rx_sv) (RXp_GOFS(ReANY(rx_sv)))
-#define RX_LASTPAREN(rx_sv) (ReANY(rx_sv)->lastparen)
-#define RX_LASTCLOSEPAREN(rx_sv) (ReANY(rx_sv)->lastcloseparen)
-#define RXp_SAVED_COPY(prog) (prog->saved_copy)
-#define RX_SAVED_COPY(rx_sv) (RXp_SAVED_COPY(ReANY(rx_sv)))
+# define RX_WRAPPED(rx_sv) SvPVX(rx_sv)
+# define RX_WRAPPED_const(rx_sv) SvPVX_const(rx_sv)
+# define RX_WRAPLEN(rx_sv) SvCUR(rx_sv)
+# define RX_CHECK_SUBSTR(rx_sv) (ReANY(rx_sv)->check_substr)
+# define RX_REFCNT(rx_sv) SvREFCNT(rx_sv)
+# define RX_EXTFLAGS(rx_sv) RXp_EXTFLAGS(ReANY(rx_sv))
+# define RX_COMPFLAGS(rx_sv) RXp_COMPFLAGS(ReANY(rx_sv))
+# define RXp_ENGINE(prog) ((prog)->engine)
+# define RX_ENGINE(rx_sv) (RXp_ENGINE(ReANY(rx_sv)))
+# define RXp_SUBBEG(prog) (prog->subbeg)
+# define RX_SUBBEG(rx_sv) (RXp_SUBBEG(ReANY(rx_sv)))
+# define RXp_SUBOFFSET(prog) (prog->suboffset)
+# define RX_SUBOFFSET(rx_sv) (RXp_SUBOFFSET(ReANY(rx_sv)))
+# define RX_SUBCOFFSET(rx_sv) (ReANY(rx_sv)->subcoffset)
+# define RXp_OFFS(prog) (prog->offs)
+# define RX_OFFS(rx_sv) (RXp_OFFS(ReANY(rx_sv)))
+# define RXp_NPARENS(prog) (prog->nparens)
+# define RX_NPARENS(rx_sv) (RXp_NPARENS(ReANY(rx_sv)))
+# define RX_SUBLEN(rx_sv) (ReANY(rx_sv)->sublen)
+# define RXp_MINLEN(prog) (prog->minlen)
+# define RX_MINLEN(rx_sv) (RXp_MINLEN(ReANY(rx_sv)))
+# define RXp_MINLENRET(prog) (prog->minlenret)
+# define RX_MINLENRET(rx_sv) (RXp_MINLENRET(ReANY(rx_sv)))
+# define RXp_GOFS(prog) (prog->gofs)
+# define RX_GOFS(rx_sv) (RXp_GOFS(ReANY(rx_sv)))
+# define RX_LASTPAREN(rx_sv) (ReANY(rx_sv)->lastparen)
+# define RX_LASTCLOSEPAREN(rx_sv) (ReANY(rx_sv)->lastcloseparen)
+# define RXp_SAVED_COPY(prog) (prog->saved_copy)
+# define RX_SAVED_COPY(rx_sv) (RXp_SAVED_COPY(ReANY(rx_sv)))
/* last match was zero-length */
-#define RXp_ZERO_LEN(prog) \
+# define RXp_ZERO_LEN(prog) \
(RXp_OFFS(prog)[0].start + (SSize_t)RXp_GOFS(prog) \
== RXp_OFFS(prog)[0].end)
-#define RX_ZERO_LEN(rx_sv) (RXp_ZERO_LEN(ReANY(rx_sv)))
+# define RX_ZERO_LEN(rx_sv) (RXp_ZERO_LEN(ReANY(rx_sv)))
#endif /* PLUGGABLE_RE_EXTENSION */
/* Stuff that needs to be included in the pluggable extension goes below here */
#ifdef PERL_ANY_COW
-#define RXp_MATCH_COPY_FREE(prog) \
+# define RXp_MATCH_COPY_FREE(prog) \
STMT_START {if (RXp_SAVED_COPY(prog)) { \
SV_CHECK_THINKFIRST_COW_DROP(RXp_SAVED_COPY(prog)); \
} \
@@ -567,7 +566,7 @@ and check for NULL.
RXp_MATCH_COPIED_off(prog); \
}} STMT_END
#else
-#define RXp_MATCH_COPY_FREE(prog) \
+# define RXp_MATCH_COPY_FREE(prog) \
STMT_START {if (RXp_MATCH_COPIED(prog)) { \
Safefree(RXp_SUBBEG(prog)); \
RXp_MATCH_COPIED_off(prog); \
@@ -608,7 +607,7 @@ and check for NULL.
the start pos (so s/.\G// would fail
on second iteration */
-#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#if defined(PERL_USE_GCC_BRACE_GROUPS)
# define ReREFCNT_inc(re) \
({ \
/* This is here to generate a casting warning if incorrect. */ \
@@ -675,12 +674,17 @@ typedef struct {
} regmatch_info_aux;
-/* some basic information about the current match that is created by
- * Perl_regexec_flags and then passed to regtry(), regmatch() etc.
- * It is allocated as a local var on the stack, so nothing should be
- * stored in it that needs preserving or clearing up on croak().
- * For that, see the aux_info and aux_info_eval members of the
- * regmatch_state union. */
+/*
+=for apidoc Ay||regmatch_info
+Some basic information about the current match that is created by
+Perl_regexec_flags and then passed to regtry(), regmatch() etc.
+It is allocated as a local var on the stack, so nothing should be
+stored in it that needs preserving or clearing up on croak().
+For that, see the aux_info and aux_info_eval members of the
+regmatch_state union.
+
+=cut
+*/
typedef struct {
REGEXP *prog; /* the regex being executed */
@@ -705,9 +709,36 @@ typedef struct {
/* structures for holding and saving the state maintained by regmatch() */
#ifndef MAX_RECURSE_EVAL_NOCHANGE_DEPTH
-#define MAX_RECURSE_EVAL_NOCHANGE_DEPTH 10
+# define MAX_RECURSE_EVAL_NOCHANGE_DEPTH 10
#endif
+/* The +1 is because everything matches itself, which isn't included in
+ * MAX_FOLD_FROMS; the +2 is based on the current Unicode standards needs, and
+ * is unlikely to change. An assertion should fail in regexec.c if it is too
+ * low. It is needed for certain edge cases involving multi-character folds
+ * when the first component also participates in a fold individually. */
+#define MAX_MATCHES (MAX_FOLD_FROMS + 1 + 2)
+
+struct next_matchable_info {
+ U8 first_byte_mask;
+ U8 first_byte_anded;
+ U32 mask32;
+ U32 anded32;
+ PERL_INT_FAST8_T count; /* Negative means not initialized */
+ PERL_UINT_FAST8_T min_length;
+ PERL_UINT_FAST8_T max_length;
+ PERL_UINT_FAST8_T initial_definitive;
+ PERL_UINT_FAST8_T initial_exact;
+ PERL_UINT_FAST8_T lengths[MAX_MATCHES];
+
+ /* The size is from trial and error, and could change with new Unicode
+ * standards, in which case there is an assertion that should start
+ * failing. This size could be calculated in one of the regen scripts
+ * dealing with Unicode, but khw thinks the likelihood of it changing is
+ * low enough that it isn't worth the effort. */
+ U8 matches[18];
+};
+
typedef I32 CHECKPOINT;
typedef struct regmatch_state {
@@ -856,7 +887,6 @@ typedef struct regmatch_state {
struct {
/* this first element must match u.yes */
struct regmatch_state *prev_yes_state;
- int c1, c2; /* case fold search */
CHECKPOINT cp;
U32 lastparen;
U32 lastcloseparen;
@@ -865,8 +895,7 @@ typedef struct regmatch_state {
bool minmod;
regnode *A, *B; /* the nodes corresponding to /A*B/ */
regnode *me; /* the curlym node */
- U8 c1_utf8[UTF8_MAXBYTES+1]; /* */
- U8 c2_utf8[UTF8_MAXBYTES+1];
+ struct next_matchable_info Binfo;
} curlym;
struct {
@@ -874,14 +903,12 @@ typedef struct regmatch_state {
CHECKPOINT cp;
U32 lastparen;
U32 lastcloseparen;
- int c1, c2; /* case fold search */
char *maxpos; /* highest possible point in string to match */
char *oldloc; /* the previous locinput */
int count;
int min, max; /* {m,n} */
regnode *A, *B; /* the nodes corresponding to /A*B/ */
- U8 c1_utf8[UTF8_MAXBYTES+1]; /* */
- U8 c2_utf8[UTF8_MAXBYTES+1];
+ struct next_matchable_info Binfo;
} curly; /* and CURLYN/PLUS/STAR */
} u;