100 lines
2.1 KiB
Perl
Executable file
100 lines
2.1 KiB
Perl
Executable file
#!/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;
|
|
|
|
@lines = <>;
|
|
foreach (@lines) {
|
|
chomp;
|
|
s/\s+$//;
|
|
if(length() >= 75){
|
|
print "$ARGV[0]:$.: line too long";
|
|
}
|
|
}
|
|
@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){
|
|
$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:\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;
|
|
}
|
|
}
|