File Coverage

lib/App/dupfind/Guts/Algorithms.pm
Criterion Covered Total %
statement 15 79 18.9
branch 0 40 0.0
condition 0 15 0.0
subroutine 5 11 45.4
pod n/a
total 20 145 13.7


line stmt bran cond sub pod time code
1             # ABSTRACT: The private weeding algorithms available for use by public interface
2              
3 8     8   4209 use strict;
  8         17  
  8         244  
4 8     8   41 use warnings;
  8         14  
  8         426  
5              
6             package App::dupfind::Guts::Algorithms;
7             {
8             $App::dupfind::Guts::Algorithms::VERSION = '0.140230'; # TRIAL
9             }
10              
11 8     8   196 use 5.010;
  8         24  
  8         352  
12              
13 8     8   42 use File::Util;
  8         34  
  8         48  
14 8     8   653 use Moo::Role;
  8         14  
  8         44  
15              
16             requires 'opts';
17              
18              
19             sub _get_first_bytes
20             {
21 0     0     my ( $self, $file, $len ) = @_;
22              
23 0           my $buff;
24              
25 0   0       $len ||= 64;
26              
27 0 0         sysopen my $fh, $file, 0 or warn $!;
28              
29 0 0         return unless defined $fh;
30              
31 0           sysread $fh, $buff, $len;
32              
33 0 0         close $fh or warn qq(Couldn't close filehandle to $file $!);
34              
35 0           return $buff;
36             }
37              
38             sub _get_middle_last_bytes
39             {
40 0     0     my ( $self, $file, $len, $size ) = @_;
41              
42 0           my ( $buff_mid, $buff_last );
43              
44 0   0       $len ||= 32;
45              
46 0           my $pos = int $size / 2;
47              
48 0 0         sysopen my $fh, $file, 0 or warn $!;
49              
50 0 0         return unless defined $fh;
51              
52 0           sysseek $fh, $pos, 0;
53              
54 0           sysread $fh, $buff_mid, 1;
55              
56 0           sysseek $fh, $size - $len, 0;
57              
58 0           sysread $fh, $buff_last, $len;
59              
60 0 0         close $fh or warn qq(Couldn't close filehandle to $file $!);
61              
62 0           return $buff_mid . $buff_last;
63             }
64              
65             sub _get_first_middle_last_bytes
66             {
67 0     0     my ( $self, $file, $len, $size ) = @_;
68              
69 0           my ( $buff_first, $buff_mid, $buff_last );
70              
71 0   0       $len ||= 32;
72              
73 0           my $pos = int $size / 2;
74              
75 0 0         sysopen my $fh, $file, 0 or warn $!;
76              
77 0 0         return unless defined $fh;
78              
79 0           sysread $fh, $buff_first, $len;
80              
81 0 0 0       close $fh and return $buff_first if $size <= $len;
82              
83 0           sysseek $fh, $pos, 0;
84              
85 0           sysread $fh, $buff_mid, 1;
86              
87 0           sysseek $fh, $size - $len, 0;
88              
89 0           sysread $fh, $buff_last, $len;
90              
91 0 0         close $fh or warn qq(Couldn't close filehandle to $file $!);
92              
93 0           return $buff_first . $buff_mid . $buff_last;
94             }
95              
96             sub _get_last_bytes
97             {
98 0     0     my ( $self, $file, $len, $size ) = @_;
99              
100 0           my $buff;
101              
102 0   0       $len ||= 64;
103              
104 0 0         sysopen my $fh, $file, 0 or warn $!;
105              
106 0 0         return unless defined $fh;
107              
108 0           sysseek $fh, $size - $len, 0;
109              
110 0           sysread $fh, $buff, $len;
111              
112 0 0         close $fh or warn qq(Couldn't close filehandle to $file $!);
113              
114 0           return $buff;
115             }
116              
117             sub _get_middle_byte
118             {
119 0     0     my ( $self, $file, $len, $size ) = @_;
120              
121 0           my $buff;
122              
123 0           $len = 1;
124              
125 0           my $pos = int $size / 2;
126              
127 0 0         sysopen my $fh, $file, 0 or warn $!;
128              
129 0 0         return unless defined $fh;
130              
131 0           sysseek $fh, $pos, 0;
132              
133 0           sysread $fh, $buff, $len;
134              
135 0 0         close $fh or warn qq(Couldn't close filehandle to $file $!);
136              
137 0           return $buff;
138             }
139              
140             sub _get_bytes_n_offset_n
141             {
142 0     0     my ( $self, $file, $len, $size, $pos ) = @_;
143              
144 0           my $buff;
145              
146 0   0       $len ||= 32;
147              
148 0 0         return if $size <= $len;
149              
150 0   0       $pos ||= int $size / 3;
151              
152 0 0         sysopen my $fh, $file, 0 or warn $!;
153              
154 0 0         return unless defined $fh;
155              
156 0           sysseek $fh, $pos, 0;
157              
158 0           sysread $fh, $buff, $len;
159              
160 0 0         close $fh or warn qq(Couldn't close filehandle to $file $!);
161              
162 0           return $buff;
163             }
164              
165             1;
166              
167             __END__