#!/usr/bin/perl -w
# vi:set sts=2 sw=2 autoindent:
#
# asdb2tab - Translate the ASDB XML format into a tab-delimited file.
# Syntax:
#   asdb2tab
#
# needs package libxml-parser-perl
#

use XML::Parser;
use strict;

$::datum_name = undef;
$::datum = '';
%::fields = ();

my $p = new XML::Parser(
  Style => 'Subs',
  Pkg => 'ASDB::Parser',
  Handlers => { Char => \&ASDB::Parser::Char }
);
$p->parse(*STDIN);

##############################################################################
# ASDB::Parser - Handlers for various tags, and handler for character data.
#

sub ASDB::Parser::DATUM {
  shift; shift;
  while ($_ = uc(shift)) {
    $_ eq 'NAME' && do {
      $::datum_name = uc(shift);
      next;
    };
    shift;
  }
  $::datum = '';
}

sub ASDB::Parser::DATUM_ {
  $::record{uc($::datum_name)} = $::datum;
  $::datum_name = undef;
}

sub ASDB::Parser::FIELD {
  shift; shift;
  my %params;
  $params{uc($_)} = shift while ($_ = shift);
  $::fields{uc($params{'NAME'})} = \%params;
}

sub ASDB::Parser::LAYOUT_ {
  @::fields = sort {
    $::fields{$a}->{'OFFSET'} <=> $::fields{$b}->{'OFFSET'};
  } keys %::fields;
}

sub ASDB::Parser::Char {
  my ($expat,$data) = @_;
  $::datum .= $data if (defined($::datum_name));
}

sub ASDB::Parser::RECORD_ {
  my $fieldn;
  my @values;
  for $fieldn (0 .. $#::fields) {
    print $::record{$::fields[$fieldn]}
      if defined ($::record{$::fields[$fieldn]});
    print "\t" if $fieldn != $#::fields;
  }
  print "\n";
  undef %::record;
}
