DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T p

⟦95b07cda6⟧ TextFile

    Length: 3364 (0xd24)
    Types: TextFile
    Names: »pager«

Derivation

└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen
    └─⟦b5330643c⟧ »./cops/perl-4.019/perl.tar.Z« 
        └─⟦2b9a58213⟧ 
            └─⟦this⟧ »perl-4.019/usub/pager« 

TextFile

#!./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;
}