File Coverage

blib/lib/Protocol/DBus/Signature.pm
Criterion Covered Total %
statement 29 29 100.0
branch 11 12 91.6
condition 3 3 100.0
subroutine 4 4 100.0
pod 0 2 0.0
total 47 50 94.0


line stmt bran cond sub pod time code
1             package Protocol::DBus::Signature;
2              
3 8     8   783 use strict;
  8         19  
  8         240  
4 8     8   42 use warnings;
  8         15  
  8         2460  
5              
6             # Returns a list of single complete types (SCTs).
7              
8             sub split {
9 164     164 0 276 my ($sig) = @_;
10              
11 164         233 my @scts;
12              
13 164         311 while (length($sig)) {
14 211         352 my $next_sct_len = Protocol::DBus::Signature::get_sct_length($sig, 0);
15 211         652 push @scts, substr( $sig, 0, $next_sct_len, q<> );
16             }
17              
18 164         434 return @scts;
19             }
20              
21             # Returns the length of the single complete type at $sct_offset.
22              
23             sub get_sct_length {
24 740     740 0 5408 my ($sig, $sct_offset) = @_;
25              
26 740         1001 my $start = $sct_offset;
27              
28 740         1167 my $next = substr($sig, $sct_offset, 1);
29              
30 740 100       1369 if ($next eq 'a') {
31              
32             # “{ }” only happens after “a”
33 114         216 my $next_2nd = substr($sig, 1 + $sct_offset, 1);
34 114 100       244 if ($next_2nd eq '{') {
35              
36             # 4 for the “a”, “{”, key type, and “}”.
37             # We assume that the signature is well-formed.
38 36         109 return 4 + get_sct_length($sig, 3 + $sct_offset);
39             }
40              
41 78         160 return 1 + get_sct_length($sig, 1 + $sct_offset);
42             }
43              
44 626 100       1138 if ($next eq '(') {
45 52         78 while (1) {
46 160         214 $sct_offset++;
47              
48 160 50       279 last if $sct_offset >= length($sig);
49              
50 160         253 my $next_in_struct = substr($sig, $sct_offset, 1);
51              
52 160 100 100     549 if ($next_in_struct eq '(' || $next_in_struct eq 'a') {
    100          
53 18         50 $sct_offset += get_sct_length($sig, $sct_offset) - 1;
54             }
55             elsif ($next_in_struct eq ')') {
56 52         92 last;
57             }
58             }
59             }
60              
61 626         1403 return 1 + ($sct_offset - $start);
62             }
63              
64             1;