diff --git a/adif-pota2sig.pl b/adif-pota2sig.pl index c27baae..641ecdb 100755 --- a/adif-pota2sig.pl +++ b/adif-pota2sig.pl @@ -8,58 +8,198 @@ # modified from perlmonks - TedPride - http://www.perlmonks.org/?node_id=559222 # modified from https://scruss.com/blog/2011/05/23/parsing-adif-with-perl/ # -# Description: -# Parse adif file, if a contact has one or more POTA_REF entries (delimited by -# a comma), add SIG POTA and SIG_INFO with reference. Multiply contact such, -# that every POTA_REF entry is a separate contact with own SIG_INFO. -# Extendet adif file will be printed to stdout. -# -# Usage: -# adif-pota2sig.pl logfile.adi > new-logfile.adi +# Description and Usage: +# adif-pota2sig.pl -h + +=pod + +=head1 NAME + +adif-pota2sig - Process adif file for POTA uploads + +=head1 SYNOPSIS + +adif-pota2sig.pl -i in.adi -o out.adi + +adif-pota2sig.pl < in.adi > out.adi + +adif-pota2sig.pl -r K-TEST -t out_REF.adi -i in.adi + +adif-pota2sig.pl -r K-TEST -t out_REF.adi < in.adi + +adif-pota2sig.pl -h + +=cut use strict; use warnings; -# use filename.adi as parameter -open(my $FH, '<', $ARGV[0]) or die "$ARGV[0]: $!"; +use Getopt::Long qw(:config gnu_compat); +use Pod::Usage; -while (<$FH>) { - print; - # fast forward past header - last if m/\s+$/i; +my $input_file = ""; +my $output_file = ""; +my $my_ref = ""; +my $output_template = ""; +my $force_output = 0; + +GetOptions ( + "i|input=s" => \$input_file, + "o|output=s" => \$output_file, + "r|reference=s" => \$my_ref, + "f|force" => \$force_output, + "t|template=s" => \$output_template, + "h|help" => sub {pod2usage(-verbose => 2)} +) or die("Error in command line arguments\n"); + +=pod + +=head1 OPTIONS + +=over + +=item B<-h|--help> + +Print a brief help message and exits. + +=item B<-i F|--input=F> + +Use F as input (default: - for stdin). + +=item B<-o F|--output=F> + +Use F as output (default: - for stdout). + +=item B<-r MY_POTA_REF|--reference=MY_POTA_REF> + +Use MY_POTA_REF as own POTA reference. If there are more than one (for a +n-fer) create a list with commas, e. g. S K-TEST1,K-TEST2,K-TEST3> + +B<-t> is mandatory for this option. + +=item B<-t F|--template=F> + +Use out_REF.adi as output filename template for multiple references. REF will +be replaced by a POTA reference. Multiple filenames will be created. + +B<-o> is not allowed for this option. + +B<-r> is mandatory for this option. + +=item B<-f|--force> + +By default filenames selected with B<-o> and B<-t> won't be overwritten and the +program will stop. Using B<-f> will overwrite output files. + +=back + +=cut + +if (($my_ref ne "") && ($output_template eq "")) { + die "-t is mandatory for -r"; } -my @entry = (); -my @pota_refs = (); -while (<$FH>) { - push @entry, $_; - if (m/\s+$/i) { - # entry complete - if (scalar(@pota_refs) > 0) { - # add sig_info to each pota reference - foreach my $ref (@pota_refs) { - # print all except last - print @entry[0 .. $#entry - 1]; - # insert POTA SIG - print "POTA\n"; - print "" . $ref . "\n"; - # print last - print $entry[-1]; - } - } else { - # no park reference in this entry - print @entry; - } - # clear entry and pota refs for next entry - @entry = (); - @pota_refs = (); - } elsif (m/^ - my $val = (split(/>/))[-1]; - chomp($val); - # fill pota_refs with references - @pota_refs = split(/,/, $val); - chomp @pota_refs; +if (($output_template ne "") && ($my_ref eq "")) { + die "-r is mandatory for -t"; +} + +if (($output_template ne "") && ($output_file ne "")) { + die "-o is not allowed with -t"; +} + +if (($output_template ne "") && ($output_template !~ /REF/)) { + die "-t needs REF in output filename template"; +} + +my $FH_IN; +if (($input_file eq "-") || ($input_file eq "")) { + $FH_IN = "STDIN"; +} else { + open($FH_IN, '<', $input_file) or die "$input_file: $!"; +} + +my @output_filenames; + +if ($my_ref ne "") { + foreach (split(/,/, $my_ref)) { + push(@output_filenames, $output_template =~ s/REF/$_/r); } +} else { + push(@output_filenames, $output_file); } -close($FH); + +foreach my $output_filename (@output_filenames) { + seek $FH_IN, 0, 0; + + my $FH_OUT; + + if (($output_filename eq "-") || ($output_filename eq "")) { + $FH_OUT = "STDOUT"; + } else { + if ((-e $output_filename) && (! $force_output)) { + die "File $output_filename exists. Use --force to overwrite"; + } else { + open($FH_OUT, '>', $output_filename) or die "$output_filename: $!"; + } + } + + # select filehandle for print + select($FH_OUT); + + while (<$FH_IN>) { + print; + # fast forward past header + last if m/\s+$/i; + } + + my @entry = (); + my @pota_refs = (); + while (<$FH_IN>) { + push @entry, $_; + if (m/\s+$/i) { + # entry complete + if (scalar(@pota_refs) > 0) { + # add sig_info to each pota reference + foreach my $ref (@pota_refs) { + # print all except last + print @entry[0 .. $#entry - 1]; + # insert POTA SIG + print "POTA\n"; + print "" . $ref . "\n"; + # print last + print $entry[-1]; + } + } else { + # no park reference in this entry + print @entry; + } + # clear entry and pota refs for next entry + @entry = (); + @pota_refs = (); + } elsif (m/^ + my $val = (split(/>/))[-1]; + chomp($val); + # fill pota_refs with references + @pota_refs = split(/,/, $val); + chomp @pota_refs; + } + } + close($FH_OUT); +} +close($FH_IN); + +__END__ + +=head1 DESCRIPTION + +B will read an adif file, if a contact has one or more POTA_REF +entries (delimited by a comma), add SIG POTA and SIG_INFO with reference. +Multiply contact such, that every POTA_REF entry is a separate contact with own +SIG_INFO. Extendet adif file will be printed to stdout or a file. + +If used with B<-r> and B<-t> options a number of files with contents described +above will be created. On file for each POTA reference. For output filenames +see B<-t>. + +=cut