mirror of
https://github.com/Stichting-MINIX-Research-Foundation/netbsd.git
synced 2025-09-14 17:50:04 -04:00
300 lines
6.9 KiB
Bash
300 lines
6.9 KiB
Bash
#! /bin/sh
|
|
|
|
# groffer - display groff files
|
|
|
|
# Source file position: <groff-source>/contrib/groffer/groffer.sh
|
|
|
|
# Copyright (C) 2001,2002,2003,2004,2005
|
|
# Free Software Foundation, Inc.
|
|
# Written by Bernd Warken
|
|
|
|
# This file is part of `groffer', which is part of `groff' version
|
|
# @VERSION@. See $_GROFF_VERSION.
|
|
|
|
# `groff' is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2, or (at your option)
|
|
# any later version.
|
|
|
|
# `groff' is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with `groff'; see the files COPYING and LICENSE in the top
|
|
# directory of the `groff' source. If not, write to the Free Software
|
|
# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301,
|
|
# USA.
|
|
|
|
########################################################################
|
|
|
|
_PROGRAM_VERSION='0.9.22';
|
|
_LAST_UPDATE='22 August 2005';
|
|
|
|
export _PROGRAM_VERSION;
|
|
export _LAST_UPDATE;
|
|
|
|
export GROFFER_OPT; # option environment for groffer
|
|
|
|
export _CONF_FILE_ETC; # configuration file in /etc
|
|
export _CONF_FILE_HOME; # configuration file in $HOME
|
|
export _CONF_FILES; # configuration files
|
|
_CONF_FILE_ETC='/etc/groff/groffer.conf';
|
|
_CONF_FILE_HOME="${HOME}/.groff/groffer.conf";
|
|
_CONF_FILES="${_CONF_FILE_ETC} ${_CONF_FILE_HOME}";
|
|
|
|
# characters
|
|
|
|
export _AT;
|
|
export _SP;
|
|
export _SQ;
|
|
export _TAB;
|
|
|
|
_AT='@';
|
|
_SP=' ';
|
|
_SQ="'";
|
|
_TAB=' ';
|
|
|
|
export _ERROR;
|
|
_ERROR='7'; # for syntax errors; no `-1' in `ash'
|
|
|
|
# @...@ constructs
|
|
|
|
export _GROFF_VERSION
|
|
_GROFF_VERSION='@VERSION@';
|
|
if test _@VERSION@_ = _${_AT}VERSION${_AT}_
|
|
then
|
|
_GROFF_VERSION='1.19.2';
|
|
fi;
|
|
|
|
export _AT_BINDIR_AT;
|
|
export _AT_G_AT;
|
|
export _AT_LIBDIR_AT;
|
|
export _GROFFER_LIBDIR;
|
|
if test _@BINDIR@_ = _${_AT}BINDIR${_AT}_
|
|
then
|
|
# script before `make'
|
|
_AT_BINDIR_AT='.';
|
|
_AT_G_AT='';
|
|
_AT_LIBDIR_AT='';
|
|
_GROFFER_LIBDIR='.';
|
|
else
|
|
_AT_BINDIR_AT='@BINDIR@';
|
|
_AT_G_AT='@g@';
|
|
_AT_LIBDIR_AT='@libdir@';
|
|
_GROFFER_LIBDIR="${_AT_LIBDIR_AT}"'/groff/groffer';
|
|
fi;
|
|
|
|
export _GROFFER_SH; # file name of this shell script
|
|
case "$0" in
|
|
*groffer*)
|
|
_GROFFER_SH="$0";
|
|
# was: _GROFFER_SH="${_AT_BINDIR_AT}/groffer";
|
|
;;
|
|
*)
|
|
echo 'The groffer script should be started directly.' >&2
|
|
exit 1;
|
|
;;
|
|
esac;
|
|
|
|
export _GROFFER2_SH; # file name of the script that follows up
|
|
_GROFFER2_SH="${_GROFFER_LIBDIR}"/groffer2.sh;
|
|
|
|
export _NULL_DEV;
|
|
if test -c /dev/null
|
|
then
|
|
_NULL_DEV="/dev/null";
|
|
else
|
|
_NULL_DEV="NUL";
|
|
fi;
|
|
|
|
|
|
# Test of the `$()' construct.
|
|
if test _"$(echo "$(echo 'test')")"_ \
|
|
!= _test_
|
|
then
|
|
echo 'The "$()" construct did not work.' >&2;
|
|
exit "${_ERROR}";
|
|
fi;
|
|
|
|
# Test of sed program
|
|
if test _"$(echo red | sed -e 's/r/s/')"_ != _sed_
|
|
then
|
|
echo 'The sed program did not work.' >&2;
|
|
exit "${_ERROR}";
|
|
fi;
|
|
|
|
|
|
########################### configuration
|
|
|
|
# read and transform the configuration files, execute the arising commands
|
|
for f in "${_CONF_FILE_HOME}" "${_CONF_FILE_ETC}"
|
|
do
|
|
if test -f "$f"
|
|
then
|
|
o=""; # $o means groffer option
|
|
# use "" quotes because of ksh and posh
|
|
eval "$(cat "$f" | sed -n -e '
|
|
# Ignore comments
|
|
/^['"${_SP}${_TAB}"']*#/d
|
|
# Delete leading and final space
|
|
s/^['"${_SP}${_TAB}"']*//
|
|
s/['"${_SP}${_TAB}"']*$//
|
|
# Print all shell commands
|
|
/^[^-]/p
|
|
# Replace empty arguments
|
|
s/^\(-[^ ]*\)=$/o="${o} \1 '"${_SQ}${_SQ}"'"/p
|
|
# Replace division between option and argument by single space
|
|
s/[='"${_SP}${_TAB}"']['"${_SP}${_TAB}"']*/'"${_SP}"'/
|
|
# Handle lines without spaces
|
|
s/^\(-[^'"${_SP}"']*\)$/o="${o} \1"/p
|
|
# Print options that have their argument encircled with single quotes
|
|
/^-[^ ]* '"${_SQ}"'.*'"${_SQ}"'$/s/^.*$/o="${o} &"/p
|
|
# Replace encircled double quotes by single quotes and print the result
|
|
s/^\(-[^ ]*\) "\(.*\)"$/o="${o} \1 '"${_SQ}"'\2'"${_SQ}"'"/p
|
|
# Encircle the remaining arguments with single quotes
|
|
s/^\(-[^ ]*\) \(.*\)$/o="${o} \1 '"${_SQ}"'\2'"${_SQ}"'"/p
|
|
')"
|
|
if test _"${o}"_ != __
|
|
then
|
|
if test _"{GROFFER_OPT}"_ = __
|
|
then
|
|
GROFFER_OPT="${o}";
|
|
else
|
|
GROFFER_OPT="${o} ${GROFFER_OPT}";
|
|
fi;
|
|
fi;
|
|
fi;
|
|
done;
|
|
|
|
# integrate $GROFFER_OPT into the command line; it isn't needed any more
|
|
if test _"${GROFFER_OPT}"_ != __
|
|
then
|
|
eval set x "${GROFFER_OPT}" '"$@"';
|
|
shift;
|
|
GROFFER_OPT='';
|
|
fi;
|
|
|
|
|
|
########################### Determine the shell
|
|
|
|
export _SHELL;
|
|
|
|
# use "``" instead of "$()" for using the case ")" construct
|
|
# do not use "" quotes because of ksh
|
|
_SHELL=`
|
|
# $x means list.
|
|
# $s means shell.
|
|
# The command line arguments are taken over.
|
|
# Shifting herein does not have an effect outside.
|
|
export x;
|
|
case " $*" in
|
|
*\ --sh*) # abbreviation for --shell
|
|
x='';
|
|
s='';
|
|
# determine all --shell arguments, store them in $x in reverse order
|
|
while test $# != 0
|
|
do
|
|
case "$1" in
|
|
--shell|--sh|--she|--shel)
|
|
if test "$#" -ge 2
|
|
then
|
|
s="$2";
|
|
shift;
|
|
fi;
|
|
;;
|
|
--shell=*|--sh=*|--she=*|--shel=*)
|
|
# delete up to first "=" character
|
|
s="$(echo x"$1" | sed -e 's/^x[^=]*=//')";
|
|
;;
|
|
*)
|
|
shift;
|
|
continue;
|
|
esac;
|
|
if test _"${x}"_ = __
|
|
then
|
|
x="'${s}'";
|
|
else
|
|
x="'${s}' ${x}";
|
|
fi;
|
|
shift;
|
|
done;
|
|
|
|
# from all possible shells in $x determine the first being a shell
|
|
# or being empty
|
|
s="$(
|
|
# "" quotes because of posh
|
|
eval set x "${x}";
|
|
shift;
|
|
if test $# != 0
|
|
then
|
|
for i
|
|
do
|
|
if test _"$i"_ = __
|
|
then
|
|
# use the empty argument as the default shell
|
|
echo empty;
|
|
break;
|
|
else
|
|
# test $i on being a shell program;
|
|
# use this kind of quoting for posh
|
|
if test _"$(eval "$i -c 'echo ok'" 2>${_NULL_DEV})"_ = _ok_ >&2
|
|
then
|
|
# shell found
|
|
cat <<EOF
|
|
${i}
|
|
EOF
|
|
break;
|
|
else
|
|
# if not being a shell go on searching
|
|
continue;
|
|
fi;
|
|
fi;
|
|
done;
|
|
fi;
|
|
)";
|
|
if test _"${s}"_ != __
|
|
then
|
|
cat <<EOF
|
|
${s}
|
|
EOF
|
|
fi;
|
|
;;
|
|
esac;
|
|
`
|
|
|
|
########################### test fast shells for automatic run
|
|
|
|
if test _"${_SHELL}"_ = __
|
|
then
|
|
for s in ksh ash dash pdksh zsh posh
|
|
do
|
|
if test _"$(eval "$s -c 'echo ok'" 2>${_NULL_DEV})"_ = _ok_ >&2
|
|
then
|
|
_SHELL="$s";
|
|
break;
|
|
fi;
|
|
done;
|
|
fi;
|
|
|
|
|
|
########################### start groffer2.sh
|
|
|
|
if test _"${_SHELL}"_ = _empty_
|
|
then
|
|
_SHELL='';
|
|
fi;
|
|
|
|
if test _"${_SHELL}"_ = __
|
|
then
|
|
# no shell found, so start groffer2.sh normally
|
|
eval exec "'${_GROFFER2_SH}'" '"$@"';
|
|
exit;
|
|
else
|
|
# start groffer2.sh with the found $_SHELL
|
|
# do not quote $_SHELL to allow arguments
|
|
eval exec "${_SHELL} '${_GROFFER2_SH}'" '"$@"';
|
|
exit;
|
|
fi;
|