Blame sgmls-1.1/sgmls.pl

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