use IO::File;
use File::Copy;
use Data::Dumper;
-
+use Time::HiRes qw(gettimeofday tv_interval);
use strict;
@EXPORT = qw(atime ztime cldate cldatetime slat slong yesno promptf
parray parraypairs phex phash shellregex readfilestr writefilestr
filecopy ptimelist
- print_all_fields cltounix unpad is_callsign is_long_callsign is_latlong
+ print_all_fields cltounix unpad is_callsign is_latlong
is_qra is_freq is_digits is_pctext is_pcflag insertitem deleteitem
is_prefix dd is_ipaddr $pi $d2r $r2d localdata localdata_mv
+ diffms _diffms
);
# check that a field only has callsign characters in it
sub is_callsign
{
- return $_[0] =~ m!^(?:[A-Z]{1,2}\d+ | \d[A-Z]{1,2}\d+) # basic prefix
- (?:/(?:[A-Z]{1,2}\d+ | \d[A-Z]{1,2}\d+))? # / another one (possibly)
- [A-Z]{1,4} # callsign letters
- (?:/(?:[A-Z]{1,2}\d+ | \d[A-Z]{1,2}\d+))? # / another prefix possibly
- (?:/[0-9A-Z]{1,2})? # /0-9A-Z+ possibly
- (?:-\d{1,2})? # - nn possibly
- $!x;
-}
+ return $_[0] =~ m!^
+ (?:\d?[A-Z]{1,2}\d*/)? # out of area prefix /
+ (?:\d?[A-Z]{1,2}\d+) # main prefix one (required)
+ [A-Z]{1,5} # callsign letters (required)
+ (?:-(?:\d{1,2}|\#))? # - nn possibly (eg G8BPQ-8) or -# (an RBN spot)
+ (?:/[0-9A-Z]{1,7})? # / another prefix, callsign or special label (including /MM, /P as well as /EURO or /LGT) possibly
+ $!x;
-# check that a field only has callsign characters in it but has more than the standard 3 callsign letters
-sub is_long_callsign
-{
- return $_[0] =~ m!^(?:[A-Z]{1,2}\d+ | \d[A-Z]{1,2}\d+) # basic prefix
- (?:/(?:[A-Z]{1,2}\d+ | \d[A-Z]{1,2}\d+))? # / another one (possibly)
- [A-Z]{1,5} # callsign letters
- (?:/(?:[A-Z]{1,2}\d+ | \d[A-Z]{1,2}\d+))? # / another prefix possibly
- (?:/[0-9A-Z]{1,2})? # /0-9A-Z+ possibly
- (?:-\d{1,2})? # - nn possibly
- $!x;
+ # longest callign allowed is 1X11/1Y11XXXXX-11/XXXXXXX
}
sub is_prefix
{
- return $_[0] =~ m!^(?:[A-Z]{1,2}\d+ | \d[A-Z]{1,2}\d+)!x # basic prefix
+ return $_[0] =~ m!^(?:[A-Z]{1,2}\d+ | \d[A-Z]{1,2}}\d+)!x # basic prefix
}
# does it look like a qra locator?
sub is_qra
{
- return $_[0] =~ /^[A-Ra-r][A-Ra-r]\d\d[A-Xa-x][A-Xa-x]$/;
+ return unless length $_[0] == 4 || length $_[0] == 6;
+ return $_[0] =~ /^[A-Ra-r][A-Ra-r]\d\d(?:[A-Xa-x][A-Xa-x])?$/;
}
# does it look like a valid lat/long
# is it an ip address?
sub is_ipaddr
{
- return $_[0] =~ /^\d+\.\d+\.\d+\.\d+$/ || $_[0] =~ /^[0-9a-f:]+$/;
+ return $_[0] =~ /^\d+\.\d+\.\d+\.\d+$/ || $_[0] =~ /^[0-9a-f:,]+$/;
}
# insert an item into a list if it isn't already there returns 1 if there 0 if not
sub localdata
{
my $ifn = shift;
- my $ofn = "$main::data/$ifn";
+ my $ofn = "$main::local_data/$ifn";
my $tfn;
if (-e "$main::local_data") {
- $tfn = "$main::local_data/$ifn";
- if (-e $tfn && -e $ofn) {
- $ofn = $tfn if -M $tfn < -M $ofn;
- } elsif (-e $tfn) {
- $ofn = $tfn;
+ $tfn = "$main::data/$ifn";
+ if ((-e $tfn) && (-e $ofn)) {
+ $ofn = $tfn if -M $ofn < -M $tfn;
+ } else {
+ $ofn = $tfn if -e $tfn;
}
}
}
}
+# measure the time taken for something to happen; use Time::HiRes qw(gettimeofday tv_interval);
+sub _diffms
+{
+ my $ta = shift;
+ my $tb = shift || [gettimeofday];
+ my $a = int($ta->[0] * 1000) + int($ta->[1] / 1000);
+ my $b = int($tb->[0] * 1000) + int($tb->[1] / 1000);
+ return $b - $a;
+}
+
+sub diffms
+{
+ my $call = shift;
+ my $line = shift;
+ my $ta = shift;
+ my $no = shift;
+ my $tb = shift;
+ my $msecs = _diffms($ta, $tb);
+
+ $line =~ s|\s+$||;
+ my $s = "subprocess stats cmd: '$line' $call ${msecs}mS";
+ $s .= " $no lines" if $no;
+ DXDebug::dbg($s);
+}