xref: /plan9/rc/bin/man (revision ea005eaf856f7225007c246955582d1bfae7be47)
1#!/bin/rc
2# man - print manual pages
3rfork e
4
5. /sys/man/fonts
6
7cmd=n
8sec=()
9S=/sys/man
10d=0
11
12fn roff {
13	preproc=()
14	postproc=cat
15	x=`{doctype $2}
16	if (~ $1 t) {
17		if(~ $x *grap*)
18			preproc=($preproc grap)
19		if(~ $x *pic*)
20			preproc=($preproc pic)
21		Nflag=-Tutf
22	}
23	if not {
24		Nflag='-N'
25		Lflag='-rL1000i'
26		# setting L changes page length to infinity (sed script removes empty lines)
27		if (grep -s '^\.(2C|sp *[0-9]*\.)' $2)
28			postproc=col
29	}
30	if(~ $x *eqn*)
31		preproc=($preproc eqn)
32	if(~ $x *tbl*)
33		preproc=($preproc tbl)
34	{echo -n $FONTS; cat $2 </dev/null} |
35		switch($#preproc) {
36		case 0
37			troff $Nflag $Lflag -$MAN
38		case 1
39			$preproc | troff $Nflag $Lflag -$MAN
40		case 2
41			$preproc(1) | $preproc(2) | troff $Nflag $Lflag -$MAN
42		case 3
43			$preproc(1) | $preproc(2) | $preproc(3) |
44				troff $Nflag $Lflag -$MAN
45		case *
46			$preproc(1) | $preproc(2) | $preproc(3) |
47				$preproc(4) | troff $Nflag $Lflag -$MAN
48		} | $postproc
49}
50
51fn page {
52	if(test -d /mnt/wsys/acme)
53		/bin/page -w
54	if not
55		/bin/page
56}
57
58
59search=yes
60while(~ $d 0) {
61	if(~ $#* 0) {
62		echo 'Usage: man [-bntpPSw] [0-9] [0-9] ... name1 name2 ...' >[1=2]
63		exit
64	}
65	if(test -d $S/$1){
66		sec=($sec $1)
67		shift
68	}
69	if not
70		switch($1) {
71		case -b ; cmd=b ; shift
72		case -n ; cmd=n ; shift
73		case -P ; cmd=P ; shift
74		case -p ; cmd=p ; shift
75		case -S ; search=no ; shift
76		case -t ; cmd=t ; shift
77		case -w ; cmd=w ; shift
78		case * ; d=1
79		}
80}
81if(~ $#sec 0) {
82	sec=`{ls -pd $S/[0-9]* }
83}
84ix=$S/$sec/INDEX
85if(~ $#* 1) pat='^'^$1^' '
86if not pat='^('^`{echo $* | sed 's/ /|/g'}^') '
87fils=()
88if(~ $search yes)
89for(i in $S/$sec){
90	if(/bin/test -f $i/INDEX){
91		try=`{grep -i $pat $i/INDEX | sed 's/^[^ ]* //' | sort -u}
92		if(! ~ $#try 0)
93			fils=($fils $i/$try)
94	}
95}
96# bug: should also do following loop if not all pages found
97if(~ $#fils 0) {
98	# nothing in INDEX. try for file of given name
99	for(i) {
100		if(~ $i intro) i=0intro
101		for(n in $sec) {
102			try=`{echo $S/$n/$i | tr A-Z a-z}
103			if (/bin/test -f $try)
104				fils=($fils $try)
105		}
106	}
107	if(~ $#fils 0) {
108		echo 'man: no manual page' >[1=2]
109		exit 'no man'
110	}
111}
112for(i in $fils) {
113	if(! /bin/test -f $i)
114		echo need $i >[1=2]
115	if not {
116		switch($cmd) {
117		case w
118			echo $i
119
120		case t
121			roff t $i
122
123		case p
124			roff t $i | grep -v '^x X html' | proof
125
126		case P
127			roff t $i | page
128
129		case n
130			roff n $i | sed '
131				${
132        			       /^$/p
133				}
134				//N
135				/^\n$/D'
136
137		case b
138			x=`{echo $i | sed 's;/sys/man/(.*)/(.*);\1 \2;'}
139			if(~ $x(2) 0intro) x=($x(1) intro)
140			roff n $i | sed '
141				${
142        			       /^$/p
143				}
144				//N
145				/^\n$/D' |
146			plumb -i -d edit -a 'action=showdata filename=/man/'$x(2)^'('$x(1)^')'
147		}
148	}
149}
150