File Coverage

blib/lib/Data/ParseBinary/Stream/String.pm
Criterion Covered Total %
statement 65 67 97.0
branch 12 14 85.7
condition n/a
subroutine 18 18 100.0
pod n/a
total 95 99 95.9


line stmt bran cond sub pod time code
1 5     5   27 use strict;
  5         6  
  5         161  
2 5     5   26 use warnings;
  5         6  
  5         5056  
3            
4             package Data::ParseBinary::Stream::StringRefReader;
5             our @ISA = qw{Data::ParseBinary::Stream::Reader};
6            
7             __PACKAGE__->_registerStreamType("StringRef");
8            
9             sub new {
10 120     120   188 my ($class, $stringref) = @_;
11 120         532 my $self = {
12             data => $stringref,
13             location => 0,
14             length => length($$stringref),
15             };
16 120         850 return bless $self, $class;
17             }
18            
19             sub ReadBytes {
20 359     359   478 my ($self, $count) = @_;
21 359 100       993 die "not enought bytes in stream" if $self->{location} + $count > $self->{length};
22 356         378 my $data = substr(${ $self->{data} }, $self->{location}, $count);
  356         851  
23 356         619 $self->{location} += $count;
24 356         1155 return $data;
25             }
26            
27             sub ReadBits {
28 9     9   12 my ($self, $bitcount) = @_;
29 9         31 return $self->_readBitsForByteStream($bitcount);
30             }
31            
32             sub tell {
33 31     31   52 my $self = shift;
34 31         93 return $self->{location};
35             }
36            
37             sub seek {
38 29     29   46 my ($self, $newpos) = @_;
39 29 50       68 die "can not seek past string's end" if $newpos > $self->{length};
40 29         60 $self->{location} = $newpos;
41             }
42            
43 22     22   94 sub isBitStream { return 0 };
44            
45             package Data::ParseBinary::Stream::StringReader;
46             our @ISA = qw{Data::ParseBinary::Stream::StringRefReader};
47            
48             __PACKAGE__->_registerStreamType("String");
49            
50             sub new {
51 113     113   324 my ($class, $string) = @_;
52 113         399 return $class->SUPER::new(\$string);
53             }
54            
55             package Data::ParseBinary::Stream::StringRefWriter;
56             our @ISA = qw{Data::ParseBinary::Stream::Writer};
57            
58             __PACKAGE__->_registerStreamType("StringRef");
59            
60             sub new {
61 136     136   230 my ($class, $source) = @_;
62 136 50       322 if (not defined $source) {
63 0         0 my $data = '';
64 0         0 $source = \$data;
65             }
66 136         437 my $self = {
67             data => $source,
68             offset => 0, # minus bytes from the end
69             };
70 136         777 return bless $self, $class;
71             }
72            
73             sub tell {
74 128     128   167 my $self = shift;
75 128         147 return length(${ $self->{data} }) - $self->{offset};
  128         709  
76             }
77            
78             sub seek {
79 124     124   167 my ($self, $newpos) = @_;
80 124 100       422 if ($newpos > length(${ $self->{data} })) {
  124         494  
81 7         10 $self->{offset} = 0;
82 7         18 ${ $self->{data} } .= "\0" x ($newpos - length(${ $self->{data} }))
  7         11  
  7         35  
83             } else {
84 117         185 $self->{offset} = length(${ $self->{data} }) - $newpos;
  117         532  
85             }
86             }
87            
88             sub WriteBytes {
89 3560     3560   1045236 my ($self, $data) = @_;
90 3560 100       7891 if ($self->{offset} == 0) {
91 3074         3518 ${ $self->{data} } .= $data;
  3074         615846  
92 3074         3779 return length ${ $self->{data} };
  3074         9516  
93             }
94 486         818 substr(${ $self->{data} }, -$self->{offset}, length($data), $data);
  486         1616  
95 486 100       1026 if ($self->{offset} <= length($data)) {
96 1         4 $self->{offset} = 0;
97             } else {
98 485         1168 $self->{offset} = $self->{offset} - length($data);
99             }
100 486         3821 return length(${ $self->{data} }) - $self->{offset};
  486         1439  
101             }
102            
103             sub WriteBits {
104 9     9   13 my ($self, $bitdata) = @_;
105 9         34 return $self->_writeBitsForByteStream($bitdata);
106             }
107            
108             sub Flush {
109 272     272   672 my $self = shift;
110 272         13517 return $self->{data};
111             }
112            
113 381     381   1046 sub isBitStream { return 0 };
114            
115             package Data::ParseBinary::Stream::StringWriter;
116             our @ISA = qw{Data::ParseBinary::Stream::StringRefWriter};
117            
118             __PACKAGE__->_registerStreamType("String");
119            
120             sub new {
121 134     134   239 my ($class, $source) = @_;
122 134 100       352 $source = '' unless defined $source;
123 134         491 return $class->SUPER::new(\$source);
124             }
125            
126             sub Flush {
127 267     267   353 my $self = shift;
128 267         633 my $data = $self->SUPER::Flush();
129 267         1358 return $$data;
130             }
131            
132            
133             1;