File Coverage

blib/lib/Barcode/DataMatrix/Reed.pm
Criterion Covered Total %
statement 31 32 96.8
branch 7 12 58.3
condition n/a
subroutine 7 8 87.5
pod 4 4 100.0
total 49 56 87.5


line stmt bran cond sub pod time code
1             package Barcode::DataMatrix::Reed;
2              
3             =head1 Barcode::DataMatrix::Reed
4              
5             This is just a renamed version of Algorithm::DataMatrix::Reed
6             by Mons Anderson
7             from http://code.google.com/p/perl-ex/
8              
9             For a rough explanation of the structure of this code, see
10             L.
11             Note that the link is not the basis of the implementation (this is unknown),
12             however it helps explain how Reed-Solomon encoding is implemented and hence
13             how the code below works.
14              
15             =cut
16              
17 2     2   12 use strict;
  2         3  
  2         58  
18 2     2   12 use warnings;
  2         4  
  2         55  
19 2     2   11 use Carp;
  2         11  
  2         2036  
20              
21             our (@GFI,@GFL,%POLY,$DEBUG);
22             our $N = 255;
23              
24             =head2 DEBUG
25              
26             Control whether or not debugging output is printed.
27              
28             =cut
29              
30 48     48 1 120 sub DEBUG { 0 }
31              
32             =head2 mult (x, y)
33              
34             Multiply two Galois field element values and return the result.
35              
36             =cut
37              
38             sub mult {
39 57966     57966 1 64498 my ($x, $y) = @_;
40 57966 100       101588 return 0 unless $x * $y;
41 57714         125520 return $GFI[($GFL[$x] + $GFL[$y]) % $N];
42             }
43              
44             =head2 encode (ai, j)
45              
46             Encode the message array and return it.
47              
48             =cut
49              
50             sub encode {
51 16     16 1 22 my ($ai,$j) = @_;
52 16         26 my $i = @$ai;
53 16         41 for (0..$#$ai) {
54 1226 50       2602 ( $ai->[$_] & 0xFF ) != $ai->[$_] and warn("number $ai->[$_] at index $_ is not a byte size"), $ai->[$_] = $ai->[$_] & 0xFF;
55             }
56 16 50       60 warn "CalcReed: ai [@$ai], $j\n" if DEBUG;
57 16 50       65 my $p = exists $POLY{$j} ? $POLY{$j} : $POLY{68};
58 16 50       31 warn "CalcReed: poly [@$p]\n" if DEBUG;
59 16         141 @$ai[ $i .. $i + $j - 1 ] = (0) x $j;
60 16         58 for my $l(0 .. $i - 1) {
61 1226         1707 my $word0 = ($ai->[$i] ^ $ai->[$l]);
62 1226         2052 for my $i1 (0 .. $j - 2) {
63 56740         110305 $ai->[$i + $i1] = ( $ai->[$i + $i1 + 1] ^ mult($word0, $p->[$i1]) );
64             }
65 1226         2318 $ai->[$i+$j-1] = mult($word0, $p->[$j - 1]);
66             }
67 16 50       34 warn "CalcReed: result [@$ai]\n" if DEBUG;
68 16         52 return $ai;
69             }
70              
71             =head2 decode
72              
73             Decode the message array. Currently not implemented.
74              
75             =cut
76              
77             sub decode {
78 0     0 1   croak "not implemented";
79             }
80              
81             BEGIN {
82 2     2   61 @GFI = ( 1, 2, 4, 8, 16, 32, 64, 128, 45, 90, 180, 69, 138, 57, 114, 228, 229, 231, 227, 235, 251, 219, 155, 27, 54, 108, 216, 157, 23, 46, 92, 184, 93, 186, 89, 178, 73, 146, 9, 18, 36, 72, 144, 13, 26, 52, 104, 208, 141, 55, 110, 220, 149, 7, 14, 28, 56, 112, 224, 237, 247, 195, 171, 123, 246, 193, 175, 115, 230, 225, 239, 243, 203, 187, 91, 182, 65, 130, 41, 82, 164, 101, 202, 185, 95, 190, 81, 162, 105, 210, 137, 63, 126, 252, 213, 135, 35, 70, 140, 53, 106, 212, 133, 39, 78, 156, 21, 42, 84, 168, 125, 250, 217, 159, 19, 38, 76, 152, 29, 58, 116, 232, 253, 215, 131, 43, 86, 172, 117, 234, 249, 223, 147, 11, 22, 44, 88, 176, 77, 154, 25, 50, 100, 200, 189, 87, 174, 113, 226, 233, 255, 211, 139, 59, 118, 236, 245, 199, 163, 107, 214, 129, 47, 94, 188, 85, 170, 121, 242, 201, 191, 83, 166, 97, 194, 169, 127, 254, 209, 143, 51, 102, 204, 181, 71, 142, 49, 98, 196, 165, 103, 206, 177, 79, 158, 17, 34, 68, 136, 61, 122, 244, 197, 167, 99, 198, 161, 111, 222, 145, 15, 30, 60, 120, 240, 205, 183, 67, 134, 33, 66, 132, 37, 74, 148, 5, 10, 20, 40, 80, 160, 109, 218, 153, 31, 62, 124, 248, 221, 151, 3, 6, 12, 24, 48, 96, 192, 173, 119, 238, 241, 207, 179, 75, 150 );
83 2         43 @GFL = ( 0, 0, 1, 240, 2, 225, 241, 53, 3, 38, 226, 133, 242, 43, 54, 210, 4, 195, 39, 114, 227, 106, 134, 28, 243, 140, 44, 23, 55, 118, 211, 234, 5, 219, 196, 96, 40, 222, 115, 103, 228, 78, 107, 125, 135, 8, 29, 162, 244, 186, 141, 180, 45, 99, 24, 49, 56, 13, 119, 153, 212, 199, 235, 91, 6, 76, 220, 217, 197, 11, 97, 184, 41, 36, 223, 253, 116, 138, 104, 193, 229, 86, 79, 171, 108, 165, 126, 145, 136, 34, 9, 74, 30, 32, 163, 84, 245, 173, 187, 204, 142, 81, 181, 190, 46, 88, 100, 159, 25, 231, 50, 207, 57, 147, 14, 67, 120, 128, 154, 248, 213, 167, 200, 63, 236, 110, 92, 176, 7, 161, 77, 124, 221, 102, 218, 95, 198, 90, 12, 152, 98, 48, 185, 179, 42, 209, 37, 132, 224, 52, 254, 239, 117, 233, 139, 22, 105, 27, 194, 113, 230, 206, 87, 158, 80, 189, 172, 203, 109, 175, 166, 62, 127, 247, 146, 66, 137, 192, 35, 252, 10, 183, 75, 216, 31, 83, 33, 73, 164, 144, 85, 170, 246, 65, 174, 61, 188, 202, 205, 157, 143, 169, 82, 72, 182, 215, 191, 251, 47, 178, 89, 151, 101, 94, 160, 123, 26, 112, 232, 21, 51, 238, 208, 131, 58, 69, 148, 18, 15, 16, 68, 17, 121, 149, 129, 19, 155, 59, 249, 70, 214, 250, 168, 71, 201, 156, 64, 60, 237, 130, 111, 20, 93, 122, 177, 150 );
84 2         206 %POLY = (
85             5 => [62, 111, 15, 48, 228],
86             7 => [254, 92, 240, 134, 144, 68, 23],
87             10 => [61, 110, 255, 116, 248, 223, 166, 185, 24, 28],
88             11 => [120, 97, 60, 245, 39, 168, 194, 12, 205, 138, 175],
89             12 => [242, 100, 178, 97, 213, 142, 42, 61, 91, 158, 153, 41],
90             14 => [185, 83, 186, 18, 45, 138, 119, 157, 9, 95, 252, 192, 97, 156],
91             18 => [188, 90, 48, 225, 254, 94, 129, 109, 213, 241, 61, 66, 75, 188, 39, 100, 195, 83],
92             20 => [172, 186, 174, 27, 82, 108, 79, 253, 145, 153, 160, 188, 2, 168, 71, 233, 9, 244, 195, 15],
93             24 => [193, 50, 96, 184, 181, 12, 124, 254, 172, 5, 21, 155, 223, 251, 197, 155, 21, 176, 39, 109, 205, 88, 190, 52],
94             28 => [255, 93, 168, 233, 151, 120, 136, 141, 213, 110, 138, 17, 121, 249, 34, 75, 53, 170, 151, 37, 174, 103, 96, 71, 97, 43, 231, 211],
95             36 => [112, 81, 98, 225, 25, 59, 184, 175, 44, 115, 119, 95, 137, 101, 33, 68, 4, 2, 18, 229, 182, 80, 251, 220, 179, 84, 120, 102, 181, 162, 250, 130, 218, 242, 127, 245],
96             42 => [5, 9, 5, 226, 177, 150, 50, 69, 202, 248, 101, 54, 57, 253, 1, 21, 121, 57, 111, 214, 105, 167, 9, 100, 95, 175, 8, 242, 133, 245, 2, 122, 105, 247, 153, 22, 38, 19, 31, 137, 193, 77],
97             48 => [19, 225, 253, 92, 213, 69, 175, 160, 147, 187, 87, 176, 44, 82, 240, 186, 138, 66, 100, 120, 88, 131, 205, 170, 90, 37, 23, 118, 147, 16, 106, 191, 87, 237, 188, 205, 231, 238, 133, 238, 22, 117, 32, 96, 223, 172, 132, 245],
98             56 => [46, 143, 53, 233, 107, 203, 43, 155, 28, 247, 67, 127, 245, 137, 13, 164, 207, 62, 117, 201, 150, 22, 238, 144, 232, 29, 203, 117, 234, 218, 146, 228, 54, 132, 200, 38, 223, 36, 159, 150, 235, 215, 192, 230, 170, 175, 29, 100, 208, 220, 17, 12, 238, 223, 9, 175],
99             62 => [204, 11, 47, 86, 124, 224, 166, 94, 7, 232, 107, 4, 170, 176, 31, 163, 17, 188, 130, 40, 10, 87, 63, 51, 218, 27, 6, 147, 44, 161, 71, 114, 64, 175, 221, 185, 106, 250, 190, 197, 63, 245, 230, 134, 112, 185, 37, 196, 108, 143, 189, 201, 188, 202, 118, 39, 210, 144, 50, 169, 93, 242],
100             68 => [186, 82, 103, 96, 63, 132, 153, 108, 54, 64, 189, 211, 232, 49, 25, 172, 52, 59, 241, 181, 239, 223, 136, 231, 210, 96, 232, 220, 25, 179, 167, 202, 185, 153, 139, 66, 236, 227, 160, 15, 213, 93, 122, 68, 177, 158, 197, 234, 180, 248, 136, 213, 127, 73, 36, 154, 244, 147, 33, 89, 56, 159, 149, 251, 89, 173, 228, 220],
101             );
102             }
103              
104             1;