Plan 9 from User Space's /usr/local/plan9/bin/man

#!/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


Space Glenda

Copyright © 2005 Lucent Technologies, Russ Cox, MIT.
See license for details.