root/runoff1

/* [previous][next][first][last][top][bottom][index][help]  */
#!/usr/bin/perl

$n = 0;
$v = 0;
if($ARGV[0] eq "-v") {
        $v = 1;
        shift @ARGV;
}
if($ARGV[0] eq "-n") {
        $n = $ARGV[1];
        shift @ARGV;
        shift @ARGV;
}
$n = int(($n+49)/50)*50 - 1;

$file = $ARGV[0];
@lines = <>;
$linenum = 0;
foreach (@lines) {
        $linenum++;
        chomp;
        s/\s+$//;
        if(length() >= 75){
                print STDERR "$file:$linenum: line too long\n";
        }
}
@outlines = ();
$nextout = 0;

for($i=0; $i<@lines; ){
        # Skip leading blank lines.
        $i++ while $i<@lines && $lines[$i] =~ /^$/;
        last if $i>=@lines;

        # If the rest of the file fits, use the whole thing.
        if(@lines <= $i+50 && !grep { /PAGEBREAK/ } @lines){
                $breakbefore = @lines;
        }else{
                # Find a good next page break;
                # Hope for end of function.
                # but settle for a blank line (but not first blank line
                # in function, which comes after variable declarations).
                $breakbefore = $i;
                $lastblank = $i;
                $sawbrace = 0;
                $breaksize = 15;  # 15 lines to get to function
                for($j=$i; $j<$i+50 && $j < @lines; $j++){
                        if($lines[$j] =~ /PAGEBREAK!/){
                                $lines[$j] = "";
                                $breakbefore = $j;
                                $breaksize = 100;
                                last;
                        }
                        if($lines[$j] =~ /PAGEBREAK:\s*([0-9]+)/){
                                $breaksize = $1;
                                $breakbefore = $j;
                                $lines[$j] = "";
                        }
                        if($lines[$j] =~ /^};?$/){
                                $breakbefore = $j+1;
                                $breaksize = 15;
                        }
                        if($lines[$j] =~ /^{$/){
                                $sawbrace = 1;
                        }
                        if($lines[$j] =~ /^$/){
                                if($sawbrace){
                                        $sawbrace = 0;
                                }else{
                                        $lastblank = $j;
                                }
                        }
                }
                if($j<@lines && $lines[$j] =~ /^$/){
                        $lastblank = $j;
                }

                # If we are not putting enough on a page, try a blank line.
                if($breakbefore - $i < 50 - $breaksize && $lastblank > $breakbefore && $lastblank >= $i+50 - 5){
                        if($v){
                                print STDERR "breakbefore $breakbefore i $i breaksize $breaksize\n";
                        }
                        $breakbefore = $lastblank;
                        $breaksize = 5;  # only 5 lines to get to blank line
                }

                # If we are not putting enough on a page, force a full page.
                if($breakbefore - $i < 50 - $breaksize && $breakbefore != @lines){
                        $breakbefore = $i + 50;
                        $breakbefore = @lines if @lines < $breakbefore;
                }

                if($breakbefore < $i+2){
                        $breakbefore = $i+2;
                }
        }

        # Emit the page.
        $i50 = $i + 50;
        for(; $i<$breakbefore; $i++){
                printf "%04d %s\n", ++$n, $lines[$i];
        }

        # Finish page
        for($j=$i; $j<$i50; $j++){
                printf "%04d \n", ++$n;
        }
}

/* [previous][next][first][last][top][bottom][index][help]  */