87a450dc0008e1f1792022db13eacd52e8213893
[p5sagit/p5-mst-13.2.git] / ext / re / re.pm
1 package re;
2
3 our $VERSION = 0.06_02;
4
5 =head1 NAME
6
7 re - Perl pragma to alter regular expression behaviour
8
9 =head1 SYNOPSIS
10
11     use re 'taint';
12     ($x) = ($^X =~ /^(.*)$/s);     # $x is tainted here
13
14     $pat = '(?{ $foo = 1 })';
15     use re 'eval';
16     /foo${pat}bar/;                # won't fail (when not under -T switch)
17
18     {
19         no re 'taint';             # the default
20         ($x) = ($^X =~ /^(.*)$/s); # $x is not tainted here
21
22         no re 'eval';              # the default
23         /foo${pat}bar/;            # disallowed (with or without -T switch)
24     }
25
26     use re 'debug';                # NOT lexically scoped (as others are)
27     /^(.*)$/s;                     # output debugging info during
28                                    #     compile and run time
29
30     use re 'debugcolor';           # same as 'debug', but with colored output
31     ...
32
33     use re qw(Debug All);          # Finer tuned debugging options.
34     use re qw(Debug More);         # Similarly not lexically scoped.
35     no re qw(Debug ALL);           # Turn of all re dugging and unload the module.
36
37 (We use $^X in these examples because it's tainted by default.)
38
39 =head1 DESCRIPTION
40
41 When C<use re 'taint'> is in effect, and a tainted string is the target
42 of a regex, the regex memories (or values returned by the m// operator
43 in list context) are tainted.  This feature is useful when regex operations
44 on tainted data aren't meant to extract safe substrings, but to perform
45 other transformations.
46
47 When C<use re 'eval'> is in effect, a regex is allowed to contain
48 C<(?{ ... })> zero-width assertions even if regular expression contains
49 variable interpolation.  That is normally disallowed, since it is a
50 potential security risk.  Note that this pragma is ignored when the regular
51 expression is obtained from tainted data, i.e.  evaluation is always
52 disallowed with tainted regular expressions.  See L<perlre/(?{ code })>.
53
54 For the purpose of this pragma, interpolation of precompiled regular
55 expressions (i.e., the result of C<qr//>) is I<not> considered variable
56 interpolation.  Thus:
57
58     /foo${pat}bar/
59
60 I<is> allowed if $pat is a precompiled regular expression, even
61 if $pat contains C<(?{ ... })> assertions.
62
63 When C<use re 'debug'> is in effect, perl emits debugging messages when
64 compiling and using regular expressions.  The output is the same as that
65 obtained by running a C<-DDEBUGGING>-enabled perl interpreter with the
66 B<-Dr> switch. It may be quite voluminous depending on the complexity
67 of the match.  Using C<debugcolor> instead of C<debug> enables a
68 form of output that can be used to get a colorful display on terminals
69 that understand termcap color sequences.  Set C<$ENV{PERL_RE_TC}> to a
70 comma-separated list of C<termcap> properties to use for highlighting
71 strings on/off, pre-point part on/off.
72 See L<perldebug/"Debugging regular expressions"> for additional info.
73
74 Similarly C<use re 'Debug'> produces debugging output, the difference
75 being that it allows the fine tuning of what debugging output will be
76 emitted. Options are divided into three groups, those related to
77 compilation, those related to execution and those related to special
78 purposes. The options are as follows:
79
80 =over 4
81
82 =item Compile related options
83
84 =over 4
85
86 =item COMPILE
87
88 Turns on all compile related debug options.
89
90 =item PARSE
91
92 Turns on debug output related to the process of parsing the pattern.
93
94 =item OPTIMISE
95
96 Enables output related to the optimisation phase of compilation.
97
98 =item TRIE_COMPILE
99
100 Detailed info about trie compilation.
101
102 =item DUMP
103
104 Dump the final program out after it is compiled and optimised.
105
106 =item OFFSETS
107
108 Dump offset information. This can be used to see how regops correlate
109 to the pattern. Output format is
110
111    NODENUM:POSITION[LENGTH]
112
113 Where 1 is the position of the first char in the string. Note that position
114 can be 0, or larger than the actual length of the pattern, likewise length
115 can be zero.
116
117 =back
118
119 =item Execute related options
120
121 =over 4
122
123 =item EXECUTE
124
125 Turns on all execute related debug options.
126
127 =item MATCH
128
129 Turns on debugging of the main matching loop.
130
131 =item TRIE_EXECUTE
132
133 Extra debugging of how tries execute.
134
135 =item INTUIT
136
137 Enable debugging of start point optimisations.
138
139 =back
140
141 =item Extra debugging options
142
143 =over 4
144
145 =item EXTRA
146
147 Turns on all "extra" debugging options.
148
149 =item TRIE_MORE
150
151 Enable enhanced TRIE debugging. Enhances both TRIE_EXECUTE
152 and TRIE_COMPILE.
153
154 =item OFFSETS_DEBUG
155
156 Enable debugging of offsets information. This emits copious
157 amounts of trace information and doesnt mesh well with other
158 debug options.
159
160 Almost definately only useful to people hacking
161 on the offsets part of the debug engine.
162
163 =back
164
165 =item Other useful flags
166
167 These are useful shortcuts to save on the typing.
168
169 =over 4
170
171 =item ALL
172
173 Enable all compile and execute options at once.
174
175 =item All
176
177 Enable DUMP and all execute options. Equivelent to:
178
179   use re 'debug';
180
181 =item MORE
182
183 =item More
184
185 Enable TRIE_MORE and all execute compile and execute options.
186
187 =back 4
188
189 =back 4
190
191 The directive C<use re 'debug'> and its equivalents are I<not> lexically
192 scoped, as the other directives are.  They have both compile-time and run-time
193 effects.
194
195 See L<perlmodlib/Pragmatic Modules>.
196
197 =cut
198
199 # N.B. File::Basename contains a literal for 'taint' as a fallback.  If
200 # taint is changed here, File::Basename must be updated as well.
201 my %bitmask = (
202 taint           => 0x00100000, # HINT_RE_TAINT
203 eval            => 0x00200000, # HINT_RE_EVAL
204 );
205
206 sub setcolor {
207  eval {                         # Ignore errors
208   require Term::Cap;
209
210   my $terminal = Tgetent Term::Cap ({OSPEED => 9600}); # Avoid warning.
211   my $props = $ENV{PERL_RE_TC} || 'md,me,so,se,us,ue';
212   my @props = split /,/, $props;
213   my $colors = join "\t", map {$terminal->Tputs($_,1)} @props;
214
215   $colors =~ s/\0//g;
216   $ENV{PERL_RE_COLORS} = $colors;
217  };
218  if ($@) {
219     $ENV{PERL_RE_COLORS}||=qq'\t\t> <\t> <\t\t'
220  }
221                 
222 }
223
224 my %flags = (
225     COMPILE         => 0x0000FF,
226     PARSE           => 0x000001,
227     OPTIMISE        => 0x000002,
228     TRIEC           => 0x000004,
229     DUMP            => 0x000008,
230
231     EXECUTE         => 0x00FF00,
232     INTUIT          => 0x000100,
233     MATCH           => 0x000200,
234     TRIEE           => 0x000400,
235
236     EXTRA           => 0xFF0000,
237     TRIEM           => 0x010000,
238     OFFSETS         => 0x020000,
239     OFFSETSDBG      => 0x040000,
240     STATE           => 0x080000,
241     OPTIMISEM       => 0x100000,
242 );
243 $flags{ALL} = -1;
244 $flags{All} = $flags{all} = $flags{DUMP} | $flags{EXECUTE};
245 $flags{More} = $flags{MORE} = $flags{All} | $flags{TRIEC} | $flags{TRIEM} | $flags{STATE};
246 $flags{State} = $flags{DUMP} | $flags{EXECUTE} | $flags{STATE};
247 $flags{TRIE} = $flags{DUMP} | $flags{EXECUTE} | $flags{TRIEC};
248
249 my $installed =eval {
250     require XSLoader;
251     XSLoader::load('re');
252     install();
253 };
254
255 sub _load_unload {
256     my ($on)= @_;
257     if ($on) {
258         die "'re' not installed!?" unless $installed;
259         #warn "installed: $installed\n";
260         install();  # allow for changes in colors
261         $^H{regcomp}= $installed;
262     } else {
263         delete $^H{regcomp};
264     }
265 }
266
267 sub bits {
268     my $on = shift;
269     my $bits = 0;
270     unless (@_) {
271         return;
272     }
273     foreach my $idx (0..$#_){
274         my $s=$_[$idx];
275         if ($s eq 'Debug' or $s eq 'Debugcolor') {
276             setcolor() if $s =~/color/i;
277             ${^RE_DEBUG_FLAGS} = 0 unless defined ${^RE_DEBUG_FLAGS};
278             for my $idx ($idx+1..$#_) {
279                 if ($flags{$_[$idx]}) {
280                     if ($on) {
281                         ${^RE_DEBUG_FLAGS} |= $flags{$_[$idx]};
282                     } else {
283                         ${^RE_DEBUG_FLAGS} &= ~ $flags{$_[$idx]};
284                     }
285                 } else {
286                     require Carp;
287                     Carp::carp("Unknown \"re\" Debug flag '$_[$idx]', possible flags: ",
288                                join(", ",sort { $flags{$a} <=> $flags{$b} } keys %flags ) );
289                 }
290             }
291             _load_unload($on ? 1 : ${^RE_DEBUG_FLAGS});
292             last;
293         } elsif ($s eq 'debug' or $s eq 'debugcolor') {
294             setcolor() if $s =~/color/i;
295             _load_unload($on);
296         } elsif (exists $bitmask{$s}) {
297             $bits |= $bitmask{$s};
298         } else {
299             require Carp;
300             Carp::carp("Unknown \"re\" subpragma '$s' (known ones are: ",
301                        join(', ', map {qq('$_')} 'debug', 'debugcolor', sort keys %bitmask),
302                        ")");
303         }
304     }
305     $bits;
306 }
307
308 sub import {
309     shift;
310     $^H |= bits(1, @_);
311 }
312
313 sub unimport {
314     shift;
315     $^H &= ~ bits(0, @_);
316 }
317
318 1;