File Coverage

blib/lib/PPI/Util.pm
Criterion Covered Total %
statement 38 38 100.0
branch 13 18 72.2
condition n/a
subroutine 9 9 100.0
pod 0 2 0.0
total 60 67 89.5


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 64     64   361 use strict;
  64         126  
  64         1483  
6 64     64   282 use Exporter ();
  64         118  
  64         787  
7 64     64   261 use Digest::MD5 ();
  64         155  
  64         1242  
8 64     64   18650 use Params::Util qw{_INSTANCE _SCALAR0 _ARRAY0};
  64         245766  
  64         5712  
9              
10             our $VERSION = '1.275';
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 64     64   398 use constant HAVE_UNICODE => !! ( $] >= 5.008007 );
  64         104  
  64         30252  
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   1579 shift if @_ > 1;
35 17 50       45 return undef unless defined $_[0];
36 17         84 require PPI::Document;
37 17 100       40 return PPI::Document->new(shift) unless ref $_[0];
38 16 100       51 return PPI::Document->new(shift) if _SCALAR0($_[0]);
39 10 100       28 return PPI::Document->new(shift) if _ARRAY0($_[0]);
40 9 100       57 return shift if _INSTANCE($_[0], 'PPI::Document');
41 2         8 return undef;
42             }
43              
44             # Provide a simple _slurp implementation
45             sub _slurp {
46 660     660   1783 my $file = shift;
47 660         2142 local $/ = undef;
48 660         1798 local *FILE;
49 660 50       25793 open( FILE, '<', $file ) or return "open($file) failed: $!";
50 660         27904 my $source = ;
51 660 50       7560 close( FILE ) or return "close($file) failed: $!";
52 660         4928 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 329     329 0 934 my $string = shift;
59 329         103877 $string =~ s/(?:\015{1,2}\012|\015|\012)/\015/gs;
60 329         4082 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 160     160 0 1533 my $file = shift;
66 160         390 my $content = _slurp($file);
67 160 50       627 return undef unless ref $content;
68 160         53485 $$content =~ s/(?:\015{1,2}\012|\015|\012)/\n/gs;
69 160         564 md5hex($$content);
70             }
71              
72             1;