Ham-ADIF
view release on metacpan or search on metacpan
lib/Ham/ADIF/ADI.pm view on Meta::CPAN
# -*- mode: cperl; tab-width: 8; indent-tabs-mode: nil; basic-offset: 2 -*-
# vim:ts=8:sw=2:et:sta:sts=2
#########
# Author: rmp
#
package Ham::ADIF::ADI;
use strict;
use warnings;
use XML::LibXML;
use Carp;
use base qw(Ham::ADIF);
use IO::File;
use English qw(-no_match_vars);
our $VERSION = q[2018.03.31];
sub parse_file {
my ($self, $filename) = @_;
my $io = IO::File->new($filename, q[r]);
#########
# thank goodness ADI is case-insensitive and we're spared using sensible things like record separators
#
my $header = q[];
my $read_header = 1;
my $rec = q[];
my $recs = [];
while(my $line = <$io>) {
if($line =~ m{<EOR>}smx) {
#########
# JA1NLX - ADI with no header
#
$read_header = 0;
}
if($read_header) {
$header .= $line;
} else {
$rec .= $line;
}
if($line =~ m{<EOH>}smix) {
$self->_process_header($header);
$read_header = 0;
} elsif($line =~ m{<EOR>}smix) {
push @{$recs}, $self->_process_record($rec);
$rec = q[];
}
}
return $recs;
}
sub _process_record {
my ($self, $rec) = @_;
my $struct = {};
for my $tag (split m{[\r\n<]+}smx, $rec) {
if(!$tag) {
next;
}
my ($tagname, $length, $type, $value) = $tag =~ m{(.*?):(\d+)(:D)?>(.*?)\s*$}smix;
if(!$tagname) {
next;
}
$struct->{lc $tagname} = $value;
}
return $struct;
}
sub _process_header {
my ($self, $header) = @_;
my $struct = {};
for my $tag (split m{[\r\n]+}smx, $header) {
if(!$tag) {
next;
}
my ($tagname, $length, $datatype, $value, $enum) = $tag =~ m{<(.*?):(\d+)(?::(.*?))?>(.*?)(?:,[{](.*?)[}])?$}smix;
if(!$tagname) {
next;
}
$struct->{lc $tagname} = $value;
}
return $struct;
}
1;
__END__
=head1 NAME
Ham::ADIF::ADI
=head1 VERSION
$LastChangedRevision: 344 $
=head1 SYNOPSIS
=head1 DESCRIPTION
=head1 SUBROUTINES/METHODS
=head2 parse_file
=head1 DIAGNOSTICS
=head1 CONFIGURATION AND ENVIRONMENT
=head1 DEPENDENCIES
=over
=item strict
=item warnings
=item XML::LibXML
=item Carp
=item base
=item Ham::ADIF
=item IO::File
=item English
=back
( run in 1.702 second using v1.01-cache-2.11-cpan-71847e10f99 )