[comp.sys.sgi] BSD style man

ip@me.utoronto.ca (Bevis Ip) (03/10/89)

Here are three shell scripts I wrote quite a while ago for BSD style "man".
This "man" runs much faster than SGI's own but you have to run
"makemanpaths" (and "makewhatis", although not really necessary) whenever you
have new man page entries.  This version of "makewhatis" is more efficient
(in my opinion) than the one Dave Ciemiewicz (ciemo@bananapc.SGI.COM) just
posted, although it still takes about 10 minutes to finish.  The scripts are
geared at IRIS 4D running IRIX 3.1 (evolved from those I wrote back in IRIX
2.2 days).  Sorry, no man page either.

bevis

------------CUT-----------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	makemanpaths
#	makewhatis
#	man
# This archive created: Thu Mar  9 19:06:38 1989
export PATH; PATH=/bin:$PATH
if test -f 'makemanpaths'
then
	echo shar: will not over-write existing file "'makemanpaths'"
else
cat << \SHAR_EOF > 'makemanpaths'
#!/bin/sh
#  Build man pages path for faster location.
#
#	CopyRight (C) 1989 by Bevis Ip, all rights reserved.
#
#	Email: ip@me.toronto.edu, uunet!utai!me!ip
#
#	Everyone is granted the permission to copy, modify and redistribute
#	this program provided that this notice is remain attached.  The
#	authour assumes no liability of any kind in connection with the
#	usage of this code.  Use it at your own risk.
#
MANPATHS=${1-/usr/local/lib/manpaths}
cd /usr/catman
trap '' 1 2 3 15
rm -f $MANPATHS
find . ! -type directory -print | sed 's/^.\///' | sort -t/ -2 > $MANPATHS
chmod 444 $MANPATHS
SHAR_EOF
chmod +x 'makemanpaths'
fi # end of overwriting check
if test -f 'makewhatis'
then
	echo shar: will not over-write existing file "'makewhatis'"
else
cat << \SHAR_EOF > 'makewhatis'
#!/bin/sh
#  Build BSD style whatis database for whatis (man -f) and apropos (man -k).
#
#  This is a hack; worked backward from the formatted, packed catman pages.
#  (3G) man pages had been formatted strangely and require special treatment.
#
#	CopyRight (C) 1989 by Bevis Ip, all rights reserved.
#
#	Email: ip@me.toronto.edu, uunet!utai!me!ip
#
#	Everyone is granted the permission to copy, modify and redistribute
#	this program provided that this notice is remain attached.  The
#	authour assumes no liability of any kind in connection with the
#	usage of this code.  Use it at your own risk.
#
WHATIS=${1-/usr/local/lib/whatis}
TMP=/tmp/whatis
MANDIR=/usr/catman

> $TMP
for i in `find $MANDIR -type d -print`
do
	cd $i
	if [ "`echo *.z`" = "*.z" ]
	then
		continue
	fi
	case $i in
	$MANDIR/g_man/cat3/*)	# no section info @#$%^&*(
		pcat `find . ! -type l -name \*.z -print` | col -b | \
			sed -n -e '/^ *$/d' \
			-e '/^ *NAME$/b getname' -e b \
			-e :getname -e n -e h -e :getmore -e n \
			-e '/.*SY.*SIS/b gotit' \
			-e '/.*DESC/b gotit' \
			-e '/.*SPEC/b gotit' \
			-e H -e "b getmore" \
			-e :gotit -e x \
			-e 's/\n/(3G) /' -e 's/\n/ /g' \
			-e 's/[	 ][	 ]*/ /g;p' \
			>> $TMP
		continue
		;;
	esac
	pcat `find . ! -type l -name \*.z -print` | col -b | \
		sed -n -e '/^ *$/d' \
		-e '/^ *.*([0-9].*) *.*([0-9].*)$/b getsect' \
		-e '/^ *NAME$/b getname' -e b -e :getname -e n \
		-e '/.*SY.*SIS/b gotit' \
		-e '/.*DESC/b gotit' \
		-e '/.*SPEC/b gotit' \
		-e H -e "b getname" \
		-e :gotit -e x \
		-e 's/\n/ /g' -e 's/[	 ][	 ]*/ /g;p;b' \
		-e :getsect -e 's/^ *.*(/(/' \
		-e 's/  *.*$//;h' \
		>> $TMP
done

trap '' 1 2
rm -f $WHATIS

awk '{	gotit=0
	printf "%s", $2
	for (i = 3; i <= NF; i++) {
		if ($i == "-") {
			if (gotit++ == 0)
				printf " %s\t-", $1
			else
				printf " -"
		} else {
			if ($i ~ /.*-$/) {
#				end=length($i)-1
#				printf " %s", substr($i, 1, end)
				printf " %s", $i
				if (++i <= NF)
					printf "%s", $i
			} else
				printf " %s", $i
		}
	}
	if (gotit == 0)
		printf " %s", $1
	printf "\n"
}' $TMP | sort -u > $WHATIS

