File Coverage

blib/lib/Gzip/Faster.pm
Criterion Covered Total %
statement 54 54 100.0
branch 18 22 81.8
condition 6 6 100.0
subroutine 8 8 100.0
pod 3 5 60.0
total 89 95 93.6


line stmt bran cond sub pod time code
1             package Gzip::Faster;
2 2     2   205164 use warnings;
  2         3  
  2         95  
3 2     2   18 use strict;
  2         2  
  2         180  
4             require Exporter;
5             our @ISA = qw(Exporter);
6             our @EXPORT = qw/gzip gunzip gzip_file gunzip_file gzip_to_file/;
7             our @EXPORT_OK = qw/deflate inflate deflate_raw inflate_raw/;
8             our %EXPORT_TAGS = ('all' => [@EXPORT, @EXPORT_OK]);
9 2     2   10 use Carp;
  2         3  
  2         1138  
10             our $VERSION = '0.22';
11             require XSLoader;
12             XSLoader::load ('Gzip::Faster', $VERSION);
13              
14             # Read the whole file in to memory.
15              
16             sub get_file
17             {
18 11     11 0 18 my ($file) = @_;
19 11 50       454 open my $in, "<:raw", $file or croak "Error opening '$file': $!";
20 11         51 local $/;
21 11         270 my $zipped = <$in>;
22 11 50       119 close $in or croak "Error closing '$file': $!";
23 11         88 return $zipped;
24             }
25              
26             # Make a temporary user object so that gzip_file and friends can
27             # fiddle with the options of it to set the file name, etc. The object
28             # is discarded after the call.
29              
30             sub gzip_options
31             {
32 4     4 0 14 my ($plain, %options) = @_;
33 4         38 my $gf = __PACKAGE__->new ();
34 4         6 my $file_name = $options{file_name};
35 4         5 my $mod_time = $options{mod_time};
36 4 100       9 if ($file_name) {
37 3         8 $gf->file_name ($file_name);
38             }
39 4 100       8 if ($mod_time) {
40 1         3 $gf->mod_time ($mod_time);
41             }
42 4         2296 return $gf->zip ($plain);
43             }
44              
45             sub gzip_file
46             {
47 2     2 1 187227 my ($file, %options) = @_;
48 2         28 my $plain = get_file ($file);
49 2 100       8 if (keys %options) {
50 1         6 return gzip_options ($plain, %options);
51             }
52             else {
53 1         12 my $mod_time = (stat ($file))[9];
54 1         5 return gzip_options ($plain, file_name => $file, mod_time => $mod_time);
55             }
56             }
57              
58             sub gunzip_file
59             {
60 9     9 1 8109 my ($file, %options) = @_;
61 9         20 my $zipped = get_file ($file);
62 9         15 my $plain;
63 9 100       20 if (keys %options) {
64              
65             # Make a temporary user object so that we can fiddle with the
66             # options of it to get the file name, etc. The object is
67             # discarded outside this scope.
68              
69 6         76 my $gf = __PACKAGE__->new ();
70 6         702 $plain = $gf->unzip ($zipped);
71 6         17 my $file_name_ref = $options{file_name};
72 6 100 100     26 if (defined ($file_name_ref) && ref $file_name_ref ne 'SCALAR') {
73 1         11 warn "Cannot write file name to non-scalar reference";
74             }
75             else {
76 5         19 $$file_name_ref = $gf->file_name ();
77             }
78 6         14 my $mod_time_ref = $options{mod_time};
79 6 100 100     20 if (defined ($mod_time_ref) && ref $mod_time_ref ne 'SCALAR') {
80 1         11 warn "Cannot write modification time to non-scalar reference";
81             }
82             else {
83 5         28 $$mod_time_ref = $gf->mod_time ();
84             }
85             }
86             else {
87 3         384 $plain = gunzip ($zipped);
88             }
89 9         52 return $plain;
90             }
91              
92             sub gzip_to_file
93             {
94 4     4 1 5363 my ($plain, $file, %options) = @_;
95 4         7 my $zipped;
96 4 100       11 if (keys %options) {
97 2         40 $zipped = gzip_options ($plain, %options);
98             }
99             else {
100 2         1152 $zipped = gzip ($plain);
101             }
102 4 50       514 open my $in, ">:raw", $file or croak "Error opening '$file': $!";
103 4         20 print $in $zipped;
104 4 50       840 close $in or croak "Error closing '$file': $!";
105             }
106              
107             1;