#!/usr/bin/perl
use strict;
use XML::DOM;

open F, "< thelot3" or die "Can't open: $1";

sub getLine
{
	$_ = <F> || return 0;
	
	# strip stamps
    s/[ \t]*[0-9\.]+[mu]S:[ \t]+(.+)/$1/;
    
    # skip unwanted lines
    next if not /^70.+$/;
    next if /-nak-/;
	next if /^70 W 00/;
	next if /^70 r A0/;
	next if /^70 r 80/;
	
	return 1;
}

sub getChildNode
{
	my ($node, $name) = @_;
	foreach my $child($node->getChildNodes)
	{
     	next unless $child->getNodeType == ELEMENT_NODE; # ignore whitespace
     	if ($name eq $child->getNodeName) {
     		return $child;
     	}
     }
     die "Node $name not found";
}

sub getNextNode
{
	my ($node) = @_;
	while (1)
	{
		$node = $node->getNextSibling;
		return undef if (!defined($node));
		next unless $node->getNodeType == ELEMENT_NODE; # ignore whitesapce
		return $node;
	}
}

sub getNextKey
{
	my ($node) = @_;

	my $nextKey = getNextNode($node);
	while (!defined($nextKey))
	{
		my $codeset = getNextNode($node->getParentNode);
		return undef if (!defined($codeset));
		$nextKey = getChildNode($codeset, "key");
	}
	return $nextKey;
}

sub setData
{
	my ($node, $data) = @_;
	
	my $dataNode = getChildNode($node, "data");
	if (defined($dataNode->getFirstChild)) {
		$dataNode->removeChild($dataNode->getFirstChild);
	}
	$dataNode->addText($data);
}
		

# Parse XML file & get first codeset node
my $file = 'IRcodesets.xml';
my $parser = XML::DOM::Parser->new();
my $doc = $parser->parsefile($file);
my $keyNode = getChildNode(getChildNode(getChildNode($doc->getDocumentElement, "codesets"), "codeset"), "key");

my $j = 0;
while (1)
{
	# this should be a 63 byte block start, parse it
	my $i = 1;
	my $block = "";
	while ($i < 0x64)
	{
		if (!getLine) {
			die "Incomplete data block" if ($i != 1);
			$doc->printToFile($file);
			print "$j records procesed successfully\n";
			exit 0;
		}
		
		s/70 W ([[:xdigit:]][[:xdigit:]] [[:xdigit:]][[:xdigit:]] [[:xdigit:]][[:xdigit:]] [[:xdigit:]][[:xdigit:]]( [[:xdigit:]][[:xdigit:]])?).*/$1/;
		my @bytes = split(/ /, $_);
		
		# sanity
		die "Byte index mismatch" if (hex($bytes[0]) != $i);
		die "Byte count mismatch" if (@bytes != 4 && @bytes != 5);
		
		$block .= $bytes[1].$bytes[2].$bytes[3];
		$block .= $bytes[4] if @bytes == 5;
		$block =~ s/\s+$//;
		
		$i += @bytes - 1;
	}
	die "Too much data in the log" if (!defined($keyNode));
	setData($keyNode, $block);
	$keyNode = getNextKey($keyNode);
	$j++;
}
