191 lines
3.5 KiB
Plaintext
Executable File
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;
|
|
}
|