File Coverage

blib/lib/Convert/UU.pm
Criterion Covered Total %
statement 54 62 87.1
branch 21 36 58.3
condition 20 40 50.0
subroutine 8 8 100.0
pod 0 2 0.0
total 103 148 69.5


line stmt bran cond sub pod time code
1             package Convert::UU;
2              
3 1     1   2854 use strict;
  1         2  
  1         32  
4 1     1   45 BEGIN {require 5.004} # m//gc
5 1     1   4 use vars qw($VERSION @ISA @EXPORT_OK);
  1         2  
  1         209  
6 1     1   7 use Carp 'croak';
  1         1  
  1         1601  
7              
8             require Exporter;
9              
10             @ISA = qw(Exporter);
11             # Items to export into callers namespace by default. Note: do not export
12             # names by default without a very good reason. Use EXPORT_OK instead.
13             # Do not simply export all your public functions/methods/constants.
14             @EXPORT_OK = qw(
15             uudecode uuencode
16             );
17             $VERSION = '0.5201';
18              
19             #
20             # From comp.lang.perl 3/1/95.
21             # Posted by Hans Mulder (hansm@wsinti05.win.tue.nl)
22             #
23              
24             sub uuencode {
25 3 50 33 3 0 3809 croak("Usage: uuencode( {string|filehandle} [,filename] [, mode] )")
26             unless(@_ >= 1 && @_ <= 3);
27              
28 3         9 my($in,$file,$mode) = @_;
29 3   100     16 $mode ||= "644";
30 3   100     11 $file ||= "uuencode.uu";
31              
32 3         4 my($chunk,@result,$r);
33 3 50 66     66 if (
      66        
      66        
34             UNIVERSAL::isa( $in, 'IO::Handle' ) or
35             ref(\$in) eq "GLOB" or
36             ref($in) eq "GLOB" or
37             ref($in) eq 'FileHandle'
38             ) {
39             # local $^W = 0; # Why did I get use of undefined value here ?
40 1         3 binmode($in);
41 1         4 local $/;
42 1         20 $in = <$in>;
43             }
44 3         11 pos($in)=0;
45 3         16 while ($in =~ m/\G(.{1,45})/sgc) {
46 74         204 push @result, _uuencode_chunk($1);
47             }
48 3         6 push @result, "`\n";
49 3         37 join "", "begin $mode $file\n", @result, "end\n";
50             }
51              
52             sub _uuencode_chunk {
53 74     74   128 my($string) = shift;
54             # for the Mac?
55             # my($mod3) = length($string) % 3;
56             # $string .= "\0", $mod3 -= 3 if $mod3;
57 74         163 my $encoded_string = pack("u", $string); # unix uuencode
58             # for the Mac?
59             # $encoded_string =~ s/.//; # remove length byte
60             # chop($encoded_string); # remove trailing \n
61             # $encoded_string =~ tr#`!-_#A-Za-z0-9+/#; # tr to mime alphabet
62             # substr($encoded_string, $mod3) =~ tr/A/=/; # adjust padding
63 74         300 $encoded_string;
64             }
65              
66             sub uudecode {
67 6 50   6 0 37 croak("Usage: uudecode( {string|filehandle|array ref}) ")
68             unless(@_ == 1);
69 6         9 my($in) = @_;
70              
71 6         7 my(@result,$file,$mode);
72 6         10 $mode = $file = "";
73 6 50 33     126 if (
    100 33        
    50 33        
74             UNIVERSAL::isa( $in, 'IO::Handle' ) or
75             ref(\$in) eq "GLOB" or
76             ref($in) eq "GLOB" or
77             ref($in) eq 'FileHandle'
78             ) {
79 0         0 local($\) = "\n";
80 0         0 binmode($in);
81 0         0 while (<$in>) {
82 0 0 0     0 if ($file eq "" and !$mode){
83 0 0       0 ($mode,$file) = ($1, $2) if /^begin\s+(\d+)\s+(.+)$/ ;
84 0         0 next;
85             }
86 0 0       0 last if /^end/;
87 0         0 push @result, _uudecode_chunk($_);
88             }
89             } elsif (ref(\$in) eq "SCALAR") {
90 5         31 while ($in =~ m/\G(.*?(\n|\r|\r\n|\n\r))/gc) {
91 93         143 my $line = $1;
92 93 100 66     215 if ($file eq "" and !$mode){
93 5         27 ($mode,$file) = $line =~ /^begin\s+(\d+)\s+(.+)$/ ;
94 5         36 next;
95             }
96 88 50 33     185 next if $file eq "" and !$mode;
97 88 100       172 last if $line =~ /^end/;
98 83         136 push @result, _uudecode_chunk($line);
99             }
100             } elsif (ref($in) eq "ARRAY") {
101 1         1 my $line;
102 1         3 foreach $line (@$in) {
103 3 100 66     12 if ($file eq "" and !$mode){
104 1         6 ($mode,$file) = $line =~ /^begin\s+(\d+)\s+(.+)$/ ;
105 1         2 next;
106             }
107 2 50 33     7 next if $file eq "" and !$mode;
108 2 100       9 last if $line =~ /^end/;
109 1         19 push @result, _uudecode_chunk($line);
110             }
111             }
112 6 50       54 wantarray ? (join("",@result),$file,$mode) : join("",@result);
113             }
114              
115             sub _uudecode_chunk {
116 84     84   97 my($chunk) = @_;
117             # return "" if $chunk =~ /^(--|\#|CREATED)/; # the "#" was an evil
118             # bug: a "#" in column
119             # one is legal!
120 84 50       218 return "" if $chunk =~ /^(?:--|CREATED)/;
121 84         254 my $string = substr($chunk,0,int((((ord($chunk) - 32) & 077) + 2) / 3)*4+1);
122             # warn "DEBUG: string [$string]";
123             # my $return = unpack("u", $string);
124             # warn "DEBUG: return [$return]";
125             # $return;
126              
127 84         358 my $ret = unpack("u", $string);
128 84 100       761 defined $ret ? $ret : "";
129             }
130              
131             1;
132              
133             __END__