Add ability to decompress different format manual pages.

Add support for .so directive in manual pages.

Approved by:	mentor (wes@)
This commit is contained in:
Gordon Tetlow 2010-12-03 02:07:34 +00:00
parent ee7d7a769c
commit 57cd97175a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=216140

View File

@ -94,6 +94,7 @@ check_cat() {
if exists "$1"; then
use_cat=yes
catpage=$found
setup_cattool $catpage
decho " Found catpage $catpage"
return 0
else
@ -108,12 +109,14 @@ check_man() {
if exists "$1"; then
# We have a match, check for a cat page
manpage=$found
setup_cattool $manpage
decho " Found manpage $manpage"
if exists "$2" && is_newer $found $manpage; then
# cat page found and is newer, use that
use_cat=yes
catpage=$found
setup_cattool $catpage
decho " Using catpage $catpage"
else
# no cat page or is older
@ -240,6 +243,35 @@ manpath_warnings() {
fi
}
# Usage: man_check_for_so page path
# Returns: True if able to resolve the file, false if it ended in tears.
# Detects the presence of the .so directive and causes the file to be
# redirected to another source file.
man_check_for_so() {
local IFS line tstr
unset IFS
# We need to loop to accommodate multiple .so directives.
while true
do
line=$($cattool $manpage | head -1)
case "$line" in
.so*) trim "${line#.so}"
decho "$manpage includes $tstr"
# Glob and check for the file.
if ! check_man "$path/$tstr*" ""; then
decho " Unable to find $tstr"
return 1
fi
;;
*) break ;;
esac
done
return 0
}
# Usage: man_display_page
# Display either the manpage or catpage depending on the use_cat variable
man_display_page() {
@ -258,10 +290,10 @@ man_display_page() {
ret=0
else
if [ $debug -gt 0 ]; then
decho "Command: $ZCAT $catpage | $PAGER"
decho "Command: $cattool $catpage | $PAGER"
ret=0
else
eval "$ZCAT $catpage | $PAGER"
eval "$cattool $catpage | $PAGER"
ret=$?
fi
fi
@ -343,10 +375,10 @@ man_display_page() {
fi
if [ $debug -gt 0 ]; then
decho "Command: $ZCAT $manpage | $pipeline"
decho "Command: $cattool $manpage | $pipeline"
ret=0
else
eval "$ZCAT $manpage | $pipeline"
eval "$cattool $manpage | $pipeline"
ret=$?
fi
}
@ -361,10 +393,13 @@ man_find_and_display() {
case "$1" in
*/*) if [ -f "$1" -a -r "$1" ]; then
decho "Found a usable page, displaying that"
found_page=yes
unset use_cat
manpage="$1"
man_display_page
setup_cattool $manpage
if man_check_for_so $manpage $(dirname $manpage); then
found_page=yes
man_display_page
fi
return
fi
;;
@ -380,35 +415,41 @@ man_find_and_display() {
# Check if there is a MACHINE specific manpath.
if find_file $p $sect $MACHINE "$1"; then
found_page=yes
man_display_page
if [ -n "$aflag" ]; then
continue 2
else
return
if man_check_for_so $manpage $p; then
found_page=yes
man_display_page
if [ -n "$aflag" ]; then
continue 2
else
return
fi
fi
fi
# Check if there is a MACHINE_ARCH
# specific manpath.
if find_file $p $sect $MACHINE_ARCH "$1"; then
found_page=yes
man_display_page
if [ -n "$aflag" ]; then
continue 2
else
return
if man_check_for_so $manpage $p; then
found_page=yes
man_display_page
if [ -n "$aflag" ]; then
continue 2
else
return
fi
fi
fi
# Check plain old manpath.
if find_file $p $sect '' "$1"; then
found_page=yes
man_display_page
if [ -n "$aflag" ]; then
continue 2
else
return
if man_check_for_so $manpage $p; then
found_page=yes
man_display_page
if [ -n "$aflag" ]; then
continue 2
else
return
fi
fi
fi
done
@ -749,6 +790,19 @@ search_whatis() {
exit $rval
}
# Usage: setup_cattool page
# Finds an appropriate decompressor based on extension
setup_cattool() {
case "$1" in
*.bz) cattool='/usr/bin/bzcat' ;;
*.bz2) cattool='/usr/bin/bzcat' ;;
*.gz) cattool='/usr/bin/zcat' ;;
*.lzma) cattool='/usr/bin/lzcat' ;;
*.xz) cattool='/usr/bin/xzcat' ;;
*) cattool='/usr/bin/zcat -f' ;;
esac
}
# Usage: setup_pager
# Correctly sets $PAGER
setup_pager() {
@ -845,11 +899,11 @@ TBL=/usr/bin/tbl
TROFF='/usr/bin/groff -S -man'
REFER=/usr/bin/refer
VGRIND=/usr/bin/vgrind
ZCAT='/usr/bin/zcat -f'
debug=0
man_default_sections='1:1aout:8:2:3:n:4:5:6:7:9:l'
man_default_path='/usr/share/man:/usr/share/openssl/man:/usr/local/man'
cattool='/usr/bin/zcat -f'
config_global='/etc/man.conf'