|
Packit |
9741aa |
#! /usr/bin/perl
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
# This is a skeleton of a perl script for processing the output of
|
|
Packit |
9741aa |
# sgmls. You must change the parts marked with "XXX".
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
# XXX This is for troff: in data, turn \ into \e (which prints as \).
|
|
Packit |
9741aa |
# Backslashes in SDATA entities are left as backslashes.
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
$backslash_in_data = "\\e";
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
$prog = $0;
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
$prog =~ s|.*/||;
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
$level = 0;
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
while (<STDIN>) {
|
|
Packit |
9741aa |
chop;
|
|
Packit |
9741aa |
$command = substr($_, 0, 1);
|
|
Packit |
9741aa |
substr($_, 0, 1) = "";
|
|
Packit |
9741aa |
if ($command eq '(') {
|
|
Packit |
9741aa |
&start_element($_);
|
|
Packit |
9741aa |
$level++;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq ')') {
|
|
Packit |
9741aa |
$level--;
|
|
Packit |
9741aa |
&end_element($_);
|
|
Packit |
9741aa |
foreach $key (keys %attribute_value) {
|
|
Packit |
9741aa |
@splitkey = split($;, $key);
|
|
Packit |
9741aa |
if ($splitkey[0] == $level) {
|
|
Packit |
9741aa |
delete $attribute_value{$key};
|
|
Packit |
9741aa |
delete $attribute_type{$key};
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq '-') {
|
|
Packit |
9741aa |
&unescape_data($_);
|
|
Packit |
9741aa |
&data($_);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq 'A') {
|
|
Packit |
9741aa |
@field = split(/ /, $_, 3);
|
|
Packit |
9741aa |
$attribute_type{$level,$field[0]} = $field[1];
|
|
Packit |
9741aa |
&unescape_data($field[2]);
|
|
Packit |
9741aa |
$attribute_value{$level,$field[0]} = $field[2];
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq '&') {
|
|
Packit |
9741aa |
&entity($_);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq 'D') {
|
|
Packit |
9741aa |
@field = split(/ /, $_, 4);
|
|
Packit |
9741aa |
$data_attribute_type{$field[0], $field[1]} = $field[2];
|
|
Packit |
9741aa |
&unescape_data($field[3]);
|
|
Packit |
9741aa |
$data_attribute_value{$field[0], $field[1]} = $field[3];
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq 'N') {
|
|
Packit |
9741aa |
$notation{$_} = 1;
|
|
Packit |
9741aa |
if (defined($sysid)) {
|
|
Packit |
9741aa |
$notation_sysid{$_} = $sysid;
|
|
Packit |
9741aa |
undef($sysid);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
if (defined($pubid)) {
|
|
Packit |
9741aa |
$notation_pubid{$_} = $pubid;
|
|
Packit |
9741aa |
undef($pubid);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq 'I') {
|
|
Packit |
9741aa |
@field = split(/ /, $_, 3);
|
|
Packit |
9741aa |
$entity_type{$field[0]} = $field[1];
|
|
Packit |
9741aa |
&unescape($field[2]);
|
|
Packit |
9741aa |
# You may want to substitute \e for \ if the type is CDATA.
|
|
Packit |
9741aa |
$entity_text{$field[0]} = $field[2];
|
|
Packit |
9741aa |
$entity_code{$field[0]} = 'I';
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq 'E') {
|
|
Packit |
9741aa |
@field = split(/ /, $_);
|
|
Packit |
9741aa |
$entity_code{$field[0]} = 'E';
|
|
Packit |
9741aa |
$entity_type{$field[0]} = $field[1];
|
|
Packit |
9741aa |
$entity_notation{$field[0]} = $field[2];
|
|
Packit |
9741aa |
if (defined(@files)) {
|
|
Packit |
9741aa |
foreach $i (0..$#files) {
|
|
Packit |
9741aa |
$entity_filename{$field[0], $i} = $files[i];
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
undef(@files);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
if (defined($sysid)) {
|
|
Packit |
9741aa |
$entity_sysid{$field[0]} = $sysid;
|
|
Packit |
9741aa |
undef($sysid);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
if (defined($pubid)) {
|
|
Packit |
9741aa |
$entity_pubid{$field[0]} = $pubid;
|
|
Packit |
9741aa |
undef($pubid);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq 'S') {
|
|
Packit |
9741aa |
$entity_code{$_} = 'S';
|
|
Packit |
9741aa |
if (defined(@files)) {
|
|
Packit |
9741aa |
foreach $i (0..$#files) {
|
|
Packit |
9741aa |
$entity_filename{$_, $i} = $files[i];
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
undef(@files);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
if (defined($sysid)) {
|
|
Packit |
9741aa |
$entity_sysid{$_} = $sysid;
|
|
Packit |
9741aa |
undef($sysid);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
if (defined($pubid)) {
|
|
Packit |
9741aa |
$entity_pubid{$_} = $pubid;
|
|
Packit |
9741aa |
undef($pubid);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq '?') {
|
|
Packit |
9741aa |
&unescape($_);
|
|
Packit |
9741aa |
&pi($_);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq 'L') {
|
|
Packit |
9741aa |
@field = split(/ /, $_);
|
|
Packit |
9741aa |
$lineno = $field[0];
|
|
Packit |
9741aa |
if ($#field >= 1) {
|
|
Packit |
9741aa |
&unescape($field[1]);
|
|
Packit |
9741aa |
$filename = $field[1];
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq 'V') {
|
|
Packit |
9741aa |
@field = split(/ /, $_, 2);
|
|
Packit |
9741aa |
&unescape($field[1]);
|
|
Packit |
9741aa |
$environment{$field[0]} = $field[1];
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq '{') {
|
|
Packit |
9741aa |
&start_subdoc($_);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq '}') {
|
|
Packit |
9741aa |
&end_subdoc($_);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq 'f') {
|
|
Packit |
9741aa |
&unescape($_);
|
|
Packit |
9741aa |
push(@files, $_);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq 'p') {
|
|
Packit |
9741aa |
&unescape($_);
|
|
Packit |
9741aa |
$pubid = $_;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq 's') {
|
|
Packit |
9741aa |
&unescape($_);
|
|
Packit |
9741aa |
$sysid = $_;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($command eq 'C') {
|
|
Packit |
9741aa |
$conforming = 1;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
else {
|
|
Packit |
9741aa |
warn "$prog:$ARGV:$.: unrecognized command \`$command'\n";
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
sub unescape {
|
|
Packit |
9741aa |
$_[0] =~ s/\\([0-7][0-7]?[0-7]?|.)/&esc($1)/eg;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
sub esc {
|
|
Packit |
9741aa |
local($_) = $_[0];
|
|
Packit |
9741aa |
if ($_ eq '012' || $_ eq '12') {
|
|
Packit |
9741aa |
""; # ignore RS
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif (/^[0-7]/) {
|
|
Packit |
9741aa |
sprintf("%c", oct);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($_ eq 'n') {
|
|
Packit |
9741aa |
"\n";
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($_ eq '|') {
|
|
Packit |
9741aa |
"";
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($_ eq "\\") {
|
|
Packit |
9741aa |
"\\";
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
else {
|
|
Packit |
9741aa |
$_;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
sub unescape_data {
|
|
Packit |
9741aa |
local($sdata) = 0;
|
|
Packit |
9741aa |
$_[0] =~ s/\\([0-7][0-7]?[0-7]?|.)/&esc_data($1)/eg;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
sub esc_data {
|
|
Packit |
9741aa |
local($_) = $_[0];
|
|
Packit |
9741aa |
if ($_ eq '012' || $_ eq '12') {
|
|
Packit |
9741aa |
""; # ignore RS
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif (/^[0-7]/) {
|
|
Packit |
9741aa |
sprintf("%c", oct);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($_ eq 'n') {
|
|
Packit |
9741aa |
"\n";
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($_ eq '|') {
|
|
Packit |
9741aa |
$sdata = !$sdata;
|
|
Packit |
9741aa |
"";
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
elsif ($_ eq "\\") {
|
|
Packit |
9741aa |
$sdata ? "\\" : $backslash_in_data;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
else {
|
|
Packit |
9741aa |
$_;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
sub start_element {
|
|
Packit |
9741aa |
local($gi) = $_[0];
|
|
Packit |
9741aa |
# XXX
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
sub end_element {
|
|
Packit |
9741aa |
local($gi) = $_[0];
|
|
Packit |
9741aa |
# XXX
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
sub data {
|
|
Packit |
9741aa |
local($data) = $_[0];
|
|
Packit |
9741aa |
# XXX
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
# A processing instruction.
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
sub pi {
|
|
Packit |
9741aa |
local($data) = $_[0];
|
|
Packit |
9741aa |
# XXX
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
# A reference to an external entity.
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
sub entity {
|
|
Packit |
9741aa |
local($name) = $_[0];
|
|
Packit |
9741aa |
# XXX
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
sub start_subdoc {
|
|
Packit |
9741aa |
local($name) = $_[0];
|
|
Packit |
9741aa |
# XXX
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
sub end_subdoc {
|
|
Packit |
9741aa |
local($name) = $_[0];
|
|
Packit |
9741aa |
# XXX
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|