package ActiveState::Rx;
use strict;
our $VERSION = '0.60';
#
sub doit {
my $on = shift;
my $debug = shift || "";
require XSLoader;
XSLoader::load('ActiveState::Rx');
set_debug($debug eq "debug" and $on);
install() if $on;
deinstall() unless $on || $debug;
}
sub import {
shift;
doit(1,@_);
}
sub unimport {
shift;
doit(0,@_);
}
#
# Translate a regex hash structure into a more tree-like structure
# that is more easily traversed and analyzed.
sub translate_tree {
my %tree = %{shift()};
my $node = shift; # Starting node.
my @treeroots; # Array of top level tree nodes (roots).
while(defined $node) {
if(ref($tree{$node}) eq 'HASH') {
my %nodeguts = %{$tree{$node}};
# Add the node to the treeroots array only there
# exists a handler function that could some day
# "draw" it. We don't want to mess around with nodes we
# can't handle...
if(defined $nodeguts{TYPE}) {
push @treeroots, _process_node(\%tree, \%nodeguts, $node);
}
else {
print STDERR "Skipping node $node\n";
}
# If the current node didn't give us a next node to traverse to
# then we must give up.
unless($node = $nodeguts{NEXT}) {
last;
}
}
}
return \@treeroots;
}
sub _process_node {
my %tree = %{shift()};
my %nodeguts = %{shift()};
my $nodename = shift();
# print Dumper($nodename);
# print Dumper(\%nodeguts);
$nodeguts{'__this__'} = $nodename;
if($nodeguts{CHILD}) {
# Now build another translated tree based on the child node of
# this node.
my $treerootsref = translate_tree(\%tree, $nodeguts{CHILD});
$nodeguts{CHILD} = $treerootsref;
}
return \%nodeguts;
}
1;
__END__
=head1 NAME
ActiveState::Rx - Regular Expression Debugger
=head1 DESCRIPTION
Please see L for details on how to use Rx.
=head1 AUTHOR
Mark-Jason Dominus
Ken Simpson
Neil Watkiss
=head1 COPYRIGHT
Copyright (c) 2001, ActiveState SRL.