+
+# expects either an array reference or two times (in the correct order [start, end])
+sub difft
+{
+ my $b = shift;
+ my $adds = shift;
+
+ my $t;
+ if (ref $b eq 'ARRAY') {
+ $t = $b->[1] - $b->[0];
+ } else {
+ if ($adds >= $b) {
+ $t = $adds - $b;
+ $adds = shift;
+ } else {
+ $t = $main::systime - $b;
+ }
+ }
+ return '-(ve)' if $t < 0;
+ my ($d,$h,$m,$s);
+ my $out = '';
+ $d = int $t / 86400;
+ $out .= sprintf ("%s${d}d", $adds?' ':'') if $d;
+ $t -= $d * 86400;
+ $h = int $t / 3600;
+ $out .= sprintf ("%s${h}h", $adds?' ':'') if $h;
+ $t -= $h * 3600;
+ $m = int $t / 60;
+ $out .= sprintf ("%s${m}m", $adds?' ':'') if $m;
+ if ($d == 0 && $adds || $adds == 2) {
+ $s = int $t % 60;
+ $out .= sprintf ("%s${s}s", $adds?' ':'') if $s;
+ $out ||= sprintf ("%s0s", $adds?' ':'');
+ }
+ return $out;
+}
+
+# print an array ref of difft refs
+sub parraydifft
+{
+ my $r = shift;
+ my $out = '';
+ for (@$r) {
+ my $s = $_->[2] ? "($_->[2])" : '';
+ $out .= sprintf "%s=%s$s, ", atime($_->[0]), difft($_->[0], $_->[1]);
+ }
+ $out =~ s/,\s*$//;
+ return $out;
+}