add CTY-2615 prefixes
[spider.git] / perl / create_prefix.pl
index a06aba1b3b9d23fe41b8395333446b3a77be381d..411b2cb84113b96d573f6c8b832b39215e5c9f45 100755 (executable)
@@ -3,34 +3,49 @@
 #
 # Copyright (c) - Dirk Koopman G1TLH
 #
-# $Id$
 #
+#
+
+require 5.004;
+
+# search local then perl directories
+BEGIN {
+       # root of directory tree for this system
+       $root = "/spider"; 
+       $root = $ENV{'DXSPIDER_ROOT'} if $ENV{'DXSPIDER_ROOT'};
+       
+       unshift @INC, "$root/perl";     # this IS the right way round!
+       unshift @INC, "$root/local";
+       $data = "$root/data";
+}
 
 use DXVars;
+use Data::Dumper;
+use strict;
 
-%loc = ();        # the location unique hash
-$nextloc = 1;     # the next location number
-%locn = ();       # the inverse of the above
-%pre = ();        # the prefix hash
-%pren = ();       # the inverse
+my %loc = ();                                          # the location unique hash
+my $nextloc = 1;                                       # the next location number
+my %locn = ();                                         # the inverse of the above
+my %pre = ();                                          # the prefix hash
+my %pren = ();                                         # the inverse
 
 # open the input file
-$ifn = $ARGV[0] if $ARGV[0];
-$ifn = "$data/wpxloc.raw" if !$fn;
+my $ifn = $ARGV[0] if $ARGV[0];
+$ifn = "$main::data/wpxloc.raw" if !$ifn;
 open (IN, $ifn) or die "can't open $ifn ($!)";
 
-# first pass, find all the 'master' records
+# first pass, find all the 'master' location records
 while (<IN>) {
-  next if /^\!/;    # ignore comment lines
-  chomp;
-  @f  = split;       # get each 'word'
-  next if @f == 0;   # ignore blank lines
-
-  if ($f[14] eq '@' || $f[15] eq '@') {
-    $locstr = join ' ', @f[1..13];
-    $loc = $loc{$locstr};
-    $loc = addloc($locstr) if !$loc;
-  }
+       next if /^\!/;                          # ignore comment lines
+       chomp;
+       my @f  = split;                         # get each 'word'
+       next if @f == 0;                        # ignore blank lines
+
+       if (($f[14] && $f[14] eq '@') || ($f[15] && $f[15] eq '@')) {
+               my $locstr = join ' ', @f[1..13];
+               my $loc = $loc{$locstr};
+               $loc = addloc($locstr) if !$loc;
+       }
 }
 
 #foreach $loc (sort {$a <=> $b;} keys %locn) {
