X-Git-Url: http://git.shiar.net/barcat.git/blobdiff_plain/6b650ba2ecae66117e944cebf5f33a6adaa618d9..8533154739967d8a22b897d1507616a6c5a4e666:/barcat diff --git a/barcat b/barcat index c3c0dfd..6dbddd9 100755 --- a/barcat +++ b/barcat @@ -90,6 +90,7 @@ GetOptions(\%opt, }; }, 'stat|s!', + 'report=s', 'signal-stat=s', 'unmodified|u!', 'width|w=i', @@ -115,13 +116,18 @@ $opt{width} ||= $ENV{COLUMNS} || qx(tput cols) || 80 unless $opt{spark}; $opt{color} //= $ENV{NO_COLOR} ? 0 : -t *STDOUT; # enable on tty $opt{'graph-format'} //= '-'; $opt{trim} *= $opt{width} / 100 if $opt{trimpct}; -$opt{units} = [split //, ' kMGTPEZYyzafpn'.($opt{ascii} ? 'u' : 'μ').'m'] +$opt{units} = [split //, ' kMGTPEZYRQqryzafpn'.($opt{ascii} ? 'u' : 'μ').'m'] if $opt{'human-readable'}; $opt{anchor} //= qr/\A/; $opt{'value-length'} = 4 if $opt{units}; $opt{'value-length'} = 1 if $opt{unmodified}; $opt{'signal-stat'} //= exists $SIG{INFO} ? 'INFO' : 'QUIT'; $opt{markers} //= '=avg >31.73v <68.27v +50v |0'; +$opt{report} //= join(', ', + '${min; color(31)} min', + '${avg; $opt{reformat} or $_ = sprintf "%0.2f", $_; color(36)} avg', + '${max; color(32)} max', +); $opt{palette} //= $opt{color} && [31, 90, 32]; $opt{indicators} = [split //, $opt{indicators} || ($opt{ascii} ? ' .oO' : $opt{spark} ? ' ▁▂▃▄▅▆▇█' : ' ▏▎▍▌▋▊▉█') @@ -359,19 +365,42 @@ sub show_stat { } if (@order) { my $total = sum @order; - printf '%s total', color(1) . $opt{'value-format'}->($total) . color(0); - printf ' in %d values', scalar @order; - printf ' over %d lines', scalar @lines if @order != @lines; - printf(' (%s min, %s avg, %s max)', - color(31) . ($opt{reformat} ? $opt{'value-format'} : sub {$_[0]})->($order[-1]) . color(0), - color(36) . ($opt{reformat} ? $opt{'value-format'} : $opt{'calc-format'})->($total / @order) . color(0), - color(32) . ($opt{reformat} ? $opt{'value-format'} : sub {$_[0]})->($order[0]) . color(0), - ); + my $fmt = '${sum;color(1)} total in ${count} values'; + $fmt .= ' over ${lines} lines' if @order != @lines; + $fmt .= " ($_)" for $opt{report} || (); + print varfmt($fmt, { + sum => $total, + count => int @order, + lines => int @lines, + min => $order[-1], + max => $order[0], + avg => $total / @order, + }); } say ''; return 1; } +sub varfmt { + my ($fmt, $vars) = @_; + $fmt =~ s[\$\{ (\w+) (?; (?: [^{}]+ | \{.*?\} )*)? \}]{ + local $_ = $vars->{$1}; + if (defined) { + $_ = $opt{'value-format'}->($_) if $opt{reformat}; + if ($+{cmd}) { + eval $+{cmd}; + warn "Error in \$$1 report: $@" if $@; + } + $_; + } + else { + warn "Unknown variable \$$1 in report\n"; + "\$$1"; + } + }eg; + return $fmt; +} + sub show_exit { show_lines(); show_stat() if $opt{stat};