File Coverage

blib/lib/XML/SAX/PurePerl/XMLDecl.pm
Criterion Covered Total %
statement 40 66 60.6
branch 17 38 44.7
condition n/a
subroutine 5 7 71.4
pod 0 5 0.0
total 62 116 53.4


line stmt bran cond sub pod time code
1             # $Id$
2              
3             package XML::SAX::PurePerl;
4              
5 14     14   90 use strict;
  14         25  
  14         448  
6 14     14   71 use XML::SAX::PurePerl::Productions qw($S $VersionNum $EncNameStart $EncNameEnd);
  14         24  
  14         9908  
7              
8             sub XMLDecl {
9 25     25 0 57 my ($self, $reader) = @_;
10            
11 25         78 my $data = $reader->data(5);
12             # warn("Looking for xmldecl in: $data");
13 25 100       386 if ($data =~ /^<\?xml$S/o) {
14 13         54 $reader->move_along(5);
15 13         45 $self->skip_whitespace($reader);
16            
17             # get version attribute
18 13 100       35 $self->VersionInfo($reader) ||
19             $self->parser_error("XML Declaration lacks required version attribute, or version attribute does not match XML specification", $reader);
20            
21 11 100       31 if (!$self->skip_whitespace($reader)) {
22 7         21 my $data = $reader->data(2);
23 7 50       37 $data =~ /^\?>/ or $self->parser_error("Syntax error", $reader);
24 7         25 $reader->move_along(2);
25 7         17 return;
26             }
27            
28 4 50       13 if ($self->EncodingDecl($reader)) {
29 4 50       19 if (!$self->skip_whitespace($reader)) {
30 4         10 my $data = $reader->data(2);
31 4 50       20 $data =~ /^\?>/ or $self->parser_error("Syntax error", $reader);
32 4         13 $reader->move_along(2);
33 4         8 return;
34             }
35             }
36            
37 0         0 $self->SDDecl($reader);
38            
39 0         0 $self->skip_whitespace($reader);
40            
41 0         0 my $data = $reader->data(2);
42 0 0       0 $data =~ /^\?>/ or $self->parser_error("Syntax error", $reader);
43 0         0 $reader->move_along(2);
44             }
45             else {
46             # warn("first 5 bytes: ", join(',', unpack("CCCCC", $data)), "\n");
47             # no xml decl
48 12 100       68 if (!$reader->get_encoding) {
49 11         31 $reader->set_encoding("UTF-8");
50             }
51             }
52             }
53              
54             sub VersionInfo {
55 13     13 0 29 my ($self, $reader) = @_;
56            
57 13         30 my $data = $reader->data(11);
58            
59             # warn("Looking for version in $data");
60            
61 13 100       315 $data =~ /^(version$S*=$S*(["'])($VersionNum)\2)/o or return 0;
62 12         72 $reader->move_along(length($1));
63 12         31 my $vernum = $3;
64            
65 12 100       45 if ($vernum ne "1.0") {
66 1         5 $self->parser_error("Only XML version 1.0 supported. Saw: '$vernum'", $reader);
67             }
68              
69 11         35 return 1;
70             }
71              
72             sub SDDecl {
73 0     0 0 0 my ($self, $reader) = @_;
74            
75 0         0 my $data = $reader->data(15);
76            
77 0 0       0 $data =~ /^(standalone$S*=$S*(["'])(yes|no)\2)/o or return 0;
78 0         0 $reader->move_along(length($1));
79 0         0 my $yesno = $3;
80            
81 0 0       0 if ($yesno eq 'yes') {
82 0         0 $self->{standalone} = 1;
83             }
84             else {
85 0         0 $self->{standalone} = 0;
86             }
87            
88 0         0 return 1;
89             }
90              
91             sub EncodingDecl {
92 4     4 0 10 my ($self, $reader) = @_;
93            
94 4         9 my $data = $reader->data(12);
95            
96 4 50       92 $data =~ /^(encoding$S*=$S*(["'])($EncNameStart$EncNameEnd*)\2)/o or return 0;
97 4         18 $reader->move_along(length($1));
98 4         7 my $encoding = $3;
99            
100 4         13 $reader->set_encoding($encoding);
101            
102 4         13 return 1;
103             }
104              
105             sub TextDecl {
106 0     0 0   my ($self, $reader) = @_;
107            
108 0           my $data = $reader->data(6);
109 0 0         $data =~ /^<\?xml$S+/ or return;
110 0           $reader->move_along(5);
111 0           $self->skip_whitespace($reader);
112            
113 0 0         if ($self->VersionInfo($reader)) {
114 0 0         $self->skip_whitespace($reader) ||
115             $self->parser_error("Lack of whitespace after version attribute in text declaration", $reader);
116             }
117            
118 0 0         $self->EncodingDecl($reader) ||
119             $self->parser_error("Encoding declaration missing from external entity text declaration", $reader);
120            
121 0           $self->skip_whitespace($reader);
122            
123 0           $data = $reader->data(2);
124 0 0         $data =~ /^\?>/ or $self->parser_error("Syntax error", $reader);
125            
126 0           return 1;
127             }
128              
129             1;