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