summaryrefslogtreecommitdiff
path: root/runoff
diff options
context:
space:
mode:
authorrsc <rsc>2006-09-05 15:50:55 +0000
committerrsc <rsc>2006-09-05 15:50:55 +0000
commitfae7779da70cf76468f8ec0ca8a888bde2bc64fc (patch)
treef64e67396286f013cc1b159da1f8583e609311fa /runoff
parenta81e02133a2e8cb20ba62113a67bc9bee746c8bf (diff)
downloadxv6-labs-fae7779da70cf76468f8ec0ca8a888bde2bc64fc.tar.gz
xv6-labs-fae7779da70cf76468f8ec0ca8a888bde2bc64fc.tar.bz2
xv6-labs-fae7779da70cf76468f8ec0ca8a888bde2bc64fc.zip
New formatting scripts.
The use/defs extraction in runoff still needs some work for xv6 code style.
Diffstat (limited to 'runoff')
-rwxr-xr-xrunoff128
1 files changed, 128 insertions, 0 deletions
diff --git a/runoff b/runoff
new file mode 100755
index 0000000..96cbb18
--- /dev/null
+++ b/runoff
@@ -0,0 +1,128 @@
+#!/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
+9 sed -n 's/^([0-9]+ [a-zA-Z0-9_]+)(.*)$/\1/p' $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=/home/am8/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