summaryrefslogtreecommitdiff
path: root/runoff
blob: caa8a1135c173b0045f8ea8244ed0919926d0364 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/bin/sh

echo This script takes a minute to run.  Be patient. 1>&2

# 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 fmt/*
cp README fmt
files=`grep -v '^#' runoff.list | awk '{print $1}'`
n=99
for i in $files
do
	awk -v 'n='$n '
		BEGIN{n=int((n+49)/50)*50-1; nb=0; nr=0}
		NF==0 { nb++; next } 
		{for(i=0; i<nb; i++) printf("%04d\n", n+ ++nr); nb=0; printf("%04d %s\n", n+ ++nr, $0)}
		END{for(nr++; nr%50 != 1; nr++) printf("%04d\n", n+nr);}
		' $i >fmt/$i
	n=`tail -1 fmt/$i | awk '{print $1}'`
done

# create table of contents
pr -e8 -t runoff.list | awk '
/^[a-z]/ {
	s=$0
	f="fmt/"$1
	getline<f
	close(f)
	n=$1
	printf("%02d %s\n", n/100, s);
	next
}
{
	print
}' >fmt/toc

# make definition list
cd fmt
awk '
	/^[0-9]+ [A-Za-z0-9_]+ .*[A-Za-z0-9_].*;/ {
		s=$0;
		sub(/\[.*/, "", s);
		sub(/\(.*/, "", s);
		sub(/ *=.*/, "", s);
		sub(/.* \**/, "", s);
		sub(/;.*/, "", s);
		print $1, s
	}
	$2=="#define" { 
		if($3 ~ /\(/){
			sub(/\(.*/, "", $3); print $1, $3
		} else {
			s = ""
			for(i=4; i<=NF; i++){
				s = s $i
			}
			print $1, $3, s
		}
	}
	$2=="enum" { inenum = 1; v=-1; } 
	$2 == "};" { inenum = 0; }
	inenum && $2 ~ /^[A-Z][a-zA-Z0-9_]+$/ {
		if($3 == "="){
			s = ""
			for(i=4; i<=NF; i++){
				s = s " " $i
			}
			sub(/,$/, "", s);
			sub(/^ /, "", s);
			v = s;
		}else
			v++;
		print $1, $2, v;
	}
	$2=="struct" && $3 ~ /^[A-Z][a-zA-Z0-9_]+$/ {
		print $1, $3;
	}
' $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 -l60 -e4 README
	pr -l60 -e4 toc
	pr -l60 -h "definitions" -2 t.defs | pad
	pr -l60 -h "cross-references" -2 refs | pad 
	pr -l60 -e4 $files 
) | mpage -m50t50b -o -bLetter -t -2 -FCourier -L60 >all.ps
grep Pages: all.ps

# if we have the nice font, use it
nicefont=~rsc/plan9/sys/lib/postscript/font/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