#! /usr/bin/perl

use strict;
use XML::DOM;

if (!@ARGV) {
    die "usage: $0 data.xml\n";
}

my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile (shift);

# print all HREF attributes of all CODEBASE elements
my $pages = $doc->getElementsByTagName ("page");
my $n = $pages->getLength;

for (my $pindex = 0; $pindex < $n; $pindex++) {
    my $node = $pages->item ($pindex);

    my %N = ();

    my $output = $node->getAttribute ("output");
    my $start = &to_num($node->getAttribute ("start"));
    my $end = &to_num($node->getAttribute ("end"));

    $N{$start} = 's';
    $N{$end+1} = 'e';

    my $excepts = $node->getElementsByTagName ("except");
    my $m = $excepts->getLength;
    for (my $j = 0; $j < $m; $j++) {
	my $ex = $excepts->item($j);
	my $s = &to_num($ex->getAttribute("start"));
	my $e = &to_num($ex->getAttribute("end"));
	$N{$s} = 'e';
	$N{$e+1} = 's';
    }

    my $s = int($start / 16) * 16;
    my $e = int($end / 16) * 16 + 16;

    my $state = 0; # off
    open (FH, ">$output.html") or die "$output: $!\n";
    print FH <<'HEAD';
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
  <LINK REV=MADE HREF="mailto:AE5T-KSN@asahi-net.or.jp">
  <META HTTP-EQUIV=CONTENT-TYPE CONTENT="text/html; charset=UTF-8">
  <TITLE>CharTable</TITLE>
</HEAD>
<BODY>
<TABLE BORDER="1">
HEAD

    my $str1 = '';
    my $str2 = '';
    for (my $i = $s; $i < $e; $i++) {
	if (($i % 16) == 0) {
	    $str1 = $str2 = '<TR>';
	}
	if (defined($N{$i})) {
	    if ($N{$i} eq 's') {
		$state = 1;
	    } elsif ($N{$i} eq 'e') {
		$state = 0;
	    }
	}
	if ($state) {
	    $str1 .= sprintf("<TH>&amp;#%d;</TH>", $i);
	    $str2 .= sprintf("<TD ALIGN=\"center\">&#%d;</TD>", $i);
	} else {
	    $str1 .= "<TH></TH>";
	    $str2 .= "<TH></TH>";
	}
	if (($i % 16) == 15) {
	    $str1 .= "</TR>\n";
	    $str2 .= "</TR>\n";
	    print FH $str1;
	    print FH $str2;
	}
    }
    print FH <<'FOOT';
</TABLE>
</BODY>
</HTML>
FOOT
    close (FH);
}

sub to_num {
    my $s = shift;

    if ($s =~ /^0x(.+)$/) {
	return hex($1);
    }
    return $s;
}

# end of script
