7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#!/usr/bin/ksh93
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER START
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# The contents of this file are subject to the terms of the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Common Development and Distribution License (the "License").
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You may not use this file except in compliance with the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# or http://www.opensolaris.org/os/licensing.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# See the License for the specific language governing permissions
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# and limitations under the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# When distributing Covered Code, include this CDDL HEADER in each
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# If applicable, add the following below this CDDL HEADER, with the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# fields enclosed by brackets "[]" replaced with your own identifying
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# information: Portions Copyright [yyyy] [name of copyright owner]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER END
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Make sure all math stuff runs in the "C" locale to avoid problems
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# with alternative # radix point representations (e.g. ',' instead of
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# '.' in de_DE.*-locales). This needs to be set _before_ any
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# floating-point constants are defined in this script).
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ "${LC_ALL}" != "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin export \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin LC_MONETARY="${LC_ALL}" \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin LC_MESSAGES="${LC_ALL}" \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin LC_COLLATE="${LC_ALL}" \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin LC_CTYPE="${LC_ALL}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset LC_ALL
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexport LC_NUMERIC=C
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction fatal_error
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 "${progname}: $*"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin exit 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction debug_print
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # don't use "--" here to allow "-f" for formatting
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# print -u2 "$@"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Build a list of compound variables calculated from MANPATH and
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# locale which contain...
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# "manpath_element" - the MANPATH element this entry belongs to
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# "dir" - physical directory of "manpath_element"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# "sect" - section (if "manpath_element" is something like /usr/share/man,1b)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# ... and put the result in the array named by argv[1]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction enumerate_mandirs
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref md=$1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset manpath_element dir sect manlang
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer i=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${LC_MESSAGES}" != "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin manlang="${LC_MESSAGES}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin manlang="${LANG}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -r -- "${MANPATH//:/$'\n'}" | while read manpath_element ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # strip section from manpath elements like "/usr/share/man,1b"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dir="${manpath_element/~(E)(.*),(.*)/\1}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sect="${manpath_element/~(E)(.*),(.*)/\2}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ "${sect}" == "${dir}" ]] && sect=""
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${manlang}" != "" && -d "${dir}/${manlang}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin md+=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin manpath_element="${manpath_element}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dir="${dir}/${manlang}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sect="${sect}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ -d "${dir}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin md+=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin manpath_element="${manpath_element}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dir="${dir}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sect="${sect}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction enumerate_mansects
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref ms=$1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref mandir_node=$2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset mancf="${mandir_node.dir}/man.cf"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset x s l
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${mandir_node.sect}" != "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x="${mandir_node.sect}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin elif [[ "${MANSECTS}" != "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x="${MANSECTS//,/$'\n'}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin elif [[ -f "${mancf}" && -r "${mancf}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x="$(egrep -v '^#|^[[:space:]]*$' <"${mancf}" | egrep '^MANSECTS=')"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x="${x/MANSECTS=}/"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x="${x//,/$'\n'}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x="$(cd "${mandir_node.dir}" ; \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ls -1d ~(El)(sman|man).*/ | \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while read s ; do \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s="${s/~(El)(sman|man)/}" ; \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s="${s/~(Er)\//}" ; \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -r -- "$s" ; \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done)"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while read l ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ "${l}" != ~(Elr)[[:blank:]]* ]] && ms+=( "${l}" )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# print -- "sect=$l"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done <<<"${x}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# printf "enumerate_mansects: found %d entries.\n" ${#ms[@]}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# wrapper around more/less
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction browse_manpage
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tmpdirname
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset doc_filename="$1"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset doc_title="$2"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # squish characters in filename which are not allowed in a filesystem
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # (currently '/')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin doc_title="${doc_title//\//}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # check if we have "less" installed, if not fall back to /usr/xpg4/bin/more
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if which less >/dev/null 2>&1 ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # use "cat" here to avoid that "less" may try funny things
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cat <"${doc_filename}" | less -I -M $"--prompt=MManual\ page\ ${doc_title}\ ?ltline\ %lt?L/%L.:"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner tmpdirname="$(mktemp -t -d "shman_${PPID}_$$_XXXXXX")"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mkdir -p "${tmpdirname}" || { print -u2 -f $"Couldn't create tmp. dir %s\n" "${tmpdirname}" ; return 1 ; }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cd "${tmpdirname}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # note: we need to support /dev/stdin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cat <"${doc_filename}" >"./${doc_title}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /usr/xpg4/bin/more "${doc_title}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin rm -f "${doc_title}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin rmdir "${tmpdirname}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# /usr/bin/man <keyword>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction show_manpage
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz compound -a mandirs
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer i
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer j
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin enumerate_mandirs mandirs
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# debug_print -- "${mandirs[@]}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer num_mandirs=${#mandirs[@]}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for ((i=0 ; i < num_mandirs ; i++ )) ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset mandir="${mandirs[i].dir}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a mansects
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin enumerate_mansects mansects "mandirs[$i]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer num_mansects="${#mansects[@]}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# debug_print -- "mansects=${mansects[@]}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for ((j=0 ; j < num_mansects ; j++ )) ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset mansect="${mansects[j]}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # try 1: SGML manpage
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset match="${mandir}/sman${mansect}/${manname}.${mansect}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ -r "${match}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset note nlink
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # follow SGML links if needed (needs rework, including protection against link loops)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while true ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin debug_print -f "match: %s\n" "${match}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tmp="$(cd "${mandir}" ; LC_MESSAGES=C /usr/lib/sgml/sgml2roff "${match}")"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin read note nlink <<<"${tmp}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${note}" == ".so" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin match="${nlink}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tbl <<<"${tmp}" | eqn | nroff -u0 -Tlp -man - | col -x | browse_manpage /dev/stdin "${manname}(${mansect})"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # try 2: troff manpage
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin match="${mandir}/man${mansect}/${manname}.${mansect}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ -r "${match}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin debug_print -f "match: %s\n" "${match}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tbl <"${match}" | eqn | nroff -u0 -Tlp -man - | col -x | browse_manpage /dev/stdin "${manname}(${mansect})"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset mansects num_mansects
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin printf $"No manual entry for %s.\n" "${manname}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# /usr/bin/man -l <keyword>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction list_manpages
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz compound -a mandirs
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin enumerate_mandirs mandirs
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #debug_print -- "${mandirs[@]}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer num_mandirs=${#mandirs[@]}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for ((i=0 ; i < num_mandirs ; i++ )) ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset mandir="${mandirs[i].dir}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a mansects
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin enumerate_mansects mansects "mandirs[$i]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer num_mansects="${#mansects[@]}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# debug_print -- "mansects=${mansects[@]}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for ((j=0 ; j < num_mansects ; j++ )) ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mansect="${mansects[j]}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # try 1: SGML manpage
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin match="${mandir}/sman${mansect}/${manname}.${mansect}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ -r "${match}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin printf "%s (%s)\t-M %s\n" "${manname}" "${mansect}" "${mandir}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # try 2: troff manpage
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin match="${mandir}/man${mansect}/${manname}.${mansect}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ -r "${match}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin printf "%s (%s)\t-M %s\n" "${manname}" "${mansect}" "${mandir}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset mansects num_mansects
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# /usr/bin/appropos
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction list_keywords
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a mandirs
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset name namesec title
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin enumerate_mandirs mandirs
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #debug_print -- "${mandirs[@]}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer num_mandirs=${#mandirs[@]}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for ((i=0 ; i < num_mandirs ; i++ )) ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset mandir="${mandirs[i].dir}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset windexfile="${mandir}/windex"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ ! -r "${windexfile}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 -f $"%s: Can't open %s.\n" "${progname}" "${windexfile}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while IFS=$'\t' read name namesec title ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${name}${namesec}${title}" == ~(Fi)${manname} ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin printf "%s\t%s\t%s\n" "${name}" "${namesec}" "${title}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done <"${windexfile}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction usage
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin OPTIND=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin getopts -a "${progname}" "${man_usage}" OPT '-?'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin exit 2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# program start
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbuiltin basename
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbuiltin cat
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbuiltin date
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset progname="$(basename "${0}")"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -r man_usage=$'+
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner[-?\n@(#)\$Id: shman (Roland Mainz) 2009-12-02 \$\n]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[-author?Roland Mainz <roland.mainz@nrubsig.org>]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[-author?Roland Mainz <roland.mainz@sun.com>]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+NAME?man - find and display reference manual pages]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+DESCRIPTION?The man command displays information from the reference
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin manuals. It displays complete manual pages that you select
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin by name, or one-line summaries selected either by keyword
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (-k), or by the name of an associated file (-f). If no
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin manual page is located, man prints an error message.]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+?write me.]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[k:keyword?Prints out one-line summaries from the windex database (table of contents) that
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin contain any of the given keywords. The windex database is created using
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin catman(1M).]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[l:list?Lists all manual pages found matching name within the search path.]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[M:mpath?Specifies an alternate search path for manual pages. path is a colon-separated
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin list of directories that contain manual page directory subtrees. For example, if
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin path is /usr/share/man:/usr/local/man, man searches for name in the standard
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin location, and then /usr/local/man. When used with the -k or -f options, the -M
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin option must appear first. Each directory in the path is assumed to contain subdirectories of the form man* or sman* ,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin one for each section. This option overrides the MANPATH environment variable.]:[path]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[s:section?Specifies sections of the manual for man to search. The directories searched for
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin name are limited to those specified by section. section can be a numerical
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin digit, perhaps followed by one or more letters to match the desired section of
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin the manual, for example, "3libucb". Also, section can be a word, for example,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin local, new, old, public. section can also be a letter.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin To specify multiple sections, separate each section with
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a comma. This option overrides the MANPATH environment variable and the man.cf
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin file.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin See Search Path below for an explanation of how man conducts its search.]:[section]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinname
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+SEE ALSO?\bksh93\b(1), \bman\b(1)]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset do_list=false
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset do_keyword=false
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinwhile getopts -a "${progname}" "${man_usage}" OPT ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case ${OPT} in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin M) MANPATH="${OPTARG}" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin l) do_list=true ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin k) do_keyword=true ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s) MANSECTS="${OPTARG}" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *) usage ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinshift $((OPTIND-1))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# cd /usr/man; LC_MESSAGES=C /usr/lib/sgml/sgml2roff /usr/man/sman1as/asadmin-list-timers.1as | tbl | eqn | nroff -u0 -Tlp -man - | col -x > /tmp/mpLQaqac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# prechecks
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(( $# > 0 )) || usage
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# process arguments
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzwhile (( $# > 0 )) ; do
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset manname="$1"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz shift
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz debug_print -f "# searching for %s ...\n" "${manname}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ${do_keyword} ; then
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz list_keywords
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz elif ${do_list} ; then
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz list_manpages
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz show_manpage
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# todo: better exit codes
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexit 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# EOF.