File Coverage

blib/lib/PPI/Util.pm
Criterion Covered Total %
statement 38 38 100.0
branch 16 20 80.0
condition n/a
subroutine 9 9 100.0
pod 0 2 0.0
total 63 69 91.3


line stmt bran cond sub pod time code
1             package PPI::Util;
2              
3             # Provides some common utility functions that can be imported
4              
5 69     69   347 use strict;
  69         103  
  69         2033  
6 69     69   317 use Exporter ();
  69         150  
  69         933  
7 69     69   238 use Digest::MD5 ();
  69         94  
  69         1285  
8 69     69   20163 use Params::Util qw{_INSTANCE _SCALAR0 _ARRAY0};
  69         276035  
  69         8304  
9              
10             our $VERSION = '1.291';
11              
12             our @ISA = 'Exporter';
13             our @EXPORT_OK = qw{ _Document _slurp };
14              
15             # 5.8.7 was the first version to resolve the notorious
16             # "unicode length caching" bug.
17 69     69   441 use constant HAVE_UNICODE => !! ( $] >= 5.008007 );
  69         124  
  69         33500  
18              
19             # Common reusable true and false functions
20             # This makes it easy to upgrade many places in PPI::XS
21             sub TRUE () { 1 }
22             sub FALSE () { '' }
23              
24              
25              
26              
27              
28             #####################################################################
29             # Functions
30              
31             # Allows a sub that takes a L to handle the full range
32             # of different things, including file names, SCALAR source, etc.
33             sub _Document {
34 17 50   17   1824 shift if @_ > 1;
35 17 50       27 return undef unless defined $_[0];
36 17         77 require PPI::Document;
37 17 100       41 return PPI::Document->new(shift) unless ref $_[0];
38 16 100       54 return PPI::Document->new(shift) if _SCALAR0($_[0]);
39 10 100       29 return PPI::Document->new(shift) if _ARRAY0($_[0]);
40 9 100       53 return shift if _INSTANCE($_[0], 'PPI::Document');
41 2         6 return undef;
42             }
43              
44             # Provide a simple _slurp implementation
45             sub _slurp {
46 688 100   688   4789 my $file = shift or return "_slurp() failed: no filename provided";
47 687         2935 local $/ = undef;
48 687         1887 local *FILE;
49 687 100       39201 open( FILE, '<', $file ) or return "open($file) failed: $!";
50 686         37452 my $source = ;
51 686 50       9160 close( FILE ) or return "close($file) failed: $!";
52 686         5344 return \$source;
53             }
54              
55             # Provides a version of Digest::MD5's md5hex that explicitly
56             # works on the unix-newlined version of the content.
57             sub md5hex {
58 339     339 0 1001 my $string = shift;
59 339         194636 $string =~ s/(?:\015{1,2}\012|\015|\012)/\015/gs;
60 339         4933 Digest::MD5::md5_hex($string);
61             }
62              
63             # As above but slurps and calculates the id for a file by name
64             sub md5hex_file {
65 165     165 0 2054 my $file = shift;
66 165         555 my $content = _slurp($file);
67 165 50       559 return undef unless ref $content;
68 165         101192 $$content =~ s/(?:\015{1,2}\012|\015|\012)/\n/gs;
69 165         756 md5hex($$content);
70             }
71              
72             1;