chmod 444 $WHATIS
SHAR_EOF
chmod +x 'makewhatis'
fi # end of overwriting check
if test -f 'man'
then
	echo shar: will not over-write existing file "'man'"
else
cat << \SHAR_EOF > 'man'
#!/bin/sh
#  This is model to BSD man; quick and dirty but fast.
#
#	CopyRight (C) 1989 by Bevis Ip, all rights reserved.
#
#	Email: ip@me.toronto.edu, uunet!utai!me!ip
#
#	Everyone is granted the permission to copy, modify and redistribute
#	this program provided that this notice is remain attached.  The
#	authour assumes no liability of any kind in connection with the
#	usage of this code.  Use it at your own risk.
#
#MAKEMANPATHS=/usr/local/bin/makemanpaths
REALMAN=/usr/bin/man
MANPATHS=/usr/local/lib/manpaths
WHATIS=/usr/local/lib/whatis
PAGER=${MANPAGER-${PAGER-'less -sbp50'}}

args="$@"
for i
do
	case $i in
	[1-8][Cc])
		std=1
		case $i in
		1?) sec="cat1.*" ;;	2?) sec="cat2.*" ;;
		3?) sec="cat3.*" ;;	4?) sec="cat4.*" ;;
		5?) sec="cat5.*" ;;	6?) sec="cat6.*" ;;
		7?) sec="cat7.*" ;;	8?) sec="cat8.*" ;;
		esac ;;
	[1-8][Ff])
		ftn=1
		case $i in
		1?) sec="cat1.*" ;;	2?) sec="cat2.*" ;;
		3?) sec="cat3.*" ;;	4?) sec="cat4.*" ;;
		5?) sec="cat5.*" ;;	6?) sec="cat6.*" ;;
		7?) sec="cat7.*" ;;	8?) sec="cat8.*" ;;
		esac ;;
	[1-8])	sec="cat$i.*" ;;
	-w)	path=1 ;;
	-T*)	TERM="`echo $i | sed 's/-T//'`" ; export TERM ;;
	-k)	apropos=1 ;;
	-f)	whatis=1 ;;
	-*)	usage=1 ; break ;;
	*)	break ;;
	esac
	shift
done

if test -n "$usage" -o $# -eq 0
then
	echo "Usage: man [-w] [sec] name ..." >&2
	echo "       man [-k] key ..." >&2
	exit 1
fi

if test -n "$apropos"
then
	for i in "$@"
	do	grep -i "$i" $WHATIS
	done
	exit 0
elif test -n "$whatis"
then
	for i in "$@"
	do	egrep "^$i[	 ,]|, $i" $WHATIS
	done
	exit 0
fi

if test ! -s $MANPATHS
then
#	echo "Building manpaths, hang on..."
#	exec $MAKEMANPATHS $MANPATHS
	echo "No manpaths, starting up $REALMAN..."
	exec $REALMAN $args
fi

cd $MANDIR
for target
do
	manpages="$manpages `grep \"$sec/$target.z\$\" $MANPATHS 2>&-`"
done

# make fortran pages last (usually not what people's looking for)
for i in $manpages
do
	case $i in
		*/ftn/*)	ftnpages="$ftnpages $i" ;;
		*)		stdpages="$stdpages $i" ;;
	esac
done

if test -n "$std"
then
	manpages=$stdpages
elif test -n "$ftn"
then
	manpages=$ftnpages
else
	manpages=$stdpages$ftnpages
fi

if test -z "$manpages"
then
	if test -n "$sec"
	then
		set $args; sec=$1; shift
		echo "No entry for $* in section $sec of the manual."
	else
		echo "No manual entry for $*."
	fi
	exit 1
fi
if test -n "$path"
then	
	echo $manpages
	exit 0
fi

bold=`tput smso`
boldoff=`tput rmso`

set $manpages
trap '' 2
pcat $1 | col | eval $PAGER
trap 2
while :
do
   	shift
   	if test $# -eq 0
	then
		exit 0
   	fi
	echo "${bold}----> $1 [$#] <---- (More?) ${boldoff}\c"
	read cmd
	case "$cmd" in
		n*|N*)	continue ;;
		q*|Q*)	exit 0 ;;
	esac
	trap '' 2
	pcat $1 | col | eval $PAGER
	trap 2
done
SHAR_EOF
chmod +x 'man'
fi # end of overwriting check
#	End of shell archive
exit 0
-- 
Bevis Ip 	University of Toronto Mechanical Engineering
CSNET   : ip@me.toronto.edu		BITNET: ip@me.UTORONTO
Internet: ip%me.toronto.edu@relay.cs.net
UUCP    : {allegra,decwrl,decvax}!utcsri!me!ip _OR_ {pyramid,uunet}!utai!me!ip