1. added grepdbg program (so you can search your debug files and get times
[spider.git] / perl / Spot.pm
index b8938bb9a174fc24f94fe5d5ed8e03420a522f1d..cdd7393d21803c8f85931cf525e79664bec6eb89 100644 (file)
@@ -8,7 +8,7 @@
 
 package Spot;
 
-use FileHandle;
+use IO::File;
 use DXVars;
 use DXDebug;
 use DXUtil;
@@ -41,25 +41,35 @@ sub prefix
 sub add
 {
        my @spot = @_;                          # $freq, $call, $t, $comment, $spotter = @_
-
+       my @out = @spot[0..4];      # just up to the spotter
+       
        # sure that the numeric things are numeric now (saves time later)
        $spot[0] = 0 + $spot[0];
        $spot[2] = 0 + $spot[2];
   
-       # remove ssid if present on spotter
-       $spot[4] =~ s/-\d+$//o;
-
-       # add the 'dxcc' country on the end
-       my @dxcc = Prefix::extract($spot[1]);
-       push @spot, (@dxcc > 0 ) ? $dxcc[1]->dxcc() : 0;
-
-       my $buf = join("\^", @spot);
+       # remove ssids if present on spotter
+       $out[4] =~ s/-\d+$//o;
+
+       # add the 'dxcc' country on the end for both spotted and spotter, then the cluster call
+       my @dxcc = Prefix::extract($out[1]);
+       my $spotted_dxcc = (@dxcc > 0 ) ? $dxcc[1]->dxcc() : 0;
+       my $spotted_itu = (@dxcc > 0 ) ? $dxcc[1]->itu() : 0;
+       my $spotted_cq = (@dxcc > 0 ) ? $dxcc[1]->cq() : 0;
+       push @out, $spotted_dxcc;
+       @dxcc = Prefix::extract($out[4]);
+       my $spotter_dxcc = (@dxcc > 0 ) ? $dxcc[1]->dxcc() : 0;
+       my $spotter_itu = (@dxcc > 0 ) ? $dxcc[1]->itu() : 0;
+       my $spotter_cq = (@dxcc > 0 ) ? $dxcc[1]->cq() : 0;
+       push @out, $spotter_dxcc;
+       push @out, $spot[5];
+       
+       my $buf = join("\^", @out);
 
        # compare dates to see whether need to open another save file (remember, redefining $fp 
        # automagically closes the output file (if any)). 
-       $fp->writeunix($spot[2], $buf);
+       $fp->writeunix($out[2], $buf);
   
-       return $buf;
+       return (@out, $spotted_itu, $spotted_cq, $spotter_itu, $spotter_cq);
 }
 
 # search the spot database for records based on the field no and an expression
@@ -73,7 +83,10 @@ sub add
 #   $f2 = date in unix format
 #   $f3 = comment
 #   $f4 = spotter
-#   $f5 = dxcc country
+#   $f5 = spotted dxcc country
+#   $f6 = spotter dxcc country
+#   $f7 = origin
+#
 #
 # In addition you can specify a range of days, this means that it will start searching
 # from <n> days less than today to <m> days less than today
@@ -92,27 +105,18 @@ sub search
        my $ref;
        my $i;
        my $count;
-       my @today = Julian::unixtoj(time);
+       my @today = Julian::unixtoj(time());
        my @fromdate;
        my @todate;
-  
-       if ($dayfrom > 0) {
-               @fromdate = Julian::sub(@today, $dayfrom);
-       } else {
-               @fromdate = @today;
-               $dayfrom = 0;
-       }
-       if ($dayto > 0) {
-               @todate = Julian::sub(@fromdate, $dayto);
-       } else {
-               @todate = Julian::sub(@fromdate, $maxdays);
-       }
-       if ($from || $to) {
-               $to = $from + $maxspots if $to - $from > $maxspots || $to - $from <= 0;
-       } else {
-               $from = 0;
-               $to = $defaultspots;
-       }
+
+       $dayfrom = 0 if !$dayfrom;
+       $dayto = $maxdays if !$dayto;
+       @fromdate = Julian::sub(@today, $dayfrom);
+       @todate = Julian::sub(@fromdate, $dayto);
+       $from = 0 unless $from;
+       $to = $defaultspots unless $to;
+       
+       $to = $from + $maxspots if $to - $from > $maxspots || $to - $from <= 0;
 
        $expr =~ s/\$f(\d)/\$ref->[$1]/g; # swap the letter n for the correct field name
        #  $expr =~ s/\$f(\d)/\$spots[$1]/g;               # swap the letter n for the correct field name
@@ -123,21 +127,20 @@ sub search
        $eval = qq(
                           my \$c;
                           my \$ref;
-                          for (\$c = \$        #spots; \$c >= 0; \$c--) {
+                          for (\$c = \$#spots; \$c >= 0; \$c--) {
                                        \$ref = \$spots[\$c];
                                        if ($expr) {
                                                \$count++;
                                                next if \$count < \$from; # wait until from 
                                                push(\@out, \$ref);
-                                               last LOOP if \$count >= \$to; # stop after to
+                                               last if \$count >= \$to; # stop after to
                                        }
                                }
                          );
 
        $fp->close;                                     # close any open files
 
- LOOP:
-       for ($i = 0; $i < $maxdays; ++$i) {     # look thru $maxdays worth of files only
+       for ($i = $count = 0; $i < $maxdays; ++$i) {    # look thru $maxdays worth of files only
                my @now = Julian::sub(@fromdate, $i); # but you can pick which $maxdays worth
                last if Julian::cmp(@now, @todate) <= 0;         
        
@@ -150,6 +153,7 @@ sub search
                                push @spots, [ split '\^' ];
                        }
                        eval $eval;                     # do the search on this file
+                       last if $count >= $to; # stop after to
                        return ("Spot search error", $@) if $@;
                }
        }