File Coverage

blib/lib/Spp/Cursor.pm
Criterion Covered Total %
statement 40 56 71.4
branch 3 4 75.0
condition n/a
subroutine 10 13 76.9
pod 0 10 0.0
total 53 83 63.8


line stmt bran cond sub pod time code
1             package Spp::Cursor;
2              
3 2     2   26 use 5.012;
  2         6  
4 2     2   9 no warnings "experimental";
  2         3  
  2         53  
5              
6 2     2   8 use Spp::Builtin qw(to_end);
  2         4  
  2         931  
7              
8             sub new {
9 3     3 0 11 my ($class, $str, $ns) = @_;
10 3         10 my $trace_str = $str . chr(0);
11 3         6 my $len_str = length($trace_str);
12 3         33 return bless({
13             str => $trace_str,
14             ns => $ns,
15             len => $len_str,
16             off => 0,
17             line => 1,
18             pos => 0,
19             maxoff => 0,
20             maxline => 1,
21             maxpos => 0,
22             }, $class);
23             }
24              
25             sub off {
26 490     490 0 613 my $self = shift;
27 490         860 return $self->{'off'};
28             }
29              
30             sub str {
31 23     23 0 34 my $self = shift;
32 23         62 return $self->{'str'};
33             }
34              
35             sub len {
36 0     0 0 0 my $self = shift;
37 0         0 return $self->{'len'};
38             }
39              
40             sub to_next {
41 43     43 0 68 my $self = shift;
42 43 50       72 if (get_char($self) eq "\n") {
43 0         0 $self->{line}++;
44 0         0 $self->{pos} = 0;
45             }
46             else {
47 43         63 $self->{pos}++;
48             }
49 43         65 $self->{off}++;
50 43 100       101 if ($self->{off} > $self->{maxoff}) {
51 36         51 $self->{maxoff} = $self->{off};
52 36         50 $self->{maxline} = $self->{line};
53 36         70 $self->{maxpos} = $self->{pos};
54             }
55             }
56              
57             sub cache {
58 647     647 0 810 my $self = shift;
59 647         844 my $off = $self->{off};
60 647         758 my $line = $self->{line};
61 647         797 my $pos = $self->{pos};
62 647         1465 return [$off, $line, $pos];
63             }
64              
65             sub reset_cache {
66 634     634 0 945 my ($self, $cache) = @_;
67 634         761 my ($off, $line, $pos) = @{$cache};
  634         966  
68 634         846 $self->{off} = $off;
69 634         734 $self->{line} = $line;
70 634         707 $self->{pos} = $pos;
71 634         1163 return 1;
72             }
73              
74             sub get_char {
75 554     554 0 747 my $self = shift;
76 554         707 my $str = $self->{str};
77 554         640 my $off = $self->{off};
78 554         1878 return substr($str, $off, 1);
79             }
80              
81             sub pre_char {
82 0     0 0   my $self = shift;
83 0           my $str = $self->{str};
84 0           my $off = $self->{off};
85 0           return substr($str, $off-1, 1);
86             }
87              
88             sub max_report {
89 0     0 0   my $self = shift;
90 0           my $str = $self->{str};
91 0           my $off = $self->{maxoff};
92 0           my $line = $self->{maxline};
93 0           my $pos = $self->{maxpos};
94 0           my $tip_str = to_end(substr($str, $off - $pos));
95 0           my $tip_char = (' ' x $pos) . '^';
96 0           return <<EOF;
97             Warning! Stop match at line: $line
98             $tip_str
99             $tip_char
100             EOF
101             }
102              
103             1;