|  | #!/usr/local/plan9/bin/rc | 
|  |  | 
|  | . 9.rc | 
|  | . $PLAN9/man/fonts | 
|  |  | 
|  | # | 
|  | # formatters | 
|  | # | 
|  | fn roff { | 
|  | preproc=() | 
|  | x=`{doctype $2} | 
|  | if (~ $1 t) { | 
|  | if(~ $x *grap*) | 
|  | preproc=($preproc grap) | 
|  | if(~ $x *pic*) | 
|  | preproc=($preproc pic) | 
|  | Nflag=-Tutf | 
|  | } | 
|  | if not { | 
|  | Nflag=-N | 
|  | } | 
|  | if(~ $x *eqn*) | 
|  | preproc=($preproc eqn) | 
|  | if(~ $x *tbl*) | 
|  | preproc=($preproc tbl) | 
|  |  | 
|  | switch($#preproc) { | 
|  | case 0 | 
|  | {echo -n $FONTS; cat $2< /dev/null} | troff $Nflag -$MAN | 
|  | case 1 | 
|  | {echo -n $FONTS; cat $2< /dev/null} | $preproc | troff $Nflag -$MAN | 
|  | case 2 | 
|  | {echo -n $FONTS; cat $2< /dev/null} | $preproc(1) | $preproc(2) | troff $Nflag -$MAN | 
|  | case 3 | 
|  | {echo -n $FONTS; cat $2< /dev/null} | $preproc(1) | $preproc(2) | $preproc(3) | | troff $Nflag -$MAN | 
|  | case * | 
|  | {echo -n $FONTS; cat $2< /dev/null} | $preproc(1) | $preproc(2) | $preproc(3) | | $preproc(4) | troff $Nflag -$MAN | 
|  | } | 
|  | } | 
|  |  | 
|  | fn doecho { echo $1 } | 
|  | fn dotroff { roff t $1 } | 
|  | fn doproof { roff t $1 | proof } | 
|  | fn dopage { roff t $1 | tr2post | page } | 
|  | fn donroff { | 
|  | roff n $1 | sed ' | 
|  | ${ | 
|  | /^$/p | 
|  | } | 
|  | //N | 
|  | /^\n$/D | 
|  | ' | 
|  | } | 
|  | seq=0 | 
|  | fn dohtml { | 
|  | MAN=manhtml | 
|  | b=`{echo $1 | sed 's/\.[0-9].*//'} | 
|  | if(test -f $b.html) | 
|  | web $b.html | 
|  | if not{ | 
|  | roff t $1 | troff2html >/tmp/man.$pid.$seq.html | 
|  | web /tmp/man.$pid.$seq.html | 
|  | seq=`{echo 1+$seq | hoc} | 
|  | } | 
|  | } | 
|  |  | 
|  | # | 
|  | # parse flags and sections | 
|  | # | 
|  | fn usage { echo 'Usage: man [-hnpPtw] [-s sec] [0-9] [0-9] ... [--] name1 name2 ...' >[1=2] } | 
|  | cmd=donroff | 
|  | sec=() | 
|  | S=$PLAN9/man | 
|  | d=0 | 
|  | while(~ $d 0) { | 
|  | if(~ $#* 0) { | 
|  | usage | 
|  | exit 1 | 
|  | } | 
|  | if(test -d $S/man$1){ | 
|  | sec=($sec $1) | 
|  | shift | 
|  | } | 
|  | if not switch($1) { | 
|  | case -t ; cmd=dotroff ; shift | 
|  | case -n ; cmd=donroff ; shift | 
|  | case -p ; cmd=doproof ; shift | 
|  | case -P ; cmd=dopage ; shift | 
|  | case -w ; cmd=doecho ; shift | 
|  | case -h ; cmd=dohtml ; shift | 
|  | case -- ; d=1 ; shift | 
|  | case -* ; usage ; exit 1 | 
|  | case * ; d=1 | 
|  | } | 
|  | } | 
|  | if(~ $#sec 0) { | 
|  | sec=`{ls -pd $S/man[0-9]* | sed 's/man//'} | 
|  | } | 
|  |  | 
|  | # | 
|  | # search index | 
|  | # | 
|  | allfiles=() | 
|  | missing=no | 
|  | for(word){ | 
|  | files=() | 
|  | regexp='^'^$word^' ' | 
|  | for(i in $S/man$sec){ | 
|  | if(test -f $i/INDEX){ | 
|  | try=`{grep $regexp $i/INDEX | sed 's/^[^ ]* //'} | 
|  | if(! ~ $#try 0) | 
|  | files=($files $i/$try) | 
|  | } | 
|  | } | 
|  | if(~ $#files 0){ | 
|  | for(i in $S/man$sec){ | 
|  | if(test -f $i/$word.[0-9]*) | 
|  | files=($files $i/$word.[0-9]*) | 
|  | } | 
|  | } | 
|  | if(~ $#files 0){ | 
|  | echo 'man: no manual page' $word >[1=2] | 
|  | missing=yes | 
|  | } | 
|  | allfiles=($allfiles $files) | 
|  | } | 
|  | if(~ $#allfiles 0) | 
|  | exit 'no man' | 
|  | # complicated sort order: want 9p.3, 9p-cmdbuf.3, 9pclient.3 | 
|  | allfiles=`{ls $allfiles | sed 's/[.\-]/ &/g;s/\./ &/g' | sort -u | tr -d ' '} | 
|  |  | 
|  | files=() | 
|  | for(i in $allfiles){ | 
|  | if(test -f $i) | 
|  | files=($files $i) | 
|  | if not | 
|  | echo need $i >[1=2] | 
|  | } | 
|  |  | 
|  | # | 
|  | # format pages | 
|  | # | 
|  | for(i in $files) | 
|  | $cmd $i | 
|  |  |