negative limit range counting from end
authorMischa POSLAWSKY <perl@shiar.org>
Sun, 28 Mar 2021 02:51:55 +0000 (04:51 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Tue, 1 Nov 2022 02:14:50 +0000 (03:14 +0100)
barcat
t/t1505-bottom_range.in [new symlink]
t/t1505-bottom_range_-L-4-3.out [new file with mode: 0644]
t/t1506-limit_offset.in [new symlink]
t/t1506-limit_offset_-L-4+2_#TODO.out [new symlink]

diff --git a/barcat b/barcat
index 5d0f85c287b571a726a6426ae027406b3b8cb0ef..0316b64460300a7e5ffb3dc73b4c696fe20024c2 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -209,12 +209,21 @@ sub show_lines {
 state $nr =
        $opt{hidemin} < 0 ? @lines + $opt{hidemin} + 1 :
        $opt{hidemin};
-@lines or return;
 @lines > $nr or return;
 
+my $limit = $#lines;
+if (defined $opt{hidemax}) {
+       if ($opt{hidemin} and $opt{hidemin} < 0) {
+               $limit -= $opt{hidemax} - 1;
+       }
+       else {
+               $limit = $opt{hidemax} - 1;
+       }
+}
+
 @order = sort { $b <=> $a } @order unless tied @order;
 my $maxval = $opt{maxval} // (
-       $opt{hidemax} ? max grep { length } @values[0 .. $opt{hidemax} - 1] :
+       $opt{hidemax} ? max grep { length } @values[$nr .. $limit] :
        $order[0]
 ) // 0;
 my $minval = $opt{minval} // min $order[-1] // (), 0;
@@ -277,8 +286,7 @@ say(
        color(0),
 ) if $opt{header};
 
-while ($nr <= $#lines) {
-       $nr >= $opt{hidemax} and last if defined $opt{hidemax};
+while ($nr <= $limit) {
        my $val = $values[$nr];
        my $rel = length $val && $range && ($val - $minval) / $range;
        my $color = !length $val || !$opt{palette} ? undef :
@@ -320,8 +328,11 @@ say $opt{palette} ? color(0) : '' if $opt{spark};
 sub show_stat {
        if ($opt{hidemin} or $opt{hidemax}) {
                my $linemin = $opt{hidemin};
-               $linemin += @lines if $linemin < 0;
                my $linemax = ($opt{hidemax} || @lines) - 1;
+               if ($linemin < 0) {
+                       $linemin += @lines;
+                       $linemax = @lines - $linemax;
+               }
                printf '%.8g of ', $opt{'sum-format'}->(
                        sum(grep {length} @values[$linemin .. $linemax]) // 0
                );
diff --git a/t/t1505-bottom_range.in b/t/t1505-bottom_range.in
new file mode 120000 (symlink)
index 0000000..1350c85
--- /dev/null
@@ -0,0 +1 @@
+t1501-end_limit.in
\ No newline at end of file
diff --git a/t/t1505-bottom_range_-L-4-3.out b/t/t1505-bottom_range_-L-4-3.out
new file mode 100644 (file)
index 0000000..5ba6aa3
--- /dev/null
@@ -0,0 +1,2 @@
+4274 -----------------------------------
+3350 ---------------------------
diff --git a/t/t1506-limit_offset.in b/t/t1506-limit_offset.in
new file mode 120000 (symlink)
index 0000000..1350c85
--- /dev/null
@@ -0,0 +1 @@
+t1501-end_limit.in
\ No newline at end of file
diff --git a/t/t1506-limit_offset_-L-4+2_#TODO.out b/t/t1506-limit_offset_-L-4+2_#TODO.out
new file mode 120000 (symlink)
index 0000000..0f0f456
--- /dev/null
@@ -0,0 +1 @@
+t1505-bottom_range_-L-4-3_#TODO.out
\ No newline at end of file