1#! /bin/sh 2 3# groffer - display groff files 4 5# Source file position: <groff-source>/contrib/groffer/groffer.sh 6 7# Copyright (C) 2001,2002,2003,2004,2005 8# Free Software Foundation, Inc. 9# Written by Bernd Warken 10 11# This file is part of `groffer', which is part of `groff' version 12# @VERSION@. See $_GROFF_VERSION. 13 14# `groff' is free software; you can redistribute it and/or modify it 15# under the terms of the GNU General Public License as published by 16# the Free Software Foundation; either version 2, or (at your option) 17# any later version. 18 19# `groff' is distributed in the hope that it will be useful, but 20# WITHOUT ANY WARRANTY; without even the implied warranty of 21# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22# General Public License for more details. 23 24# You should have received a copy of the GNU General Public License 25# along with `groff'; see the files COPYING and LICENSE in the top 26# directory of the `groff' source. If not, write to the Free Software 27# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, 28# USA. 29 30######################################################################## 31 32_PROGRAM_VERSION='0.9.22'; 33_LAST_UPDATE='22 August 2005'; 34 35export _PROGRAM_VERSION; 36export _LAST_UPDATE; 37 38export GROFFER_OPT; # option environment for groffer 39 40export _CONF_FILE_ETC; # configuration file in /etc 41export _CONF_FILE_HOME; # configuration file in $HOME 42export _CONF_FILES; # configuration files 43_CONF_FILE_ETC='/etc/groff/groffer.conf'; 44_CONF_FILE_HOME="${HOME}/.groff/groffer.conf"; 45_CONF_FILES="${_CONF_FILE_ETC} ${_CONF_FILE_HOME}"; 46 47# characters 48 49export _AT; 50export _SP; 51export _SQ; 52export _TAB; 53 54_AT='@'; 55_SP=' '; 56_SQ="'"; 57_TAB=' '; 58 59export _ERROR; 60_ERROR='7'; # for syntax errors; no `-1' in `ash' 61 62# @...@ constructs 63 64export _GROFF_VERSION 65_GROFF_VERSION='@VERSION@'; 66if test _@VERSION@_ = _${_AT}VERSION${_AT}_ 67then 68 _GROFF_VERSION='1.19.2'; 69fi; 70 71export _AT_BINDIR_AT; 72export _AT_G_AT; 73export _AT_LIBDIR_AT; 74export _GROFFER_LIBDIR; 75if test _@BINDIR@_ = _${_AT}BINDIR${_AT}_ 76then 77 # script before `make' 78 _AT_BINDIR_AT='.'; 79 _AT_G_AT=''; 80 _AT_LIBDIR_AT=''; 81 _GROFFER_LIBDIR='.'; 82else 83 _AT_BINDIR_AT='@BINDIR@'; 84 _AT_G_AT='@g@'; 85 _AT_LIBDIR_AT='@libdir@'; 86 _GROFFER_LIBDIR="${_AT_LIBDIR_AT}"'/groff/groffer'; 87fi; 88 89export _GROFFER_SH; # file name of this shell script 90case "$0" in 91*groffer*) 92 _GROFFER_SH="$0"; 93 # was: _GROFFER_SH="${_AT_BINDIR_AT}/groffer"; 94 ;; 95*) 96 echo 'The groffer script should be started directly.' >&2 97 exit 1; 98 ;; 99esac; 100 101export _GROFFER2_SH; # file name of the script that follows up 102_GROFFER2_SH="${_GROFFER_LIBDIR}"/groffer2.sh; 103 104export _NULL_DEV; 105if test -c /dev/null 106then 107 _NULL_DEV="/dev/null"; 108else 109 _NULL_DEV="NUL"; 110fi; 111 112 113# Test of the `$()' construct. 114if test _"$(echo "$(echo 'test')")"_ \ 115 != _test_ 116then 117 echo 'The "$()" construct did not work.' >&2; 118 exit "${_ERROR}"; 119fi; 120 121# Test of sed program 122if test _"$(echo red | sed -e 's/r/s/')"_ != _sed_ 123then 124 echo 'The sed program did not work.' >&2; 125 exit "${_ERROR}"; 126fi; 127 128 129########################### configuration 130 131# read and transform the configuration files, execute the arising commands 132for f in "${_CONF_FILE_HOME}" "${_CONF_FILE_ETC}" 133do 134 if test -f "$f" 135 then 136 o=""; # $o means groffer option 137 # use "" quotes because of ksh and posh 138 eval "$(cat "$f" | sed -n -e ' 139# Ignore comments 140/^['"${_SP}${_TAB}"']*#/d 141# Delete leading and final space 142s/^['"${_SP}${_TAB}"']*// 143s/['"${_SP}${_TAB}"']*$// 144# Print all shell commands 145/^[^-]/p 146# Replace empty arguments 147s/^\(-[^ ]*\)=$/o="${o} \1 '"${_SQ}${_SQ}"'"/p 148# Replace division between option and argument by single space 149s/[='"${_SP}${_TAB}"']['"${_SP}${_TAB}"']*/'"${_SP}"'/ 150# Handle lines without spaces 151s/^\(-[^'"${_SP}"']*\)$/o="${o} \1"/p 152# Print options that have their argument encircled with single quotes 153/^-[^ ]* '"${_SQ}"'.*'"${_SQ}"'$/s/^.*$/o="${o} &"/p 154# Replace encircled double quotes by single quotes and print the result 155s/^\(-[^ ]*\) "\(.*\)"$/o="${o} \1 '"${_SQ}"'\2'"${_SQ}"'"/p 156# Encircle the remaining arguments with single quotes 157s/^\(-[^ ]*\) \(.*\)$/o="${o} \1 '"${_SQ}"'\2'"${_SQ}"'"/p 158')" 159 if test _"${o}"_ != __ 160 then 161 if test _"{GROFFER_OPT}"_ = __ 162 then 163 GROFFER_OPT="${o}"; 164 else 165 GROFFER_OPT="${o} ${GROFFER_OPT}"; 166 fi; 167 fi; 168 fi; 169done; 170 171# integrate $GROFFER_OPT into the command line; it isn't needed any more 172if test _"${GROFFER_OPT}"_ != __ 173then 174 eval set x "${GROFFER_OPT}" '"$@"'; 175 shift; 176 GROFFER_OPT=''; 177fi; 178 179 180########################### Determine the shell 181 182export _SHELL; 183 184# use "``" instead of "$()" for using the case ")" construct 185# do not use "" quotes because of ksh 186_SHELL=` 187 # $x means list. 188 # $s means shell. 189 # The command line arguments are taken over. 190 # Shifting herein does not have an effect outside. 191 export x; 192 case " $*" in 193 *\ --sh*) # abbreviation for --shell 194 x=''; 195 s=''; 196 # determine all --shell arguments, store them in $x in reverse order 197 while test $# != 0 198 do 199 case "$1" in 200 --shell|--sh|--she|--shel) 201 if test "$#" -ge 2 202 then 203 s="$2"; 204 shift; 205 fi; 206 ;; 207 --shell=*|--sh=*|--she=*|--shel=*) 208 # delete up to first "=" character 209 s="$(echo x"$1" | sed -e 's/^x[^=]*=//')"; 210 ;; 211 *) 212 shift; 213 continue; 214 esac; 215 if test _"${x}"_ = __ 216 then 217 x="'${s}'"; 218 else 219 x="'${s}' ${x}"; 220 fi; 221 shift; 222 done; 223 224 # from all possible shells in $x determine the first being a shell 225 # or being empty 226 s="$( 227 # "" quotes because of posh 228 eval set x "${x}"; 229 shift; 230 if test $# != 0 231 then 232 for i 233 do 234 if test _"$i"_ = __ 235 then 236 # use the empty argument as the default shell 237 echo empty; 238 break; 239 else 240 # test $i on being a shell program; 241 # use this kind of quoting for posh 242 if test _"$(eval "$i -c 'echo ok'" 2>${_NULL_DEV})"_ = _ok_ >&2 243 then 244 # shell found 245 cat <<EOF 246${i} 247EOF 248 break; 249 else 250 # if not being a shell go on searching 251 continue; 252 fi; 253 fi; 254 done; 255 fi; 256 )"; 257 if test _"${s}"_ != __ 258 then 259 cat <<EOF 260${s} 261EOF 262 fi; 263 ;; 264 esac; 265` 266 267########################### test fast shells for automatic run 268 269if test _"${_SHELL}"_ = __ 270then 271 for s in ksh ash dash pdksh zsh posh 272 do 273 if test _"$(eval "$s -c 'echo ok'" 2>${_NULL_DEV})"_ = _ok_ >&2 274 then 275 _SHELL="$s"; 276 break; 277 fi; 278 done; 279fi; 280 281 282########################### start groffer2.sh 283 284if test _"${_SHELL}"_ = _empty_ 285then 286 _SHELL=''; 287fi; 288 289if test _"${_SHELL}"_ = __ 290then 291 # no shell found, so start groffer2.sh normally 292 eval exec "'${_GROFFER2_SH}'" '"$@"'; 293 exit; 294else 295 # start groffer2.sh with the found $_SHELL 296 # do not quote $_SHELL to allow arguments 297 eval exec "${_SHELL} '${_GROFFER2_SH}'" '"$@"'; 298 exit; 299fi; 300