freebsd-dev/gnu/usr.bin/perl/usub/pager
1995-03-26 03:01:04 +00:00

191 lines
3.5 KiB
Plaintext
Executable File

#!/usr/bin/curseperl
eval <<'EndOfMain'; $evaloffset = __LINE__;
$SIG{'INT'} = 'endit';
$| = 1; # command buffering on stdout
&initterm;
&inithelp;
&slurpfile && &pagearray;
EndOfMain
&endit;
################################################################################
sub initterm {
&initscr; &cbreak; &noecho; &scrollok($stdscr, 1);
&defbell unless defined &bell;
$lines = $LINES; $lines1 = $lines - 1; $lines2 = $lines - 2;
$cols = $COLS; $cols1 = $cols - 1; $cols2 = $cols - 2;;
# $dl = &getcap('dl');
# $al = &getcap('al');
# $ho = &getcap('ho');
# $ce = &getcap('ce');
}
sub slurpfile {
while (<>) {
s/^(\t+)/' ' x length($1)/e;
&expand($_) if /\t/;
if (length($_) < $cols) {
push(@lines, $_);
}
else {
while ($_ && $_ ne "\n") {
push(@lines, substr($_,0,$cols));
substr($_,0,$cols) = '';
}
}
}
1;
}
sub drawscreen {
&move(0,0);
for ($line .. $line + $lines2) {
&addstr($lines[$_]);
}
&clrtobot;
&percent;
&refresh;
}
sub expand {
while (($off = index($_[0],"\t")) >= 0) {
substr($_[0], $off, 1) = ' ' x (8 - $off % 8);
}
}
sub pagearray {
$line = 0;
$| = 1;
for (&drawscreen;;&drawscreen) {
$ch = &getch;
$ch = 'j' if $ch eq "\n";
if ($ch eq ' ') {
last if $percent >= 100;
&move(0,0);
$line += $lines1;
}
elsif ($ch eq 'b') {
$line -= $lines1;
&move(0,0);
$line = 0 if $line < 0;
}
elsif ($ch eq 'j') {
next if $percent >= 100;
$line += 1;
# if ($dl && $ho) {
# print $ho, $dl;
# &mvcur(0,0,$lines2,0);
# print $ce,$lines[$line+$lines2],$ce;
# &wmove($curscr,0,0);
# &wdeleteln($curscr);
# &wmove($curscr,$lines2,0);
# &waddstr($curscr,$lines[$line+$lines2]);
# }
&wmove($stdscr,0,0);
&wdeleteln($stdscr);
&wmove($stdscr,$lines2,0);
&waddstr($stdscr,$lines[$line+$lines2]);
&percent;
&refresh;
redo;
}
elsif ($ch eq 'k') {
next if $line <= 0;
$line -= 1;
# if ($al && $ho && $ce) {
# print $ho, $al, $ce, $lines[$line];
# &wmove($curscr,0,0);
# &winsertln($curscr);
# &waddstr($curscr,$lines[$line]);
# }
&wmove($stdscr,0,0);
&winsertln($stdscr);
&waddstr($stdscr,$lines[$line]);
&percent;
&refresh;
redo;
}
elsif ($ch eq "\f") {
&clear;
}
elsif ($ch eq 'q') {
last;
}
elsif ($ch eq 'h') {
&clear;
&help;
&clear;
}
else {
&bell;
}
}
}
sub defbell {
eval q#
sub bell {
print "\007";
}
#;
}
sub help {
local(*lines) = *helplines;
local($line);
&pagearray;
}
sub inithelp {
@helplines = split(/\n/,<<'EOT');
h Display this help.
q Exit.
SPACE Forward screen.
b Backward screen.
j, CR Forward 1 line.
k Backward 1 line.
FF Repaint screen.
EOT
for (@helplines) {
s/$/\n/;
}
}
sub percent {
&standout;
$percent = int(($line + $lines1) * 100 / @lines);
&move($lines1,0);
&addstr("($percent%)");
&standend;
&clrtoeol;
}
sub endit {
&move($lines1,0);
&clrtoeol;
&refresh;
&endwin;
if ($@) {
print ""; # force flush of stdout
$@ =~ s/\(eval\)/$0/ && $@ =~ s/line (\d+)/'line ' . ($1 + $evaloffset)/e;
die $@;
}
exit;
}