File Coverage

lib/Perlmazing/Perlmazing/Precompile/numeric.pm
Criterion Covered Total %
statement 6 75 8.0
branch 0 40 0.0
condition 0 30 0.0
subroutine 2 4 50.0
pod n/a
total 8 149 5.3


line stmt bran cond sub pod time code
1 34     34   328 use Perlmazing qw(is_number);
  34         87  
  34         208  
2 34     34   269 use version;
  34         68  
  34         202  
3              
4             sub main ($$) {
5 0     0     my ($aa, $bb) = ($_[0], $_[1]);
6 0 0 0       if (is_number $aa and is_number $bb) {
7 0           my $result = $aa <=> $bb;
8 0 0         unless ($result) {
9 0           $result = length($aa) <=> length($bb);
10             }
11 0           return $result;
12             }
13 0           my @split_a = grep {length} split /(\d+(?:\.\d+)*)/, $aa;
  0            
14 0           my @split_b = grep {length} split /(\d+(?:\.\d+)*)/, $bb;
  0            
15 0           my $result = 0;
16 0   0       while (@split_a and @split_b) {
17 0           my $oa = my $aaa = shift @split_a;
18 0           my $ob = my $bbb = shift @split_b;
19 0 0 0       if (_is_numeric($aaa) and _is_numeric($bbb)) {
    0 0        
    0 0        
    0          
20             # All of this is necessary because apparently version->parse($aaa) <=> version->parse($bbb) fails with things like "2.9" vs "2.13.1",
21 0           my $max_length = 0;
22 0           for my $i ($aaa, $bbb) {
23 0           my @parts = split /\./, $i;
24 0           for my $number (@parts) {
25 0           my $length = length $number;
26 0 0         $max_length = $length if $length > $max_length;
27             }
28             }
29 0 0 0       if ($aaa =~ /\./ or $bbb =~ /\./) {
30 0           my @parts_a = split /\./, $aaa;
31 0           my @parts_b = split /\./, $bbb;
32 0 0         for (my $i = 0; $i < (@parts_a > @parts_b ? @parts_a : @parts_b); $i++) {
33 0 0 0       last unless $i < @parts_a and $i < @parts_b;
34 0           my $number_a = $parts_a[$i];
35 0           my $number_b = $parts_b[$i];
36 0 0 0       if ($number_a =~ /^0/ and $number_b !~ /^0/) {
    0 0        
37 0           $number_b .= '0' x ($max_length - length $number_b);
38             } elsif ($number_b =~ /^0/ and $number_a !~ /^0/) {
39 0           $number_a .= '0' x ($max_length - length $number_a);
40             } else {
41 0           $number_a = sprintf '%0'.$max_length.'d', $number_a;
42 0           $number_b = sprintf '%0'.$max_length.'d', $number_b;
43             }
44 0           $parts_a[$i] = $number_a;
45 0           $parts_b[$i] = $number_b;
46             }
47 0           $aaa = join '.', @parts_a;
48 0           $bbb = join '.', @parts_b;
49             }
50 0           for my $i ($aaa, $bbb) {
51 0           my @parts = split /\./, $i;
52 0           for my $number (@parts) {
53 0           $number = sprintf '%0'.$max_length.'d', $number;
54             }
55 0           $i = join '.', @parts;
56             }
57 0           my $dots_a = scalar (my @dots_a = $aaa =~ /\./g);
58 0           my $dots_b = scalar (my @dots_b = $bbb =~ /\./g);
59 0 0         if ($dots_a > $dots_b) {
    0          
60 0           my $rest = $dots_a - $dots_b;
61 0           for my $i (1..$rest) {
62 0           $bbb .= '.0';
63             }
64             } elsif ($dots_b > $dots_a) {
65 0           my $rest = $dots_b - $dots_a;
66 0           for my $i (1..$rest) {
67 0           $aaa .= '.0';
68             }
69             }
70 0           $result = version->parse($aaa) <=> version->parse($bbb);
71 0 0         if (!$result) {
72 0           $result = length($oa) <=> length($ob);
73             }
74 0 0         last if $result;
75             } elsif (is_number($aaa) and is_number($bbb)) {
76 0           $result = $aaa <=> $bbb;
77 0 0         last if $result
78             } elsif (not is_number($aaa) and not is_number($bbb)) {
79 0           $result = lc($aaa) cmp lc($bbb);
80 0 0         last if $result;
81             } elsif (is_number $aaa) {
82 0           $result = 0 <=> 1;
83 0           last;
84             } else {
85 0           $result = 1 <=> 0;
86 0           last;
87             }
88             }
89 0   0       $result ||= $aa cmp $bb;
90 0           $result;
91             }
92              
93             sub _is_numeric {
94 0     0     my $v = shift;
95 0 0         return if is_number $v;
96 0 0         return 1 if $v =~ /^\d+(\.\d+)*$/;
97 0           0;
98             }