File Coverage

blib/lib/Regexp/Util.pm
Criterion Covered Total %
statement 24 47 51.0
branch 7 18 38.8
condition 2 6 33.3
subroutine 6 11 54.5
pod 3 8 37.5
total 42 90 46.6


line stmt bran cond sub pod time code
1 1     1   46337 use 5.010000;
  1         3  
2 1     1   4 use strict;
  1         1  
  1         13  
3 1     1   3 use warnings;
  1         1  
  1         543  
4              
5             package Regexp::Util;
6              
7             our $AUTHORITY = 'cpan:TOBYINK';
8             our $VERSION = '0.005';
9              
10             require XSLoader;
11             XSLoader::load(__PACKAGE__, $VERSION);
12              
13             eval 'require re';
14              
15             require Exporter::Tiny;
16             our @ISA = qw( Exporter::Tiny );
17             our @EXPORT;
18             our @EXPORT_OK = qw(
19             is_regexp
20             regexp_seen_evals
21             regexp_is_foreign
22             serialize_regexp
23             deserialize_regexp
24            
25             regexp_pattern regmust regname regnames regnames_count
26             );
27             our %EXPORT_TAGS = (
28             all => \@EXPORT_OK,
29             default => \@EXPORT,
30             );
31              
32             sub regexp_is_foreign
33             {
34 1     1 1 7 _regexp_engine_id($_[0]) != _regexp_engine_id(qr//);
35             }
36              
37             sub serialize_regexp
38             {
39 1     1 1 60 my $re = shift;
40            
41 1 50       5 if (not is_regexp($re))
42             {
43 0         0 require Carp;
44 0         0 Carp::croak("Cannot serialize non-regexp");
45             }
46            
47 1 50       3 if (regexp_seen_evals($re))
48             {
49 0         0 require Carp;
50 0         0 Carp::croak("Cannot serialize regexp containing evals");
51             }
52            
53 1 50       2 if (regexp_is_foreign($re))
54             {
55 0         0 require Carp;
56 0         0 Carp::croak("Cannot serialize regexp using plugin re engine");
57             }
58            
59 1         3 my $str = re::regexp_pattern($re);
60 1 50       5 return "qr/$str/" if $str !~ m{\/};
61 0 0       0 return "qr!$str!" if $str !~ m{\!};
62 0 0       0 return "qr#$str#" if $str !~ m{\#};
63            
64 0         0 require B;
65 0         0 sprintf('do { my $re = %s; qr/$re/ }', B::perlstring($str));
66             }
67              
68             my $safe;
69             sub deserialize_regexp
70             {
71 1     1 1 2 my $str = shift;
72            
73 1 50 33     6 if (!defined $str or ref $str)
74             {
75 0         0 require Carp;
76 0         0 Carp::croak("Cannot deserialize regexp");
77             }
78            
79 1   33     3 $safe ||= do {
80 1         394 require Safe;
81 1         25809 my $cpt = Safe->new;
82 1         741 $cpt->permit(qw/ :base_core :base_mem sprintf qr /);
83 1         10 $cpt;
84             };
85            
86 1 50       3 my $re = $safe->reval($str) or do {
87 0         0 (my $e = $@) =~
88             s/ at \(eval \d+\) .+//;
89 0         0 chomp $e;
90 0         0 require Carp;
91 0         0 Carp::croak("Cannot deserialize regexp: $e");
92             };
93            
94 1 50       488 return $re if is_regexp($re);
95            
96 0           require Carp;
97 0           Carp::croak("Cannot deserialize regexp: eval returned $re");
98             }
99              
100             sub regexp_pattern {
101 0     0 0   goto \&re::regexp_pattern;
102             }
103              
104             sub regmust {
105 0     0 0   goto \&re::regmust;
106             }
107              
108             sub regname {
109 0     0 0   goto \&re::regname;
110             }
111              
112             sub regnames {
113 0     0 0   goto \&re::regnames;
114             }
115              
116             sub regnames_count {
117 0     0 0   goto \&re::regnames_count;
118             }
119              
120             1;
121              
122             __END__