#!/usr/bin/perl
# -*- perl -*-

use FileHandle;
# $| = 1;

require 'getopts.pl';
&Getopts('lpr');

if (eval 'require Time::HiRes') {
  Time::HiRes->import('time');
}

@files = @ARGV;

foreach $f (@files) {
  my $fh = new FileHandle;
  if (open $fh, "< $f") {
    push @fhs, [$f, $fh, 0];
  } else {
    warn "Couldn't open file `$f': $!; ignoring.\n";
  }
}

die "Couldn't open any files; aborting" unless @fhs;

for (;;) {
  $change = 0;
  my $time = time;
  foreach $item (@fhs) {
    my ($fn, $fh, $fl, $fs, $fl1) = @$item;
    $b = 0;
    seek $fh, 0, 1;
    while (<$fh>) {
      if ($opt_l) {
	$b++ if /\n\z/;
      } else {
	$b += length;
      }
    }
    $fl += $b;
    if ($b) {
      $fl1 = $fl unless defined $fl1;
      $ns = "$fn: $fl ";
      print $ns;
      printf "%.2f", $fl/66 if $opt_p && $opt_l;
      printf "%s/s", rate(($fl-$fl1)/($time -$^T)) if $time > $^T && $opt_r;
      $change = 1;
      @{$item}[2,3,4] = ($fl, $ns, $fl1);
    } else {
      print $fs;
    }
  }
  sleep 5 unless $change;
  print "\r";
}

sub rate {
  my $r = shift;
  my @m = (1000000000, 1000000, 1000, 1, .0001, .0000001);
  my @l = ('G', 'M', 'k', '', 'm', 'u');
  for (0 .. $#m) {
    if ($r >= $m[$_]) {
      return sprintf "%.2f%s", $r/$m[$_], $l[$_];
    }
  }
}

