Removes the code that is supposed to restore magic on leaving the
[p5sagit/p5-mst-13.2.git] / ext / re / re.pm
CommitLineData
b3eb6a9b 1package re;
2
de8c5301 3# pragma for controlling the regex engine
4use strict;
5use warnings;
6
44a2ac75 7our $VERSION = "0.08";
de8c5301 8our @ISA = qw(Exporter);
44a2ac75 9our @EXPORT_OK = qw(is_regexp regexp_pattern regmust
192b9cd1 10 regname regnames regnames_count);
de8c5301 11our %EXPORT_OK = map { $_ => 1 } @EXPORT_OK;
12
13# *** WARNING *** WARNING *** WARNING *** WARNING *** WARNING ***
14#
15# If you modify these values see comment below!
16
17my %bitmask = (
18 taint => 0x00100000, # HINT_RE_TAINT
19 eval => 0x00200000, # HINT_RE_EVAL
20);
21
22# - File::Basename contains a literal for 'taint' as a fallback. If
23# taint is changed here, File::Basename must be updated as well.
24#
25# - ExtUtils::ParseXS uses a hardcoded
26# BEGIN { $^H |= 0x00200000 }
27# in it to allow re.xs to be built. So if 'eval' is changed here then
28# ExtUtils::ParseXS must be changed as well.
29#
30# *** WARNING *** WARNING *** WARNING *** WARNING *** WARNING ***
31
32sub setcolor {
33 eval { # Ignore errors
34 require Term::Cap;
35
36 my $terminal = Tgetent Term::Cap ({OSPEED => 9600}); # Avoid warning.
37 my $props = $ENV{PERL_RE_TC} || 'md,me,so,se,us,ue';
38 my @props = split /,/, $props;
39 my $colors = join "\t", map {$terminal->Tputs($_,1)} @props;
40
41 $colors =~ s/\0//g;
42 $ENV{PERL_RE_COLORS} = $colors;
43 };
44 if ($@) {
45 $ENV{PERL_RE_COLORS} ||= qq'\t\t> <\t> <\t\t';
46 }
47
48}
49
50my %flags = (
51 COMPILE => 0x0000FF,
52 PARSE => 0x000001,
53 OPTIMISE => 0x000002,
54 TRIEC => 0x000004,
55 DUMP => 0x000008,
56
57 EXECUTE => 0x00FF00,
58 INTUIT => 0x000100,
59 MATCH => 0x000200,
60 TRIEE => 0x000400,
61
62 EXTRA => 0xFF0000,
63 TRIEM => 0x010000,
64 OFFSETS => 0x020000,
65 OFFSETSDBG => 0x040000,
66 STATE => 0x080000,
67 OPTIMISEM => 0x100000,
68 STACK => 0x280000,
e7707071 69 BUFFERS => 0x400000,
de8c5301 70);
e7707071 71$flags{ALL} = -1 & ~($flags{OFFSETS}|$flags{OFFSETSDBG}|$flags{BUFFERS});
de8c5301 72$flags{All} = $flags{all} = $flags{DUMP} | $flags{EXECUTE};
73$flags{Extra} = $flags{EXECUTE} | $flags{COMPILE};
74$flags{More} = $flags{MORE} = $flags{All} | $flags{TRIEC} | $flags{TRIEM} | $flags{STATE};
75$flags{State} = $flags{DUMP} | $flags{EXECUTE} | $flags{STATE};
76$flags{TRIE} = $flags{DUMP} | $flags{EXECUTE} | $flags{TRIEC};
77
78my $installed;
79my $installed_error;
80
81sub _do_install {
82 if ( ! defined($installed) ) {
83 require XSLoader;
84 $installed = eval { XSLoader::load('re', $VERSION) } || 0;
85 $installed_error = $@;
86 }
87}
88
89sub _load_unload {
90 my ($on)= @_;
91 if ($on) {
92 _do_install();
93 if ( ! $installed ) {
94 die "'re' not installed!? ($installed_error)";
95 } else {
96 # We call install() every time, as if we didn't, we wouldn't
97 # "see" any changes to the color environment var since
98 # the last time it was called.
99
100 # install() returns an integer, which if casted properly
101 # in C resolves to a structure containing the regex
102 # hooks. Setting it to a random integer will guarantee
103 # segfaults.
104 $^H{regcomp} = install();
105 }
106 } else {
107 delete $^H{regcomp};
108 }
109}
110
111sub bits {
112 my $on = shift;
113 my $bits = 0;
114 unless (@_) {
115 require Carp;
116 Carp::carp("Useless use of \"re\" pragma");
117 }
118 foreach my $idx (0..$#_){
119 my $s=$_[$idx];
120 if ($s eq 'Debug' or $s eq 'Debugcolor') {
121 setcolor() if $s =~/color/i;
122 ${^RE_DEBUG_FLAGS} = 0 unless defined ${^RE_DEBUG_FLAGS};
123 for my $idx ($idx+1..$#_) {
124 if ($flags{$_[$idx]}) {
125 if ($on) {
126 ${^RE_DEBUG_FLAGS} |= $flags{$_[$idx]};
127 } else {
128 ${^RE_DEBUG_FLAGS} &= ~ $flags{$_[$idx]};
129 }
130 } else {
131 require Carp;
132 Carp::carp("Unknown \"re\" Debug flag '$_[$idx]', possible flags: ",
133 join(", ",sort keys %flags ) );
134 }
135 }
136 _load_unload($on ? 1 : ${^RE_DEBUG_FLAGS});
137 last;
138 } elsif ($s eq 'debug' or $s eq 'debugcolor') {
139 setcolor() if $s =~/color/i;
140 _load_unload($on);
66e6b4c5 141 last;
de8c5301 142 } elsif (exists $bitmask{$s}) {
143 $bits |= $bitmask{$s};
144 } elsif ($EXPORT_OK{$s}) {
145 _do_install();
146 require Exporter;
147 re->export_to_level(2, 're', $s);
148 } else {
149 require Carp;
150 Carp::carp("Unknown \"re\" subpragma '$s' (known ones are: ",
151 join(', ', map {qq('$_')} 'debug', 'debugcolor', sort keys %bitmask),
152 ")");
153 }
154 }
155 $bits;
156}
157
158sub import {
159 shift;
160 $^H |= bits(1, @_);
161}
162
163sub unimport {
164 shift;
165 $^H &= ~ bits(0, @_);
166}
167
1681;
169
170__END__
56953603 171
b3eb6a9b 172=head1 NAME
173
174re - Perl pragma to alter regular expression behaviour
175
176=head1 SYNOPSIS
177
e4d48cc9 178 use re 'taint';
179 ($x) = ($^X =~ /^(.*)$/s); # $x is tainted here
b3eb6a9b 180
2cd61cdb 181 $pat = '(?{ $foo = 1 })';
e4d48cc9 182 use re 'eval';
2cd61cdb 183 /foo${pat}bar/; # won't fail (when not under -T switch)
e4d48cc9 184
185 {
186 no re 'taint'; # the default
187 ($x) = ($^X =~ /^(.*)$/s); # $x is not tainted here
188
189 no re 'eval'; # the default
2cd61cdb 190 /foo${pat}bar/; # disallowed (with or without -T switch)
e4d48cc9 191 }
b3eb6a9b 192
1e2e3d02 193 use re 'debug'; # output debugging info during
194 /^(.*)$/s; # compile and run time
195
2cd61cdb 196
02ea72ae 197 use re 'debugcolor'; # same as 'debug', but with colored output
198 ...
199
a3621e74 200 use re qw(Debug All); # Finer tuned debugging options.
4ee9a43f 201 use re qw(Debug More);
fe759410 202 no re qw(Debug ALL); # Turn of all re debugging in this scope
4ee9a43f 203
de8c5301 204 use re qw(is_regexp regexp_pattern); # import utility functions
205 my ($pat,$mods)=regexp_pattern(qr/foo/i);
206 if (is_regexp($obj)) {
207 print "Got regexp: ",
208 scalar regexp_pattern($obj); # just as perl would stringify it
209 } # but no hassle with blessed re's.
a3621e74 210
3ffabb8c 211(We use $^X in these examples because it's tainted by default.)
212
b3eb6a9b 213=head1 DESCRIPTION
214
de8c5301 215=head2 'taint' mode
216
b3eb6a9b 217When C<use re 'taint'> is in effect, and a tainted string is the target
218of a regex, the regex memories (or values returned by the m// operator
e4d48cc9 219in list context) are tainted. This feature is useful when regex operations
220on tainted data aren't meant to extract safe substrings, but to perform
221other transformations.
b3eb6a9b 222
de8c5301 223=head2 'eval' mode
224
e4d48cc9 225When C<use re 'eval'> is in effect, a regex is allowed to contain
2cd61cdb 226C<(?{ ... })> zero-width assertions even if regular expression contains
ffbc6a93 227variable interpolation. That is normally disallowed, since it is a
2cd61cdb 228potential security risk. Note that this pragma is ignored when the regular
229expression is obtained from tainted data, i.e. evaluation is always
3c4b39be 230disallowed with tainted regular expressions. See L<perlre/(?{ code })>.
2cd61cdb 231
ffbc6a93 232For the purpose of this pragma, interpolation of precompiled regular
0a92e3a8 233expressions (i.e., the result of C<qr//>) is I<not> considered variable
234interpolation. Thus:
2cd61cdb 235
236 /foo${pat}bar/
237
ffbc6a93 238I<is> allowed if $pat is a precompiled regular expression, even
2cd61cdb 239if $pat contains C<(?{ ... })> assertions.
240
de8c5301 241=head2 'debug' mode
242
ffbc6a93 243When C<use re 'debug'> is in effect, perl emits debugging messages when
2cd61cdb 244compiling and using regular expressions. The output is the same as that
245obtained by running a C<-DDEBUGGING>-enabled perl interpreter with the
246B<-Dr> switch. It may be quite voluminous depending on the complexity
02ea72ae 247of the match. Using C<debugcolor> instead of C<debug> enables a
248form of output that can be used to get a colorful display on terminals
249that understand termcap color sequences. Set C<$ENV{PERL_RE_TC}> to a
250comma-separated list of C<termcap> properties to use for highlighting
ffbc6a93 251strings on/off, pre-point part on/off.
2cd61cdb 252See L<perldebug/"Debugging regular expressions"> for additional info.
253
de8c5301 254As of 5.9.5 the directive C<use re 'debug'> and its equivalents are
255lexically scoped, as the other directives are. However they have both
256compile-time and run-time effects.
257
258See L<perlmodlib/Pragmatic Modules>.
259
260=head2 'Debug' mode
261
a3621e74 262Similarly C<use re 'Debug'> produces debugging output, the difference
263being that it allows the fine tuning of what debugging output will be
be8e71aa 264emitted. Options are divided into three groups, those related to
265compilation, those related to execution and those related to special
266purposes. The options are as follows:
267
268=over 4
269
270=item Compile related options
271
272=over 4
273
274=item COMPILE
275
276Turns on all compile related debug options.
277
278=item PARSE
279
280Turns on debug output related to the process of parsing the pattern.
281
282=item OPTIMISE
283
284Enables output related to the optimisation phase of compilation.
285
24b23f37 286=item TRIEC
be8e71aa 287
288Detailed info about trie compilation.
289
290=item DUMP
291
292Dump the final program out after it is compiled and optimised.
293
be8e71aa 294=back
295
296=item Execute related options
297
298=over 4
299
300=item EXECUTE
301
302Turns on all execute related debug options.
303
304=item MATCH
305
306Turns on debugging of the main matching loop.
307
24b23f37 308=item TRIEE
be8e71aa 309
310Extra debugging of how tries execute.
311
312=item INTUIT
313
314Enable debugging of start point optimisations.
315
316=back
317
318=item Extra debugging options
319
320=over 4
321
322=item EXTRA
323
324Turns on all "extra" debugging options.
325
e7707071 326=item BUFFERS
327
328Enable debugging the capture buffer storage during match. Warning,
329this can potentially produce extremely large output.
330
24b23f37 331=item TRIEM
332
333Enable enhanced TRIE debugging. Enhances both TRIEE
334and TRIEC.
335
336=item STATE
337
4ee9a43f 338Enable debugging of states in the engine.
24b23f37 339
340=item STACK
be8e71aa 341
24b23f37 342Enable debugging of the recursion stack in the engine. Enabling
343or disabling this option automatically does the same for debugging
344states as well. This output from this can be quite large.
345
346=item OPTIMISEM
347
348Enable enhanced optimisation debugging and start point optimisations.
349Probably not useful except when debugging the regex engine itself.
350
351=item OFFSETS
352
353Dump offset information. This can be used to see how regops correlate
354to the pattern. Output format is
355
356 NODENUM:POSITION[LENGTH]
357
358Where 1 is the position of the first char in the string. Note that position
359can be 0, or larger than the actual length of the pattern, likewise length
360can be zero.
be8e71aa 361
24b23f37 362=item OFFSETSDBG
be8e71aa 363
364Enable debugging of offsets information. This emits copious
fe759410 365amounts of trace information and doesn't mesh well with other
be8e71aa 366debug options.
367
fe759410 368Almost definitely only useful to people hacking
be8e71aa 369on the offsets part of the debug engine.
370
371=back
372
373=item Other useful flags
374
375These are useful shortcuts to save on the typing.
376
377=over 4
378
379=item ALL
380
e7707071 381Enable all options at once except OFFSETS, OFFSETSDBG and BUFFERS
be8e71aa 382
383=item All
384
fe759410 385Enable DUMP and all execute options. Equivalent to:
be8e71aa 386
387 use re 'debug';
388
389=item MORE
390
391=item More
392
24b23f37 393Enable TRIEM and all execute compile and execute options.
be8e71aa 394
dba3f186 395=back
be8e71aa 396
dba3f186 397=back
a3621e74 398
1e2e3d02 399As of 5.9.5 the directive C<use re 'debug'> and its equivalents are
4ee9a43f 400lexically scoped, as the other directives are. However they have both
1e2e3d02 401compile-time and run-time effects.
b3eb6a9b 402
de8c5301 403=head2 Exportable Functions
b3eb6a9b 404
de8c5301 405As of perl 5.9.5 're' debug contains a number of utility functions that
4ee9a43f 406may be optionally exported into the caller's namespace. They are listed
de8c5301 407below.
b3eb6a9b 408
de8c5301 409=over 4
b3eb6a9b 410
de8c5301 411=item is_regexp($ref)
02ea72ae 412
de8c5301 413Returns true if the argument is a compiled regular expression as returned
4ee9a43f 414by C<qr//>, false if it is not.
02ea72ae 415
4ee9a43f 416This function will not be confused by overloading or blessing. In
417internals terms, this extracts the regexp pointer out of the
de8c5301 418PERL_MAGIC_qr structure so it it cannot be fooled.
894be9b7 419
de8c5301 420=item regexp_pattern($ref)
02ea72ae 421
4ee9a43f 422If the argument is a compiled regular expression as returned by C<qr//>,
423then this function returns the pattern.
be8e71aa 424
4ee9a43f 425In list context it returns a two element list, the first element
426containing the pattern and the second containing the modifiers used when
427the pattern was compiled.
be8e71aa 428
4ee9a43f 429 my ($pat, $mods) = regexp_pattern($ref);
a3621e74 430
4ee9a43f 431In scalar context it returns the same as perl would when strigifying a raw
432C<qr//> with the same pattern inside. If the argument is not a compiled
433reference then this routine returns false but defined in scalar context,
434and the empty list in list context. Thus the following
f9f4320a 435
de8c5301 436 if (regexp_pattern($ref) eq '(?i-xsm:foo)')
dba3f186 437
de8c5301 438will be warning free regardless of what $ref actually is.
380e0b81 439
4ee9a43f 440Like C<is_regexp> this function will not be confused by overloading
441or blessing of the object.
b3eb6a9b 442
256ddcd0 443=item regmust($ref)
444
432acd5f 445If the argument is a compiled regular expression as returned by C<qr//>,
446then this function returns what the optimiser consiers to be the longest
447anchored fixed string and longest floating fixed string in the pattern.
448
449A I<fixed string> is defined as being a substring that must appear for the
450pattern to match. An I<anchored fixed string> is a fixed string that must
451appear at a particular offset from the beginning of the match. A I<floating
452fixed string> is defined as a fixed string that can appear at any point in
453a range of positions relative to the start of the match. For example,
454
455 my $qr = qr/here .* there/x;
456 my ($anchored, $floating) = regmust($qr);
256ddcd0 457 print "anchored:'$anchored'\nfloating:'$floating'\n";
432acd5f 458
256ddcd0 459results in
460
461 anchored:'here'
462 floating:'there'
463
432acd5f 464Because the C<here> is before the C<.*> in the pattern, its position
465can be determined exactly. That's not true, however, for the C<there>;
466it could appear at any point after where the anchored string appeared.
256ddcd0 467Perl uses both for its optimisations, prefering the longer, or, if they are
468equal, the floating.
469
470B<NOTE:> This may not necessarily be the definitive longest anchored and
432acd5f 471floating string. This will be what the optimiser of the Perl that you
256ddcd0 472are using thinks is the longest. If you believe that the result is wrong
473please report it via the L<perlbug> utility.
474
28d8d7f4 475=item regname($name,$all)
44a2ac75 476
28d8d7f4 477Returns the contents of a named buffer of the last successful match. If
478$all is true, then returns an array ref containing one entry per buffer,
44a2ac75 479otherwise returns the first defined buffer.
480
28d8d7f4 481=item regnames($all)
44a2ac75 482
28d8d7f4 483Returns a list of all of the named buffers defined in the last successful
484match. If $all is true, then it returns all names defined, if not it returns
485only names which were involved in the match.
44a2ac75 486
28d8d7f4 487=item regnames_count()
44a2ac75 488
28d8d7f4 489Returns the number of distinct names defined in the pattern used
490for the last successful match.
44a2ac75 491
28d8d7f4 492B<Note:> this result is always the actual number of distinct
493named buffers defined, it may not actually match that which is
494returned by C<regnames()> and related routines when those routines
495have not been called with the $all parameter set.
44a2ac75 496
de8c5301 497=back
b3eb6a9b 498
de8c5301 499=head1 SEE ALSO
b3eb6a9b 500
de8c5301 501L<perlmodlib/Pragmatic Modules>.
502
503=cut