xref: /plan9/rc/bin/man (revision ea005eaf856f7225007c246955582d1bfae7be47)
13e12c5d1SDavid du Colombier#!/bin/rc
2c0a4f1a4SDavid du Colombier# man - print manual pages
37dd7cddfSDavid du Colombierrfork e
47dd7cddfSDavid du Colombier
5219b2ee8SDavid du Colombier. /sys/man/fonts
6219b2ee8SDavid du Colombier
73e12c5d1SDavid du Colombiercmd=n
83e12c5d1SDavid du Colombiersec=()
93e12c5d1SDavid du ColombierS=/sys/man
103e12c5d1SDavid du Colombierd=0
113e12c5d1SDavid du Colombier
123e12c5d1SDavid du Colombierfn roff {
133e12c5d1SDavid du Colombier	preproc=()
14c0a4f1a4SDavid du Colombier	postproc=cat
159a747e4fSDavid du Colombier	x=`{doctype $2}
163e12c5d1SDavid du Colombier	if (~ $1 t) {
179a747e4fSDavid du Colombier		if(~ $x *grap*)
189a747e4fSDavid du Colombier			preproc=($preproc grap)
199a747e4fSDavid du Colombier		if(~ $x *pic*)
209a747e4fSDavid du Colombier			preproc=($preproc pic)
213e12c5d1SDavid du Colombier		Nflag=-Tutf
223e12c5d1SDavid du Colombier	}
233e12c5d1SDavid du Colombier	if not {
2401a344a2SDavid du Colombier		Nflag='-N'
2501a344a2SDavid du Colombier		Lflag='-rL1000i'
2601a344a2SDavid du Colombier		# setting L changes page length to infinity (sed script removes empty lines)
27*ea005eafSDavid du Colombier		if (grep -s '^\.(2C|sp *[0-9]*\.)' $2)
28c0a4f1a4SDavid du Colombier			postproc=col
293e12c5d1SDavid du Colombier	}
309a747e4fSDavid du Colombier	if(~ $x *eqn*)
319a747e4fSDavid du Colombier		preproc=($preproc eqn)
329a747e4fSDavid du Colombier	if(~ $x *tbl*)
339a747e4fSDavid du Colombier		preproc=($preproc tbl)
34c0a4f1a4SDavid du Colombier	{echo -n $FONTS; cat $2 </dev/null} |
353e12c5d1SDavid du Colombier		switch($#preproc) {
363e12c5d1SDavid du Colombier		case 0
3701a344a2SDavid du Colombier			troff $Nflag $Lflag -$MAN
383e12c5d1SDavid du Colombier		case 1
3901a344a2SDavid du Colombier			$preproc | troff $Nflag $Lflag -$MAN
409a747e4fSDavid du Colombier		case 2
4101a344a2SDavid du Colombier			$preproc(1) | $preproc(2) | troff $Nflag $Lflag -$MAN
429a747e4fSDavid du Colombier		case 3
43c0a4f1a4SDavid du Colombier			$preproc(1) | $preproc(2) | $preproc(3) |
4401a344a2SDavid du Colombier				troff $Nflag $Lflag -$MAN
459a747e4fSDavid du Colombier		case *
46c0a4f1a4SDavid du Colombier			$preproc(1) | $preproc(2) | $preproc(3) |
4701a344a2SDavid du Colombier				$preproc(4) | troff $Nflag $Lflag -$MAN
48c0a4f1a4SDavid du Colombier		} | $postproc
493e12c5d1SDavid du Colombier}
503e12c5d1SDavid du Colombier
51d61d6377SDavid du Colombierfn page {
52d61d6377SDavid du Colombier	if(test -d /mnt/wsys/acme)
53d61d6377SDavid du Colombier		/bin/page -w
54d61d6377SDavid du Colombier	if not
55d61d6377SDavid du Colombier		/bin/page
56d61d6377SDavid du Colombier}
57d61d6377SDavid du Colombier
58d61d6377SDavid du Colombier
598f856f24SDavid du Colombiersearch=yes
603e12c5d1SDavid du Colombierwhile(~ $d 0) {
613e12c5d1SDavid du Colombier	if(~ $#* 0) {
628f856f24SDavid du Colombier		echo 'Usage: man [-bntpPSw] [0-9] [0-9] ... name1 name2 ...' >[1=2]
633e12c5d1SDavid du Colombier		exit
643e12c5d1SDavid du Colombier	}
655d459b5aSDavid du Colombier	if(test -d $S/$1){
665d459b5aSDavid du Colombier		sec=($sec $1)
675d459b5aSDavid du Colombier		shift
685d459b5aSDavid du Colombier	}
69c0a4f1a4SDavid du Colombier	if not
70c0a4f1a4SDavid du Colombier		switch($1) {
718f856f24SDavid du Colombier		case -b ; cmd=b ; shift
72225077b0SDavid du Colombier		case -n ; cmd=n ; shift
73225077b0SDavid du Colombier		case -P ; cmd=P ; shift
74225077b0SDavid du Colombier		case -p ; cmd=p ; shift
758f856f24SDavid du Colombier		case -S ; search=no ; shift
76225077b0SDavid du Colombier		case -t ; cmd=t ; shift
77225077b0SDavid du Colombier		case -w ; cmd=w ; shift
783e12c5d1SDavid du Colombier		case * ; d=1
793e12c5d1SDavid du Colombier		}
803e12c5d1SDavid du Colombier}
813e12c5d1SDavid du Colombierif(~ $#sec 0) {
82219b2ee8SDavid du Colombier	sec=`{ls -pd $S/[0-9]* }
833e12c5d1SDavid du Colombier}
843e12c5d1SDavid du Colombierix=$S/$sec/INDEX
853e12c5d1SDavid du Colombierif(~ $#* 1) pat='^'^$1^' '
863e12c5d1SDavid du Colombierif not pat='^('^`{echo $* | sed 's/ /|/g'}^') '
873e12c5d1SDavid du Colombierfils=()
888f856f24SDavid du Colombierif(~ $search yes)
893e12c5d1SDavid du Colombierfor(i in $S/$sec){
903e12c5d1SDavid du Colombier	if(/bin/test -f $i/INDEX){
916b0d5c8bSDavid du Colombier		try=`{grep -i $pat $i/INDEX | sed 's/^[^ ]* //' | sort -u}
923e12c5d1SDavid du Colombier		if(! ~ $#try 0)
933e12c5d1SDavid du Colombier			fils=($fils $i/$try)
943e12c5d1SDavid du Colombier	}
953e12c5d1SDavid du Colombier}
963e12c5d1SDavid du Colombier# bug: should also do following loop if not all pages found
973e12c5d1SDavid du Colombierif(~ $#fils 0) {
98219b2ee8SDavid du Colombier	# nothing in INDEX. try for file of given name
993e12c5d1SDavid du Colombier	for(i) {
1008f856f24SDavid du Colombier		if(~ $i intro) i=0intro
1013e12c5d1SDavid du Colombier		for(n in $sec) {
1028f856f24SDavid du Colombier			try=`{echo $S/$n/$i | tr A-Z a-z}
1033e12c5d1SDavid du Colombier			if (/bin/test -f $try)
1043e12c5d1SDavid du Colombier				fils=($fils $try)
1053e12c5d1SDavid du Colombier		}
1063e12c5d1SDavid du Colombier	}
1073e12c5d1SDavid du Colombier	if(~ $#fils 0) {
1083e12c5d1SDavid du Colombier		echo 'man: no manual page' >[1=2]
1099a747e4fSDavid du Colombier		exit 'no man'
1103e12c5d1SDavid du Colombier	}
1113e12c5d1SDavid du Colombier}
1123e12c5d1SDavid du Colombierfor(i in $fils) {
1133e12c5d1SDavid du Colombier	if(! /bin/test -f $i)
1143e12c5d1SDavid du Colombier		echo need $i >[1=2]
1153e12c5d1SDavid du Colombier	if not {
1163e12c5d1SDavid du Colombier		switch($cmd) {
1178f856f24SDavid du Colombier		case w
1188f856f24SDavid du Colombier			echo $i
1198f856f24SDavid du Colombier
1203e12c5d1SDavid du Colombier		case t
1213e12c5d1SDavid du Colombier			roff t $i
1223e12c5d1SDavid du Colombier
1233e12c5d1SDavid du Colombier		case p
124208510e1SDavid du Colombier			roff t $i | grep -v '^x X html' | proof
1253e12c5d1SDavid du Colombier
1267dd7cddfSDavid du Colombier		case P
1277dd7cddfSDavid du Colombier			roff t $i | page
1287dd7cddfSDavid du Colombier
1293e12c5d1SDavid du Colombier		case n
13014414594SDavid du Colombier			roff n $i | sed '
13114414594SDavid du Colombier				${
13214414594SDavid du Colombier        			       /^$/p
13314414594SDavid du Colombier				}
13414414594SDavid du Colombier				//N
13514414594SDavid du Colombier				/^\n$/D'
1368f856f24SDavid du Colombier
1378f856f24SDavid du Colombier		case b
1388f856f24SDavid du Colombier			x=`{echo $i | sed 's;/sys/man/(.*)/(.*);\1 \2;'}
1398f856f24SDavid du Colombier			if(~ $x(2) 0intro) x=($x(1) intro)
1408f856f24SDavid du Colombier			roff n $i | sed '
1418f856f24SDavid du Colombier				${
1428f856f24SDavid du Colombier        			       /^$/p
1438f856f24SDavid du Colombier				}
1448f856f24SDavid du Colombier				//N
1458f856f24SDavid du Colombier				/^\n$/D' |
1468f856f24SDavid du Colombier			plumb -i -d edit -a 'action=showdata filename=/man/'$x(2)^'('$x(1)^')'
1473e12c5d1SDavid du Colombier		}
1483e12c5d1SDavid du Colombier	}
1493e12c5d1SDavid du Colombier}
150