X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/d02d6d97d5eefad4e164003699595f59abb06506..90b16320f2d9f077cb58830cb1c93fbde7b6e34e:/regexp.h?ds=sidebyside diff --git a/regexp.h b/regexp.h index f87031c..5acdc5e 100644 --- a/regexp.h +++ b/regexp.h @@ -218,28 +218,17 @@ and check for NULL. /* Flags stored in regexp->extflags * These are used by code external to the regexp engine * - * Note that flags starting with RXf_PMf_ have exact equivalents - * stored in op_pmflags and which are defined in op.h, they are defined - * numerically here only for clarity. + * Note that the flags whose names start with RXf_PMf_ are defined in + * op_reg_common.h, being copied from the parallel flags of op_pmflags * - * NOTE: if you modify any RXf flags you should run regen.pl or regcomp.pl - * so that regnodes.h is updated with the changes. + * NOTE: if you modify any RXf flags you should run regen.pl or + * regen/regcomp.pl so that regnodes.h is updated with the changes. * */ -/* 0x3F of extflags is used by (RXf_)PMf_COMPILETIME - * If you change these you need to change the equivalent flags in op.h, and - * vice versa. */ -#define RXf_PMf_MULTILINE 0x00000001 /* /m */ -#define RXf_PMf_SINGLELINE 0x00000002 /* /s */ -#define RXf_PMf_FOLD 0x00000004 /* /i */ -#define RXf_PMf_EXTENDED 0x00000008 /* /x */ -#define RXf_PMf_KEEPCOPY 0x00000010 /* /p */ -#define RXf_PMf_LOCALE 0x00000020 /* use locale */ -/* these flags are transfered from the PMOP->op_pmflags member during compilation */ -#define RXf_PMf_STD_PMMOD_SHIFT 0 +#include "op_reg_common.h" + #define RXf_PMf_STD_PMMOD (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_FOLD|RXf_PMf_EXTENDED) -#define RXf_PMf_COMPILETIME (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_LOCALE|RXf_PMf_FOLD|RXf_PMf_EXTENDED|RXf_PMf_KEEPCOPY) #define CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl) \ case IGNORE_PAT_MOD: *(pmfl) |= RXf_PMf_FOLD; break; \ @@ -247,6 +236,10 @@ and check for NULL. case SINGLE_PAT_MOD: *(pmfl) |= RXf_PMf_SINGLELINE; break; \ case XTENDED_PAT_MOD: *(pmfl) |= RXf_PMf_EXTENDED; break +/* Note, includes locale, unicode */ +#define STD_PMMOD_FLAGS_CLEAR(pmfl) \ + *(pmfl) &= ~(RXf_PMf_FOLD|RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_EXTENDED|RXf_PMf_LOCALE|RXf_PMf_UNICODE) + /* chars and strings used as regex pattern modifiers * Singlular is a 'c'har, plural is a "string" * @@ -254,6 +247,7 @@ 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 ONCE_PAT_MOD 'o' @@ -264,15 +258,27 @@ and check for NULL. #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 DUAL_PAT_MOD 'd' #define ONCE_PAT_MODS "o" #define KEEPCOPY_PAT_MODS "p" #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 DUAL_PAT_MODS "d" +/* 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 "msix" +/* 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 EXT_PAT_MODS ONCE_PAT_MODS KEEPCOPY_PAT_MODS @@ -281,63 +287,70 @@ and check for NULL. #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 regcomp.pl - * so that regnodes.h is updated with the changes. + * NOTE: if you modify any RXf flags you should run regen.pl or + * regen/regcomp.pl so that regnodes.h is updated with the changes. * */ +/* Leave some space, so future bit allocations can go either in the shared or + * unshared area without affecting binary compatibility */ +#define RXf_BASE_SHIFT (_RXf_PMf_SHIFT_NEXT+2) + /* Anchor and GPOS related stuff */ -#define RXf_ANCH_BOL 0x00000100 -#define RXf_ANCH_MBOL 0x00000200 -#define RXf_ANCH_SBOL 0x00000400 -#define RXf_ANCH_GPOS 0x00000800 -#define RXf_GPOS_SEEN 0x00001000 -#define RXf_GPOS_FLOAT 0x00002000 +#define RXf_ANCH_BOL (1<<(RXf_BASE_SHIFT+0)) +#define RXf_ANCH_MBOL (1<<(RXf_BASE_SHIFT+1)) +#define RXf_ANCH_SBOL (1<<(RXf_BASE_SHIFT+2)) +#define RXf_ANCH_GPOS (1<<(RXf_BASE_SHIFT+3)) +#define RXf_GPOS_SEEN (1<<(RXf_BASE_SHIFT+4)) +#define RXf_GPOS_FLOAT (1<<(RXf_BASE_SHIFT+5)) /* two bits here */ #define RXf_ANCH (RXf_ANCH_BOL|RXf_ANCH_MBOL|RXf_ANCH_GPOS|RXf_ANCH_SBOL) #define RXf_GPOS_CHECK (RXf_GPOS_SEEN|RXf_ANCH_GPOS) #define RXf_ANCH_SINGLE (RXf_ANCH_SBOL|RXf_ANCH_GPOS) /* What we have seen */ -#define RXf_LOOKBEHIND_SEEN 0x00004000 -#define RXf_EVAL_SEEN 0x00008000 -#define RXf_CANY_SEEN 0x00010000 +#define RXf_LOOKBEHIND_SEEN (1<<(RXf_BASE_SHIFT+6)) +#define RXf_EVAL_SEEN (1<<(RXf_BASE_SHIFT+7)) +#define RXf_CANY_SEEN (1<<(RXf_BASE_SHIFT+8)) /* Special */ -#define RXf_NOSCAN 0x00020000 -#define RXf_CHECK_ALL 0x00040000 +#define RXf_NOSCAN (1<<(RXf_BASE_SHIFT+9)) +#define RXf_CHECK_ALL (1<<(RXf_BASE_SHIFT+10)) /* UTF8 related */ -#define RXf_MATCH_UTF8 0x00100000 +#define RXf_MATCH_UTF8 (1<<(RXf_BASE_SHIFT+11)) /* Intuit related */ -#define RXf_USE_INTUIT_NOML 0x00200000 -#define RXf_USE_INTUIT_ML 0x00400000 -#define RXf_INTUIT_TAIL 0x00800000 +#define RXf_USE_INTUIT_NOML (1<<(RXf_BASE_SHIFT+12)) +#define RXf_USE_INTUIT_ML (1<<(RXf_BASE_SHIFT+13)) +#define RXf_INTUIT_TAIL (1<<(RXf_BASE_SHIFT+14)) /* Set in Perl_pmruntime if op_flags & OPf_SPECIAL, i.e. split. Will be used by regex engines to check whether they should set RXf_SKIPWHITE */ -#define RXf_SPLIT 0x01000000 +#define RXf_SPLIT (1<<(RXf_BASE_SHIFT+15)) #define RXf_USE_INTUIT (RXf_USE_INTUIT_NOML|RXf_USE_INTUIT_ML) /* Copy and tainted info */ -#define RXf_COPY_DONE 0x02000000 -#define RXf_TAINTED_SEEN 0x04000000 -#define RXf_TAINTED 0x08000000 /* this pattern is tainted */ +#define RXf_COPY_DONE (1<<(RXf_BASE_SHIFT+16)) +#define RXf_TAINTED_SEEN (1<<(RXf_BASE_SHIFT+17)) +#define RXf_TAINTED (1<<(RXf_BASE_SHIFT+18)) /* this pattern is tainted */ /* Flags indicating special patterns */ -#define RXf_START_ONLY 0x10000000 /* Pattern is /^/ */ -#define RXf_SKIPWHITE 0x20000000 /* Pattern is for a split / / */ -#define RXf_WHITE 0x40000000 /* Pattern is /\s+/ */ -#define RXf_NULL 0x80000000 /* Pattern is // */ +#define RXf_START_ONLY (1<<(RXf_BASE_SHIFT+19)) /* Pattern is /^/ */ +#define RXf_SKIPWHITE (1<<(RXf_BASE_SHIFT+20)) /* Pattern is for a split / / */ +#define RXf_WHITE (1<<(RXf_BASE_SHIFT+21)) /* Pattern is /\s+/ */ +#define RXf_NULL (1<<(RXf_BASE_SHIFT+22)) /* Pattern is // */ +#if RXf_BASE_SHIFT+22 > 31 +# error Too many RXf_PMf bits used. See regnodes.h for any spare in middle +#endif /* - * NOTE: if you modify any RXf flags you should run regen.pl or regcomp.pl - * so that regnodes.h is updated with the changes. + * NOTE: if you modify any RXf flags you should run regen.pl or + * regen/regcomp.pl so that regnodes.h is updated with the changes. * */