X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXUtil.pm;h=07e3f4cb3bede190e80ae629259be3b8df7da646;hb=ca18864d1264fadfe9869b630f05c950876c2169;hp=c82705b7bb68507cb0725f69f7dafc03df5b08ef;hpb=6f566611af29f5c7af653abf8cec2760a0c25b6e;p=spider.git diff --git a/perl/DXUtil.pm b/perl/DXUtil.pm index c82705b7..07e3f4cb 100644 --- a/perl/DXUtil.pm +++ b/perl/DXUtil.pm @@ -8,10 +8,13 @@ package DXUtil; +use Date::Parse; +use Carp; + require Exporter; @ISA = qw(Exporter); -@EXPORT = qw(atime ztime cldate cldatetime slat slong yesno promptf - print_all_fields +@EXPORT = qw(atime ztime cldate cldatetime slat slong yesno promptf parray parraypairs + print_all_fields cltounix ); @month = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); @@ -19,87 +22,127 @@ require Exporter; # a full time for logging and other purposes sub atime { - my $t = shift; - my ($sec,$min,$hour,$mday,$mon,$year) = gmtime((defined $t) ? $t : time); - $year += 1900; - my $buf = sprintf "%02d%s%04d\@%02d:%02d:%02d", $mday, $month[$mon], $year, $hour, $min, $sec; - return $buf; + my $t = shift; + my ($sec,$min,$hour,$mday,$mon,$year) = gmtime((defined $t) ? $t : time); + $year += 1900; + my $buf = sprintf "%02d%s%04d\@%02d:%02d:%02d", $mday, $month[$mon], $year, $hour, $min, $sec; + return $buf; } # get a zulu time in cluster format (2300Z) sub ztime { - my $t = shift; - my ($sec,$min,$hour) = gmtime((defined $t) ? $t : time); - $year += 1900; - my $buf = sprintf "%02d%02dZ", $hour, $min; - return $buf; + my $t = shift; + my ($sec,$min,$hour) = gmtime((defined $t) ? $t : time); + $year += 1900; + my $buf = sprintf "%02d%02dZ", $hour, $min; + return $buf; } # get a cluster format date (23-Jun-1998) sub cldate { - my $t = shift; - my ($sec,$min,$hour,$mday,$mon,$year) = gmtime((defined $t) ? $t : time); - $year += 1900; - my $buf = sprintf "%02d-%s-%04d", $mday, $month[$mon], $year; - return $buf; + my $t = shift; + my ($sec,$min,$hour,$mday,$mon,$year) = gmtime((defined $t) ? $t : time); + $year += 1900; + my $buf = sprintf "%2d-%s-%04d", $mday, $month[$mon], $year; + return $buf; } # return a cluster style date time sub cldatetime { - my $t = shift; - my $date = cldate($t); - my $time = ztime($t); - return "$date $time"; + my $t = shift; + my $date = cldate($t); + my $time = ztime($t); + return "$date $time"; +} + +# return a unix date from a cluster date and time +sub cltounix +{ + my $date = shift; + my $time = shift; + my ($thisyear) = (gmtime)[5] + 1900; + + return 0 unless $date =~ /^\s*(\d+)-(\w\w\w)-([12][90]\d\d)$/; + return 0 if $3 > 2036; + return 0 unless abs($thisyear-$3) <= 1; + $date = "$1 $2 $3"; + return 0 unless $time =~ /^([012]\d)([012345]\d)Z$/; + $time = "$1:$2 +0000"; + return str2time("$date $time"); } # turn a latitude in degrees into a string sub slat { - my $n = shift; - my ($deg, $min, $let); - $let = $n >= 0 ? 'N' : 'S'; - $n = abs $n; - $deg = int $n; - $min = int (($n - $deg) * 60); - return "$deg $min $let"; + my $n = shift; + my ($deg, $min, $let); + $let = $n >= 0 ? 'N' : 'S'; + $n = abs $n; + $deg = int $n; + $min = int ((($n - $deg) * 60) + 0.5); + return "$deg $min $let"; } # turn a longitude in degrees into a string sub slong { - my $n = shift; - my ($deg, $min, $let); - $let = $n >= 0 ? 'E' : 'W'; - $n = abs $n; - $deg = int $n; - $min = int (($n - $deg) * 60); - return "$deg $min $let"; + my $n = shift; + my ($deg, $min, $let); + $let = $n >= 0 ? 'E' : 'W'; + $n = abs $n; + $deg = int $n; + $min = int ((($n - $deg) * 60) + 0.5); + return "$deg $min $let"; } # turn a true into 'yes' and false into 'no' sub yesno { - my $n = shift; - return $n ? $main::yes : $main::no; + my $n = shift; + return $n ? $main::yes : $main::no; } # format a prompt with its current value and return it with its privilege sub promptf { - my ($line, $value) = @_; - my ($priv, $prompt, $action) = split ',', $line; - - # if there is an action treat it as a subroutine and replace $value - if ($action) { - my $q = qq{\$value = $action(\$value)}; - eval $q; - } - $prompt = sprintf "%15s: %s", $prompt, $value; - return ($priv, $prompt); + my ($line, $value) = @_; + my ($priv, $prompt, $action) = split ',', $line; + + # if there is an action treat it as a subroutine and replace $value + if ($action) { + my $q = qq{\$value = $action(\$value)}; + eval $q; + } + $prompt = sprintf "%15s: %s", $prompt, $value; + return ($priv, $prompt); +} + +# take an arg as an array list and print it +sub parray +{ + my $ref = shift; + return join(', ', @{$ref}); +} + +# take the arg as an array reference and print as a list of pairs +sub parraypairs +{ + my $ref = shift; + my $i; + my $out; + + for ($i = 0; $i < @$ref; $i += 2) { + my $r1 = @$ref[$i]; + my $r2 = @$ref[$i+1]; + $out .= "$r1-$r2, "; + } + chop $out; # remove last space + chop $out; # remove last comma + return $out; } # print all the fields for a record according to privilege @@ -109,18 +152,18 @@ sub promptf # sub print_all_fields { - my $self = shift; # is a dxchan - my $ref = shift; # is a thingy with field_prompt and fields methods defined - my @out = @_; - - my @fields = $ref->fields; - my $field; - my @out; - - foreach $field (sort @fields) { - my ($priv, $ans) = promptf($ref->field_prompt($field), $ref->{$field}); - push @out, $ans if ($self->priv >= $priv); - } - return @out; + my $self = shift; # is a dxchan + my $ref = shift; # is a thingy with field_prompt and fields methods defined + my @out; + my @fields = $ref->fields; + my $field; + + foreach $field (sort @fields) { + if (defined $ref->{$field}) { + my ($priv, $ans) = promptf($ref->field_prompt($field), $ref->{$field}); + push @out, $ans if ($self->priv >= $priv); + } + } + return @out; }