line |
stmt |
bran |
cond |
sub |
time |
code |
1
|
|
|
|
|
|
/* op_reg_common.h |
2
|
|
|
|
|
|
* |
3
|
|
|
|
|
|
* Definitions common to by op.h and regexp.h |
4
|
|
|
|
|
|
* |
5
|
|
|
|
|
|
* Copyright (C) 2010, 2011 by Larry Wall and others |
6
|
|
|
|
|
|
* |
7
|
|
|
|
|
|
* You may distribute under the terms of either the GNU General Public |
8
|
|
|
|
|
|
* License or the Artistic License, as specified in the README file. |
9
|
|
|
|
|
|
* |
10
|
|
|
|
|
|
*/ |
11
|
|
|
|
|
|
|
12
|
|
|
|
|
|
/* These defines are used in both op.h and regexp.h The definitions use the |
13
|
|
|
|
|
|
* shift form so that ext/B/defsubs_h.PL will pick them up. |
14
|
|
|
|
|
|
* |
15
|
|
|
|
|
|
* Data structures used in the two headers have common fields, and in fact one |
16
|
|
|
|
|
|
* is copied onto the other. This makes it easy to keep them in sync */ |
17
|
|
|
|
|
|
|
18
|
|
|
|
|
|
/* This tells where the first of these bits is. Setting it to 0 saved cycles |
19
|
|
|
|
|
|
* and memory. I (khw) think the code will work if changed back, but haven't |
20
|
|
|
|
|
|
* tested it */ |
21
|
|
|
|
|
|
/* Make sure to update ext/re/re.pm when changing this! */ |
22
|
|
|
|
|
|
#ifndef RXf_PMf_STD_PMMOD_SHIFT /* Only expand #include of this file once */ |
23
|
|
|
|
|
|
|
24
|
|
|
|
|
|
#define RXf_PMf_STD_PMMOD_SHIFT 0 |
25
|
|
|
|
|
|
|
26
|
|
|
|
|
|
/* The bits need to be ordered so that the msix are contiguous starting at bit |
27
|
|
|
|
|
|
* RXf_PMf_STD_PMMOD_SHIFT, followed by the p. See STD_PAT_MODS and |
28
|
|
|
|
|
|
* INT_PAT_MODS in regexp.h for the reason contiguity is needed */ |
29
|
|
|
|
|
|
/* Make sure to update lib/re.pm when changing these! */ |
30
|
|
|
|
|
|
/* Make sure you keep the pure PMf_ versions below in sync */ |
31
|
|
|
|
|
|
#define RXf_PMf_MULTILINE (1 << (RXf_PMf_STD_PMMOD_SHIFT+0)) /* /m */ |
32
|
|
|
|
|
|
#define RXf_PMf_SINGLELINE (1 << (RXf_PMf_STD_PMMOD_SHIFT+1)) /* /s */ |
33
|
|
|
|
|
|
#define RXf_PMf_FOLD (1 << (RXf_PMf_STD_PMMOD_SHIFT+2)) /* /i */ |
34
|
|
|
|
|
|
#define RXf_PMf_EXTENDED (1 << (RXf_PMf_STD_PMMOD_SHIFT+3)) /* /x */ |
35
|
|
|
|
|
|
#define RXf_PMf_KEEPCOPY (1 << (RXf_PMf_STD_PMMOD_SHIFT+4)) /* /p */ |
36
|
|
|
|
|
|
|
37
|
|
|
|
|
|
/* The character set for the regex is stored in a field of more than one bit |
38
|
|
|
|
|
|
* using an enum, for reasons of compactness and to ensure that the options are |
39
|
|
|
|
|
|
* mutually exclusive */ |
40
|
|
|
|
|
|
/* Make sure to update ext/re/re.pm and regcomp.sym (as these are used as |
41
|
|
|
|
|
|
* offsets for various node types, like POSIXD vs POSIXL, etc) when changing |
42
|
|
|
|
|
|
* this! */ |
43
|
|
|
|
|
|
typedef enum { |
44
|
|
|
|
|
|
REGEX_DEPENDS_CHARSET = 0, |
45
|
|
|
|
|
|
REGEX_LOCALE_CHARSET, |
46
|
|
|
|
|
|
REGEX_UNICODE_CHARSET, |
47
|
|
|
|
|
|
REGEX_ASCII_RESTRICTED_CHARSET, |
48
|
|
|
|
|
|
REGEX_ASCII_MORE_RESTRICTED_CHARSET |
49
|
|
|
|
|
|
} regex_charset; |
50
|
|
|
|
|
|
|
51
|
|
|
|
|
|
#define _RXf_PMf_CHARSET_SHIFT ((RXf_PMf_STD_PMMOD_SHIFT)+5) |
52
|
|
|
|
|
|
#define RXf_PMf_CHARSET (7 << (_RXf_PMf_CHARSET_SHIFT)) /* 3 bits */ |
53
|
|
|
|
|
|
|
54
|
|
|
|
|
|
/* Manually decorate these functions here with gcc-style attributes just to |
55
|
|
|
|
|
|
* avoid making the regex_charset typedef global, which it would need to be for |
56
|
|
|
|
|
|
* proto.h to understand it */ |
57
|
|
|
|
|
|
PERL_STATIC_INLINE void |
58
|
|
|
|
|
|
set_regex_charset(U32 * const flags, const regex_charset cs) |
59
|
|
|
|
|
|
__attribute__nonnull__(1); |
60
|
|
|
|
|
|
|
61
|
|
|
|
|
|
PERL_STATIC_INLINE void |
62
|
|
|
|
|
|
set_regex_charset(U32 * const flags, const regex_charset cs) |
63
|
|
|
|
|
|
{ |
64
|
|
|
|
|
|
/* Sets the character set portion of 'flags' to 'cs', which is a member of |
65
|
|
|
|
|
|
* the above enum */ |
66
|
|
|
|
|
|
|
67
|
213
|
|
|
|
|
*flags &= ~RXf_PMf_CHARSET; |
68
|
196
|
|
|
|
|
*flags |= (cs << _RXf_PMf_CHARSET_SHIFT); |
69
|
|
|
|
|
|
} |
70
|
|
|
|
|
|
|
71
|
|
|
|
|
|
PERL_STATIC_INLINE regex_charset |
72
|
|
|
|
|
|
get_regex_charset(const U32 flags) |
73
|
|
|
|
|
|
__attribute__warn_unused_result__; |
74
|
|
|
|
|
|
|
75
|
|
|
|
|
|
PERL_STATIC_INLINE regex_charset |
76
|
|
|
|
|
|
get_regex_charset(const U32 flags) |
77
|
|
|
|
|
|
{ |
78
|
|
|
|
|
|
/* Returns the enum corresponding to the character set in 'flags' */ |
79
|
|
|
|
|
|
|
80
|
708
|
|
|
|
|
return (regex_charset) ((flags & RXf_PMf_CHARSET) >> _RXf_PMf_CHARSET_SHIFT); |
81
|
|
|
|
|
|
} |
82
|
|
|
|
|
|
|
83
|
|
|
|
|
|
#define _RXf_PMf_SHIFT_COMPILETIME (RXf_PMf_STD_PMMOD_SHIFT+8) |
84
|
|
|
|
|
|
|
85
|
|
|
|
|
|
/* |
86
|
|
|
|
|
|
Set in Perl_pmruntime if op_flags & OPf_SPECIAL, i.e. split. Will |
87
|
|
|
|
|
|
be used by regex engines to check whether they should set |
88
|
|
|
|
|
|
RXf_SKIPWHITE |
89
|
|
|
|
|
|
*/ |
90
|
|
|
|
|
|
#define RXf_PMf_SPLIT (1<<(RXf_PMf_STD_PMMOD_SHIFT+8)) |
91
|
|
|
|
|
|
|
92
|
|
|
|
|
|
/* Next available bit after the above. Name begins with '_' so won't be |
93
|
|
|
|
|
|
* exported by B */ |
94
|
|
|
|
|
|
#define _RXf_PMf_SHIFT_NEXT (RXf_PMf_STD_PMMOD_SHIFT+9) |
95
|
|
|
|
|
|
|
96
|
|
|
|
|
|
/* Mask of the above bits. These need to be transferred from op_pmflags to |
97
|
|
|
|
|
|
* re->extflags during compilation */ |
98
|
|
|
|
|
|
#define RXf_PMf_COMPILETIME (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_FOLD|RXf_PMf_EXTENDED|RXf_PMf_KEEPCOPY|RXf_PMf_CHARSET) |
99
|
|
|
|
|
|
#define RXf_PMf_FLAGCOPYMASK (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_FOLD|RXf_PMf_EXTENDED|RXf_PMf_KEEPCOPY|RXf_PMf_CHARSET|RXf_PMf_SPLIT) |
100
|
|
|
|
|
|
|
101
|
|
|
|
|
|
#if RXf_PMf_COMPILETIME > 255 |
102
|
|
|
|
|
|
# error RXf_PMf_COMPILETIME wont fit in U8 flags field of eval node |
103
|
|
|
|
|
|
#endif |
104
|
|
|
|
|
|
|
105
|
|
|
|
|
|
/* These copies need to be numerical or defsubs_h.PL won't know about them. */ |
106
|
|
|
|
|
|
#define PMf_MULTILINE 1<<0 |
107
|
|
|
|
|
|
#define PMf_SINGLELINE 1<<1 |
108
|
|
|
|
|
|
#define PMf_FOLD 1<<2 |
109
|
|
|
|
|
|
#define PMf_EXTENDED 1<<3 |
110
|
|
|
|
|
|
#define PMf_KEEPCOPY 1<<4 |
111
|
|
|
|
|
|
#define PMf_CHARSET 7<<5 |
112
|
|
|
|
|
|
#define PMf_SPLIT 1<<8 |
113
|
|
|
|
|
|
|
114
|
|
|
|
|
|
#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_SPLIT != RXf_PMf_SPLIT || PMf_CHARSET != RXf_PMf_CHARSET |
115
|
|
|
|
|
|
# error RXf_PMf defines are wrong |
116
|
|
|
|
|
|
#endif |
117
|
|
|
|
|
|
|
118
|
|
|
|
|
|
/* Error check that haven't left something out of this. This isn't done |
119
|
|
|
|
|
|
* directly in the #define because doing so confuses regcomp.pl. |
120
|
|
|
|
|
|
* (2**n - 1) is n 1 bits, so the below gets the contiguous bits between the |
121
|
|
|
|
|
|
* beginning and ending shifts */ |
122
|
|
|
|
|
|
#if RXf_PMf_COMPILETIME != (((1 << (_RXf_PMf_SHIFT_COMPILETIME))-1) \ |
123
|
|
|
|
|
|
& (~((1 << RXf_PMf_STD_PMMOD_SHIFT)-1))) |
124
|
|
|
|
|
|
# error RXf_PMf_COMPILETIME is invalid |
125
|
|
|
|
|
|
#endif |
126
|
|
|
|
|
|
|
127
|
|
|
|
|
|
#endif /* Include only once */ |