summaryrefslogtreecommitdiffstats
path: root/src/roff/nroff/nroff.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/roff/nroff/nroff.sh')
-rw-r--r--src/roff/nroff/nroff.sh204
1 files changed, 204 insertions, 0 deletions
diff --git a/src/roff/nroff/nroff.sh b/src/roff/nroff/nroff.sh
new file mode 100644
index 0000000..77f5c06
--- /dev/null
+++ b/src/roff/nroff/nroff.sh
@@ -0,0 +1,204 @@
+#! /bin/sh
+# Emulate nroff with groff.
+#
+# Copyright (C) 1992-2021 Free Software Foundation, Inc.
+#
+# Written by James Clark, Werner Lemberg, and G. Branden Robinson.
+#
+# This file is part of 'groff'.
+#
+# 'groff' is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License (GPL) as published
+# by the Free Software Foundation, either version 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+prog="$0"
+
+T=
+Topt=
+opts=
+dry_run=
+is_option_argument_pending=
+
+usage="usage: $prog [-bcCEhikpRStUVz] [-d ctext] [-d string=text] \
+[-K fallback-encoding] [-m macro-package] [-M macro-directory] \
+[-n page-number] [-o page-list] [-P postprocessor-argument] \
+[-r cnumeric-expression] [-r register=numeric-expression] \
+[-T output-device] [-w warning-category] [-W warning-category] \
+[file ...]
+usage: $prog {-v | --version}
+usage: $prog --help"
+
+for arg
+do
+ if [ -n "$is_option_argument_pending" ]
+ then
+ is_option_argument_pending=
+ opts="$opts $arg"
+ shift
+ continue
+ fi
+
+ case $arg in
+ -c)
+ opts="$opts $arg -P-c" ;;
+ -h)
+ opts="$opts -P-h" ;;
+ -[eq] | -s*)
+ # ignore these options
+ ;;
+ -[dKmMnoPrTwW])
+ is_option_argument_pending=yes
+ opts="$opts $arg" ;;
+ -[bCEikpRStUz] | -[dKMmrnoPwW]*)
+ opts="$opts $arg" ;;
+ -T*)
+ Topt=$arg ;;
+ -u*)
+ # -u is for Solaris compatibility and not otherwise documented.
+ #
+ # Solaris 2.2 through at least Solaris 9 'man' invokes
+ # 'nroff -u0 ... | col -x'. Ignore the -u0, since 'less' and
+ # 'more' can use the emboldening info. But disable SGR, since
+ # Solaris 'col' mishandles it.
+ opts="$opts -P-c" ;;
+ -V)
+ dry_run=yes ;;
+ -v | --version)
+ echo "GNU nroff (groff) version @VERSION@"
+ opts="$opts $arg" ;;
+ --help)
+ echo "$usage"
+ exit 0 ;;
+ --)
+ shift
+ break ;;
+ -)
+ break ;;
+ -*)
+ echo "$prog: usage error: invalid option '$arg'" >&2
+ echo "$usage" >&2
+ exit 2 ;;
+ *)
+ break ;;
+ esac
+ shift
+done
+
+if [ -n "$is_option_argument_pending" ]
+then
+ echo "$prog: usage error: option '$arg' requires an argument" >&2
+ exit 2
+fi
+
+# Determine the -T option. Was a valid one specified?
+case "$Topt" in
+ -Tascii | -Tlatin1 | -Tutf8 | -Tcp1047)
+ T=$Topt ;;
+esac
+
+# -T option absent or invalid; try environment.
+if [ -z "$T" ]
+then
+ Tenv=-T$GROFF_TYPESETTER
+ case "$Tenv" in
+ -Tascii | -Tlatin1 | -Tutf8 | -Tcp1047)
+ T=$Tenv ;;
+ esac
+fi
+
+# Finally, infer a -T option from the locale. Try 'locale charmap'
+# first because it is the most reliable, then look at environment
+# variables.
+if [ -z "$T" ]
+then
+ # The separate `exec` is to work around a ~2004 bug in Cygwin sh.exe.
+ case "`exec 2>/dev/null ; locale charmap`" in
+ UTF-8)
+ Tloc=utf8 ;;
+ ISO-8859-1 | ISO-8859-15)
+ Tloc=latin1 ;;
+ IBM-1047)
+ Tloc=cp1047 ;;
+ *)
+ # Some old shells don't support ${FOO:-bar} expansion syntax. We
+ # should switch to it when it is safe to abandon support for them.
+ case "${LC_ALL-${LC_CTYPE-${LANG}}}" in
+ *.UTF-8)
+ Tloc=utf8 ;;
+ iso_8859_1 | *.ISO-8859-1 | *.ISO8859-1 | \
+ iso_8859_15 | *.ISO-8859-15 | *.ISO8859-15)
+ Tloc=latin1 ;;
+ *.IBM-1047)
+ Tloc=cp1047 ;;
+ *)
+ case "$LESSCHARSET" in
+ utf-8)
+ Tloc=utf8 ;;
+ latin1)
+ Tloc=latin1 ;;
+ cp1047)
+ Tloc=cp1047 ;;
+ *)
+ Tloc=ascii ;;
+ esac ;;
+ esac ;;
+ esac
+ T=-T$Tloc
+fi
+
+# Load nroff-style character definitions too.
+opts="-mtty-char$opts"
+
+# Set up the 'GROFF_BIN_PATH' variable to be exported in the current
+# 'GROFF_RUNTIME' environment.
+@GROFF_BIN_PATH_SETUP@
+export GROFF_BIN_PATH
+
+# Let our test harness redirect us. See LC_ALL comment above.
+groff=${GROFF_TEST_GROFF-groff}
+
+# Note 1: It would be nice to apply the DRY ("Don't Repeat Yourself")
+# principle here and store the entire command string to be executed into
+# a variable, and then either display it or execute it. For example:
+#
+# cmd="PATH=... groff ... $@"
+# ...
+# printf "%s\n" "$cmd"
+# ...
+# eval $cmd
+#
+# Unfortunately, the shell is a nightmarish hellscape of quoting issues.
+# Naïve attempts to solve the problem fail when arguments to nroff
+# contain embedded whitespace or shell metacharacters. The solution
+# below works with those, but there is insufficient quoting in -V (dry
+# run) mode, such that you can't copy-and-paste the output of 'nroff -V'
+# if you pass it a filename like foo"bar (with the embedded quotation
+# mark) and expect it to run without further quoting.
+#
+# If POSIX adopts Bash's ${var@Q} or an equivalent, this issue can be
+# revisited.
+#
+# Note 2: The construction '${1+"@$"}' preserves the absence of
+# arguments in old shells; see "Shell Substitutions" in the GNU Autoconf
+# manual. We don't want 'nroff' to become 'groff ... ""' if $# equals
+# zero.
+if [ -n "$dry_run" ]
+then
+ echo PATH="$GROFF_RUNTIME$PATH" $groff $T $opts ${1+"$@"}
+else
+ PATH="$GROFF_RUNTIME$PATH" $groff $T $opts ${1+"$@"}
+fi
+
+# Local Variables:
+# fill-column: 72
+# End:
+# vim: set autoindent expandtab shiftwidth=2 softtabstop=2 textwidth=72: