185 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/bin/sh
 | 
						|
 | 
						|
echo This script takes a minute to run.  Be patient. 1>&2
 | 
						|
 | 
						|
LC_CTYPE=C export LC_CTYPE
 | 
						|
 | 
						|
# pad stdin to multiple of 120 lines
 | 
						|
pad()
 | 
						|
{
 | 
						|
	awk '{print} END{for(; NR%120!=0; NR++) print ""}'
 | 
						|
}
 | 
						|
 | 
						|
# create formatted (numbered) files
 | 
						|
mkdir -p fmt
 | 
						|
rm -f fmt/*
 | 
						|
cp README fmt
 | 
						|
files=`grep -v '^#' runoff.list | awk '{print $1}'`
 | 
						|
n=99
 | 
						|
for i in $files
 | 
						|
do
 | 
						|
	runoff1 -n $n $i >fmt/$i
 | 
						|
	nn=`tail -1 fmt/$i | sed 's/ .*//; s/^0*//'`
 | 
						|
	if [ "x$nn" != x ]; then
 | 
						|
		n=$nn
 | 
						|
	fi
 | 
						|
done
 | 
						|
 | 
						|
# create table of contents
 | 
						|
cat toc.hdr >fmt/toc
 | 
						|
pr -e8 -t runoff.list | awk '
 | 
						|
/^[a-z0-9]/ {
 | 
						|
	s=$0
 | 
						|
	f="fmt/"$1
 | 
						|
	getline<f
 | 
						|
	close(f)
 | 
						|
	n=$1
 | 
						|
	printf("%02d %s\n", n/100, s);
 | 
						|
	printf("TOC: %04d %s\n", n, s) >"fmt/tocdata"
 | 
						|
	next
 | 
						|
}
 | 
						|
{
 | 
						|
	print
 | 
						|
}' | pr -3 -t >>fmt/toc
 | 
						|
cat toc.ftr >>fmt/toc
 | 
						|
 | 
						|
# check for bad alignments
 | 
						|
perl -e '
 | 
						|
	while(<>){
 | 
						|
		chomp;
 | 
						|
		s!#.*!!;
 | 
						|
		s!\s+! !g;
 | 
						|
		s! +$!!;
 | 
						|
		next if /^$/;
 | 
						|
		
 | 
						|
		if(/TOC: (\d+) (.*)/){
 | 
						|
			$toc{$2} = $1;
 | 
						|
			next;
 | 
						|
		}
 | 
						|
		
 | 
						|
		if(/even: (.*)/){
 | 
						|
			$file = $1;
 | 
						|
			if(!defined($toc{$file})){
 | 
						|
				print STDERR "Have no toc for $file\n";
 | 
						|
				next;
 | 
						|
			}
 | 
						|
			if($toc{$file} =~ /^\d\d[^0]/){
 | 
						|
				print STDERR "$file does not start on a fresh page.\n";
 | 
						|
			}
 | 
						|
			next;
 | 
						|
		}
 | 
						|
		
 | 
						|
		if(/odd: (.*)/){
 | 
						|
			$file = $1;
 | 
						|
			if(!defined($toc{$file})){
 | 
						|
				print STDERR "Have no toc for $file\n";
 | 
						|
				next;
 | 
						|
			}
 | 
						|
			if($toc{$file} =~ /^\d\d[^5]/){
 | 
						|
				print STDERR "$file does not start on a second half page.\n";
 | 
						|
			}
 | 
						|
			next;
 | 
						|
		}
 | 
						|
		
 | 
						|
		print STDERR "Unknown spec: $_\n";
 | 
						|
	}
 | 
						|
' fmt/tocdata runoff.spec
 | 
						|
 | 
						|
# make definition list
 | 
						|
cd fmt
 | 
						|
perl -e '
 | 
						|
	while(<>) {
 | 
						|
		chomp;
 | 
						|
 | 
						|
		s!//.*!!;
 | 
						|
		s!/\*([^*]|[*][^/])*\*/!!g;
 | 
						|
		s!\s! !g;
 | 
						|
		s! +$!!;
 | 
						|
 | 
						|
		# look for declarations like char* x;
 | 
						|
		if (/^[0-9]+ typedef .* u(int|short|long|char);/) {
 | 
						|
			next;
 | 
						|
		}
 | 
						|
		if (/^[0-9]+ extern/) {
 | 
						|
			next;
 | 
						|
		}
 | 
						|
		if (/^[0-9]+ struct [a-zA-Z0-9_]+;/) {
 | 
						|
			next;
 | 
						|
		}
 | 
						|
		if (/^([0-9]+) #define +([A-za-z0-9_]+) +?\(.*/) {
 | 
						|
			print "$1 $2\n"
 | 
						|
		}
 | 
						|
		
 | 
						|
		elsif (/^([0-9]+) #define +([A-Za-z0-9_]+) +([^ ]+)/) {
 | 
						|
			print "$1 $2 $3\n";
 | 
						|
		}
 | 
						|
		
 | 
						|
		elsif (/^([0-9]+) #define +([A-Za-z0-9_]+)/) {
 | 
						|
			print "$1 $2\n";
 | 
						|
		}
 | 
						|
		
 | 
						|
		if (/\(/) {
 | 
						|
			next;
 | 
						|
		}
 | 
						|
 | 
						|
		if (/^([0-9]+) (((static|struct|extern|union|enum) +)*([A-Za-z0-9_]+))( .*)? +([A-Za-z_][A-Za-z0-9_]*)[,;]/) {
 | 
						|
		
 | 
						|
			print "$1 $7\n"
 | 
						|
		}
 | 
						|
		
 | 
						|
		elsif(/^([0-9]+) (enum|struct|union) +([A-Za-z0-9_]+) +{/){ 
 | 
						|
			print "$1 $3\n";
 | 
						|
		}
 | 
						|
		# TODO: enum members
 | 
						|
	}
 | 
						|
' $files >defs
 | 
						|
 | 
						|
perl -n -e 'print if s/^([0-9]+ [a-zA-Z0-9_]+)\(.*$/\1/;' $files |
 | 
						|
	egrep -v ' (usage|main|if|for)$' >>defs
 | 
						|
(
 | 
						|
>s.defs
 | 
						|
 | 
						|
# make reference list
 | 
						|
for i in `awk '{print $2}' defs | sort -fu`
 | 
						|
do
 | 
						|
	defs=`egrep '^[0-9]+ '$i'( |$)' defs | awk '{print $1}'`
 | 
						|
	echo $i $defs >>s.defs
 | 
						|
	uses=`egrep -h '([^a-zA-Z_0-9])'$i'($|[^a-zA-Z_0-9])' $files | awk '{print $1}'`
 | 
						|
	echo $i $defs
 | 
						|
	echo $uses |fmt -24 | sed 's/^/    /'
 | 
						|
done
 | 
						|
) >refs
 | 
						|
 | 
						|
# build defs list
 | 
						|
awk '
 | 
						|
{
 | 
						|
	printf("%04d %s\n", $2, $1);
 | 
						|
	for(i=3; i<=NF; i++)
 | 
						|
		printf("%04d    \" \n", $i);
 | 
						|
}
 | 
						|
' s.defs > t.defs
 | 
						|
 | 
						|
# format the whole thing
 | 
						|
(
 | 
						|
	../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
 | 
						|
		../pr.pl -h "xv6/$i" $i
 | 
						|
	done
 | 
						|
) | mpage -m50t50b -o -bLetter -T -t -2 -FCourier -L60 >all.ps
 | 
						|
grep Pages: all.ps
 | 
						|
 | 
						|
# if we have the nice font, use it
 | 
						|
nicefont=~rsc/lib/postscript/LucidaSans-Typewriter83
 | 
						|
if [ -f $nicefont ]
 | 
						|
then
 | 
						|
	(sed 1q all.ps; cat $nicefont; sed '1d; s/Courier/LucidaSans-Typewriter83/' all.ps) >allf.ps
 | 
						|
else
 | 
						|
	cp all.ps allf.ps
 | 
						|
fi
 | 
						|
ps2pdf allf.ps ../xv6.pdf
 |