—#!/usr/bin/perl -w
use
strict;
use
File::Basename;
use
Getopt::Long;
use
Pod::Usage;
use
Embedix::ECD;
sub
keep_comments {
my
$fh
=
shift
;
my
$string
=
shift
;
my
$opt
=
shift
;
my
$cons
= Embedix::ECD->consFromString(
$string
);
$fh
xml_from_cons (
$cons
,
shiftwidth
=>
$opt
->{shiftwidth},
indent
=>
$opt
->{indent},
);
}
sub
ignore_comments {
my
$fh
=
shift
;
my
$string
=
shift
;
my
$opt
=
shift
;
my
$ecd
= Embedix::ECD->newFromString(
$string
);
$fh
$ecd
->toXML(
shiftwidth
=>
$opt
->{shiftwidth},
indent
=>
$opt
->{indent},
dtd
=>
'yes'
,
);
}
my
%opt
;
GetOptions(\
%opt
,
'indent|i=i'
,
'shiftwidth|sw|s=i'
,
'help|h'
,
'keepcomments|k'
,
'autowrite|a'
,
);
if
(
defined
$opt
{help}) {
pod2usage(1);
}
$opt
{indent} ||= 0;
$opt
{shiftwidth} ||= 2;
if
(
@ARGV
) {
foreach
(
@ARGV
) {
my
(
$base
,
$path
) = fileparse(
$_
,
'\..*'
);
my
$xecd_name
=
$path
.
$base
.
".xecd"
;
if
( -f
$_
) {
open
(ECD,
$_
) ||
die
($!);
}
else
{
die
(
"$_ is not a file.\n"
);
}
if
(
defined
$opt
{autowrite}) {
open
(XECD,
"> $xecd_name"
) ||
die
($!);
}
else
{
*XECD
=
*STDOUT
;
}
my
$string
=
join
(
''
, <ECD>);
close
(ECD);
if
(
defined
$opt
{keepcomments}) {
keep_comments(
*XECD
,
$string
, \
%opt
);
}
else
{
ignore_comments(
*XECD
,
$string
, \
%opt
);
}
close
(XECD)
if
(
defined
$opt
{autowrite});
}
}
else
{
my
$string
=
join
(
''
, <STDIN>);
if
(
defined
$opt
{keepcomments}) {
keep_comments(
*STDOUT
,
$string
, \
%opt
);
}
else
{
ignore_comments(
*STDOUT
,
$string
, \
%opt
);
}
}
__END__
=head1 NAME
ecd2xml - converts text in ECD format to an XML equivalent
=head1 SYNOPSIS
=over 8
=item B<ecd2xml>
[OPTION]... [FILE]...
=item B<ecd2xml>
[OPTION]... < STDIN > STDOUT
=back
=head1 DESCRIPTION
ecd2xml is a script that takes ECD data (whether it be in a file or
a stream), and turns it into XML. The benefit of this is buzzword
compliance and faster parsing. James Clark's expat can parse
busybox.xecd 60 times faster than Embedix::ECD's Parse::RecDescent
parser can parse busybox.ecd. expat is probably more robust than
the parser I made, too.
=head1 OPTIONS
=over 4
=item -h
=item --help
This displays the help text.
=item -s n
=item -sw n
=item --shiftwidth n
This sets the number of spaces to indent for each new nesting level in the XML
document. The default value is 2.
=item -i n
=item --indent n
This sets the number of spaces to indent the whole XML document. The default
value is 2.
=item -a
=item --autowrite
Instead of printing the XML document to STDOUT, the document will be written
to a file of the same name as that being worked on w/ the exception that its
extension will be ".xecd" instead of ".ecd".
This option is meaningless when working with an ECD coming in from STDIN.
=item -k
=item --keepcomments
This will preserve the comments in the ECD by turning them into XML comments.
The downside of this is that although the generated XML will be well-formed,
it will not be valid according to the DTD.
=back
=head1 DIAGNOSTICS
=over 4
=item $line: was expecting $TAGNAME, but found $CRAP instead.
This error occurs whenever an imbalanced tag is found.
=item $line: $ATTRIBUTE not allowed in $NODE_TYPE
not implemented
=back
=head1 REQUIRES
=over 4
=item Embedix::ECD
=item Embedix::ECD::XMLv1
=item Pod::Usage
=item Getopt::Long
=back
=head1 SEE ALSO
=over 4
=item related perl modules
Embedix::ECD(3pm), Embedix::ECD::XMLv1(3pm)
=item some programs of interest
xmllint(1), checkecd(1)
=back
=head1 AUTHOR
John BEPPU <beppu@lineo.com>
=cut
# $Id: ecd2xml,v 1.1 2001/01/19 00:26:38 beppu Exp $