| #!/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 | |
| echo > fmt/blank | |
| 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 | |
| } | |
| { | |
| }' | pr -3 -t >>fmt/toc | |
| cat toc.ftr >>fmt/toc | |
| # check for bad alignments | |
| perl -e ' | |
| $leftwarn = 0; | |
| while(<>){ | |
| chomp; | |
| s!#.*!!; | |
| s!\s+! !g; | |
| s! +$!!; | |
| next if /^$/; | |
| if(/TOC: (\d+) (.*)/){ | |
| $toc{$2} = $1; | |
| next; | |
| } | |
| if(/sheet1: (left|right)$/){ | |
| print STDERR "assuming that sheet 1 is a $1 page. double-check!\n"; | |
| $left = $1 eq "left" ? "13579" : "02468"; | |
| $right = $1 eq "left" ? "02468" : "13579"; | |
| 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\d5/){ | |
| print STDERR "$file does not start on a second half page.\n"; | |
| } | |
| next; | |
| } | |
| if(/(left|right): (.*)/){ | |
| $what = $1; | |
| $file = $2; | |
| if(!defined($toc{$file})){ | |
| print STDERR "Have no toc for $file\n"; | |
| next; | |
| } | |
| if($what eq "left" && !($toc{$file} =~ /^\d[$left][05]/)){ | |
| print STDERR "$file does not start on a left page [$toc{$file}]\n"; | |
| } | |
| # why does this not work if I inline $x in the if? | |
| $x = ($toc{$file} =~ /^\d[$right][05]/); | |
| if($what eq "right" && !$x){ | |
| print STDERR "$file does not start on a right page [$toc{$file}] [$x]\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(/^^([0-9]+) \.globl ([a-zA-Z0-9_]+)/){ | |
| $isglobl{$2} = 1; | |
| } | |
| if(/^^([0-9]+) ([a-zA-Z0-9_]+):$/ && $isglobl{$2}){ | |
| 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 | |
| (for i in $files | |
| do | |
| case "$i" in | |
| *.S) | |
| cat $i | sed 's;#.*;;; s;//.*;;;' | |
| ;; | |
| *) | |
| cat $i | sed 's;//.*;;; s;"([^"\\]|\\.)*";;;' | |
| esac | |
| done | |
| ) >alltext | |
| perl -n -e 'print if s/^([0-9]+ [a-zA-Z0-9_]+)\(.*$/\1/;' alltext | | |
| egrep -v ' (STUB|usage|main|if|for)$' >>defs | |
| #perl -n -e 'print if s/^([0-9]+) STUB\(([a-zA-Z0-9_]+)\)$/\1 \2/;' alltext \ | |
| # >>defs | |
| ( | |
| >s.defs | |
| # make reference list | |
| for i in `awk '{print $2}' defs | sort -f | uniq` | |
| 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])' alltext | awk '{print $1}'` | |
| if [ "x$defs" != "x$uses" ]; then | |
| echo $i $defs | |
| echo $uses |fmt -29 | sed 's/^/ /' | |
| # else | |
| # echo $i defined but not used >&2 | |
| fi | |
| 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 | |
| ../pr.pl blank # make sheet 1 start on left page | |
| ../pr.pl blank | |
| 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=LucidaSans-Typewriter83 | |
| if [ ! -f ../$nicefont ] | |
| then | |
| if git cat-file blob font:$nicefont > ../$nicefont~; then | |
| mv ../$nicefont~ ../$nicefont | |
| fi | |
| fi | |
| if [ -f ../$nicefont ] | |
| then | |
| echo nicefont | |
| (sed 1q all.ps; cat ../$nicefont; sed "1d; s/Courier/$nicefont/" all.ps) >allf.ps | |
| else | |
| echo ugly font! | |
| cp all.ps allf.ps | |
| fi | |
| ps2pdf allf.ps ../xv6.pdf | |
| # cd .. | |
| # pdftops xv6.pdf xv6.ps | |
Xet Storage Details
- Size:
- 5.04 kB
- Xet hash:
- ab5677475e786eb7b715ae96faab0cfd8f5c65d35d2d22e75bc201a546ee4b62
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.