diff options
Diffstat (limited to 'runoff1')
| -rwxr-xr-x | runoff1 | 90 | 
1 files changed, 90 insertions, 0 deletions
| @@ -0,0 +1,90 @@ +#!/usr/bin/perl + +$n = 0; +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 = int($2); +				$breakbefore = $j; +				$lines[$j] = ""; +			} +			if($lines[$j] =~ /^}$/){ +				$breakbefore = $j+1; +			} +			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){ +			$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; +	} +} | 
