Skip to content

Commit

Permalink
New formatting scripts.
Browse files Browse the repository at this point in the history
The use/defs extraction in runoff still needs some work
for xv6 code style.
  • Loading branch information
rsc committed Sep 5, 2006
1 parent a81e021 commit fae7779
Show file tree
Hide file tree
Showing 4 changed files with 185 additions and 9 deletions.
1 change: 1 addition & 0 deletions .cvsignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ bootblock
bootother
bootother.out
parport.out
fmt
15 changes: 6 additions & 9 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ tags: $(OBJS) bootother.S init
etags *.S *.c

PRINT = \
runoff.list \
README\
types.h param.h defs.h x86.h asm.h elf.h mmu.h spinlock.h\
bootasm.S bootother.S main.c init.c spinlock.c\
Expand All @@ -69,15 +70,11 @@ PRINT = \
console.c\
string.c\

# make a print, but the resulting xv6.ind need some editing
print: $(PRINT)
lgrind -d ./lgrindef $(PRINT) > xv6.tex
latex xv6.tex
makeindex xv6.idx
latex xv6.tex
dvips -o xv61.ps xv6.dvi
psnup -2 xv61.ps > xv6.ps
rm -f xv61.ps
# make a printout
xv6.pdf : $(PRINT)
./runoff

print : xv6.pdf

vectors.S : vectors.pl
perl vectors.pl > vectors.S
Expand Down
128 changes: 128 additions & 0 deletions runoff
Original file line number Diff line number Diff line change
@@ -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
50 changes: 50 additions & 0 deletions runoff.list
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# basic headers
types.h
param.h
defs.h
x86.h
asm.h
elf.h
mmu.h
spinlock.h

# low level startup
bootasm.S
bootother.S
main.c
init.c
spinlock.c
proc.h
proc.c
setjmp.S
kalloc.c
syscall.h
trapasm.S
traps.h
trap.c
vectors.pl
syscall.c

# file system
buf.h
dev.h
fcntl.h
stat.h
fd.h
fs.h
fsvar.h
fd.c
fs.c
bio.c
ide.c
pipe.c

# mp and other "uninteresting" things
mp.h
ioapic.h
mp.c
lapic.c
ioapic.c
picirq.c
console.c
string.c

0 comments on commit fae7779

Please sign in to comment.