no
warnings
'recursion'
;
use
vars
qw(@error_domains $VERSION $WARNINGS)
;
'""'
=> \
&as_string
,
'eq'
=>
sub
{
(
"$_[0]"
eq
"$_[1]"
)
},
'cmp'
=>
sub
{
(
"$_[0]"
cmp
"$_[1]"
)
},
fallback
=> 1;
$WARNINGS
= 0;
$VERSION
=
"2.0210"
;
use
constant
XML_ERR_FROM_NAMESPACE
=> 3;
use
constant
XML_ERR_FROM_XINCLUDE
=> 11;
use
constant
XML_ERR_FROM_XPOINTER
=> 13;
use
constant
XML_ERR_FROM_DATATYPE
=> 15;
use
constant
XML_ERR_FROM_SCHEMASP
=> 16;
use
constant
XML_ERR_FROM_SCHEMASV
=> 17;
use
constant
XML_ERR_FROM_RELAXNGP
=> 18;
use
constant
XML_ERR_FROM_RELAXNGV
=> 19;
use
constant
XML_ERR_FROM_CATALOG
=> 20;
use
constant
XML_ERR_FROM_SCHEMATRONV
=> 28;
@error_domains
= (
""
,
"parser"
,
"tree"
,
"namespace"
,
"validity"
,
"HTML parser"
,
"memory"
,
"output"
,
"I/O"
,
"ftp"
,
"http"
,
"XInclude"
,
"XPath"
,
"xpointer"
,
"regexp"
,
"Schemas datatype"
,
"Schemas parser"
,
"Schemas validity"
,
"Relax-NG parser"
,
"Relax-NG validity"
,
"Catalog"
,
"C14N"
,
"XSLT"
,
"validity"
,
"error-checking"
,
"xmlwriter"
,
"dynamic loading"
,
"i18n"
,
"Schematron validity"
);
my
$MAX_ERROR_PREV_DEPTH
= 100;
for
my
$field
(
qw<code _prev level file line nodename message column context
str1 str2 str3 num1 num2 __prev_depth>
) {
my
$method
=
sub
{
$_
[0]{
$field
} };
no
strict
'refs'
;
*$field
=
$method
;
}
{
sub
new {
my
(
$class
,
$xE
) =
@_
;
my
$terr
;
if
(
ref
(
$xE
)) {
my
(
$context
,
$column
) =
$xE
->context_and_column();
$terr
=
bless
{
domain
=>
$xE
->domain(),
level
=>
$xE
->level(),
code
=>
$xE
->code(),
message
=>
$xE
->message(),
file
=>
$xE
->file(),
line
=>
$xE
->line(),
str1
=>
$xE
->str1(),
str2
=>
$xE
->str2(),
str3
=>
$xE
->str3(),
num1
=>
$xE
->num1(),
num2
=>
$xE
->num2(),
__prev_depth
=> 0,
(
defined
(
$context
) ?
(
context
=>
$context
,
column
=>
$column
,
) : ()),
},
$class
;
}
else
{
$terr
=
bless
{
domain
=> 0,
level
=> 2,
code
=> -1,
message
=>
$xE
,
file
=>
undef
,
line
=>
undef
,
str1
=>
undef
,
str2
=>
undef
,
str3
=>
undef
,
num1
=>
undef
,
num2
=>
undef
,
__prev_depth
=> 0,
},
$class
;
}
return
$terr
;
}
sub
_callback_error {
my
(
$xE
,
$prev
) =
@_
;
my
$terr
;
$terr
=XML::LibXML::Error->new(
$xE
);
if
(
$terr
->{level} == XML_ERR_WARNING and
$WARNINGS
!=2) {
warn
$terr
if
$WARNINGS
;
return
$prev
;
}
if
(
ref
(
$prev
))
{
if
(
$prev
->__prev_depth() >=
$MAX_ERROR_PREV_DEPTH
)
{
return
$prev
;
}
$terr
->{_prev} =
$prev
;
$terr
->{__prev_depth} =
$prev
->__prev_depth() + 1;
}
else
{
$terr
->{_prev} =
defined
(
$prev
) &&
length
(
$prev
) ? XML::LibXML::Error->new(
$prev
) :
undef
;
}
return
$terr
;
}
sub
_instant_error_callback {
my
$xE
=
shift
;
my
$terr
= XML::LibXML::Error->new(
$xE
);
print
"Reporting an instanteous error "
,
$terr
->
dump
;
die
$terr
;
}
sub
_report_warning {
my
(
$saved_error
) =
@_
;
if
(
defined
$saved_error
) {
warn
$saved_error
;
}
}
sub
_report_error {
my
(
$saved_error
) =
@_
;
if
(
defined
$saved_error
) {
die
$saved_error
;
}
}
}
sub
int1 {
$_
[0]->num1 }
sub
int2 {
$_
[0]->num2 }
sub
domain {
my
(
$self
)=
@_
;
return
undef
unless
ref
(
$self
);
my
$domain
=
$self
->{domain};
return
$domain
<
@error_domains
?
$error_domains
[
$domain
] :
"domain_$domain"
;
}
sub
as_string {
my
(
$self
)=
@_
;
my
$msg
=
""
;
my
$level
;
if
(
defined
(
$self
->{_prev})) {
$msg
=
$self
->{_prev}->as_string;
}
if
(
$self
->{level} == XML_ERR_NONE) {
$level
=
""
;
}
elsif
(
$self
->{level} == XML_ERR_WARNING) {
$level
=
"warning"
;
}
elsif
(
$self
->{level} == XML_ERR_ERROR ||
$self
->{level} == XML_ERR_FATAL) {
$level
=
"error"
;
}
my
$where
=
""
;
if
(
defined
(
$self
->{file})) {
$where
=
"$self->{file}:$self->{line}"
;
}
elsif
((
$self
->{domain} == XML_ERR_FROM_PARSER)
and
$self
->{line}) {
$where
=
"Entity: line $self->{line}"
;
}
if
(
$self
->{nodename}) {
$where
.=
": element "
.
$self
->{nodename};
}
$msg
.=
$where
.
": "
if
$where
ne
""
;
$msg
.=
$self
->domain.
" "
.
$level
.
" :"
;
my
$str
=
$self
->{message}||
""
;
chomp
(
$str
);
$msg
.=
" "
.
$str
.
"\n"
;
if
((
$self
->{domain} == XML_ERR_FROM_XPATH) and
defined
(
$self
->{str1})) {
$msg
.=
$self
->{str1}.
"\n"
;
$msg
.=(
" "
x
$self
->{num1}).
"^\n"
;
}
elsif
(
defined
$self
->{context}) {
no
warnings
'utf8'
;
my
$context
= Encode::encode(
'UTF-8'
,
$self
->{context});
$msg
.=
$context
.
"\n"
;
$context
=
substr
(
$context
,0,
$self
->{column});
$context
=~s/[^\t]/ /g;
$msg
.=
$context
.
"^\n"
;
}
return
$msg
;
}
sub
dump
{
my
(
$self
)=
@_
;
return
Data::Dumper->new([
$self
],[
'error'
])->Dump;
}
1;