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 68     68   325 use strict;
  68         110  
  68         2057  
6 68     68   282 use Exporter ();
  68         135  
  68         915  
7 68     68   229 use Digest::MD5 ();
  68         88  
  68         1294  
8 68     68   19235 use Params::Util qw{_INSTANCE _SCALAR0 _ARRAY0};
  68         273156  
  68         8003  
9              
10             our $VERSION = '1.287';
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 68     68   434 use constant HAVE_UNICODE => !! ( $] >= 5.008007 );
  68         92  
  68         32660  
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   1814 shift if @_ > 1;
35 17 50       25 return undef unless defined $_[0];
36 17         93 require PPI::Document;
37 17 100       30 return PPI::Document->new(shift) unless ref $_[0];
38 16 100       56 return PPI::Document->new(shift) if _SCALAR0($_[0]);
39 10 100       24 return PPI::Document->new(shift) if _ARRAY0($_[0]);
40 9 100       54 return shift if _INSTANCE($_[0], 'PPI::Document');
41 2         7 return undef;
42             }
43              
44             # Provide a simple _slurp implementation
45             sub _slurp {
46 685 100   685   2822 my $file = shift or return "_slurp() failed: no filename provided";
47 684         3070 local $/ = undef;
48 684         1947 local *FILE;
49 684 100       40182 open( FILE, '<', $file ) or return "open($file) failed: $!";
50 683         39188 my $source = ;
51 683 50       8352 close( FILE ) or return "close($file) failed: $!";
52 683         5482 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 1176 my $string = shift;
59 339         207519 $string =~ s/(?:\015{1,2}\012|\015|\012)/\015/gs;
60 339         5094 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 2013 my $file = shift;
66 165         546 my $content = _slurp($file);
67 165 50       676 return undef unless ref $content;
68 165         99975 $$content =~ s/(?:\015{1,2}\012|\015|\012)/\n/gs;
69 165         632 md5hex($$content);
70             }
71              
72             1;