@@ -40,111 +55,164 @@ while (<IN>) {
 # go back to the beginning and this time add prefixes (adding new location entries, if required)
 seek(IN, 0, 0);
 
+my $line;
 while (<IN>) {
-  next if /^\!/;    # ignore comment lines
-  chomp;
-  @f  = split;       # get each 'word'
-  next if @f == 0;   # ignore blank lines
+       $line++;
+       chomp;
+       next if /^\s*\!/;                               # ignore comment lines
+       next if /^\s*$/;
+       
+       my @f  = split;                         # get each 'word'
+       next if @f == 0;                        # ignore blank lines
   
-  $locstr = join ' ', @f[1..13];
-  $loc = $loc{$locstr};
-  $loc = addloc($locstr) if !$loc;
+       # location record
+       my $locstr = join ' ', @f[1..13];
+       my $loc = $loc{$locstr};
+       $loc = addloc($locstr) if !$loc;
   
-  @prefixes = split /,/, $f[0];
-  foreach $p (@prefixes) {
-    my $ref;
+       my @prefixes = split /,/, $f[0];
+       foreach my $p (@prefixes) {
+               my $ref;
        
-       if ($p =~ /#/) {
-         my $i;
-         for ($i = 0; $i < 9; ++$i) {
-           my $t = $p;
-               $t =~ s/#/$i/;
-        $ref = $pre{$t};
-           $ref = addpre($t) if !$ref;
-               next if grep $loc, @{$ref};    # no dups!
-        push @{$ref}, $loc;
-         }
-       } else {
-      $ref = $pre{$p};
-         $ref = addpre($p) if !$ref;
-         next if grep $loc, @{$ref};    # no dups!
-      push @{$ref}, $loc;
-    }  
-  }
+               if ($p =~ /#/) {
+                       my $i;
+                       for ($i = 0; $i < 9; ++$i) {
+                               my $t = $p;
+                               $t =~ s/#/$i/;
+                               addpre($t, $loc);
+                       }
+               } else {
+                       addpre($p, $loc);
+               }       
+       }
 }
 
 close(IN);
 
-# now open the rsgb.cty file and process that again the prefix file we have
-open(IN, "$data/rsgb.cty") or die "Can't open $data/rsgb.cty ($!)";
-while (<IN>) {
-  chomp;
-  @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 
+#print Data::Dumper->Dump([\%pre, \%locn], [qw(pre locn)]);
+
+# now open the cty.dat file if it is there
+my @f;
+my @a;
+$line = 0;
+if (open(IN, "$main::data/cty.dat")) {
+       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 "unknown prefix $p\n";
-  }
 }
+close IN;
 
-open(OUT, ">$data/prefix_data.pl") or die "Can't open $data/prefix_data.pl ($!)";
 
-print OUT "%prefix_loc = (\n";
-foreach $l (sort {$a <=> $b} keys %locn) {
-  print OUT "   $l => {";
-  my ($name, $dxcc, $itu, $cq, $utcoff, $latd, $latm, $lats, $latl, $longd, $longm, $longs, $longl) = split /\s+/, $locn{$l};
-  
-  $longd += ($longm/60);
-  $longd = 0-$longd if (uc $longl) eq 'W'; 
-  $latd += ($latm/60);
-  $latd = 0-$latd if (uc $latl) eq 'S';
-  print OUT " name => '$name',";
-  print OUT " dxcc => $dxcc,";
-  print OUT " itu => $itu,";
-  print OUT " utcoff => $utcoff,";
-  print OUT " lat => $latd,";
-  print OUT " long => $longd";
-  print OUT " },\n";
+open(OUT, ">$main::data/prefix_data.pl") or die "Can't open $main::data/prefix_data.pl ($!)";
+
+print OUT "\%pre = (\n";
+foreach my $k (sort keys %pre) {
+       my $ans = printpre($k);
+       print OUT "  '$k' => '$ans',\n";
 }
 print OUT ");\n\n";
 
-print OUT "%prefix = (\n";
-foreach $k (sort keys %pre) {
-  print OUT "   '$k' => [";
-  my @list = @{$pre{$k}};
-  my $l;
-  my $str;
-  foreach $l (@list) {
-    $str .= " $l,";
-  }
-  chop $str;  
-  print OUT "$str ],\n";
+print OUT "\n\%prefix_loc = (\n";
+foreach my $l (sort {$a <=> $b} keys %locn) {
+       print OUT "   $l => bless( {";
+       my ($name, $dxcc, $itu, $cq, $utcoff, $latd, $latm, $lats, $latl, $longd, $longm, $longs, $longl) = split /\s+/, $locn{$l};
+  
+       $longd += ($longm/60);
+       $longd = 0-$longd if (uc $longl) eq 'W'; 
+       $latd += ($latm/60);
+       $latd = 0-$latd if (uc $latl) eq 'S';
+       print OUT " name => '$name',";
+       print OUT " dxcc => $dxcc,";
+       print OUT " itu => $itu,";
+       print OUT " cq => $cq,";
+       print OUT " utcoff => $utcoff,";
+       print OUT " lat => $latd,";
+       print OUT " long => $longd";
+       print OUT " }, 'Prefix'),\n";
 }
-print OUT ");\n";
+print OUT ");\n\n";
 
 close(OUT);
 
 sub addpre
 {
-  my $p = shift;
-  my $ref = [];
-  $pre{$p} = $ref;
+       my ($p, $ent) = @_;
+       my $ref = $pre{$p};
+       $ref = $pre{$p} = [] if !$ref;
+       push @{$ref}, $ent;;
+}
+
+sub printpre
+{
+       my $p = shift;
+       my $ref = $pre{$p};
+       my $out;
+       my $r;
+  
+       foreach $r (@{$ref}) {
+               $out .= "$r,";
+       }
+       chop $out;
+       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;
-  $locstr =~ s/\'/\\'/g;
-  my $loc = $loc{$locstr} = $nextloc++;
-  $locn{$loc} = $locstr;
-  return $loc;
+       my $locstr = shift;
+       $locstr =~ s/\'/\\'/g;
+       my $loc = $loc{$locstr} = $nextloc++;
+       $locn{$loc} = $locstr;
+       return $loc;
 }
+