runoff changes
This commit is contained in:
		
							parent
							
								
									72a590d9e5
								
							
						
					
					
						commit
						ec5783cbd2
					
				
					 5 changed files with 160 additions and 91 deletions
				
			
		
							
								
								
									
										35
									
								
								pr.pl
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										35
									
								
								pr.pl
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,35 @@
 | 
			
		|||
#!/usr/bin/perl
 | 
			
		||||
 | 
			
		||||
use POSIX qw(strftime);
 | 
			
		||||
 | 
			
		||||
if($ARGV[0] eq "-h"){
 | 
			
		||||
	shift @ARGV;
 | 
			
		||||
	$h = $ARGV[0];
 | 
			
		||||
	shift @ARGV;
 | 
			
		||||
}else{
 | 
			
		||||
	$h = $ARGV[0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$page = 0;
 | 
			
		||||
$now = strftime "%b %e %H:%M %Y", localtime;
 | 
			
		||||
 | 
			
		||||
@lines = <>;
 | 
			
		||||
for($i=0; $i<@lines; $i+=50){
 | 
			
		||||
	print "\n\n";
 | 
			
		||||
	++$page;
 | 
			
		||||
	print "$now  $h  Page $page\n";
 | 
			
		||||
	print "\n\n";
 | 
			
		||||
	for($j=$i; $j<@lines && $j<$i +50; $j++){
 | 
			
		||||
		print $lines[$j];
 | 
			
		||||
	}
 | 
			
		||||
	for(; $j<$i+50; $j++){
 | 
			
		||||
		print "\n";
 | 
			
		||||
	}
 | 
			
		||||
	$sheet = "";
 | 
			
		||||
	if($lines[$i] =~ /^([0-9][0-9])[0-9][0-9] /){
 | 
			
		||||
		$sheet = "Sheet $1";
 | 
			
		||||
	}
 | 
			
		||||
	print "\n\n";
 | 
			
		||||
	print "$sheet\n";
 | 
			
		||||
	print "\n\n";
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										103
									
								
								runoff
									
										
									
									
									
								
							
							
						
						
									
										103
									
								
								runoff
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -16,90 +16,7 @@ files=`grep -v '^#' runoff.list | awk '{print $1}'`
 | 
			
		|||
n=99
 | 
			
		||||
for i in $files
 | 
			
		||||
do
 | 
			
		||||
	perl -e '$n='$n';' -e ' 
 | 
			
		||||
		$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;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	' $i >fmt/$i
 | 
			
		||||
 | 
			
		||||
	runoff1 -n $n $i >fmt/$i
 | 
			
		||||
	nn=`tail -1 fmt/$i | sed 's/ .*//; s/^0*//'`
 | 
			
		||||
	if [ "x$nn" != x ]; then
 | 
			
		||||
		n=$nn
 | 
			
		||||
| 
						 | 
				
			
			@ -107,8 +24,9 @@ do
 | 
			
		|||
done
 | 
			
		||||
 | 
			
		||||
# create table of contents
 | 
			
		||||
cat toc.hdr >fmt/toc
 | 
			
		||||
pr -e8 -t runoff.list | awk '
 | 
			
		||||
/^[a-z]/ {
 | 
			
		||||
/^[a-z0-9]/ {
 | 
			
		||||
	s=$0
 | 
			
		||||
	f="fmt/"$1
 | 
			
		||||
	getline<f
 | 
			
		||||
| 
						 | 
				
			
			@ -119,7 +37,8 @@ pr -e8 -t runoff.list | awk '
 | 
			
		|||
}
 | 
			
		||||
{
 | 
			
		||||
	print
 | 
			
		||||
}' >fmt/toc
 | 
			
		||||
}' | pr -3 -t >>fmt/toc
 | 
			
		||||
cat toc.ftr >>fmt/toc
 | 
			
		||||
 | 
			
		||||
# make definition list
 | 
			
		||||
cd fmt
 | 
			
		||||
| 
						 | 
				
			
			@ -197,13 +116,15 @@ awk '
 | 
			
		|||
 | 
			
		||||
# format the whole thing
 | 
			
		||||
(
 | 
			
		||||
	pr -l60 -e8 README
 | 
			
		||||
	pr -l60 -h "table of contents" -e8 -2 toc
 | 
			
		||||
	pr -l60 -h "definitions" -2 t.defs | pad
 | 
			
		||||
	pr -l60 -h "cross-references" -2 refs | pad 
 | 
			
		||||
	../pr.pl README
 | 
			
		||||
	../pr.pl -h "table of contents" toc
 | 
			
		||||
	# pr -t -2 t.defs | ../pr.pl -h "definitions" | pad
 | 
			
		||||
	pr -t -l50 -2 refs | ../pr.pl -h "cross-references" | pad
 | 
			
		||||
	# pr.pl -h "definitions" -2 t.defs | pad
 | 
			
		||||
	# pr.pl -h "cross-references" -2 refs | pad 
 | 
			
		||||
	for i in $files
 | 
			
		||||
	do
 | 
			
		||||
		cat $i | pr -l60 -e8 -h "xv6/$i"
 | 
			
		||||
		../pr.pl -h "xv6/$i" $i
 | 
			
		||||
	done
 | 
			
		||||
) | mpage -m50t50b -o -bLetter -T -t -2 -FCourier -L60 >all.ps
 | 
			
		||||
grep Pages: all.ps
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										90
									
								
								runoff1
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										90
									
								
								runoff1
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -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;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								toc.ftr
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								toc.ftr
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
The source listing is preceded by a cross-reference listing every defined 
 | 
			
		||||
constant, struct, global variable, and function in xv6.  Each entry gives,
 | 
			
		||||
on the same line as the name, the line number (or, in a few cases, numbers)
 | 
			
		||||
where the name is defined.  Successive lines in an entry list the line
 | 
			
		||||
numbers where the name is used.  For example, this entry:
 | 
			
		||||
 | 
			
		||||
    namei 4760
 | 
			
		||||
        0333 4760 4859 4908
 | 
			
		||||
        4958 5007 5016 5414
 | 
			
		||||
        5427 5512 5560 5640
 | 
			
		||||
 | 
			
		||||
indicates that namei is defined on line 4760 and is mentioned on twelve lines
 | 
			
		||||
on sheets 03, 47, 48, 49, 50, 54, 55, and 56.
 | 
			
		||||
							
								
								
									
										7
									
								
								toc.hdr
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								toc.hdr
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
The numbers to the left of the file names in the table are sheet numbers.
 | 
			
		||||
The source code has been printed in a double column format with fifty
 | 
			
		||||
lines per column, giving one hundred lines per sheet (or page).
 | 
			
		||||
Thus there is a convenient relationship between line numbers and sheet numbers.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue