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