File Coverage

blib/lib/EBook/Ishmael/CharDet/ISO2022.pm
Criterion Covered Total %
statement 38 48 79.1
branch 10 12 83.3
condition 6 9 66.6
subroutine 10 13 76.9
pod 0 6 0.0
total 64 88 72.7


line stmt bran cond sub pod time code
1             package EBook::Ishmael::CharDet::ISO2022;
2 18     18   10014 use 5.016;
  18         74  
3             our $VERSION = '2.03';
4 18     18   118 use strict;
  18         36  
  18         708  
5 18     18   104 use warnings;
  18         40  
  18         1157  
6              
7 18     18   114 use EBook::Ishmael::CharDet::Constants qw(:CONSTANTS);
  18         65  
  18         2486  
8              
9 18     18   131 use List::Util qw(any);
  18         37  
  18         1877  
10              
11             use constant {
12 18         12723 STATE_UNKNOWN => 0,
13             STATE_GOOD => 1,
14             STATE_BAD => 2,
15 18     18   125 };
  18         61  
16              
17             sub initialize {
18              
19 46     46 0 126 my ($self) = @_;
20              
21 46         366 %$self = (
22             InEscape => 0,
23             Cur => '',
24             State => STATE_UNKNOWN,
25             Unique => [],
26             );
27              
28             }
29              
30             sub new {
31              
32 0     0 0 0 my ($class) = @_;
33              
34 0         0 my $self = bless {}, $class;
35 0         0 $self->initialize;
36              
37 0         0 return $self;
38              
39             }
40              
41             sub take {
42              
43 17528     17528 0 32958 my ($self, $data) = @_;
44              
45 17528         36479 for my $i (0 .. length($data) - 1) {
46 280411         445167 my $b = ord(substr $data, $i, 1) & 0xff;
47 280411 100 100     965087 if (!$self->{InEscape} && $b == ord "\e") {
    100          
48 6         16 $self->{InEscape} = 1;
49             } elsif ($self->{InEscape}) {
50 16 100 66     94 if ($b >= 0x20 && $b <= 0x2f) {
    50 33        
51 10         31 $self->{Cur} .= chr $b;
52             } elsif ($b >= 0x30 && $b <= 0x7e) {
53 6         17 $self->{Cur} .= chr $b;
54 6         13 $self->{InEscape} = 0;
55 6 100   18   35 if (any { $_ eq $self->{Cur} } @{ $self->{Unique} }) {
  18         42  
  6         44  
56 4         7 $self->{State} = STATE_GOOD;
57 4         19 return TAKE_MUST_BE;
58             }
59 2         12 $self->{Cur} = '';
60             } else {
61 0         0 $self->{State} = STATE_BAD;
62 0         0 return TAKE_BAD;
63             }
64             }
65             }
66              
67 17524         41983 return TAKE_OK;
68              
69             }
70              
71             sub confidence {
72              
73 34     34 0 83 my ($self) = @_;
74              
75 34 50       111 if ($self->{State} == STATE_GOOD) {
76 0         0 return 1.0;
77             } else {
78 34         212 return 0;
79             }
80              
81             }
82              
83             sub bad {
84              
85 0     0 0   my ($self) = @_;
86              
87 0           return $self->{State} == STATE_BAD;
88              
89             }
90              
91 0     0 0   sub encoding { die "encoding not set" }
92              
93             1;