-#!/usr/bin/perl
+#!/usr/bin/env perl
# a program to create a prefix file from a wpxloc.raw file
#
# Copyright (c) - Dirk Koopman G1TLH
#
-# $Id$
+#
#
require 5.004;
# root of directory tree for this system
$root = "/spider";
$root = $ENV{'DXSPIDER_ROOT'} if $ENV{'DXSPIDER_ROOT'};
-
+
+ mkdir "$root/local_data", 02777 unless -d "$root/local_data";
+
unshift @INC, "$root/perl"; # this IS the right way round!
unshift @INC, "$root/local";
}
use DXVars;
+use SysVar;
+
use Data::Dumper;
+use DXUtil;
+
use strict;
my %loc = (); # the location unique hash
my %pre = (); # the prefix hash
my %pren = (); # the inverse
-# open the input file
-my $ifn = $ARGV[0] if $ARGV[0];
-$ifn = "$main::data/wpxloc.raw" if !$ifn;
-open (IN, $ifn) or die "can't open $ifn ($!)";
+my $prefix;
+my $system;
+
+if (@ARGV && $ARGV[0] =~ /^--system$/) {
+ $prefix = $main::data;
+ ++$system;
+ shift;
+} else {
+ $prefix = $main::local_data;
+}
+
+my $ifn;
+
+$ifn = $system ? "$main::data/wpxloc.raw" : "$prefix/wpxloc.raw";
+unless (open (IN, $ifn)) {
+ $ifn = "$main::data/wpxloc.raw";
+ open(IN, $ifn) or die "can't open $ifn ($!)";
+}
# first pass, find all the 'master' location records
while (<IN>) {
#print Data::Dumper->Dump([\%pre, \%locn], [qw(pre locn)]);
-# now open the rsgb.cty file and process that again the prefix file we have
-open(IN, "$main::data/rsgb.cty") or die "Can't open $main::data/rsgb.cty ($!)";
+# now open the cty.dat file if it is there
+my $r;
+$ifn = $system ? "$main::data/cty.dat" : "$prefix/cty.dat";
+unless ($r = open (IN, $ifn)) {
+ $ifn = "$main::data/cty.dat";
+ $r = open(IN, $ifn);
+}
+
+my @f;
+my @a;
$line = 0;
-while (<IN>) {
- $line++;
- next if /^\s*#/;
- next if /^\s*$/;
- my $l = $_;
- chomp;
- my @f = split /:\s+|;/;
- my $p = uc $f[4];
- my $ref = $pre{$p};
- if ($ref) {
- # split up the alias string
- my @alias = split /=/, $f[5];
- my $a;
- foreach $a (@alias) {
- next if $a eq $p; # ignore if we have it already
- my $nref = $pre{$a};
- $pre{$a} = $ref if !$nref; # copy the original ref if new
+if ($r) {
+ my $state = 0;
+ while (<IN>) {
+ $line++;
+ s/\r$//;
+ next if /^\s*\#/;
+ next if /^\s*$/;
+ chomp;
+ if ($state == 0) {
+ s/:$//;
+ @f = split /:\s+/;
+ @a = ();
+ $state = 1;
+ } elsif ($state == 1) {
+ s/^\s+//;
+ if (/;$/) {
+ $state = 0;
+ s/[,;]$//;
+ push @a, split /\s*,/;
+ $f[7] =~ s/^\*\s*//; # remove any preceeding '*' before a callsign
+ ct($_, uc $f[7], @a) if @a;
+ } else {
+ s/,$//;
+ push @a, split /\s*,/;
+ }
}
- } else {
- print "line $line: unknown prefix '$p' on $l in rsgb.cty\n";
}
}
+close IN;
-open(OUT, ">$main::data/prefix_data.pl") or die "Can't open $main::data/prefix_data.pl ($!)";
+
+open(OUT, ">$prefix/prefix_data.pl") or die "Can't open $prefix/prefix_data.pl ($!)";
print OUT "\%pre = (\n";
foreach my $k (sort keys %pre) {
return $out;
}
+sub ct
+{
+ my $l = shift;
+ my $p = shift;
+ my @a = @_;
+ my $ref = $pre{$p};
+ if ($ref) {
+ my $a;
+ foreach $a (@a) {
+ # for now remove (nn) [nn]
+ my ($itu) = $a =~ /(\(\d+\))/; $a =~ s/(\(\d+\))//g;
+ my ($cq) = $a =~ /(\[\d+\])/; $a =~ s/(\[\d+\])//g;
+ my ($lat, $long) = $a =~ m{(<[-+\d.]+/[-+\d.]+>)}; $a =~ s{(<[-+\d.]+/[-+\d.]+>)}{}g;
+ my ($cont) = $a =~ /(\{[A-Z]{2}\})/; $a =~ s/(\{[A-Z]{2}\})//g;
+
+ unless ($a) {
+ print "line $line: blank prefix on $l in cty.dat\n";
+ next;
+ }
+ next if $a eq $p; # ignore if we have it already
+ my $nref = $pre{$a};
+ $pre{$a} = $ref if !$nref; # copy the original ref if new
+ }
+ } else {
+ print "line $line: unknown prefix '$p' on $l in cty.dat\n";
+ }
+}
+
sub addloc
{
my $locstr = shift;
$locn{$loc} = $locstr;
return $loc;
}
+