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 12     12   73 use strict;
  12         25  
  12         544  
6 12     12   72 use XML::SAX::PurePerl::Productions qw($S $VersionNum $EncNameStart $EncNameEnd);
  12         26  
  12         11964  
7              
8             sub XMLDecl {
9 22     22 0 53 my ($self, $reader) = @_;
10            
11 22         111 my $data = $reader->data(5);
12             # warn("Looking for xmldecl in: $data");
13 22 100       421 if ($data =~ /^<\?xml$S/o) {
14 10         99 $reader->move_along(5);
15 10         60 $self->skip_whitespace($reader);
16            
17             # get version attribute
18 10 100       42 $self->VersionInfo($reader) ||
19             $self->parser_error("XML Declaration lacks required version attribute, or version attribute does not match XML specification", $reader);
20            
21 8 100       34 if (!$self->skip_whitespace($reader)) {
22 4         18 my $data = $reader->data(2);
23 4 50       26 $data =~ /^\?>/ or $self->parser_error("Syntax error", $reader);
24 4         17 $reader->move_along(2);
25 4         12 return;
26             }
27            
28 4 50       19 if ($self->EncodingDecl($reader)) {
29 4 50       26 if (!$self->skip_whitespace($reader)) {
30 4         16 my $data = $reader->data(2);
31 4 50       30 $data =~ /^\?>/ or $self->parser_error("Syntax error", $reader);
32 4         18 $reader->move_along(2);
33 4         14 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       106 if (!$reader->get_encoding) {
49 11         49 $reader->set_encoding("UTF-8");
50             }
51             }
52             }
53              
54             sub VersionInfo {
55 10     10 0 22 my ($self, $reader) = @_;
56            
57 10         39 my $data = $reader->data(11);
58            
59             # warn("Looking for version in $data");
60            
61 10 100       313 $data =~ /^(version$S*=$S*(["'])($VersionNum)\2)/o or return 0;
62 9         50 $reader->move_along(length($1));
63 9         28 my $vernum = $3;
64            
65 9 100       35 if ($vernum ne "1.0") {
66 1         7 $self->parser_error("Only XML version 1.0 supported. Saw: '$vernum'", $reader);
67             }
68              
69 8         30 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 8 my ($self, $reader) = @_;
93            
94 4         15 my $data = $reader->data(12);
95            
96 4 50       132 $data =~ /^(encoding$S*=$S*(["'])($EncNameStart$EncNameEnd*)\2)/o or return 0;
97 4         22 $reader->move_along(length($1));
98 4         8 my $encoding = $3;
99            
100 4         19 $reader->set_encoding($encoding);
101            
102 4         20 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;