eval
'use XML::Parser'
;
our
@ISA
=
qw(Mpp::Signature)
;
our
$xml
=
bless
\
@ISA
;
our
$space
;
sub
flatten {
my
$res
=
"\cA$_[0]"
;
for
my
$attr
(
sort
keys
%{
$_
[1][0]} ) {
$res
.=
"\cB$attr\cC$_[1][0]{$attr}"
;
}
for
(
my
$i
= 1;
$i
< @{
$_
[1]};
$i
+= 2 ) {
if
(
$_
[1][
$i
] ) {
$res
.= flatten(
$_
[1][
$i
],
$_
[1][
$i
+1] );
}
else
{
my
$str
=
$_
[1][
$i
+1];
if
(
$space
) {
$res
.=
"\cD$str"
;
}
else
{
$str
=~ s/\A\s+//;
$str
=~ s/\s+\Z//;
$str
=~ s/\s+/ /;
$res
.=
"\cD$str"
if
length
$str
;
}
}
}
"$res\cZ"
;
}
sub
signature {
my
$finfo
=
$_
[1];
local
$space
= 1
if
ref
(
$_
[0] ) =~ /xml_space/;
my
$key
=
$space
?
'XML_SPACE_MD5_SUM'
:
'XML_MD5_SUM'
;
my
$sum
= Mpp::File::build_info_string
$finfo
,
$key
;
unless
(
$sum
) {
my
$tree
=
eval
{ XML::Parser->new(
Style
=>
'Tree'
)->parsefile( Mpp::File::absolute_filename
$finfo
) };
if
( $@ ) {
$sum
= Mpp::Signature::md5::signature(
$Mpp::Signature::md5::md5
,
$finfo
);
}
else
{
$sum
= Digest::MD5::md5_base64 flatten
@$tree
;
Mpp::File::set_build_info_string
$finfo
,
$key
,
$sum
;
}
}
$sum
;
}
1;