X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/93136d17f9881a8e1aebaec99f2febb8e56aefa3..e843f77508a3858019327dca95534051d8daf440:/op_reg_common.h diff --git a/op_reg_common.h b/op_reg_common.h index 238d7bd..f509650 100644 --- a/op_reg_common.h +++ b/op_reg_common.h @@ -18,7 +18,7 @@ /* This tells where the first of these bits is. Setting it to 0 saved cycles * and memory. I (khw) think the code will work if changed back, but haven't * tested it */ -/* Make sure to update lib/re.pm when changing this! */ +/* Make sure to update ext/re/re.pm when changing this! */ #ifndef RXf_PMf_STD_PMMOD_SHIFT /* Only expand #include of this file once */ #define RXf_PMf_STD_PMMOD_SHIFT 0 @@ -32,8 +32,49 @@ #define RXf_PMf_FOLD (1 << (RXf_PMf_STD_PMMOD_SHIFT+2)) /* /i */ #define RXf_PMf_EXTENDED (1 << (RXf_PMf_STD_PMMOD_SHIFT+3)) /* /x */ #define RXf_PMf_KEEPCOPY (1 << (RXf_PMf_STD_PMMOD_SHIFT+4)) /* /p */ -#define RXf_PMf_LOCALE (1 << (RXf_PMf_STD_PMMOD_SHIFT+5)) -#define RXf_PMf_UNICODE (1 << (RXf_PMf_STD_PMMOD_SHIFT+6)) + +/* The character set for the regex is stored in a field of more than one bit + * using an enum, for reasons of compactness and to ensure that the options are + * mutually exclusive */ +/* Make sure to update ext/re/re.pm when changing this! */ +typedef enum { + REGEX_DEPENDS_CHARSET = 0, + REGEX_LOCALE_CHARSET, + REGEX_UNICODE_CHARSET, + REGEX_ASCII_RESTRICTED_CHARSET +} regex_charset; + +#define _RXf_PMf_CHARSET_SHIFT ((RXf_PMf_STD_PMMOD_SHIFT)+5) +#define RXf_PMf_CHARSET (3 << (_RXf_PMf_CHARSET_SHIFT)) /* 2 bits */ + +/* embed.pl doesn't yet know how to handle static inline functions, so + manually decorate them here with gcc-style attributes. +*/ +PERL_STATIC_INLINE void +set_regex_charset(U32 * const flags, const regex_charset cs) + __attribute__nonnull__(1); + +PERL_STATIC_INLINE void +set_regex_charset(U32 * const flags, const regex_charset cs) +{ + /* Sets the character set portion of 'flags' to 'cs', which is a member of + * the above enum */ + + *flags &= ~RXf_PMf_CHARSET; + *flags |= (cs << _RXf_PMf_CHARSET_SHIFT); +} + +PERL_STATIC_INLINE regex_charset +get_regex_charset(const U32 flags) + __attribute__warn_unused_result__; + +PERL_STATIC_INLINE regex_charset +get_regex_charset(const U32 flags) +{ + /* Returns the enum corresponding to the character set in 'flags' */ + + return (regex_charset) ((flags & RXf_PMf_CHARSET) >> _RXf_PMf_CHARSET_SHIFT); +} /* Next available bit after the above. Name begins with '_' so won't be * exported by B */ @@ -41,7 +82,7 @@ /* Mask of the above bits. These need to be transferred from op_pmflags to * re->extflags during compilation */ -#define RXf_PMf_COMPILETIME (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_LOCALE|RXf_PMf_FOLD|RXf_PMf_EXTENDED|RXf_PMf_KEEPCOPY|RXf_PMf_UNICODE) +#define RXf_PMf_COMPILETIME (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_CHARSET|RXf_PMf_FOLD|RXf_PMf_EXTENDED|RXf_PMf_KEEPCOPY) /* These copies need to be numerical or defsubs_h.PL won't know about them. */ #define PMf_MULTILINE 1<<0 @@ -49,9 +90,8 @@ #define PMf_FOLD 1<<2 #define PMf_EXTENDED 1<<3 #define PMf_KEEPCOPY 1<<4 -#define PMf_LOCALE 1<<5 -#if PMf_MULTILINE != RXf_PMf_MULTILINE || PMf_SINGLELINE != RXf_PMf_SINGLELINE || PMf_FOLD != RXf_PMf_FOLD || PMf_EXTENDED != RXf_PMf_EXTENDED || PMf_KEEPCOPY != RXf_PMf_KEEPCOPY || PMf_LOCALE != RXf_PMf_LOCALE +#if PMf_MULTILINE != RXf_PMf_MULTILINE || PMf_SINGLELINE != RXf_PMf_SINGLELINE || PMf_FOLD != RXf_PMf_FOLD || PMf_EXTENDED != RXf_PMf_EXTENDED || PMf_KEEPCOPY != RXf_PMf_KEEPCOPY # error RXf_PMf defines are wrong #endif