X-Git-Url: http://git.shiar.nl/barcat.git/blobdiff_plain/a5fd99a71fccfb69e4eeb23a58bb3d8a501a91f2..8533154739967d8a22b897d1507616a6c5a4e666:/barcat diff --git a/barcat b/barcat index 6fd5b5a..6dbddd9 100755 --- a/barcat +++ b/barcat @@ -90,6 +90,7 @@ GetOptions(\%opt, }; }, 'stat|s!', + 'report=s', 'signal-stat=s', 'unmodified|u!', 'width|w=i', @@ -122,6 +123,11 @@ $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};