summaryrefslogtreecommitdiff
path: root/contrib/groffer
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/groffer')
-rw-r--r--contrib/groffer/ChangeLog314
-rw-r--r--contrib/groffer/Makefile.sub149
-rw-r--r--contrib/groffer/README123
-rw-r--r--contrib/groffer/perl/README_PERL263
-rw-r--r--contrib/groffer/perl/func.pl789
-rw-r--r--contrib/groffer/perl/groffer.man3920
-rwxr-xr-xcontrib/groffer/perl/groffer.pl2209
-rw-r--r--contrib/groffer/perl/man.pl731
-rw-r--r--contrib/groffer/perl/perl_test.pl34
-rwxr-xr-xcontrib/groffer/perl/roff2.pl223
-rw-r--r--contrib/groffer/perl/split_env.sh48
-rw-r--r--contrib/groffer/roff2.man249
-rw-r--r--contrib/groffer/shell/ChangeLog.02122
-rw-r--r--contrib/groffer/shell/README_SH297
-rw-r--r--contrib/groffer/shell/groffer.man4124
-rwxr-xr-xcontrib/groffer/shell/groffer.sh384
-rw-r--r--contrib/groffer/shell/groffer2.sh7312
-rwxr-xr-xcontrib/groffer/shell/roff2.sh339
-rw-r--r--contrib/groffer/version.sh38
19 files changed, 0 insertions, 23668 deletions
diff --git a/contrib/groffer/ChangeLog b/contrib/groffer/ChangeLog
deleted file mode 100644
index 2fc3d0f7..00000000
--- a/contrib/groffer/ChangeLog
+++ /dev/null
@@ -1,314 +0,0 @@
-2013-04-11 Bernd Warken <groff-bernd.warken-72@web.de>
-
- * contrib/groffer: There is now a free `git' package containing
- all old `groffer' versions `v0.*' and `v1.*'. The new versions
- `groffer 2.*' will actually not be included. This package can be
- got at:
-
- $ git clone git@github.com:RUNOFF/groffer.git
-
-2013-03-29 Bernd Warken <groff-bernd.warken-72@web.de>
-
- * perl/groffer.pl: Change viewers for `PS'.
-
-2013-03-29 Bernd Warken <groff-bernd.warken-72@web.de>
-
- * perl/groffer.pl: Change viewers for `PS' and `PDF'.
-
- * version.sh: New version is `1.1.3'.
-
-2012-08-09 Werner LEMBERG <wl@gnu.org>
-
- Synchronize man pages.
-
- * perl/groffer.man, shell/groffer.man: Fix many minor issues.
-
-2012-08-07 Eric S. Raymond <esr@thyrsus.com>
-
- Yet more elimination of low-level troff hackery in the
- documentation so it can be lifted to structural markup.
-
- * perl/groffer.man: Use .IP rather than .TP in
- .Topic; this make structural parsing work. Also remove a
- pointless and somewhat out-of-date .ig section.
-
-2011-10-17 Ingo Schwarze <schwarze@openbsd.org>
-
- Do not use INSTALL_DATA and INSTALL_SCRIPT during build phase.
-
- * Makefile.sub (groffer): Replace INSTALL_DATA and
- INSTALL_SCRIPT with `cp'. Otherwise the build phase might
- fail with `permission denied' if you use the `-o root' flag
- of the `install' command. The use of INSTALL_* is an abuse
- anyway because it's not installing anything at that point;
- it's just copying files around locally, within in the build
- directories.
-
-2011-03-21 Jan Vcelak <jvcelak@redhat.com>
- Bernd Warken <groff-bernd.warken-72@web.de>
-
- Remove hardcoded path to 'libdir/groff/groffer' directory.
-
- * Makefile.sub: use @groffer_dir@
-
- * groffer.pl: use @groffer_dir@
-
-2011-01-27 James Budiono <james.budiono@gmail.com>
- Bernd Warken <groff-bernd.warken-72@web.de>
-
- Fix display of manpages.
-
- Reported as
- http://lists.gnu.org/archive/html/bug-groff/2011-01/msg00015.html.
-
- * perl/groffer.pl (_get_first_prog): Fix return value.
- (Viewer_X): Add `okular' viewer.
- * perl/man.pl (manpath_set_from_path): Handle `@main::Path)'
- correctly.
-
- * version.sh: Updated.
-
-2009-01-03 Werner LEMBERG <wl@gnu.org>
-
- * version.sh: Prepare for groff release 1.20.
-
-2008-01-04 Werner LEMBERG <wl@gnu.org>
-
- * shell/groffer.man, perl/groffer.man: Insert `\:' in URLs where
- appropriate.
-
-2007-02-15 Eric S. Raymond <esr@snark.thyrsus.com>
-
- * perl/groffer.man, perl/groffer.man: Fix non-portable `if'
- expressions.
-
-2007-02-13 Eric S. Raymond <esr@snark.thyrsus.com>
-
- Use an-ext.tmac macros in groffer.man.
-
- * perl/groffer.man, perl/groffer.man: Replace ShellCommand with
- .EX/.EE pairs.
- Don't use .TP for examples, as some viewers won't handle a display
- macro as a tag line. Use .SY/.OP/.YS rather than elaborate custom
- macros.
-
-2007-02-02 Werner LEMBERG <wl@gnu.org>
-
- * roff2.man: Further refinements and normalizations.
-
-2007-02-02 Eric S. Raymond <esr@snark.thyrsus.com>
-
- * roff2.man: Converted to use .SY/.OP/.YS and for cross-viewer
- portability. Conversion checked using the protocol described in
- tmac/TESTING-HINTS.
-
-2006-11-14 Werner LEMBERG <wl@gnu.org>
-
- * Makefile.sub (GROFFER_REST): Add roff2.man.
- (groffer): Use $(INSTALL_DATA) for man pages.
- Don't call `chmod' for $(ROFF2PROGS).
- (roff2.man): Typographical fixes.
-
-2006-11-11 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 1.1.1
-
- * perl/roff2.pl, shell/roff2.sh: Create a new working mode without
- `groffer' for `roff2*'.
-
- * perl/groffer.pl: Fix test of temporary directory.
-
-2006-11-09 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 1.1.0
-
- * perl/groffer.pl, perl/func.pl, perl/groffer.man, \
- shell/groffer2.sh, shell/groffer.man: Add `--debug-grog' to
- display the `grog' output.
-
- * perl/roff2.pl, shell/roff2.sh: New files for creating the roff2*
- programs to transform roff code to different formats.
-
- * roff2.man: New file to create man pages for the roff2*
- programs.
-
- * Makefile.sub: Add roff2* and some minor fixes.
-
-2006-11-04 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 1.0.3
-
- * Makefile.sub:
- - Delete removing of $(CLEANADD) in `groffer'.
- - Add $(MAN1) to `groffer'.
-
- * perl/groffer.pl, perl/func.pl, shell/groffer2.sh:
- - Add `groff' option with argument `-K'.
- - Redesign the changed `grog'.
-
-2006-10-23 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 1.0.2
-
- * perl/groffer.pl:
- - Move all variable declarations out of BEGIN.
- - Move all `use' commands outside of BEGIN. Fix the arising
- errors.
- - Correct new position of perl/perl_test.pl.
-
- * perl/func.pl:
- - version(): Fix the determination of the version of groff.
- - usage(): Sort it among the functions in this file.
-
- * perl/groffer.man, shell/groffer.man: Fix string variable
- Ellipsis.
-
- * shell/README_SH: Add information on Autobook.
-
- * shell/groffer.sh:
- - Extent simple shell tests by testing on support for functions.
- Test standard shell on function support. Add error reports on
- shell tests.
- - Set unset variables LANG LC_ALL LC_MESSAGES LC_CTYPES LANGUAGES
- to `C', according to Autobook, ch. 22.
- - Remove option `-e' from `sed'.
-
- * shell/groffer2.sh:
- - Add test on directory in man path find.
- - Add Bourne compatibility for zsh shell.
- - Replace `echo -n ""' by `:'.
- - Remove -e option from sed.
-
-2006-10-23 Werner Lemberg
-
- * perl_test.pl: Moved to...
- * perl/perl_test.pl: Here.
-
- * Makefile.sub: Rewritten. Change PERL to HAVE_PERL and SHELL to
- HAVE_SHELL.
-
-2006-10-14 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 1.0.1
-
- * perl/groffer.pl: Change $perl_test_pl to $file_perl_test_pl.
-
- * perl/groffer.pl, perl/func.pl: Remove `\n' in `die' calls.
-
-2006-10-12 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 1.0.0
-
- Changements of the shell version since 0.9.31
-
- * shell/groffer.sh: Use version.sh in the upper directory.
-
-2006-10-02 Bernd Warken <groff-bernd.warken-72@web.de>
-
- The groffer versions 1.* have two kinds of program, a shell
- version and a Perl version.
-
- The shell version is kept from the old shell only versions of
- groffer 0.*. Most of the former files in the main groffer
- directory are now moved to the subdirectoy shell/.
-
- The Perl version of groffer is a complete rewrite; most of its
- files are found in the subdirectory perl/.
-
- The Makefile.sub decides whether the shell or Perl version of
- groffer is installed. This is done by the program perl_test.pl.
-
- In the following, all files in the groffer directory tree are
- mentioned.
-
- * ChangeLog: This file. It contains information for `groffer'
- versions >= 1.0.0 with shell and Perl kinds. For older `groffer'
- versions, see `shell/ChangeLog.0' which contains information for the
- shell only versions of groffer 0.*.
-
- * Makefile.sub: The old `Makefile.sub' was extended to support the
- shell and the Perl version of `groffer' at the same time. If the
- test of `perl_test.pl' succeeds the `groffer' Perl version will be
- installed, otherwise the shell version is used.
-
- * perl_test.pl: This is used by `Makefile.sub' and installed with
- the Perl version of `groffer'. It is a test of the installed perl
- version. The installed Perl version should be greater or equal
- than the version that is required by this file.
-
- * version.sh: This is the old file kept from the shell version of
- `groffer'. It stores the `groffer' version, the date of the last
- update, and the `groff' version. It is used and installed for the
- shell and Perl version of `groffer'.
-
- * README: This is the old `README' file extended by information on
- the shell and Perl kinds of `groffer'.
-
- * perl/: Subdirectory for the Perl version of `groffer'.
-
- * perl/groffer.pl: This is the `groffer' script of the Perl
- version, a Perl source file that handles the complete groffer
- functionality.
-
- * perl/man.pl: This is the collection of functions that are
- related to man pages, `apropos', and `whatis'. It is loaded by
- `perl/groffer.pl'.
-
- * perl/func.pl: This is the collection of miscellaneous functions.
- It is loaded by `perl/groffer.pl'.
-
- * perl/split_env.sh: A shell script that is used by
- `perl/groffer.pl' to split a large shell environment variable to a
- Perl array.
-
- * perl/groffer.man: This is the man page of the Perl version of
- `groffer'. It is derived from `groffer.man' of the shell version.
- It will only be installed when the `Makefile.sub' chooses to
- install the Perl version of 'groffer' instead of the shell
- version.
-
- * perl/README_PERL: This file contains information of the Perl
- compatibility and details that are special to the Perl version.
-
- * shell/: Subdirectory for the shell version of `groffer'.
-
- * shell/ChangeLog.0: The former `ChangeLog' file of the groffer
- versions 0.* was moved to this file. It contains information of
- the shell only version of groffer 0.*.
-
- * shell/groffer.sh: This is the old `groffer.sh' file of the shell
- version.
-
- * shell/groffer2.sh: This is the old `groffer2.sh' file of the
- shell version.
-
- * shell/groffer.man: This is the old man page groffer.man of the
- shell version. The shell version keeps its own man page. It will
- only be installed when the `Makefile.sub' chooses to install the
- shell version instead of the Perl version.
-
- * shell/README_SH: This is the old `README_SH' file of the shell
- version containing information of the shell compatibility.
-
- The former part of the ChangeLog file is in `shell/ChangeLog.0'.
-
-2006-10-01 Bernd Warken <groff-bernd.warken-72@web.de>
-________________________________________________________________
-License
-
-Copyright (C) 2006-2009, 2011
- Free Software Foundation, Inc.
-Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
-Copying and distribution of this file, with or without
-modification, are permitted provided the copyright notice and this
-notice are preserved.
-
-This file is part of `groffer', which is part of the `groff'
-project.
-
-####### Emacs settings
-
-Local Variables:
-mode: change-log
-End:
diff --git a/contrib/groffer/Makefile.sub b/contrib/groffer/Makefile.sub
deleted file mode 100644
index f0282dda..00000000
--- a/contrib/groffer/Makefile.sub
+++ /dev/null
@@ -1,149 +0,0 @@
-# Makefile.sub for `groffer' (integration into the `groff' source tree)
-
-# File position: <groff-source>/contrib/groffer/Makefile.sub
-
-# Copyright (C) 2001, 2002, 2005, 2006, 2009, 2011
-# Free Software Foundation, Inc.
-# Written by Werner Lemberg <wl@gnu.org> and
-# Bernd Warken <groff-bernd.warken-72@web.de>.
-
-# Last update: 17 Oct 2011
-
-# This file is part of `groffer' which 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 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/>.
-
-########################################################################
-
-ROFF2MODES=dvi html pdf ps text x
-ROFF2PROGS=`echo $(ROFF2MODES) | sed 's/[a-z][a-z]*/roff2&/g'`
-ROFF2MAN=`echo $(ROFF2MODES) | sed 's/[a-z][a-z]*/roff2&.man/g'`
-ROFF2MANN=`echo $(ROFF2MODES) | sed 's/[a-z][a-z]*/roff2&.n/g'`
-
-MAN1=groffer.n \
- roff2dvi.n \
- roff2html.n \
- roff2pdf.n \
- roff2ps.n \
- roff2text.n \
- roff2x.n
-
-MOSTLYCLEANADD=groffer HAVE_PERL HAVE_SHELL groffer.man \
- $(MAN1) $(ROFF2MAN) $(ROFF2PROGS)
-
-# not all make programs have $(RM) predefined.
-RM=rm -f
-
-all: groffer
-
-GROFFER_PERL=$(srcdir)/perl/func.pl \
- $(srcdir)/perl/man.pl \
- $(srcdir)/perl/perl_test.pl \
- $(srcdir)/perl/split_env.sh
-GROFFER_SHELL=$(srcdir)/shell/groffer2.sh
-GROFFER_REST=$(srcdir)/roff2.man \
- $(srcdir)/version.sh \
- $(srcdir)/perl/groffer.man \
- $(srcdir)/perl/groffer.pl \
- $(srcdir)/perl/roff2.pl \
- $(srcdir)/shell/roff2.sh \
- $(srcdir)/shell/groffer.man \
- $(srcdir)/shell/groffer.sh
-
-GROFFER_PERL_=`echo $(GROFFER_PERL) | sed 's|$(srcdir)/perl/||g'`
-GROFFER_SHELL_=`echo $(GROFFER_SHELL) | sed 's|$(srcdir)/shell||g'`
-
-# TODO: Add perl check to configure script.
-groffer: $(GROFFER_PERL) $(GROFFER_SHELL) \
- $(GROFFER_REST) $(SH_DEPS_SED_SCRIPT)
- if perl $(srcdir)/perl/perl_test.pl 2>&1 >/dev/null; then \
- : >HAVE_PERL; \
- echo "Using perl version of groffer."; \
- sed -f "$(SH_DEPS_SED_SCRIPT)" \
- -e "s|@g@|$(g)|g" \
- -e "s|@BINDIR@|$(DESTDIR)$(bindir)|g" \
- -e "s|@libdir@|$(DESTDIR)$(libdir)|g" \
- -e "s|@groffer_dir@|$(DESTDIR)$(groffer_dir)|g" \
- -e "s|@VERSION@|$(version)$(revision)|g" \
- -e "$(SH_SCRIPT_SED_CMD)" \
- $(srcdir)/perl/groffer.pl >$@; \
- cp $(srcdir)/perl/groffer.man groffer.man; \
- for f in $(ROFF2PROGS); do \
- cp $(srcdir)/perl/roff2.pl $$f; \
- done; \
- else \
- : >HAVE_SHELL; \
- echo "Using shell version of groffer."; \
- sed -f "$(SH_DEPS_SED_SCRIPT)" \
- -e "s|@g@|$(g)|g" \
- -e "s|@BINDIR@|$(DESTDIR)$(bindir)|g" \
- -e "s|@libdir@|$(DESTDIR)$(libdir)|g" \
- -e "s|@groffer_dir@|$(DESTDIR)$(groffer_dir)|g" \
- -e "s|@VERSION@|$(version)$(revision)|g" \
- -e "$(SH_SCRIPT_SED_CMD)" \
- $(srcdir)/shell/groffer.sh >$@; \
- cp $(srcdir)/shell/groffer.man groffer.man; \
- for f in $(ROFF2PROGS); do \
- cp $(srcdir)/shell/roff2.sh $$f; \
- done; \
- fi
- chmod +x $@
- for m in $(ROFF2MODES); do \
- cat $(srcdir)/roff2.man \
- | sed 's/@ROFF2MODE@/'"$$m"'/g' > roff2$${m}.man; \
- done
-
-install_data: groffer
- -test -d $(DESTDIR)$(bindir) || $(mkinstalldirs) $(DESTDIR)$(bindir)
- $(RM) $(DESTDIR)$(bindir)/groffer
- $(INSTALL_SCRIPT) groffer $(DESTDIR)$(bindir)/groffer
- for f in $(ROFF2PROGS); do \
- $(RM) $(DESTDIR)$(bindir)/$$f; \
- $(INSTALL_SCRIPT) $$f $(DESTDIR)$(bindir)/$$f; \
- done
- -test -d $(DESTDIR)$(groffer_dir) \
- || $(mkinstalldirs) $(DESTDIR)$(groffer_dir)
- $(RM) $(DESTDIR)$(groffer_dir)/version.sh
- $(INSTALL_DATA) $(srcdir)/version.sh \
- $(DESTDIR)$(groffer_dir)/version.sh
- for f in $(GROFFER_PERL_) $(GROFFER_SHELL_); do \
- $(RM) $(DESTDIR)$(groffer_dir)/$$f; \
- done
- if test -f HAVE_PERL; then \
- for f in $(GROFFER_PERL_); do \
- $(INSTALL_SCRIPT) $(srcdir)/perl/$$f \
- $(DESTDIR)$(groffer_dir)/$$f; \
- done; \
- elif test -f HAVE_SHELL; then \
- for f in $(GROFFER_SHELL_); do \
- $(INSTALL_SCRIPT) $(srcdir)/shell/$$f \
- $(DESTDIR)$(groffer_dir)/$$f; \
- done; \
- fi;
-
-uninstall_sub:
- $(RM) $(DESTDIR)$(bindir)/groffer
- for f in $(ROFF2PROGS); do $(RM) $(DESTDIR)$(bindir)/$$f; done
- for f in $(GROFFER_PERL_) $(GROFFER_SHELL_) version.sh; do \
- $(RM) $(DESTDIR)$(groffer_dir)/$$f; \
- done
- -rmdir $(DESTDIR)$(libdir)/groff/groffer
-
-########################################################################
-# Emacs settings
-########################################################################
-#
-# Local Variables:
-# mode: makefile
-# End:
diff --git a/contrib/groffer/README b/contrib/groffer/README
deleted file mode 100644
index a44d2bc2..00000000
--- a/contrib/groffer/README
+++ /dev/null
@@ -1,123 +0,0 @@
-README
-
-The `groffer' program is the easiest way to read documents written in
-some `roff' language, such as the `man pages', the manual pages in
-many operating systems. All `roff' preprocessors, such as `chem', are
-detected and executed automatically.
-
-
-Source files in this directory
-
-ChangeLog information on all changements for groffer versions 1.*
-Makefile.sub make file used by groff
-README this file, general description of the program
-version.sh information on version number and last update
-perl_test.pl test whether perl has a suitable version
-perl/ subdirectory for the Perl version, see perl/README_PERL
-shell/ subdirectory for the shell version, see shell/README_SH
-
-
-Input
-
-Input comes from either standard input or command line parameters that
-represent names of exisiting roff files or standardized specifications
-for searching man pages. All of these can be compressed in a format
-that is decompressible by `gzip' or `bzip2', including `.gz', `bz2',
-and `.Z'.
-
-`groffer' has many built-in `man' functionalities to find and read the
-manual pages on UNIX and similar operating systems. It accepts the
-information from an installed `man' program, but tries to find a man
-path by itself.
-
-`groffer' bundles all filespec parameters into a single output file in
-the same way as `groff'. The disadvantage of this is that all file
-name arguments must use the same groff language. To change this, the
-option parsing must be revised for large parts. It seems that this
-would create incompatibilities, so the actual option strategy is kept.
-
-
-Output
-
-All input is first sent to `grog' to determine the necessary `groff'
-command and then to `groff' together with all necessary preprocessors.
-So no special `groff' arguments must be given. But all `groff'
-options can be specified when this seems to be appropriate.
-
-The following displaying modes for the output are available:
-- Display formatted input with
--- a PDF viewer,
--- a Postcript viewer,
--- a web browser,
--- the X `roff' viewer `gxditview',
--- a DVI viewer,
--- a pager in a text terminal (tty).
-- Generate `groff' output on stdout without a viewer.
-- Generate the `groff intermediate output' on standard output without
- postprocessing.
-- Output the source code without any `groff' processing.
-- There are some information outputs without `groff' processing, such
- as by option `-V' and the `man' like `whatis' and `apropos'
- outputs.
-
-By default, the program tries to display a graphical device in X; on
-non-X text terminals, the `tty' text mode with a pager is tried by
-default.
-
-
-File access
-
-The shell and the Perl version of groffer now use umask of 077. This
-is a very strict security issue. It allows only access of the
-temporary files by the file owner.
-
-
-Compatibility
-
-`groffer' is compatible with the `man' program. It supports .so
-requests based on the man path and compressed files. That's more than
-`groff' does.
-
-
-Mailing lists
-
-For reporting bugs of `groffer', groff's free mailing list
-<bug-groff@gnu.org> can be used.
-
-For a general discussion, the mailing list <groff@gnu.org> is more
-useful, but one has to subscribe to this list at
-http://lists.gnu.org/mailman/listinfo/groff.
-
-See the `README' file in the top directory of the `groff' source
-package for more details on these mailing lists.
-
-
-####### License
-
-Last update: 5 Jan 2009
-
-Copyright (C) 2003, 2004, 2005, 2006, 2009
- Free Software Foundation, Inc.
-Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
-This file is part of `groffer', which 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 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/>.
-
-
-####### Emacs settings
-
-Local Variables:
-mode: text
-End:
diff --git a/contrib/groffer/perl/README_PERL b/contrib/groffer/perl/README_PERL
deleted file mode 100644
index 0e58f06e..00000000
--- a/contrib/groffer/perl/README_PERL
+++ /dev/null
@@ -1,263 +0,0 @@
-README_PERL
-
-Special description for the Perl version of `groffer'
-
-The files related to the Perl version are
-
-perl/groffer.pl perl main source file for groffer
-perl/func.pl selection of functions needed for groffer.pl
-perl/man.pl selection of man functions needed for groffer.pl
-perl/split_env.sh shell script called from groffer.pl to split a variable
-perl/groffer.man manual file rewritten for the perl version of groffer
-perl/README_PERL this file
-perl_test.pl test whether perl has a suitable version
-version.sh information on version number and last update
-
-
-Compatibility
-
-This is the Perl version of groffer. It was written under Perl v5.8.8
-and needs an installed Perl version of at least version 5.6.1.
-
-It was written in Linux, but it seems to be independent of the
-operating system. At least no directory slashes are used.
-
-For testing, `groffer.pl' may be used directly without a Makefile. By
-`make' this file will be transformed into the file `groffer' that will
-be installed.
-
-The following options were removed compared to the shell version of
-groffer:
-
---shell --debug-func --debug-not_func --debug-lm --debug-shell
---debug-stacks --debug-user
-
-They can be used, but they are just ignored.
-
-Otherwise, the Perl version has the same functionality as the shell
-version.
-
-
-Temporary files
-
-The Perl version keeps more files for debug mode than the shell
-version. The `file' and `so' temporaries are numbered and the files
-with .so request are copied. All .so requests are handled; this is an
-extension to `man' that deals only with the first .so request.
-
-
-Comparison of variable names in both groffer versions
-
-shell perl
-=======================================================================
-$GROFFER_OPT $Env{GROFFER}
-$PATH @Path
-$_ADDOPTS_GROFF @Addopts_Groff
-$_ALL_PARAMS @ARGV
-$_APROPOS_PROG $Apropos_Prog
-$_APROPOS_SECTIONS $Opt{APROPOS_SECTIONS}
-$_AT $at
-$_AT_BINDIR_AT $at_at{BINDIR}
-$_AT_G_AT $at_at{G}
-$_AT_LIBDIR_AT $at_at{LIBDIR}
-$_BAD -
-$_BEFORE_MAKE $before_make
-$_CONF_FILES @Conf_Files
-$_CONF_FILE_ETC @Conf_Files
-$_CONF_FILE_HOME @Conf_Files
-$_DEBUG_FUNC_CHECK -
-$_DEBUG_KEEP_FILES @Debug{KEEP}
-$_DEBUG_LM -
-$_DEBUG_PRINT_FILENAMES @Debug{FILENAMES}
-$_DEBUG_PRINT_PARAMS @Debug{PARAMS}
-$_DEBUG_PRINT_SHELL -
-$_DEBUG_PRINT_TMPDIR @Debug{TMPDIR}
-$_DEBUG_STACKS -
-$_DEBUG_USER_WITH_STACK -
-$_DEFAULT_MODES $Default_Modes
-$_DEFAULT_RESOLUTION $Default_Resolution
-$_DEFAULT_TTY_DEVICE $Default_tty_Device
-$_DISPLAY_ARGS $Display{ARGS}
-$_DISPLAY_MODE $Display{MODE}
-$_DISPLAY_PROG $Display{PROG}
-$_ERROR -
-$_FILEARGS @Filespecs
-$_FILESPEC_ARG $Filespec_Arg
-$_FILESPEC_IS_MAN $Filespec_Is_Man
-$_FUNC_STACK -
-$_GOOD -
-$_GROFFER2_SH -
-$_GROFFER_LIBDIR $groffer_libdir
-$_GROFFER_SH _
-$_GROFF_VERSION $Groff_Version
-$_GROFF_VERSION_PRESET $groff_version_preset
-$_HAS_BZIP $Has_bzip
-$_HAS_COMPRESSION $Has_Compression
-$_LAST_UPDATE $last_update
-$_MACRO_PACKAGES $Macro_Packages
-$_MACRO_PKG $Macro_Pkg
-$_MANOPT_ALL -
-$_MANOPT_EXTENSION -
-$_MANOPT_LANG -
-$_MANOPT_PAGER -
-$_MANOPT_PATH -
-$_MANOPT_SEC -
-$_MANOPT_SYS -
-$_MAN_ALL $Man{ALL}
-$_MAN_AUTO_SEC_CHARS $Man{AUTO_SEC_CHARS}
-$_MAN_AUTO_SEC_LIST @{$Man{AUTO_SEC}}
-$_MAN_ENABLE $Man{ENABLE}
-$_MAN_EXT $Man{EXT}
-$_MAN_FORCE $Man{FORCE}
-$_MAN_IS_SETUP $Man{IS_SETUP}
-$_MAN_LANG $Man{LANG}
-$_MAN_LANG2 $Man{LANG2}
-$_MAN_PATH @{$Man{PATH}}
-$_MAN_SEC @{$Man{SEC}}
-$_MAN_SEC_CHARS $Man{SEC_CHARS}
-$_MAN_SEC_LIST -
-$_MAN_SYS @{$Man{SYS}}
-$_NO -
-$_NO_FILESPECS $No_Filespecs
-$_NULL_DEV $Dev_Null
-$_OK -
-$_OPTS_CMDLINE_LONG_ARG %Opts_Cmdline_Long with value 1
-$_OPTS_CMDLINE_LONG_NA %Opts_Cmdline_Long with value 0
-$_OPTS_CMDLINE_SHORT_ARG %Opts_Cmdline_Short with value 1
-$_OPTS_CMDLINE_SHORT_NA %Opts_Cmdline_Short with value 0
-$_OPTS_GROFFER_LONG_ARG -
-$_OPTS_GROFFER_LONG_NA -
-$_OPTS_GROFFER_SHORT_ARG -
-$_OPTS_GROFFER_SHORT_NA -
-$_OPTS_GROFF_LONG_ARG -
-$_OPTS_GROFF_LONG_NA -
-$_OPTS_GROFF_SHORT_ARG -
-$_OPTS_GROFF_SHORT_NA -
-$_OPTS_MANOPT_LONG_ARG -
-$_OPTS_MANOPT_LONG_NA -
-$_OPTS_MANOPT_SHORT_ARG -
-$_OPTS_MANOPT_SHORT_NA -
-$_OPTS_MAN_LONG_ARG -
-$_OPTS_MAN_LONG_NA -
-$_OPTS_MAN_SHORT_ARG -
-$_OPTS_MAN_SHORT_NA -
-$_OPTS_X_LONG_ARG -
-$_OPTS_X_LONG_NA -
-$_OPTS_X_SHORT_ARG -
-$_OPTS_X_SHORT_NA -
-$_OPT_ALL $Opt{ALL}
-$_OPT_APROPOS $Opt{APROPOS}
-$_OPT_BD $Opt{BD}
-$_OPT_BG $Opt{BG}
-$_OPT_BW $Opt{BW}
-$_OPT_DEFAULT_MODES $Opt{DEFAULT_MODES}
-$_OPT_DEVICE $Opt{DEVICE}
-$_OPT_DISPLAY $Opt{DISPLAY}
-$_OPT_DO_NOTHING $Opt{DO_NOTHING}
-$_OPT_EXTENSION $Opt{EXTENSION}
-$_OPT_FG $Opt{FG}
-$_OPT_FN $Opt{FN}
-$_OPT_GEOMETRY $Opt{GEOMETRY}
-$_OPT_ICONIC $Opt{ICONIC}
-$_OPT_LANG $Opt{LANG}
-$_OPT_MANPATH $Opt{MANPATH}
-$_OPT_MODE $Opt{MODE}
-$_OPT_PAGER $Opt{PAGER}
-$_OPT_RESOLUTION $Opt{RESOLUTION}
-$_OPT_RV $Opt{RV}
-$_OPT_SECTIONS $Opt{SECTIONS}
-$_OPT_SYSTEMS $Opt{SYSTEMS}
-$_OPT_TEXT_DEVICE $Opt{TEXT_DEVICE}
-$_OPT_TITLE $Opt{TITLE}
-$_OPT_V $Opt{V}
-$_OPT_VIEWER_DVI $Opt{VIEWER_DVI}
-$_OPT_VIEWER_HTML $Opt{VIEWER_HTML}
-$_OPT_VIEWER_PDF $Opt{VIEWER_PDF}
-$_OPT_VIEWER_PS $Opt{VIEWER_PS}
-$_OPT_VIEWER_X $Opt{VIEWER_X}
-$_OPT_WHATIS $Opt{WHATIS}
-$_OPT_XRM @{$Opt{XRM}}
-$_OPT_Z $Opt{Z}
-$_OUTPUT_FILE_NAME $Output_File_Name
-$_PDF_DID_NOT_WORK $PDF_Did_Not_Work
-$_PDF_HAS_GS $PDF_Has_gs
-$_PDF_HAS_PS2PDF $PDF_Has_ps2pdf
-$_PROCESS_ID -
-$_PROGRAM_VERSION $program_version
-$_REG_TITLE_LIST @Reg_Title
-$_SHELL -
-$_SP -
-$_SPACE_CASE -
-$_SPACE_SED -
-$_SPECIAL_FILESPEC $Special_Filespec
-$_SPECIAL_SETUP $Special_Setup
-$_SQ -
-$_START_DIR $Start_Dir
-$_TAB -
-$_TMP_CAT $fh_cat, $tmp_cat
-$_TMP_DIR $tmpdir
-$_TMP_MAN -
-$_TMP_MANSPEC $Manspec for @{Man{MANSPEC}{$Manspec}}
-$_TMP_STDIN $fh_stdin, $tmp_stdin
-$_UNSET -
-$_VIEWER_BACKGROUND $Viewer_Background
-$_VIEWER_DVI_TTY $Viewer_tty{'DVI'}
-$_VIEWER_DVI_X $Viewer_X{'DVI'}
-$_VIEWER_HTML_TTY $Viewer_tty{'HTML'}
-$_VIEWER_HTML_X $Viewer_X{'HTML'}
-$_VIEWER_PDF_TTY $Viewer_tty{'PDF'}
-$_VIEWER_PDF_X $Viewer_X{'PDF'}
-$_VIEWER_PS_TTY $Viewer_tty{'PS'}
-$_VIEWER_PS_X $Viewer_X{'PS'}
-$_VIEWER_TTY_TTY -
-$_VIEWER_TTY_X -
-$_VIEWER_X_TTY $Viewer_tty{'X'}
-$_VIEWER_X_X $Viewer_X{'X'}
-$_YES -
-$return_bad -
-$return_error -
-$return_good -
-$return_no -
-$return_ok -
-$return_var -
-$return_yes -
-- @ARGV
-- @Manopt
-- $Opt{LOCATION}
-- $Opt{X}
-- $File_Split_Env
-- @Options
-- @StartingARGV
-- @StartingConf
-- $Umask
-
-
-####### License
-
-Copyright (C) 2003, 2004, 2005, 2006, 2009
- Free Software Foundation, Inc.
-Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
-This file is part of `groffer', which 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 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/>.
-
-Last update: 5 Jan 2009
-
-
-####### Emacs settings
-
-Local Variables:
-mode: text
-End:
diff --git a/contrib/groffer/perl/func.pl b/contrib/groffer/perl/func.pl
deleted file mode 100644
index d0fc6399..00000000
--- a/contrib/groffer/perl/func.pl
+++ /dev/null
@@ -1,789 +0,0 @@
-#! /usr/bin/env perl
-
-# groffer - display groff files
-
-# Source file position: <groff-source>/contrib/groffer/perl/func.pl
-# Installed position: <prefix>/lib/groff/groffer/func.pl
-
-# Copyright (C) 2006, 2009 Free Software Foundation, Inc.
-# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
-# Last update: 5 Jan 2009
-
-# This file is part of `groffer', which 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 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/>.
-
-########################################################################
-
-use strict;
-use warnings;
-
-########################################################################
-# some functions
-########################################################################
-
-##########
-# cat_z(<file>)
-#
-# Decompress or cat the <file>.
-#
-# Return: the decompressed file as array
-#
-sub cat_z {
- my $n = @_;
- die "cat_z(): one argument is needed; you used $n;"
- unless $n == 1;
-
- my $file = $_[0];
- die "cat_z(): `$file' is not a readable file;" unless -f $file && -r $file;
- return () if -z $file;
-
- my @res;
- if ($main::Has_Compression) {
- if ($main::Has_bzip) {
- # test whether bz2 compressed, shell return must be inverted
- unless ( system("bzip2 -t $file 2>$main::Dev_Null") ) {
- @res = `bzip2 -c -d $file 2>$main::Dev_Null`;
- return @res;
- }
- # if not compressed with gz, gzip will act like `cat'
- @res = `gzip -c -d -f $file 2>$main::Dev_Null`;
- return @res;
- }
- } else {
- my $fh;
- open $fh, "<$file" or die "cat_z(): could not open $file";
- @res = <$fh>;
- close $fh;
- return @res;
- }
- ();
-} # cat_z()
-
-
-##########
-# clean_up()
-#
-# Remove the temporary directory and restore the system.
-#
-sub clean_up {
- umask $main::Umask;
- chdir $main::Start_Dir;
- if ($main::Debug{'KEEP'} && -d $main::tmpdir) {
- my $glob = File::Spec->catfile($main::tmpdir, '*');
- unlink glob($glob); # rm $tmpdir/*
- rmdir $main::tmpdir;
- }
-} # clean_up()
-
-
-##########
-# get_dirname(<path>)
-#
-# Split the path and return the directory name part
-#
-# Return: string of directory name
-#
-sub get_dirname {
- my $n = @_;
- die "get_filename(): one argument is needed; you used $n;" unless $n == 1;
- return '' unless $_[0];
-
- my ($dirname, $filename) = &split_path($_[0]);
- $dirname;
-} # get_dirname()
-
-
-##########
-# get_filename(<path>)
-#
-# Split the path and return the file name part
-#
-# Return: string of file name
-#
-sub get_filename {
- my $n = @_;
- die "get_dirname(): one argument is needed; you used $n;" unless $n == 1;
- return '' unless $_[0];
-
- my ($dirname, $filename) = &split_path($_[0]);
- $filename;
-} # get_filename()
-
-
-##########
-# is_X()
-#
-# Test whether X Windows is running.
-#
-sub is_X {
- return 1 if $ENV{'DISPLAY'};
- return 0;
-} # is_X()
-
-
-##########
-# list_has(<list_ref>, <string>)
-#
-# Determine if <list_ref> has <string> as element.
-#
-sub list_has {
- my $n = @_;
- die "list_has(): 2 arguments are needed; you used $n;"
- unless $n == 2;
-
- my $list_ref = $_[0];
- my $string = $_[1];
- die "list_has(): first argument must be an array reference;"
- unless ref($list_ref) eq 'ARRAY';
-
- foreach ( @$list_ref ) {
- return 1 if $_ eq $string;
- }
- 0;
-}
-
-
-##########
-# path_uniq(<dir>...)
-#
-# make path having unique existing directories
-#
-sub path_uniq {
- my @a;
- my %h;
- foreach (@_) {
- next if exists $h{$_};
- next unless -d $_;
- push @a, $_;
- $h{$_} = 1;
- }
- @a;
-} # path_uniq()
-
-
-##########
-# print_hash(<hash_or_ref>)
-#
-# print the elements of a hash or hash reference
-#
-sub print_hash {
- my $hr;
- my $n = scalar @_;
- if ($n == 0) {
- print "empty hash\n;";
- return 1;
- } elsif ($n == 1) {
- if (ref($_[0]) eq 'HASH') {
- $hr = $_[0];
- } else {
- warn 'print_hash(): the argument is not a hash or hash reference;';
- return 0;
- }
- } else {
- if ($n % 2) {
- warn 'print_hash(): the arguments are not a hash;';
- return 0;
- } else {
- my %h = @_;
- $hr = \%h;
- }
- }
-
-### print_hash()
- unless (%$hr) {
- print "empty hash\n";
- return 1;
- }
- print "hash (ignore the ^ characters):\n";
- for my $k (sort keys %$hr) {
- my $hk = $hr->{$k};
- print " $k => ";
- if (defined $hk) {
- print "^$hk^";
- } else {
- print "undef";
- }
- print "\n";
- }
-
- 1;
-} # print_hash()
-
-
-##########
-# print_times(<string>)
-#
-# print the time, result: user, system, child process user, child system
-#
-sub print_times {
- my @t = times;
- my $s = '';
- $s = $_[0] if $_[0];
-# print STDERR "$s: @t\n";
-} # print_times()
-
-BEGIN { &print_times("start"); }
-END { &print_times("end"); }
-
-
-##########
-# split_path(<path>)
-#
-# Split the path into directory and file name parts
-#
-# Return: array with 2 elements consisting of directory and file name
-#
-sub split_path {
- my $n = @_;
- die "split_path(): one argument is needed; you used $n;" unless $n == 1;
- my $arg = $_[0];
- return () unless $arg;
-
- my $basename = basename($arg);
- if ( $basename ne $arg ) { # path with dir
- # fileparse() is from File::Basename
- my($filename, $dirname, $suffix) = fileparse($arg);
- return ($dirname, $basename);
- }
- return ('', $arg);
-}
-
-
-{
- my $nr_file = 0;
- my $nr_so = 0;
-
- my $tmp_file_base;
- my $tmp_so_base;
-
- my $soelim_r = '';
- $soelim_r = '-r'
- if ! system("echo -n '' | soelim -r 2>$main::Dev_Null >$main::Dev_Null");
-
- ##########
- # to_tmp (<filename>)
- #
- # Print file (decompressed) to the temporary cat file with handling .SO
- # for man pages.
- #
- sub to_tmp {
- my $n = @_;
- die "to_tmp(): one argument is needed; you used $n;"
- unless $n == 1;
-
- my $arg = $_[0];
- return 1 unless $arg;
- die "to_tmp(): $arg is not an existing file;" unless -f $arg;
- die "to_tmp(): could not read file $arg;" unless -r $arg;
- return 1 if -z $arg;
-
- $tmp_file_base = File::Spec->catfile($main::tmpdir, ',file')
- unless $tmp_file_base;
- $tmp_so_base = File::Spec->catfile($main::tmpdir, ',so')
- unless $tmp_so_base;
-
- open $main::fh_cat, ">>$main::tmp_cat" or
- die "to_tmp(): could not open temporary cat file";
-
- if ($main::Opt{'WHATIS'}) {
- &whatis_filename($arg);
- return 1;
- }
-
- ### to_tmp()
- my $dir = &get_dirname($arg);
-
- my ($fh_file, $tmp_file, $fh_tmp, $tmp_tmp);
- ++$nr_file;
- $tmp_file = $tmp_file_base . $nr_file;
- $tmp_tmp = File::Spec->catfile($main::tmpdir, ',tmp');
-
- print STDERR "file: $arg\n" if $main::Debug{'FILENAMES'};
-
- if ($main::Filespec_Is_Man) {
- my ($fh_so, $tmp_so);
-
- open $fh_file, ">$tmp_file" or
- die "to_tmp(): could not open $tmp_file;";
- foreach ( &cat_z($arg) ) {
- print $fh_file "$_";
- }
- close $fh_file;
-
- open $fh_file, "<$tmp_file" or
- die "to_tmp(): could not open $tmp_file;";
- my @list;
- foreach (<$fh_file>) {
- if (/^[\.']\s*so\s/) {
- chomp;
- s/^[\.']\s*so\s*//;
- push @list, $_;
- }
- }
- close $fh_file;
-
- if ( @list && $main::Debug{'KEEP'} ) {
- my $f = $tmp_file . '+man';
- copy($tmp_file, $f);
- }
-
- ### to_tmp()
- DO_MAN_SO: foreach (@list) {
- # start of _do_man_so() in shell version
- my $so = $_;
- my $soname = $so;
- $soname =~ s/\\\s/ /g;
-
- my $sofound;
- my $path = File::Spec->rootdir();
- if ($soname =~ m#^$path#) { # absolute path name
- next DO_MAN_SO if -f $soname;
- foreach ('.gz', '.Z', '.bz2') {
- my $name = $soname . $_;
- if (-f $name) {
- $sofound = $name;
- last;
- }
- } # foreach
- next DO_MAN_SO unless $sofound;
- } else { # relative to man path
- LOOP: foreach my $ext ('', '.gz', '.Z', '.bz2') {
- foreach my $p ( @{$main::Man{'PATH'}} ) {
- my $f = File::Spec->catfile($p, "$soname$ext");
- if (-f $f) {
- $sofound = $f if -f $f;
- last LOOP;
- }
- } # foreach
- } # LOOP:
- next DO_MAN_SO unless $sofound;
- } # if on path
-
- print STDERR "file from .so: $so\n" if $main::Debug{'FILENAMES'};
-
- ### to_tmp()
- ++$nr_so;
- $tmp_so = $tmp_so_base . $nr_so;
- unlink $tmp_so if -e $tmp_so;
- open $fh_so, ">$tmp_so" or
- die "to_tmp(): could not open $tmp_so;";
- foreach ( &cat_z($sofound) ) {
- print $fh_so $_;
- }
- close $fh_so;
-
- my $esc = $so;
- $esc =~ s/\\/\\\\/g;
- open $fh_file, "<$tmp_file" or
- die "to_tmp(): could not open $tmp_file;";
- open $fh_tmp, ">$tmp_tmp" or
- die "to_tmp(): could not open $tmp_tmp;";
- foreach (<$fh_file>) {
- s#^([\.'])\s*so\s+($so|$esc|$soname)\s*\n$#${1}so $tmp_so\n#s;
- print $fh_tmp $_;
- }
- ### to_tmp()
- close $fh_tmp;
- close $fh_file;
- unlink $tmp_file if -e $tmp_file;
- rename $tmp_tmp, $tmp_file;
- # end of _do_man_so() in shell version
- } # foreach (@list)
-
- if ( @list && $main::Debug{'KEEP'} ) {
- my $f = $tmp_file . '+tmp';
- copy($tmp_file, $f);
- }
-
- unlink $tmp_tmp if -e $tmp_tmp;
- rename $tmp_file, $tmp_tmp;
- system("soelim -I$dir $soelim_r $tmp_tmp >$tmp_file");
- unlink $tmp_tmp if -e $tmp_tmp;
-
- } else { # $Filespec_Is_Man is empty
- open $fh_tmp, ">$tmp_tmp" or
- die "to_tmp(): could not open $tmp_tmp;";
- foreach (cat_z $arg) {
- print $fh_tmp $_;
- }
- close $fh_tmp;
- if ($dir) {
- system("soelim -I$dir $soelim_r $tmp_tmp >$tmp_file");
- } else {
- system("soelim $soelim_r $tmp_tmp >$tmp_file");
- }
- unlink $tmp_tmp;
- } # if ($Filespec_Is_Man)
-
- ### to_tmp()
- my $grog = `grog $tmp_file`;
- die "to_tmp(): grog error on $tmp_file;" if $?;
- chomp $grog;
- print STDERR "grog output: $grog\n" if $main::Debug{'GROG'};
- if ($grog =~ /^.*\s-m.*$/) {
- $grog =~ s/\s+/ /g;
- $grog =~ s/ -m / -m/g;
- $grog =~ s/ -mm([^ ]) / -m$1/g;
- foreach my $g (split / /, $grog) {
- if ($g =~ /^-m/) {
- my $ref = \@main::Macro_Packages;
- if ( &list_has($ref, $g) ) {
- if (! $main::Macro_Pkg) {
- $main::Macro_Pkg = $g;
- } elsif ($main::Macro_Pkg eq $g) {
- 1;
- } elsif ($main::Macro_Pkg =~ /^-m/) {
- warn "to_tmp(): Ignore $arg because it needs $g " .
- "instead of $main::Macro_Pkg";
- unlink $tmp_file unless $main::Debug{'KEEP'};
- return 0;
- } elsif ($main::Macro_Pkg ne $g) {
- die "to_tmp(): \$Macro_Pkg does not start with -m: " .
- "$main::Macro_Pkg";
- } # if (! $main::Macro_Pkg)
- } # if (&list_has
- } # if (/^-m/)
- } # foreach my $g
- } # if $grog
-
- open $fh_file, "<$tmp_file" or
- die "to_tmp(): could not open $tmp_file for reading;";
- open $main::fh_cat, ">>$main::tmp_cat" or
- die "to_tmp(): could not open $main::tmp_cat for appending;";
- foreach (<$fh_file>) {
- print $main::fh_cat $_;
- }
- close $main::fh_cat;
- close $fh_file;
-
- unless ( $main::Debug{'KEEP'} ) {
- unlink $tmp_file;
- foreach ( glob("$tmp_so_base*") ) {
- unlink $_;
- }
- }
- 1;
- } # to_tmp()
-}
-
-##########
-# to_tmp_line (<text>...)
-#
-# Print array of lines with <text> to the temporary cat file. \n is added
-# if a line does not end with \n.
-#
-sub to_tmp_line {
- my $n = @_;
- return 1 if $n == 0;
- open $main::fh_cat, ">>$main::tmp_cat" or
- die "to_tmp_line(): could not open temporary cat file";
- foreach (@_) {
- my $line = $_;
- chomp($line);
- print $main::fh_cat "$line\n";
- }
- close $main::fh_cat;
- 1;
-} # to_tmp_line()
-
-
-##########
-# usage()
-#
-# Print usage information for --help.
-#
-sub usage {
- print "\n";
- &version();
- print <<EOF;
-
-Usage: groffer [option]... [filespec]...
-
-Display roff files, standard input, and/or Unix manual pages with an X
-Window viewer or in several text modes. All input is decompressed
-on-the-fly with all formats that gzip can handle.
-
-"filespec" is one of
- "filename" name of a readable file
- "-" for standard input
- "man:name(n)" man page "name" in section "n"
- "man:name.n" man page "name" in section "n"
- "man:name" man page "name" in first section found
- "name(n)" man page "name" in section "n"
- "name.n" man page "name" in section "n"
- "n name" man page "name" in section "n"
- "name" man page "name" in first section found
-where `section' is a single character out of [1-9on], optionally followed
-by some more letters that are called the `extension'.
-
--h --help print this usage message.
--T --device=name pass to groff using output device "name".
--v --version print version information.
--V display the groff execution pipe instead of formatting.
--X display with "gxditview" using groff -X.
--Z --ditroff --intermediate-output
- generate groff intermediate output without
- post-processing and viewing, like groff -Z.
-All other short options are interpreted as "groff" formatting options.
-
-The most important groffer long options are
-
---apropos=name start man's "apropos" program for "name".
---apropos-data=name
- "apropos" for "name" in man's data sections 4, 5, 7.
---apropos-devel=name
- "apropos" for "name" in development sections 2, 3, 9.
---apropos-progs=name
- "apropos" for "name" in man's program sections 1, 6, 8.
---auto choose mode automatically from the default mode list.
---default reset all options to the default value.
---default-modes=mode1,mode2,...
- set sequence of automatically tried modes.
---dvi display in a viewer for TeX device independent format.
---dvi-viewer=prog choose the viewer program for dvi mode.
---groff process like groff, disable viewing features.
---help display this helping output.
---html display in a web browser.
---html-viewer=program
- choose the web browser for html mode.
---man check file parameters first whether they are man pages.
---mode=auto|dvi|groff|html|pdf|ps|source|text|tty|www|x|X
- choose display mode.
---no-man disable man-page facility.
---no-special disable --all, --apropos*, and --whatis
---pager=program preset the paging program for tty mode.
---pdf display in a PDF viewer.
---pdf-viewer=prog choose the viewer program for pdf mode.
---ps display in a Postscript viewer.
---ps-viewer=prog choose the viewer program for ps mode.
---source output as roff source.
---text output in a text device without a pager.
---to-stdout output the content of the mode file without display.
---tty display with a pager on text terminal even when in X.
---tty-viewer=prog select a pager for tty mode; same as --pager.
---whatis display the file name and description of man pages
---www same as --html.
---www-viewer=prog same as --html-viewer
---x --X display with "gxditview" using an X* device.
---x-viewer=prog choose viewer program for x mode (X mode).
---X-viewer=prog same as "--xviewer".
-
-The usual X Windows toolkit options transformed into GNU long options:
---background=color, --bd=size, --bg=color, --bordercolor=color,
---borderwidth=size, --bw=size, --display=Xdisplay, --fg=color,
---fn=font, --font=font, --foreground=color, --geometry=geom, --iconic,
---resolution=dpi, --rv, --title=text, --xrm=resource
-
-Long options of GNU "man":
---all, --ascii, --ditroff, --extension=suffix, --locale=language,
---local-file=name, --location, --manpath=dir1:dir2:...,
---sections=s1:s2:..., --systems=s1,s2,..., --where, ...
-
-Development options that are not useful for normal usage:
---debug, --debug-filenames, --debug-grog, --debug-keep, --debug-params,
---debug-tmpdir, --do-nothing, --print=text
-
-EOF
-} # usage()
-
-
-##########
-# version()
-#
-# Get version information from version.sh and print a text with this.
-#
-sub version {
- my $groff_version;
- my $program_version = '';
- my $last_update = '';
- my $groff_version_preset = '';
-
- die "$main::File_version_sh does not exist;"
- unless -f "$main::File_version_sh";
- my $fh;
- open $fh, "<$main::File_version_sh";
- foreach (<$fh>) {
- chomp;
- if (/^\s*_PROGRAM_VERSION\s*=\s*['"]*([^'"]*)['"]*\s*;?\s*$/) {
- $program_version = $1;
- next;
- }
- if (/^\s*_LAST_UPDATE\s*=\s*['"]*([^'"]*)['"]*\s*;?\s*$/) {
- $last_update = $1;
- next;
- }
- if (/^\s*_GROFF_VERSION_PRESET\s*=\s*['"]*([^'"]*)['"]*\s*;?\s*$/) {
- # this setting of the groff version is only used before make is run,
- # otherwise @VERSION@ will set it, see groffer.sh.
- $groff_version_preset = $1;
- next;
- }
- }
- close $fh;
-
- if ($main::Groff_Version) {
- $groff_version = $main::Groff_Version;
- } else {
- $groff_version = $groff_version_preset;
- }
- my $year = $last_update;
- $year =~ s/^.* //;
- print <<EOF;
-groffer $program_version of $last_update (Perl version)
-is part of groff version $groff_version.
-Copyright (C) $year Free Software Foundation, Inc.
-GNU groff and groffer come with ABSOLUTELY NO WARRANTY.
-You may redistribute copies of groff and its subprograms
-under the terms of the GNU General Public License.
-EOF
-} # version()
-
-
-##########
-# where_is_prog(<program>)
-#
-# Test whether <program> without its arguments exists or is a program
-# in $PATH.
-#
-# Arguments : 1, <program> can have spaces and arguments.
-# Return : a hash with `dir', `file', `fullname', `args' if
-# argument exists or is a program in $PATH, empty hash else.
-#
-sub where_is_prog {
- scalar @_ eq 1 or die "where_is_prog(): only one argument is allowed";
- my $p1 = $_[0];
- return () unless $p1;
-
- $p1 =~ s/\s+/ /g;
- $p1 =~ s/(\\)+ / /g;
- $p1 =~ s/^ | $//g;
- return () unless $p1;
-
- my $noarg = $p1;
- $noarg =~ s/ -.*$//;
- return () unless $noarg;
-
- my $args;
- if ($p1 =~ /^.* -.*$/) {
- $args = $p1;
- $args =~ s#^$noarg ##;
- }
- $args = '' unless defined $args;
-
- my %result;
-
- # test whether $noarg has directory, so it is not tested with $PATH
- my ($dir, $name) = &split_path($noarg);
- $result{'dir'} = $dir;
-
-### where_is_prog()
- if (-f $noarg && -x $noarg) {
- $result{'args'} = $args;
- $result{'file'} = $name;
- $result{'fullname'} = File::Spec->catfile($dir, $name);
- return %result;
- }
-
- if ($dir) { # $noarg has name with directory
- # now $wip_noarg (with directory) is not an executable file
-
- # test name with space
- if ($name =~ / /) {
- my @base = split(/ /, $name);
- my $n = pop @base;
- my @baseargs = ($n);
- while (@base) {
- my $base = join(' ', @base);
- my $file = File::Spec->catpath($dir, $base);
- if (-f $file && -x $file) {
- my $baseargs = join(' ', @baseargs);
- ### where_is_prog()
- if ($args) {
- $args = "$baseargs $args";
- } else {
- $args = $baseargs;
- }
- $result{'args'} = $args;
- $result{'file'} = $base;
- $result{'fullname'} = $file;
- return %result;
- } # file test $file
- $n = pop @base;
- unshift(@baseargs, $n);
- } # while (@base)
- } # end of test name with space
- return ();
- } # test on $dir
-
- # now $noarg doesn't have a directory part
-
- $name = $noarg;
-
- # check with $PATH
-
- # test path with $win_noarg as a whole, evt. with spaces
- foreach my $d (@main::Path) {
- my $file = File::Spec->catfile($d, $name);
- if (-f $file && -x $file) {
- $result{'args'} = $args;
- $result{'fullname'} = $file;
- ($result{'dir'}, $result{'file'}) = &split_path($file);
- return %result;
- } # file test $file
- } # foreach (@main::Path)
-
-### where_is_prog()
- if ($name =~ / /) {
- my @base = split(/ /, $name);
- my $n = pop @base;
- my @baseargs = ($n);
- while (@base) {
- my $base = join(' ', @base);
- foreach my $d (@maon::Path) {
- my $file = File::Spec->catfile($d, $base);
- if (-f $file && -x $file) {
- my $baseargs = join(' ', @baseargs);
- if ($args) {
- $args = "$baseargs $args";
- } else {
- $args = $baseargs;
- }
- $result{'args'} = $args;
- $result{'fullname'} = $file;
- ($result{'dir'}, $result{'file'}) = &split_path($file);
- return %result;
- } # file test $file
- } # foreach (@main::Path)
- $n = pop @base;
- unshift(@baseargs, $n);
- } # while (@base)
- } # test $name on space
- return ();
-} # where_is_prog()
-
-
-##########
-# wait()
-#
-# stop for checking temp files, etc.
-#
-sub wait {
- print "push Ctrl-D";
- my @x = <STDIN>;
- print "\n";
-} # wait()
-
-1;
diff --git a/contrib/groffer/perl/groffer.man b/contrib/groffer/perl/groffer.man
deleted file mode 100644
index fcef1cde..00000000
--- a/contrib/groffer/perl/groffer.man
+++ /dev/null
@@ -1,3920 +0,0 @@
-.TH GROFFER @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@"
-.SH NAME
-groffer \- display groff files and man\~pages on X and tty
-.
-.SH "SYNOPSIS"
-.\" The .SH was moved to this place in order to appease `apropos'.
-.
-.\" --------------------------------------------------------------------
-.\" Legalese
-.\" --------------------------------------------------------------------
-.
-.de author
-This file was written by Bernd Warken <groff-bernd.warken-72@web.de>.
-..
-.de copyleft
-Copyright (C) 2001, 2002, 2004-2006, 2009-2012
- Free Software Foundation, Inc.
-.
-.P
-This file is part of
-.IR \%groffer ,
-which is part of
-.IR \%groff ,
-a free software project.
-.
-You can redistribute it and/or modify it under the terms of the
-.nh
-.B GNU General Public License
-.hy
-as published by the
-.nh
-.BR "Free Software Foundation" ,
-.hy
-either version 3 of the License, or (at your option) any later version.
-.
-.P
-You should have received a copy of the \f[CR]GNU General Public
-License\f[] along with
-.IR groff ,
-see the files \%\f[CB]COPYING\f[] and \%\f[CB]LICENSE\f[] in the top
-directory of the
-.I groff
-source package.
-.
-Or read the
-.I man\~page
-.BR gpl (1).
-You can also visit
-.nh
-.B <http://www.gnu.org/licenses/>.
-.hy
-..
-.
-.\" --------------------------------------------------------------------
-.\" Setup
-.\" --------------------------------------------------------------------
-.
-.ds Ellipsis "\&.\|.\|.\&\"
-.
-.\" --------------------------------------------------------------------
-.\" Macro definitions
-.
-.\" --------------------------------------------------------------------
-.\" .CB (<text>...)
-.\"
-.\" Print in constant-width bold font.
-.\"
-.de CB
-. ft CB
-. Text \\$*
-. ft
-..
-.\" --------------------------------------------------------------------
-.\" .CI (<text>...)
-.\"
-.\" Print in constant-width italic font.
-.\"
-.de CI
-. ft CI
-. Text \\$*
-. ft
-..
-.\" --------------------------------------------------------------------
-.\" .CR (<text>...)
-.\"
-.\" Print in constant-width roman font.
-.\"
-.de CR
-. ft CR
-. Text \\$*
-. ft
-..
-.\" --------------------------------------------------------------------
-.\" .Error (<text>...)
-.\"
-.\" Print error message to terminal and abort.
-.\"
-.de Error
-. tm \\$*
-. ab
-..
-.\" --------------------------------------------------------------------
-.\" .Env_var (<env_var_name> [<punct>])
-.\"
-.\" Display an environment variable, with optional punctuation.
-.\"
-.de Env_var
-. nh
-. SM
-. Text \f[CB]\\$1\f[]\\$2
-. hy
-..
-.\" --------------------------------------------------------------------
-.\" .File_name (<path_name>)
-.\"
-.\" Display a file or directory name in CB font.
-.\"
-.de File_name
-. Header_CB \\$@
-..
-.\" --------------------------------------------------------------------
-.\" .Header_CB (<path_name>)
-.\"
-.\" Display a line in CB font, for example after .TP
-.\"
-.de Header_CB
-. nh
-. Text \f[CB]\\$1\f[]\\$2
-. hy
-..
-.\" --------------------------------------------------------------------
-.\" .Text (<text>...)
-.\"
-.\" Treat the arguments as text, no matter how they look.
-.\"
-.de Text
-. if \\n[.$]=0 \
-. return
-. nh
-. nop \)\\$*\)
-. hy
-..
-.\" --------------------------------------------------------------------
-.\" .Topic ([<indent>])
-.\"
-.\" A bulleted paragraph
-.\"
-.de Topic
-. ie \\n[.$]=0 \
-. ds @indent 2m\"
-. el \
-. ds @indent \\$1\"
-. IP \[bu] \\*[@indent]
-. rm @indent
-..
-
-.\" End of macro definitions
-.
-.
-.\" --------------------------------------------------------------------
-.\" SH "SYNOPSIS"
-.\" --------------------------------------------------------------------
-.
-.SY groffer
-.OP option \*[Ellipsis]
-.OP --
-.OP \%filespec \*[Ellipsis]
-.YS
-.
-.SY groffer
-.BR -h | --help
-.YS
-.
-.SY groffer
-.BR -v | --version
-.YS
-.
-.
-.\" --------------------------------------------------------------------
-.SH DESCRIPTION
-.\" --------------------------------------------------------------------
-.
-The
-.B \%groffer
-program is the easiest way to use
-.BR \%groff (@MAN1EXT@).
-It can display arbitrary documents written in the
-.I \%groff
-language, see
-.BR \%groff (@MAN7EXT@),
-or other
-.I \%roff
-languages, see
-.BR \%roff (@MAN7EXT@),
-that are compatible to the original
-.I \%troff
-language.
-.
-It finds and runs all necessary
-.I groff
-preprocessors, such as
-.BR @g@chem .
-.
-.
-.P
-The
-.B \%groffer
-program also includes many of the features for finding and displaying
-the \%\f[CR]Unix\f[] manual pages
-.nh
-.RI ( man\~pages ),
-.hy
-such that it can be used as a replacement for a
-.BR \%man (1)
-program.
-.
-Moreover, compressed files that can be handled by
-.BR \%gzip (1)
-or
-.BR \%bzip2 (1)
-are decompressed on-the-fly.
-.
-.
-.P
-The normal usage is quite simple by supplying a file name or name of a
-.I \%man\~page
-without further options.
-.
-But the option handling has many possibilities for creating special
-behaviors.
-.
-This can be done either in configuration files, with the shell
-environment variable
-.Env_var \%$GROFFER_OPT ,
-or on the command line.
-.
-.
-.P
-The output can be generated and viewed in several different ways
-available for
-.IR \%groff .
-.
-This includes the
-.I \%groff
-native \%\f[CR]X\~Window\f[] viewer
-.BR \%gxditview (@MAN1EXT@),
-each
-.IR \%Postcript ,
-.IR \%pdf ,
-or
-.I \%dvi
-display program, a web browser by generating
-.I \%html
-in
-.IR \%www\~mode ,
-or several
-.I \%text\~modes
-in text terminals.
-.
-.
-.P
-Most of the options that must be named when running
-.B \%groff
-directly are determined automatically for
-.BR \%groffer ,
-due to the internal usage of the
-.BR \%grog (@MAN1EXT@)
-program.
-.
-But all parts can also be controlled manually by arguments.
-.
-.
-.P
-Several file names can be specified on the command line arguments.
-.
-They are transformed into a single document in the normal way of
-.BR \%groff .
-.
-.
-.P
-Option handling is done in \f[CR]GNU\f[] style.
-.
-Options and file names can be mixed freely.
-.
-The option
-.RB ` \-\- '
-closes the option handling, all following arguments are treated as
-file names.
-.
-Long options can be abbreviated in several ways.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "OPTION OVERVIEW"
-.\" --------------------------------------------------------------------
-.
-.TP
-.I breaking options
-.RS
-.P
-.SY
-.OP -h\~\fR|\fB\~--help
-.OP -v\~\fR|\fB\~--version
-.YS
-.RE
-.
-.
-.TP
-.I \%groffer mode options
-.RS
-.P
-.SY
-.OP --auto
-.OP --default
-.OP --default\-modes mode1,mode2,\*[Ellipsis]
-.OP --dvi
-.OP --dvi\-viewer prog
-.OP --groff
-.OP --html
-.OP --html\-viewer prog
-.OP --mode display_mode
-.OP --pdf
-.OP --pdf\-viewer prog
-.OP --ps
-.OP --ps\-viewer prog
-.OP --source
-.OP --text
-.OP --to\-stdout
-.OP --tty
-.OP --tty\-viewer prog
-.OP --www
-.OP --www\-viewer prog
-.OP --x\~\fR|\fB\~--X
-.OP --x\-viewer\~\fR|\fB\~--X\-viewer prog
-.YS
-.RE
-.
-.
-.TP
-.I options related to \%groff
-.RS
-.P
-.SY
-.OP -T\~\fR|\fB\~--device device
-.OP -Z\~\fR|\fB\~--intermediate\-output\~\fR|\fB\~--ditroff
-.YS
-.P
-All further
-.B \%groff
-short options are accepted.
-.RE
-.
-.
-.TP
-.I options for man\~pages
-.RS
-.P
-.SY
-.OP --apropos
-.OP --apropos\-data
-.OP --apropos\-devel
-.OP --apropos\-progs
-.OP --man
-.OP --no\-man
-.OP --no\-special
-.OP --whatis
-.YS
-.RE
-.
-.
-.TP
-.I long options taken over from GNU man
-.RS
-.P
-.SY
-.OP --all
-.OP --ascii
-.OP --ditroff
-.OP --extension suffix
-.OP --locale language
-.OP --local\-file
-.OP --location\~\fR|\fB\~--where
-.OP --manpath dir1:dir2:\*[Ellipsis]
-.OP --no\-location
-.OP --pager program
-.OP --sections sec1:sec2:\*[Ellipsis]
-.OP --systems sys1,sys2,\*[Ellipsis]
-.OP --troff\-device device
-.YS
-.P
-Further long options of \f[CR]GNU\f[]
-.B man
-are accepted as well.
-.RE
-.
-.
-.TP
-.I X Window Toolkit options
-.RS
-.P
-.SY
-.OP --bd\~\fR|\fB\~--bordercolor pixels
-.OP --bg\~\fR|\fB\~--background color
-.OP --bw\~\fR|\fB\~--borderwidth pixels
-.OP --display X-display
-.OP --fg\~\fR|\fB\~--foreground color
-.OP --fn\~\fR|\fB\~--ft\~\fR|\fB\~--font font_name
-.OP --geometry size_pos
-.OP --resolution value
-.OP --rv
-.OP --title string
-.OP --xrm X\-resource
-.YS
-.RE
-.
-.
-.TP
-.I options for development
-.RS
-.P
-.SY
-.OP --debug
-.OP --debug\-filenames
-.OP --debug\-grog
-.OP --debug\-keep
-.OP --debug\-params
-.OP --debug\-tmpdir
-.OP --do\-nothing
-.OP --print text
-.OP -V
-.YS
-.RE
-.
-.
-.TP
-.I \%filespec arguments
-.RS
-.P
-The
-.I \%filespec
-parameters are all arguments that are neither an option nor an option
-argument.
-.
-They usually mean a file name or a
-.I man page
-searching scheme.
-.
-.
-.P
-In the following, the term
-.I section_extension
-is used.
-.
-It means a word that consists of a
-.I man section
-that is optionally followed by an
-.IR extension .
-.
-The name of a
-.I man section
-is a single character from
-.BR \%[1-9on] ,
-the
-.I extension
-is some word.
-.
-The
-.I extension
-is mostly lacking.
-.
-.
-.P
-No
-.I \%filespec
-parameters means standard input.
-.
-.
-.TP 10m
-.B -
-stands for standard input (can occur several times).
-.
-.
-.TP
-.I filename
-the path name of an existing file.
-.
-.
-.TP
-.BI man: name ( section_extension )
-.TQ
-.BI man: name . section_extension
-.TQ
-.IB name ( section_extension )
-.TQ
-.IB name . section_extension
-.TQ
-.I "section_extension name"
-search the \%man\~page
-.I \%name
-in the section with optional extension
-.IR section_extension .
-.
-.
-.TP
-.BI man: name
-\%man\~page in the lowest
-.I \%man\~section
-that has
-.IR \%name .
-.
-.
-.TP
-.I name
-if
-.I \%name
-is not an existing file search for the man\~page
-.I \%name
-in the lowest man\~section.
-.
-.RE
-.
-.
-.\" --------------------------------------------------------------------
-.SH "OPTION DETAILS"
-.\" --------------------------------------------------------------------
-.
-The
-.B \%groffer
-program can usually be run with very few options.
-.
-But for special purposes, it supports many options.
-.
-These can be classified in 5 option classes.
-.
-.
-.P
-All short options of
-.B \%groffer
-are compatible with the short options of
-.BR \%groff (@MAN1EXT@).
-.
-All long options of
-.B \%groffer
-are compatible with the long options of
-.BR \%man (1).
-.
-.
-.P
-Arguments for long option names can be abbreviated in several ways.
-.
-First, the argument is checked whether it can be prolonged as is.
-.
-Furthermore, each minus sign
-.B -
-is considered as a starting point for a new abbreviation.
-.
-This leads to a set of multiple abbreviations for a single argument.
-.
-For example,
-.B --de\-n\-f
-can be used as an abbreviation for
-.BR --debug\-not\-func ,
-but
-.B --de\-n
-works as well.
-.
-If the abbreviation of the argument leads to several resulting options
-an error is raised.
-.
-.
-.P
-These abbreviations are only allowed in the environment variable
-.Env_var \%$GROFFER_OPT ,
-but not in the configuration files.
-.
-In configuration, all long options must be exact.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "groffer breaking Options"
-.\" --------------------------------------------------------------------
-.
-As soon as one of these options is found on the command line it is
-executed, printed to standard output, and the running
-.B \%groffer
-is terminated thereafter.
-.
-All other arguments are ignored.
-.
-.
-.TP
-.B -h\~\fR|\fB\~--help
-Print help information with a short explanation of options to
-standard output.
-.
-.
-.TP
-.B -v\~\fR|\fB\~--version
-Print version information to standard output.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "groffer Mode Options"
-.\" --------------------------------------------------------------------
-.
-The display mode and the viewer programs are determined by these
-options.
-.
-If none of these mode and viewer options is specified
-.B \%groffer
-tries to find a suitable display mode automatically.
-.
-The default modes are
-.IR "mode pdf" ,
-.IR "mode ps" ,
-.IR "mode html" ,
-.IR "mode x" ,
-and
-.I "mode dvi"
-in \%\f[CR]X\~Window\f[] with different viewers and
-.I mode tty
-with device
-.I latin1
-under
-.B less
-on a terminal; other modes are tested if the programs for the main
-default mode do not exist.
-.
-.
-.P
-In \%\f[CR]X\~Window\f[],
-many programs create their own window when called.
-.B \%groffer
-can run these viewers as an independent program in the background.
-.
-As this does not work in text mode on a terminal (tty) there must be a
-way to know which viewers are \%\f[CR]X\~Window\f[] graphical
-programs.
-.
-The
-.B \%groffer
-script has a small set of information on some viewer names.
-.
-If a viewer argument of the command\-line chooses an element that is
-kept as \%\f[CR]X\~Window\f[] program in this list it is treated as a
-viewer that can run in the background.
-.
-All other, unknown viewer calls are not run in the background.
-.
-.
-.P
-For each mode, you are free to choose whatever viewer you want.
-.
-That need not be some graphical viewer suitable for this mode.
-.
-There is a chance to view the output source; for example, the
-combination of the options
-.B --mode=ps
-and
-.B --ps\-viewer=less
-shows the content of the
-.I Postscript
-output, the source code, with the pager
-.BR less .
-.
-.
-.TP
-.B --auto
-Equivalent to
-.BR --mode=auto .
-.
-.
-.TP
-.B --default
-Reset all configuration from previously processed command line options
-to the default values.
-.
-This is useful to wipe out all former options of the configuration, in
-.Env_var \%$GROFFER_OPT ,
-and restart option processing using only the rest of the command line.
-.
-.
-.TP
-.BI --default\-modes \ mode1,mode2,\*[Ellipsis]
-Set the sequence of modes for
-.I \%auto\~mode
-to the comma separated list given in the argument.
-.
-See
-.B --mode
-for details on modes. Display in the default manner; actually, this
-means to try the modes
-.IR x ,
-.IR ps ,
-and
-.I \%tty
-in this sequence.
-.
-.
-.
-.TP
-.B --dvi
-Equivalent to
-.BR --mode=\%dvi .
-.
-.
-.TP
-.BI --dvi\-viewer \ prog
-Choose a viewer program for
-.IR \%dvi\~mode .
-.
-This can be a file name or a program to be searched in
-.Env_var $PATH .
-.
-Known \%\f[CR]X\~Window\f[]
-.I \%dvi
-viewers include
-.BR \%xdvi (1)
-and
-.BR \%dvilx (1).
-.
-In each case, arguments can be provided additionally.
-.
-.
-.TP
-.B --groff
-Equivalent to
-.BR --mode=groff .
-.
-.
-.TP
-.B --html
-Equivalent to
-.BR --mode=html .
-.
-.
-.TP
-.B --html\-viewer
-Choose a web browser program for viewing in
-.IR \%html\~mode .
-.
-It can be the path name of an executable file or a program in
-.Env_var $PATH .
-.
-In each case, arguments can be provided additionally.
-.
-.
-.TP
-.BI --mode \ value
-.
-Set the display mode.
-.
-The following mode values are recognized:
-.
-.RS
-.
-.TP
-.Header_CB auto
-Select the automatic determination of the display mode.
-.
-The sequence of modes that are tried can be set with the
-.B --default\-modes
-option.
-.
-Useful for restoring the
-.I \%default\~mode
-when a different mode was specified before.
-.
-.
-.TP
-.Header_CB dvi
-Display formatted input in a
-.I \%dvi
-viewer program.
-.
-By default, the formatted input is displayed with the
-.BR \%xdvi (1)
-program.
-.
-.
-.TP
-.Header_CB groff
-After the file determination, switch
-.B \%groffer
-to process the input like
-.BR \%groff (@MAN1EXT@)
-would do.
-.
-This disables the
-.I \%groffer
-viewing features.
-.
-.
-.TP
-.Header_CB html
-Translate the input into html format and display the result in a web
-browser program.
-.
-By default, the existence of a sequence of standard web browsers is
-tested, starting with
-.BR \%konqueror (1)
-and
-.BR \%mozilla (1).
-The text html viewer is
-.BR \%lynx (1).
-.
-.
-.TP
-.Header_CB pdf
-Display formatted input in a
-.I \%PDF
-(Portable Document Format) viewer
-program.
-.
-By default, the input is formatted by
-.B \%groff
-using the Postscript device, then it is transformed into the PDF file
-format using
-.BR \%gs (1),
-or
-.BR ps2pdf (1).
-If that's not possible, the
-.I Postscript mode (ps)
-is used instead.
-.
-Finally it is displayed using different viewer programs.
-.
-.I \%pdf
-has a big advantage because the text is displayed graphically and
-is searchable as well.
-.
-.
-.TP
-.Header_CB ps
-Display formatted input in a Postscript viewer program.
-.
-By default, the formatted input is displayed in one of many viewer
-programs.
-.
-.
-.TP
-.Header_CB text
-Format in a
-.I \%groff\~text\~mode
-and write the result to standard output without a pager or viewer
-program.
-.
-The text device,
-.I \%latin1
-by default, can be chosen with option
-.BR -T .
-.
-.
-.TP
-.Header_CB tty
-Format in a
-.I \%groff\~text\~mode
-and write the result to standard output using a text pager program,
-even when in \%\f[CR]X\~Window\f[].
-.
-.
-.TP
-.Header_CB www
-Equivalent to
-.BR --mode=html .
-.
-.
-.TP
-.Header_CB x
-Display the formatted input in a native
-.I roff
-viewer.
-.
-By default, the formatted input is displayed with the
-.BR \%gxditview (@MAN1EXT@)
-program being distributed together with
-.BR \%groff .
-But the standard \%\f[CR]X\~Window\f[] tool
-.BR \%xditview (1)
-can also be chosen with the option
-.BR --x\-viewer .
-The default resolution is
-.BR 75dpi ,
-but
-.B 100dpi
-are also possible.
-.
-The default
-.I groff
-device
-for the resolution of
-.B 75dpi
-is
-.BR X75\-12 ,
-for
-.B 100dpi
-it is
-.BR X100 .
-.
-The corresponding
-.I "groff intermediate output"
-for the actual device is generated and the result is displayed.
-.
-For a resolution of
-.BR 100dpi ,
-the default width of the geometry of the display program is chosen to
-.BR 850dpi .
-.
-.
-.TP
-.Header_CB X
-Equivalent to
-.BR --mode=x .
-.
-.
-.P
-The following modes do not use the
-.I \%groffer
-viewing features.
-.
-They are only interesting for advanced applications.
-.
-.
-.TP
-.Header_CB groff
-Generate device output with plain
-.I \%groff
-without using the special viewing features of
-.IR \%groffer .
-If no device was specified by option
-.B -T
-the
-.I \%groff
-default
-.B \%ps
-is assumed.
-.
-.
-.TP
-.Header_CB source
-Output the roff source code of the input files without further
-processing.
-.
-.
-.RE
-.
-.
-.TP
-.B --pdf
-Equivalent to
-.BR --mode=pdf .
-.
-.
-.TP
-.BI --pdf\-viewer \ prog
-Choose a viewer program for
-.IR \%pdf\~mode .
-.
-This can be a file name or a program to be searched in
-.Env_var $PATH ;
-arguments can be provided additionally.
-.
-.
-.TP
-.B --ps
-Equivalent to
-.BR --mode=ps .
-.
-.
-.TP
-.BI --ps\-viewer \ prog
-Choose a viewer program for
-.IR \%ps\~mode .
-.
-This can be a file name or a program to be searched in
-.Env_var $PATH .
-.
-Common Postscript viewers include
-.BR \%gv (1),
-.BR \%ghostview (1),
-and
-.BR \%gs (1),
-.
-In each case, arguments can be provided additionally.
-.
-.
-.TP
-.B --source
-Equivalent to
-.BR --mode=source .
-.
-.
-.TP
-.B --text
-Equivalent to
-.BR --mode=text .
-.
-.
-.TP
-.B --to\-stdout
-The file for the chosen mode is generated and its content is printed
-to standard output.
-.
-It will not be displayed in graphical mode.
-.
-.
-.TP
-.B --tty
-Equivalent to
-.BR --mode=tty .
-.
-.
-.TP
-.BI --tty\-viewer \ prog
-Choose a text pager for mode
-.IR tty .
-The standard pager is
-.BR less (1).
-This option is equivalent to
-.I man
-option
-.BR --pager=\fIprog\fP .
-The option argument can be a file name or a program to be searched in
-.Env_var $PATH ;
-arguments can be provided additionally.
-.
-.
-.TP
-.B --www
-Equivalent to
-.BR --mode=html .
-.
-.
-.TP
-.BI --www\-viewer \ prog
-Equivalent to
-.BR --html\-viewer .
-.
-.
-.TP
-.B --X\~\fR|\fB\~--x
-Equivalent to
-.BR --mode=x .
-.
-.
-.TP
-.BI --X\-viewer\~\fR|\fB\~--x\-viewer \ prog
-Choose a viewer program for
-.IR \%x\~mode .
-Suitable viewer programs are
-.BR \%gxditview (@MAN1EXT@)
-which is the default and
-.BR \%xditview (1).
-The argument can be any executable file or a program in
-.Env_var $PATH ;
-arguments can be provided additionally.
-.
-.
-.TP
-.B --
-Signals the end of option processing; all remaining arguments are
-interpreted as
-.I \%filespec
-parameters.
-.
-.
-.P
-Besides these,
-.B \%groffer
-accepts all short options that are valid for the
-.BR \%groff (@MAN1EXT@)
-program.
-.
-All
-.RB \%non- groffer
-options are sent unmodified via
-.B \%grog
-to
-.BR \%groff .
-.
-So postprocessors, macro packages, compatibility with
-.I classical
-.IR \%troff ,
-and much more can be manually specified.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Options related to groff"
-.\" --------------------------------------------------------------------
-.
-All short options of
-.B \%groffer
-are compatible with the short options of
-.BR \%groff (@MAN1EXT@).
-.
-The following of
-.B \%groff
-options have either an additional special meaning within
-.B \%groffer
-or make sense for normal usage.
-.
-.
-.P
-Because of the special outputting behavior of the
-.B \%groff
-option
-.B -Z
-.B \%groffer
-was designed to be switched into
-.IR \%groff\~mode ;
-the
-.I \%groffer
-viewing features are disabled there.
-.
-The other
-.B \%groff
-options do not switch the mode, but allow to customize the formatting
-process.
-.
-.
-.TP
-.B --a
-This generates an ascii approximation of output in the
-.IR \%text\~modes .
-.
-That could be important when the text pager has problems with control
-sequences in
-.IR "tty mode" .
-.
-.
-.TP
-.BI --m \ file
-Add
-.I \%file
-as a
-.I \%groff
-macro file.
-.
-This is useful in case it cannot be recognized automatically.
-.
-.
-.TP
-.BI --P \ opt_or_arg
-Send the argument
-.I \%opt_or_arg
-as an option or option argument to the actual
-.B \%groff
-postprocessor.
-.
-.
-.TP
-.B --T \fIdevname\fR\~\fR|\fB\~--device \fIdevname\fR
-.
-This option determines
-.BR \%groff 's
-output device.
-.
-The most important devices are the text output devices for referring
-to the different character sets, such as
-.BR \%ascii ,
-.BR \%utf8 ,
-.BR \%latin1 ,
-and others.
-.
-Each of these arguments switches
-.B \%groffer
-into a
-.I \%text\~mode
-using this device, to
-.I \%mode\~tty
-if the actual mode is not a
-.IR \%text\~mode .
-.
-The following
-.I \%devname
-arguments are mapped to the corresponding
-.B \%groffer
-.B --mode=\fIdevname\fR
-option:
-.BR \%dvi ,
-.BR \%html ,
-and
-.BR \%ps .
-All
-.B \%X*
-arguments are mapped to
-.IR \%mode\~x .
-Each other
-.I \%devname
-argument switches to
-.I \%mode\~groff
-using this device.
-.
-.
-.TP
-.B --X
-is equivalent to
-.BR "groff \-X" .
-It displays the
-.I groff intermediate output
-with
-.BR gxditview .
-As the quality is relatively bad this option is deprecated; use
-.B --X
-instead because the
-.I \%x\~mode
-uses an
-.IR X *
-device for a better display.
-.
-.
-.TP
-.B -Z\~\fR|\fB\~--intermediate-output\~\fR|\fB\~--ditroff
-Switch into
-.I \%groff\~mode
-and format the input with the
-.I \%groff intermediate output
-without postprocessing; see
-.BR \%groff_out (@MAN5EXT@).
-This is equivalent to option
-.B --ditroff
-of
-.IR \%man ,
-which can be used as well.
-.
-.
-.P
-All other
-.B \%groff
-options are supported by
-.BR \%groffer ,
-but they are just transparently transferred to
-.B \%groff
-without any intervention.
-.
-The options that are not explicitly handled by
-.B \%groffer
-are transparently passed to
-.BR \%groff .
-.
-Therefore these transparent options are not documented here, but in
-.BR \%groff (@MAN1EXT@).
-Due to the automatism in
-.BR \%groffer ,
-none of these
-.B \%groff
-options should be needed, except for advanced usage.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Options for man\~pages"
-.\" --------------------------------------------------------------------
-.
-.TP
-.B --apropos
-Start the
-.BR \%apropos (1)
-command or facility of
-.BR \%man (1)
-for searching the
-.I \%filespec
-arguments within all
-.I \%man\~page
-descriptions.
-.
-Each
-.I \%filespec
-argument is taken for search as it is;
-.I section
-specific parts are not handled, such that
-.B 7 groff
-searches for the two arguments
-.B 7
-and
-.BR groff ,
-with a large result; for the
-.I \%filespec
-.B groff.7
-nothing will be found.
-.
-The
-.I language
-locale is handled only when the called programs do support this; the
-GNU
-.B apropos
-and
-.B man \-k
-do not.
-.
-The display differs from the
-.B \%apropos
-program by the following concepts:
-.RS
-.Topic
-Construct a
-.I \%groff
-frame similar to a
-.I \%man\~page
-to the output of
-.BR \%apropos ,
-.Topic
-each
-.I \%filespec
-argument is searched on its own.
-.Topic
-The restriction by
-.B --sections
-is handled as well,
-.Topic
-wildcard characters are allowed and handled without a further option.
-.RE
-.
-.
-.TP
-.B --apropos\-data
-Show only the
-.B \%apropos
-descriptions for data documents, these are the
-.BR \%man (7)
-.IR sections\~4 ", " 5 ", and " 7 .
-.
-Direct
-.I section
-declarations are ignored, wildcards are accepted.
-.
-.
-.TP
-.B --apropos\-devel
-Show only the
-.B \%apropos
-descriptions for development documents, these are the
-.BR man (7)
-.IR sections\~2 ", " 3 ", and " 9 .
-.
-Direct
-.I section
-declarations are ignored, wildcards are accepted.
-.
-.
-.TP
-.B --apropos\-progs
-Show only the
-.B \%apropos
-descriptions for documents on programs, these are the
-.BR \%man (7)
-.IR sections\~1 ", " 6 ", and " 8 .
-.
-Direct
-.I section
-declarations are ignored, wildcards are accepted.
-.
-.
-.TP
-.B --whatis
-For each
-.I \%filespec
-argument search all
-.I \%man\~pages
-and display their description \[em] or say that it is not a
-.IR \%man\~page .
-This is written from anew, so it differs from
-.IR man 's
-.B whatis
-output by the following concepts
-.RS
-.Topic
-each retrieved file name is added,
-.Topic
-local files are handled as well,
-.Topic
-the \fIlanguage\fP and \fIsystem\fP locale is supported,
-.Topic
-the display is framed by a
-.I groff
-output format similar to a
-.IR \%man\~page ,
-.Topic
-wildcard characters are allowed without a further option.
-.RE
-.
-.
-.P
-The following options were added to
-.B \%groffer
-for choosing whether the file name arguments are interpreted as names
-for local files or as a search pattern for
-.IR \%man\~pages .
-.
-The default is looking up for local files.
-.
-.
-.TP
-.B --man
-Check the non-option command line arguments
-.nh
-.RI ( filespecs )
-.hy
-first on being
-.IR \%man\~pages ,
-then whether they represent an existing file.
-.
-By default, a
-.I \%filespec
-is first tested whether it is an existing file.
-.
-.
-.TP
-.B --no-man\~\fR|\fB\~--local-file
-Do not check for
-.IR \%man\~pages .
-.
-.B --local-file
-is the corresponding
-.B man
-option.
-.
-.
-.TP
-.B --no-special
-Disable former calls of
-.BR --all ,
-.BR --apropos* ,
-and
-.BR --whatis .
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Long options taken over from GNU man"
-.\" --------------------------------------------------------------------
-.
-The long options of
-.B \%groffer
-were synchronized with the long options of \f[CR]GNU\f[]
-.BR man .
-.
-All long options of \f[CR]GNU\f[]
-.B man
-are recognized, but not all of these options are important to
-.BR \%groffer ,
-so most of them are just ignored.
-.
-These ignored
-.B man
-options are
-.BR --catman ,
-.BR --troff ,
-and
-.BR --update .
-.
-.
-.P
-In the following, the
-.B man
-options that have a special meaning for
-.B \%groffer
-are documented.
-.
-.
-.P
-If your system has \f[CR]GNU\f[]
-.B man
-installed the full set of long and short options of the \f[CR]GNU\f[]
-.B man
-program can be passed via the environment variable
-.Env_var \%$MANOPT ;
-see
-.BR \%man (1).
-.
-.
-.TP
-.B --all
-In searching
-.IR \%man\~pages ,
-retrieve all suitable documents instead of only one.
-.
-.
-.TP
-.B -7\~\fR|\fB\~--ascii
-In
-.IR \%text\~modes ,
-display ASCII translation of special characters for critical environment.
-.
-This is equivalent to
-.BR "groff \%-mtty_char" ;
-see
-.BR groff_tmac (@MAN5EXT@).
-.
-.
-.TP
-.B --ditroff
-Produce
-.IR "groff intermediate output" .
-This is equivalent to
-.B \%groffer
-.BR -Z .
-.
-.
-.TP
-.BI --extension \ suffix
-Restrict
-.I \%man\~page
-search to file names that have
-.I \%suffix
-appended to their section element.
-.
-For example, in the file name
-.I \%/usr/share/man/man3/terminfo.3ncurses.gz
-the
-.I \%man\~page
-extension is
-.IR \%ncurses .
-.
-.
-.TP
-.BI --locale \ language
-.
-Set the language for
-.IR \%man\~pages .
-.
-This has the same effect, but overwrites
-.Env_var $LANG .
-.
-.
-.TP
-.B --location
-Print the location of the retrieved files to standard error.
-.
-.
-.TP
-.B --no-location
-Do not display the location of retrieved files; this resets a former
-call to
-.BR --location .
-.
-This was added by
-.BR \%groffer .
-.
-.
-.TP
-.BI --manpath \ 'dir1:dir2:\*[Ellipsis]'
-Use the specified search path for retrieving
-.I \%man\~pages
-instead of the program defaults.
-.
-If the argument is set to the empty string "" the search for
-.I \%man\~page
-is disabled.
-.
-.
-.TP
-.B --pager
-Set the pager program in
-.IR \%tty\~mode ;
-default is
-.BR \%less .
-This is equivalent to
-.BR --tty\-viewer .
-.
-.
-.TP
-.BI --sections \ sec1:sec2:\*[Ellipsis]
-Restrict searching for
-.I \%man\~pages
-to the given
-.IR sections ,
-a colon-separated list.
-.
-.
-.TP
-.BI --systems \ sys1,sys2,\*[Ellipsis]
-Search for
-.I \%man\~pages
-for the given operating systems; the argument
-.I \%systems
-is a comma-separated list.
-.
-.
-.TP
-.B --where
-Equivalent to
-.BR --location .
-.
-.
-.\" --------------------------------------------------------------------
-.SS "X\~\%Window\~\%Toolkit Options"
-.\" --------------------------------------------------------------------
-.
-The following long options were adapted from the corresponding
-\%\f[CR]X\~Window\~Toolkit\f[] options.
-.
-.B \%groffer
-will pass them to the actual viewer program if it is an
-\%\f[CR]X\~Window\f[] program.
-.
-Otherwise these options are ignored.
-.
-.
-.P
-Unfortunately these options use the old style of a single minus for
-long options.
-.
-For
-.B \%groffer
-that was changed to the standard with using a double minus for long
-options, for example,
-.B \%groffer
-uses the option
-.B --font
-for the \%\f[CR]X\~Window\f[] option
-.BR -font .
-.
-.
-.P
-See
-.BR X (7)
-and the documentation on the \%\f[CR]X\~Window\~Toolkit\f[] options
-for more details on these options and their arguments.
-.
-.
-.TP
-.BI --background \ color
-Set the background color of the viewer window.
-.
-.
-.TP
-.BI --bd \ pixels
-This is equivalent to
-.BR --bordercolor .
-.
-.
-.TP
-.BI --bg \ color
-This is equivalent to
-.BR --background .
-.
-.
-.TP
-.BI --bw \ pixels
-This is equivalent to
-.BR --borderwidth .
-.
-.
-.TP
-.BI --bordercolor \ pixels
-Specifies the color of the border surrounding the viewer window.
-.
-.
-.TP
-.BI --borderwidth \ pixels
-Specifies the width in pixels of the border surrounding the viewer
-window.
-.
-.
-.TP
-.BI --display \ X-display
-Set the \%\f[CR]X\~Window\f[] display on which the viewer program
-shall be started, see the \%\f[CR]X\~Window\f[] documentation for the
-syntax of the argument.
-.
-.
-.TP
-.BI --foreground \ color
-Set the foreground color of the viewer window.
-.
-.
-.TP
-.BI --fg \ color
-This is equivalent to
-.BR -foreground .
-.
-.
-.TP
-.BI --fn \ font_name
-This is equivalent to
-.BR --font .
-.
-.
-.TP
-.BI --font \ font_name
-Set the font used by the viewer window.
-.
-The argument is an \%\f[CR]X\~Window\f[] font name.
-.
-.
-.TP
-.BI --ft \ font_name
-This is equivalent to
-.BR --font .
-.
-.
-.TP
-.BI --geometry \ size_pos
-Set the geometry of the display window, that means its size and its
-starting position.
-.
-See
-.BR \%X (7)
-for the syntax of the argument.
-.
-.
-.TP
-.BI --resolution \ value
-Set \%\f[CR]X\~Window\f[] resolution in dpi (dots per inch) in some
-viewer programs.
-.
-The only supported dpi values are
-.B 75
-and
-.BR 100 .
-.
-Actually, the default resolution for
-.B \%groffer
-is set to
-.BR 75dpi .
-The resolution also sets the default device in
-.IR "mode x" .
-.
-.
-.TP
-.B --rv
-Reverse foreground and background color of the viewer window.
-.
-.
-.TP
-.BI --title "\ 'some text'"
-Set the title for the viewer window.
-.
-.
-.TP
-.BI --xrm \ 'resource'
-Set \f[CR]\%X\~Window\f[] resource.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Options for Development"
-.\" --------------------------------------------------------------------
-.
-.TP
-.B --debug
-Enable all debugging options
-.BR --debug\-\fItype\fP .
-.
-The temporary files are kept and not deleted, the
-.B grog
-output is printed, the name of the temporary directory is printed, the
-displayed file names are printed, and the parameters are printed.
-.
-.
-.TP
-.B --debug\-filenames
-Print the names of the files and
-.I \%man\~pages
-that are displayed by
-.BR \&groffer .
-.
-.
-.TP
-.B --debug\-grog
-Print the output of all
-.B grog
-commands.
-.
-.
-.TP
-.B --debug\-keep
-Enable two debugging informations.
-.
-Print the name of the temporary directory and keep the temporary
-files, do not delete them during the run of
-.BR \%groffer .
-.
-.
-.TP
-.B --debug\-params
-Print the parameters, as obtained from the configuration files, from
-.Env_var \%GROFFER_OPT ,
-and the command line arguments.
-.
-.
-.TP
-.B --debug\-tmpdir
-Print the name of the temporary directory.
-.
-.
-.TP
-.B --do-nothing
-This is like
-.BR --version ,
-but without the output; no viewer is started.
-.
-This makes only sense in development.
-.
-.
-.TP
-.B --print=\fItext\fR
-Just print the argument to standard error.
-.
-This is good for parameter check.
-.
-.
-.TP
-.B -V
-This is an advanced option for debugging only.
-.
-Instead of displaying the formatted input, a lot of
-.I \%groffer
-specific information is printed to standard output:
-.
-.RS
-.Topic
-the output file name in the temporary directory,
-.
-.Topic
-the display mode of the actual
-.B \%groffer
-run,
-.
-.Topic
-the display program for viewing the output with its arguments,
-.
-.Topic
-the active parameters from the config files, the arguments in
-.Env_var \%$GROFFER_OPT ,
-and the arguments of the command line,
-.
-.Topic
-the pipeline that would be run by the
-.B \%groff
-program, but without executing it.
-.RE
-.
-.
-.P
-Other useful debugging options are the
-.B \%groff
-option
-.B -Z
-and
-.BR --mode=groff .
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Filespec Arguments"
-.\" --------------------------------------------------------------------
-.
-A
-.I \%filespec
-parameter is an argument that is not an option or option argument.
-.
-In
-.BR \%groffer ,
-.I \%filespec
-parameters are a file name or a template for searching
-.IR \%man\~pages .
-.
-These input sources are collected and composed into a single output
-file such as
-.B \%groff
-does.
-.
-.
-.P
-The strange \%\f[CR]POSIX\f[] behavior to regard all arguments behind
-the first non-option argument as
-.I \%filespec
-arguments is ignored.
-.
-The \f[CR]GNU\f[] behavior to recognize options even when mixed with
-.I \%filespec
-arguments is used throughout.
-.
-But, as usual, the double minus argument
-.B --
-ends the option handling and interprets all following arguments as
-.I \%filespec
-arguments; so the \%\f[CR]POSIX\f[] behavior can be easily adopted.
-.
-.
-.P
-The options
-.B --apropos*
-have a special handling of
-.I filespec
-arguments.
-.
-Each argument is taken as a search scheme of its own.
-.
-Also a regexp (regular expression) can be used in the filespec.
-.
-For example,
-.B groffer --apropos '^gro.f$'
-searches
-.B groff
-in the
-.I man\~page
-name, while
-.B groffer --apropos groff
-searches
-.B groff
-somewhere in the name or description of the
-.IR man\~pages .
-.
-.
-.P
-All other parts of
-.IR groffer ,
-such as the normal display or the output with
-.B --whatis
-have a different scheme for
-.IR filespecs .
-No regular expressions are used for the arguments.
-.
-The
-.I filespec
-arguments are handled by the following scheme.
-.
-.
-.P
-It is necessary to know that on each system the
-.I \%man\~pages
-are sorted according to their content into several sections.
-.
-The
-.I classical man sections
-have a single-character name, either a digit from
-.B 1
-to
-.B 9
-or one of the characters
-.B n
-or
-.BR o .
-.
-.
-.P
-This can optionally be followed by a string, the so-called
-.IR extension .
-The
-.I extension
-allows to store several
-.I man\~pages
-with the same name in the same
-.IR section .
-But the
-.I extension
-is only rarely used, usually it is omitted.
-.
-Then the
-.I extensions
-are searched automatically by alphabet.
-.
-.
-.P
-In the following, we use the name
-.I section_extension
-for a word that consists of a single character
-.I section
-name or a
-.I section
-character that is followed by an
-.IR extension .
-.
-Each
-.I \%filespec
-parameter can have one of the following forms in decreasing sequence.
-.
-.
-.Topic
-No
-.I \%filespec
-parameters means that
-.B \%groffer
-waits for standard input.
-.
-The minus option
-.B -
-always stands for standard input; it can occur several times.
-.
-If you want to look up a
-.I \%man\~page
-called
-.B -
-use the argument
-.BR man:\- .
-.
-.
-.Topic
-Next a
-.I \%filespec
-is tested whether it is the path name of an existing file.
-.
-Otherwise it is assumed to be a searching pattern for a
-.IR \%man\~page .
-.
-.
-.Topic
-.BI \%man: name ( section_extension ) ,
-.BI \%man: name . section_extension,
-.IB \%name ( section_extension ) ,
-or
-.IB \%name . section_extension
-search the \%man\~page
-.I \%name
-in \%man\~section and possibly extension of
-.IR \%section_extension .
-.
-.
-.Topic
-Now
-.BI \%man: name
-searches for a
-.I \%man\~page
-in the lowest
-.I \%man\~section
-that has a document called
-.IR \%name .
-.
-.
-.Topic
-.I \%section_extension\~name
-is a pattern of 2 arguments that originates from a strange argument
-parsing of the
-.B man
-program.
-.
-Again, this searches the man page
-.I name
-with
-.IR \%section_extension ,
-a combination of a
-.I section
-character optionally followed by an
-.IR extension .
-.
-.
-.Topic
-We are left with the argument
-.I \%name
-which is not an existing file.
-.
-So this searches for the
-.I \%man\~page
-called
-.I \%name
-in the lowest
-.I \%man\~section
-that has a document for this name.
-.
-.
-.P
-Several file name arguments can be supplied.
-.
-They are mixed by
-.B \%groff
-into a single document.
-.
-Note that the set of option arguments must fit to all of these file
-arguments.
-.
-So they should have at least the same style of the
-.I \%groff
-language.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "OUTPUT MODES"
-.\" --------------------------------------------------------------------
-.
-By default, the
-.B \%groffer
-program collects all input into a single file, formats it with the
-.B \%groff
-program for a certain device, and then chooses a suitable viewer
-program.
-.
-The device and viewer process in
-.B \%groffer
-is called a
-.IR \%mode .
-.
-The mode and viewer of a running
-.B \%groffer
-program is selected automatically, but the user can also choose it
-with options.
-.
-.
-The modes are selected by option the arguments of
-.BR --mode=\fIanymode .
-Additionally, each of this argument can be specified as an option of
-its own, such as
-.BR anymode .
-Most of these modes have a viewer program, which can be chosen by an
-option that is constructed like
-.BR --\fIanymode\fR\-viewer .
-.
-.
-.P
-Several different modes are offered, graphical modes for
-\f[CR]\%X\~Window\f[],
-.IR \%text\~modes ,
-and some direct
-.I \%groff\~modes
-for debugging and development.
-.
-.
-.P
-By default,
-.B \%groffer
-first tries whether
-.I \%x\~mode
-is possible, then
-.IR \%ps\~mode ,
-and finally
-.IR \%tty\~mode .
-.
-This mode testing sequence for
-.I \%auto\~mode
-can be changed by specifying a comma separated list of modes with the
-option
-.B --default\-modes.
-.
-.
-.P
-The searching for
-.I \%man\~pages
-and the decompression of the input are active in every mode.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Graphical Display Modes"
-.\" --------------------------------------------------------------------
-.
-The graphical display modes work mostly in the \%\f[CR]X\~Window\f[]
-environment (or similar implementations within other windowing
-environments).
-.
-The environment variable
-.Env_var \%$DISPLAY
-and the option
-.B --display
-are used for specifying the \%\f[CR]X\~Window\f[] display to be used.
-.
-If this environment variable is empty
-.B \%groffer
-assumes that no \%\f[CR]X\~Window\f[] is running and changes to a
-.IR \%text\~mode .
-.
-You can change this automatic behavior by the option
-.BR --default\-modes .
-.
-.
-.P
-Known viewers for the graphical display modes and their standard
-\%\f[CR]X\~Window\f[] viewer programs are
-.
-.Topic
-in a PDF viewer
-.nh
-.RI ( \%pdf\~mode )
-.hy
-.
-.Topic
-in a web browser
-.nh
-.RI ( html
-or
-.IR \%www\~mode )
-.hy
-.RE
-.
-.Topic
-in a Postscript viewer
-.nh
-.RI ( \%ps\~mode )
-.hy
-.
-.Topic
-\%\f[CR]X\~Window\f[]
-.I roff
-viewers such as
-.BR \%gxditview (@MAN1EXT@)
-or
-.BR \%xditview (1)
-(in
-.IR \%x\~mode )
-.
-.Topic
-in a dvi viewer program
-.nh
-.RI ( \%dvi\~mode )
-.hy
-.
-.
-.P
-The
-.I \%pdf\~mode
-has a major advantage \[em] it is the only graphical display mode that
-allows to search for text within the viewer; this can be a really
-important feature.
-.
-Unfortunately, it takes some time to transform the input into the PDF
-format, so it was not chosen as the major mode.
-.
-.
-.P
-These graphical viewers can be customized by options of the
-\%\f[CR]X\~Window\~Toolkit\f[].
-.
-But the
-.B \%groffer
-options use a leading double minus instead of the single minus used by
-the \%\f[CR]X\~Window\~Toolkit\f[].
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Text modes"
-.\" --------------------------------------------------------------------
-.
-There are two modes for text output,
-.I \%mode\~text
-for plain output without a pager and
-.I \%mode\~tty
-for a text output on a text terminal using some pager program.
-.
-.
-.P
-If the variable
-.Env_var \%$DISPLAY
-is not set or empty,
-.B \%groffer
-assumes that it should use
-.IR \%tty\~\%mode .
-.
-.
-.P
-In the actual implementation, the
-.I groff
-output device
-.I \%latin1
-is chosen for
-.IR \%text\~modes .
-.
-This can be changed by specifying option
-.B -T
-or
-.BR \%--device .
-.
-.
-.P
-The pager to be used can be specified by one of the options
-.B --pager
-and
-.BR --tty\-viewer ,
-or by the environment variable
-.Env_var \%$PAGER .
-If all of this is not used the
-.BR \%less (1)
-program with the option
-.B -r
-for correctly displaying control sequences is used as the default
-pager.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Special Modes for Debugging and Development"
-.\" --------------------------------------------------------------------
-.
-These modes use the
-.I \%groffer
-file determination and decompression.
-.
-This is combined into a single input file that is fed directly into
-.B \%groff
-with different strategy without the
-.I \%groffer
-viewing facilities.
-.
-These modes are regarded as advanced, they are useful for debugging
-and development purposes.
-.
-.
-.P
-The
-.I \%source\~mode
-with option
-.B --source
-just displays the decompressed input.
-.
-.
-.P
-Otion
-.B --to\-stdout
-does not display in a graphical mode.
-.
-It just generates the file for the chosen mode and then prints its
-content to standard output.
-.
-.
-.P
-The
-.I \%groff\~mode
-passes the input to
-.B \%groff
-using only some suitable options provided to
-.BR \%groffer .
-.
-This enables the user to save the generated output into a file or pipe
-it into another program.
-.
-.
-.P
-In
-.IR \%groff\~\%mode ,
-the option
-.B -Z
-disables post-processing, thus producing the
-.nh
-.I groff intermediate
-.IR output .
-.hy
-.
-In this mode, the input is formatted, but not postprocessed; see
-.BR \%groff_out (@MAN5EXT@)
-for details.
-.
-.
-.P
-All
-.B \%groff
-short options are supported by
-.BR \%groffer .
-.
-.
-.\" --------------------------------------------------------------------
-.SH "MAN PAGE SEARCHING"
-.\" --------------------------------------------------------------------
-.
-The default behavior of
-.B \%groffer
-is to first test whether a file parameter represents a local file; if
-it is not an existing file name, it is assumed to represent the name
-of a
-.IR \%man\~page .
-The following options can be used to determine whether the arguments
-should be handled as file name or
-.I \%man\~page
-arguments.
-.
-.TP
-.B --man
-forces to interpret all file parameters as
-.I \%filespecs
-for searching
-.IR \%man\~pages .
-.
-.TP
-.B --no\-man
-.TQ
-.B --local\-file
-disable the
-.I man
-searching; so only local files are displayed.
-.
-.
-.P
-If neither a local file nor a
-.I \%man\~page
-was retrieved for some file parameter a warning is issued on standard
-error, but processing is continued.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Search Algorithm"
-.\" --------------------------------------------------------------------
-.
-Let us now assume that a
-.I \%man\~page
-should be searched.
-.
-The
-.B \%groffer
-program provides a search facility for
-.IR \%man\~pages .
-.
-All long options, all environment variables, and most of the
-functionality of the \f[CR]GNU\fP
-.BR \%man (1)
-program were implemented.
-.
-The search algorithm shall determine which file is displayed for a given
-.IR \%man\~page .
-The process can be modified by options and environment variables.
-.
-.
-.P
-The only
-.I man
-action that is omitted in
-.B \%groffer
-are the preformatted
-.IR \%man\~pages ,
-also called
-.IR cat\~pages .
-.
-With the excellent performance of the actual computers, the
-preformatted
-.I \%man\~pages
-aren't necessary any longer.
-.
-Additionally,
-.B \%groffer
-is a
-.I roff
-program; it wants to read
-.I roff
-source files and format them itself.
-.
-.
-.P
-The algorithm for retrieving the file for a
-.I \%man\~page
-needs first a set of directories.
-.
-This set starts with the so-called
-.I man\~path
-that is modified later on by adding names of
-.I operating system
-and
-.IR language .
-.
-This arising set is used for adding the section directories which
-contain the
-.I \%man\~page
-files.
-.
-.
-.P
-The
-.I man\~path
-is a list of directories that are separated by colon.
-.
-It is generated by the following methods.
-.
-.Topic
-The environment variable
-.Env_var \%$MANPATH
-can be set.
-.
-.Topic
-It can be read from the arguments of the environment variable
-.Env_var \%$MANOPT .
-.
-.Topic
-The
-.I man\~path
-can be manually specified by using the option
-.BR --manpath .
-An empty argument disables the
-.I \%man\~page
-searching.
-.
-.Topic
-When no
-.I man\~path
-was set the
-.BR \%manpath (1)
-program is tried to determine one.
-.
-.Topic
-If this does not work a reasonable default path from
-.Env_var $PATH
-is determined.
-.
-.
-.P
-We now have a starting set of directories.
-.
-The first way to change this set is by adding names of
-.I operating
-.IR systems .
-.
-This assumes that
-.I \%man\~pages
-for several
-.I operating systems
-are installed.
-.
-This is not always true.
-.
-The names of such
-.I operating systems
-can be provided by 3 methods.
-.
-.Topic
-The environment variable
-.Env_var \%$SYSTEM
-has the lowest precedence.
-.
-.Topic
-This can be overridden by an option in
-.Env_var \%$MANOPT .
-.
-.Topic
-This again is overridden by the command line option
-.BR --systems .
-.
-.
-.P
-Several names of
-.I operating systems
-can be given by appending their names, separated by a comma.
-.
-.
-.P
-The
-.I man\~path
-is changed by appending each
-.I system
-name as subdirectory at the end of each directory of the set.
-.
-No directory of the
-.I man\~path
-set is kept.
-.
-But if no
-.I system
-name is specified the
-.I man\~path
-is left unchanged.
-.
-.
-.P
-After this, the actual set of directories can be changed by
-.I language
-information.
-.
-This assumes that there exist
-.I man\~pages
-in different languages.
-.
-The wanted
-.I language
-can be chosen by several methods.
-.
-.Topic
-Environment variable
-.Env_var $LANG .
-.
-.Topic
-This is overridden by
-.Env_var \%$LC_MESSAGES .
-.
-.Topic
-This is overridden by
-.Env_var $LC_ALL .
-.
-.Topic
-This can be overridden by providing an option in
-.Env_var \%$MANOPT .
-.
-.Topic
-All these environment variables are overridden by the command line
-option
-.BR --locale .
-.
-.
-.P
-The
-.I default language
-can be specified by specifying one of the pseudo-language parameters
-\f[CR]C\fP or \f[CR]\%POSIX\fP.
-.
-This is like deleting a formerly given
-.I language
-information.
-.
-The
-.I \%man\~pages
-in the
-.I default language
-are usually in English.
-.
-.
-.P
-Of course, the
-.I language
-name is determined by
-.BR man .
-In \f[CR]GNU\fP
-.BR man ,
-it is specified in the \%\f[CR]POSIX\~1003.1\fP based format:
-.P
-.nh
-\f[I]<language>\f[][\f[CB]_\f[]\f[I]<territory>\f[][\f[CB].\fP\
-\f[I]<character-set>\f[][\f[CB],\fP\f[I]<version>\fP]]],
-.hy
-.P
-but the two-letter code in
-.nh
-.I <language>
-.hy
-is sufficient for most purposes.
-.
-If for a complicated
-.I language
-formulation no
-.I \%man\~pages
-are found
-.B \%groffer
-searches the country part consisting of these first two characters as
-well.
-.
-.
-.P
-The actual directory set is copied thrice.
-.
-The
-.I language
-name is appended as subdirectory to each directory in the first copy
-of the actual directory set (this is only done when a language
-information is given).
-.
-Then the 2-letter abbreviation of the
-.I language
-name is appended as subdirectories to the second copy of the directory
-set (this is only done when the given language name has more than 2
-letters).
-.
-The third copy of the directory set is kept unchanged (if no
-.I language
-information is given this is the kept directory set).
-.
-These maximally 3 copies are appended to get the new directory set.
-.
-.
-.P
-We now have a complete set of directories to work with.
-.
-In each of these directories, the
-.I man
-files are separated in
-.IR sections .
-.
-The name of a
-.I section
-is represented by a single character, a digit between
-.I 1
-and
-.IR 9 ,
-or the character
-.I o
-or
-.IR n ,
-in this order.
-.
-.
-.P
-For each available
-.IR section ,
-a subdirectory
-.File_name man \fI<section>\fP
-exists containing all
-.I man
-files for this
-.IR section ,
-where
-.I <section>
-is a single character as described before.
-.
-Each
-.I man
-file in a
-.I section
-directory has the form
-.IR \%\f[CB]man\fP<section>\f[CB]/\fP<name>\f[CB].\fP<section>\
-[<extension>][\f[CB].\fP<compression>] ,
-where
-.I \%<extension>
-and
-.I \%<compression>
-are optional.
-.
-.I \%<name>
-is the name of the
-.I \%man\~page
-that is also specified as filespec argument on the command line.
-.
-.
-.P
-The
-.I extension
-is an addition to the section.
-.
-This postfix acts like a subsection.
-.
-An
-.I extension
-occurs only in the file name, not in name of the
-.I section
-subdirectory.
-.
-It can be specified on the command line.
-.
-.
-.P
-On the other hand, the
-.I compression
-is just an information on how the file is compressed.
-.
-This is not important for the user, such that it cannot be specified
-on the command line.
-.
-.
-.P
-There are 4 methods to specify a
-.I section
-on the command line:
-.
-.Topic
-Environment variable
-.Env_var \%$MANSECT
-.
-.Topic
-Command line option
-.B --sections
-.
-.Topic
-Appendix to the
-.I name
-argument in the form
-.I <name>.<section>
-.
-.Topic
-Preargument before the
-.I name
-argument in the form
-.I <section> <name>
-.
-.
-.P
-It is also possible to specify several
-.I sections
-by appending the single characters separated by colons.
-.
-One can imagine that this means to restrict the
-.I \%man\~page
-search to only some
-.IR sections .
-.
-The multiple
-.I sections
-are only possible for
-.Env_var \%$MANSECT
-and
-.BR --sections .
-.
-.
-.P
-If no
-.I section
-is specified all
-.I sections
-are searched one after the other in the given order, starting with
-.IR section\~1 ,
-until a suitable file is found.
-.
-.
-.P
-There are 4 methods to specify an
-.I extension
-on the command line.
-.
-But it is not necessary to provide the whole extension name, some
-abbreviation is good enough in most cases.
-.
-.Topic
-Environment variable
-.Env_var \%$EXTENSION
-.
-.Topic
-Command line option
-.B --extension
-.
-.Topic
-Appendix to the
-.I <name>.<section>
-argument in the form
-.I <name>.<section><extension>
-.
-.Topic
-Preargument before the
-.I name
-argument in the form
-.I <section><extension> <name>
-.
-.
-.P
-For further details on
-.I \%man\~page
-searching, see
-.BR \%man (1).
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Examples of man files"
-.\" --------------------------------------------------------------------
-.
-.TP
-.File_name /usr/share/man/man1/groff.1
-This is an uncompressed file for the
-.I \%man\~page
-\f[CR]groff\fP in
-.IR section\~1 .
-.
-It can be called by
-.EX
-\fIsh#\fR groffer\~groff
-.EE
-No
-.I section
-is specified here, so all
-.I sections
-should be searched, but as
-.I section\~1
-is searched first this file will be found first.
-.
-The file name is composed of the following components.
-.File_name /usr/share/man
-must be part of the
-.IR \%man\~path ;
-the subdirectory
-.File_name man1/
-and the part
-.File_name .1
-stand for the
-.IR section ;
-.File_name groff
-is the name of the
-.IR \%man\~page .
-.
-.
-.TP
-.File_name /usr/local/share/man/man7/groff.7.gz
-The file name is composed of the following components.
-.File_name /usr/local/share/man
-must be part of the
-.IR \%man\~path ;
-the subdirectory
-.File_name man7/
-and the part
-.File_name .7
-stand for the
-.IR section ;
-.File_name groff
-is the name of the
-.IR \%man\~page ;
-the final part
-.File_name .gz
-stands for a compression with
-.BR gzip (1).
-As the
-.I section
-is not the first one it must be specified as well.
-.
-This can be done by one of the following commands.
-.EX
-\fIsh#\fR\~groffer\~groff.7
-\fIsh#\fR\~groffer\~7\~groff
-\fIsh#\fR\~groffer\~\-\-sections=7\~groff
-.EE
-.
-.TP
-.File_name /usr/local/man/man1/ctags.1emacs21.bz2
-Here
-.File_name /usr/local/man
-must be in
-.IR \%man\~path ;
-the subdirectory
-.File_name man1/
-and the file name part
-.File_name .1
-stand for
-.IR section\~1 ;
-the name of the
-.I \%man\~page
-is
-.File_name ctags ;
-the section has an extension
-.File_name emacs21 ;
-and the file is compressed as
-.File_name .bz2
-with
-.BR bzip2 (1).
-The file can be viewed with one of the following commands
-.EX
-\fIsh#\fR\~groffer\~ctags.1e
-\fIsh#\fR\~groffer\~1e\~ctags
-\fIsh#\fR\~groffer\~\-\-extension=e\~\-\-sections=1\~ctags
-.EE
-where \f[CR]e\fP works as an abbreviation for the extension
-\f[CR]emacs21\fP.
-.
-.
-.TP
-.File_name /usr/man/linux/de/man7/man.7.Z
-The directory
-.File_name /usr/man
-is now part of the
-.IR \%man\~path ;
-then there is a subdirectory for an
-.I operating system
-name
-.File_name linux/ ;
-next comes a subdirectory
-.File_name de/
-for the German
-.IR language ;
-the
-.I section
-names
-.File_name man7
-and
-.File_name .7
-are known so far;
-.File_name man
-is the name of the
-.IR \%man\~page ;
-and
-.File_name .Z
-signifies the compression that can be handled by
-.BR gzip (1).
-We want now show how to provide several values for some options.
-.
-That is possible for
-.I sections
-and
-.I operating system
-names.
-.
-So we use as
-.I sections\~5
-and
-.I 7
-and as
-.I system
-names
-.I linux
-and
-.IR aix .
-The command is then
-.sp
-.EX
-\fIsh#\fR groffer\~\-\-locale=de\~\-\-sections=5:7\~\-\-systems=linux,aix\~man
-\fIsh#\fR LANG=de\~MANSECT=5:7\~SYSTEM=linux,aix\~groffer\~man
-.EE
-.
-.
-.\" --------------------------------------------------------------------
-.SH DECOMPRESSION
-.\" --------------------------------------------------------------------
-.
-The program has a decompression facility.
-.
-If standard input or a file that was retrieved from the command line
-parameters is compressed with a format that is supported by either
-.BR \%gzip (1)
-or
-.BR \%bzip2 (1)
-it is decompressed on-the-fly.
-.
-This includes the \f[CR]GNU\fP
-.BR \%.gz ,
-.BR \%.bz2 ,
-and the traditional
-.B \%.Z
-compression.
-.
-The program displays the concatenation of all decompressed input in
-the sequence that was specified on the command line.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "ENVIRONMENT"
-.\" --------------------------------------------------------------------
-.
-The
-.B \%groffer
-program supports many system variables, most of them by courtesy of
-other programs.
-.
-All environment variables of
-.BR \%groff (@MAN1EXT@)
-and \f[CR]GNU\fP
-.BR \%man (1)
-and some standard system variables are honored.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Native groffer Variables"
-.\" --------------------------------------------------------------------
-.
-.TP
-.Env_var \%$GROFFER_OPT
-Store options for a run of
-.BR \%groffer .
-.
-The options specified in this variable are overridden by the options
-given on the command line.
-.
-The content of this variable is run through the shell builtin `eval';
-so arguments containing white-space or special shell characters should
-be quoted.
-.
-Do not forget to export this variable, otherwise it does not exist
-during the run of
-.BR groffer .
-.
-.
-.\" --------------------------------------------------------------------
-.SS "System Variables"
-.\" --------------------------------------------------------------------
-.
-The following variables have a special meaning for
-.BR \%groffer .
-.
-.
-.TP
-.Env_var \%$DISPLAY
-If this variable is set this indicates that the \%\f[CR]X\~Window\fP
-system is running.
-.
-Testing this variable decides on whether graphical or text output is
-generated.
-.
-This variable should not be changed by the user carelessly, but it can
-be used to start the graphical
-.B \%groffer
-on a remote \%\f[CR]X\~Window\fP terminal.
-.
-For example, depending on your system,
-.B \%groffer
-can be started on the second monitor by the command
-.sp
-.EX
-\fIsh#\fR DISPLAY=:0.1\~groffer\~what.ever &
-.EE
-.
-.
-.TP
-.Env_var \%$LC_ALL
-.TQ
-.Env_var \%$LC_MESSAGES
-.TQ
-.Env_var $LANG
-If one of these variables is set (in the above sequence), its content
-is interpreted as the locale, the language to be used, especially when
-retrieving
-.IR \%man\~pages .
-.
-A locale name is typically of the form
-.nh
-.IR language [\c
-.B _\c
-.IR territory [\c
-.B .\c
-.IR codeset [\c
-.B @\c
-.IR modifier ]]],
-.hy
-where
-.I \%language
-is an ISO 639 language code,
-.I \%territory
-is an ISO 3166 country code, and
-.I \%codeset
-is a character set or encoding identifier like ISO-8859-1 or UTF-8;
-see
-.BR \%setlocale (3).
-.
-The locale values \f[CR]C\fP and \%\f[CR]POSIX\fP
-stand for the default, i.e. the
-.I \%man\~page
-directories without a language prefix.
-.
-This is the same behavior as when all 3\~variables are unset.
-.
-.
-.TP
-.Env_var \%$PAGER
-This variable can be used to set the pager for the tty output.
-.
-For example, to disable the use of a pager completely set this
-variable to the
-.BR \%cat (1)
-program
-.sp
-.EX
-\fIsh#\fR PAGER=cat\~groffer\~anything
-.EE
-.sp
-.
-.TP
-.Env_var $PATH
-All programs within the
-.B \%groffer
-script are called without a fixed path.
-.
-Thus this environment variable determines the set of programs used
-within the run of
-.BR \%groffer .
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Groff Variables"
-.\" --------------------------------------------------------------------
-.
-The
-.B \%groffer
-program internally calls
-.BR \%groff ,
-so all environment variables documented in
-.BR \%groff (@MAN1EXT@)
-are internally used within
-.B \%groffer
-as well.
-.
-The following variable has a direct meaning for the
-.B \%groffer
-program.
-.
-.TP
-.Env_var \%$GROFF_TMPDIR
-If the value of this variable is an existing, writable directory,
-.B \%groffer
-uses it for storing its temporary files, just as
-.B groff
-does.
-.
-See the
-.BR \%groff (@MAN1EXT@)
-man page for more details on the location of temporary files.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Man Variables"
-.\" --------------------------------------------------------------------
-.
-Parts of the functionality of the
-.B man
-program were implemented in
-.BR \%groffer ;
-support for all environment variables documented in
-.BR \%man (1)
-was added to
-.BR \%groffer ,
-but the meaning was slightly modified due to the different approach in
-.BR \%groffer ;
-but the user interface is the same.
-.
-The
-.B man
-environment variables can be overwritten by options provided with
-.Env_var \%$MANOPT ,
-which in turn is overwritten by the command line.
-.
-.
-.TP
-.Env_var \%$EXTENSION
-Restrict the search for
-.I \%man\~pages
-to files having this extension.
-.
-This is overridden by option
-.BR --extension ;
-see there for details.
-.
-.
-.TP
-.Env_var \%$MANOPT
-This variable contains options as a preset for
-.BR \%man (1).
-As not all of these are relevant for
-.B \%groffer
-only the essential parts of its value are extracted.
-.
-The options specified in this variable overwrite the values of the
-other environment variables that are specific to
-.IR man .
-.
-All options specified in this variable are overridden by the options
-given on the command line.
-.
-.
-.TP
-.Env_var \%$MANPATH
-If set, this variable contains the directories in which the
-.I \%man\~page
-trees are stored.
-.
-This is overridden by option
-.BR \%--manpath .
-.
-.
-.TP
-.Env_var \%$MANSECT
-If this is a colon separated list of section names, the search for
-.I \%man\~pages
-is restricted to those manual sections in that order.
-.
-This is overridden by option
-.BR --sections .
-.
-.
-.TP
-.Env_var \%$SYSTEM
-If this is set to a comma separated list of names these are interpreted
-as
-.I \%man\~page
-trees for different operating systems.
-.
-This variable can be overwritten by option
-.BR --systems ;
-see there for details.
-.
-.
-.P
-The environment variable
-.Env_var \%$MANROFFSEQ
-is ignored by
-.B \%groffer
-because the necessary preprocessors are determined automatically.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "CONFIGURATION FILES"
-.\" --------------------------------------------------------------------
-.
-The
-.B \%groffer
-program can be preconfigured by two configuration files.
-.
-.
-.TP
-.File_name \%/etc/groff/groffer.conf
-System-wide configuration file for
-.BR \%groffer .
-.
-.
-.TP
-.File_name \%$HOME/.groff/groffer.conf
-User-specific configuration file for
-.BR \%groffer ,
-where
-.Env_var \%$HOME
-denotes the user's home directory.
-.
-This file is called after the system-wide configuration file to enable
-overriding by the user.
-.
-.
-.P
-Both files are handled for the configuration, but the configuration
-file in
-.File_name /etc
-comes first; it is overwritten by the configuration file in the home
-directory; both configuration files are overwritten by the environment
-variable
-.Env_var \%$GROFFER_OPT ;
-everything is overwritten by the command line arguments.
-.
-.
-.P
-The configuration files contain options that should be called as
-default for every
-.B \%groffer
-run.
-.
-These options are written in lines such that each contains either a
-long option, a short option, or a short option cluster; each with or
-without an argument.
-.
-So each line with configuration information starts with a minus
-character
-.RB ` \- ';
-a line with a long option starts with two minus characters
-.RB ` \-\- ',
-a line with a short option or short option cluster starts with a
-single minus
-.RB ` \- '.
-.
-.
-.P
-The option names in the configuration files may not be abbreviated,
-they must be exact.
-.
-.
-.P
-The argument for a long option can be separated from the option name
-either by an equal sign
-.RB ` = '
-or by whitespace, i.e. one or several space or tab characters.
-.
-An argument for a short option or short option cluster can be directly
-appended to the option name or separated by whitespace.
-.
-The end of an argument is the end of the line.
-.
-It is not allowed to use a shell environment variable in an option
-name or argument.
-.
-.
-.P
-It is not necessary to use quotes in an option or argument, except for
-empty arguments.
-.
-An empty argument can be provided by appending a pair of quotes to the
-separating equal sign or whitespace; with a short option, the
-separator can be omitted as well.
-.
-For a long option with a separating equal sign
-.RB ` = ',
-the pair of quotes can be omitted, thus ending the line with the
-separating equal sign.
-.
-All other quote characters are cancelled internally.
-.
-.
-.P
-In the configuration files, arbitrary whitespace is allowed at the
-beginning of each line, it is just ignored.
-.
-Each whitespace within a line is replaced by a single space character
-` ' internally.
-.
-.
-.P
-All lines of the configuration lines that do not start
-with a minus character are ignored, such that comments starting with
-.RB ` # '
-are possible.
-.
-So there are no shell commands in the configuration files.
-.
-.
-.P
-As an example, consider the following configuration file that can be
-used either in
-.File_name \%/etc/groff/groffer.conf
-or
-.File_name \%~/.groff/groffer.conf .
-.
-.
-.P
-.ft CR
-.nh
-.nf
-# groffer configuration file
-#
-# groffer options that are used in each call of groffer
-\-\-foreground=DarkBlue
-\-\-resolution=100
-\-\-x\-viewer=gxditview \-geometry 900x1200
-\-\-pdf\-viewer xpdf \-Z 150
-.fi
-.hy
-.ft
-.
-.
-.P
-The lines starting with
-.B #
-are just ignored, so they act as command lines.
-.
-This configuration sets four
-.B \%groffer
-options (the lines starting with
-.RB ` \- ').
-This has the following effects:
-.
-.
-.Topic
-Use a text color of
-.B \%DarkBlue
-in all viewers that support this, such as
-.BR \%gxditview .
-.
-.
-.Topic
-Use a resolution of
-.B 100dpi
-in all viewers that support this, such as
-.BR \%gxditview .
-.
-By this, the default device in
-.I x mode
-is set to
-.BR X100 .
-.
-.
-.Topic
-Force
-.BR \%gxditview (@MAN1EXT@)
-as the
-.I \%x-mode
-viewer using the geometry option for setting the width to
-.B 900px
-and the height to
-.BR 1200px .
-This geometry is suitable for a resolution of
-.BR 100dpi .
-.
-.
-.Topic
-Use
-.BR \%xpdf (1)
-as the
-.I \%pdf-mode
-viewer with the argument
-.B \-Z
-.BR 150 .
-.
-.
-.\" --------------------------------------------------------------------
-.SH "EXAMPLES"
-.\" --------------------------------------------------------------------
-.
-The usage of
-.B \%groffer
-is very easy.
-.
-Usually, it is just called with a file name or
-.IR \%man\~page .
-.
-The following examples, however, show that
-.B \%groffer
-has much more fancy capabilities.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~/usr/local/share/doc/groff/meintro.ms.gz
-.EE
-.sp
-Decompress, format and display the compressed file
-.File_name meintro.ms.gz
-in the directory
-.File_name /usr/local/share/doc/groff ,
-using the standard viewer
-.B \%gxditview
-as graphical viewer when in \%\f[CR]X\~Window\fP, or the
-.BR \%less (1)
-pager program when not in \%\f[CR]X\~Window\fP.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~groff
-.EE
-.sp
-If the file
-.File_name \%./groff
-exists use it as input.
-.
-Otherwise interpret the argument as a search for the
-.I \%man\~page
-named
-.B \%groff
-in the smallest possible
-.IR \%man\~section ,
-being section 1 in this case.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~man:groff
-.EE
-.sp
-search for the
-.I \%man\~page
-of
-.B \%groff
-even when the file
-.File_name ./groff
-exists.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~groff.7
-\fIsh#\fR\~groffer\~7\~groff
-.EE
-.sp
-search the
-.I \%man\~page
-of
-.B \%groff
-in
-.I \%man\~section
-.BR 7 .
-This section search works only for a digit or a single character from
-a small set.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~fb.modes
-.EE
-.sp
-If the file
-.File_name ./fb.modes
-does not exist interpret this as a search for the
-.I \%man\~page
-of
-.BR fb.modes .
-As the extension
-.I \%modes
-is not a single character in classical section style the argument is
-not split to a search for
-.BR fb .
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~groff\~\[cq]troff(1)\[cq]\~man:roff
-.EE
-.sp
-The arguments that are not existing files are looked-up as the
-following
-.IR \%man\~pages :
-.B \%groff
-(automatic search, should be found in \fIman\fP\~section\~1),
-.B \%troff
-(in section\~1),
-and
-.B \%roff
-(in the section with the lowest number, being\~7 in this case).
-.
-The quotes around
-.nh
-.I \[cq]troff(1)\[cq]
-.hy
-are necessary because the parentheses are special shell characters;
-escaping them with a backslash character
-.I \[rs](
-and
-.I \[rs])
-would be possible, too.
-.
-The formatted files are concatenated and displayed in one piece.
-.
-.sp
-.EX
-\fIsh#\fR\~LANG=de\~groffer\~--man\~--www\~--www-viewer=galeon\~ls
-.EE
-.sp
-Retrieve the German
-.I \%man\~page
-(language
-.IR de )
-for the
-.B ls
-program, decompress it, format it to
-.I \%html
-format
-.nh
-.RI ( \%www\~mode )
-.hy
-and view the result in the web browser
-.BR \%galeon .
-The option
-.B --man
-guarantees that the
-.I \%man\~page
-is retrieved, even when a local file
-.File_name \%ls
-exists in the actual directory.
-.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~--source\~'man:roff(7)'
-.EE
-.sp
-Get the
-.I \%man\~page
-called
-.I \%roff
-in \fIman\fP\~section 7, decompress it, and print its unformatted
-content, its source code.
-.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~--de-p\~--in\~--ap
-.EE
-.sp
-This is a set of abbreviated arguments, it is determined as
-.br
-.sp
-.EX
-\fIsh#\fR\~groffer\~--debug-params\~--intermediate-output\~--apropos
-.EE
-.sp
-.
-.sp
-.EX
-\fIsh#\fR\~cat\~file.gz\~|\~groffer\~-Z\~-mfoo
-.EE
-.sp
-.
-The file
-.File_name file.gz
-is sent to standard input, this is decompressed, and then this is
-transported to the
-.I \%groff intermediate output mode
-without post-processing
-.RB ( groff
-option
-.BR -Z ),
-using macro package
-.I \%foo
-.RB ( groff
-option
-.BR -m ).
-.
-.
-.sp
-.EX
-\fIsh#\fR\~echo\~'\[rs]f[CB]WOW!'\~|
-> groffer --x --bg red --fg yellow --geometry 200x100 -
-.EX
-.sp
-.
-Display the word \f[CB]WOW!\fP in a small window in constant-width
-bold font, using color yellow on red background.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "COMPATIBILITY"
-.\" --------------------------------------------------------------------
-.
-The
-.B \%groffer
-program is written in Perl, the Perl version during writing was v5.8.8.
-.
-.
-.P
-.B \%groffer
-provides its own parser for command line arguments that is compatible
-to both \%\f[CR]POSIX\fP
-.BR \%getopts (1)
-and \%\f[CR]GNU\fP
-.BR \%getopt (1).
-It can handle option arguments and file names containing white space
-and a large set of special characters.
-.
-The following standard types of options are supported.
-.
-.
-.Topic
-The option consisting of a single minus
-.B -
-refers to standard input.
-.
-.
-.Topic
-A single minus followed by characters refers to a single character
-option or a combination thereof; for example, the
-.B \%groffer
-short option combination
-.B -Qmfoo
-is equivalent to
-.BR -Q\~\-m\~foo .
-.
-.
-.Topic
-Long options are options with names longer than one character; they
-are always preceded by a double minus.
-.
-An option argument can either go to the next command line argument or
-be appended with an equal sign to the argument; for example,
-.B --long=arg
-is equivalent to
-.BR --long\~arg .
-.
-.
-.Topic
-An argument of
-.B --
-ends option parsing; all further command line arguments are
-interpreted as
-.I \%filespec
-parameters, i.e. file names or constructs for searching
-.IR \%man\~pages ).
-.
-.
-.Topic
-All command line arguments that are neither options nor option
-arguments are interpreted as
-.I \%filespec
-parameters and stored until option parsing has finished.
-.
-For example, the command line
-.sp
-.EX
-\fIsh#\fR\~groffer file1 -a -o arg file2
-.EE
-.sp
-is equivalent to
-.sp
-.EX
-\fIsh#\fR\~groffer -a -o arg -- file1 file2
-.EE
-.sp
-.
-.P
-The free mixing of options and
-.I \%filespec
-parameters follows the GNU principle.
-.
-That does not fulfill the strange option behavior of \%\f[CR]POSIX\fP
-that ends option processing as soon as the first non-option argument
-has been reached.
-.
-The end of option processing can be forced by the option
-.RB ` \-\- '
-anyway.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "BUGS"
-.\" --------------------------------------------------------------------
-.
-Report bugs to the
-.MT bug-groff@gnu.org
-bug-groff mailing list
-.ME .
-.
-Include a complete, self-contained example that will allow the bug to
-be reproduced, and say which version of
-.B \%groffer
-you are using.
-.
-.
-.P
-You can also use the
-.MT groff@gnu.org
-groff mailing list
-.ME ,
-but you must first subscribe to this list.
-.
-You can do that by visiting the
-.UR http://\:lists.gnu.org/\:mailman/\:listinfo/\:groff
-groff mailing list web page
-.UE .
-.
-.
-.P
-See
-.BR \%groff (@MAN1EXT@)
-for information on availability.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "SEE ALSO"
-.\" --------------------------------------------------------------------
-.
-.P
-.BR \%groff (@MAN1EXT@),
-.BR \%@g@troff (@MAN1EXT@)
-.RS
-Details on the options and environment variables available in
-.BR \%groff ;
-all of them can be used with
-.BR \%groffer .
-.RE
-.
-.
-.TP
-.BR \%groff (@MAN7EXT@)
-Documentation of the
-.I \%groff
-language.
-.
-.
-.TP
-.BR \%grog (@MAN1EXT@)
-Internally,
-.B \%groffer
-tries to guess the
-.B \%groff
-command line options from the input using this program.
-.
-.
-.TP
-.BR groff_out (@MAN5EXT@)
-Documentation on the
-.I \%groff intermediate output
-.nh
-.RI ( ditroff
-output).
-.hy
-.
-.
-.TP
-.BR groff_tmac (@MAN5EXT@)
-Documentation on the
-.I \%groff
-macro files.
-.
-.
-.TP
-.BR \%man (1)
-The standard program to display
-.IR \%man\~pages .
-.
-The information there is only useful if it is the
-.I \%man\~page
-for GNU
-.BR man .
-Then it documents the options and environment variables that are
-supported by
-.BR \%groffer .
-.
-.
-.P
-.BR \%gxditview (@MAN1EXT@),
-.BR \%xditview (1x)
-.RS
-Viewers for
-.BR \%groffer 's
-.IR \%x\~mode .
-.RE
-.
-.
-.P
-.BR \%kpdf (1),
-.BR \%kghostview (1),
-.BR \%evince (1),
-.BR \%ggv (1),
-.BR \%gv (1),
-.BR \%ghostview (1),
-.BR \%gs (1)
-.RS
-Viewers for
-.BR \%groffer 's
-.IR \%ps\~mode .
-.RE
-.
-.
-.P
-.BR \%kpdf (1),
-.BR \%acroread (1),
-.BR \%evince (1),
-.BR \%xpdf (1),
-.BR \%gpdf (1),
-.BR \%kghostview (1),
-.BR \%ggv (1)
-.RS
-Viewers for
-.BR \%groffer 's
-.IR \%pdf\~mode .
-.RE
-.
-.
-.P
-.BR \%kdvi (1),
-.BR \%xdvi (1),
-.BR \%dvilx (1)
-.RS
-Viewers for
-.BR \%groffer 's
-.IR \%dvi\~mode .
-.RE
-.
-.
-.P
-.BR \%konqueror (1),
-.BR \%epiphany (1),
-.BR \%firefox (1),
-.BR \%mozilla (1),
-.BR \%netscape (1),
-.BR \%lynx (1)
-.RS
-Web-browsers for
-.BR \%groffer 's
-.I \%html
-or
-.IR \%www\~mode .
-.RE
-.
-.
-.TP
-.BR \%less (1)
-Standard pager program for the
-.IR \%tty\~mode .
-.
-.
-.P
-.BR \%gzip (1),
-.BR \%bzip2 (1)
-.RS
-The decompression programs supported by
-.BR \%groffer .
-.RE
-.
-.
-.\" --------------------------------------------------------------------
-.SH "AUTHOR"
-.\" --------------------------------------------------------------------
-.author
-.
-.
-.\" --------------------------------------------------------------------
-.SH "COPYING"
-.\" --------------------------------------------------------------------
-.copyleft
-.
-.
-.\" --------------------------------------------------------------------
-.\" Emacs settings
-.\" --------------------------------------------------------------------
-.
-.\" Local Variables:
-.\" mode: nroff
-.\" End:
diff --git a/contrib/groffer/perl/groffer.pl b/contrib/groffer/perl/groffer.pl
deleted file mode 100755
index 766bc2e6..00000000
--- a/contrib/groffer/perl/groffer.pl
+++ /dev/null
@@ -1,2209 +0,0 @@
-#! /usr/bin/env perl
-
-# groffer - display groff files
-
-# Source file position: <groff-source>/contrib/groffer/perl/groffer.pl
-# Installed position: <prefix>/bin/groffer
-
-# Copyright (C) 2006, 2009, 2011, 2013
-# Free Software Foundation, Inc.
-
-# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
-# Last update: 29 Mar 2013
-
-# This file is part of `groffer', which 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 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/>.
-
-########################################################################
-
-use strict;
-use warnings;
-#use diagnostics;
-
-# temporary dir and files
-use File::Temp qw/ tempfile tempdir /;
-
-# needed for temporary dir
-use File::Spec;
-
-# for `copy' and `move'
-use File::Copy;
-
-# for fileparse, dirname and basename
-use File::Basename;
-
-# current working directory
-use Cwd;
-
-# $Bin is the directory where this script is located
-use FindBin;
-
-
-########################################################################
-# system variables and exported variables
-########################################################################
-
-our $Dev_Null;
-our $Umask;
-our @Path;
-our $Start_Dir;
-
-our $tmpdir = '';
-our ($fh_cat, $tmp_cat);
-our ($fh_stdin, $tmp_stdin);
-
-our @Addopts_Groff;
-our %Debug;
-our %Opt;
-
-our $Has_Compression;
-our $Has_bzip;
-
-our $Output_File_Name;
-
-our $Apropos_Prog;
-our $Filespec_Arg;
-our $Filespec_Is_Man;
-our $Macro_Pkg;
-our $Manspec;
-our $No_Filespecs;
-our $Special_Filespec;
-our $Special_Setup;
-
-our %Man;
-
-BEGIN {
- $Dev_Null = File::Spec->devnull();
-
- $Umask = umask 077;
-
- $Start_Dir = getcwd;
-
- # flush after each print or write command
- $| = 1;
-}
-
-
-########################################################################
-# read-only variables with double-@ construct
-########################################################################
-
-our $File_split_env_sh;
-our $File_version_sh;
-our $Groff_Version;
-
-BEGIN {
- {
- my $before_make; # script before run of `make'
- {
- my $at = '@';
- $before_make = 1 if '@VERSION@' eq "${at}VERSION${at}";
- }
-
- my %at_at;
- my $file_perl_test_pl;
- my $groffer_libdir;
-
- if ($before_make) {
- my $groffer_perl_dir = $FindBin::Bin;
- my $groffer_top_dir = File::Spec->catdir($groffer_perl_dir, '..');
- $groffer_top_dir = Cwd::realpath($groffer_top_dir);
- $at_at{'BINDIR'} = $groffer_perl_dir;
- $at_at{'G'} = '';
- $at_at{'LIBDIR'} = '';
- $groffer_libdir = $groffer_perl_dir;
- $file_perl_test_pl = File::Spec->catfile($groffer_perl_dir,
- 'perl_test.pl');
- $File_version_sh = File::Spec->catfile($groffer_top_dir, 'version.sh');
- $Groff_Version = '';
- } else {
- $Groff_Version = '@VERSION@';
- $at_at{'BINDIR'} = '@BINDIR@';
- $at_at{'G'} = '@g@';
- $at_at{'LIBDIR'} = '@libdir@';
- $groffer_libdir = '@groffer_dir@';
- $file_perl_test_pl = File::Spec->catfile($groffer_libdir,
- 'perl_test.pl');
- $File_version_sh = File::Spec->catfile($groffer_libdir, 'version.sh');
- }
-
- die "$groffer_libdir is not an existing directory;"
- unless -d $groffer_libdir;
-
- unshift(@INC, $groffer_libdir);
-
- $File_split_env_sh = File::Spec->catfile($groffer_libdir, 'split_env.sh');
- die "$File_split_env_sh does not exist;" unless -f "$File_split_env_sh";
-
- # test perl on suitable version
- die "$file_perl_test_pl does not exist;" unless -f "$file_perl_test_pl";
- do "$file_perl_test_pl" or die "Perl test: $@";
-
- require 'func.pl';
- require 'man.pl';
-
- @Path = &path_uniq( File::Spec->path() );
-
- if ( &where_is_prog('gzip') ) {
- $Has_Compression = 1;
- $Has_bzip = 1 if &where_is_prog('bzip2');
- }
- }
-}
-
-
-########################################################################
-# modes, viewers, man sections, and defaults
-########################################################################
-
-# configuration files
-my @Conf_Files = (File::Spec->catfile(File::Spec->rootdir(),
- 'etc', 'groff', 'groffer.conf'),
- File::Spec->catfile("$ENV{'HOME'}", '.groff',
- 'groffer.conf')
- );
-
-my @Default_Modes = ('pdf', 'html', 'ps', 'x', 'dvi', 'tty');
-my $Default_Resolution = 75;
-my $Default_tty_Device = 'latin1';
-
-my @Macro_Packages = ('-man', '-mdoc', '-me', '-mm', '-mom', '-ms');
-
-my %Viewer_tty = ('DVI' => [],
- 'HTML' => ['lynx', 'w3m'],
- 'PDF' => [],
- 'PS' => [],
- 'TTY' => ['less -r -R', 'more', 'pager'],
- 'X' => [],
- );
-
-my %Viewer_X = ('DVI' => ['kdvi', 'xdvi', 'dvilx'],
- 'HTML' => ['konqueror', 'epiphany'. 'mozilla-firefox',
- 'firefox', 'mozilla', 'netscape', 'galeon',
- 'opera', 'amaya','arena', 'mosaic'],
- 'PDF' => ['okular', 'kpdf', 'acroread', 'evince',
- 'xpdf -z 150', 'gpdf', 'xpdf', 'zathura'.
- 'epdfview', 'qpdfview', 'apvlv', 'qpdfview',
- 'kghostview --scale 1.45', 'gv', 'ggv'],
- 'PS' => ['gs', 'gs_x11', 'ghostscript', 'ghostview',
- 'kghostview --scale 1.45',
- 'gv', 'okular', 'kpdf', 'evince', 'ggv'],
- 'TTY' => ['xless'],
- 'X' => ['gxditview', 'xditview'],
- );
-
-%Man = ('ALL' => 0,
- 'AUTO_SEC' => ['1', '2', '3', '4', '5', '6', '7', '8', '9',
- 'n', 'o'],
- 'ENABLE' => 1,
- 'EXT' => '',
- 'FORCE' => 0,
- 'IS_SETUP' => 0,
- 'MANSPEC' => {},
- 'LANG' => '',
- 'LANG2' => '',
- 'PATH' => [],
- 'SEC' => [],
- 'SEC_CHARS' => '',
- 'SYS' => [],
- );
-$Man{'AUTO_SEC_CHARS'} = join('', @{$Man{'AUTO_SEC'}});
-
-
-########################################################################
-# given options, main_set_options()
-########################################################################
-
-my %Opts_Cmdline_Short;
-my %Opts_Cmdline_Long;
-my $Opts_Cmdline_Long_Str;
-my %Opts_Cmdline_Double;
-my %Opts_Groff_Short;
-
-sub main_set_options {
- # the following options are ignored in groffer.pl, but are kept from
- # groffer.sh: --shell arg, --debug-shell
-
- my @opts_ignored_short_na = ();
- my @opts_ignored_short_arg = ();
-
- my @opts_ignored_long_na = ('debug-shell');
-
- my @opts_ignored_long_arg = ('shell');
-
-
- ###### groffer native options
-
- my @opts_groffer_short_na = ('h', 'Q', 'v', 'V', 'X', 'Z');
- my @opts_groffer_short_arg = ('T');
-
- my @opts_groffer_long_na = ('auto', 'apropos', 'apropos-data',
- 'apropos-devel', 'apropos-progs', 'debug', 'debug-all',
- 'debug-filenames', 'debug-func', 'debug-grog', 'debug-not-func',
- 'debug-keep', 'debug-lm', 'debug-params', 'debug-stacks',
- 'debug-tmpdir', 'debug-user', 'default', 'do-nothing', 'dvi',
- 'groff', 'help', 'intermediate-output', 'html', 'man',
- 'no-location', 'no-man', 'no-special', 'pdf', 'ps', 'rv', 'source',
- 'text', 'to-stdout', 'text-device', 'tty', 'tty-device', 'version',
- 'whatis', 'where', 'www', 'x', 'X');
-
-### main_set_options()
- my @opts_groffer_long_arg = ('default-modes', 'device',
- 'dvi-viewer', 'dvi-viewer-tty', 'extension', 'fg', 'fn', 'font',
- 'foreground', 'html-viewer', 'html-viewer-tty', 'mode',
- 'pdf-viewer', 'pdf-viewer-tty', 'print', 'ps-viewer',
- 'ps-viewer-tty', 'title', 'tty-viewer', 'tty-viewer-tty',
- 'www-viewer', 'www-viewer-tty', 'x-viewer', 'x-viewer-tty',
- 'X-viewer', 'X-viewer-tty');
-
- ##### groffer options inhereted from groff
-
- my @opts_groff_short_na = ('a', 'b', 'c', 'C', 'e', 'E', 'g', 'G',
- 'i', 'k', 'l', 'N', 'p', 'R', 's', 'S', 't', 'U', 'z');
-
- my @opts_groff_short_arg = ('d', 'f', 'F', 'I', 'K', 'L', 'm', 'M', 'n',
- 'o', 'P', 'r', 'w', 'W');
-
- my @opts_groff_long_na = ();
- my @opts_groff_long_arg = ();
-
- ##### groffer options inhereted from the X Window toolkit
-
- my @opts_x_short_na = ();
- my @opts_x_short_arg = ();
-
- my @opts_x_long_na = ('iconic', 'rv');
-
- my @opts_x_long_arg = ('background', 'bd', 'bg', 'bordercolor',
- 'borderwidth', 'bw', 'display', 'fg', 'fn', 'font', 'foreground',
- 'ft', 'geometry', 'resolution', 'title', 'xrm');
-
-### main_set_options()
- ###### groffer options inherited from man
-
- my @opts_man_short_na = ();
- my @opts_man_short_arg = ();
-
- my @opts_man_long_na = ('all', 'ascii', 'catman', 'ditroff',
- 'local-file', 'location', 'troff', 'update');
-
- my @opts_man_long_arg = ('locale', 'manpath', 'pager',
- 'preprocessor', 'prompt', 'sections', 'systems', 'troff-device');
-
- ###### additional options for parsing evironment variable $MANOPT only
-
- my @opts_manopt_short_na = ('7', 'a', 'c', 'd', 'D', 'f', 'h', 'k',
- 'l', 't', 'u', 'V', 'w', 'Z');
-
- my @opts_manopt_short_arg = ('e', 'L', 'm', 'M', 'p', 'P', 'r', 'S',
- 'T');
-
- my @opts_manopt_long_na = (@opts_man_long_na, 'apropos', 'debug',
- 'default', 'help', 'html', 'ignore-case', 'location-cat',
- 'match-case', 'troff', 'update', 'version', 'whatis', 'where',
- 'where-cat');
-
- my @opts_manopt_long_arg = (@opts_man_long_na, 'config_file',
- 'encoding', 'extension', 'locale');
-
-### main_set_options()
- ###### collections of command line options
-
- # There are two hashes that control the whole of the command line
- # options, one for short and one for long options. Options without
- # and with arguments are mixed by advicing a value of 0 for an option
- # without argument and a value of 1 for an option with argument.
- # The options are with leading minus.
-
- foreach (@opts_groffer_short_na, @opts_groff_short_na,
- @opts_x_short_na, @opts_man_short_na, @opts_ignored_short_na) {
- $Opts_Cmdline_Short{"-$_"} = 0 if $_;
- }
- foreach (@opts_groffer_short_arg, @opts_groff_short_arg,
- @opts_x_short_arg, @opts_man_short_arg, @opts_ignored_short_arg) {
- $Opts_Cmdline_Short{"-$_"} = 1 if $_;
- }
-
- foreach (@opts_groffer_long_na, @opts_groff_long_na,
- @opts_x_long_na, @opts_man_long_na, @opts_ignored_long_na) {
- $Opts_Cmdline_Long{"--$_"} = 0 if $_;
- }
- foreach (@opts_groffer_long_arg, @opts_groff_long_arg,
- @opts_x_long_arg, @opts_man_long_arg, @opts_ignored_long_arg) {
- $Opts_Cmdline_Long{"--$_"} = 1 if $_;
- }
-
- # For determining abbreviations of an option take two spaces as join
- # for better check.
- # The options are without leading minus.
- $Opts_Cmdline_Long_Str = join ' ', keys %Opts_Cmdline_Long;
- if ($Opts_Cmdline_Long_Str) {
- $Opts_Cmdline_Long_Str = " $Opts_Cmdline_Long_Str ";
- $Opts_Cmdline_Long_Str =~ s/--//g;
- }
-
-### main_set_options()
- # options with equal meaning are mapped to a single option name
- # all of these have leading minus characters
- %Opts_Cmdline_Double = ('-h' => '--help',
- '-Q' => '--source',
- '-T' => '--device',
- '-v' => '--version',
- '-Z' => '--intermediate-output',
- '--bd' => '--bordercolor',
- '--bg' => '--background',
- '--bw' => '--borderwidth',
- '--debug-all' => '--debug',
- '--ditroff' => '--intermediate-output',
- '--dvi-viewer-tty' => '--dvi-viewer',
- '--fg' => '--foreground',
- '--fn' => '--font',
- '--ft' => '--font',
- '--html-viewer-tty' => '--html-viewer',
- '--pdf-viewer-tty' => '--pdf-viewer',
- '--ps-viewer-tty' => '--ps-viewer',
- '--troff-device' => '--device',
- '--tty-device' => '--text-device',
- '--tty-viewer' => '--pager',
- '--tty-viewer-tty' => '--pager',
- '--where' => '--location',
- '--www' => '--html',
- '--www-viewer' => '--html-viewer',
- '--www-viewer-tty' => '--html-viewer',
- '--x-viewer-tty' => '--x-viewer',
- '--X' => '--x',
- '--X-viewer' => '--x-viewer',
- '--X-viewer-tty' => '--x-viewer',
- );
-
- # groff short options with leading minus
- foreach (@opts_groff_short_na) {
- $Opts_Groff_Short{"-$_"} = 0;
- }
- foreach (@opts_groff_short_arg) {
- $Opts_Groff_Short{"-$_"} = 1;
- }
-
-} # main_set_options()
-
-
-########################################################################
-# $MANOPT, main_parse_MANOPT()
-########################################################################
-
-# handle environment variable $MANOPT
-my @Manopt;
-
-sub main_parse_MANOPT {
- if ($ENV{'MANOPT'}) {
- @Manopt = `sh $File_split_env_sh MANOPT`;
- chomp @Manopt;
-
- my @manopt;
- # %opts stores options that are used by groffer for $MANOPT
- # All options not in %opts are ignored.
- # Check options used with %Opts_Cmdline_Double.
- # 0: option used ('' for ignore), 1: has argument or not
-### main_parse_MANOPT()
- my %opts = ('-7' => ['--ascii', 0],
- '--ascii' => ['--ascii', 0],
- '-a' => ['--all', 0],
- '--all' => ['--all', 0],
- '-c' => ['', 1],
- '--catman' => ['', 1],
- '-e' => ['--extension', 1],
- '--extension' => ['--extension', 1],
- '-f' => ['--whatis', 1],
- '--whatis' => ['--whatis', 1],
- '-L' => ['--locale', 1],
- '--locale' => ['--locale', 1],
- '-m' => ['--systems', 1],
- '--systems' => ['--systems', 1],
- '-M' => ['--manpath', 1],
- '-manpath' => ['--manpath', 1],
- '--manpath' => ['--manpath', 1],
- '-p' => ['', 1],
- '--preprocessor' => ['', 1],
- '-P' => ['--pager', 1],
- '-pager' => ['--pager', 1],
- '-r' => ['', 1],
- '-prompt' => ['', 1],
- '-S' => ['--sections', 1],
- '-sections' => ['--sections', 1],
- '-T' => ['-T', 1],
- '--device' => ['-T', 1],
- '-w' => ['--location', 0],
- '--where' => ['--location', 0],
- '--location' => ['--location', 0],
- );
-
-### main_parse_MANOPT()
- my ($opt, $has_arg);
- my $i = 0;
- my $n = $#Manopt;
- while ($i <= $n) {
- my $o = $Manopt[$i];
- ++$i;
- # ignore, when not in %opts
- next unless (exists $opts{$o});
- if (($o eq '-D') or ($o eq '--default')) {
- @manopt = ();
- next;
- }
- $opt = $opts{$o}[0];
- $has_arg = $opts{$o}[1];
- # ignore, when empty in %opts
- unless ($opt) {
- # ignore without argument
- next unless ($has_arg);
- # ignore the argument as well
- ++$i;
- next;
- }
- if ($has_arg) {
- last if ($i > $n);
- push @manopt, $opt, $Manopt[$i];
- ++$i;
- next;
- } else {
- push @manopt, $opt;
- next;
- }
- }
- @Manopt = @manopt;
- }
-} # main_parse_MANOPT()
-
-
-########################################################################
-# configuration files, $GROFFER_OPT, and command line, main_config_params()
-########################################################################
-
-my @Options;
-my @Filespecs;
-my @Starting_Conf;
-my @Starting_ARGV = @ARGV;
-sub main_config_params { # handle configuration files
- # options may not be abbreviated, but must be exact
- my @conf_args;
- foreach my $f (@Conf_Files) {
- if (-s $f) {
- my $fh;
- open $fh, "<$f" || next;
- my $nr = 0;
- LINE: foreach my $line (<$fh>) {
- ++ $nr;
- chomp $line;
- # remove starting and ending whitespace
- $line =~ s/^\s+|\s+$//g;
- # replace whitespace by single space
- $line =~ s/\s+/ /g;
- # ignore all lines that do not start with minus
- next unless $line =~ /^-/;
- # three minus
- if ($line =~ /^---/) {
- warn "Wrong option $line in configuration file $f.\n";
- next;
- }
- if ($line =~ /^--[ =]/) {
- warn "No option name in `$line' in configuration " .
- "file $f.\n";
- next;
- }
- push @Starting_Conf, $line;
- # -- or -
- if ($line =~ /^--?$/) {
- warn "`$line' is not allowed in configuration files.\n";
- next;
- }
- ### main_config_params()
- if ($line =~ /^--/) { # line is long option
- my ($name, $arg);
- if ($line =~ /[ =]/) { # has arg on line
- $line =~ /^(--[^ =]+)[ =] ?(.*)$/;
- ($name, $arg) = ($1, $2);
- $arg =~ s/[\'\"]//g;
- } else { # does not have an argument on line
- $name = $line;
- }
- $name =~ s/[\'\"]//g;
- unless (exists $Opts_Cmdline_Long{$name}) {
- # option does not exist
- warn "Option `$name' does not exist.\n";
- next LINE;
- }
- # option exists
- if ($Opts_Cmdline_Long{$name}) { # option has arg
- if (defined $arg) {
- push @conf_args, $name, $arg;
- next LINE;
- } else {
- warn "Option `$name' needs an argument in " .
- "configuration file $f\n";
- next LINE;
- }
- } else { # option has no arg
- if (defined $arg) {
- warn "Option `$name' may not have an argument " .
- "in configuration file $f\n";
- next LINE;
- } else {
- push @conf_args, $name;
- next LINE;
- }
- }
- ### main_config_params()
- } else { # line is short option or cluster
- $line =~ s/^-//;
- while ($line) {
- $line =~ s/^(.)//;
- my $opt = "-$1";
- next if ($opt =~ /\'\"/);
- if ($opt =~ /- /) {
- warn "Option `$conf_args[$#conf_args]' does not " .
- "have an argument.\n";
- next LINE;
- }
- if (exists $Opts_Cmdline_Short{$opt}) {
- # short opt exists
- push @conf_args, $opt;
- if ($Opts_Cmdline_Short{$opt}) { # with arg
- my $arg = $line;
- $arg =~ s/^ //;
- $arg =~ s/\'\"//g;
- push @conf_args, "$arg";
- next LINE;
- } else { # no arg
- next;
- }
- } else { # short option does not exist
- warn "Wrong short option `-$opt' from " .
- "configuration. Rest of line ignored.\n";
- next LINE;
- }
- }
- }
- }
- close $fh;
- }
- }
-
-### main_config_params()
- # handle environment variable $GROFFER_OPT
- my @GROFFER_OPT;
- if ($ENV{'GROFFER_OPT'}) {
- @GROFFER_OPT = `sh $File_split_env_sh GROFFER_OPT`;
- chomp @GROFFER_OPT;
- }
-
- # Handle command line parameters together with $GROFFER_OPT.
- # Options can be abbreviated, with each - as abbreviation place.
- {
- my @argv0 = (@GROFFER_OPT, @ARGV);
- my @argv;
- my $only_files = 0;
- my $n = $#argv0; # last element
- my $n1 = scalar @GROFFER_OPT; # first element of @ARGV
- my $i = 0; # number of the element
- my @s = ('the environment variable $GROFFER_OPT', 'the command line');
- my $j = 0; # index in @s, 0 before $n1, 1 then
- ELT: while ($i <= $n) {
- my $elt = $argv0[$i];
- $j = 1 if $i >= $n1;
- ++$i;
- # remove starting and ending whitespace
- $elt =~ s/^\s+|\s+$//g;
- # replace whitespace by single space
- $elt =~ s/\s+/ /g;
-
- if ($only_files) {
- push @Filespecs, $elt;
- next ELT;
- }
-
-### main_config_params()
- if ($elt =~ /^-$/) { # -
- push @Filespecs, $elt;
- next ELT;
- }
- if ($elt =~ /^--$/) { # --
- $only_files = 1;
- next ELT;
- }
-
- if ($elt =~ /^--[ =]/) { # no option name
- warn "No option name in `$elt' at $s[$j].\n";
- next ELT;
- }
- if ($elt =~ /^---/) { # wrong with three minus
- warn "Wrong option `$elt' at $s[$j].\n";
- next ELT;
- }
-
- if ($elt =~ /^--[^-]/) { # long option
- my ($name, $opt, $abbrev, $arg);
- if ($elt =~ /[ =]/) { # has arg on elt
- $elt =~ /^--([^ =]+)[ =] ?(.*)$/;
- ($name, $arg) = ($1, $2);
- $opt = "--$name";
- $abbrev = $name;
- $arg =~ s/[\'\"]//g;
- } else { # does not have an argument in the element
- $opt = $name = $elt;
- $name =~ s/^--//;
- $abbrev = $name;
- }
-### main_config_params()
- # remove quotes in name
- $name =~ s/[\'\"]//g;
- my $match = $name;
- $match =~ s/-/[^- ]*-/g;
- ### main_config_params()
- if (exists $Opts_Cmdline_Long{$opt}) {
- # option exists exactly
- } elsif ($Opts_Cmdline_Long_Str =~ / (${match}[^- ]*?) /) {
- # option is an abbreviation without further -
- my $n0 = $1;
- if ($Opts_Cmdline_Long_Str =~
- / (${match}[^- ]*) .* (${match}[^- ]*) /) {
- warn "Option name `--$abbrev' is not unique: " .
- "--$1 --$2 \n";
- next ELT;
- }
- $name = $n0;
- $opt = "--$n0";
- } elsif ($Opts_Cmdline_Long_Str =~ / (${match}[^ ]*) /) {
- # option is an abbreviation with further -
- my $n0 = $1;
- if ($Opts_Cmdline_Long_Str =~
- / (${match}[^ ]*) .* (${match}[^ ]*) /) {
- warn "Option name `--$abbrev' is not unique: " .
- "--$1 --$2 \n";
- next ELT;
- }
- $name = $n0;
- $opt = "--$n0";
- } else {
- warn "Option `--$abbrev' does not exist.\n";
- next ELT;
- }
-### main_config_params()
- if ($Opts_Cmdline_Long{$opt}) { # option has arg
- if (defined $arg) {
- push @argv, "--$name", $arg;
- next ELT;
- } else { # $arg not defined, argument at next element
- if (($i == $n1) || ($i > $n)) {
- warn "No argument left for option " .
- "`$elt' at $s[$j].\n";
- next ELT;
- }
- ### main_config_params()
- # add argument as next element
- push @argv, "--$name", $argv0[$i];
- ++$i;
- next ELT;
- } # if (defined $arg)
- } else { # option has no arg
- if (defined $arg) {
- warn "Option `$abbrev' may not have an argument " .
- "at $s[$j].\n";
- next ELT;
- } else {
- push @argv, "--$name";
- next ELT;
- }
- } # if ($Opts_Cmdline_Long{$opt})
-### main_config_params()
- } elsif ($elt =~ /^-[^-]/) { # short option or cluster
- my $cluster = $elt;
- $cluster =~ s/^-//;
- while ($cluster) {
- $cluster =~ s/^(.)//;
- my $opt = "-$1";
- if (exists $Opts_Cmdline_Short{$opt}) { # opt exists
- if ($Opts_Cmdline_Short{$opt}) { # with arg
- if ($cluster) { # has argument in this element
- $cluster =~ s/^ //;
- $cluster =~ s/\'\"//g;
- # add argument as rest of this element
- push @argv, $opt, $cluster;
- next ELT;
- } else { # argument at next element
- if (($i == $n1) || ($i > $n)) {
- warn "No argument left for option " .
- "`$opt' at $s[$j].\n";
- next ELT;
- }
- ### main_config_params()
- # add argument as next element
- push @argv, $opt, $argv0[$i];
- ++$i;
- next ELT;
- }
- } else { # no arg
- push @argv, $opt;
- next;
- }
- } else { # short option does not exist
- warn "Wrong short option `$opt' at $s[$j].\n";
- next ELT;
- } # if (exists $Opts_Cmdline_Short{$opt})
- } # while ($cluster)
- } else { # not an option, file name
- push @Filespecs, $elt;
- next;
- }
- }
-### main_config_params()
- @Options = (@Manopt, @conf_args, @argv);
- foreach my $i (0..$#Options) {
- if ( exists $Opts_Cmdline_Double{ $Options[$i] } ) {
- $Options[$i] = $Opts_Cmdline_Double{ $Options[$i] };
- }
- }
- @Filespecs = ('-') unless (@Filespecs);
- @ARGV = (@Options, '--', @Filespecs);
- }
-} # main_config_params()
-
-if (0) {
- print STDERR "<$_>\n" foreach @ARGV;
-}
-
-
-########################################################################
-# main_parse_params()
-########################################################################
-
-my $i;
-my $n;
-
-$Opt{'XRM'} = [];
-
-sub main_parse_params {
- $i = 0;
- $n = $#Options;
-
- # options that are ignored in this part
- # shell version of groffer: --debug*, --shell
- # man options: --catman (only special in man),
- # --preprocessor (force groff preproc., handled by grog),
- # --prompt (prompt for less, ignored),
- # --troff (-mandoc, handled by grog),
- # --update (inode check, ignored)
- my %ignored_opts = (
- '--catman' => 0,
- '--debug-func' => 0,
- '--debug-not-func' => 0,
- '--debug-lm' => 0,
- '--debug-shell' => 0,
- '--debug-stacks' => 0,
- '--debug-user' => 0,
- '--preprocessor' => 1,
- '--prompt' => 1,
- '--shell' => 1,
- '--troff' => 0,
- '--update' => 0,
- );
-
-### main_parse_params()
- my %long_opts =
- (
- '--debug' =>
- sub { $Debug{$_} = 1 foreach (qw/FILENAMES GROG KEEP PARAMS TMPDIR/); },
- '--debug-filenames' => sub { $Debug{'FILENAMES'} = 1; },
- '--debug-grog' => sub { $Debug{'GROG'} = 1; },
- '--debug-keep' => sub { $Debug{'KEEP'} = 1; $Debug{'PARAMS'} = 1; },
- '--debug-params' => sub { $Debug{'PARAMS'} = 1; },
- '--debug-tmpdir' => sub { $Debug{'TMPDIR'} = 1; },
- '--help' => sub { &usage(); $Opt{'DO_NOTHING'} = 1; },
- '--source' => sub { $Opt{'MODE'} = 'source'; },
- '--device' =>
- sub { $Opt{'DEVICE'} = &_get_arg();
- my %modes = ( 'dvi'=> 'dvi',
- 'html' => 'html',
- 'lbp' => 'groff',
- 'lj4' => 'groff',
- 'ps' => 'ps',
- 'ascii' => 'tty',
- 'cp1047' => 'tty',
- 'latin1' => 'tty',
- 'utf8' => 'tty',
- );
- if ($Opt{'DEVICE'} =~ /^X.*/) {
- $Opt{'MODE'} = 'x';
- } elsif ( exists $modes{ $Opt{'DEVICE'} } ) {
- if ( $modes{ $Opt{'DEVICE'} } eq 'tty' ) {
- $Opt{'MODE'} = 'tty'
- unless ($Opt{'MODE'} eq 'text');
- } else {
- $Opt{'MODE'} = $modes{ $Opt{'DEVICE'} };
- }
- } else {
- # for all elements not in %modes
- $Opt{'MODE'} = 'groff';
- }
- },
-### main_parse_params()
- '--version' => sub { &version(); $Opt{'DO_NOTHING'} = 1; },
- '--intermediate-output' => sub { $Opt{'Z'} = 1; },
- '--all' => sub { $Opt{'ALL'} = 1; },
- '--apropos' => # run apropos
- sub { $Opt{'APROPOS'} = 1;
- delete $Opt{'APROPOS_SECTIONS'};
- delete $Opt{'WHATIS'}; },
- '--apropos-data' => # run apropos for data sections
- sub { $Opt{'APROPOS'} = 1;
- $Opt{'APROPOS_SECTIONS'} = '457';
- delete $Opt{'WHATIS'}; },
- '--apropos-devel' => # run apropos for devel sections
- sub { $Opt{'APROPOS'} = 1;
- $Opt{'APROPOS_SECTIONS'} = '239';
- delete $Opt{'WHATIS'}; },
- '--apropos-progs' => # run apropos for prog sections
- sub { $Opt{'APROPOS'} = 1;
- $Opt{'APROPOS_SECTIONS'} = '168';
- delete $Opt{'WHATIS'}; },
- '--ascii' =>
- sub { push @Addopts_Groff, '-mtty-char';
- $Opt{'MODE'} = 'text' unless $Opt{'MODE'}; },
- '--auto' => # the default automatic mode
- sub { delete $Opt{'MODE'}; },
- '--bordercolor' => # border color for viewers, arg
- sub { $Opt{'BD'} = &_get_arg(); },
- '--background' => # background color for viewers, arg
- sub { $Opt{'BG'} = &_get_arg(); },
-### main_parse_params()
- '--borderwidth' => # border width for viewers, arg
- sub { $Opt{'BW'} = &_get_arg(); },
- '--default' => # reset variables to default
- sub { %Opt = (); },
- '--default-modes' => # sequence of modes in auto mode; arg
- sub { $Opt{'DEFAULT_MODES'} = &_get_arg(); },
- '--display' => # set X display, arg
- sub { $Opt{'DISPLAY'} = &_get_arg(); },
- '--do-nothing' => sub { $Opt{'DO_NOTHING'} = 1; },
- '--dvi' => sub { $Opt{'MODE'} = 'dvi'; },
- '--dvi-viewer' => # viewer program for dvi mode; arg
- sub { $Opt{'VIEWER_DVI'} = &_get_arg(); },
- '--extension' => # the extension for man pages, arg
- sub { $Opt{'EXTENSION'} = &_get_arg(); },
- '--foreground' => # foreground color for viewers, arg
- sub { $Opt{'FG'} = &_get_arg(); },
- '--font' => # set font for viewers, arg
- sub { $Opt{'FN'} = &_get_arg(); },
- '--geometry' => # window geometry for viewers, arg
- sub { $Opt{'GEOMETRY'} = &_get_arg(); },
- '--groff' => sub { $Opt{'MODE'} = 'groff'; },
- '--html' => sub { $Opt{'MODE'} = 'html'; },
- '--html-viewer' => # viewer program for html mode; arg
- sub { $Opt{'VIEWER_HTML'} = &_get_arg(); },
- '--iconic' => # start viewers as icons
- sub { $Opt{'ICONIC'} = 1; },
- '--locale' => # set language for man pages, arg
- # argument is xx[_territory[.codeset[@modifier]]] (ISO 639,...)
- sub { $Opt{'LANG'} = &_get_arg(); },
- '--local-file' => # force local files; same as `--no-man'
- sub { delete $Man{'ENABLE'}; delete $Man{'FORCE'}; },
- '--location' => # print file locations to stderr
- sub { $Opt{'LOCATION'} = 1; },
-### main_parse_params()
- '--man' => # force all file params to be man pages
- sub { $Man{'ENABLE'} = 1; $Man{'FORCE'} = 1; },
- '--manpath' => # specify search path for man pages, arg
- # arg is colon-separated list of directories
- sub { $Opt{'MANPATH'} = &_get_arg(); },
- '--mode' => # display mode
- sub { my $arg = &_get_arg();
- my %modes = ( '' => '',
- 'auto' => '',
- 'groff' => 'groff',
- 'html' => 'html',
- 'www' => 'html',
- 'dvi' => 'dvi',
- 'pdf' => 'pdf',
- 'ps' => 'ps',
- 'text' => 'text',
- 'tty' => 'tty',
- 'X' => 'x',
- 'x' => 'x',
- 'Q' => 'source',
- 'source' => 'source',
- );
- if ( exists $modes{$arg} ) {
- if ( $modes{$arg} ) {
- $Opt{'MODE'} = $modes{$arg};
- } else {
- delete $Opt{'MODE'};
- }
- } else {
- warn "Unknown mode in `$arg' for --mode\n";
- }
- },
-### main_parse_params()
- '--no-location' => # disable former call to `--location'
- sub { delete $Opt{'LOCATION'}; },
- '--no-man' => # disable search for man pages
- sub { delete $Man{'ENABLE'}; delete $Man{'FORCE'}; },
- '--no-special' => # disable some special former calls
- sub { delete $Opt{'ALL'}; delete $Opt{'APROPOS'};
- delete $Opt{'WHATIS'}; },
- '--pager' => # set paging program for tty mode, arg
- sub { $Opt{'PAGER'} = &_get_arg(); },
- '--pdf' => sub { $Opt{'MODE'} = 'pdf'; },
- '--pdf-viewer' => # viewer program for pdf mode; arg
- sub { $Opt{'VIEWER_PDF'} = &_get_arg(); },
- '--print' => # print argument, for argument test
- sub { my $arg = &_get_arg; print STDERR "$arg\n"; },
- '--ps' => sub { $Opt{'MODE'} = 'ps'; },
- '--ps-viewer' => # viewer program for ps mode; arg
- sub { $Opt{'VIEWER_PS'} = &_get_arg(); },
- '--resolution' => # set resolution for X devices, arg
- sub { my $arg = &_get_arg();
- my %res = ( '75' => 75,
- '75dpi' => 75,
- '100' => 100,
- '100dpi' => 100,
- );
- if (exists $res{$arg}) {
- $Opt{'RESOLUTION'} = $res{$arg};
- } else {
- warn "--resolution allows only 75, 75dpi, " .
- "100, 100dpi as argument.\n";
- }
- },
-### main_parse_params()
- '--rv' => sub { $Opt{'RV'} = 1; },
- '--sections' => # specify sections for man pages, arg
- # arg is a `:'-separated (colon) list of section names
- sub { my $arg = &_get_arg();
- my @arg = split /:/, $arg;
- my $s;
- foreach (@arg) {
- /^(.)/;
- my $c = $1;
- if ($Man{'AUTO_SEC_CHARS'} =~ /$c/) {
- $s .= $c;
- } else {
- warn "main_parse_params(): not a man section `$c';";
- }
- }
- $Opt{'SECTIONS'} = $s; },
- '--systems' => # man pages for different OS's, arg
- # argument is a comma-separated list
- sub { $Opt{'SYSTEMS'} = &_get_arg(); },
- '--text' => # text mode without pager
- sub { $Opt{'MODE'} = 'text'; },
- '--title' => # title for X viewers; arg
- sub { my $arg = &_get_arg();
- if ($arg) {
- if ( $Opt{'TITLE'} ) {
- $Opt{'TITLE'} = "$Opt{'TITLE'} $arg";
- } else {
- $Opt{'TITLE'} = $arg;
- }
- }
- },
- '--tty' => # tty mode, text with pager
- sub { $Opt{'MODE'} = 'tty'; },
- '--to-stdout' => # print mode file without display
- sub { $Opt{'STDOUT'} = 1; },
- '--text-device' => # device for tty mode; arg
- sub { $Opt{'TEXT_DEVICE'} = &_get_arg(); },
- '--whatis' => sub { delete $Opt{'APROPOS'}; $Opt{'WHATIS'} = 1; },
- '--x' => sub { $Opt{'MODE'} = 'x'; },
-### main_parse_params()
- '--xrm' => # pass X resource string, arg
- sub { my $arg = &_get_arg(); push @{$Opt{'XRM'}}, $arg if $arg; },
- '--x-viewer' => # viewer program for x mode; arg
- sub { $Opt{'VIEWER_X'} = &_get_arg(); },
- );
-
- my %short_opts = (
- '-V' => sub { $Opt{'V'} = 1; },
- '-X' => sub { $Opt{'X'} = 1; },
- );
-
- if (0) {
- # check if all options are handled in parse parameters
-
- #short options
- my %these_opts = (%ignored_opts, %short_opts, %Opts_Groff_Short,
- %Opts_Cmdline_Double);
- foreach my $key (keys %Opts_Cmdline_Short) {
- warn "unused option: $key" unless exists $these_opts{$key};
- }
-
- # long options
- %these_opts = (%ignored_opts, %long_opts, %Opts_Cmdline_Double);
- foreach my $key (keys %Opts_Cmdline_Long) {
- warn "unused option: $key" unless exists $these_opts{$key};
- }
- } # if (0)
-
-### main_parse_params()
- OPTION: while ($i <= $n) {
- my $opt = $Options[$i];
- ++$i;
- if ($opt =~ /^-([^-])$/) { # single minus for short option
- if (exists $short_opts{$opt}) { # short option handled by hash
- $short_opts{$opt}->();
- next OPTION;
- } else { # $short_opts{$opt} does not exist
- my $c = $1; # the option character
- next OPTION unless $c;
- if ( exists $Opts_Groff_Short{ $opt } ) { # groff short option
- if ( $Opts_Groff_Short{ $opt } ) { # option has argument
- my $arg = $Options[$i];
- ++$i;
- push @Addopts_Groff, $opt, $arg;
- next OPTION;
- } else { # no argument for this option
- push @Addopts_Groff, $opt;
- next OPTION;
- }
- } elsif ( exists $Opts_Cmdline_Short{ $opt } ) {
- # is a groffer short option
- warn "Groffer option $opt not handled " .
- "in parameter parsing";
- } else {
- warn "$opt is not a groffer option.\n";
- }
- } # if (exists $short_opts{$opt})
- } # if ($opt =~ /^-([^-])$/)
- # Now it is a long option
-
- # handle ignored options
- if ( exists $ignored_opts{ $opt } ) {
- ++$i if ( $ignored_opts{ $opt } );
- next OPTION;
- }
-### main_parse_params()
-
- # handle normal long options
- if (exists $long_opts{$opt}) {
- $long_opts{$opt}->();
- } else {
- warn "Unknown option $opt.\n";
- }
- next OPTION;
- } # while ($i <= $n)
-
- if ($Debug{'PARAMS'}) {
- print STDERR '$MANOPT: ' . "$ENV{'MANOPT'}\n" if $ENV{'MANOPT'};
- foreach (@Starting_Conf) {
- print STDERR "configuration: $_\n";
- }
- print STDERR '$GROFFER_OPT: ' . "$ENV{'GROFFER_OPT'}\n"
- if $ENV{'GROFFER_OPT'};
- print STDERR "command line: @Starting_ARGV\n";
- print STDERR "parameters: @ARGV\n";
- }
-
- if ( $Opt{'WHATIS'} ) {
- die "main_parse_params(): cannot handle both `whatis' and `apropos';"
- if $Opt{'APROPOS'};
- $Man{'ALL'} = 1;
- delete $Opt{'APROPOS_SECTIONS'};
- }
-
- if ( $Opt{'DO_NOTHING'} ) {
- exit;
- }
-
- if ( $Opt{'DEFAULT_MODES'} ) {
- @Default_Modes = split /,/, $Opt{'DEFAULT_MODES'};
- }
-} # main_parse_params()
-
-
-sub _get_arg {
- if ($i > $n) {
- die '_get_arg(): No argument left for last option;';
- }
- my $arg = $Options[$i];
- ++$i;
- $arg;
-} # _get_arg() of main_parse_params()
-
-
-########################################################################
-# main_set_mode()
-########################################################################
-
-my $Viewer_Background;
-my $PDF_Did_Not_Work;
-my $PDF_Has_gs;
-my $PDF_Has_ps2pdf;
-my %Display = ('MODE' => '',
- 'PROG' => '',
- 'ARGS' => ''
- );
-
-sub main_set_mode {
- my @modes;
-
- # set display
- $ENV{'DISPLAY'} = $Opt{'DISPLAY'} if $Opt{'DISPLAY'};
-
- push @Addopts_Groff, '-V' if $Opt{'V'};
-
- if ( $Opt{'X'} ) {
- $Display{'MODE'} = 'groff';
- push @Addopts_Groff, '-X';
- }
-
- if ( $Opt{'Z'} ) {
- $Display{'MODE'} = 'groff';
- push @Addopts_Groff, '-Z';
- }
-
- $Display{'MODE'} = 'groff' if $Opt{'MODE'} and $Opt{'MODE'} eq 'groff';
-
- return 1 if $Display{'MODE'} and $Display{'MODE'} eq 'groff';
-
-### main_set_mode()
- if ($Opt{'MODE'}) {
- if ($Opt{'MODE'} =~ /^(source|text|tty)$/) {
- $Display{'MODE'} = $Opt{'MODE'};
- return 1;
- }
- $Display{'MODE'} = $Opt{'MODE'} if $Opt{'MODE'} =~ /^html$/;
- @modes = ($Opt{'MODE'});
- } else { # empty mode
- if ($Opt{'DEVICE'}) {
- if ($Opt{'DEVICE'} =~ /^X/) {
- &is_X() || die "no X display found for device $Opt{'DEVICE'}";
- $Display{'MODE'} = 'x';
- return 1;
- }
- ;
- if ($Opt{'DEVICE'} =~ /^(ascii|cp1047|latin1|utf8)$/) {
- $Display{'MODE'} ne 'text' and $Display{'MODE'} = 'tty';
- return 1;
- }
- ;
- unless (&is_X) {
- $Display{'MODE'} = 'tty';
- return 1;
- }
- } # check device
- @modes = @Default_Modes;
- } # check mode
-
-### main_set_mode()
- LOOP: foreach my $m (@modes) {
- $Viewer_Background = 0;
- if ($m =~ /^(test|tty|X)$/) {
- $Display{'MODE'} = $m;
- return 1;
- } elsif ($m eq 'pdf') {
- next LOOP if $PDF_Did_Not_Work;
- $PDF_Has_gs = &where_is_prog('gs') ? 1 : 0
- unless (defined $PDF_Has_gs);
- $PDF_Has_ps2pdf = &where_is_prog('ps2pdf') ? 1 : 0
- unless (defined $PDF_Has_ps2pdf);
- if ( (! $PDF_Has_gs) and (! $PDF_Has_ps2pdf) ) {
- $PDF_Did_Not_Work = 1;
- next LOOP;
- }
-
- if (&_get_prog_args($m)) {
- return 1;
- } else {
- $PDF_Did_Not_Work = 1;
- next LOOP;
- }
- } else { # other modes
- &_get_prog_args($m) ? return 1 : next LOOP;
- } # if $m
- } # LOOP: foreach
- die 'set mode: no suitable display mode found under ' .
- join(', ', @modes) . ';' unless $Display{'MODE'};
- die 'set mode: no viewer available for mode ' . $Display{'MODE'} . ';'
- unless $Display{'PROG'};
- 0;
-} # main_set_mode()
-
-
-########################################################################
-# functions to main_set_mode()
-########################################################################
-
-##########
-# _get_prog_args(<MODE>)
-#
-# Simplification for loop in set mode.
-#
-# Globals in/out: $Viewer_Background
-# Globals in : $Opt{VIEWER_<MODE>}, $Viewer_X{<MODE>},
-# $Viewer_tty{<MODE>}
-#
-sub _get_prog_args {
- my $n = @_;
- die "_get_prog_args(): one argument is needed; you used $n;"
- unless $n == 1;
-
- my $mode = lc($_[0]);
- my $MODE = uc($mode);
-
- my $xlist = $Viewer_X{$MODE};
- my $ttylist = $Viewer_tty{$MODE};
-
- my $vm = "VIEWER_${MODE}";
- my $opt = $Opt{$vm};
-
- if ($opt) {
- my %prog = where_is_prog $opt;
- my $prog_ref = \%prog;
- unless (%prog) {
- warn "_get_prog_args(): `$opt' is not an existing program;";
- return 0;
- }
-
- # $prog from $opt is an existing program
-
-### _get_prog_args() of main_set_mode()
- if (&is_X) {
- if ( &_check_prog_on_list($prog_ref, $xlist) ) {
- $Viewer_Background = 1;
- } else {
- $Viewer_Background = 0;
- &_check_prog_on_list($prog_ref, $ttylist);
- }
- } else { # is not X
- $Viewer_Background = 0;
- &_check_prog_on_list($prog_ref, $ttylist);
- } # if is X
- } else { # $opt is empty
- $Viewer_Background = 0;
- my $x;
- if (&is_X) {
- $x = &_get_first_prog($xlist);
- $Viewer_Background = 1 if $x;
- } else { # is not X
- $x = &_get_first_prog($ttylist);
- } # test on X
- $Display{'MODE'} = $mode if $x;
- return $x;
- }
- $Display{'MODE'} = $mode;
- return 1;
-} # _get_prog_args() of main_set_mode()
-
-
-##########
-# _get_first_prog(<prog_list_ref>)
-#
-# Retrieve from the elements of the list in the argument the first
-# existing program in $PATH.
-#
-# Local function of main_set_mode().
-#
-# Return : `0' if not a part of the list, `1' if found in the list.
-#
-sub _get_first_prog {
- my $n = @_;
- die "_get_first_prog(): one argument is needed; you used $n;"
- unless $n == 1;
-
- foreach my $i (@{$_[0]}) {
- next unless $i;
- my %prog = &where_is_prog($i);
- if (%prog) {
- $Display{'PROG'} = $prog{'fullname'};
- $Display{'ARGS'} = $prog{'args'};
- return 1;
- }
- }
- return 0;
-} # _get_first_prog() of main_set_mode()
-
-
-##########
-# _check_prog_on_list (<prog-hash-ref> <prog_list_ref>)
-#
-# Check whether the content of <prog-hash-ref> is in the list
-# <prog_list_ref>.
-# The globals are set correspondingly.
-#
-# Local function for main_set_mode().
-#
-# Arguments: 2
-#
-# Return : `0' if not a part of the list, `1' if found in the list.
-# Output : none
-#
-# Globals in : $Viewer_X{<MODE>}, $Viewer_tty{<MODE>}
-# Globals in/out: $Display{'PROG'}, $Display{'ARGS'}
-#
-sub _check_prog_on_list {
- my $n = @_;
- die "_get_first_prog(): 2 arguments are needed; you used $n;"
- unless $n == 2;
-
- my %prog = %{$_[0]};
-
- $Display{'PROG'} = $prog{'fullname'};
- $Display{'ARGS'} = $prog{'args'};
-
- foreach my $i (@{$_[1]}) {
- my %p = &where_is_prog($i);
- next unless %p;
- next unless $Display{'PROG'} eq $p{'fullname'};
- if ($p{'args'}) {
- if ($Display{'ARGS'}) {
- $Display{'ARGS'} = $p{'args'};
- } else {
- $Display{'ARGS'} = "$p{'args'} $Display{'ARGS'}";
- }
- } # if args
- return 1;
- } # foreach $i
- # prog was not in the list
- return 0;
-} # _check_prog_on_list() of main_set_mode()
-
-
-########################################################################
-# groffer temporary directory, main_temp()
-########################################################################
-
-sub main_temp {
- my $template = 'groffer_' . "$$" . '_XXXX';
- foreach ($ENV{'GROFF_TMPDIR'}, $ENV{'TMPDIR'}, $ENV{'TMP'}, $ENV{'TEMP'},
- $ENV{'TEMPDIR'}, File::Spec->catfile($ENV{'HOME'}, 'tmp')) {
- if ($_ && -d $_ && -w $_) {
- if ($Debug{'KEEP'}) {
- eval { $tmpdir = tempdir( $template, DIR => "$_" ); };
- } else {
- eval { $tmpdir = tempdir( $template,
- CLEANUP => 1, DIR => "$_" ); };
- }
- last if $tmpdir;
- }
- }
- $tmpdir = tempdir( $template, CLEANUP => 1, DIR => File::Spec->tmpdir )
- unless ($tmpdir);
-
- # see Lerning Perl, page 205, or Programming Perl, page 413
- # $SIG{'INT'} is for Ctrl-C interruption
- $SIG{'INT'} = sub { &clean_up(); die "interrupted..."; };
- $SIG{'QUIT'} = sub { &clean_up(); die "quit..."; };
-
- if ($Debug{'TMPDIR'}) {
- if ( $Debug{'KEEP'}) {
- print STDERR "temporary directory is kept: $tmpdir\n";
- } else {
- print STDERR "temporary directory will be cleaned: $tmpdir\n";
- }
- }
-
- # further argument: SUFFIX => '.sh'
- if ($Debug{'KEEP'}) {
- ($fh_cat, $tmp_cat) = tempfile(',cat_XXXX', DIR => $tmpdir);
- ($fh_stdin, $tmp_stdin) = tempfile(',stdin_XXXX', DIR => $tmpdir);
- } else {
- ($fh_cat, $tmp_cat) = tempfile(',cat_XXXX', UNLINK => 1,
- DIR => $tmpdir);
- ($fh_stdin, $tmp_stdin) = tempfile(',stdin_XXXX', UNLINK => 1,
- DIR => $tmpdir);
- }
-} # main_temp()
-
-
-########################################################################
-# tmp functions and compression
-########################################################################
-
-########################################################################
-# further functions needed for main_do_fileargs()
-########################################################################
-
-my @REG_TITLE = ();
-
-##########
-# register_file(<filename>)
-#
-# Write a found file and register the title element.
-#
-# Arguments: 1: a file name
-# Output: none
-#
-sub register_file {
- my $n = @_;
- die "register_file(): one argument is needed; you used $n;"
- unless $n == 1;
- die 'register_file(): file name is empty;' unless $_[0];
-
- if ($_[0] eq '-') {
- &to_tmp($tmp_stdin) && &register_title('stdin');
- } else {
- &to_tmp($_[0]) && &register_title($_[0]);
- }
- 1;
-} # register_file()
-
-
-##########
-# register_title(<filespec>)
-#
-# Create title element from <filespec> and append to $_REG_TITLE_LIST.
-# Basename is created.
-#
-# Globals in/out: @REG_TITLE
-#
-# Variable prefix: rt
-#
-sub register_title {
- my $n = @_;
- die "register_title(): one argument is needed; you used $n;"
- unless $n == 1;
- return 1 unless $_[0];
-
- return 1 if scalar @REG_TITLE > 3;
-
- my $title = &get_filename($_[0]);
- $title =~ s/\s/_/g;
- $title =~ s/\.bz2$//g;
- $title =~ s/\.gz$//g;
- $title =~ s/\.Z$//g;
-
- if ($Debug{'FILENAMES'}) {
- if ($_[0] eq 'stdin') {
- print STDERR "register_title(): file title is stdin\n";
- } else {
- print STDERR "register_title(): file title is $title\n";
- }
- } # if ($Debug{'FILENAMES'})
-
- return 1 unless $title;
- push @REG_TITLE, $title;
- 1;
-} # register_title()
-
-
-##########
-# save_stdin()
-#
-# Store standard input to temporary file (with decompression).
-#
-sub save_stdin {
- my ($fh_input, $tmp_input);
- $tmp_input = File::Spec->catfile($tmpdir, ',input');
- open $fh_input, ">$tmp_input" or
- die "save_stdin(): could not open $tmp_input";
- foreach (<STDIN>) {
- print $fh_input $_;
- }
- close $fh_input;
- open $fh_stdin, ">$tmp_stdin" or
- die "save_stdin(): could not open $tmp_stdin";
- foreach ( &cat_z("$tmp_input") ) {
- print $fh_stdin "$_";
- }
- close $fh_stdin;
- unlink $tmp_input unless $Debug{'KEEP'};
-} # save_stdin()
-
-
-########################################################################
-# main_do_fileargs()
-########################################################################
-
-sub main_do_fileargs {
- &special_setup();
- if ($Opt{'APROPOS'}) {
- if ($No_Filespecs) {
- &apropos_filespec();
- return 1;
- }
- } else {
- foreach (@Filespecs) {
- if (/^-$/) {
- &save_stdin();
- last;
- }
- } # foreach (@Filespecs)
- } # if ($Opt{'APROPOS'})
-
- my $section = '';
- my $ext = '';
- my $twoargs = 0;
- my $filespec;
- my $former_arg;
-
- FILESPEC: foreach (@Filespecs) {
- $filespec = $_;
- $Filespec_Arg = $_;
- $Filespec_Is_Man = 0;
- $Manspec = '';
- $Special_Filespec = 0;
-
- next FILESPEC unless $filespec;
-
-### main_do_fileargs()
- if ($twoargs) { # second run
- $twoargs = 0;
- # $section and $ext are kept from earlier run
- my $h = { 'name' => $filespec, 'sec' => $section, 'ext' => $ext };
- &man_setup();
- if ( &is_man($h) ) {
- $Filespec_Arg = "$former_arg $Filespec_Arg";
- &special_filespec();
- $Filespec_Is_Man = 1;
- &man_get($h);
- next FILESPEC;
- } else {
- warn "main_do_fileargs(): $former_arg is neither a file nor a " .
- "man page nor a section argument for $filespec;";
- }
- }
- $twoargs = 0;
-
- if ( $Opt{'APROPOS'} ) {
- &apropos_filespec();
- next FILESPEC;
- }
-
- if ($filespec eq '-') {
- &register_file('-');
- &special_filespec();
- next FILESPEC;
- } elsif ( &get_filename($filespec) ne $filespec ) { # path with dir
- &special_filespec();
- if (-f $filespec && -r $filespec) {
- &register_file($filespec)
- } else {
- warn "main_do_fileargs: the argument $filespec is not a file;";
- }
- next FILESPEC;
- } else { # neither `-' nor has dir
- # check whether filespec is an existing file
- unless ( $Man{'FORCE'} ) {
- if (-f $filespec && -r $filespec) {
- &special_filespec();
- &register_file($filespec);
- next FILESPEC;
- }
- }
- } # if ($filespec eq '-')
-
-### main_do_fileargs()
- # now it must be a man page pattern
-
- if ($Macro_Pkg and $Macro_Pkg ne '-man') {
- warn "main_do_fileargs(): $filespec is not a file, " .
- "man pages are ignored due to $Macro_Pkg;";
- next FILESPEC;
- }
-
- # check for man page
- &man_setup();
- unless ( $Man{'ENABLE'} ) {
- warn "main_do_fileargs(): the argument $filespec is not a file;";
- next FILESPEC;
- }
- my $errmsg;
- if ( $Man{'FORCE'} ) {
- $errmsg = 'is not a man page';
- } else {
- $errmsg = 'is neither a file nor a man page';
- }
-
- $Filespec_Is_Man = 1;
-
-### main_do_fileargs()
- # test filespec with `man:...' or `...(...)' on man page
-
- my @names = ($filespec);
- if ($filespec =~ /^man:(.*)$/) {
- push @names, $1;
- }
-
- foreach my $i (@names) {
- next unless $i;
- my $h = { 'name' => $i };
- if ( &is_man($h) ) {
- &special_filespec();
- &man_get($h);
- next FILESPEC;
- }
- if ( $i =~ /^(.*)\(([$Man{'AUTO_SEC_CHARS'}])(.*)\)$/ ) {
- $h = { 'name' => $1, 'sec' => $2, 'ext' => $3 };
- if ( &is_man($h) ) {
- &special_filespec();
- &man_get($h);
- next FILESPEC;
- }
- } # if //
- if ( $i =~ /^(.*)\.([$Man{'AUTO_SEC_CHARS'}])(.*)$/ ) {
- $h = { 'name' => $1, 'sec' => $2, 'ext' => $3 };
- if ( &is_man($h) ) {
- &special_filespec();
- &man_get($h);
- next FILESPEC;
- }
- } # if //
- } # foreach (@names)
-
-### main_do_fileargs()
- # check on "s name", where "s" is a section with or without an extension
- if ($filespec =~ /^([$Man{'AUTO_SEC_CHARS'}])(.*)$/) {
- unless ( $Man{'ENABLE'} ) {
- warn "main_do_fileargs(): $filespec $errmsg;";
- next FILESPEC;
- }
- $twoargs = 1;
- $section = $1;
- $ext = $2;
- $former_arg = $filespec;
- next FILESPEC;
- } else {
- warn "main_do_fileargs(): $filespec $errmsg;";
- next FILESPEC;
- }
- } # foreach (@Filespecs)
-
- if ($twoargs) {
- warn "main_do_fileargs(): no filespec arguments left for second run;";
- return 0;
- }
- 1;
-} # main_do_fileargs()
-
-
-########################################################################
-# main_set_resources()
-########################################################################
-
-##########
-# main_set_resources ()
-#
-# Determine options for setting X resources with $_DISPLAY_PROG.
-#
-# Globals: $Display{PROG}, $Output_File_Name
-#
-sub main_set_resources {
- # $prog viewer program
- # $rl resource list
- unlink $tmp_stdin unless $Debug{'KEEP'};
- $Output_File_Name = '';
-
- my @title = @REG_TITLE;
- @title = ($Opt{'TITLE'}) unless @title;
- @title = () unless @title;
-
- foreach my $n (@title) {
- next unless $n;
- $n =~ s/^,+// if $n =~ /^,/;
- next unless $n;
- $Output_File_Name = $Output_File_Name . ',' if $Output_File_Name;
- $Output_File_Name = "$Output_File_Name$n";
- } # foreach (@title)
-
- $Output_File_Name =~ s/^,+//;
- $Output_File_Name = '-' unless $Output_File_Name;
- $Output_File_Name = File::Spec->catfile($tmpdir, $Output_File_Name);
-
-### main_set_resources()
- unless ($Display{'PROG'}) { # for example, for groff mode
- $Display{'ARGS'} = '';
- return 1;
- }
-
- my %h = &where_is_prog($Display{'PROG'});
- my $prog = $h{'file'};
- if ($Display{'ARGS'}) {
- $Display{'ARGS'} = "$h{'args'} $Display{'ARGS'}";
- } else {
- $Display{'ARGS'} = $h{'args'};
- }
-
- my @rl = ();
-
- if ($Opt{'BD'}) {
- if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) {
- push @rl, '-bd', $Opt{'BD'};
- }
- }
-
- if ($Opt{'BG'}) {
- if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) {
- push @rl, '-bg', $Opt{'BG'};
- } elsif ($prog eq 'kghostview') {
- push @rl, '--bg', $Opt{'BG'};
- } elsif ($prog eq 'xpdf') {
- push @rl, '-papercolor', $Opt{'BG'};
- }
- }
-
-### main_set_resources()
- if ($Opt{'BW'}) {
- if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) {
- push @rl, '-bw', $Opt{'BW'};
- }
- }
-
- if ($Opt{'FG'}) {
- if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) {
- push @rl, '-fg', $Opt{'FG'};
- } elsif ($prog eq 'kghostview') {
- push @rl, '--fg', $Opt{'FG'};
- }
- }
-
- if ($Opt{'FN'}) {
- if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) {
- push @rl, '-fn', $Opt{'FN'};
- } elsif ($prog eq 'kghostview') {
- push @rl, '--fn', $Opt{'FN'};
- }
- }
-
- if ($Opt{'GEOMETRY'}) {
- if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) {
- push @rl, '-geometry', $Opt{'GEOMETRY'};
- } elsif ($prog eq 'kghostview') {
- push @rl, '--geometry', $Opt{'GEOMETRY'};
- }
- }
-
-### main_set_resources()
- if ($Opt{'RESOLUTION'}) {
- if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) {
- push @rl, '-resolution', $Opt{'RESOLUTION'};
- } elsif ($prog eq 'xpdf') {
- if ($Display{'PROG'} !~ / -z/) { # if xpdf does not have option -z
- if ($Default_Resolution == 75) {
- push @rl, '-z', 104;
- } elsif ($Default_Resolution == 100) { # 72dpi is '100'
- push @rl, '-z', 139;
- }
- }
- } # if $prog
- } else { # empty $Opt{RESOLUTION}
- $Opt{'RESOLUTION'} = $Default_Resolution;
- if ($prog =~ /^(gxditview|xditview)$/) {
- push @rl, '-resolution', $Default_Resolution;
- } elsif ($prog eq 'xpdf') {
- if ($Display{'PROG'} !~ / -z/) { # if xpdf does not have option -z
- if ($Default_Resolution == 75) {
- push @rl, '-z', 104;
- } elsif ($Default_Resolution == 100) { # 72dpi is '100'
- push @rl, '-z', 139;
- }
- }
- } # if $prog
- } # if $Opt{RESOLUTION}
-
- if ($Opt{'ICONIC'}) {
- if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) {
- push @rl, '-iconic';
- }
- }
-
-### main_set_resources()
- if ($Opt{'RV'}) {
- if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi)$/) {
- push @rl, '-rv';
- }
- }
-
- if (@{$Opt{'XRM'}}) {
- if ($prog =~ /^(ghostview|gv|gxditview|xditview|xdvi|xpdf)$/) {
- foreach (@{$Opt{'XRM'}}) {
- push @rl, '-xrm', $_;
- }
- }
- }
-
- if (@title) {
- if ($prog =~ /^(gxditview|xditview)$/) {
- push @rl, '-title', $Output_File_Name;
- }
- }
-
- my $args = join ' ', @rl;
- if ($Display{'ARGS'}) {
- $Display{'ARGS'} = "$args $Display{'ARGS'}";
- } else {
- $Display{'ARGS'} = $args;
- }
-
- 1;
-} # main_set_resources()
-
-
-########################################################################
-# set resources
-########################################################################
-
-my $groggy;
-my $modefile;
-my $addopts;
-
-##########
-# main_display ()
-#
-# Do the actual display of the whole thing.
-#
-# Globals:
-# in: $Display{MODE}, $Opt{DEVICE}, @Addopts_Groff,
-# $fh_cat, $tmp_cat, $Opt{PAGER}, $Output_File_Name
-#
-sub main_display {
- $addopts = join ' ', @Addopts_Groff;
-
- if (-z $tmp_cat) {
- warn "groffer: empty input\n";
- &clean_up();
- return 1;
- }
-
- $modefile = $Output_File_Name;
-
- # go to the temporary directory to be able to access internal data files
- chdir $tmpdir;
-
-### main_display()
- SWITCH: foreach ($Display{'MODE'}) {
- /^groff$/ and do {
- push @Addopts_Groff, "-T$Opt{'DEVICE'}" if $Opt{'DEVICE'};
- $addopts = join ' ', @Addopts_Groff;
- $groggy = `cat $tmp_cat | grog`;
- die "main_display(): grog error;" if $?;
- chomp $groggy;
- print STDERR "grog output: $groggy\n" if $Debug{'GROG'};
- &_do_opt_V();
- unlink $modefile;
- rename $tmp_cat, $modefile;
- system("cat $modefile | $groggy $addopts");
- &clean_up();
- next SWITCH;
- }; # /groff/
-
- /^(text|tty)$/ and do {
- my $device;
- if (! $Opt{'DEVICE'}) {
- $device = $Opt{'TEXT_DEVICE'};
- $device = $Default_tty_Device unless $device;
- } elsif ($Opt{'DEVICE'} =~ /^(ascii||cp1047|latin1|utf8)$/) {
- $device = $Opt{'DEVICE'};
- } else {
- warn "main_display(): wrong device for $Display{'MODE'} mode: " .
- "$Opt{'DEVICE'}";
- }
- $groggy = `cat $tmp_cat | grog -T$device`;
- die "main_display(): grog error;" if $?;
- chomp $groggy;
- print STDERR "grog output: $groggy\n" if $Debug{'GROG'};
- if ($Display{'MODE'} eq 'text') {
- &_do_opt_V();
- system("cat $tmp_cat | $groggy $addopts");
- &clean_up();
- next SWITCH;
- }
-
-### main_display()
- # mode is not 'text', but `tty'
- my %pager;
- my @p;
- push @p, $Opt{'PAGER'} if $Opt{'PAGER'};
- push @p, $ENV{'PAGER'} if $ENV{'PAGER'};
- foreach (@p) {
- %pager = &where_is_prog($_);
- next unless %pager;
- if ($pager{'file'} eq 'less') {
- if ($pager{'args'}) {
- $pager{'args'} = "-r -R $pager{'args'}";
- } else {
- $pager{'args'} = '-r -R';
- }
- }
- last if $pager{'file'};
- } # foreach @p
- unless (%pager) {
- foreach (@{$Viewer_tty{'TTY'}}, @{$Viewer_X{'TTY'}}, 'cat') {
- next unless $_;
- %pager = &where_is_prog($_);
- last if %pager;
- }
- }
- die "main_display(): no pager program found for tty mode;"
- unless %pager;
- &_do_opt_V();
- system("cat $tmp_cat | $groggy $addopts | " .
- "$pager{'fullname'} $pager{'args'}");
- &clean_up();
- next SWITCH;
- }; # /text|tty/
-
- /^source$/ and do {
- open $fh_cat, "<$tmp_cat";
- foreach (<$fh_cat>) {
- print "$_";
- }
- &clean_up();
- next SWITCH;
- };
-
-### main_display()
- /^dvi$/ and do {
- if ($Opt{'DEVICE'} && $Opt{'DEVICE'} ne 'dvi') {
- warn "main_display(): " .
- "wrong device for $Display{'MODE'} mode: $Opt{'DEVICE'};"
- }
- $modefile .= '.dvi';
- $groggy = `cat $tmp_cat | grog -Tdvi`;
- die "main_display(): grog error;" if $?;
- chomp $groggy;
- print STDERR "grog output: $groggy\n" if $Debug{'GROG'};
- &_do_display();
- next SWITCH;
- };
-
- /^html$/ and do {
- if ($Opt{'DEVICE'} && $Opt{'DEVICE'} ne 'html') {
- warn "main_display(): " .
- "wrong device for $Display{'MODE'} mode: $Opt{'DEVICE'};"
- }
- $modefile .= '.html';
- $groggy = `cat $tmp_cat | grog -Thtml`;
- die "main_display(): grog error;" if $?;
- chomp $groggy;
- print STDERR "grog output: $groggy\n" if $Debug{'GROG'};
- &_do_display();
- next SWITCH;
- };
-
- /^pdf$/ and do {
- if ($Opt{'DEVICE'} && $Opt{'DEVICE'} ne 'ps') {
- warn "main_display(): " .
- "wrong device for $Display{'MODE'} mode: $Opt{'DEVICE'};"
- }
- $modefile .= '.ps';
- $groggy = `cat $tmp_cat | grog -Tps`;
- die "main_display(): grog error;" if $?;
- chomp $groggy;
- print STDERR "grog output: $groggy\n" if $Debug{'GROG'};
- &_do_display(\&_make_pdf);
- next SWITCH;
- };
-
-### main_display()
- /^ps$/ and do {
- if ($Opt{'DEVICE'} && $Opt{'DEVICE'} ne 'ps') {
- warn "main_display(): " .
- "wrong device for $Display{'MODE'} mode: $Opt{'DEVICE'};"
- }
- $modefile .= '.ps';
- $groggy = `cat $tmp_cat | grog -Tps`;
- die "main_display(): grog error;" if $?;
- chomp $groggy;
- print STDERR "grog output: $groggy\n" if $Debug{'GROG'};
- &_do_display();
- next SWITCH;
- };
-
- /^x$/ and do {
- my $device;
- if ($Opt{'DEVICE'} && $Opt{'DEVICE'} =~ /^X/) {
- $device = $Opt{'DEVICE'};
- } else {
- if ($Opt{'RESOLUTION'} == 100) {
- if ( $Display{'PROG'} =~ /^(g|)xditview$/ ) {
- # add width of 800dpi for resolution of 100dpi to the args
- $Display{'ARGS'} .= ' -geometry 800';
- $Display{'ARGS'} =~ s/^ //;
- }
- } else { # RESOLUTIOM != 100
- $device = 'X75-12';
- } # if RESOLUTIOM
- } # if DEVICE
- $groggy = `cat $tmp_cat | grog -T$device -Z`;
- die "main_display(): grog error;" if $?;
- chomp $groggy;
- print STDERR "grog output: $groggy\n" if $Debug{'GROG'};
- &_do_display();
- next SWITCH;
- };
-
-### main_display()
- /^X$/ and do {
- if (! $Opt{'DEVICE'}) {
- $groggy = `cat $tmp_cat | grog -X`;
- die "main_display(): grog error;" if $?;
- chomp $groggy;
- print STDERR "grog output: $groggy\n" if $Debug{'GROG'};
- } elsif ($Opt{'DEVICE'} =~ /^(X.*|dvi|html|lbp|lj4|ps)$/) {
- # these devices work with
- $groggy = `cat $tmp_cat | grog -T$Opt{'DEVICE'} -X`;
- die "main_display(): grog error;" if $?;
- chomp $groggy;
- print STDERR "grog output: $groggy\n" if $Debug{'GROG'};
- } else {
- warn "main_display(): wrong device for " .
- "$Display{'MODE'} mode: $Opt{'DEVICE'};";
- $groggy = `cat $tmp_cat | grog -Z`;
- die "main_display(): grog error;" if $?;
- chomp $groggy;
- print STDERR "grog output: $groggy\n" if $Debug{'GROG'};
- } # if DEVICE
- &_do_display();
- next SWITCH;
- };
-
- /^.*$/ and do {
- die "main_display(): unknown mode `$Display{'MODE'}';";
- };
-
- } # SWITCH
- 1;
-} # main_display()
-
-
-########################
-# _do_display ([<prog>])
-#
-# Perform the generation of the output and view the result. If an
-# argument is given interpret it as a function name that is called in
-# the midst (actually only for `pdf').
-#
-sub _do_display {
- &_do_opt_V();
- unless ($Display{'PROG'}) {
- system("$groggy $addopts $tmp_cat");
- &clean_up();
- return 1;
- }
- unlink $modefile;
- die "_do_display(): empty output;" if -z $tmp_cat;
- system("cat $tmp_cat | $groggy $addopts >$modefile");
- die "_do_display(): empty output;" if -z $modefile;
- &print_times("before display");
- if ($_[0] && ref($_[0]) eq 'CODE') {
- $_[0]->();
- }
- unlink $tmp_cat unless $Debug{'KEEP'};
-
- if ( $Opt{'STDOUT'} ) {
- my $fh;
- open $fh, "<$modefile";
- foreach (<$fh>) {
- print;
- }
- close $fh;
- return 1;
- }
-
- if ($Viewer_Background) {
- if ($Debug{'KEEP'}) {
- exec "$Display{'PROG'} $Display{'ARGS'} $modefile &";
- } else {
- exec "{ $Display{'PROG'} $Display{'ARGS'} $modefile; " .
- "rm -rf $tmpdir; } &";
- }
- } else {
- system("$Display{'PROG'} $Display{'ARGS'} $modefile");
- &clean_up();
- }
-} # _do_display() of main_display()
-
-
-#############
-# _do_opt_V ()
-#
-# Check on option `-V'; if set print the corresponding output and leave.
-#
-# Globals: @ARGV, $Display{MODE}, $Display{PROG},
-# $Display{ARGS}, $groggy, $modefile, $addopts
-#
-sub _do_opt_V {
- if ($Opt{'V'}) {
- $Opt{'V'} = 0;
- print "Parameters: @ARGV\n";
- print "Display Mode: $Display{'MODE'}\n";
- print "Output file: $modefile\n";
- print "Display prog: $Display{'PROG'} $Display{'ARGS'}\n";
- print "Output of grog: $groggy $addopts\n";
- my $res = `$groggy $addopts\n`;
- chomp $res;
- print "groff -V: $res\n";
- exit 0;
- }
- 1;
-} # _do_opt_V() of main_display()
-
-##############
-# _make_pdf ()
-#
-# Transform to pdf format; for pdf mode in _do_display().
-#
-# Globals: $md_modefile (from main_display())
-#
-sub _make_pdf {
- die "_make_pdf(): pdf mode did not work;" if $PDF_Did_Not_Work;
- my $psfile = $modefile;
- die "_make_pdf(): empty output;" if -z $modefile;
- $modefile =~ s/\.ps$/.pdf/;
- unlink $modefile;
- my $done;
- if ($PDF_Has_ps2pdf) {
- system("ps2pdf $psfile $modefile 2>$Dev_Null");
- $done = ! $?;
- }
- if (! $done && $PDF_Has_gs) {
- system("gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite " .
- "-sOutputFile=$modefile -c save pop -f $psfile 2>$Dev_Null");
- $done = ! $?;
- }
- if (! $done) {
- $PDF_Did_Not_Work = 1;
- warn '_make_pdf(): Could not transform into pdf format, ' .
- 'the Postscript mode (ps) is used instead;';
- $Opt{'MODE'} = 'ps';
- &main_set_mode();
- &main_set_resources();
- &main_display();
- exit 0;
- }
- unlink $psfile unless $Debug{'KEEP'};
- 1;
-} # _make_pdf() of main_display()
-
-
-########################################################################
-
-&main_set_options();
-&main_parse_MANOPT();
-&main_config_params();
-&main_parse_params();
-&main_set_mode();
-&main_temp();
-&main_do_fileargs();
-&main_set_resources();
-&main_display();
-
-&clean_up();
-
-1;
-########################################################################
-### Emacs settings
-# Local Variables:
-# mode: CPerl
-# End:
diff --git a/contrib/groffer/perl/man.pl b/contrib/groffer/perl/man.pl
deleted file mode 100644
index 91c65cd2..00000000
--- a/contrib/groffer/perl/man.pl
+++ /dev/null
@@ -1,731 +0,0 @@
-#! /usr/bin/env perl
-
-# groffer - display groff files
-
-# Source file position: <groff-source>/contrib/groffer/perl/man.pl
-# Installed position: <prefix>/lib/groff/groffer/man.pl
-
-# Copyright (C) 2006, 2009, 2011 Free Software Foundation, Inc.
-# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
-# Last update: 27 Jan 2011
-
-# This file is part of `groffer', which 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 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/>.
-
-########################################################################
-
-use strict;
-use warnings;
-
-########################################################################
-# functions for apropos, man, whatis
-########################################################################
-
-##########
-# apropos_filespec()
-#
-# Compose temporary file for filspec.
-#
-# Globals: in: $main::Opt{'APROPOS'}, $main::Special_Setup, $main::Filespec_Arg,
-# $main::Apropos_Prog, $main::Opt{'APROPOS_SECTIONS'}, $main::Opt{'SECTIONS'}
-# out: $main::Special_Filespec
-#
-sub apropos_filespec {
- return 0 unless $main::Opt{'APROPOS'};
- die 'apropos_filespec(): apropos_setup() must be run first;'
- unless $main::Special_Setup;
- die 'apropos_filespec(): no $main::Filespec_Arg is set;'
- unless defined $main::Filespec_Arg;
- $main::Special_Filespec = 1;
-
- my $s;
- if ($main::No_Filespecs) {
- &to_tmp_line('.SH no filespec');
- $s = `$main::Apropos_Prog`;
- $s =~ s/^/\\\&/;
- &to_tmp_line($s);
- return 1;
- }
-
- $s = $main::Filespec_Arg;
- $s =~ s/[^\\]-/\\-/g;
- &to_tmp_line(".SH $s");
-
- if ( $main::Opt{'APROPOS_SECTIONS'} ) {
- $s = qr/^[^\(]*\([$main::Opt{'APROPOS_SECTIONS'}]/;
- } else {
- if ( $main::Opt{'SECTIONS'} ) {
- $s = $main::Opt{'SECTIONS'};
- $s = qr/^[^\(]*\([$s]/;
- } else {
- $s = qr/^.*\(.+\).*$/;
- }
- }
-
-### apropos_filespec()
- my $filespec = $main::Filespec_Arg;
- $filespec =~ s#/#\\/#g;
- $filespec =~ s#\.#\\./#g;
- my @ap;
- foreach ( `$main::Apropos_Prog $main::Filespec_Arg 2>$main::Dev_Null` ) {
- chomp;
- if (/^$filespec:\s/) { # for error messages of this script
- my $line = $_;
- $line =~ s/^(.*)$/\\\&$1/s;
- push @ap, $line;
- }
- if (/$s/) {
- push @ap, $_;
- }
- }
- my @res;
- foreach (sort @ap) {
- s/^
- ([^\(]+\(+[$main::Man{'AUTO_SEC_CHARS'}][^\)]*\)+)
- (\s*-*)*\s*
- (.*)
- $/.br\n.TP 15\n.BR "$1"\n\\\&$3\n/sx;
- push @res, $_;
- }
- &to_tmp_line(@res);
- 1;
-} # apropos_filespec()
-
-
-##########
-# apropos_setup()
-#
-# Setup for the --apropos* options, just 2 global variables are set.
-#
-# Globals: in: $main::Opt{'APROPOS'}
-# out: $main::Special_Setup, $main::Apropos_Prog
-#
-sub apropos_setup {
- return 0 unless $main::Opt{'APROPOS'};
- if ( &where_is_prog('apropos') ) {
- $main::Apropos_Prog = 'apropos';
- } elsif ( &where_is_prog('man') ) {
- if (! system("man --apropos man >$main::Dev_Null 2>$main::Dev_Null")) {
- $main::Apropos_Prog = 'man --apropos';
- } elsif (! system("man -k man >$main::Dev_Null 2>$main::Dev_Null")) {
- $main::Apropos_Prog = 'man --k';
- }
- } # test man
- die 'apropos_setup(): no apropos program available;'
- unless $main::Apropos_Prog;
- &to_tmp_line('.TH GROFFER APROPOS');
- $main::Special_Setup = 1;
- $main::Opt{'TITLE'} = 'apropos' unless $main::Opt{'TITLE'};
- 1;
-} # apropos_setup()
-
-
-##########
-# is_man(<man_sec_ext-hash-ref>)
-#
-# Test whether the argument hash exists as man page (from is_man()).
-#
-# Globals: in: $main::Man{AUTO_SEC_CHARS},$main::Man{SEC_CHARS},
-# $main::Man{EXT}, $tmpdir
-# out: $main::Manspec
-#
-# Arguments: 1, a hash reference with keys 'name', 'sec', 'ext', where
-# 'sec' is a string of one or several section characters
-#
-sub is_man {
- my $n = @_;
- die "is_man(): one argument is needed, you used $n;"
- unless $n == 1;
- die "is_man(): the argument is not a hash reference `$_[0]';"
- if ref($_[0]) ne 'HASH';
- die 'is_man(): temporary directory is not set;' unless $main::tmpdir;
- die 'is_man(): man_setup() must be run first;' unless $main::Man{'IS_SETUP'};
-
- my $name = $_[0]->{'name'};
- unless ($name) {
- $main::Manspec = '';
- return 0;
- }
-
- my $sec;
- $sec = $_[0]->{'sec'};
- $sec = $main::Man{'SEC_CHARS'} unless $sec;
- $sec = $main::Man{'AUTO_SEC_CHARS'} unless $sec;
- $sec = '' unless defined $sec;
- # take care, $sec may be several sections
-
-### is_man()
- my $ext;
- $ext = $_[0]->{'ext'};
- $ext = $main::Man{'EXT'} unless $ext;
- $ext = '' unless defined $ext;
-
- $main::Manspec = "$name.$sec,$ext";
- my @m;
- if (exists $main::Man{'MANSPEC'}{$main::Manspec}) {
- return 1;
- } else {
- foreach my $p ( @{$main::Man{'PATH'}} ) {
- foreach my $s (split //, $sec) {
- my $dir = File::Spec->catdir($p, "man$s");
- next unless -d $dir;
- my $file = File::Spec->catfile($dir, "$name.$s$ext");
- push @m, glob("$file*");
- }
- }
- $main::Man{'MANSPEC'}{$main::Manspec} = \@m;
- }
- return 0 unless (@m);
- return 1;
-} # is_man()
-
-
-##########
-# man_get (<man_sec_ext-hash-ref>)
-#
-# Write a man page to the temporary file.
-#
-# Globals in: $main::Manspec, $main::Man{MANSPEC}, $main::Man{SEC_CHARS},
-# $main::Man{EXT}, $main::Man{ALL}
-#
-# Arguments: 1, a hash reference with keys 'name', 'sec', 'ext', where
-# 'sec' is a string of one or several section characters
-#
-sub man_get {
- my $n = @_;
- die "man_get(): one argument is needed, you used $n;"
- unless $n == 1;
- die "man_get(): the argument is not a hash reference `$_[0]';"
- if ref($_[0]) ne 'HASH';
- die "man_get(): is_man() must be run first on the argument;"
- unless $main::Manspec;
- die "man_get(): wrong hash reference `$_[0]', no 'name' key;"
- unless exists $_[0]->{'name'};
-
- my ($name, $sec, $ext, $f, $path);
- $name = $_[0]->{'name'};
- die "man_get(): empty 'name' key in the argument;" unless $name;
-
- $sec = $_[0]->{'sec'};
- $sec = $main::Man{'SEC_CHARS'} if (! $sec) and $main::Man{'SEC_CHARS'};
- $sec = '' unless defined $sec;
- # take care $sec may be several sections
-
-### man_get()
- $ext = $_[0]->{'ext'};
- $ext = $main::Man{'EXT'} unless $ext;
- $ext = '' unless defined $ext;
-
- die 'man_get(): $main::Manspec does not suit the arguments;'
- if ($main::Manspec ne "$name.$sec,$ext") and
- (! exists $main::Man{'MANSPEC'}{$main::Manspec});
-
- if ($main::Man{'ALL'}) {
- my $ok;
- my %list;
- foreach ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) {
- next if exists $list{$_};
- if (-f $_ and -r $_) {
- $list{$_} = 1;
- &to_tmp($_);
- $ok = 1;
- }
- }
- &register_title("man:$name") if $ok;
- return 1;
- }
-
- # not $main::Man{'ALL'}
-
- if ($_[0]->{'sec'}) {
- my $path = File::Spec->catfile('', "man$sec", $name);
- if ($ext) {
- foreach $f ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) {
- if ($f =~ m#$path\.$sec$ext($|\..*$)#) {
- if (-f $f && -r $f) {
- &register_file($f);
- return 1;
- }
- } # if $f =~
- } # foreach $f
-### man_get()
- foreach $f ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) {
- if ($f =~ m#$path\.$sec$ext.*$#) {
- if (-f $f && -r $f) {
- &register_file($f);
- return 1;
- }
- } # if $f =~
- } # foreach $f
- } else { # $ext is empty
- foreach $f ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) {
- if ($f =~ m#$path\.$sec($|\..*$)#) {
- if (-f $f && -r $f) {
- # &to_tmp($f) && &register_file($f);
- &register_file($f);
- return 1;
- }
- } # if $f =~
- } # foreach $f
- foreach $f ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) {
- if ($f =~ m#$path\.$sec.*$#) {
- if (-f $f && -r $f) {
- # &to_tmp($f) && &register_file($f);
- &register_file($f);
- return 1;
- }
- } # if $f =~
- } # foreach $f
- } # if $ext
-### man_get()
- } else { # sec is empty
- my $m = $main::Man{'SEC_CHARS'};
- $m = $main::Man{'AUTO_SEC_CHARS'} unless $m;
- foreach my $s (split //, $m) {
- my $path = File::Spec->catfile('', "man$s", $name);
- unless ($ext) {
- foreach my $f ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) {
- if ( $f =~ m#$path\.$s($|\..*$)# ) {
- if (-f $f && -r $f) {
- # &to_tmp($f) && &register_file($f);
- &register_file($f);
- return 1;
- }
- } # if $f =~
- } # foreach $f
- } # unless $ext
- foreach $f ( @{$main::Man{'MANSPEC'}{$main::Manspec}} ) {
- if ($f =~ m#$path\.$s$ext.*$#) {
- if (-f $f && -r $f) {
- # &to_tmp($f) && &register_file($f);
- &register_file($f);
- return 1;
- }
- } # if $f =~
- } # foreach $f
- } # foreach $s
- } # if sec
-
- 1;
-} # man_get()
-
-
-##########
-# man_setup ()
-#
-# Setup the variables in %MAN needed for man page searching.
-#
-# Globals:
-# in: %OPT, $LANG, $LC_MESSAGES, $LC_ALL,
-# $MANPATH, $MANSEC, $PAGER, $SYSTEM, $MANOPT.
-# out: $main::Man{PATH}, $main::Man{LANG}, $main::Man{LANG2}, $main::Man{SYS},
-# $main::Man{SEC}, $main::Man{ALL}
-# in/out: $main::Man{ENABLE}
-#
-# The precedence for the variables related to `man' is that of GNU
-# `man', i.e.
-#
-# $LANG; overridden by
-# $LC_MESSAGES; overridden by
-# $LC_ALL; this has the same precedence as
-# $MANPATH, $MANSEC, $PAGER, $SYSTEM; overridden by
-# $MANOPT; overridden by
-# the groffer command line options.
-#
-# $MANROFFSEQ is ignored because grog determines the preprocessors.
-#
-sub man_setup {
- return 1 if $main::Man{'IS_SETUP'};
- $main::Man{'IS_SETUP'} = 1;
- return 1 unless $main::Man{'ENABLE'};
-
- # determine basic path for man pages
- my $path;
- if (defined $main::Opt{'MANPATH'}) {
- $path = $main::Opt{'MANPATH'};
- } elsif ($ENV{'MANPATH'}) {
- $path = $ENV{'MANPATH'};
- } elsif ( &where_is_prog('manpath') ) {
- $path = `manpath 2>$main::Dev_Null`;
- }
- if ($path) {
- chomp $path;
- $main::Man{'PATH'} = [split /:/, $path];
- } else {
- $main::Man{'PATH'} = [];
- &manpath_set_from_path();
- }
- unless ( @{$main::Man{'PATH'}} ) {
- $main::Man{'ENABLE'} = 0;
- warn "man_setup(): man path is empty;";
- return 1;
- }
-
-### man_setup()
- # make man path list consisting of unique existing directories
- @{$main::Man{'PATH'}} = &path_uniq( @{$main::Man{'PATH'}} );
-
- unless ($main::Man{'ALL'}) {
- $main::Man{'ALL'} = $main::Opt{'ALL'} ? 1 : 0;
- }
-
- # handle man systems
- my $sys = $ENV{'SYSTEM'};
- $sys = $main::Opt{'SYSTEMS'} if $main::Opt{'SYSTEMS'};
- if ($sys) {
- chomp $sys;
- $main::Man{'SYS'} = [split /,/, $sys];
- } else {
- $main::Man{'SYS'} = [];
- $sys = '';
- }
-
-### man_setup()
- # handle language
- my $lang = '';
- $lang = $main::Opt{'LANG'} if $main::Opt{'LANG'};
- unless ($lang) {
- foreach ('LC_ALL', 'LC_MESSAGES', 'LANG') {
- if ($ENV{$_}) {
- $lang = $ENV{$_};
- last;
- }
- }
- }
- if ($lang) {
- if ($lang eq 'C' or $lang eq 'POSIX') {
- $main::Man{'LANG'} = '';
- $main::Man{'LANG2'} = '';
- } elsif ($lang =~ /^.$/) {
- $main::Man{'LANG'} = $lang;
- $main::Man{'LANG2'} = '';
- } elsif ($lang =~ /^..$/) {
- $main::Man{'LANG'} = $lang;
- $main::Man{'LANG2'} = $lang;
- } else {
- $main::Man{'LANG'} = $lang;
- $main::Man{'LANG2'} = $lang;
- $main::Man{'LANG2'} =~ s/^(..).*$/$1/;
- }
- } # if ($lang)
- # from now on, use only $main::Man{LANG*}, forget about $main::Opt{LANG}, $ENV{LC_*}.
-
- &manpath_add_lang_sys();
-
-### man_setup()
- # section
- my $sec;
- $sec = $main::Opt{'SECTIONS'} if $main::Opt{'SECTIONS'};
- unless ($sec) {
- $sec = $ENV{'MANSEC'} if $ENV{'MANSEC'};
- }
- $main::Man{'SEC'} = [];
- $main::Man{'SEC_CHARS'} = '';
- if ($sec) {
- foreach (split /:/, $sec) {
- push @{$main::Man{'SEC'}}, $_ if /^[$main::Man{'AUTO_SEC_CHARS'}]$/;
- }
- $main::Man{'SEC_CHARS'} = join '', @{$main::Man{'SEC'}} if @{$main::Man{'SEC'}};
- } # if ($sec)
-
- # extension
- my $ext = '';
- $ext = $main::Opt{'EXTENSION'} if $main::Opt{'EXTENSION'};
- unless ($ext) {
- $ext = $ENV{'EXTENSION'} if $ENV{'EXTENSION'};
- }
- $main::Man{'EXT'} = $ext;
-
- # creation of man temporary is omitted, because of globs in perl
- 1;
-} # man_setup()
-
-
-##########
-# manpath_add_lang_sys()
-#
-# Add language and operating system specific directories to man path.
-#
-# Globals:
-# in: $main::Man{SYS}: a list of names of operating systems.
-# $main::Man{LANG} and $main::Man{LANG2}: each a single name
-# in/out: @{$main::Man{PATH}}: list of directories which shall have the `man?'
-# subdirectories.
-#
-sub manpath_add_lang_sys {
- return 1 unless $main::Man{'PATH'};
- return 1 unless @{$main::Man{'PATH'}};
-
- my @mp;
-
- if ( @{$main::Man{'SYS'}} ) {
- foreach ( @{$main::Man{'SYS'}} ) {
- if ($_ eq 'man') {
- @mp = (@mp, @{$main::Man{'PATH'}});
- } elsif ($_) {
- my $sys = $_;
- foreach my $p (@{$main::Man{'PATH'}}) {
- my $dir = File::Spec->catdir($p, $sys);
- push @mp, $dir;
- }
- } # if eq 'man'
- } # foreach SYS
- } else { # no SYS
- @mp = @{$main::Man{'PATH'}};
- }
-
- if (@mp && $main::Man{'LANG'}) {
- my @lang_path;
- my $man_lang2 = '';
- $man_lang2 = $main::Man{'LANG2'} if $main::Man{'LANG'} ne $main::Man{'LANG2'};
- foreach my $i ($main::Man{'LANG'}, $man_lang2) {
- next unless $i;
- my $lang = $i;
- foreach my $p (@mp) {
- my $dir = File::Spec->catdir($p, $lang);
- push @lang_path, $dir;
- } # foreach $p
- } # foreach $i
- @mp = (@lang_path, @mp);
- } # if $mp
-
- $main::Man{PATH} = [&path_uniq(@mp)];
- 1;
-} # manpath_add_lang_sys()
-
-
-##########
-# manpath_set_from_path()
-#
-# Determine basic search path for man pages from $PATH.
-#
-# Return: `1' if a valid man path was retrieved.
-# Output: none
-# Globals:
-# in: $PATH
-# out: $_MAN_PATH
-#
-sub manpath_set_from_path {
- my @path =
- qw( /usr/local /usr /usr/X11R6 /usr/openwin /opt /opt/gnome /opt/kde );
- # get a basic man path from $ENV{PATH}
- my @path2 = @main::Path;
- foreach (@path2) {
- s#bin/*$##;
- push @path, $_;
- }
- @path = &path_uniq(@path);
- foreach my $d (@path) {
- foreach my $e ( File::Spec->catdir( qw(share man) ),
- File::Spec->catdir( qw(share MAN) ),
- 'man', 'MAN' ) {
- my $dir = File::Spec->catdir($d, $e);
- push @{$main::Man{'PATH'}}, $dir if -d $dir;
- }
- }
- 1;
-} # manpath_set_from_path()
-
-
-##########
-# special_filespec()
-#
-# Handle special modes like whatis and apropos. Run their filespec
-# functions if suitable.
-#
-# Globals: in: $main::Opt{'APROPOS'}, $main::Opt{'WHATIS'}, $main::Special_Setup
-# out: $main::Special_Filespec (internal)
-#
-sub special_filespec {
- return 0 unless $main::Opt{'APROPOS'} || $main::Opt{'WHATIS'};
- die 'special_filespec(): setup for apropos or whatis must be run first;'
- unless $main::Special_Setup;
- if ( $main::Opt{'APROPOS'} ) {
- die "special_setup(): both apropos and whatis option variables are set;"
- if $main::Opt{'WHATIS'};
- return &apropos_filespec() ? 1 : 0;
- }
- if ( $main::Opt{'WHATIS'} ) {
- return &whatis_filespec() ? 1 : 0;
- }
- 0;
-} # special_filespec
-
-
-##########
-# special_setup()
-#
-# Handle special modes like whatis and apropos. Run their setup
-# functions if suitable.
-#
-sub special_setup {
- if ( $main::Opt{'APROPOS'} ) {
- die "special_setup(): both --apropos and --whatis option variables " .
- "are set;" if $main::Opt{'WHATIS'};
- return &apropos_setup() ? 1 : 0;
- }
- if ( $main::Opt{'WHATIS'} ) {
- return &whatis_setup() ? 1 : 0;
- }
- 0;
-} # special_setup()
-
-
-##########
-# whatis_filename(<filename>)
-#
-# Interpret <filename> as a man page and display its `whatis'
-# information as a fragment written in the groff language.
-#
-# Globals: in: $main::Opt{'WHATIS'}, $main::Special_Setup, $main::Special_Filespec,
-# $main::Filespec_Arg
-#
-sub whatis_filename {
- my $n = @_;
- die "whatis_filename(): one argument is needed; you used $n;"
- unless $n == 1;
- die "whatis_filename(): whatis is not setup;" unless $main::Opt{'WHATIS'};
- die "whatis_filename(): setup for whatis must be run first;"
- unless $main::Special_Setup;
- die "whatis_filename(): whatis_filespec() must be run first;"
- unless $main::Special_Filespec;
- die 'whatis_filename(): no $main::Filespec_Arg is set;'
- unless defined $main::Filespec_Arg;
-
- my $arg = $_[0];
- die "whatis_file_name(): $arg is not an existing file" unless -f $arg;
- die "whatis_file_name(): could not read file $arg" unless -r $arg;
- return 1 if -z $arg;
- $arg = 'stdin' if $main::Filespec_Arg eq '-';
-
- &to_tmp_line('.br', '\\f[CR]' . $arg . '\\f[]:', '.br');
-
-### whatis_filename()
- # get the parts of the file name according to the naming of man pages
- my ($dir, $name) = &split_path( $_[0] );
- my $section = $_[0];
- my $path = File::Spec->catfile('', 'man');
- $section =~ s#^.*$path([$main::Man{'AUTO_SEC_CHARS'}]).*$#$1#;
- $section = '' if $section eq $_[0];
- if ($section) {
- if ($name =~ m#^.*\.$section.*$#) {
- $name =~ s/^(.*)\.$section.*$/$1/;
- } else {
- $section = '';
- }
- }
-
- # traditional man style; grep the line containing `.TH' macro, if any
- my @catz = &cat_z($_[0]);
- my $res;
- my $test;
- foreach (@catz) {
- if (/^[\.']\s*TH\s/) { # search .TH, traditional man style
- $test = 1;
- last;
- }
- } # foreach (@catz)
-### whatis_filename()
- if ($test) { # traditional man style
- # get the first line after the first `.SH' macro before the next `.SH'
- my $test1;
- foreach (@catz) {
- if ($test1) {
- chomp;
- next unless $_;
- next if /^[\.']?\s*$/;
- last if /^[\.']/; # especially for .SH
- if ($res) {
- $res = "$res $_";
- } else {
- $res = $_;
- }
- } else { # $test1 is empty
- $test1 = 1 if (/^[\.']\s*SH\s/);
- } # if ($test1)
- } # foreach (@catz)
-
- if ($section) {
- if ($res =~ m|^
- $name
- \s
- [^-]*
- -
- \s*
- (.*)
- $|sx) {
- $res = "$name ($section) \\[em] $1";
- }
- } # if ($section)
-### whatis_filename()
- &to_tmp_line($res, '.br', '', '.br');
- return 1;
- } # if ($test)
-
- # mdoc style (BSD doc); grep the line containing `.Nd' macro, if any
- foreach (@catz) {
- if (/^[\.']\s*Nd\s/) { # BSD doc style
- $res =~ s/^(.*)$/$name ($section) \\[em] $1/;
- &to_tmp_line($res);
- return 1;
- }
- }
-
- &to_tmp_line('is not a man page', '.br', '', '.br');
- 1;
-} # whatis_filename()
-
-
-##########
-# whatis_filespec()
-#
-# Print the filespec name as .SH to the temporary cat file.
-#
-# Globals: in: $main::Opt{'WHATIS'}, $main::Filespec_Arg
-# in/out: $main::Special_Filespec
-#
-sub whatis_filespec {
- return 0 unless ($main::Opt{'WHATIS'});
- die 'whatis_filespec(): whatis_setup() must be run first.'
- unless $main::Special_Setup;
- die 'whatis_filespec(): no $main::Filespec_Arg is set;'
- unless defined $main::Filespec_Arg;
- $main::Special_Filespec = 1;
- my $arg = $main::Filespec_Arg;
- $arg =~ s/[^\\]-/\\-/g;
- to_tmp_line(".SH $arg");
-} # whatis_filespec()
-
-
-##########
-# whatis_setup ()
-#
-# Print the whatis header to the temporary cat file; this is the setup
-# for whatis.
-#
-# Globals: in: $main::Opt{'WHATIS'}
-# out: $main::Special_Setup
-sub whatis_setup {
- if ( $main::Opt{'WHATIS'} ) {
- &to_tmp_line('.TH GROFFER WHATIS');
- $main::Special_Setup = 1;
- $main::Opt{'TITLE'} = 'whatis' unless $main::Opt{'TITLE'};
- return 1;
- }
- 0;
-} # whatis_setup ()
-
-1;
diff --git a/contrib/groffer/perl/perl_test.pl b/contrib/groffer/perl/perl_test.pl
deleted file mode 100644
index e92fc3c8..00000000
--- a/contrib/groffer/perl/perl_test.pl
+++ /dev/null
@@ -1,34 +0,0 @@
-#! /usr/bin/env perl
-
-# groffer - display groff files
-
-# Source file position: <groff-source>/contrib/groffer/perl/perl_test.sh
-# Installed position: <prefix>/lib/groff/groffer/perl_test.sh
-
-# Copyright (C) 2006, 2009 Free Software Foundation, Inc.
-# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
-# Last update: 5 Jan 2009
-
-# This file is part of `groffer', which 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 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/>.
-
-########################################################################
-
-# This file tests whether perl has a suitable version. It is used by
-# groffer.pl and Makefile.sub.
-
-# require 5.004_05;
-require v5.6.1;
diff --git a/contrib/groffer/perl/roff2.pl b/contrib/groffer/perl/roff2.pl
deleted file mode 100755
index c3e6047f..00000000
--- a/contrib/groffer/perl/roff2.pl
+++ /dev/null
@@ -1,223 +0,0 @@
-#! /usr/bin/env perl
-
-# roff2* - transform roff files into other formats
-
-# Source file position: <groff-source>/contrib/groffer/perl/roff2.pl
-# Installed position: <prefix>/bin/roff2*
-
-# Copyright (C) 2006, 2008, 2009 Free Software Foundation, Inc.
-# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
-# Last update: 5 Jan 2009
-
-# This file is part of `groffer', which 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 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/>.
-
-########################################################################
-
-require v5.6;
-
-use strict;
-use warnings;
-use File::Spec;
-
-# temporary dir and files
-use File::Temp qw/ tempfile /;
-
-my $Dev_Null = File::Spec->devnull();
-my $Mode;
-my $Name;
-{
- my ($v, $d);
- ($v, $d, $Name) = File::Spec->splitpath($0);
- die "wrong program name: $Name;"
- if $Name !~ /^roff2[a-z]/;
-}
-$Mode = $Name;
-$Mode =~ s/^roff2//;
-
-my $Groff_Version = `groff --version 2>$Dev_Null`;
-die "$Name error: groff does not work;" if $?;
-my $Groffer_Version = `groffer --version 2>$Dev_Null`;
-my $Has_Groffer = ! $?;
-
-if ($Has_Groffer) {
- foreach (@ARGV) {
- last if $_ eq '--';
- next if $_ eq '-';
- if ($_ eq '-v' || '--version' =~ m|^$_|) {
- print $Name, ' in ', $Groffer_Version;
- exit 0;
- }
- if ($_ eq '-h' || '--help' =~ m|^$_|) {
- &usage_with_groffer();
- exit 0;
- }
- }
- system('groffer', '--to-stdout', "--$Mode", @ARGV);
- exit $?;
-} else {
- my @filespec;
- my $double_minus;
- foreach (@ARGV) {
- if ($double_minus) {
- push @filespec, $_;
- next;
- }
- if ($_ eq '--') {
- $double_minus = 1;
- next;
- }
- if ($_ eq '-') {
- push @filespec, '-';
- next;
- }
- if ($_ eq '-v' || '--version' =~ m|^$_|) {
- print $Name, ' in ', $Groff_Version;
- exit 0;
- }
- if ($_ eq '-h' || '--help' =~ m|^$_|) {
- &usage_without_groffer();
- exit 0;
- }
- if ($_ =~ /^-/) {
- &error_no_groffer();
- &error_no_options();
- next;
- }
- if (-f && -r) {
- push @filespec, $_;
- } else {
- &error_no_groffer();
- print STDERR "$_ is not an existing, readable file.\n";
- }
- }
-
- @filespec = ('-') unless @filespec;
- my $has_stdin;
- foreach (@filespec) {
- if ($_ eq '-') {
- $has_stdin =1;
- last;
- }
- }
-
- if ($has_stdin) {
- my $tempdir;
- foreach ($ENV{'GROFF_TMPDIR'}, $ENV{'TMPDIR'}, $ENV{'TMP'},
- $ENV{'TEMP'}, $ENV{'TEMPDIR'},
- File::Spec->catfile($ENV{'HOME'}, 'tmp')) {
- if ($_ && -d $_ && -w $_) {
- $tempdir = $_;
- last;
- }
- }
- my $template = $Name . '_XXXX';
- my ($fh, $stdin);
- if ($tempdir) {
- ($fh, $stdin) = tempfile($template, UNLINK => 1, DIR => $tempdir) ||
- die "$Name: could not create temporary file;";
- } else {
- ($fh, $stdin) = tempfile($template, UNLINK => 1) ||
- die "$Name: could not create temporary file;";
- }
- open $fh, ">$stdin";
- print $fh $_ foreach <STDIN>;
-
- foreach (@filespec) {
- $_ = $stdin if $_ eq '-';
- }
- } # if $has_stdin
-
- my $grog;
- my $groff_options = "-T$Mode";
- $groff_options = '-TX75-12 -Z' if $Mode eq 'x';
- $groff_options = '-Tlatin1' if $Mode eq 'text';
- if ($Mode eq 'pdf') {
- my $ps2pdf;
- my @path = File::Spec->path();
- foreach (@path) {
- my $file = File::Spec->catfile($_, 'ps2pdf');
- if (-f $file && -x $file) {
- $ps2pdf = "$file -";
- last;
- }
- }
- unless ($ps2pdf) {
- foreach (@path) {
- my $file = File::Spec->catfile($_, 'gs');
- if (-f $file && -x $file) {
- $ps2pdf = $file . ' -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite ' .
- '-sOutputFile=- -c save pop -f -';
- last;
- }
- }
- }
- $grog = `grog -Tps @filespec`;
- chomp $grog;
- system("$grog | $ps2pdf");
- exit $?;
- } else {
- $grog = `grog $groff_options @filespec`;
- chomp $grog;
- system($grog);
- exit $?;
- }
-}
-
-my $error_no_groffer;
-sub error_no_groffer {
- return 1 if $error_no_groffer;
- $error_no_groffer = 1;
- print STDERR "$Name: groffer is not available.\n";
-}
-
-my $error_no_options;
-sub error_no_options {
- return 1 if $error_no_options;
- $error_no_groffer = 1;
- print STDERR "$Name: groffer options are not allowed.\n";
-}
-
-sub usage_with_groffer {
- print <<EOF;
-usage: $Name [option]... [--] [filespec]...
-
--h | --help print usage information
--v | --version print version information
-
-All other options are arbitrary options of `groffer'; the options
-override the behavior of this program.
-
-`filespec's are the same as in `groffer': either the names of
-existing, readable files or `-' for standard input or a search pattern
-for man pages. No `filespec' assumes standard input automatically.
-EOF
-}
-
-sub usage_without_groffer {
- print <<EOF;
-usage: $Name [option]... [--] [filespec]...
-
--h | --help print usage information
--v | --version print version information
-
-No other options are allowed because `groffer' is not available.
-
-The only `filespec's allowed are the names of existing, readable files
-or `-' for standard input. No `filespec' assumes standard input
-automatically.
-EOF
-}
diff --git a/contrib/groffer/perl/split_env.sh b/contrib/groffer/perl/split_env.sh
deleted file mode 100644
index f9392610..00000000
--- a/contrib/groffer/perl/split_env.sh
+++ /dev/null
@@ -1,48 +0,0 @@
-#! /bin/sh
-
-# groffer - display groff files
-
-# Source file position: <groff-source>/contrib/groffer/perl/split_env.sh
-# Installed position: <prefix>/lib/groff/groffer/split_env.sh
-
-# Copyright (C) 2006, 2009 Free Software Foundation, Inc.
-# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
-# Last update: 5 Jan 2009
-
-# This file is part of `groffer', which 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 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/>.
-
-########################################################################
-
-# This file is called from groffer.pl. The environment variable
-# of the name in $1 will be split at output. The corresponding variable
-# must be exported before the call of groffer.pl.
-
-if test $# = 0
-then
- echo 'split_env.sh was called without an argument.' >&2;
-else
- eval v='"$'"$1"'"';
- if test _"$v"_ != __
- then
- eval set x $v;
- shift;
- for i in "$@";
- do
- echo $i;
- done;
- fi;
-fi;
diff --git a/contrib/groffer/roff2.man b/contrib/groffer/roff2.man
deleted file mode 100644
index 68af4291..00000000
--- a/contrib/groffer/roff2.man
+++ /dev/null
@@ -1,249 +0,0 @@
-.ig
-roff2@ROFF2MODE@.1 - man page for roff2@ROFF2MODE@ (section 1).
-
-Source file position: <groff_source_top>/contrib/groffer/roff2.man
-Installed position: $prefix/share/man/man1/roff2@ROFF2MODE@.1
-
-Last update: 5 Jan 2009
-Simplified to use .SY/.OP/.YS
-..
-.
-.
-.de au
-This file was written by Bernd Warken <groff-bernd.warken-72@web.de>.
-..
-.
-.
-.de co
-Copyright (C) 2006, 2007, 2009 Free Software Foundation, Inc.
-.
-.P
-This file is part of
-.IR \%groffer ,
-which is part of
-.IR \%groff ,
-a free software project.
-.
-You can redistribute it and/or modify it under the terms of the
-.nh
-.B "GNU General Public License"
-.hy
-as published by the
-.nh
-.BR "Free Software Foundation" ,
-.hy
-either version\~2, or (at your option) any later version.
-.
-.P
-You should have received a copy of the \f[CR]GNU General Public
-License\f[] along with
-.IR groff ,
-see the files \%\f[CB]COPYING\f[] and \%\f[CB]LICENSE\f[] in the top
-directory of the
-.I groff
-source package.
-.
-Or read the
-.I man\~page
-.BR gpl (1).
-You can also write to the
-.nh
-.B "Free Software Foundation, 51 Franklin St - Fifth Floor, Boston,"
-.BR "MA 02110-1301, USA" .
-.hy
-..
-.
-.
-.TH roff2@ROFF2MODE@ @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@"
-.SH NAME
-roff2@ROFF2MODE@ \- transform roff code into @ROFF2MODE@ mode
-.
-.
-.\" --------------------------------------------------------------------
-.SH "SYNOPSIS"
-.
-.SY roff2@ROFF2MODE@
-.RI [ \%groffer_option .\|.\|.\&]
-.OP \-\-
-.RI [ \%filespec .\|.\|.\&]
-.
-.SY roff2@ROFF2MODE@
-.B \-h
-|
-.B \-\-help
-.
-.SY roff2@ROFF2MODE@
-.B \-v
-|
-.B \-\-version
-.YS
-.
-.P
-The options
-.B \-v
-and
-.B \%\-\-version
-print the version information of the program to standard output and exit.
-.
-The options
-.B \-h
-and
-.B \-\-help
-print a usage information of the program to standard output and stop
-the program instantly.
-.
-.
-.P
-All other options are assumed to be
-.B \%groffer
-options.
-.
-They are internally passed to
-.BR \%groffer .
-They override the behavior of the program.
-.
-The options are optional, they can be omitted.
-.
-.
-.P
-The
-.I \%filespec
-arguments correspond to the
-.I \%filespec
-arguments of
-.BR \%groffer .
-So they are either the names of existing, readable files or
-.B \-
-for standard input, or the name of a man page or a
-.BR \%groffer (@MAN1EXT@)
-man page search pattern.
-.
-If no
-.I \%filespec
-is specified standard input is assumed automatically.
-.
-.
-.\" --------------------------------------------------------------------
-.SH DESCRIPTION
-.
-.B \%roff2@ROFF2MODE@
-transforms
-.I roff
-code into
-.ie '@ROFF2MODE@'x' \{\
-. I X
-mode corresponding to the
-. I groff
-devices
-. BR X *;
-this mode is suitable for
-. BR \%gxditview (@MAN1EXT@).
-.\}
-.el \{\
-. I \%@ROFF2MODE@
-mode.
-.\}
-.
-Print the result to standard output.
-.
-.
-.P
-There are more of these programs for generating other formats of
-.I \%roff
-input.
-.
-.if !'@ROFF2MODE@'dvi' \{\
-. TP
-. BR \%roff2dvi (@MAN1EXT@)
-is for
-. I dvi
-mode.
-.\}
-.
-.if !'@ROFF2MODE@'html' \{\
-. TP
-. BR \%roff2html (@MAN1EXT@)
-generates
-. I html
-output.
-.\}
-.
-.if !'@ROFF2MODE@'pdf' \{\
-. TP
-. BR \%roff2pdf (@MAN1EXT@)
-outputs
-. I pdf
-mode.
-.\}
-.
-.if !'@ROFF2MODE@'ps' \{\
-. TP
-. BR \%roff2ps (@MAN1EXT@)
-prints
-. I \%PostScript
-format to standard output.
-.\}
-.
-.if !'@ROFF2MODE@'text' \{\
-. TP
-. BR \%roff2text (@MAN1EXT@)
-generates text output in the
-. B groff
-device
-. IR latin1 .
-.\}
-.
-.if !'@ROFF2MODE@'x' \{\
-. TP
-. BR \%roff2x (@MAN1EXT@)
-prints the output in the
-. B groff
-device
-. B X
-that is suitable for programs like
-. BR \%gxditview (@MAN1EXT@)
-or
-. BR \%xditview (1).
-.\}
-.
-.
-.\" --------------------------------------------------------------------
-.SH "SEE ALSO"
-.\" --------------------------------------------------------------------
-.
-.BR \%groff (@MAN1EXT@),
-.BR \%groffer (@MAN1EXT@),
-.if !'@ROFF2MODE@'dvi' \
-. BR \%roff2dvi (@MAN1EXT@),
-.if !'@ROFF2MODE@'html' \
-. BR \%roff2html (@MAN1EXT@),
-.if !'@ROFF2MODE@'pdf' \
-. BR \%roff2pdf (@MAN1EXT@),
-.if !'@ROFF2MODE@'ps' \
-. BR \%roff2ps (@MAN1EXT@),
-.if !'@ROFF2MODE@'text' \
-. BR \%roff2text (@MAN1EXT@),
-.if !'@ROFF2MODE@'x' \
-. BR \%roff2x (@MAN1EXT@),
-.BR \%gxditview (@MAN1EXT@).
-.
-.
-.\" --------------------------------------------------------------------
-.SH "AUTHOR"
-.\" --------------------------------------------------------------------
-.au
-.
-.
-.\" --------------------------------------------------------------------
-.SH "COPYING"
-.\" --------------------------------------------------------------------
-.co
-.
-.
-.\" --------------------------------------------------------------------
-.\" Emacs settings
-.\" --------------------------------------------------------------------
-.
-.\" Local Variables:
-.\" mode: nroff
-.\" End:
diff --git a/contrib/groffer/shell/ChangeLog.0 b/contrib/groffer/shell/ChangeLog.0
deleted file mode 100644
index 7502c64f..00000000
--- a/contrib/groffer/shell/ChangeLog.0
+++ /dev/null
@@ -1,2122 +0,0 @@
-2006-10-10 Bernd Warken <groff-bernd.warken-72@web.de>
-
- * ChangeLog.0: This file is the former ChangeLog file of the
- `groffer' versions 0.* consisting of a shell version only. Since
- then the files have been moved to the subdirectory `shell' of the
- `groffer' main directory.
-
-2006-10-05 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.31
-
- * groffer2.sh:
- - _make_pdf(): Fix argument of `obj'.
- - to_tmp(): Add option -r to soelim to omit the .lf request. The
- new global variable $_SOELIM_R stores the option if it is
- available. Use numbers for the names of the `file' and `so'
- temporary files, such that the information for each filespec
- argument is kept for debug. New global variable $_FILE_NR.
- - main_set_resources(): Remove `man' temporary files except for
- debug
- - man_get(): Change name in $_TMP_MANSPEC.
- - man_is_man(): Change name in $_TMP_MANSPEC. Remove file in
- $_TMP_MANPEC if empty.
- - _do_display() of main_display(): Add check on empty mode file.
-
- * groffer.man: Filespec: Add information on the argument
- handling of apropos.
-
- Remove the space characters at the end of line in all files.
-
-2006-10-03 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.30
-
- * groffer2.sh:
- - Correct spacing.
- - main_do_fileargs(): Distribute special_filespec() in order to
- get a better heading for `whatis'.
-
-2006-10-03 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.29
-
- * groffer2.sh:
- - --to-stdtout: New option to display the generated mode file
- without graphical display.
- - _get_prog_args() of main_set_mode(): Make argument upper case.
- - usage(): Add --to-stdout, remove -Q, reorder --source.
-
- * groffer.man:
- - Reorder the default viewers.
- - Move `--source' to `groffer' options.
- - Remove `-Q'.
- - Add `--to-stdout'.
- - Reconfigure the sections on filespec arguments.
- - Remove information on wildcards.
-
-2006-10-01 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.28
-
- * groffer.sh:
- - Change all directories to end with `/'.
- - In the state before the run of `make', make the script runnable
- from each directory using $0 and `pwd'.
-
- * groffer2.sh:
- - main_init(): Change the umask to 0077 to allow only access for
- the file owner for the temporary files. This is done for security
- reasons.
- - version(): Put the whole output under `<<EOF'.
- - usage(): Add information on filespec arguments.
- - main_do_fileargs(): Rewrite the handling of filespec
- parameters. Fix filespec man:name.section.
-
-2006-09-26 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.27
-
- * Makefile.sub: Add Emacs setting at the end of the file.
-
- * TODO: Remove this file because it does not contain any actual
- entries.
-
- * groffer2.sh:
- - main_set_mode(): Remove too early test of modes on X. Fix pdf
- mode.
- - where_is_prog(): Fix this function to detect files in the
- current directory.
- - _get_prog_args() of main_set_mode(): Fix return;
- - _get_first_prog() of main_set_mode(): Fix call of exit_test().
- - cat_z(): Make it a single function and add file test.
- - whatis_setup(): Rename whatis_header(). Fix display title to
- `whatis'.
- - apropos_setup(): Fix display title to `apropos'.
- - Globals: Fix this section in the description of several
- functions.
- - apropos_filespec(): Fix variable $s and the corresponding sed
- call.
- - man_setup(): Add $EXTENSION.
- - _do_man_so() of to_tmp(): Fix variables.
- - $_ALL_EXIT: Remove unused variable.
- - $_TITLE_ELT: Remove unused variable.
- - man_set_resources(): Fix setting of $_DISPLAY_ARGS.
- - main_display(): Fix description. Remove $md_options. Let
- $MANOPT override system variables.
-
-2006-09-16 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.26
-
- ### Simplification of main_set_mode()
-
- * groffer2.sh:
- - _get_first_prog() of main_set_mode(): Rewrite this function
- such that it does not have an output, but set the variables
- $_DISPLAY_PROG and $_DISPLAY_ARGS.
- - _check_prog_on_list() of main_set_mode(): Rename and rewrite
- _check_X_prog(). Suitable for being called for $_VIEWER_<mode>_X
- and $_VIEWER_<mode>_TTY. No output, but set the variables
- $_DISPLAY_PROG and $_DISPLAY_ARGS.
- - _obj_set_vars() of main_set_mode(): Remove this function. It is
- no longer necessary because its variables are set by the other
- functions.
- - _get_prog_args() of main_set_mode(): New function that
- simplifies the loop in main_set_mode() and handles both
- $_VIEWER_<mode>_X and $_VIEWER_<mode>_TTY.
- - _process_mode() of main_set_mode(): Remove this function.
- - main_set_mode(): Remove case for calling _process_mode(). In
- the loop, use _get_prog_args() for simplification.
- - main_parse_args(): Make --<mode>-viewer equivalent to
- --<mode>-viewer-tty to make _process_mode() unnecessary.
- - $_VIEWER_BACKGROUND: Start with `no'.
-
- ### Extend the documentation
-
- * groffer2.sh:
- - Environment Variables: Add information on the naming of
- variables in functions.
- - $_ADDOPTS_POST, $_ADDOPTS_X: Remove these unused variables.
- - apropos_setup(), apropos_setup (), base_name(), dir_name(),
- echo1(), echo2(), func_check(), func_pop(), func_push(),
- is_greater_than(), list_append(), list_from_split(),
- _manpath_add_sys() of manpath_add_lang_sys(), rm_tree(),
- special_filespec(), special_setup(), tmp_create(), to_tmp_line(),
- usage(), version(), where_is_prog(), main_set_mode():
- Fix and extend the description. Many other function descriptions
- were just fixed without being mentioned.
- - landmark 7: man_*(): Add information on the search of `man'
- pages.
-
- * groffer.man:
- - GNU `man' option overview: Add --location, --no-location, and
- --where.
- - GNU `man' options: Add the GNU `man' long options that are
- accepted by `groffer', but just ignored.
- - MAN PAGE SEARCHING: Correct and extend this section.
-
- * TODO:
- - Remove entry on function headers.
- - Remove entry on GNU `man' options.
- - Remove entry on search algorithm for `man' pages.
-
- ### Other fixes
-
- * groffer2.sh:
- - man_get(): On `man' page search with given name and section
- handle also files with extension when no files without extension
- are found.
-
-2006-09-11 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.25
-
- ### Version information
-
- * groffer2.sh:
- - version(): Add groffer to the version information; replace the
- call of `groff --version'.
-
- ### Configuration Files
-
- * groffer.sh: Fix the configuration handling by removing all
- quotes. Arguments are ended by the end of the line.
-
- * groffer.man: Fix the section on the configuration files.
-
- ### Options
-
- * groffer2.sh:
- - $_OPTS_GROFF_SHORT_NA: Add `-k' as new groff option.
- - main_pars_args(): Add X options `--ft', `--bordercolor',
- `--borderwidth'.
- - usage(): Add `--debug-filenames'. Remove `*-viewer-tty'.
- Correct first line after call of version().
- - main_parse_MANOPT(): Fix `-h', `-t', and `-u' as options without
- argument.
-
- * groffer.man:
- - Add documentation to `--fn', `--ft', `--bordercolor',
- `--borderwidth'.
- - Remove the `--*-viewer-tty' options. These options are still
- supported by the groffer program, but they aren't needed any
- more.
-
- ### soelim: Allow manpath and compressed files in .so requests, as
- ### man does.
-
- * groffer2.sh:
- - $_FILESPEC_IS_MAN: New variable for storing if a filespec is for
- searching a man page.
- - to_tmp(): Rewrite. For existing file as filespec argument, add
- call of `soelim' with the corresponding `-I dir' before the call
- of `grog'. For man paged, uncompress and store the files from .so
- requests; replace the requests with the stored file names.
- - _do_man_so() of to_tmp(): New function to handle the file of a
- .so request.
- - man_get(): For man pages without extension, add special search
- strategy.
-
- * README: Add the .so handling to the Compatiblity section.
-
- ### Print file names debug
-
- * groffer2.sh:
- - $_OPT_LOCATION: Replace this variable by
- $_DEBUG_PRINT_FILENAMES.
- - register_file(): Move file name printing and call to basename to
- register_title().
- - _do_man_so() of to_tmp(): Add file name printing for man pages.
-
- ### modes
-
- * groffer2.sh:
- - $_DEFAULT_MODES: New set of default modes in the sequence 'pdf',
- 'html', 'ps', 'x', 'dvi', and 'tty'. That is done because the `x'
- mode viewers `gxditview' and `xditview' are very bad programs.
- - _make_pdf() of main_display(): If pdf format can not be
- generated use Postscript mode (ps) instead for display.
- - $_PDF_DID_NOT_WORK, $_PDF_HAS_PS2PDF, $_PDF_HAS_GS: New
- variables for pdf mode to avoid several runs.
- - $_VIEWER_TTY_TTY, $_VIEWER_TTY_X: Add these variables for the
- viewers in tty mode.
- - main_display(): Rewrite tty mode by using where_is_prog() to add
- options to `less' from the command line.
-
- * groffer.man:
- - Add this information.
- - Adjust the viewers in `SEE ALSO'.
-
- ### Check viewer option for programs running in X Window
-
- * groffer2.sh:
- - _check_X_prog() of main_set_mode(): New function for checking if
- a program of a command line argument is in the list for X for this
- mode.
- - _get_first_prog() of main_set_mode(): Use where_is_prog();
- change the output to the same 3-element list as _check_X_prog().
- - _obj_set_vars() of main_set_mode(): New function for setting
- some variables in several modes. Argument is the 3-element list
- from _check_X_prog() or _get_first_prog().
- - _process_mode() of main_set_mode(): Remove part with
- list_has_not_prog(). This is better done by _check_X_prog().
- - main_set_mode(): Use _check_X_prog() in different modes.
- Correct several modes. Add reset of $_VIEWER_BACKGROUND at the
- beginning of the loop of default modes.
-
- ### Allow man pages with space characters
-
- * groffer2.sh:
- - man_is_man(): Fix grep calls.
- - list_from_file(): New function that reads the lines of a file as
- list elements.
- - man_get(): Fix `case' applications by double-quoting all
- variables. Use list_from_file() instead of setting with `cat'.
- Add further tests.
- - _do_man_so() of to_tmp(): Use list_from_file() instead of
- setting with `cat'.
-
- ### Allow program names with space
-
- * groffer2.sh:
- - is_prog(), is_not_program(): Change to exactly one argument with
- possible spaces and arguments. Fix all calls.
- - where_is_prog(): Change to exactly one argument. Change
- variable prefix to `wip'. Rewrite it to support programs with
- spaces and arguments. Return a list with 3 elements: the
- program's directory, the program name, and the given arguments.
- - main_display(): Correct tty mode.
-
- ### Further fixes
-
- * groffer2.sh:
- - main_setup(): Fix func_check.
- - clean_up(): Add variable to avoid several prints.
- - where_is_prog(): Remove possible arguments from program
- argument.
- - obj_from_output(): As return value take the return value of the
- called function.
- - is_not_empty(): Rename of is_non_emtpy().
- - $_VIEWER_BACKGROUND: Rename $_VIEWER_TERMINAL and reverse its
- values.
- - list_has_prog(), list_has_not_prog(): Remove these functions,
- they are no longer needed.
-
- * groffer.man:
- - Add `--print' in OPTION OVERVIEW.
- - Correct many entries with the non-breaking `\%' construct.
-
-2006-07-28 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.24
-
- ### Extent long option abbreviation to abbreviations before each `-'.
-
- * groffer2.sh:
- - list_from_cmdline_with_minus(): New function, the same as
- list_from_cmdline() with multiple abbreviations around `-'.
- - _search_abbrev(): Subfunction of list_from_cmdline_with_minus().
- - main_parse_args(): Use list_from_cmdline_with_minus() for
- getting the double abbreviation, but keep main_parse_MANOPT()
- to list_from_cmdline() for simple abbreviation of long options.
- - For the debug test at the beginning, add the double abbreviation
- functionality.
-
- * README_SH, groffer.man: Document the multiple set of
- abbreviations by `-'.
-
- ### Fix handling of `--apropos*' and `--whatis'
-
- * groffer2.sh:
- - apropos_filespec(): Fix handling of `/' and `.' in sed; add `\&'
- at the beginning of each non-macro groff line in sed.
- - main_parse_args(): Set $_MAN_OPT to `yes' if --whatis is called.
- - main_do_fileargs(): Fix dealing with `apropos' for several
- cases.
- - apropos_*(), special_*(), whatis_*(): Add two different return
- values.
- - $_SPECIAL_SETUP: New variable to test whether apropos_setup() or
- whatis_header() had been run.
- - Add language locale to --whatis, the `whatis' program does not
- support this.
-
- ### Handle several macro packages
-
- * groffer2.sh:
- - $_MACROS: New variable to store the actual macro package.
- - $_MACRO_PACKAGES: New variable for the full macro packages of
- groff (man, mdoc, me, mm, mom, ms).
- - to_tmp(): Add test for different macro packages. Ignore files
- with a different one.
- - main_do_fileargs(): Add different macro check before doing man
- pages.
-
- ### Rewrite the man page search
-
- * groffer2.sh:
- - $_MAN_SEC_CHARS, $_MAN_SEC_LIST: New variables from $_MAN_SEC.
- Add these to man_setup().
- - man_get(): New function that finally gets the man page or man
- pages for a filespec. Avoid double files.
- - man_is_man(): New function that checks whether a name goes as
- man page.
- - manpath_add_lang_sys(): Fix handling of language addition for
- short language names.
- - main_parse_args(): Move handling of `-' to main_do_fileargs().
- - do_filearg(), man_do_filespec(), man_register_file(),
- man_search_section(): Remove these functions.
- - main_do_fileargs(): Rewrite this function together with
- the removed functions.
- - list_uniq(): New function to remove the multiple elements from a
- list.
-
- ### Version handling.
-
- * version.sh: New file for $_PROGRAM_VERSION, $_LAST_UPDATE, and
- $_GROFF_VERSION_PRESET.
-
- * groffer.sh:
- - Add running of version.sh with `.'.
- - Remove $_PROGRAM_VERSION and $_LAST_UPDATE.
- - Run groffer2.sh with `.' instead of `exec'. This allows to have
- groffer2.sh without executive access permission.
- - Determine $_BEFORE_MAKE by @VERSION@, use this variable on more
- places.
-
- * groffer2.sh:
- - Remove executive access permission.
- - version(): Write a version information without calling groff.
-
- * Makefile.sub:
- - Add version.sh. Use $(INSTALL_DATA) instead of
- $(INSTALL_SCRIPT) for version.sh and groffer2.sh.
- - Add $(DESTDIR) to some elements of `sed' call in `groffer:'.
-
- ### viewers for different modes
-
- * groffer2.sh:
- - $_VIEWER_HTML_X: Add `epiphany' as browser.
- - $_VIEWER_PDF_X: Add `kpdf' and `evince' as pdf viewer for X.
- Make `kpdf', `acroread', `evince', and `xpdf' the first automatic
- pdf viewers for X because they support searching. Add `gpdf'.
- - $_VIEWER_PS_X: Add `kpdf' and `evince' as ps viewer for X; make
- `kpdf' the first automatic ps viewer for X because it supports
- searching even for Postscript.
-
- ### pdf mode
-
- * groffer2.sh:
- - _make_pdf() of main_display(): add `ps2pdf' as secondary
- transformer.
- - main_set_resources(): Allow setting of resolution for `xpdf'
- only if option -z is not set for `xpdf'.
-
- ### Revise $_VIEWER_*
-
- * groffer2.sh:
- - $_VIEWER_<mode>_TTY: Add this variable to each mode even if it
- is only empty.
- - $_VIEWER_<mode>_X: Rename $_VIEWER_<mode> to this for each
- mode.
-
- ### Other fixes
-
- * groffer2.sh:
- - is_empty_file(): New function.
- - obj_from_output(): Quote arguments by building a list.
- - path_list(): Output path list with unique elements.
- - where_is_prog(): Rename where_is(). Handle all file names
- having a slash somewhere instead of only those that start with a
- slash.
- - $_REG_TITLE_LIST: Replace $_REGISTERED_TITLE and make it a
- list.
- - $_OPT_TITLE: Make it a list with at most 1 element.
- - Remove double quotes in case patterns.
- - _func_test(): For the function test at the beginning, add this
- function for output check with $() construct.
- - usage(): Add --shell.
- - $_VIEWER_HTML_X: Add `firefox' and `mosaic'.
- - list_get(): Remove this unused function.
- - Fix func_check() calls in all functions.
-
- * groffer.sh: Adjust groff version to 19.3.
-
- * README: Add information list of the source files.
-
-2006-02-26 Claudio Fontana <claudio@gnu.org>
-
- * Makefile.sub: Add DESTDIR to install and uninstall targets
- to support staged installations.
-
-2005-09-14 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.23
-
- ### Increase the speed for the search of man pages
-
- Run `find' on all man directories and ask this with `grep' instead
- of scanning through many `ls'.
-
- * groffer2.sh:
- - $_TMP_MAN: New variable with the name of the file that stores
- the `find' of the man path.
- - $_TMP_MANSPEC: New variable with the name of the file that
- stores the man page file names for each filespec.
- - man_setup(): Do the `find' of the man path with $_TMP_MAN.
- - man_do_filespec(): Add creation of $_TMP_MANSPEC.
- - man_search_section(): Rewrite it to use $_TMP_MANSPEC.
-
- * TODO: The demand on the increase of speed for man pages is now
- removed.
-
- ### Increase speed by enhancement of debug
-
- * groffer.sh: $_BEFORE_MAKE: New variable that stores whether the
- @...@ constructs are still available or already transformed by
- `make'.
-
- * groffer2.sh:
- - $_DEBUG_FUNC_CHECK: New debug variable that regulates the check
- calls at the beginning and end of most functions done by the
- functions func_<name>(). By default, this is enabled before the
- run of `make', and disabled after. $_DEBUG_STACKS and
- $_DEBUG_USER_WITH_STACK enable this variable automatically.
- - --debug-func: New option for setting $_DEBUG_FUNC_CHECK.
- - usage(), main_parse_args(): Add information for --debug-func.
- - func_<name>(): Disable these functions if $_DEBUG_FUNC_CHECK is
- not `yes'.
-
- * groffer.man:
- - Add information on --debug-func.
- - Move the sections on options for development to the end of
- option processing.
-
- ### Fixes of man page search
-
- - man_search_section(): Repair it such that extensions do not
- occur in the directory name.
- - manpath_set_from_path(): Rewrite it. Add `.../MAN/...'
- subdirectories additionally to `.../man/...'.
- - manpath_add_lang_sys(): Rewrite it to overwrite _MAN_PATH by
- systems parameter if any. Then _MAN_PATH is prepended by the
- language part.
- - _manpath_add_sys(): New subfunction of manpath_add_lang_sys() to
- handle the systems part.
- - man_search_section: Fix it to handle section names that have
- more than one character (an extension).
- - $_MAN_PATH: Now stores man path as a list. This is done in
- man_setup() and manpath_set_from_path(), and used in
- manpath_add_lang_sys().
- - $_MAN_SYS: Now stores man systems parameter as a list. This is
- done in man_setup() and used in manpath_add_lang_sys().
- - $_MAN_SEC_DONE, $_MAN_SYS_DONE, $_MAN_LANG_DONE: Remove these
- variables.
-
- ### Reorder the beginning of groffer2.sh
-
- * groffer2.sh:
- - func_<name>(): Move these functions to the functions in
- alphabetical order.
- - main_init(): Move "Test for compression" to this function.
- - Move the "System Test" and function landmark() to the beginning
- "Test of rudimentary shell functionality". Change landmarks 1 and
- 2 to new positions.
-
- ### Fix the mode when not in X
-
- * groffer2.sh:
- - main_parse_args(): Accept modes even when not in X, hoping for a
- program given by option. Add $_OPT_VIEWER_<MODE>_TTY. Remove
- $_VIEWER_TERMINAL.
- - main_set_mode(): Add a section to set $_VIEWER_TERMINAL and move
- the value of $_OPT_VIEWER_<MODE>_TTY to $_OPT_VIEWER_<MODE>. When
- not in X and no terminal programs are set remove $_OPT_MODE. All
- unknown programs are treated as terminal programs.
- - usage(): Comment out options --<mode>-viewer-tty. They exist
- and are handled by `groffer', but they are no longer documented.
- - $_OPT_VIEWER_<MODE>_TTY: New variables for option
- --<mode>-viewer-tty.
- - $_DEFAULT_MODE, $_VIEWER_<MODE>: Change it from , separation to
- a list. Rewrite _get_first_prog() of main_set_mode() to get
- around with this.
-
- * groffer.man: Remove information on --<mode>-viewer-tty.
-
- ### Debug
-
- * groffer2.sh:
- - $_DEBUG_PRINT_FILENAMES: New variable for printing the file
- names that are displayed by `groffer'.
- - --debug-filenames: The corresponding option. It is used in
- man_register_file(), register_file(), and main_parse_args().
-
- * groffer.man: Add information on --debug-filenames.
-
- ### Other changements
-
- * groffer2.sh:
- - is_greater_than(): New function. Use it where suitable.
- - lists_combine(): New function to combine several lists to a
- single list.
- - list_from_split(): Rewrite it to output a list with quoted
- elements.
- - list_has_prog(), list_has_not_prog(): New functions to check the
- list on an element that starts with a given word.
- - obj_from_output(): Use this function at many places instead of
- `var="$(...)"'; this makes the usage of exit_test() unnecessary.
- - path_clean(): Fix assignment.
- - path_list(): Rename path_split().
- - tmp_create(): Add check of temporary file.
- - usage(): Fix.
-
- * README_SH:
- - Fix section `Error handling'.
- - Add section `Speed'.
-
-2005-08-22 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.22
-
- ### `--whatis'
-
- Produce a `groff' output and allow wild cards on filespec
- parameters for `--whatis'.
-
- * groffer2.sh:
- - $_FILESPEC_ARG: New variable for storing the actual filespec
- parameter.
- - main_do_fileargs(): Set $_FILESPEC_ARG and add
- what_is_filespec().
- - main_parse_args(): Add --all to --whatis.
- - to_tmp_line(): New function to write the arguments to the
- temorary cat file.
- - whatis_filename(): Rename of what_is(). Construct a better
- printout using $_FILESPEC_ARG. Repair the sed sequneces.
- - whatis_filespec(): New function to print the filespec once
- during the `whatis' process.
- - whatis_header(): New funtion for printing the header of the
- `whatis' output.
-
- * groffer.man: Revise the documentation of --whatis.
-
- ### `--apropos*'
-
- Produce `groff' for `--apropos*'. Allow `--sections' for
- `--apropos', ignore it with `--apropos-*'.
-
- * groffer2.sh:
- - --apropos*: Make these options without argument.
- - $_APROPOS_PROG: New variable for the program that is is used for
- `apropos'.
- - $_APROPOS_SECTIONS: New variable to determine the sections that
- are filtered out of `apropos' output depending on `--apropos-*'.
- - apropos_filespec(): Handling of apropos at the filespec level.
- - apropos_run(): Remove it.
- - apropos_setup(): New function.
- - main_set_mode(): Remove handling of $_OPT_APROPOS*.
-
- * groffer.man:
- - Revise the documentation of `--apropos*'.
- - Split section 'options for GNU man' into two sections `options
- for man pages' and `long options taken over from GNU man'.
- - Move `--apropos*', `--whatis', `--man', and `--no-man' to
- section `options for man pages'.
-
- ### special display (apropos and whatis)
-
- * groffer2.sh:
- - special_setup(): New function that chooses the setup between
- apropos and whatis.
- - special_filespec(): New function that does the output at the
- filespec level for apropos or whatis.
-
- ### handle `--sections' for man page searching
-
- * groffer2.sh:
- - man_do_filespec(): Use $_OPT_SECTIONS of --sections instead of
- $_MAN_AUTO_SEC if non-empty. If a section was given on the
- filespec parameter $_OPT_SECTIONS is ignored. This differs from
- `man' which always uses the restricted sections of --sections.
- This function works for both normal man page search and whatis.
- - apropos_filespec(): Use --sections for --apropos, but not for
- --apropos-* because these provide already their own sections.
-
- ### wildcards in filespec arguments
-
- * groffer2.sh: Wildcards are now accepted. In `--apropos*' and
- `--whatis' they are interpreted as wildcard search elements; but
- in normal display they are only handled as their own character.
-
- ### development; new option
-
- * groffer2.sh:
- - --print: New option that prints just its argument for parameter
- check.
- - usage(): Add new option.
- - $_OPT_DO_NOTHING: New variable for do_nothing(). Handle it at
- the end of main_parse_Args().
-
- * groffer.man: Add information on --print.
-
- ### safe exit
-
- * groffer2.sh:
- - error(): Always exit with $_ERROR.
- - exit_test(): New function to exit when first exit was hidden by
- (). Call it after each $().
-
- ### automatic shell determination
-
- * groffer.sh:
- - If no option --shell is given perform a test of several shells
- to automatically start some shell for groffer2.sh. `ksh' is used
- first because it can be safely terminated by Ctrl-C.
- - This can be cancelled by providing --shell=''.
- - Add test on `sed' program.
-
- * groffer.man: Revise information on --shell.
-
- ### trap
-
- * groffer2.sh:
- - trap_set(): Remove argument. Instead of $_ALL_EXIT use only
- signal 0.
- - trap_unset(): Rename trap_clean(). Instead of $_ALL_EXIT use
- only signal 0.
- - $_ALL_EXIT: Remove this variable.
- - Replace all direct `trap' calls by trap_set().
-
- * README_SH: New section `Bugs' on `trap'..
-
- ### user errors, error output without function stack
-
- * groffer2.sh:
- - error_user(): New function for user errors.
- - error(): Remove call of clean_up() because the trap will do it
- with the exit. Remove the `kill' commands. Create a temporary
- file `.error' that can be tested by exit_test() for a better exit
- test (especially for shell `ksh').
- - $_DEBUG_USER_WITH_STACK: New variable to enable function stack
- output in error_user().
- - list_from_cmdline(), list_single_from_abbrev(), main_set_mode():
- Use error_user().
-
- ### test modes on X and tty
-
- * groffer2,sh:
- - is_X(), is_not_X(): New functions for checking on X Window.
- - $_VIEWER_HTML_TTY, $_VIEWER_HTML_X: New variables that split
- $_VIEWER_HTML. Add `galeon'.
- - main_parse_args(): Allow mode change for graphical modes only
- when in X Window.
- - _do_display() of main_display(): Create a special run for
- viewers that run on the terminal; `lynx' is the only one so far.
-
- ### add $GROFFER_MODE to command line
-
- * groffer.sh:
- - After the handling of the configuration files integrate
- $GROFFER_OPT to the command line.
- - This makes a `set' in the shell determination unnecessary.
-
- * groffer2.sh:
- - The debug test gets simpler because quotes are vanished without
- $GROFFER_OPT.
- - main_parse_MANOPT(): Prepend $mpm_list to the command line.
- - main_parse_args(): `set' is unnecessary.
-
- ### debug; new options
-
- * groffer2.sh:
- - --debug-all, --debug-lm, --debug-params, --debug-shell,
- --debug-stacks, --debug-tmpdir, --debug-user: New options.
- - --debug: Enable all debug variables except $_DEBUG_STACKS and
- $_DEBUG_LM. By the new options the smallest abbreviation is now
- `--debug'.
- - $_DEBUG_STACKS: Rename $_DEBUG.
- - $_DEBUG_PRINT_TMPDIR: New debug variable for printing the name
- of the temporary directory in main_init().
- - $_OPT_DEBUG: Remove this variable because debug is handled at
- the early part of the script.
- - clean_up(): Enlarge $_DEBUG_KEEP_FILES to not deleting the
- temporary directory.
- - usage(): Move all development options on a section of its own.
- - Move the test of rudimentary shell functionality at the
- beginning of the script. Add test on `sed'.
- - Follow this by the debug section. The determination of all
- --debug* options can be done without a function.
-
- * groffer.man: Revise information on --debug and add new options.
-
- ### variables
-
- * groffer.sh:
- - $_ERROR: Move the definition of this variable here.
- - $_GROFF_VERSION: New variable, is set over @...@ construct.
- - $_OUTPUT_FILE_NAME: Move this variable to groffer2.sh.
-
- * groffer2.sh:
- - $_MAN_AUTO_SEC_LIST: Rename $_MAN_AUTO_SEC because it represents
- a list.
- - $_MAN_AUTO_SEC_CHARS: New read-only variable for storing
- $_MAN_AUTO_SEC_LIST in [] construct. Use it in man_do_filespec()
- and whatis_filename().
- - $_SPACE_CASE: New read-only variable with [] on space characters
- with \ for `case' patterns. Use it in several functions.
- - $_SPACE_SED: New read-only variable with [] on space characters
- for `sed'. Use it in several functions.
-
- ### options and display
-
- * groffer2.sh:
- - list_from_cmdline(): Add test whether the same abbreviation is
- part of long options with and without arguments. Give handling of
- `=' a `case' pattern of its own.
- - main_display(): Remove unnecessary calls of `clean_up' in order
- to use `mozilla' without problems. In _do_display(): Fix -X by
- providing a different process when $_DISPLAY_PROG is empty.
- - main_set_mode(): Accept options for viewers as is, without check
- for program. Add test whether no program is given for a mode.
- This avoids unnecessary empty $_DISPLAY_PROG in main_display().
-
- ### viewer programs that run on the terminal (tty); new options
-
- * groffer2.sh:
- - $_VIEWER_TERMINAL: New variable that stores whether a viewer was
- supposed to run on tty.
- - --dvi-viewer-tty, --html-viewer-tty, --pdf-viewer-tty,
- --ps-viewer-tty, --tty-viewer-tty, --X-viewer-tty, --x-viewer-tty,
- --www-viewer-tty: New options for viewers that run on a terminal.
- - main_parse_args(), _do_display() of main_display(): Use the new
- options and the new variable.
- - usage(): Add the new options.
-
- * groffer.man: Add information on options --*-viewer-tty.
-
- ### other fixes
-
- * groffer2.sh:
- - _do_display() of main_display(): Bear errors of `groff' run.
- - is_not_file: Fix to have exactly one argument.
- - is_not_prog(): Handle no arguments.
- - list_has_not(): Fix.
- - main_do_fileargs(): Remove $mdfa_exitcode.
- - register_title(): Limit title to 4 elements.
- - version(): Print the version information to standard output just
- like `groff' does.
- - --no-special: New option to disable former calls of `--all',
- `--apropos*', and `whatis.
- - --title: Make it an option with argument.
-
-2005-08-07 Keith Marshall <keith.d.marshall@ntlworld.com>
-
- * contrib/groffer/Makefile.sub (install): Reference groffer2.sh
- as $(srcdir)/groffer2.sh, so it will install when building in a
- different directory from the source.
-
-2005-08-02 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.21
-
- ### @...@ constructs
-
- * groffer.sh:
- - $_AT: New variable for `@'.
- - @...@: Replace the @...@ constructs by variables _AT_..._AT.
- These constructs are transformed by `make' to useful information.
- Keep all of these constructs in the first part of groffer.sh. For
- a run before a `make' call, the script sets these variables to
- special values for testing purpose.
- - $_GROFFER_LIBDIR: Variable pointing to the groffer library
- directory @libdir@/groff/groffer.
-
- ### Configuration files
-
- * groffer.sh:
- - Add test for `$()' construct.
- - Read and transform the configuration files and execute the
- emerging commands. The `sed' script was heavily enlarged to
- handle line with spaces and quotes. The emerging script is now
- called by `eval', so no temporary file is needed.
- - $_CONF_FILE_ETC, $_CONF_FILE_HOME: New variables for the config
- files.
- - $_SQ, $_SP: Move variables for characters before the handling of
- the configuration files. Rename $_SQUOTE to $_SQ and $_SPACE to
- $_SP.
- - $GROFFER_OPT: Remove cleaning of this variable before the
- reading of the configuration files.
-
- * groffer2.sh:
- - main_init(): Remove the getting of the configuration files.
-
- ### Rewrite the shell determination
-
- * groffer.sh:
- - Get rid of all functions in `groffer.sh'. Rewrite the shell
- determination with `` and $().
- - --shell: Shortest abbreviation is `--sh'. Allow arguments for
- the shell name.
- - Allow an empty argument for --shell as shell name to overwrite a
- specified shell; an empty shell name gets back to the default
- shell.
- - The shell determination now inludes the full handling of the
- config files. The `--shell' option needs no longer a line
- starting with `-'.
-
- ### Test of unset
-
- * groffer.sh:
- - Remove test of `unset'.
- - Remove all calls of `unset'.
- - Use one character names for all variables that are meant to be
- local in this script.
-
- * groffer2.sh:
- - Move the test of `unset' to the testing of rudimentary shell
- functionality without change.
-
- ### Allow abbreviations for long options
-
- * groffer2.sh:
- - list_has_abbrev(): New function for checking a list having an
- element with a given abbreviation.
- - list_get_single_from_abbrev(): New function to retrieve the
- element having a given abbreviation.
- - list_from_cmd_line(): For an option abbreviation determine the
- corresponding long option.
- - From the man option lists remove the elements that are also in
- a groffer list.
- - Allow abbreviation for the early test of --debug.
-
- * groffer.sh: Allow abbreviation for the early test on --shell.
- - get_opt_shell(): Rewrite _get_opt_shell() and the shell test
- around it.
- - test_on_shell(): Rename function _test_on_shell().
- - $_SHELL: global variable for the shell to run groffer2.sh.
-
- ### Get rid of `sh -c'
-
- * groffer2.sh:
- - main_display(), _do_display(): Remove the `sh -c' calls. Make
- the cleanup working without it.
- - _do_display(): Extend _do_display() such that it can be used for
- the pdf mode as well.
- - _make_pdf(): New subfunction of main_display() for running the
- additional parts of pdf mode in _do_display().
- - rm_file(), rm_file_with_debug(), rm_tree(): New functions for
- removing files and directories.
-
- ### Change directory
-
- * groffer2.sh:
- - $_START_DIR: New variable to store the directory at the starting
- time of the script.
- - main_display(): Go to the groffer temporary directory to be able
- to process internal `groff' data like pictures.
- - clean_up(): Get back to the starting directory.
-
- ### Compatibility with strange shells
-
- * groffer2.sh:
- - clean_up(): `zsh' and `posh' had difficulties with `eval'.
- - is_*(): Add test on empty argument. Some shells return true on
- `test -d' etc. with empty argument, while most shells return
- false.
- - echo1(); New function to print single line `cat <<EOF'. Replace
- all `echo x' by `echo1'.
- - list_has_abbrev(), list_from_cmdline(): Correction.
- - main_parse_MANOPT(): Repair and revise.
- - --do-nothing: New option without output (for development).
- - Rewrite rudimentary shell functionality near the beginning of
- the script.
-
- * groffer.sh, groffer2.sh:
- - Remove `;' after the commands `if', `while', and `until'.
-
- ### Debugging information
-
- * groffer2.sh:
- - $_DEBUG_PRINT_PARAMS: New variable for printing all parameters
- from the config files, $GROFFER_OPT, and command line after they
- have been transformed.
- - $_DEBUG_PRINT_SHELL: New variable for printing the name of the
- shell found in groff.sh.
- - main(): Move the landmarks of main-*() into main().
-
- ### Further checks and additions
-
- * groffer.sh, groffer2.sh:
- - $_PROGRAM_NAME: Replace this variable by `groffer'. The program
- name is now stable.
- - $_GROFFER_RUN: Remove this variable. As `groffer.sh' or
- `groffer' is no longer rerun, this variable is not necessary any
- more.
-
- * groffer2.sh:
- - main_set_resources(): Make the default viewers capable to use
- arguments in the list.
- - leave(): Add an argument for given exit code. Use it where
- suitable in main_*().
- - do_filearg(): Add error messages for non-existing files and man
- pages.
- - _do_opt_V(): New subfunction of main_display() to handle the
- output for option `-V'. `groff -V' is greatly enlarged by
- `groffer' specific information.
- - register_title(): Handle file names with spaces. Replace spaces
- by `_'.
- - is_existing(): Add `test -c' for special files.
- - usage(): Add `=arg' to the options with an argument. Add option
- `--tty-viewer'.
- - kghostview: In the default viewer list, add option
- `--scale=1.45'.
- - $_OPTS_CMDLINE_SHORT_NA: Correct a lacking space.
-
- * Makefile.sub: Repair the installation instructions for
- groffer2.sh.
-
- * groffer.man:
- - Add paragraph on option handling.
- - Add option `--do-nothing'.
- - Reorder option for development and `groff'.
- - Rewrite documentation for option `-V'.
- - Expand `--shell'.
- - Reformulate sections CONFIGURATION FILES, COMPATIBILITY and SEE
- ALSO.
- - Make `man' italic where possible.
- - .copyleft: Adjust the fonts.
-
- * README: Update sections `Output' and `Compatibility'.
-
- * README_SH:
- - Add `mksh' as compatible shell.
- - Add information on the scripts after the split.
-
- * TODO: Remove some fulfilled parts.
-
- * ChangeLog: Remove final spaces.
-
-2005-07-30 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.20
-
- ### Split groffer.sh into two files groffer.sh and groffer2.sh.
-
- * groffer.sh:
- - Remove the second part of this script. It is now in
- groffer2.sh.
- - $_GROFFER2_SH: New variable to point to the installed position
- of `groffer2.sh'. This position is presented using @libdir@.
-
- * groffer2.sh: New script containing the second part of
- groffer.sh. This script will be installed in the groffer library
- directory @libdir@/groff/groffer, this might be
- /usr/local/lib/groff/groffer/groffer2.sh for example.
-
- * Makefile.sub:
- - `groffer': Add replacement of @libdir@.
- - `install_data': Add the installation of the groffer library
- directory and groffer2.sh.
- - `uninstall_sub': Delete the installed `groffer2.sh' and the
- groffer library directory.
-
- * README_SH:
- - Remove the function list.
- - Add argument options to the list of used commands.
- - Documentation of the splitting of the script.
- - Document the possible abbreviation of options.
-
-2005-07-07 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.19
-
- * groffer.sh: extensions
- - `mode x': Mode for the equivalent options `--x', `--mode x',
- `--X' `--mode X', and the default mode. The default assumes a
- resolution of 75 dpi. The default device for a resolution of 75
- dpi is `X75-12', the default device for a resolution of 100 dpi is
- `X100'. The default geometry for the resolution of 100 dpi is set
- to the width 800 dpi.
- - `mode X': New mode for option -X only.
- - `-V': Extent the `groff' output of -V by `groffer' specific
- information (in main_display()).
- - register_file(): Replace title `-' by `stdin'.
- - $_DEBUG_KEEP_FILES: If set to `yes' the files in the temporary
- directory are not deleted before the end trap.
-
- * groffer.sh: get `zsh' to work as well
- - tmp_create(): Use `: >file' for generating an empty file.
- - rmdir: Replace `rmdir' by `rm -f -r'.
- - eval: Add `eval' to many commands with variable arguments.
-
- * groffer.sh: repair `debug'
- - Print all debug output to stderr.
- - $_FUNC_STACK: Built function call stack even when $_DEBUG is not
- set. Now the arguments are not added.
- - $_DEBUG: If set to `yes' print 3 call stack events: the function
- that is added with its arguments is printed with `+++ '
- (func_push()); the call stack after the addition is printed with
- `>>> ' (func_push()); the call stack after the removing is printed
- with `<<< ' (func_pop()).
- - error(): Always print the function call stack on errors.
-
- * groffer.sh: Corrections
- - $_groffer_run: Rename to $_GROFFER_RUN.
- - $unset: Rename to $_UNSET.
- - Repair test of `unset'.
- - Repair test for `--shell'. The script is now rerun under the
- shell specified in the option argument. This can increase the
- speed.
-
- * README_SH: `zsh' now works.
-
- * groffer.man:
- - Reformulate the information for the `groffer' specific details
- of option `-V'.
- - Add information on the debug process.
- - Add information on the default devices in `x mode'.
- - Minor corrections.
-
-2005-07-01 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.18
-
- * groffer.sh: further shell compatibility
- - `echo': Remove options and possible options of `echo' by
- preceding the argument with a character `x' that is removed by
- `sed' or replace `echo' by `cat <<EOF'. `echo -n' seems to be not
- portable, so it is omitted.
- - `for': Remove `;' from within `for' (because of ksh).
- - `ls': Old UNIX systems echoed the error message to standard
- output. So handle the output with `sed'. If the output contains
- `not found' map it to an empty string.
- - `true': Replace `true' by command `:'. Remove test of `true'
- (because `ash' refuses the redefinition of builtins even in an
- unreachable `if' branch).
- - `false': Remove test of `false'; it isn't used any more.
- - `test': As `test -e' does not exist in Solaris 2.5 replace it by
- `test -f || test -d'.
- - `unset': `unset' is said to be not portable. As `ash' protests
- against the definition of the function `unset()' in the test of
- `unset' replace the test by defining `$unset' to `unset' if it
- exists and to `:' otherwise. Use `eval $unset' instead of the
- direct command `unset'.
- - _get_opt_shell(): Replace `for' loop with `shift' by `while'.
- - man_search_section(): Replace `for f in filename*' by a test on
- the existence of `filename*'.
- - `zsh' interprets `$...' as `"$..."'. So `eval' must be called;
- This cannot be used in `for i in $f', so it must be rewritten as
- `for i in $(eval set x $f; shift; echo "$@")'
-
- * groffer.sh:
- - `--X', `--x', `--mode=X', `--mode=x': Make these options
- equivalent to choosing an X device by setting `-TX75-12'. `-X' is
- still equivalent to `groff -X'.
- - main_init(): Choose the name of the temporary file by adding a
- number using `expr' if it exists and cannot be removed.
- - main_parse_args():Repair some options by replacing `$mpa_mode'
- by `$_OPT_MODE'.
- - catz(): Rename it to cat_z() to avoid problem with existing
- programs.
- - where(): Rename to where_is().
- - $_CONFFILES: Rename to $_CONF_FILES.
- - $_HAS_BZIP: export and preset it.
-
- * groffer.man:
- - Document the `X mode' changes.
- - Add `@g@' to `troff'.
-
- * README, README_SH, TODO:
- - Add date line `Latest update:'.
- - Add `...' quoting to essential terms.
- - Add Emacs mode at the end.
-
- * README_SH:
- - Add documentation on the above compatibility changes.
- - Add documentation on used commands.
- - Mention the tested shells.
-
- * Makefile.sub:
- Readd `@g@'.
-
-2005-06-23 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.17
-
- * groffer.sh: get rid of `local' in functions (it is not POSIX)
- - Replace local variables by variable names with a special prefix
- that is an abbreviation of the corresponding function name (quasi-
- local variables).
- - Unset the quasi-local function variables before returning.
- - _t_e_s_t_f_u_n_c_(): Remove tests for local and global
- variables.
- - Add quasi-local variables for saving the content of
- single-character variables.
- - Remove some unused local and global variables.
- - Several variables were forgotten to make local. They are now
- made quasi-local.
-
- * groffer.sh: other corrections
- - $return_var: New function (after `eval') for an arbitrary
- return value.
- - obj*(): Add return modes.
- - Rewrite tests for `true' and `false'.
- - Add function names to error calls where it was forgotten.
- - `for': Replace `for x in "$@"' by `for x'.
- - `set': Replace `set -- ...' by `set x ...; shift'.
- - `sed': Replace `\|.*|s|...|...|' by `s|...|...|'.
-
- * README_SH:
- - Add information on the removing of `local'.
- - New section for non-POSIX shell restrictions.
-
-2005-06-20 Keith Marshall
-
- * README-SH: Information of `Portable shells' in info autoconf.
-
-2005-06-19 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.16
-
- * groffer.sh: Place each `then', `else', and `do' on a line of its
- own because some shells do not support the mixture mode.
-
- * groffer.man: Add section `BUGS'.
-
- * README_SH:
- - Add compatibility information.
- - Correct documentation for function arguments.
-
-2005-06-18 Keith Marshall
-
- * groffer.sh: $_NULL_DEV: Replace /dev/null by $_NULL_DEV which is
- either /dev/null or NUL if /dev/null does not exist.
-
-2005-06-17 Zvezdan Petkovic
-
- * Makefile.sub: $(RM): Define it to `rm -f' because not all `make'
- programs have it predefined.
-
-2005-06-16 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.15
-
- * Makefile.sub:
- - Use `$(RM)'.
- - Use `sed -f $(SH_DEPS_SED_SCRIPT)'.
-
-2005-05-20 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.14
-
- * groffer.man: correction of non-hyphenation
-
-2005-05-17 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.13
-
- * groffer.sh:
- - $_VIEWER_DVI: Add `kdvi'.
- - $_VIEWER_PDF: Add `kghostview', `ggv', and `kpdf'.
- - $_VIEWER_PS: Add `kghostview' and `ggv'.
- - $_modefile: For the output file name, add extension .ps for ps
- mode and .dvi for dvi mode. This exists already for the html and
- pdf modes.
- - Update some parts of the documentation.
-
- * README, README_SH:
- - Move some parts on usage from README_SH to README.
- - Reformulate several parts of both files.
-
- * groffer.man: update
-
-2005-05-14 Keith Marshall
-
- * groffer.sh:
- - first line: Add space to `#! /bin/sh'.
-
-2004-11-15 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.12
-
- * groffer.sh:
- - main_init(): Rewriting of the creation of the temporary
- directory to ensure that it cannot be made writable apart from the
- user. If the directory already exists and cannot be removed then
- append `X' to the directory name.
- - is_non_empty_file(): fix it to use POSIX `test -s'.
- - is_existing(): new function.
- - POSIX `rm -f -r': use this in `clean_up()' and `main_init()'.
- - `--macro-file': remove this unused long option.
- - `-V', `--source', `--device': move these from groff options
- to groffer options.
- - `$_TMP_DIR_SUB': remove this unused variable.
-
-2004-06-15 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.11
-
- * groffer.sh:
- - To the search of the `--apropos-*' options, add man pages with a
- subsection in their apropos output.
-
-2004-06-02 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.10
-
- * groffer.sh:
- - Remove automatic call of `ash' due to inconsistencies of
- different ash versions.
- - In the first run, add recognition of `--shell' lines in the
- groffer configuration files. To configure an external shell in
- a configuration file, a line starting with `--shell' is
- necessary.
- - list_from_cmdline(): Simplify the arguments.
- - As $POSIXLY_CORRECT is internally set to `y' by some GNU
- `/bin/sh' shells the following 2 fixes are necessary:
- -- `sed': Empty patterns are not allowed with $POSIXLY_CORRECT
- set; so move the address information before the `s' command to the
- pattern after the command, and write `.*' to the address field.
- -- list_from_cmdline(): Remove the strange $POSIXLY_CORRECT style
- to finish the option processing after the first non-option
- argument; use the flexible GNU mixing of options and file names
- instead.
-
- * groffer.man:
- - Remove any hints on `ash'.
- - Add minus line behavior of `--shell' for configuration and add a
- corresponding example.
- - Update the information on $POSIXLY_CORRECT.
-
-2004-05-29 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.9
-
- * groffer.sh:
- Fix first run section to allow the starting shell to go on if
- `ash' is not available.
-
- * groffer.man:
- Remove unnecessary information on groffer version.
-
-2004-05-12 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.8
-
- * groffer.sh:
- Fix problems of `test' by adding subs to arguments.
-
- * groffer.man:
- Write the file license as macros that are called in sections
- AUTHOR and COPYING.
-
- * .cvsignore:
- Restore this file.
-
-2004-04-30 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.7
-
- * groffer.sh:
- - obj(), obj_data(), obj_from_output(), obj_set(): New object
- oriented functions to minimize complicated `eval' commands.
- - list_*(): Corrections.
- - usage(): Streamlining.
-
- * groffer.man, README_SH:
- Corrections.
-
-2004-04-27 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.6
-
- This version replaces the license of all files except ChangeLog of
- the groffer source to the GNU General Public License (GPL) of the
- version described in files COPYING and LICENSE in the groff top
- source directory.
-
- * groffer.man:
- Changement from the GNU Free Documentation License (FDL) to
- the GNU General Public License (GPL).
-
- * README, README_SH, TODO:
- Add license GNU General Public License (GPL).
-
- * Makefile.sub, groffer.sh:
- Keep the GNU General Public License (GPL), but refer to the
- COPYING and LICENSE files.
-
- * ChangeLog: Add a license in the style of Emacs ChangeLog file,
- which is weaker than the GPL, but has its flavor.
-
-2004-04-24 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.5
-
- This version is a rewrite of groffer in many parts, but it is kept
- in the old single script style.
-
- Overview of new options:
- --text, --mode text, --tty-viewer,
- --X, --mode X, --X-viewer, --html, --mode html, --html-view,
- --apropos-data, --apropos-devel, --apropos-progs
-
- New file:
- <groffer-source>/README_SH
-
-
- ******* Extension of the `apropos' handling
-
- The output of man's `apropos' has grown immensely meanwhile, so it
- has become inefficient. Now `groffer' provides new options to get
- the a selected information from this output.
-
- * groffer.sh:
- `--apropos-progs': new option for displaying only information
- on programs (man page sections 1, 6, and 8)
- `--apropos-data': new option for displaying only information
- on documented data (man page sections 4, 5 and 7)
- `--apropos-devel': new option for displaying only information
- on development documentation (man page sections 2, 3 and 9)
- `--apropos': still displays just the output of man's `apropos'
- program.
- - Specify all of these options as a single argument option; that
- makes groffer's `--apropos' option slightly different because
- the corresponding `man' option does not have arguments, but takes
- all file arguments as apropos targets. So just ignore the `man'
- options `-k' and `--apropos' in the parsing of $MANOPT.
- - Exit after processing one `apropos' call.
-
-
- ******* Quasi object oriented function arguments
-
- An object is the name of an environment variable. The value of
- this variable contains the object's content. This allows to
- specify function arguments and the calling syntax in a simpler way
- by letting the first argument be a variable name, usable for input
- or output.
-
- Such an object type is `list', the string value of a shell
- variable arranged in space-separated single-quoted elements, such
- as $GROFFER_OPT internally.
-
- * groffer.sh:
- - Remove list_from_args(), list_element_from_arg()
- list_from_lists(), list_length(), and list_prepend().
- They can be replaced by list_append().
- - All list*() functions are rearranged such that the first
- argument is a list object, the name of a variable.
-
-
- ******* Simplification of configuration files
-
- The new syntax of the groffer configuration files is
- - all lines starting with a `-' character are interpreted as
- command line options for all calls of groffer; they are collected
- and prepended to the actual value of $GROFFER_OPT; optional
- spaces at the beginning.of the line are omitted.
- - all other lines are interpreted as a shell command and executed
- in the current shell of the groffer call.
-
- Precedence:
- - The command line and the external environment variables such as
- $GROFFER_OPT of the groffer call have the highest precedence.
- - This is overwritten by the configuration file in the user's home
- directory.
- - The system configuration file in /etc has the lowest
- precedence.
-
- * groffer.sh:
- The configuration files are now called after the determination of
- the temporary files in main_init().
-
-
- ******* Script file name
-
- The file name of the script is needed for the several calls during
- the search for the optimal shell.
-
- * groffer.sh:
- - $_GROFFER_SH: replace $_this by $_GROFFER_SH and use $0 for
- determining the file name of the script for the following calls,
- instead of the cumbersome @BINDIR@ construction.
- - Force the script to be called as an executable file, so $0 must
- contain the program name.
-
-
- ******* Improved temporary file names
-
- Just like groff, groffer mixes all file parameters into a single
- output file. Its name is now constructed as a comma-separated
- list built from the file name arguments without a leading comma.
- So a leading comma can be used for the internal temporary file
- names.
-
- * groffer.sh:
- - $_OUTPUT_FILE_NAME: new global variable as basis for the output
- file name; it is set in main_set_resources().
- - tmp_create(): use `,name' for temporary files different from
- output file because the output file name does not start with a
- comma. `$$' is not needed anymore.
- - main_display(): simplification of $_modefile in _do_display()
- and single display modes.
- - Add extension `.html' to output file name in html mode.
- - base_name(): correction for strange positions of `/'.
-
-
- ******* Mode fixes
-
- * groffer.sh:
- - Set the main default mode to `x' with groff's X Window viewer
- `gxditview'.
- - Allow 'x' and 'X' in `--mode' for the X Window mode; the same
- for `--x' and `X', `--x-viewer' and `--X-viewer'.
- - Make groff's `-X' equivalent to `mode X'.
- - Fix `--auto', `--mode auto', and `--default-modes'.
- - `html' mode: new mode equivalent to `www', add `konqueror' and
- `lynx' as viewers.
- - `pdf' mode: fix zoom options for pdf-viewer `xpdf' in
- main_set_resources(); in main_display() fix the display structure.
- - Set default X Window resolution to 75dpi. This is not optimal,
- but with a higher value the options and resources for some viewers
- must be optimized.
- `--text' and `--mode text': new option for text output without a
- pager.
- - `--tty-viewer': new option equivalent to `--pager'.
- - Correct the pagers for `tty' mode.
- - Fix `groff' mode in main_set_resources() and main_display().
- - Harmonize `--mode arg' with the equivalent options `--arg'.
-
-
- ******* Fixes for command line options
-
- * groffer.sh:
- - list_from_cmdline(): fix the parsing of options with arguments.
- - Rename $_OPT_TTY_DEVICE to $_OPT_TEXT_DEVICE.
- - $_OPTS_X_*: new variables for the inhereted X Window variables.
- - Improve the distribution of the command line options into
- $_OPTS_GROFFER_*, $_OPTS_GROFF_*, $_OPTS_X_*, and $_OPTS_MAN_*.
- - $_OPTS_MANOPT_*: new variables for the parsing of $MANOPT.
- - Correct $_OPTS_CMDLINE_*.
- - Remove some unused $_OPTS_*.
- - `--iconic': new option from `-iconic' of the X Window toolkit.
- - Correct `--rv' to an option without argument.
- - Minor fixes of other X Window toolkit options.
-
-
- ******* Other fixes
-
- * groffer.sh:
- - is_prog(): allow 0 arguments.
- - is_not_writable(): new function.
- - is_*(): fix trailing return codes.
- - Replace most `test' calls by is_*() functions.
- - man_setup(): due to bugs in `manpath', prefer
- manpath_set_from_path() for the determination of the man page path.
- - man_search_section(): correction of some `for' loops.
- - Remove export of external non-groffer variables.
-
-
- ******* Documentation
-
- * groffer.man:
- - Reorder the option details according to the option origin as
- groffer, groff, X, and man options.
- - Add the programming changes information mentioned above.
- - Support man pages with a dot in their name
-
- * README_SH: new file
- Move large parts of the documentation in `groffer.sh' into this
- file.
-
- * groffer.sh: usage():
- - Change the output for `--help' to standard output.
- - Restructure the information for this help output.
-
-
- ******* Removement of the author's email address
-
- Because of the extreme spam attacks, the author removed all
- occurencies of his email address in every file of the groffer
- source.
-
-2003-01-22 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.4
-
- * groffer.sh: corrections for some restrictive shells
- - Possible exit codes in actual `ash' are between 0 and 63. To
- handle even deeper restrictions, use 7 as maximal code instead
- of 255 as replacement for error -1.
- - Remove variables $_BAD2 and $_BAD3.
- - Replace `trap' argument `EXIT' by 0 and write new fuctions
- `trap_clean' and `trap_set' to handle the restrictions of `trap'
- for some shells.
- - Correct wrong $MANPATH to $_MAN_PATH in function
- `man_do_filespec'.
- - Test existence of directory before deleting it in the
- `clean_up' definitions.
- - Correct help output in `usage' (called by `--help').
-
- * TODO:
- Remove mention of `shoop' and `apropos'.
-
-2002-10-21 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.3
-
- * groffer.sh: new temporary subdirectory
- - Generate temporary subdirectory for storing temporary files
- with better names in future groffer versions (name:
- "groffer$$" in usual temporary directory).
- - Use `umask 000' for temporary files to allow cleaning up
- for everyone after a system break.
- - Change both clean_up() functions (for normal shell and
- for main_display() subshell) to handle the new subdirectory.
- - clean_up_secondary() and $_TMP_PREFIX are unnecessary now, so
- they were removed.
-
- * Makefile.sub: `sed' commands for "groffer:"
- - Remove "@g@" entry (not used in "groffer.sh").
- - Add global replace for "@BINDIR@" and "@VERSION@" for future
- usage.
-
- * TODO: think about...
- - writing part of groffer in C/C++.
- - handling several files with different macro packages.
-
-2002-10-17 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * fixes of groffer 0.9.2
-
- * groffer.sh:
- Terminate main_parse_MANOPT() if $MANOPT is empty or consists
- of space characters only.
-
- * groffer.man: some fixes in "GROFFER OPTIONS"
- - New macro ".Header_CB" for CB font in .TP headers; used for
- definition of variables in option --mode.
- - Fix some option references to refer to long options.
-
- * README:
- New file for general information on the groffer source; it is
- not installed.
-
-2002-10-14 Bernd Warken <groff-bernd.warken-72@web.de>
-
- * Makefile.sub:
- add replacement "@BINDIR@" to "$(bindir)" for "groffer:"
-
- * groffer.sh:
- Define $_this as "@BINDIR@/${_PROGRAM_NAME}" to save the right
- installation position of groffer for the special shell calling.
-
- * groffer.man:
- Remove double definition of filespec parameters.
-
-2002-10-13 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.2
-
- * groffer.sh: fixes
- - Fix some 'sed' functions: two in func_stack_dump(), one in
- base_name(), add 'sed' command in list_from_cmdline().
- - Finish main_parse_MANOPT() if $MANOPT is empty.
- - Sort $_OPTS_GROFF_SHORT_NA like groff short options (but
- unchanged).
- - Fix some comments.
-
- * groffer.man: make it more readable (but no additions)
- - A shortened section "SYNOPSIS" is followed by a simplified
- section "DESCRIPTION".
- - The options from "SYNOPSIS" go to new section "OPTION
- OVERVIEW" with all groffer options in a single subsection.
- - The details of all groffer options are described in section
- "GROFFER OPTIONS".
- - New macro for file names ".File_name".
- - "Option Parsing" is moved to section "COMPATIBILITY".
- - Fix some "EXAMPLES".
-
-2002-09-30 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.1
-
- * TODO: remove done entries
- - Remove request for different shells.
- - Remove the 'sed' complaints.
-
-2002-07-15 Bernd Warken <groff-bernd.warken-72@web.de>
-
- * groffer.sh: replace `sed' interface by direct `sed'
- - This improves the performance of the shell programming parts
- and shortens the groffer script by about 5%.
- - Remove functions: string_del_append(), string_del_leading(),
- string_del_trailing(), string_flatten(), string_get_before(),
- string_get_leading(), string_replace_all(), string_sed_s(),
- and their auxiliary functions.
- - Replace all calls of these functions by direct `sed' commands.
- - Define variables for special characters to ease `sed' calls.
- - Remove `$APPEND'.
- - Restrict list_from_string() to single character separators.
- - Correct list_check() and base_name().
- - Add comments to all calls of `sed'.
-
- * groffer.sh: add run-time support for several shells
- - New option `--shell': stop execution and rerun groffer under
- the shell specified in the argument of `--shell'.
- - If no shell was specified at run-time, `ash' is tried first;
- if `ash' is not available continue with the shell with which
- groffer was called from the command line, or with the shell
- name in the first line of the script, actually `/bin/sh'.
-
-2002-07-12 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * fixes for groffer 0.9.0
-
- * groffer.sh: enhance version information
- `groffer -v|--version' now print:
- - groffer's version number and date
- - the string `is part of '
- - groff's version information (version number and copyright),
- but not groff's `called subprograms' information.
-
- * groffer.sh: minor fixes
- - Fix the argument parser to process argument `-' correctly.
- - Some display programs have trouble with empty input; feed a
- line consisting of a single space character in this case for
- all display modes (not for source or groff modes).
-
- * TODO:
- fix entry `shoop' (not 'shopt').
-
-2002-06-28 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.9.0
-
- * groffer.sh: new mode `pdf'
- - PDF (Portable Document Format):
- -> Transform groff `ps' output into pdf using `gs'.
- -> Pro: PDF viewers provide text searching (!).
- -> Con: the transformation is quite slow.
- -> Not suitable as an auto mode.
- - New options `--pdf', `--pdf-viewer', `--mode pdf'.
- - Standard pdf viewers `xpdf' and `acroread'.
- - For `xpdf', choose zoom `z 3' for 100 dpi, `z 2' for 75 dpi.
-
- * groffer.sh: support bzip2 decompression
- - add test for `bzip2' with necessary options
- - extend functions `catz()' and `save_stdin()'.
-
- * TODO
- remove entry on `bzip' decompression (done).
-
- * groffer.man:
- - Document new `pdf' features.
- - Document new `bzip2' decompression.
- - Fix documentation for `--auto-modes'.
-
- * groffer.sh: minor fixes
- - Improve device tests in `tty' and `dvi' modes.
- - Internally, map mode `auto' to '' to facilitate tests.
- - Fix auto mode sequence to: `ps,x,tty' as was intended.
-
-2002-06-25 Bernd Warken <groff-bernd.warken-72@web.de>
-
- * groffer.sh:
- Fix `source' mode.
-
- * groffer.man:
- Fix some indentations.
-
-2002-06-23 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.8
-
- * Makefile.sub: add copyright section
-
- * groffer.man:
- - Document the new options.
- - Revise the documentation of the modes.
- - Document the configuration files in new section `FILES'.
- - Redesign section `EXAMPLES'.
- - Remove documentation for `-W'.
-
- * groffer.sh: new debugging features
- - Disabled by default; enabled by environment variables.
- - Add landmark() to catch typos with quotes.
- - Add a function call stack for suitable functions; implemented
- as within the argument checker func_check().
- - This implies the need to provide `return' with some clean-up
- facility; implemented as `eval "$_return_..."'.
- - Add option `--debug' to enable debugging at run-time.
- - Actually, the groffer script uses only shell builtins found
- in `ash' (a subset of POSIX) and POSIX `sed' as the only
- external shell utility.
-
- * groffer.sh: customization of viewers
- - In `groff' mode, the groffer viewing facilities are disabled.
- - The postprocessor option `-P' costumizes the viewer only in
- some situations in the `groff' mode, so a new infrastructure
- for viewer customization is necessary.
- - Allow to specify arguments to the viewer programs specified
- in `--*-viewer()'.
- - Implement some of the essential X Toolkit resource options in
- groffer, but with use a leading double minus.
- -> `--bd': set border color.
- -> `--bg', `--background': set background color.
- -> `--bw': set border width.
- -> `--display': set X display.
- -> `--geometry': set size and position of viewer window.
- -> `--fg', `--foreground': set foreground color.
- -> `--ft', `--font': set font.
- -> `--resolution': set X resolution in dpi.
- -> `--title': set viewer window title.
- -> `--xrm': set X resource.
- - Remove misnamed option `--xrdb'.
-
- * groffer.sh: new mode structure
- - New Postcript mode `ps' (`--ps'):
- -> default viewers: gv,ghostview,gs_x11,gs;
- -> `--ps-viewer' sets the Postscript viewer.
- - New mode `www' (`--www') for displaying in a web browser:
- -> default browsers: mozilla,netscape,opera,amaya,arena;
- -> `--www-viewer' sets the web browser.
- - New dvi mode (`--dvi'); default viewer `xdvi':
- -> default viewers: xdvi,dvilx;
- -> `--dvi-viewer' sets the dvi viewer.
- - New mode `auto':
- -> active if no other mode is given or by new option `--auto';
- -> selects from a sequence of modes that are tested until one
- of them succeeds.
- -> the default mode sequence is actually `ps', `x', `tty'.
- -> `--default-modes' sets this mode sequence as a comma
- separated string of program names, optionally each one
- with arguments).
- - New mode `groff':
- -> process input like groff, ignore viewing options.
- -> activated by new option `--groff'.
- -> automatically active with one of `-V', `-X', `-Z'.
- - Revise `tty' mode:
- -> allow several text devices.
- ->
- - Reorganize the mode management:
- -> new mode setting option `--mode'.
- -> logically separate source, groff, and display modes.
- -> intermediate output mode is now part of mode groff; remove
- any special features around `-Z'.
- - Update usage() to reflect the new option structure.
-
- * groffer.sh: add configuration files
- - `/etc/groff/groffer.conf' system-wide configuration.
- - `${HOME}/.groff/groffer.conf' user configuration.
- - The configuration file are shell scripts for now; later
- implementations can identify this from the `#! /bin/sh' line.
-
- * groffer.sh: new data structure `list':
- - Implement a `list' data structure as a string consisting of
- single-quoted elements, separated by a space character;
- embedded single-quotes are escaped.
-
- * groffer.sh: new option parser based on `list':
- - Write new option parser based on `list', compatible to both
- POSIX getopts() and GNU getopt().
- - Long options are now available on GNU and non-GNU systems.
- - Get rid of POSIX getopts() and GNU getopt().
- - the `-W--longopt' construct is now obsolete; remove it.
- - add test/function for `unset'.
- - Option strings are now implemented as `list's in order to
- allow unusual characters in options.
- - Parse $MANOPT first; translate essential arguments into
- groffer options.
-
- * groffer.man:
- - determine prompt length for `.Shell_cmd'* dynamically.
- - naming scheme for static strings and registers changed to
- `namespace:macro.variable'.
-
-
-2002-06-16 Werner Lemberg <wl@gnu.org>
-
- * groffer.sh:
- Implement man option `--ascii' by `-mtty-char'.
-
-
-2002-05-31 Werner LEMBERG <wl@gnu.org>
-
- * groffer.man (@.Shell_cmd_width):
- Increase to 4m (we use `sh#' as the prompt).
-
-
-2002-05-31 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.7
-
- * groffer.sh: remove incompatibilities with the `ash' shell:
- - do not use `!command':
- -> use `else'
- -> write `_not_' equivalents for some functions
- - do not use `[^]' in `case':
- -> restructure some functions.
- - only single-character names for loop variables:
- -> spoils the paradigm of leading `_' for local variables.
- - spurious trouble with `for i in ${var}':
- -> use `eval set -- ${var}' and `for i in "$@"'
- - do not change or use $IFS:
- -> define new functions string_split() and `path_split()'.
- -> result must be processed by `eval set --'.
- -> solve conflicts with existing positional parameters.
- - trouble with exporting external `$GROFF_*' variables:
- -> hope that they were exported in the calling shell.
- - not smart about additional blanks:
- -> remove unnecessary white space.
-
- * groffer.sh: improve run-time speed:
- - `ash' more than doubles the speed of `bash'.
- - speed-up `man_setup()'.
-
-
-2002-05-30 Werner Lemberg <wl@gnu.org>
-
- * groffer.man:
- - remove some wrong `\:'.
- - rename macro names that start with a `[' (clashes with refer).
- - fix TP_header.
-
-
-2002-05-28 Bernd Warken <groff-bernd.warken-72@web.de>
- ________________________________________________________________
- * release of groffer 0.6
-
- This is almost a complete rewrite since groffer 0.5 .
- ________________________________________________________________
- * Documentation
-
- * groffer.man:
- - Apply the changes done in www.tmac (.URL and .MTO)
- - Replace \fP by \f[].
- - Redesign and rewrite most macros.
- - Include the documentation for the new features.
- - Greatly enlarge section ENVIRONMENT
- - Add examples.
-
- * TODO:
- - Start a TODO file with several sections.
-
- * ChangeLog:
- Due to the many changes, shorten and rearrange the entries
- since groffer 0.5 .
- ________________________________________________________________
- * Shell compatibility
-
- * groffer.sh:
- - Due to possible conflicts in old BSD versions, `[]' was
- replaced by `test'; the `test' options `-a' and `-o' were
- replaced by multiple calls of `test'.
- - Write interface to the `sed' command `s' to become
- independent of the delimiter character. Rewrite all text
- manipulating function to use this new scheme. The new
- functions are named `string_*'.
- - `tr' is not needed any longer, replaced by `sed'.
- - `grep' is not needed any longer, mostly replaced by `case'.
- - Revision of test for `getopt'.
- - Remove `set -a'; explicitly export variables.
- - The only external programs used are POSIX `sed' and the
- fallback to `apropos'. All other program calls were
- replaced by shell builtins and functions.
-
- ________________________________________________________________
- * Cosmetics
-
- * groffer.sh:
- - Implement a prefix based naming scheme for local variables
- and functions (OOP-like).
- - Introduce variables for white space (better readability with
- $IFS).
- - Store the names of the processed filespecs into a variable
- instead of a temporary file.
- - Error-prone shell constructions were replaced by functions
- with a simple interface.
- - To avoid too long pipes, replace supercat() by do_fileargs();
- every input file is handled independently.
-
- ________________________________________________________________
- * New features:
- - Add support for more X devices (e.g. X75-12 and X100-12).
- - Add long option `--intermediate_output' to `-Z'.
- - Make the options for mode selection clobber each other.
- - Add option `--mode' with an argument having the following
- values:
- `X': force displaying in X, same as options `-X';
- `tty': display with a pager on text terminal; same as `--tty';
- `source', `default', `auto', etc.
- - Make the handling of the X mode like in groff (e.g. -X -Tps).
- - Make resolution for gxditview behave like groff (default
- 75 dpi).
- - Add environment variable $GROFFER_OPT to preset groffer
- options.
-
- ________________________________________________________________
- * implement most of the functionality of GNU `man'.
-
- - Add all `man' long options to groffer.
- - Add all `man' environment variables.
- - Parse and use content of `$MANOPT'.
- - The precedence of the options and environment variables
- is regulated like in GNU `man'.
- - Force the option `--manpath' to have a colon-separated
- argument like GNU `man'.
- - Support `man section name' calling convention.
- - Remove all dependencies on `man -w'.
-
- * groffer.sh:
- - Add the new features above.
- - Rewrite the search algorithm for man pages.
- - Remove searching with `man -w' (problems with space
- characters in file names).
- - Fix and complement usage().
- - The filespec parsers gets a function of its own do_manpage().
-
-
-2002-01-08 Bernd Warken <groff-bernd.warken-72@web.de>
-
- * groffer 0.5 (beta) released
-
- * groffer.man:
- - Fix hyphenation problems with macros describing options.
- - Fix the handling of some `-' characters.
- - Examples of shell commands now print in font CR instead of CB.
- - Remove documentation for option `-X'.
- - Add documentation for option `--dpi'.
-
- * groffer.sh:
- - New method for creating temporary files, based on process
- IDs. This is reliable enough and suitable for GNU and POSIX.
- - Run gxditview in a new shell instantiation for having a clean
- handling of the temporary files when running in the
- background.
- - Revision of the retrieving method for the window title.
- - Empty input is now tolerated.
- - Export the variables that are set before the call of `set -a'.
- - Function usage() corrected and updated.
- - Unnecessary stuff removed.
- - Comments adjusted.
- - Pass option `-X' to groff, i.e. force X output with 75 dpi.
- - Implement option `--dpi' for setting the resolution for the X
- viewer, which had already been documented in earlier versions.
-
-2002-01-07 Bernd Warken <groff-bernd.warken-72@web.de>
-
- * groffer 0.4 (beta) released (as groff `contrib')
-
- * groffer.man:
- - New features documented.
- - Macros stream-lined.
- - Section EXAMPLES added.
-
- * groffer.sh:
- - System tests added/optimized.
- - Speed/memory optimizations by defining some shell functions
- alternatively depending on the text results.
- - Use `gzip' for decompression instead of `zcat'.
- - Signal handling added for clean exiting by `trap'.
- - Temporary files exist only as long as necessary.
- - Setup of path for man-pages moved after the option parsing.
- - Fixed a bug in determining the path for man-pages.
- - Fixed a bug in the handling of non-groffer options.
-
- * New features:
- - New option --tty for forcing paging on text terminal.
- - New option --no-man for disabling the man-page feature.
- - Implement reserved POSIX -W feature to simulate long options.
- - gxditview is now run as a background process.
-
-2002-01-05 Werner LEMBERG <wl@gnu.org>
-
- * Integrate groffer into groff's `contrib' tree.
-
- * Makefile: Replaced by...
- Makefile.sub: New file.
-
- * groffer: Replaced by...
- groffer.sh: New file.
-
- * groffer.man (OptDef): Add missing backslashes.
- Update copyright.
-
-2001-12-15 Bernd Warken <groff-bernd.warken-72@web.de>
-
- * groffer 0.3 (alpha) released (still stand-alone package).
-
- * GNU and POSIX are supported (POSIX without long options).
-
- * New options : --man, --mandb, --title, --xrdb
-
- * Support for command line arguments with embedded single space
- characters (GNU only) .
-
- * Several search methods for man-pages when no `man -w' is
- available ($MANPATH, mandb, a default path).
-
- * Language support for man-pages.
-
- * Recognize the following filespecs as man-page parameters:
- man:name(section), man:name, name.section, name.
-
-2001-12-03 Bernd Warken <groff-bernd.warken-72@web.de>
-
- * Stand-alone package for groffer 0.2 (alpha) created
- Files: groffer, groffer.man, Makefile, TODO, ChangeLog
-
-2001-12-02 Bernd Warken <groff-bernd.warken-72@web.de>
-
- * groffer 0.2 (alpha) program released.
-
- * Name changed from `groffview' to `groffer'.
-
- * Comments added.
-
- * Name changed from `groffview' to `groffer'.
-
- * Options harmonized with groff.
- New options : -Q --source, -T --device, -X .
- Other options known from groff are passed unchanged.
-
- * 100 dpi as default, 75 dpi only in emergency situations.
-
- * Bugs with temporary files fixed.
-
- * Code restructured and comments added.
-
-2001-11-28 Bernd Warken <groff-bernd.warken-72@web.de>
-
- ***** groffview 0.1 (experimental) and groffview.man released
- (predecessor of groffer, shell script)
-
- * Options : -h --help, -v --version
-
- * Search for man-pages based on $MANPATH
-
- * development of `groffview' shell script started
-
-2001-11-28 Bernd Warken <groff-bernd.warken-72@web.de>
-
- ________________________________________________________________
- License
-
- Copyright (C) 2001,2002,2003,2004,2005,2006
- Free Software Foundation, Inc.
- Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
- Copying and distribution of this file, with or without
- modification, are permitted provided the copyright notice and this
- notice are preserved.
-
- This file is part of `groffer', which is part of the `groff'
- project.
-
-
- Emacs settings
-
- Local Variables:
- mode: change-log
- End:
diff --git a/contrib/groffer/shell/README_SH b/contrib/groffer/shell/README_SH
deleted file mode 100644
index 8047222b..00000000
--- a/contrib/groffer/shell/README_SH
+++ /dev/null
@@ -1,297 +0,0 @@
-README_SH
-
-Special description for the shell version of `groffer'
-
-
-The files related to the shell version are
-
-shell/groffer.sh starting script of groffer
-shell/groffer2.sh main script of groffer
-shell/groffer.man manual page of groffer
-shell/README_SH description of the shell version of the program
-shell/ChangeLog.0 information on all changements of groffer versions 0.*
-version.sh script that handles the version information
-
-
-Scripts
-
-The shell version of `groffer' contains two files, `groffer.sh' and
-`groffer2.sh'.
-
-`groffer.sh' is a short introductory script without any functions. I
-can be run with a very poor Bourne shell. It just contains some basic
-variables, the reading of the configuration files, and the
-determination of the shell for `groffer2.sh'. This script is
-transformed by `make' into `groffer' which will be installed into
-@bindir@, which is usually /usr/local/bin.
-
-`groffer2.sh' is a long main script with all functions; it is called
-by `groffer.sh' (`groffer' after installation). It is installed
-unchanged into @libdir@/groff/groffer, which is usually
-/usr/local/lib/groff/groffer. This script can be called with a
-different shell, using the `groffer' option `--shell'.
-
-
-Options
-
-The `groffer' script provides its own option parser. It is compatible
-to the usual GNU style command line This includes long option names
-with two signs such as `--option', clusters of short options, the
-mixing of options and non-option file names, the option `--' to close
-the option handling, and it is possible to abbreviate the long option
-names. The abbreviation of long options is enhanced by letting each
-internal `-' sign generate a new center of abbreviation. So each
-command line argument starting with `--' can represent a multiple set
-of abbreviations.
-
-The flexible mixing of options and file names in GNU style is always
-possible, even if the environment variable `$POSIXLY_CORRECT' is set
-to a non-empty value. This disables the rather wicked POSIX behavior
-to terminate option parsing when the first non-option command line
-argument is found.
-
-
-Error Handling
-
-Error handling and exit behavior is complicated by the fact that
-`exit' can only escape from the current shell; trouble occurs in
-subshells. This was solved by adding a temporary error file that is
-tested by function exit_test() and by replacing `var=$(...)' by
-function obj_from_output().
-
-
-Function Definitions in `groffer2.sh'
-
-Each function in groffer2.sh has a description that starts with the
-function name and symbols for its arguments in parentheses `()'. Each
-`<>' construction gives an argument name that just gives a hint on
-what the argument is meant to be; these argument names are otherwise
-irrelevant. The `>' sign can be followed by another character that
-shows how many of these arguments are possible.
-
-<arg> exactly 1 of this argument
-<arg>? 0 or 1 of these arguments
-<arg>* arbitrarily many such arguments, incl. none
-<arg>+ one or more such arguments
-<arg>... one or more such arguments
-[...] optional arguments
-
-A function that starts with an underscore `_' is an internal function
-for some other function. The internal functions are defined just
-after their corresponding function.
-
-
-External Environment Variables
-
-The groffer.sh script uses the following external system variables.
-It is supposed that these variables are already exported outside of
-groffer.sh; otherwise they do not have a value within the script.
-
-external system environment variables that are explicitly used
-$DISPLAY: Presets the X display.
-$LANG: For language specific man pages.
-$LC_ALL: For language specific man pages.
-$LC_MESSAGES: For language specific man pages.
-$PAGER: Paging program for tty mode.
-$PATH: Path for the programs called (`:' separated list).
-
-groffer native environment variables
-$GROFFER_OPT preset options for groffer.
-
-all groff environment variables are used, see groff(1)
-$GROFF_BIN_PATH: Path for all groff programs.
-$GROFF_COMMAND_PREFIX: '' (normally) or 'g' (several troffs).
-$GROFF_FONT_PATH: Path to non-default groff fonts.
-$GROFF_TMAC_PATH: Path to non-default groff macro files.
-$GROFF_TMPDIR: Directory for groff temporary files.
-$GROFF_TYPESETTER: Preset default device.
-
-all GNU man environment variables are used, see man(1).
-$MANOPT: Preset options for man pages.
-$MANPATH: Search path for man pages (: list).
-$MANROFFSEQ: Ignored because of grog guessing.
-$MANSECT: Search man pages only in sections (:).
-$SYSTEM: Man pages for different OS's (, list).
-
-
-Object-oriented Functions
-
-The groffer script provides an object-oriented construction (OOP). In
-object-oriented terminology, a type of object is called a `class'; a
-function that handles objects from a class is named `method'.
-
-In the groffer script, the object is a variable name whose content is
-the object's data. Methods are functions that have an object as first
-argument.
-
-The basic functions for object handling are obj_*().
-
-The class `list' represents an array structure, see list_*().
-
-
-Speed
-
-The major speed gain is the disabling of all debug features. This is
-the default for the installed version of `groffer'. Before the run of
-`make', the debug feature of $_DEBUG_FUNC_CHECK, corresponding to
-option --debug-func, is enabled by default. The resulting heavy
-slowing down should be regarded as a temporary feature.
-
-Another increase of speed was the replacement of the many `ls' calls
-by analysing a `find' of manpath with `grep'.
-
-
-Shell Compatibility
-
-The `groffer' shell scripts are compatible to both the GNU and the
-POSIX shell and utilities. Care was taken to restrict the programming
-technics used here in order to achieve POSIX compatibility as far back
-as POSIX P1003.2 Draft 11.2 of September 1991. This draft is
-available at http://www.funet.fi/pub/doc/posix/p1003.2/d11.2 on the
-Internet.
-
-The POSIX draft does not include `local' variables for functions. So
-this concept was replaced by global variables with a prefix that
-differs for each function. The prefix is chosen from the function
-name. These quasi-local variables are unset before each return of the
-function.
-
-For shell compatibility, see also Autobook, chapter 22.
-
-The `groffer' scripts were tested under the shells `ash', `bash',
-`bash-minimal', `dash', 'ksh', `mksh', `pdksh', 'posh', and `zsh'
-without problems in Linux Debian. A shell can be tested by the
-`groffer' option `--shell', but that will run only with groffer2.sh.
-To start it directly from the beginning under this shell the following
-command can be used.
-
- <shell-name> groffer.sh --shell=<shell-name> <argument>...
-
-
-Some shells are not fully POSIX compatible. For them the following
-restrictions were done. For more information look at the
-documentation `Portable shells' in the `info' page of `autoconf'
-(look-up in Emacs-Help-Manuals_Info).
-
-- The command parts `then', `else', and `do' must be written each on a
- line of their own.
-
-- Replace `for i in "$@"' by `for i' and remove internal `;' (kah).
-
-- Replace `set -- ...' by `set x ...; shift'. After the first
- non-option argument, all arguments including those starting with `-'
- are accepted as non-option. For variables or `$()' constructs with
- line-breaks, use `eval set' without quotes. That transforms a
- line-break within a variable to a space.
-
-- The name of the variable in `for' is chosen as a single character
- (old ash). The content of such variables is not safe because it can
- also occur in other functions. So it is often stored in an
- additional quasi-local variable.
-
-- `echo' is not portable on options; some `echo' commands have many
- options, others have none. So `echo -n' cannot be used, such that
- the output of each function has complete lines. There are two
- methods to avoid having `-' as the first character of any argument.
- Either a character such as `x' can be prepended to the argument;
- this must later on be removed by `sed'. Otherwise, `echo' can be
- replaced by `cat <<EOF'.
-
-- `ls' has problems. Old UNIX systems echoed the error message to
- standard output. So handle the output with `sed'. If the output
- contains `not found' map it to an empty string.
-
-- As `test -e' is not available in Solaris 2.5 replace it by
- `test -f || test -d'.
-
-- As `unset' is not supported by all shells replace it by `eval
- ${_UNSET}' where this variable is `unset' if it exists and `:'
- otherwise.
-
-- Some shells have problems with options in `eval'. So quoting must
- be done right to hide the options from `eval'.
-
-- In backquote calls `` avoid the backquote ` in comments.
-
-- Replace `true' by `:', `false' isn't used.
-
-- Do not redefine builtins as functions (ash).
-
-- Avoid `[^...]' in `case' patterns (ash).
-
-- `trap' does not allow error code 127.
-
-The scripts call the following commands with all options used:
-.
-:
-apropos
-break
-bzip2 -c -d -t
-cat
-catz
-cd
-continue
-echo
-eval
-expr
-grep
-groff -v
-grog -T -X -Z
-gs -c -d -f -q -s
-gzip -c -d -f
-less -r -R
-ls
-man -k --apropos
-mkdir
-mv
-pwd
-return
-rm -f -r
-rmdir
-sed -e -n
-set -e
-sh -c
-shift
-test -c -d -f -r -s -w -x
-trap
-umask
-unset
-
-
-Bugs
-
-If the `groffer' run is interrupted by Crtl-C the clean up is not done
-by all shells. The `trap' commands work for the shells `bash',
-`bash-minimal', and 'ksh'; they do not work for `ash', `dash',
-`pdksh', `posh', and `zsh'.
-
-
-####### License
-
-Last update: 7 Feb 2011
-
-Copyright (C) 2003-2006, 2009, 2011
- Free Software Foundation, Inc.
-Written by Bernd Warken <groff-bernd.warken-72@web.de>
-
-This file is part of `groffer', which 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 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/>.
-
-
-####### Emacs settings
-
-Local Variables:
-mode: text
-End:
diff --git a/contrib/groffer/shell/groffer.man b/contrib/groffer/shell/groffer.man
deleted file mode 100644
index ec0a7825..00000000
--- a/contrib/groffer/shell/groffer.man
+++ /dev/null
@@ -1,4124 +0,0 @@
-.TH GROFFER @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@"
-.SH NAME
-groffer \- display groff files and man\~pages on X and tty
-.
-.SH "SYNOPSIS"
-.\" The .SH was moved to this place in order to appease `apropos'.
-.
-.\" --------------------------------------------------------------------
-.\" Legalese
-.\" --------------------------------------------------------------------
-.
-.de author
-This file was written by Bernd Warken <groff-bernd.warken-72@web.de>.
-..
-.de copyleft
-Copyright (C) 2001, 2002, 2004-2012
- Free Software Foundation, Inc.
-.
-.P
-This file is part of
-.IR \%groffer ,
-which is part of
-.IR \%groff ,
-a free software project.
-.
-You can redistribute it and/or modify it under the terms of the
-.nh
-.B GNU General Public License
-.hy
-as published by the
-.nh
-.BR "Free Software Foundation" ,
-.hy
-either version 3 of the License, or (at your option) any later version.
-.
-.P
-You should have received a copy of the \f[CR]GNU General Public
-License\f[] along with
-.IR groff ,
-see the files \%\f[CB]COPYING\f[] and \%\f[CB]LICENSE\f[] in the top
-directory of the
-.I groff
-source package.
-.
-Or read the
-.I man\~page
-.BR gpl (1).
-You can also visit
-.nh
-.B <http://www.gnu.org/licenses/>.
-.hy
-..
-.
-.\" --------------------------------------------------------------------
-.\" Setup
-.\" --------------------------------------------------------------------
-.
-.ds Ellipsis "\&.\|.\|.\&\"
-.
-.\" --------------------------------------------------------------------
-.\" Macro definitions
-.
-.\" --------------------------------------------------------------------
-.\" .CB (<text>...)
-.\"
-.\" Print in constant-width bold font.
-.\"
-.de CB
-. ft CB
-. Text \\$*
-. ft
-..
-.\" --------------------------------------------------------------------
-.\" .CI (<text>...)
-.\"
-.\" Print in constant-width italic font.
-.\"
-.de CI
-. ft CI
-. Text \\$*
-. ft
-..
-.\" --------------------------------------------------------------------
-.\" .CR (<text>...)
-.\"
-.\" Print in constant-width roman font.
-.\"
-.de CR
-. ft CR
-. Text \\$*
-. ft
-..
-.\" --------------------------------------------------------------------
-.\" .Error (<text>...)
-.\"
-.\" Print error message to terminal and abort.
-.\"
-.de Error
-. tm \\$*
-. ab
-..
-.\" --------------------------------------------------------------------
-.\" .Env_var (<env_var_name> [<punct>])
-.\"
-.\" Display an environment variable, with optional punctuation.
-.\"
-.de Env_var
-. nh
-. SM
-. Text \f[CB]\\$1\f[]\\$2
-. hy
-..
-.\" --------------------------------------------------------------------
-.\" .File_name (<path_name>)
-.\"
-.\" Display a file or directory name in CB font.
-.\"
-.de File_name
-. Header_CB \\$@
-..
-.\" --------------------------------------------------------------------
-.\" .Header_CB (<path_name>)
-.\"
-.\" Display a line in CB font, for example after .TP
-.\"
-.de Header_CB
-. nh
-. Text \f[CB]\\$1\f[]\\$2
-. hy
-..
-.\" --------------------------------------------------------------------
-.\" .Text (<text>...)
-.\"
-.\" Treat the arguments as text, no matter how they look.
-.\"
-.de Text
-. if \\n[.$]=0 \
-. return
-. nh
-. nop \)\\$*\)
-. hy
-..
-.\" --------------------------------------------------------------------
-.\" .Topic ([<indent>])
-.\"
-.\" A bulleted paragraph
-.\"
-.de Topic
-. ie \\n[.$]=0 \
-. ds @indent 2m\"
-. el \
-. ds @indent \\$1\"
-. IP \[bu] \\*[@indent]
-. rm @indent
-..
-
-.\" End of macro definitions
-.
-.
-.\" --------------------------------------------------------------------
-.\" SH "SYNOPSIS"
-.\" --------------------------------------------------------------------
-.
-.SY groffer
-.OP option \*[Ellipsis]
-.OP --
-.OP \%filespec \*[Ellipsis]
-.YS
-.
-.SY groffer
-.BR -h | --help
-.YS
-.
-.SY groffer
-.BR -v | --version
-.YS
-.
-.
-.\" --------------------------------------------------------------------
-.SH DESCRIPTION
-.\" --------------------------------------------------------------------
-.
-The
-.B \%groffer
-program is the easiest way to use
-.BR \%groff (@MAN1EXT@).
-It can display arbitrary documents written in the
-.I \%groff
-language, see
-.BR \%groff (@MAN7EXT@),
-or other
-.I \%roff
-languages, see
-.BR \%roff (@MAN7EXT@),
-that are compatible to the original
-.I \%troff
-language.
-.
-It finds and runs all necessary
-.I groff
-preprocessors, such as
-.BR @g@chem .
-.
-.
-.P
-The
-.B \%groffer
-program also includes many of the features for finding and displaying
-the \%\f[CR]Unix\f[] manual pages
-.nh
-.RI ( man\~pages ),
-.hy
-such that it can be used as a replacement for a
-.BR \%man (1)
-program.
-.
-Moreover, compressed files that can be handled by
-.BR \%gzip (1)
-or
-.BR \%bzip2 (1)
-are decompressed on-the-fly.
-.
-.
-.P
-The normal usage is quite simple by supplying a file name or name of a
-.I \%man\~page
-without further options.
-.
-But the option handling has many possibilities for creating special
-behaviors.
-.
-This can be done either in configuration files, with the shell
-environment variable
-.Env_var \%$GROFFER_OPT ,
-or on the command line.
-.
-.
-.P
-The output can be generated and viewed in several different ways
-available for
-.IR \%groff .
-.
-This includes the
-.I \%groff
-native \%\f[CR]X\~Window\f[] viewer
-.BR \%gxditview (@MAN1EXT@),
-each
-.IR \%Postcript ,
-.IR \%pdf ,
-or
-.I \%dvi
-display program, a web browser by generating
-.I \%html
-in
-.IR \%www\~mode ,
-or several
-.I \%text\~modes
-in text terminals.
-.
-.
-.P
-Most of the options that must be named when running
-.B \%groff
-directly are determined automatically for
-.BR \%groffer ,
-due to the internal usage of the
-.BR \%grog (@MAN1EXT@)
-program.
-.
-But all parts can also be controlled manually by arguments.
-.
-.
-.P
-Several file names can be specified on the command line arguments.
-.
-They are transformed into a single document in the normal way of
-.BR \%groff .
-.
-.
-.P
-Option handling is done in \f[CR]GNU\f[] style.
-.
-Options and file names can be mixed freely.
-.
-The option
-.RB ` \-\- '
-closes the option handling, all following arguments are treated as
-file names.
-.
-Long options can be abbreviated in several ways.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "OPTION OVERVIEW"
-.\" --------------------------------------------------------------------
-.
-.TP
-.I breaking options
-.RS
-.P
-.SY
-.OP -h\~\fR|\fB\~--help
-.OP -v\~\fR|\fB\~--version
-.YS
-.RE
-.
-.
-.TP
-.I \%groffer mode options
-.RS
-.P
-.SY
-.OP --auto
-.OP --default
-.OP --default\-modes mode1,mode2,\*[Ellipsis]
-.OP --dvi
-.OP --dvi\-viewer prog
-.OP --groff
-.OP --html
-.OP --html\-viewer prog
-.OP --mode display_mode
-.OP --pdf
-.OP --pdf\-viewer prog
-.OP --ps
-.OP --ps\-viewer prog
-.OP --source
-.OP --text
-.OP --to\-stdout
-.OP --tty
-.OP --tty\-viewer prog
-.OP --www
-.OP --www\-viewer prog
-.OP --x\~\fR|\fB\~--X
-.OP --x\-viewer\~\fR|\fB\~--X\-viewer prog
-.YS
-.RE
-.
-.
-.TP
-.I options related to \%groff
-.RS
-.P
-.SY
-.OP -T\~\fR|\fB\~--device device
-.OP -Z\~\fR|\fB\~--intermediate\-output\~\fR|\fB\~--ditroff
-.YS
-.P
-All further
-.B \%groff
-short options are accepted.
-.RE
-.
-.
-.TP
-.I options for man\~pages
-.RS
-.P
-.SY
-.OP --apropos
-.OP --apropos\-data
-.OP --apropos\-devel
-.OP --apropos\-progs
-.OP --man
-.OP --no\-man
-.OP --no\-special
-.OP --whatis
-.YS
-.RE
-.
-.
-.TP
-.I long options taken over from GNU man
-.RS
-.P
-.SY
-.OP --all
-.OP --ascii
-.OP --ditroff
-.OP --extension suffix
-.OP --locale language
-.OP --local\-file
-.OP --location\~\fR|\fB\~--where
-.OP --manpath dir1:dir2:\*[Ellipsis]
-.OP --no\-location
-.OP --pager program
-.OP --sections sec1:sec2:\*[Ellipsis]
-.OP --systems sys1,sys2,\*[Ellipsis]
-.OP --troff\-device device
-.YS
-.P
-Further long options of \f[CR]GNU\f[]
-.B man
-are accepted as well.
-.RE
-.
-.
-.TP
-.I X Window Toolkit options
-.RS
-.P
-.SY
-.OP --bd\~\fR|\fB\~--bordercolor pixels
-.OP --bg\~\fR|\fB\~--background color
-.OP --bw\~\fR|\fB\~--borderwidth pixels
-.OP --display X-display
-.OP --fg\~\fR|\fB\~--foreground color
-.OP --fn\~\fR|\fB\~--ft\~\fR|\fB\~--font font_name
-.OP --geometry size_pos
-.OP --resolution value
-.OP --rv
-.OP --title string
-.OP --xrm X\-resource
-.YS
-.RE
-.
-.
-.TP
-.I options for development
-.RS
-.P
-.SY
-.OP --debug
-.OP --debug\-all
-.OP --debug\-filenames
-.OP --debug\-func
-.OP --debug\-grog
-.OP --debug\-keep
-.OP --debug\-lm
-.OP --debug\-params
-.OP --debug\-shell
-.OP --debug\-stacks
-.OP --debug\-tmpdir
-.OP --debug\-user
-.OP --do\-nothing
-.OP --print text
-.OP --shell prog
-.OP -V
-.YS
-.RE
-.
-.
-.TP
-.I \%filespec arguments
-.RS
-.P
-The
-.I \%filespec
-parameters are all arguments that are neither an option nor an option
-argument.
-.
-They usually mean a file name or a
-.I man page
-searching scheme.
-.
-.
-.P
-In the following, the term
-.I section_extension
-is used.
-.
-It means a word that consists of a
-.I man section
-that is optionally followed by an
-.IR extension .
-.
-The name of a
-.I man section
-is a single character from
-.BR \%[1-9on] ,
-the
-.I extension
-is some word.
-.
-The
-.I extension
-is mostly lacking.
-.
-.
-.P
-No
-.I \%filespec
-parameters means standard input.
-.
-.
-.TP 10m
-.B -
-stands for standard input (can occur several times).
-.
-.
-.TP
-.I filename
-the path name of an existing file.
-.
-.
-.TP
-.BI man: name ( section_extension )
-.TQ
-.BI man: name . section_extension
-.TQ
-.IB name ( section_extension )
-.TQ
-.IB name . section_extension
-.TQ
-.I "section_extension name"
-search the \%man\~page
-.I \%name
-in the section with optional extension
-.IR section_extension .
-.
-.
-.TP
-.BI man: name
-\%man\~page in the lowest
-.I \%man\~section
-that has
-.IR \%name .
-.
-.
-.TP
-.I name
-if
-.I \%name
-is not an existing file search for the man\~page
-.I \%name
-in the lowest man\~section.
-.
-.RE
-.
-.
-.\" --------------------------------------------------------------------
-.SH "OPTION DETAILS"
-.\" --------------------------------------------------------------------
-.
-The
-.B \%groffer
-program can usually be run with very few options.
-.
-But for special purposes, it supports many options.
-.
-These can be classified in 5 option classes.
-.
-.
-.P
-All short options of
-.B \%groffer
-are compatible with the short options of
-.BR \%groff (@MAN1EXT@).
-.
-All long options of
-.B \%groffer
-are compatible with the long options of
-.BR \%man (1).
-.
-.
-.P
-Arguments for long option names can be abbreviated in several ways.
-.
-First, the argument is checked whether it can be prolonged as is.
-.
-Furthermore, each minus sign
-.B -
-is considered as a starting point for a new abbreviation.
-.
-This leads to a set of multiple abbreviations for a single argument.
-.
-For example,
-.B --de\-n\-f
-can be used as an abbreviation for
-.BR --debug\-not\-func ,
-but
-.B --de\-n
-works as well.
-.
-If the abbreviation of the argument leads to several resulting options
-an error is raised.
-.
-.
-.P
-These abbreviations are only allowed in the environment variable
-.Env_var \%$GROFFER_OPT ,
-but not in the configuration files.
-.
-In configuration, all long options must be exact.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "groffer breaking Options"
-.\" --------------------------------------------------------------------
-.
-As soon as one of these options is found on the command line it is
-executed, printed to standard output, and the running
-.B \%groffer
-is terminated thereafter.
-.
-All other arguments are ignored.
-.
-.
-.TP
-.B -h\~\fR|\fB\~--help
-Print help information with a short explanation of options to
-standard output.
-.
-.
-.TP
-.B -v\~\fR|\fB\~--version
-Print version information to standard output.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "groffer Mode Options"
-.\" --------------------------------------------------------------------
-.
-The display mode and the viewer programs are determined by these
-options.
-.
-If none of these mode and viewer options is specified
-.B \%groffer
-tries to find a suitable display mode automatically.
-.
-The default modes are
-.IR "mode pdf" ,
-.IR "mode ps" ,
-.IR "mode html" ,
-.IR "mode x" ,
-and
-.I "mode dvi"
-in \%\f[CR]X\~Window\f[] with different viewers and
-.I mode tty
-with device
-.I latin1
-under
-.B less
-on a terminal; other modes are tested if the programs for the main
-default mode do not exist.
-.
-.
-.P
-In \%\f[CR]X\~Window\f[],
-many programs create their own window when called.
-.B \%groffer
-can run these viewers as an independent program in the background.
-.
-As this does not work in text mode on a terminal (tty) there must be a
-way to know which viewers are \%\f[CR]X\~Window\f[] graphical
-programs.
-.
-The
-.B \%groffer
-script has a small set of information on some viewer names.
-.
-If a viewer argument of the command\-line chooses an element that is
-kept as \%\f[CR]X\~Window\f[] program in this list it is treated as a
-viewer that can run in the background.
-.
-All other, unknown viewer calls are not run in the background.
-.
-.
-.P
-For each mode, you are free to choose whatever viewer you want.
-.
-That need not be some graphical viewer suitable for this mode.
-.
-There is a chance to view the output source; for example, the
-combination of the options
-.B --mode=ps
-and
-.B --ps\-viewer=less
-shows the content of the
-.I Postscript
-output, the source code, with the pager
-.BR less .
-.
-.
-.TP
-.B --auto
-Equivalent to
-.BR --mode=auto .
-.
-.
-.TP
-.B --default
-Reset all configuration from previously processed command line options
-to the default values.
-.
-This is useful to wipe out all former options of the configuration, in
-.Env_var \%$GROFFER_OPT ,
-and restart option processing using only the rest of the command line.
-.
-.
-.TP
-.BI --default\-modes \ mode1,mode2,\*[Ellipsis]
-Set the sequence of modes for
-.I \%auto\~mode
-to the comma separated list given in the argument.
-.
-See
-.B --mode
-for details on modes. Display in the default manner; actually, this
-means to try the modes
-.IR x ,
-.IR ps ,
-and
-.I \%tty
-in this sequence.
-.
-.
-.
-.TP
-.B --dvi
-Equivalent to
-.BR --mode=\%dvi .
-.
-.
-.TP
-.BI --dvi\-viewer \ prog
-Choose a viewer program for
-.IR \%dvi\~mode .
-.
-This can be a file name or a program to be searched in
-.Env_var $PATH .
-.
-Known \%\f[CR]X\~Window\f[]
-.I \%dvi
-viewers include
-.BR \%xdvi (1)
-and
-.BR \%dvilx (1).
-.
-In each case, arguments can be provided additionally.
-.
-.
-.TP
-.B --groff
-Equivalent to
-.BR --mode=groff .
-.
-.
-.TP
-.B --html
-Equivalent to
-.BR --mode=html .
-.
-.
-.TP
-.B --html\-viewer
-Choose a web browser program for viewing in
-.IR \%html\~mode .
-.
-It can be the path name of an executable file or a program in
-.Env_var $PATH .
-.
-In each case, arguments can be provided additionally.
-.
-.
-.TP
-.BI --mode \ value
-.
-Set the display mode.
-.
-The following mode values are recognized:
-.
-.RS
-.
-.TP
-.Header_CB auto
-Select the automatic determination of the display mode.
-.
-The sequence of modes that are tried can be set with the
-.B --default\-modes
-option.
-.
-Useful for restoring the
-.I \%default\~mode
-when a different mode was specified before.
-.
-.
-.TP
-.Header_CB dvi
-Display formatted input in a
-.I \%dvi
-viewer program.
-.
-By default, the formatted input is displayed with the
-.BR \%xdvi (1)
-program.
-.
-.
-.TP
-.Header_CB groff
-After the file determination, switch
-.B \%groffer
-to process the input like
-.BR \%groff (@MAN1EXT@)
-would do.
-.
-This disables the
-.I \%groffer
-viewing features.
-.
-.
-.TP
-.Header_CB html
-Translate the input into html format and display the result in a web
-browser program.
-.
-By default, the existence of a sequence of standard web browsers is
-tested, starting with
-.BR \%konqueror (1)
-and
-.BR \%mozilla (1).
-The text html viewer is
-.BR \%lynx (1).
-.
-.
-.TP
-.Header_CB pdf
-Display formatted input in a
-.I \%PDF
-(Portable Document Format) viewer
-program.
-.
-By default, the input is formatted by
-.B \%groff
-using the Postscript device, then it is transformed into the PDF file
-format using
-.BR \%gs (1),
-or
-.BR ps2pdf (1).
-If that's not possible, the
-.I Postscript mode (ps)
-is used instead.
-.
-Finally it is displayed using different viewer programs.
-.
-.I \%pdf
-has a big advantage because the text is displayed graphically and
-is searchable as well.
-.
-.
-.TP
-.Header_CB ps
-Display formatted input in a Postscript viewer program.
-.
-By default, the formatted input is displayed in one of many viewer
-programs.
-.
-.
-.TP
-.Header_CB text
-Format in a
-.I \%groff\~text\~mode
-and write the result to standard output without a pager or viewer
-program.
-.
-The text device,
-.I \%latin1
-by default, can be chosen with option
-.BR -T .
-.
-.
-.TP
-.Header_CB tty
-Format in a
-.I \%groff\~text\~mode
-and write the result to standard output using a text pager program,
-even when in \%\f[CR]X\~Window\f[].
-.
-.
-.TP
-.Header_CB www
-Equivalent to
-.BR --mode=html .
-.
-.
-.TP
-.Header_CB x
-Display the formatted input in a native
-.I roff
-viewer.
-.
-By default, the formatted input is displayed with the
-.BR \%gxditview (@MAN1EXT@)
-program being distributed together with
-.BR \%groff .
-But the standard \%\f[CR]X\~Window\f[] tool
-.BR \%xditview (1)
-can also be chosen with the option
-.BR --x\-viewer .
-The default resolution is
-.BR 75dpi ,
-but
-.B 100dpi
-are also possible.
-.
-The default
-.I groff
-device
-for the resolution of
-.B 75dpi
-is
-.BR X75\-12 ,
-for
-.B 100dpi
-it is
-.BR X100 .
-.
-The corresponding
-.I "groff intermediate output"
-for the actual device is generated and the result is displayed.
-.
-For a resolution of
-.BR 100dpi ,
-the default width of the geometry of the display program is chosen to
-.BR 850dpi .
-.
-.
-.TP
-.Header_CB X
-Equivalent to
-.BR --mode=x .
-.
-.
-.P
-The following modes do not use the
-.I \%groffer
-viewing features.
-.
-They are only interesting for advanced applications.
-.
-.
-.TP
-.Header_CB groff
-Generate device output with plain
-.I \%groff
-without using the special viewing features of
-.IR \%groffer .
-If no device was specified by option
-.B -T
-the
-.I \%groff
-default
-.B \%ps
-is assumed.
-.
-.
-.TP
-.Header_CB source
-Output the roff source code of the input files without further
-processing.
-.
-.
-.RE
-.
-.
-.TP
-.B --pdf
-Equivalent to
-.BR --mode=pdf .
-.
-.
-.TP
-.BI --pdf\-viewer \ prog
-Choose a viewer program for
-.IR \%pdf\~mode .
-.
-This can be a file name or a program to be searched in
-.Env_var $PATH ;
-arguments can be provided additionally.
-.
-.
-.TP
-.B --ps
-Equivalent to
-.BR --mode=ps .
-.
-.
-.TP
-.BI --ps\-viewer \ prog
-Choose a viewer program for
-.IR \%ps\~mode .
-.
-This can be a file name or a program to be searched in
-.Env_var $PATH .
-.
-Common Postscript viewers include
-.BR \%gv (1),
-.BR \%ghostview (1),
-and
-.BR \%gs (1),
-.
-In each case, arguments can be provided additionally.
-.
-.
-.TP
-.B --source
-Equivalent to
-.BR --mode=source .
-.
-.
-.TP
-.B --text
-Equivalent to
-.BR --mode=text .
-.
-.
-.TP
-.B --to\-stdout
-The file for the chosen mode is generated and its content is printed
-to standard output.
-.
-It will not be displayed in graphical mode.
-.
-.
-.TP
-.B --tty
-Equivalent to
-.BR --mode=tty .
-.
-.
-.TP
-.BI --tty\-viewer \ prog
-Choose a text pager for mode
-.IR tty .
-The standard pager is
-.BR less (1).
-This option is equivalent to
-.I man
-option
-.BR --pager=\fIprog\fP .
-The option argument can be a file name or a program to be searched in
-.Env_var $PATH ;
-arguments can be provided additionally.
-.
-.
-.TP
-.B --www
-Equivalent to
-.BR --mode=html .
-.
-.
-.TP
-.BI --www\-viewer \ prog
-Equivalent to
-.BR --html\-viewer .
-.
-.
-.TP
-.B --X\~\fR|\fB\~--x
-Equivalent to
-.BR --mode=x .
-.
-.
-.TP
-.BI --X\-viewer\~\fR|\fB\~--x\-viewer \ prog
-Choose a viewer program for
-.IR \%x\~mode .
-Suitable viewer programs are
-.BR \%gxditview (@MAN1EXT@)
-which is the default and
-.BR \%xditview (1).
-The argument can be any executable file or a program in
-.Env_var $PATH ;
-arguments can be provided additionally.
-.
-.
-.TP
-.B --
-Signals the end of option processing; all remaining arguments are
-interpreted as
-.I \%filespec
-parameters.
-.
-.
-.P
-Besides these,
-.B \%groffer
-accepts all short options that are valid for the
-.BR \%groff (@MAN1EXT@)
-program.
-.
-All
-.RB \%non- groffer
-options are sent unmodified via
-.B \%grog
-to
-.BR \%groff .
-.
-So postprocessors, macro packages, compatibility with
-.I classical
-.IR \%troff ,
-and much more can be manually specified.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Options related to groff"
-.\" --------------------------------------------------------------------
-.
-All short options of
-.B \%groffer
-are compatible with the short options of
-.BR \%groff (@MAN1EXT@).
-.
-The following of
-.B \%groff
-options have either an additional special meaning within
-.B \%groffer
-or make sense for normal usage.
-.
-.
-.P
-Because of the special outputting behavior of the
-.B \%groff
-option
-.B -Z
-.B \%groffer
-was designed to be switched into
-.IR \%groff\~mode ;
-the
-.I \%groffer
-viewing features are disabled there.
-.
-The other
-.B \%groff
-options do not switch the mode, but allow to customize the formatting
-process.
-.
-.
-.TP
-.B --a
-This generates an ascii approximation of output in the
-.IR \%text\~modes .
-.
-That could be important when the text pager has problems with control
-sequences in
-.IR "tty mode" .
-.
-.
-.TP
-.BI --m \ file
-Add
-.I \%file
-as a
-.I \%groff
-macro file.
-.
-This is useful in case it cannot be recognized automatically.
-.
-.
-.TP
-.BI --P \ opt_or_arg
-Send the argument
-.I \%opt_or_arg
-as an option or option argument to the actual
-.B \%groff
-postprocessor.
-.
-.
-.TP
-.B --T \fIdevname\fR\~\fR|\fB\~--device \fIdevname\fR
-.
-This option determines
-.BR \%groff 's
-output device.
-.
-The most important devices are the text output devices for referring
-to the different character sets, such as
-.BR \%ascii ,
-.BR \%utf8 ,
-.BR \%latin1 ,
-and others.
-.
-Each of these arguments switches
-.B \%groffer
-into a
-.I \%text\~mode
-using this device, to
-.I \%mode\~tty
-if the actual mode is not a
-.IR \%text\~mode .
-.
-The following
-.I \%devname
-arguments are mapped to the corresponding
-.B \%groffer
-.B --mode=\fIdevname\fR
-option:
-.BR \%dvi ,
-.BR \%html ,
-and
-.BR \%ps .
-All
-.B \%X*
-arguments are mapped to
-.IR \%mode\~x .
-Each other
-.I \%devname
-argument switches to
-.I \%mode\~groff
-using this device.
-.
-.
-.TP
-.B --X
-is equivalent to
-.BR "groff \-X" .
-It displays the
-.I groff intermediate output
-with
-.BR gxditview .
-As the quality is relatively bad this option is deprecated; use
-.B --X
-instead because the
-.I \%x\~mode
-uses an
-.IR X *
-device for a better display.
-.
-.
-.TP
-.B -Z\~\fR|\fB\~--intermediate-output\~\fR|\fB\~--ditroff
-Switch into
-.I \%groff\~mode
-and format the input with the
-.I \%groff intermediate output
-without postprocessing; see
-.BR \%groff_out (@MAN5EXT@).
-This is equivalent to option
-.B --ditroff
-of
-.IR \%man ,
-which can be used as well.
-.
-.
-.P
-All other
-.B \%groff
-options are supported by
-.BR \%groffer ,
-but they are just transparently transferred to
-.B \%groff
-without any intervention.
-.
-The options that are not explicitly handled by
-.B \%groffer
-are transparently passed to
-.BR \%groff .
-.
-Therefore these transparent options are not documented here, but in
-.BR \%groff (@MAN1EXT@).
-Due to the automatism in
-.BR \%groffer ,
-none of these
-.B \%groff
-options should be needed, except for advanced usage.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Options for man\~pages"
-.\" --------------------------------------------------------------------
-.
-.TP
-.B --apropos
-Start the
-.BR \%apropos (1)
-command or facility of
-.BR \%man (1)
-for searching the
-.I \%filespec
-arguments within all
-.I \%man\~page
-descriptions.
-.
-Each
-.I \%filespec
-argument is taken for search as it is;
-.I section
-specific parts are not handled, such that
-.B 7 groff
-searches for the two arguments
-.B 7
-and
-.BR groff ,
-with a large result; for the
-.I \%filespec
-.B groff.7
-nothing will be found.
-.
-The
-.I language
-locale is handled only when the called programs do support this; the
-GNU
-.B apropos
-and
-.B man \-k
-do not.
-.
-The display differs from the
-.B \%apropos
-program by the following concepts:
-.RS
-.Topic
-Construct a
-.I \%groff
-frame similar to a
-.I \%man\~page
-to the output of
-.BR \%apropos ,
-.Topic
-each
-.I \%filespec
-argument is searched on its own.
-.Topic
-The restriction by
-.B --sections
-is handled as well,
-.Topic
-wildcard characters are allowed and handled without a further option.
-.RE
-.
-.
-.TP
-.B --apropos\-data
-Show only the
-.B \%apropos
-descriptions for data documents, these are the
-.BR \%man (7)
-.IR sections\~4 ", " 5 ", and " 7 .
-.
-Direct
-.I section
-declarations are ignored, wildcards are accepted.
-.
-.
-.TP
-.B --apropos\-devel
-Show only the
-.B \%apropos
-descriptions for development documents, these are the
-.BR man (7)
-.IR sections\~2 ", " 3 ", and " 9 .
-.
-Direct
-.I section
-declarations are ignored, wildcards are accepted.
-.
-.
-.TP
-.B --apropos\-progs
-Show only the
-.B \%apropos
-descriptions for documents on programs, these are the
-.BR \%man (7)
-.IR sections\~1 ", " 6 ", and " 8 .
-.
-Direct
-.I section
-declarations are ignored, wildcards are accepted.
-.
-.
-.TP
-.B --whatis
-For each
-.I \%filespec
-argument search all
-.I \%man\~pages
-and display their description \[em] or say that it is not a
-.IR \%man\~page .
-This is written from anew, so it differs from
-.IR man 's
-.B whatis
-output by the following concepts
-.RS
-.Topic
-each retrieved file name is added,
-.Topic
-local files are handled as well,
-.Topic
-the \fIlanguage\fP and \fIsystem\fP locale is supported,
-.Topic
-the display is framed by a
-.I groff
-output format similar to a
-.IR \%man\~page ,
-.Topic
-wildcard characters are allowed without a further option.
-.RE
-.
-.
-.P
-The following options were added to
-.B \%groffer
-for choosing whether the file name arguments are interpreted as names
-for local files or as a search pattern for
-.IR \%man\~pages .
-.
-The default is looking up for local files.
-.
-.
-.TP
-.B --man
-Check the non-option command line arguments
-.nh
-.RI ( filespecs )
-.hy
-first on being
-.IR \%man\~pages ,
-then whether they represent an existing file.
-.
-By default, a
-.I \%filespec
-is first tested whether it is an existing file.
-.
-.
-.TP
-.B --no-man\~\fR|\fB\~--local-file
-Do not check for
-.IR \%man\~pages .
-.
-.B --local-file
-is the corresponding
-.B man
-option.
-.
-.
-.TP
-.B --no-special
-Disable former calls of
-.BR --all ,
-.BR --apropos* ,
-and
-.BR --whatis .
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Long options taken over from GNU man"
-.\" --------------------------------------------------------------------
-.
-The long options of
-.B \%groffer
-were synchronized with the long options of \f[CR]GNU\f[]
-.BR man .
-.
-All long options of \f[CR]GNU\f[]
-.B man
-are recognized, but not all of these options are important to
-.BR \%groffer ,
-so most of them are just ignored.
-.
-These ignored
-.B man
-options are
-.BR --catman ,
-.BR --troff ,
-and
-.BR --update .
-.
-.
-.P
-In the following, the
-.B man
-options that have a special meaning for
-.B \%groffer
-are documented.
-.
-.
-.P
-If your system has \f[CR]GNU\f[]
-.B man
-installed the full set of long and short options of the \f[CR]GNU\f[]
-.B man
-program can be passed via the environment variable
-.Env_var \%$MANOPT ;
-see
-.BR \%man (1).
-.
-.
-.TP
-.B --all
-In searching
-.IR \%man\~pages ,
-retrieve all suitable documents instead of only one.
-.
-.
-.TP
-.B -7\~\fR|\fB\~--ascii
-In
-.IR \%text\~modes ,
-display ASCII translation of special characters for critical environment.
-.
-This is equivalent to
-.BR "groff \%-mtty_char" ;
-see
-.BR groff_tmac (@MAN5EXT@).
-.
-.
-.TP
-.B --ditroff
-Produce
-.IR "groff intermediate output" .
-This is equivalent to
-.B \%groffer
-.BR -Z .
-.
-.
-.TP
-.BI --extension \ suffix
-Restrict
-.I \%man\~page
-search to file names that have
-.I \%suffix
-appended to their section element.
-.
-For example, in the file name
-.I \%/usr/share/man/man3/terminfo.3ncurses.gz
-the
-.I \%man\~page
-extension is
-.IR \%ncurses .
-.
-.
-.TP
-.BI --locale \ language
-.
-Set the language for
-.IR \%man\~pages .
-.
-This has the same effect, but overwrites
-.Env_var $LANG .
-.
-.
-.TP
-.B --location
-Print the location of the retrieved files to standard error.
-.
-.
-.TP
-.B --no-location
-Do not display the location of retrieved files; this resets a former
-call to
-.BR --location .
-.
-This was added by
-.BR \%groffer .
-.
-.
-.TP
-.BI --manpath \ 'dir1:dir2:\*[Ellipsis]'
-Use the specified search path for retrieving
-.I \%man\~pages
-instead of the program defaults.
-.
-If the argument is set to the empty string "" the search for
-.I \%man\~page
-is disabled.
-.
-.
-.TP
-.B --pager
-Set the pager program in
-.IR \%tty\~mode ;
-default is
-.BR \%less .
-This is equivalent to
-.BR --tty\-viewer .
-.
-.
-.TP
-.BI --sections \ sec1:sec2:\*[Ellipsis]
-Restrict searching for
-.I \%man\~pages
-to the given
-.IR sections ,
-a colon-separated list.
-.
-.
-.TP
-.BI --systems \ sys1,sys2,\*[Ellipsis]
-Search for
-.I \%man\~pages
-for the given operating systems; the argument
-.I \%systems
-is a comma-separated list.
-.
-.
-.TP
-.B --where
-Equivalent to
-.BR --location .
-.
-.
-.\" --------------------------------------------------------------------
-.SS "X\~\%Window\~\%Toolkit Options"
-.\" --------------------------------------------------------------------
-.
-The following long options were adapted from the corresponding
-\%\f[CR]X\~Window\~Toolkit\f[] options.
-.
-.B \%groffer
-will pass them to the actual viewer program if it is an
-\%\f[CR]X\~Window\f[] program.
-.
-Otherwise these options are ignored.
-.
-.
-.P
-Unfortunately these options use the old style of a single minus for
-long options.
-.
-For
-.B \%groffer
-that was changed to the standard with using a double minus for long
-options, for example,
-.B \%groffer
-uses the option
-.B --font
-for the \%\f[CR]X\~Window\f[] option
-.BR -font .
-.
-.
-.P
-See
-.BR X (7)
-and the documentation on the \%\f[CR]X\~Window\~Toolkit\f[] options
-for more details on these options and their arguments.
-.
-.
-.TP
-.BI --background \ color
-Set the background color of the viewer window.
-.
-.
-.TP
-.BI --bd \ pixels
-This is equivalent to
-.BR --bordercolor .
-.
-.
-.TP
-.BI --bg \ color
-This is equivalent to
-.BR --background .
-.
-.
-.TP
-.BI --bw \ pixels
-This is equivalent to
-.BR --borderwidth .
-.
-.
-.TP
-.BI --bordercolor \ pixels
-Specifies the color of the border surrounding the viewer window.
-.
-.
-.TP
-.BI --borderwidth \ pixels
-Specifies the width in pixels of the border surrounding the viewer
-window.
-.
-.
-.TP
-.BI --display \ X-display
-Set the \%\f[CR]X\~Window\f[] display on which the viewer program
-shall be started, see the \%\f[CR]X\~Window\f[] documentation for the
-syntax of the argument.
-.
-.
-.TP
-.BI --foreground \ color
-Set the foreground color of the viewer window.
-.
-.
-.TP
-.BI --fg \ color
-This is equivalent to
-.BR -foreground .
-.
-.
-.TP
-.BI --fn \ font_name
-This is equivalent to
-.BR --font .
-.
-.
-.TP
-.BI --font \ font_name
-Set the font used by the viewer window.
-.
-The argument is an \%\f[CR]X\~Window\f[] font name.
-.
-.
-.TP
-.BI --ft \ font_name
-This is equivalent to
-.BR --font .
-.
-.
-.TP
-.BI --geometry \ size_pos
-Set the geometry of the display window, that means its size and its
-starting position.
-.
-See
-.BR \%X (7)
-for the syntax of the argument.
-.
-.
-.TP
-.BI --resolution \ value
-Set \%\f[CR]X\~Window\f[] resolution in dpi (dots per inch) in some
-viewer programs.
-.
-The only supported dpi values are
-.B 75
-and
-.BR 100 .
-.
-Actually, the default resolution for
-.B \%groffer
-is set to
-.BR 75dpi .
-The resolution also sets the default device in
-.IR "mode x" .
-.
-.
-.TP
-.B --rv
-Reverse foreground and background color of the viewer window.
-.
-.
-.TP
-.BI --title "\ 'some text'"
-Set the title for the viewer window.
-.
-.
-.TP
-.BI --xrm \ 'resource'
-Set \f[CR]\%X\~Window\f[] resource.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Options for Development"
-.\" --------------------------------------------------------------------
-.
-.TP
-.B --debug
-Enable eight debugging informations.
-.
-The temporary files are kept and not deleted, the name of the
-temporary directory and the shell name for
-.File_name groffer2.sh
-are printed, the displayed file names are printed, the
-.B grog
-output is printed, the parameters are printed at several steps of
-development, and a function stack is output with function
-\f[CR]error_user()\f[] as well.
-.
-Neither the function call stack at the opening and closing of each
-function call nor the landmark information to determine how far the
-program is running are printed.
-.
-These seem to be the most useful parts among all debugging options.
-.
-.
-.TP
-.B --debug\-all
-Enable all ten debugging informations including the function call
-stack and the landmark information.
-.
-.
-.TP
-.B --debug\-filenames
-Print the names of the files and
-.I \%man\~pages
-that are displayed by
-.BR \&groffer .
-.
-.
-.TP
-.B --debug\-func
-Enable the basic debugging information for checking the functions on
-the beginning and end of each call.
-.
-The options
-.B --debug\-stacks
-and
-.B --debug\-user
-enable this option automatically.
-.
-This option is important for the development, but it decreases the
-speed of
-.B groffer
-by large amounts.
-.
-.
-.TP
-.B --debug\-grog
-Print the output of all
-.B grog
-commands.
-.
-.
-.TP
-.B --debug\-keep
-Enable two debugging informations, the printing of the name of the
-temporary directory and the keeping of the temporary files.
-.
-.
-.TP
-.B --debug\-lm
-Enable one debugging information, the landmark information.
-.
-.
-.TP
-.B --debug\-params
-Enable one debugging information, the parameters at several steps.
-.
-.
-.TP
-.B --debug\-shell
-Enable one debugging information, the shell name for
-.File_name groffer2.sh .
-.
-.
-.TP
-.B --debug\-stacks
-Enable one debugging information, the function call stack.
-.
-.
-.TP
-.B --debug\-tmpdir
-Enable one debugging information, the name of the temporary directory.
-.
-.
-.TP
-.B --debug\-user
-Enable one debugging information, the function stack with
-\f[CR]error_user()\f[].
-.
-.
-.TP
-.B --do-nothing
-This is like
-.BR --version ,
-but without the output; no viewer is started.
-.
-This makes only sense in development.
-.
-.
-.TP
-.B --print=\fItext\fR
-Just print the argument to standard error.
-.
-This is good for parameter check.
-.
-.
-.TP
-.B --shell \fIshell_program\fR
-Specify the shell under which the
-.File_name \%groffer2.sh
-script should be run.
-.
-This option overwrites the automatic shell determination of the
-program.
-.
-If the argument
-.I shell_program
-is empty a former shell option and the automatic shell determination
-is cancelled and the default shell is restored.
-.
-Some shells run considerably faster than the standard shell.
-.
-.
-.TP
-.B -V
-This is an advanced option for debugging only.
-.
-Instead of displaying the formatted input, a lot of
-.I \%groffer
-specific information is printed to standard output:
-.
-.RS
-.Topic
-the output file name in the temporary directory,
-.
-.Topic
-the display mode of the actual
-.B \%groffer
-run,
-.
-.Topic
-the display program for viewing the output with its arguments,
-.
-.Topic
-the active parameters from the config files, the arguments in
-.Env_var \%$GROFFER_OPT ,
-and the arguments of the command line,
-.
-.Topic
-the pipeline that would be run by the
-.B \%groff
-program, but without executing it.
-.RE
-.
-.
-.P
-Other useful debugging options are the
-.B \%groff
-option
-.B -Z
-and
-.BR --mode=groff .
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Filespec Arguments"
-.\" --------------------------------------------------------------------
-.
-A
-.I \%filespec
-parameter is an argument that is not an option or option argument.
-.
-In
-.BR \%groffer ,
-.I \%filespec
-parameters are a file name or a template for searching
-.IR \%man\~pages .
-.
-These input sources are collected and composed into a single output
-file such as
-.B \%groff
-does.
-.
-.
-.P
-The strange \%\f[CR]POSIX\f[] behavior to regard all arguments behind
-the first non-option argument as
-.I \%filespec
-arguments is ignored.
-.
-The \f[CR]GNU\f[] behavior to recognize options even when mixed with
-.I \%filespec
-arguments is used throughout.
-.
-But, as usual, the double minus argument
-.B --
-ends the option handling and interprets all following arguments as
-.I \%filespec
-arguments; so the \%\f[CR]POSIX\f[] behavior can be easily adopted.
-.
-.
-.P
-The options
-.B --apropos*
-have a special handling of
-.I filespec
-arguments.
-.
-Each argument is taken as a search scheme of its own.
-.
-Also a regexp (regular expression) can be used in the filespec.
-.
-For example,
-.B groffer --apropos '^gro.f$'
-searches
-.B groff
-in the
-.I man\~page
-name, while
-.B groffer --apropos groff
-searches
-.B groff
-somewhere in the name or description of the
-.IR man\~pages .
-.
-.
-.P
-All other parts of
-.IR groffer ,
-such as the normal display or the output with
-.B --whatis
-have a different scheme for
-.IR filespecs .
-No regular expressions are used for the arguments.
-.
-The
-.I filespec
-arguments are handled by the following scheme.
-.
-.
-.P
-It is necessary to know that on each system the
-.I \%man\~pages
-are sorted according to their content into several sections.
-.
-The
-.I classical man sections
-have a single-character name, either a digit from
-.B 1
-to
-.B 9
-or one of the characters
-.B n
-or
-.BR o .
-.
-.
-.P
-This can optionally be followed by a string, the so-called
-.IR extension .
-The
-.I extension
-allows to store several
-.I man\~pages
-with the same name in the same
-.IR section .
-But the
-.I extension
-is only rarely used, usually it is omitted.
-.
-Then the
-.I extensions
-are searched automatically by alphabet.
-.
-.
-.P
-In the following, we use the name
-.I section_extension
-for a word that consists of a single character
-.I section
-name or a
-.I section
-character that is followed by an
-.IR extension .
-.
-Each
-.I \%filespec
-parameter can have one of the following forms in decreasing sequence.
-.
-.
-.Topic
-No
-.I \%filespec
-parameters means that
-.B \%groffer
-waits for standard input.
-.
-The minus option
-.B -
-always stands for standard input; it can occur several times.
-.
-If you want to look up a
-.I \%man\~page
-called
-.B -
-use the argument
-.BR man:\- .
-.
-.
-.Topic
-Next a
-.I \%filespec
-is tested whether it is the path name of an existing file.
-.
-Otherwise it is assumed to be a searching pattern for a
-.IR \%man\~page .
-.
-.
-.Topic
-.BI \%man: name ( section_extension ) ,
-.BI \%man: name . section_extension,
-.IB \%name ( section_extension ) ,
-or
-.IB \%name . section_extension
-search the \%man\~page
-.I \%name
-in \%man\~section and possibly extension of
-.IR \%section_extension .
-.
-.
-.Topic
-Now
-.BI \%man: name
-searches for a
-.I \%man\~page
-in the lowest
-.I \%man\~section
-that has a document called
-.IR \%name .
-.
-.
-.Topic
-.I \%section_extension\~name
-is a pattern of 2 arguments that originates from a strange argument
-parsing of the
-.B man
-program.
-.
-Again, this searches the man page
-.I name
-with
-.IR \%section_extension ,
-a combination of a
-.I section
-character optionally followed by an
-.IR extension .
-.
-.
-.Topic
-We are left with the argument
-.I \%name
-which is not an existing file.
-.
-So this searches for the
-.I \%man\~page
-called
-.I \%name
-in the lowest
-.I \%man\~section
-that has a document for this name.
-.
-.
-.P
-Several file name arguments can be supplied.
-.
-They are mixed by
-.B \%groff
-into a single document.
-.
-Note that the set of option arguments must fit to all of these file
-arguments.
-.
-So they should have at least the same style of the
-.I \%groff
-language.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "OUTPUT MODES"
-.\" --------------------------------------------------------------------
-.
-By default, the
-.B \%groffer
-program collects all input into a single file, formats it with the
-.B \%groff
-program for a certain device, and then chooses a suitable viewer
-program.
-.
-The device and viewer process in
-.B \%groffer
-is called a
-.IR \%mode .
-.
-The mode and viewer of a running
-.B \%groffer
-program is selected automatically, but the user can also choose it
-with options.
-.
-.
-The modes are selected by option the arguments of
-.BR --mode=\fIanymode .
-Additionally, each of this argument can be specified as an option of
-its own, such as
-.BR anymode .
-Most of these modes have a viewer program, which can be chosen by an
-option that is constructed like
-.BR --\fIanymode\fR\-viewer .
-.
-.
-.P
-Several different modes are offered, graphical modes for
-\f[CR]\%X\~Window\f[],
-.IR \%text\~modes ,
-and some direct
-.I \%groff\~modes
-for debugging and development.
-.
-.
-.P
-By default,
-.B \%groffer
-first tries whether
-.I \%x\~mode
-is possible, then
-.IR \%ps\~mode ,
-and finally
-.IR \%tty\~mode .
-.
-This mode testing sequence for
-.I \%auto\~mode
-can be changed by specifying a comma separated list of modes with the
-option
-.B --default\-modes.
-.
-.
-.P
-The searching for
-.I \%man\~pages
-and the decompression of the input are active in every mode.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Graphical Display Modes"
-.\" --------------------------------------------------------------------
-.
-The graphical display modes work mostly in the \%\f[CR]X\~Window\f[]
-environment (or similar implementations within other windowing
-environments).
-.
-The environment variable
-.Env_var \%$DISPLAY
-and the option
-.B --display
-are used for specifying the \%\f[CR]X\~Window\f[] display to be used.
-.
-If this environment variable is empty
-.B \%groffer
-assumes that no \%\f[CR]X\~Window\f[] is running and changes to a
-.IR \%text\~mode .
-.
-You can change this automatic behavior by the option
-.BR --default\-modes .
-.
-.
-.P
-Known viewers for the graphical display modes and their standard
-\%\f[CR]X\~Window\f[] viewer programs are
-.
-.Topic
-in a PDF viewer
-.nh
-.RI ( \%pdf\~mode )
-.hy
-.
-.Topic
-in a web browser
-.nh
-.RI ( html
-or
-.IR \%www\~mode )
-.hy
-.RE
-.
-.Topic
-in a Postscript viewer
-.nh
-.RI ( \%ps\~mode )
-.hy
-.
-.Topic
-\%\f[CR]X\~Window\f[]
-.I roff
-viewers such as
-.BR \%gxditview (@MAN1EXT@)
-or
-.BR \%xditview (1)
-(in
-.IR \%x\~mode )
-.
-.Topic
-in a dvi viewer program
-.nh
-.RI ( \%dvi\~mode )
-.hy
-.
-.
-.P
-The
-.I \%pdf\~mode
-has a major advantage \[em] it is the only graphical display mode that
-allows to search for text within the viewer; this can be a really
-important feature.
-.
-Unfortunately, it takes some time to transform the input into the PDF
-format, so it was not chosen as the major mode.
-.
-.
-.P
-These graphical viewers can be customized by options of the
-\%\f[CR]X\~Window\~Toolkit\f[].
-.
-But the
-.B \%groffer
-options use a leading double minus instead of the single minus used by
-the \%\f[CR]X\~Window\~Toolkit\f[].
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Text modes"
-.\" --------------------------------------------------------------------
-.
-There are two modes for text output,
-.I \%mode\~text
-for plain output without a pager and
-.I \%mode\~tty
-for a text output on a text terminal using some pager program.
-.
-.
-.P
-If the variable
-.Env_var \%$DISPLAY
-is not set or empty,
-.B \%groffer
-assumes that it should use
-.IR \%tty\~\%mode .
-.
-.
-.P
-In the actual implementation, the
-.I groff
-output device
-.I \%latin1
-is chosen for
-.IR \%text\~modes .
-.
-This can be changed by specifying option
-.B -T
-or
-.BR \%--device .
-.
-.
-.P
-The pager to be used can be specified by one of the options
-.B --pager
-and
-.BR --tty\-viewer ,
-or by the environment variable
-.Env_var \%$PAGER .
-If all of this is not used the
-.BR \%less (1)
-program with the option
-.B -r
-for correctly displaying control sequences is used as the default
-pager.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Special Modes for Debugging and Development"
-.\" --------------------------------------------------------------------
-.
-These modes use the
-.I \%groffer
-file determination and decompression.
-.
-This is combined into a single input file that is fed directly into
-.B \%groff
-with different strategy without the
-.I \%groffer
-viewing facilities.
-.
-These modes are regarded as advanced, they are useful for debugging
-and development purposes.
-.
-.
-.P
-The
-.I \%source\~mode
-with option
-.B --source
-just displays the decompressed input.
-.
-.
-.P
-Otion
-.B --to\-stdout
-does not display in a graphical mode.
-.
-It just generates the file for the chosen mode and then prints its
-content to standard output.
-.
-.
-.P
-The
-.I \%groff\~mode
-passes the input to
-.B \%groff
-using only some suitable options provided to
-.BR \%groffer .
-.
-This enables the user to save the generated output into a file or pipe
-it into another program.
-.
-.
-.P
-In
-.IR \%groff\~\%mode ,
-the option
-.B -Z
-disables post-processing, thus producing the
-.nh
-.I groff intermediate
-.IR output .
-.hy
-.
-In this mode, the input is formatted, but not postprocessed; see
-.BR \%groff_out (@MAN5EXT@)
-for details.
-.
-.
-.P
-All
-.B \%groff
-short options are supported by
-.BR \%groffer .
-.
-.
-.\" --------------------------------------------------------------------
-.SH "MAN PAGE SEARCHING"
-.\" --------------------------------------------------------------------
-.
-The default behavior of
-.B \%groffer
-is to first test whether a file parameter represents a local file; if
-it is not an existing file name, it is assumed to represent the name
-of a
-.IR \%man\~page .
-The following options can be used to determine whether the arguments
-should be handled as file name or
-.I \%man\~page
-arguments.
-.
-.TP
-.B --man
-forces to interpret all file parameters as
-.I \%filespecs
-for searching
-.IR \%man\~pages .
-.
-.TP
-.B --no\-man
-.TQ
-.B --local\-file
-disable the
-.I man
-searching; so only local files are displayed.
-.
-.
-.P
-If neither a local file nor a
-.I \%man\~page
-was retrieved for some file parameter a warning is issued on standard
-error, but processing is continued.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Search Algorithm"
-.\" --------------------------------------------------------------------
-.
-Let us now assume that a
-.I \%man\~page
-should be searched.
-.
-The
-.B \%groffer
-program provides a search facility for
-.IR \%man\~pages .
-.
-All long options, all environment variables, and most of the
-functionality of the \f[CR]GNU\fP
-.BR \%man (1)
-program were implemented.
-.
-The search algorithm shall determine which file is displayed for a given
-.IR \%man\~page .
-The process can be modified by options and environment variables.
-.
-.
-.P
-The only
-.I man
-action that is omitted in
-.B \%groffer
-are the preformatted
-.IR \%man\~pages ,
-also called
-.IR cat\~pages .
-.
-With the excellent performance of the actual computers, the
-preformatted
-.I \%man\~pages
-aren't necessary any longer.
-.
-Additionally,
-.B \%groffer
-is a
-.I roff
-program; it wants to read
-.I roff
-source files and format them itself.
-.
-.
-.P
-The algorithm for retrieving the file for a
-.I \%man\~page
-needs first a set of directories.
-.
-This set starts with the so-called
-.I man\~path
-that is modified later on by adding names of
-.I operating system
-and
-.IR language .
-.
-This arising set is used for adding the section directories which
-contain the
-.I \%man\~page
-files.
-.
-.
-.P
-The
-.I man\~path
-is a list of directories that are separated by colon.
-.
-It is generated by the following methods.
-.
-.Topic
-The environment variable
-.Env_var \%$MANPATH
-can be set.
-.
-.Topic
-It can be read from the arguments of the environment variable
-.Env_var \%$MANOPT .
-.
-.Topic
-The
-.I man\~path
-can be manually specified by using the option
-.BR --manpath .
-An empty argument disables the
-.I \%man\~page
-searching.
-.
-.Topic
-When no
-.I man\~path
-was set the
-.BR \%manpath (1)
-program is tried to determine one.
-.
-.Topic
-If this does not work a reasonable default path from
-.Env_var $PATH
-is determined.
-.
-.
-.P
-We now have a starting set of directories.
-.
-The first way to change this set is by adding names of
-.I operating
-.IR systems .
-.
-This assumes that
-.I \%man\~pages
-for several
-.I operating systems
-are installed.
-.
-This is not always true.
-.
-The names of such
-.I operating systems
-can be provided by 3 methods.
-.
-.Topic
-The environment variable
-.Env_var \%$SYSTEM
-has the lowest precedence.
-.
-.Topic
-This can be overridden by an option in
-.Env_var \%$MANOPT .
-.
-.Topic
-This again is overridden by the command line option
-.BR --systems .
-.
-.
-.P
-Several names of
-.I operating systems
-can be given by appending their names, separated by a comma.
-.
-.
-.P
-The
-.I man\~path
-is changed by appending each
-.I system
-name as subdirectory at the end of each directory of the set.
-.
-No directory of the
-.I man\~path
-set is kept.
-.
-But if no
-.I system
-name is specified the
-.I man\~path
-is left unchanged.
-.
-.
-.P
-After this, the actual set of directories can be changed by
-.I language
-information.
-.
-This assumes that there exist
-.I man\~pages
-in different languages.
-.
-The wanted
-.I language
-can be chosen by several methods.
-.
-.Topic
-Environment variable
-.Env_var $LANG .
-.
-.Topic
-This is overridden by
-.Env_var \%$LC_MESSAGES .
-.
-.Topic
-This is overridden by
-.Env_var $LC_ALL .
-.
-.Topic
-This can be overridden by providing an option in
-.Env_var \%$MANOPT .
-.
-.Topic
-All these environment variables are overridden by the command line
-option
-.BR --locale .
-.
-.
-.P
-The
-.I default language
-can be specified by specifying one of the pseudo-language parameters
-\f[CR]C\fP or \f[CR]\%POSIX\fP.
-.
-This is like deleting a formerly given
-.I language
-information.
-.
-The
-.I \%man\~pages
-in the
-.I default language
-are usually in English.
-.
-.
-.P
-Of course, the
-.I language
-name is determined by
-.BR man .
-In \f[CR]GNU\fP
-.BR man ,
-it is specified in the \%\f[CR]POSIX\~1003.1\fP based format:
-.P
-.nh
-\f[I]<language>\f[][\f[CB]_\f[]\f[I]<territory>\f[][\f[CB].\fP\
-\f[I]<character-set>\f[][\f[CB],\fP\f[I]<version>\fP]]],
-.hy
-.P
-but the two-letter code in
-.nh
-.I <language>
-.hy
-is sufficient for most purposes.
-.
-If for a complicated
-.I language
-formulation no
-.I \%man\~pages
-are found
-.B \%groffer
-searches the country part consisting of these first two characters as
-well.
-.
-.
-.P
-The actual directory set is copied thrice.
-.
-The
-.I language
-name is appended as subdirectory to each directory in the first copy
-of the actual directory set (this is only done when a language
-information is given).
-.
-Then the 2-letter abbreviation of the
-.I language
-name is appended as subdirectories to the second copy of the directory
-set (this is only done when the given language name has more than 2
-letters).
-.
-The third copy of the directory set is kept unchanged (if no
-.I language
-information is given this is the kept directory set).
-.
-These maximally 3 copies are appended to get the new directory set.
-.
-.
-.P
-We now have a complete set of directories to work with.
-.
-In each of these directories, the
-.I man
-files are separated in
-.IR sections .
-.
-The name of a
-.I section
-is represented by a single character, a digit between
-.I 1
-and
-.IR 9 ,
-or the character
-.I o
-or
-.IR n ,
-in this order.
-.
-.
-.P
-For each available
-.IR section ,
-a subdirectory
-.File_name man \fI<section>\fP
-exists containing all
-.I man
-files for this
-.IR section ,
-where
-.I <section>
-is a single character as described before.
-.
-Each
-.I man
-file in a
-.I section
-directory has the form
-.IR \%\f[CB]man\fP<section>\f[CB]/\fP<name>\f[CB].\fP<section>\
-[<extension>][\f[CB].\fP<compression>] ,
-where
-.I \%<extension>
-and
-.I \%<compression>
-are optional.
-.
-.I \%<name>
-is the name of the
-.I \%man\~page
-that is also specified as filespec argument on the command line.
-.
-.
-.P
-The
-.I extension
-is an addition to the section.
-.
-This postfix acts like a subsection.
-.
-An
-.I extension
-occurs only in the file name, not in name of the
-.I section
-subdirectory.
-.
-It can be specified on the command line.
-.
-.
-.P
-On the other hand, the
-.I compression
-is just an information on how the file is compressed.
-.
-This is not important for the user, such that it cannot be specified
-on the command line.
-.
-.
-.P
-There are 4 methods to specify a
-.I section
-on the command line:
-.
-.Topic
-Environment variable
-.Env_var \%$MANSECT
-.
-.Topic
-Command line option
-.B --sections
-.
-.Topic
-Appendix to the
-.I name
-argument in the form
-.I <name>.<section>
-.
-.Topic
-Preargument before the
-.I name
-argument in the form
-.I <section> <name>
-.
-.
-.P
-It is also possible to specify several
-.I sections
-by appending the single characters separated by colons.
-.
-One can imagine that this means to restrict the
-.I \%man\~page
-search to only some
-.IR sections .
-.
-The multiple
-.I sections
-are only possible for
-.Env_var \%$MANSECT
-and
-.BR --sections .
-.
-.
-.P
-If no
-.I section
-is specified all
-.I sections
-are searched one after the other in the given order, starting with
-.IR section\~1 ,
-until a suitable file is found.
-.
-.
-.P
-There are 4 methods to specify an
-.I extension
-on the command line.
-.
-But it is not necessary to provide the whole extension name, some
-abbreviation is good enough in most cases.
-.
-.Topic
-Environment variable
-.Env_var \%$EXTENSION
-.
-.Topic
-Command line option
-.B --extension
-.
-.Topic
-Appendix to the
-.I <name>.<section>
-argument in the form
-.I <name>.<section><extension>
-.
-.Topic
-Preargument before the
-.I name
-argument in the form
-.I <section><extension> <name>
-.
-.
-.P
-For further details on
-.I \%man\~page
-searching, see
-.BR \%man (1).
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Examples of man files"
-.\" --------------------------------------------------------------------
-.
-.TP
-.File_name /usr/share/man/man1/groff.1
-This is an uncompressed file for the
-.I \%man\~page
-\f[CR]groff\fP in
-.IR section\~1 .
-.
-It can be called by
-.EX
-\fIsh#\fR groffer\~groff
-.EE
-No
-.I section
-is specified here, so all
-.I sections
-should be searched, but as
-.I section\~1
-is searched first this file will be found first.
-.
-The file name is composed of the following components.
-.File_name /usr/share/man
-must be part of the
-.IR \%man\~path ;
-the subdirectory
-.File_name man1/
-and the part
-.File_name .1
-stand for the
-.IR section ;
-.File_name groff
-is the name of the
-.IR \%man\~page .
-.
-.
-.TP
-.File_name /usr/local/share/man/man7/groff.7.gz
-The file name is composed of the following components.
-.File_name /usr/local/share/man
-must be part of the
-.IR \%man\~path ;
-the subdirectory
-.File_name man7/
-and the part
-.File_name .7
-stand for the
-.IR section ;
-.File_name groff
-is the name of the
-.IR \%man\~page ;
-the final part
-.File_name .gz
-stands for a compression with
-.BR gzip (1).
-As the
-.I section
-is not the first one it must be specified as well.
-.
-This can be done by one of the following commands.
-.EX
-\fIsh#\fR\~groffer\~groff.7
-\fIsh#\fR\~groffer\~7\~groff
-\fIsh#\fR\~groffer\~\-\-sections=7\~groff
-.EE
-.
-.TP
-.File_name /usr/local/man/man1/ctags.1emacs21.bz2
-Here
-.File_name /usr/local/man
-must be in
-.IR \%man\~path ;
-the subdirectory
-.File_name man1/
-and the file name part
-.File_name .1
-stand for
-.IR section\~1 ;
-the name of the
-.I \%man\~page
-is
-.File_name ctags ;
-the section has an extension
-.File_name emacs21 ;
-and the file is compressed as
-.File_name .bz2
-with
-.BR bzip2 (1).
-The file can be viewed with one of the following commands
-.EX
-\fIsh#\fR\~groffer\~ctags.1e
-\fIsh#\fR\~groffer\~1e\~ctags
-\fIsh#\fR\~groffer\~\-\-extension=e\~\-\-sections=1\~ctags
-.EE
-where \f[CR]e\fP works as an abbreviation for the extension
-\f[CR]emacs21\fP.
-.
-.
-.TP
-.File_name /usr/man/linux/de/man7/man.7.Z
-The directory
-.File_name /usr/man
-is now part of the
-.IR \%man\~path ;
-then there is a subdirectory for an
-.I operating system
-name
-.File_name linux/ ;
-next comes a subdirectory
-.File_name de/
-for the German
-.IR language ;
-the
-.I section
-names
-.File_name man7
-and
-.File_name .7
-are known so far;
-.File_name man
-is the name of the
-.IR \%man\~page ;
-and
-.File_name .Z
-signifies the compression that can be handled by
-.BR gzip (1).
-We want now show how to provide several values for some options.
-.
-That is possible for
-.I sections
-and
-.I operating system
-names.
-.
-So we use as
-.I sections\~5
-and
-.I 7
-and as
-.I system
-names
-.I linux
-and
-.IR aix .
-The command is then
-.sp
-.EX
-\fIsh#\fR groffer\~\-\-locale=de\~\-\-sections=5:7\~\-\-systems=linux,aix\~man
-\fIsh#\fR LANG=de\~MANSECT=5:7\~SYSTEM=linux,aix\~groffer\~man
-.EE
-.
-.
-.\" --------------------------------------------------------------------
-.SH DECOMPRESSION
-.\" --------------------------------------------------------------------
-.
-The program has a decompression facility.
-.
-If standard input or a file that was retrieved from the command line
-parameters is compressed with a format that is supported by either
-.BR \%gzip (1)
-or
-.BR \%bzip2 (1)
-it is decompressed on-the-fly.
-.
-This includes the \f[CR]GNU\fP
-.BR \%.gz ,
-.BR \%.bz2 ,
-and the traditional
-.B \%.Z
-compression.
-.
-The program displays the concatenation of all decompressed input in
-the sequence that was specified on the command line.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "ENVIRONMENT"
-.\" --------------------------------------------------------------------
-.
-The
-.B \%groffer
-program supports many system variables, most of them by courtesy of
-other programs.
-.
-All environment variables of
-.BR \%groff (@MAN1EXT@)
-and \f[CR]GNU\fP
-.BR \%man (1)
-and some standard system variables are honored.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Native groffer Variables"
-.\" --------------------------------------------------------------------
-.
-.TP
-.Env_var \%$GROFFER_OPT
-Store options for a run of
-.BR \%groffer .
-.
-The options specified in this variable are overridden by the options
-given on the command line.
-.
-The content of this variable is run through the shell builtin `eval';
-so arguments containing white-space or special shell characters should
-be quoted.
-.
-Do not forget to export this variable, otherwise it does not exist
-during the run of
-.BR groffer .
-.
-.
-.\" --------------------------------------------------------------------
-.SS "System Variables"
-.\" --------------------------------------------------------------------
-.
-The
-.B \%groffer
-program is a shell script that is run through
-.File_name /bin/sh ,
-which can be internally linked to programs like
-.BR \%bash (1).
-The corresponding system environment is automatically effective.
-.
-The following variables have a special meaning for
-.BR \%groffer .
-.
-.
-.TP
-.Env_var \%$DISPLAY
-If this variable is set this indicates that the \%\f[CR]X\~Window\fP
-system is running.
-.
-Testing this variable decides on whether graphical or text output is
-generated.
-.
-This variable should not be changed by the user carelessly, but it can
-be used to start the graphical
-.B \%groffer
-on a remote \%\f[CR]X\~Window\fP terminal.
-.
-For example, depending on your system,
-.B \%groffer
-can be started on the second monitor by the command
-.sp
-.EX
-\fIsh#\fR DISPLAY=:0.1\~groffer\~what.ever &
-.EE
-.
-.
-.TP
-.Env_var \%$LC_ALL
-.TQ
-.Env_var \%$LC_MESSAGES
-.TQ
-.Env_var $LANG
-If one of these variables is set (in the above sequence), its content
-is interpreted as the locale, the language to be used, especially when
-retrieving
-.IR \%man\~pages .
-.
-A locale name is typically of the form
-.nh
-.IR language [\c
-.B _\c
-.IR territory [\c
-.B .\c
-.IR codeset [\c
-.B @\c
-.IR modifier ]]],
-.hy
-where
-.I \%language
-is an ISO 639 language code,
-.I \%territory
-is an ISO 3166 country code, and
-.I \%codeset
-is a character set or encoding identifier like ISO-8859-1 or UTF-8;
-see
-.BR \%setlocale (3).
-.
-The locale values \f[CR]C\fP and \%\f[CR]POSIX\fP
-stand for the default, i.e. the
-.I \%man\~page
-directories without a language prefix.
-.
-This is the same behavior as when all 3\~variables are unset.
-.
-.
-.TP
-.Env_var \%$PAGER
-This variable can be used to set the pager for the tty output.
-.
-For example, to disable the use of a pager completely set this
-variable to the
-.BR \%cat (1)
-program
-.sp
-.EX
-\fIsh#\fR PAGER=cat\~groffer\~anything
-.EE
-.sp
-.
-.TP
-.Env_var $PATH
-All programs within the
-.B \%groffer
-shell script are called without a fixed path.
-.
-Thus this environment variable determines the set of programs used
-within the run of
-.BR \%groffer .
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Groff Variables"
-.\" --------------------------------------------------------------------
-.
-The
-.B \%groffer
-program internally calls
-.BR \%groff ,
-so all environment variables documented in
-.BR \%groff (@MAN1EXT@)
-are internally used within
-.B \%groffer
-as well.
-.
-The following variable has a direct meaning for the
-.B \%groffer
-program.
-.
-.TP
-.Env_var \%$GROFF_TMPDIR
-If the value of this variable is an existing, writable directory,
-.B \%groffer
-uses it for storing its temporary files, just as
-.B groff
-does.
-.
-See the
-.BR \%groff (@MAN1EXT@)
-man page for more details on the location of temporary files.
-.
-.
-.\" --------------------------------------------------------------------
-.SS "Man Variables"
-.\" --------------------------------------------------------------------
-.
-Parts of the functionality of the
-.B man
-program were implemented in
-.BR \%groffer ;
-support for all environment variables documented in
-.BR \%man (1)
-was added to
-.BR \%groffer ,
-but the meaning was slightly modified due to the different approach in
-.BR \%groffer ;
-but the user interface is the same.
-.
-The
-.B man
-environment variables can be overwritten by options provided with
-.Env_var \%$MANOPT ,
-which in turn is overwritten by the command line.
-.
-.
-.TP
-.Env_var \%$EXTENSION
-Restrict the search for
-.I \%man\~pages
-to files having this extension.
-.
-This is overridden by option
-.BR --extension ;
-see there for details.
-.
-.
-.TP
-.Env_var \%$MANOPT
-This variable contains options as a preset for
-.BR \%man (1).
-As not all of these are relevant for
-.B \%groffer
-only the essential parts of its value are extracted.
-.
-The options specified in this variable overwrite the values of the
-other environment variables that are specific to
-.IR man .
-.
-All options specified in this variable are overridden by the options
-given on the command line.
-.
-.
-.TP
-.Env_var \%$MANPATH
-If set, this variable contains the directories in which the
-.I \%man\~page
-trees are stored.
-.
-This is overridden by option
-.BR \%--manpath .
-.
-.
-.TP
-.Env_var \%$MANSECT
-If this is a colon separated list of section names, the search for
-.I \%man\~pages
-is restricted to those manual sections in that order.
-.
-This is overridden by option
-.BR --sections .
-.
-.
-.TP
-.Env_var \%$SYSTEM
-If this is set to a comma separated list of names these are interpreted
-as
-.I \%man\~page
-trees for different operating systems.
-.
-This variable can be overwritten by option
-.BR --systems ;
-see there for details.
-.
-.
-.P
-The environment variable
-.Env_var \%$MANROFFSEQ
-is ignored by
-.B \%groffer
-because the necessary preprocessors are determined automatically.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "CONFIGURATION FILES"
-.\" --------------------------------------------------------------------
-.
-The
-.B \%groffer
-program can be preconfigured by two configuration files.
-.
-.
-.TP
-.File_name \%/etc/groff/groffer.conf
-System-wide configuration file for
-.BR \%groffer .
-.
-.
-.TP
-.File_name \%$HOME/.groff/groffer.conf
-User-specific configuration file for
-.BR \%groffer ,
-where
-.Env_var \%$HOME
-denotes the user's home directory.
-.
-This file is called after the system-wide configuration file to enable
-overriding by the user.
-.
-.
-.P
-Both files are handled for the configuration, but the configuration
-file in
-.File_name /etc
-comes first; it is overwritten by the configuration file in the home
-directory; both configuration files are overwritten by the environment
-variable
-.Env_var \%$GROFFER_OPT ;
-everything is overwritten by the command line arguments.
-.
-.
-.P
-In the configuration files, arbitrary spaces are allowed at the
-beginning of each line, they are just ignored.
-.
-Apart from that, the lines of the configuration lines either start
-with a minus character, all other lines are interpreted as shell
-commands.
-.
-.
-.P
-The lines with the beginning minus are interpreted as
-.B groffer
-options.
-.
-This easily allows to set general
-.B \%groffer
-options that should be used with any call of
-.BR \%groffer .
-.
-.
-.P
-If a lines starts with a double minus it represents a
-.B \%groffer
-long option; everything behind the first equal sign
-.RB ` = '
-or space character up to the end of the line is interpreted as its
-argument.
-.
-A line starting with a single minus represents a short options cluster
-with or without a final argument.
-.
-It is not necessary to use quotes in these lines; quotes are just
-ignored.
-.
-.
-.P
-The lines starting with a minus are changed into a prepend to the
-existing value of
-.Env_var \%$GROFFER_OPT .
-.
-So the configuration files will be transferred into a shell script
-that is called within
-.BR \%groffer .
-.
-.
-.P
-It makes sense to use these configuration files for the following
-tasks:
-.
-.Topic
-Preset command line options, such as choosing a
-.I \%mode
-or a viewer.
-.
-These are written into lines starting with a single or double minus
-sign, followed by the option name.
-.
-.Topic
-Preset environment variables recognized by
-.BR \%groffer ;
-but do not forget to export them.
-.
-.Topic
-You can also write a shell function for calling, for example a viewer
-program for some
-.IR \%mode .
-Such a function can be fed into a corresponding
-.B --\f[I]mode\fP\-viewer
-option.
-.
-.Topic
-Enter
-.B --shell
-to specify a shell for the run of
-.File_name groffer2.sh .
-Some shells run much faster than the standard shell.
-.
-.
-.P
-As an example, consider the following configuration file that can be
-used either in
-.File_name \%/etc/groff/groffer.conf
-or
-.File_name \%~/.groff/groffer.conf .
-.
-.
-.P
-.ft CR
-.nh
-.nf
-# groffer configuration file
-#
-# groffer options that are used in each call of groffer
-\-\-shell=ksh
-\-\-foreground=DarkBlue
-\-\-resolution=100
-\-\-x\-viewer=gxditview \-geometry 900x1200
-#
-# some shell commands
-if test "$DISPLAY" = ""; then
- export DISPLAY='localhost:0.0'
-fi
-date >>~/mygroffer.log
-.fi
-.hy
-.ft
-.
-.
-.P
-The lines starting with
-.B #
-are just ignored, so they act as command lines.
-.
-This configuration sets four
-.B \%groffer
-options (the lines starting with `\-') and runs two shell commands (the
-rest of the script).
-.
-This has the following effects:
-.
-.
-.Topic
-Use
-.B ksh
-as the shell to run the
-.B \%groffer
-script; if it works it should be faster than the usual
-.BR sh .
-.
-.
-.Topic
-Use a text color of
-.B \%DarkBlue
-in all viewers that support this, such as
-.BR \%gxditview .
-.
-.
-.Topic
-Use a resolution of
-.B 100dpi
-in all viewers that support this, such as
-.BR \%gxditview .
-.
-By this, the default device in
-.I x mode
-is set to
-.BR X100 .
-.
-.
-.Topic
-Force
-.BR \%gxditview (@MAN1EXT@)
-as the
-.I \%x-mode
-viewer using the geometry option for setting the width to
-.B 900px
-and the height to
-.BR 1200px .
-This geometry is suitable for a resolution of
-.BR 100dpi .
-.
-.
-.Topic
-If the environment variable
-.Env_var \%$DISPLAY
-is empty set it to
-.IR localhost:0.0 .
-.
-That allows to start
-.B \%groffer
-in the standard \%\f[CR]X\~Window\fP display, even when the program
-is called from a text console.
-.
-.
-.Topic
-Just for fun, the date of each
-.B \%groffer
-start is written to the file
-.File_name mygroffer.log
-in the home directory.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "EXAMPLES"
-.\" --------------------------------------------------------------------
-.
-The usage of
-.B \%groffer
-is very easy.
-.
-Usually, it is just called with a file name or
-.IR \%man\~page .
-.
-The following examples, however, show that
-.B \%groffer
-has much more fancy capabilities.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~/usr/local/share/doc/groff/meintro.ms.gz
-.EE
-.sp
-Decompress, format and display the compressed file
-.File_name meintro.ms.gz
-in the directory
-.File_name /usr/local/share/doc/groff ,
-using the standard viewer
-.B \%gxditview
-as graphical viewer when in \%\f[CR]X\~Window\fP, or the
-.BR \%less (1)
-pager program when not in \%\f[CR]X\~Window\fP.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~groff
-.EE
-.sp
-If the file
-.File_name \%./groff
-exists use it as input.
-.
-Otherwise interpret the argument as a search for the
-.I \%man\~page
-named
-.B \%groff
-in the smallest possible
-.IR \%man\~section ,
-being section 1 in this case.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~man:groff
-.EE
-.sp
-search for the
-.I \%man\~page
-of
-.B \%groff
-even when the file
-.File_name ./groff
-exists.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~groff.7
-\fIsh#\fR\~groffer\~7\~groff
-.EE
-.sp
-search the
-.I \%man\~page
-of
-.B \%groff
-in
-.I \%man\~section
-.BR 7 .
-This section search works only for a digit or a single character from
-a small set.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~fb.modes
-.EE
-.sp
-If the file
-.File_name ./fb.modes
-does not exist interpret this as a search for the
-.I \%man\~page
-of
-.BR fb.modes .
-As the extension
-.I \%modes
-is not a single character in classical section style the argument is
-not split to a search for
-.BR fb .
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~groff\~\[cq]troff(1)\[cq]\~man:roff
-.EE
-.sp
-The arguments that are not existing files are looked-up as the
-following
-.IR \%man\~pages :
-.B \%groff
-(automatic search, should be found in \fIman\fP\~section\~1),
-.B \%troff
-(in section\~1),
-and
-.B \%roff
-(in the section with the lowest number, being\~7 in this case).
-.
-The quotes around
-.nh
-.I \[cq]troff(1)\[cq]
-.hy
-are necessary because the parentheses are special shell characters;
-escaping them with a backslash character
-.I \[rs](
-and
-.I \[rs])
-would be possible, too.
-.
-The formatted files are concatenated and displayed in one piece.
-.
-.sp
-.EX
-\fIsh#\fR\~LANG=de\~groffer\~--man\~--www\~--www-viewer=galeon\~ls
-.EE
-.sp
-Retrieve the German
-.I \%man\~page
-(language
-.IR de )
-for the
-.B ls
-program, decompress it, format it to
-.I \%html
-format
-.nh
-.RI ( \%www\~mode )
-.hy
-and view the result in the web browser
-.BR \%galeon .
-The option
-.B --man
-guarantees that the
-.I \%man\~page
-is retrieved, even when a local file
-.File_name \%ls
-exists in the actual directory.
-.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~--source\~'man:roff(7)'
-.EE
-.sp
-Get the
-.I \%man\~page
-called
-.I \%roff
-in \fIman\fP\~section 7, decompress it, and print its unformatted
-content, its source code.
-.
-.
-.sp
-.EX
-\fIsh#\fR\~groffer\~--de-p\~--in\~--ap
-.EE
-.sp
-This is a set of abbreviated arguments, it is determined as
-.br
-.sp
-.EX
-\fIsh#\fR\~groffer\~--debug-params\~--intermediate-output\~--apropos
-.EE
-.sp
-.
-.sp
-.EX
-\fIsh#\fR\~cat\~file.gz\~|\~groffer\~-Z\~-mfoo
-.EE
-.sp
-.
-The file
-.File_name file.gz
-is sent to standard input, this is decompressed, and then this is
-transported to the
-.I \%groff intermediate output mode
-without post-processing
-.RB ( groff
-option
-.BR -Z ),
-using macro package
-.I \%foo
-.RB ( groff
-option
-.BR -m ).
-.
-.
-.sp
-.EX
-\fIsh#\fR\~echo\~'\[rs]f[CB]WOW!'\~|
-> groffer --x --bg red --fg yellow --geometry 200x100 -
-.EX
-.sp
-.
-Display the word \f[CB]WOW!\fP in a small window in constant-width
-bold font, using color yellow on red background.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "COMPATIBILITY"
-.\" --------------------------------------------------------------------
-.
-The
-.B \%groffer
-program consists of two shell scripts.
-.
-.
-.P
-The starting script is the file
-.File_name \%groffer
-that is installed in a
-.File_name bin
-directory.
-.
-It is generated from the source file
-.File_name \%groffer.sh .
-.
-It is just a short starting script without any functions such that it
-can run on very poor shells.
-.
-.
-.P
-The main part of the
-.B \%groffer
-program is the file
-.File_name groffer2.sh
-that is installed in the
-.I groff
-library directory.
-.
-This script can be run under a different shell by using the
-.B \%groffer
-option
-.BR --shell .
-.
-.
-.P
-Both scripts are compatible with both
-\f[CR]GNU\fP and \%\f[CR]POSIX\fP.
-.
-\%\f[CR]POSIX\fP compatibility refers to
-\%\f[CR]IEEE\~P1003.2/D11.2\fP of September 1991, a very early
-version of the \%\f[CR]POSIX\fP standard that is still freely
-available on the Internet at
-.UR http://\:www.funet.fi/\:pub/\:doc/\:posix/\:p1003.2/\:d11.2/\:all
-\%POSIX\~P1003.2\~draft\~11.2
-.UE .
-.
-.
-.P
-Only a restricted set of shell language elements and shell builtins is
-used to achieve even compatibility with some Bourne shells that are
-not fully \%\f[CR]POSIX\fP compatible.
-.
-The
-.B \%groffer
-shell scripts were tested on many shells, including the following
-Bourne shells:
-.BR \%ash (1),
-.BR \%bash (1),
-.BR \%dash (1),
-.BR \%ksh (1),
-.BR \%pdksh (1),
-.BR \%posh (1),
-and
-.BR \%zsh (1).
-So it should work on most actual free and commercial operating
-systems.
-.
-.
-.P
-The shell for the run of
-.File_name groffer2.sh
-can be chosen by the option
-.BR --shell
-on the command line or the environment variable
-.Env_var $GROFF_OPT .
-If you want to add it to one of the
-.B \%groffer
-configuration files you must write a line starting with
-.BR --shell .
-.
-.
-.P
-The
-.B \%groffer
-program provides its own parser for command line arguments that is
-compatible to both \%\f[CR]POSIX\fP
-.BR \%getopts (1)
-and \%\f[CR]GNU\fP
-.BR \%getopt (1).
-It can handle option arguments and file names containing white space
-and a large set of special characters.
-.
-The following standard types of options are supported.
-.
-.
-.Topic
-The option consisting of a single minus
-.B -
-refers to standard input.
-.
-.
-.Topic
-A single minus followed by characters refers to a single character
-option or a combination thereof; for example, the
-.B \%groffer
-short option combination
-.B -Qmfoo
-is equivalent to
-.BR -Q\~\-m\~foo .
-.
-.
-.Topic
-Long options are options with names longer than one character; they
-are always preceded by a double minus.
-.
-An option argument can either go to the next command line argument or
-be appended with an equal sign to the argument; for example,
-.B --long=arg
-is equivalent to
-.BR --long\~arg .
-.
-.
-.Topic
-An argument of
-.B --
-ends option parsing; all further command line arguments are
-interpreted as
-.I \%filespec
-parameters, i.e. file names or constructs for searching
-.IR \%man\~pages ).
-.
-.
-.Topic
-All command line arguments that are neither options nor option
-arguments are interpreted as
-.I \%filespec
-parameters and stored until option parsing has finished.
-.
-For example, the command line
-.sp
-.EX
-\fIsh#\fR\~groffer file1 -a -o arg file2
-.EE
-.sp
-is equivalent to
-.sp
-.EX
-\fIsh#\fR\~groffer -a -o arg -- file1 file2
-.EE
-.sp
-.
-.P
-The free mixing of options and
-.I \%filespec
-parameters follows the GNU principle.
-.
-That does not fulfill the strange option behavior of \%\f[CR]POSIX\fP
-that ends option processing as soon as the first non-option argument
-has been reached.
-.
-The end of option processing can be forced by the option
-.RB ` \-\- '
-anyway.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "BUGS"
-.\" --------------------------------------------------------------------
-.
-Report bugs to the
-.MT bug-groff@gnu.org
-bug-groff mailing list
-.ME .
-.
-Include a complete, self-contained example that will allow the bug to
-be reproduced, and say which version of
-.B \%groffer
-you are using.
-.
-.
-.P
-You can also use the
-.MT groff@gnu.org
-groff mailing list
-.ME ,
-but you must first subscribe to this list.
-.
-You can do that by visiting the
-.UR http://\:lists.gnu.org/\:mailman/\:listinfo/\:groff
-groff mailing list web page
-.UE .
-.
-.
-.P
-See
-.BR \%groff (@MAN1EXT@)
-for information on availability.
-.
-.
-.\" --------------------------------------------------------------------
-.SH "SEE ALSO"
-.\" --------------------------------------------------------------------
-.
-.P
-.BR \%groff (@MAN1EXT@),
-.BR \%@g@troff (@MAN1EXT@)
-.RS
-Details on the options and environment variables available in
-.BR \%groff ;
-all of them can be used with
-.BR \%groffer .
-.RE
-.
-.
-.TP
-.BR \%groff (@MAN7EXT@)
-Documentation of the
-.I \%groff
-language.
-.
-.
-.TP
-.BR \%grog (@MAN1EXT@)
-Internally,
-.B \%groffer
-tries to guess the
-.B \%groff
-command line options from the input using this program.
-.
-.
-.TP
-.BR groff_out (@MAN5EXT@)
-Documentation on the
-.I \%groff intermediate output
-.nh
-.RI ( ditroff
-output).
-.hy
-.
-.
-.TP
-.BR groff_tmac (@MAN5EXT@)
-Documentation on the
-.I \%groff
-macro files.
-.
-.
-.TP
-.BR \%man (1)
-The standard program to display
-.IR \%man\~pages .
-.
-The information there is only useful if it is the
-.I \%man\~page
-for GNU
-.BR man .
-Then it documents the options and environment variables that are
-supported by
-.BR \%groffer .
-.
-.
-.P
-.BR \%ash (1),
-.BR \%bash (1),
-.BR \%dash (1),
-.BR \%ksh (1),
-.BR \%pdksh (1),
-.BR \%posh (1),
-.BR \%sh (1),
-.BR \%zsh (1)
-.RS
-Bourne shells that were tested with
-.BR \%groffer .
-.RE
-.
-.
-.P
-.BR \%gxditview (@MAN1EXT@),
-.BR \%xditview (1x)
-.RS
-Viewers for
-.BR \%groffer 's
-.IR \%x\~mode .
-.RE
-.
-.
-.P
-.BR \%kpdf (1),
-.BR \%kghostview (1),
-.BR \%evince (1),
-.BR \%ggv (1),
-.BR \%gv (1),
-.BR \%ghostview (1),
-.BR \%gs (1)
-.RS
-Viewers for
-.BR \%groffer 's
-.IR \%ps\~mode .
-.RE
-.
-.
-.P
-.BR \%kpdf (1),
-.BR \%acroread (1),
-.BR \%evince (1),
-.BR \%xpdf (1),
-.BR \%gpdf (1),
-.BR \%kghostview (1),
-.BR \%ggv (1)
-.RS
-Viewers for
-.BR \%groffer 's
-.IR \%pdf\~mode .
-.RE
-.
-.
-.P
-.BR \%kdvi (1),
-.BR \%xdvi (1),
-.BR \%dvilx (1)
-.RS
-Viewers for
-.BR \%groffer 's
-.IR \%dvi\~mode .
-.RE
-.
-.
-.P
-.BR \%konqueror (1),
-.BR \%epiphany (1),
-.BR \%firefox (1),
-.BR \%mozilla (1),
-.BR \%netscape (1),
-.BR \%lynx (1)
-.RS
-Web-browsers for
-.BR \%groffer 's
-.I \%html
-or
-.IR \%www\~mode .
-.RE
-.
-.
-.TP
-.BR \%less (1)
-Standard pager program for the
-.IR \%tty\~mode .
-.
-.
-.P
-.BR \%gzip (1),
-.BR \%bzip2 (1)
-.RS
-The decompression programs supported by
-.BR \%groffer .
-.RE
-.
-.
-.\" --------------------------------------------------------------------
-.SH "AUTHOR"
-.\" --------------------------------------------------------------------
-.author
-.
-.
-.\" --------------------------------------------------------------------
-.SH "COPYING"
-.\" --------------------------------------------------------------------
-.copyleft
-.
-.
-.\" --------------------------------------------------------------------
-.\" Emacs settings
-.\" --------------------------------------------------------------------
-.
-.\" Local Variables:
-.\" mode: nroff
-.\" End:
diff --git a/contrib/groffer/shell/groffer.sh b/contrib/groffer/shell/groffer.sh
deleted file mode 100755
index dc82ad81..00000000
--- a/contrib/groffer/shell/groffer.sh
+++ /dev/null
@@ -1,384 +0,0 @@
-#! /bin/sh
-
-# groffer - display groff files
-
-# Source file position: <groff-source>/contrib/groffer/groffer.sh
-# Installed position: <prefix>/bin/groffer
-
-# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
-# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
-# Last update: 5 Jan 2009
-
-# This file is part of `groffer', which 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 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/>.
-
-########################################################################
-
-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 _BEFORE_MAKE;
-if test _@VERSION@_ = _${_AT}VERSION${_AT}_
-then
- # script before `make'
- _BEFORE_MAKE='yes';
-else
- _BEFORE_MAKE='no';
-fi;
-
-export _AT_BINDIR_AT;
-export _AT_G_AT;
-export _AT_LIBDIR_AT;
-export _GROFFER_LIBDIR;
-case "${_BEFORE_MAKE}" in
-yes)
- self="$0";
- case "${self}" in
- /*) :; ;;
- *)
- curdir="$(pwd)";
- case "${curdir}" in
- */)
- self="${curdir}${self}";
- ;;
- *)
- self="${curdir}/${self}";
- ;;
- esac;
- ;;
- esac;
- groffer_shell_dir="$(dirname ${self})";
- case "${groffer_shell_dir}" in
- */) :; ;;
- *) groffer_shell_dir="${groffer_shell_dir}/";
- esac;
- groffer_top_dir="${groffer_shell_dir}../";
- _AT_G_AT='';
- _AT_BINDIR_AT="${groffer_shell_dir}";
- _AT_LIBDIR_AT="${groffer_shell_dir}";
- _GROFFER_LIBDIR="${_AT_LIBDIR_AT}";
- _VERSION_SH="${groffer_top_dir}version.sh";
- ;;
-no)
- _AT_G_AT='@g@';
- _AT_BINDIR_AT='@BINDIR@';
- case "${_AT_BINDIR_AT}" in
- */) :; ;;
- *) _AT_BINDIR_AT="${_AT_BINDIR_AT}/";
- esac;
- _AT_LIBDIR_AT='@libdir@';
- case "${_AT_LIBDIR_AT}" in
- */) :; ;;
- *) _AT_LIBDIR_AT="${_AT_LIBDIR_AT}/";
- esac;
- _GROFFER_LIBDIR="${_AT_LIBDIR_AT}"'groff/groffer/';
- _VERSION_SH="${_GROFFER_LIBDIR}"'version.sh';
- ;;
-esac;
-
-if test -f "${_VERSION_SH}"
-then
- . "${_VERSION_SH}";
-fi;
-
-export _GROFF_VERSION;
-case "${_BEFORE_MAKE}" in
-yes)
- _GROFF_VERSION="${_GROFF_VERSION_PRESET}";
- ;;
-no)
- _GROFF_VERSION='@VERSION@';
- ;;
-esac;
-
-export _GROFFER2_SH; # file name of the script that follows up
-_GROFFER2_SH="${_GROFFER_LIBDIR}"'groffer2.sh';
-
-export _GROFFER_SH; # file name of this shell script
-case "$0" in
-*groffer*)
- _GROFFER_SH="$0";
- ;;
-*)
- echo 'The groffer script should be started directly.' >&2
- exit 1;
- ;;
-esac;
-
-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 's/r/s/')"_ != _sed_
-then
- echo 'The sed program did not work.' >&2;
- exit "${_ERROR}";
-fi;
-
-# for some systems it is necessary to set some unset variables to `C'
-# according to Autobook, ch. 22
-for var in LANG LC_ALL LC_MESSAGES LC_CTYPES LANGUAGES
-do
- if eval test _"\${$var+set}"_ = _set_
- then
- eval ${var}='C';
- eval export ${var};
- fi;
-done;
-
-
-########################### 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 '
-# Ignore comments
-/^['"${_SP}${_TAB}"']*#/d
-# Delete leading and final space
-s/^['"${_SP}${_TAB}"']*//
-s/['"${_SP}${_TAB}"']*$//
-# Print all lines with shell commands, those not starting with -
-/^[^-]/p
-# Remove all single and double quotes
-s/['"${_SQ}"'"]//g
-# 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
-# Encircle the remaining arguments with single quotes
-s/^\(-[^ ]*\) \(.*\)$/o="${o} \1 '"${_SQ}"'\2'"${_SQ}"'"/p
-')"
-
- # Remove leading space
- o="$(echo "$o" | sed 's/^ *//')";
- 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;
-
-supports_func=no;
-foo() { echo bar; } 2>${_NULL_DEV};
-if test _"$(foo)"_ = _bar_
-then
- supports_func=yes;
-fi;
-
-# 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 '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
- if test _"${supports_func}"_ = _yes_
- then
- # use the empty argument as the default shell
- echo 'standard shell';
- break;
- else
- echo groffer: standard shell does not support functions. >&2;
- continue;
- fi;
- 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
- # test whether shell supports functions
- if eval "$i -c 'foo () { exit 0; }; foo'" 2>${_NULL_DEV}
- then
- # shell with function support found
- cat <<EOF
-${i}
-EOF
- break;
- else
- # if not being a shell with function support go on searching
- echo groffer: argument $i is not a shell \
-with function support. >&2
- continue;
- fi;
- else
- # if not being a shell go on searching
- echo groffer: argument $i is not a shell. >&2
- 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
- # shell sorted by speed, bash is very slow
- for s in ksh ash dash pdksh zsh posh sh bash
- do
- # test on shell with function support
- if eval "$s -c 'foo () { exit 0; }; foo'" 2>${_NULL_DEV}
- then
- _SHELL="$s";
- break;
- fi;
- done;
-fi;
-
-
-########################### start groffer2.sh
-
-if test _"${_SHELL}"_ = _'standard shell'_
-then
- _SHELL='';
-fi;
-
-if test _"${_SHELL}"_ = __
-then
- # no shell found, so start groffer2.sh normally
- if test _${supports_func}_ = _yes_
- then
- eval . "'${_GROFFER2_SH}'" '"$@"';
- exit;
- else
- echo groffer: standard shell does not support functions; no shell works.\
-Get some free working shell such as bash. >&2
- exit "${_ERROR}";
- fi;
-else
- # start groffer2.sh with the found $_SHELL
- # do not quote $_SHELL to allow arguments
- eval exec "${_SHELL} '${_GROFFER2_SH}'" '"$@"';
- exit;
-fi;
diff --git a/contrib/groffer/shell/groffer2.sh b/contrib/groffer/shell/groffer2.sh
deleted file mode 100644
index d76c6bd5..00000000
--- a/contrib/groffer/shell/groffer2.sh
+++ /dev/null
@@ -1,7312 +0,0 @@
-#! /bin/sh
-
-# groffer - display groff files
-
-# Source file position: <groff-source>/contrib/groffer/shell/groffer2.sh
-# Installed position: <prefix>/lib/groff/groffer/groffer2.sh
-
-# This file should not be run independently. It is called by
-# `groffer.sh' in the source or by the installed `groffer' program.
-
-# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
-# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
-# Last update: 5 Jan 2009
-
-# This file is part of `groffer', which 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 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/>.
-
-
-########################################################################
-# Test of rudimentary shell functionality
-########################################################################
-
-# Zsh is not Bourne compatible without the following:
-if test -n "$ZSH_VERSION"; then
- emulate sh
- NULLCMD=:
-fi
-
-
-########################################################################
-# Test of `unset'
-#
-export _UNSET;
-export _foo;
-_foo=bar;
-_res="$(unset _foo 2>&1)";
-if unset _foo >${_NULL_DEV} 2>&1 && \
- test _"${_res}"_ = __ && test _"${_foo}"_ = __
-then
- _UNSET='unset';
- eval "${_UNSET}" _foo;
- eval "${_UNSET}" _res;
-else
- _UNSET=':';
-fi;
-
-
-########################################################################
-# Test of `test'.
-#
-if test a = a && test a != b && test -f "${_GROFFER_SH}"
-then
- :;
-else
- echo '"test" did not work.' >&2;
- exit "${_ERROR}";
-fi;
-
-
-########################################################################
-# Test of `echo' and the `$()' construct.
-#
-if echo '' >${_NULL_DEV}
-then
- :;
-else
- echo '"echo" did not work.' >&2;
- exit "${_ERROR}";
-fi;
-if test _"$(t1="$(echo te)" &&
- t2="$(echo '')" &&
- t3="$(echo 'st')" &&
- echo "${t1}${t2}${t3}")"_ \
- != _test_
-then
- echo 'The "$()" construct did not work' >&2;
- exit "${_ERROR}";
-fi;
-
-
-########################################################################
-# Test of sed program; test in groffer.sh is not valid here.
-#
-if test _"$(echo xTesTx \
- | sed -n 's/^.\([Tt]e*x*sTT*\).*$/\1/p' \
- | sed 's|T|t|g')"_ != _test_
-then
- echo 'The sed program did not work.' >&2;
- exit "${_ERROR}";
-fi;
-
-
-########################################################################
-# Test of `cat'.
-#
-if test _"$(echo test | cat)"_ != _test_
-then
- error 'Test of "cat" command failed.';
-fi;
-
-
-########################################################################
-# Test of function definitions.
-#
-_t_e_s_t_f_u_n_c_()
-{
- return 0;
-}
-
-_test_func()
-{
- echo test;
-}
-
-if _t_e_s_t_f_u_n_c_ 2>${_NULL_DEV} && \
- test _"$(_test_func 2>${_NULL_DEV})"_ = _test_
-then
- :;
-else
- echo 'Shell '"${_SHELL}"' does not support function definitions.' >&2;
- exit "${_ERROR}";
-fi;
-
-
-########################################################################
-# landmark (<text>)
-#
-# Print <text> to standard error as a debugging aid.
-#
-# Globals: $_DEBUG_LM
-#
-landmark()
-{
- if test _"${_DEBUG_LM}"_ = _yes_
- then
- echo "LM: $*" >&2;
- fi;
-} # landmark()
-
-
-########################################################################
-# test for compression.
-#
-export _HAS_COMPRESSION;
-export _HAS_BZIP;
-if test _"$(echo 'test' | gzip -c -d -f - 2>${_NULL_DEV})"_ = _test_
-then
- _HAS_COMPRESSION='yes';
- if echo 'test' | bzip2 -c 2>${_NULL_DEV} | bzip2 -t 2>${_NULL_DEV} \
- && test _"$(echo 'test' | bzip2 -c 2>${_NULL_DEV} \
- | bzip2 -d -c 2>${_NULL_DEV})"_ \
- = _test_
- then
- _HAS_BZIP='yes';
- else
- _HAS_BZIP='no';
- fi;
-else
- _HAS_COMPRESSION='no';
- _HAS_BZIP='no';
-fi;
-
-
-########################################################################
-# debug - diagnostic messages
-########################################################################
-
-export _DEBUG_FUNC_CHECK;
-if test _"${_BEFORE_MAKE}"_ = _yes_
-then
- _DEBUG_FUNC_CHECK='yes';
-else
- _DEBUG_FUNC_CHECK='no';
-fi;
-_DEBUG_FUNC_CHECK='no'; # disable function checking
-#_DEBUG_FUNC_CHECK='yes'; # enable function checking
-
-export _DEBUG_STACKS;
-_DEBUG_STACKS='no'; # disable stack output in each function
-#_DEBUG_STACKS='yes'; # enable stack output in each function
-
-export _DEBUG_USER_WITH_STACK;
-_DEBUG_USER_WITH_STACK='no'; # disable stack dump in error_user()
-#_DEBUG_USER_WITH_STACK='yes'; # enable stack dump in error_user()
-
-export _DEBUG_LM;
-_DEBUG_LM='no'; # disable landmark messages
-#_DEBUG_LM='yes'; # enable landmark messages
-
-export _DEBUG_GROG;
-_DEBUG_GROG='no'; # disable grog output
-#_DEBUG_GROG='yes'; # enable grog output
-
-export _DEBUG_KEEP_FILES;
-_DEBUG_KEEP_FILES='no' # disable file keeping in temporary dir
-#_DEBUG_KEEP_FILES='yes' # enable file keeping in temporary dir
-
-export _DEBUG_PRINT_PARAMS;
-_DEBUG_PRINT_PARAMS='no'; # disable printing of all parameters
-#_DEBUG_PRINT_PARAMS='yes'; # enable printing of all parameters
-
-export _DEBUG_PRINT_SHELL;
-_DEBUG_PRINT_SHELL='no'; # disable printing of the shell name
-#_DEBUG_PRINT_SHELL='yes'; # enable printing of the shell name
-
-export _DEBUG_PRINT_TMPDIR;
-_DEBUG_PRINT_TMPDIR='no'; # disable printing of the temporary dir
-#_DEBUG_PRINT_TMPDIR='yes'; # enable printing of the temporary dir
-
-export _DEBUG_PRINT_FILENAMES;
-_DEBUG_PRINT_FILENAMES='no'; # disable printing of the found file names
-#_DEBUG_PRINT_FILENAMES='yes'; # enable printing of the found file names
-
-# determine all --debug* options
-case " $*" in
-*\ --deb*|*\ --d*-*)
- # --debug-* options
- d=' --debug-all --debug-filenames --debug-func --debug-grog '\
-'--debug-not-func --debug-keep --debug-lm --debug-params '\
-'--debug-shell --debug-stacks --debug-tmpdir --debug-user ';
- # non-debug options with scheme --d*-*
- n=' --do-nothing --default-modes --dvi-viewer --dvi-viewer-tty ';
- for i
- do
- case "$i" in
- --deb|--debu|--debug)
- _DEBUG_FUNC_CHECK='yes';
- # _DEBUG_STACKS='yes';
- _DEBUG_USER_WITH_STACK='yes';
- # _DEBUG_LM='yes';
- _DEBUG_GROG='yes';
- _DEBUG_KEEP_FILES='yes';
- _DEBUG_PRINT_PARAMS='yes';
- _DEBUG_PRINT_SHELL='yes';
- _DEBUG_PRINT_TMPDIR='yes';
- _DEBUG_PRINT_FILENAMES='yes';
- continue;
- ;;
- --d*-*)
- # before `-'
- b="$(echo x"$i" | sed 's/^x--\([^-]*\)-.*$/\1/')";
- # after `-'
- a="$(echo x"$i" | sed 's/^x--[^-]*-\(.*\)$/\1/')";
- ;;
- *)
- continue;
- ;;
- esac;
- case "$n" in
- *\ --$b*-$a*)
- continue;
- ;;
- esac;
- case "$d" in
- *\ --$b*-$a*)
- case "$a" in
- f|s) # double --debug-* options
- continue;
- ;;
- esac;
- # extract whole word of double abbreviation
- s="$(cat <<EOF | sed -n 's/^.* \(--'"$b"'[^ -]*-'"$a"'[^ ]*\) .*/\1/p'
-$d
-EOF
-)"
- case "$s" in
- '') continue; ;;
- --debug-all)
- _DEBUG_FUNC_CHECK='yes';
- _DEBUG_STACKS='yes';
- _DEBUG_USER_WITH_STACK='yes';
- _DEBUG_GROG='yes';
- _DEBUG_LM='yes';
- _DEBUG_KEEP_FILES='yes';
- _DEBUG_PRINT_PARAMS='yes';
- _DEBUG_PRINT_SHELL='yes';
- _DEBUG_PRINT_TMPDIR='yes';
- _DEBUG_PRINT_FILENAMES='yes';
- _DEBUG_PRINT_FILENAMES='yes';
- ;;
- --debug-filenames)
- _DEBUG_PRINT_FILENAMES='yes';
- ;;
- --debug-func)
- _DEBUG_FUNC_CHECK='yes';
- ;;
- --debug-not-func)
- _DEBUG_FUNC_CHECK='no';
- _DEBUG_STACKS='no';
- _DEBUG_USER_WITH_STACK='no';
- ;;
- --debug-grog)
- _DEBUG_GROG='yes';
- ;;
- --debug-keep)
- _DEBUG_PRINT_TMPDIR='yes';
- _DEBUG_KEEP_FILES='yes';
- ;;
- --debug-lm)
- _DEBUG_LM='yes';
- ;;
- --debug-params)
- _DEBUG_PRINT_PARAMS='yes';
- ;;
- --debug-shell)
- _DEBUG_PRINT_SHELL='yes';
- ;;
- --debug-stacks)
- _DEBUG_STACKS='yes';
- ;;
- --debug-tmpdir)
- _DEBUG_PRINT_TMPDIR='yes';
- ;;
- --debug-user)
- _DEBUG_USER_WITH_STACK='yes';
- ;;
- esac;
- ;;
- esac;
- done
- ;;
-esac;
-
-if test _"${_DEBUG_STACKS}"_ = _yes_ || \
- test _"${_DEBUG_USER_WITH_STACK}"_ = _yes_
-then
- _DEBUG_FUNC_CHECK='yes';
-fi
-
-if test _"${_DEBUG_PRINT_PARAMS}"_ = _yes_
-then
- echo "parameters: $@" >&2;
-fi;
-
-if test _"${_DEBUG_PRINT_SHELL}"_ = _yes_
-then
- if test _"${_SHELL}"_ = __
- then
- if test _"${POSIXLY_CORRECT}"_ = _y_
- then
- echo 'shell: bash as /bin/sh (none specified)' >&2;
- else
- echo 'shell: /bin/sh (none specified)' >&2;
- fi;
- else
- echo "shell: ${_SHELL}" >&2;
- fi;
-fi;
-
-
-########################################################################
-# Environment Variables
-########################################################################
-
-landmark "1: environment variables";
-
-# Environment variables that exist only for this file start with an
-# underscore letter. Global variables to this file are written in
-# upper case letters, e.g. $_GLOBAL_VARIABLE; temporary variables
-# start with an underline and use only lower case letters and
-# underlines, e.g. $_local_variable.
-
-# [A-Z]* system variables, e.g. $MANPATH
-# _[A-Z_]* global file variables, e.g. $_MAN_PATH
-# _[a-z_]* temporary variables, e.g. $_manpath
-
-# Due to incompatibilities of the `ash' shell, the name of loop
-# variables in `for' must be a single character.
-# [a-z] local loop variables, e.g. $i
-
-# In functions, other writings are used for variables. As some shells
-# do not support the `local' command a unique prefix in lower case is
-# constructed for each function, most are the abbreviation of the
-# function name. All variable names start with this prefix.
-# ${prefix}_[a-z_]* variable name in a function, e.g. $msm_modes
-
-
-########################################################################
-# read-only variables (global to this file)
-########################################################################
-
-# function return values; `0' means ok; other values are error codes
-export _BAD;
-export _GOOD;
-export _NO;
-export _OK;
-export _YES;
-
-_GOOD='0'; # return ok
-_BAD='1'; # return negatively, error code `1'
-# $_ERROR was already defined as `7' in groffer.sh.
-
-_NO="${_BAD}";
-_YES="${_GOOD}";
-_OK="${_GOOD}";
-
-# quasi-functions, call with `eval', e.g `eval "${return_ok}"'
-export return_ok;
-export return_good;
-export return_bad;
-export return_yes;
-export return_no;
-export return_error;
-export return_var;
-return_ok="func_pop; return ${_OK}";
-return_good="func_pop; return ${_GOOD}";
-return_bad="func_pop; return ${_BAD}";
-return_yes="func_pop; return ${_YES}";
-return_no="func_pop; return ${_NO}";
-return_error="func_pop; return ${_ERROR}";
-return_var="func_pop; return"; # add number, e.g. `eval "${return_var} $n'
-
-
-export _DEFAULT_MODES;
-_DEFAULT_MODES="'pdf' 'html' 'ps' 'x' 'dvi' 'tty'";
-export _DEFAULT_RESOLUTION;
-_DEFAULT_RESOLUTION='75';
-
-export _DEFAULT_TTY_DEVICE;
-_DEFAULT_TTY_DEVICE='latin1';
-
-# _VIEWER_* viewer programs for different modes constructed as lists
-export _VIEWER_DVI_TTY; # viewer program for dvi mode in tty
-export _VIEWER_DVI_X; # viewer program for dvi mode in X
-export _VIEWER_HTML_TTY; # viewer program for html mode in tty
-export _VIEWER_HTML_X; # viewer program for html mode in X
-export _VIEWER_PDF_TTY; # viewer program for pdf mode in tty
-export _VIEWER_PDF_X; # viewer program for pdf mode in X
-export _VIEWER_PS_TTY; # viewer program for ps mode in tty
-export _VIEWER_PS_X; # viewer program for ps mode in X
-export _VIEWER_TTY_TTY; # viewer program for X/x mode in tty
-export _VIEWER_TTY_X; # viewer program for X/x mode in X
-export _VIEWER_X_TTY; # viewer program for X/x mode in tty
-export _VIEWER_X_X; # viewer program for X/x mode in X
-_VIEWER_DVI_TTY="";
-_VIEWER_DVI_X="'kdvi' 'xdvi' 'dvilx'";
-_VIEWER_HTML_TTY="'lynx' 'w3m'";
-_VIEWER_HTML_X="'konqueror' 'epiphany' 'mozilla-firefox' 'firefox' 'mozilla' \
-'netscape' 'galeon' 'opera' 'amaya' 'arena' 'mosaic'";
-_VIEWER_PDF_TTY="";
-_VIEWER_PDF_X="'kpdf' 'acroread' 'evince' 'xpdf -z 150' 'gpdf' \
-'kghostview --scale 1.45' 'ggv'";
-_VIEWER_PS_TTY="";
-_VIEWER_PS_X="'kpdf' 'kghostview --scale 1.45' 'evince' 'ggv' 'gv' \
-'ghostview' 'gs_x11,gs'";
-_VIEWER_TTY_TTY="'less -r -R' 'more' 'pager'";
-_VIEWER_TTY_X="'xless'";
-_VIEWER_X_TTY="";
-_VIEWER_X_X="'gxditview' 'xditview'";
-
-# Search automatically in standard sections `1' to `8', and in the
-# traditional sections `9', `n', and `o'. On many systems, there
-# exist even more sections, mostly containing a set of man pages
-# special to a specific program package. These aren't searched for
-# automatically, but must be specified on the command line.
-export _MAN_AUTO_SEC_LIST;
-_MAN_AUTO_SEC_LIST="'1' '2' '3' '4' '5' '6' '7' '8' '9' 'n' 'o'";
-export _MAN_AUTO_SEC_CHARS;
-_MAN_AUTO_SEC_CHARS='[123456789no]';
-
-export _SPACE_SED;
-_SPACE_SED='['"${_SP}${_TAB}"']';
-
-export _SPACE_CASE;
-_SPACE_CASE='[\'"${_SP}"'\'"${_TAB}"']';
-
-export _PROCESS_ID; # for shutting down the program
-_PROCESS_ID="$$";
-
-export _START_DIR; # directory at start time of the script
-_START_DIR="$(pwd)";
-
-
-############ the command line options of the involved programs
-#
-# The naming scheme for the options environment names is
-# $_OPTS_<prog>_<length>[_<argspec>]
-#
-# <prog>: program name GROFFER, GROFF, or CMDLINE (for all
-# command line options)
-# <length>: LONG (long options) or SHORT (single character options)
-# <argspec>: ARG for options with argument, NA for no argument;
-# without _<argspec> both the ones with and without arg.
-#
-# Each option that takes an argument must be specified with a
-# trailing : (colon).
-
-# exports
-export _OPTS_GROFFER_SHORT_NA;
-export _OPTS_GROFFER_SHORT_ARG;
-export _OPTS_GROFFER_LONG_NA;
-export _OPTS_GROFFER_LONG_ARG;
-export _OPTS_GROFF_SHORT_NA;
-export _OPTS_GROFF_SHORT_ARG;
-export _OPTS_GROFF_LONG_NA;
-export _OPTS_GROFF_LONG_ARG;
-export _OPTS_X_SHORT_ARG;
-export _OPTS_X_SHORT_NA;
-export _OPTS_X_LONG_ARG;
-export _OPTS_X_LONG_NA;
-export _OPTS_MAN_SHORT_ARG;
-export _OPTS_MAN_SHORT_NA;
-export _OPTS_MAN_LONG_ARG;
-export _OPTS_MAN_LONG_NA;
-export _OPTS_MANOPT_SHORT_ARG;
-export _OPTS_MANOPT_SHORT_NA;
-export _OPTS_MANOPT_LONG_ARG;
-export _OPTS_MANOPT_LONG_NA;
-export _OPTS_CMDLINE_SHORT_NA;
-export _OPTS_CMDLINE_SHORT_ARG;
-export _OPTS_CMDLINE_LONG_NA;
-export _OPTS_CMDLINE_LONG_ARG;
-
-###### groffer native options
-
-_OPTS_GROFFER_SHORT_NA="'h' 'Q' 'v' 'V' 'X' 'Z'";
-_OPTS_GROFFER_SHORT_ARG="'T'";
-
-_OPTS_GROFFER_LONG_NA="'auto' \
-'apropos' 'apropos-data' 'apropos-devel' 'apropos-progs' \
-'debug' 'debug-all' 'debug-filenames' \
-'debug-func' 'debug-not-func' 'debug-grog' 'debug-keep' 'debug-lm' \
-'debug-params' 'debug-shell' 'debug-stacks' 'debug-tmpdir' 'debug-user' \
-'default' 'do-nothing' 'dvi' 'groff' 'help' 'intermediate-output' 'html' \
-'man' 'no-location' 'no-man' 'no-special' 'pdf' 'ps' 'rv' 'source' \
-'text' 'to-stdout' 'text-device' 'tty' 'tty-device' \
-'version' 'whatis' 'www' 'x' 'X'";
-
-_OPTS_GROFFER_LONG_ARG="\
-'default-modes' 'device' 'dvi-viewer' 'dvi-viewer-tty' 'extension' 'fg' \
-'fn' 'font' 'foreground' 'html-viewer' 'html-viewer-tty' 'mode' \
-'pdf-viewer' 'pdf-viewer-tty' 'print' 'ps-viewer' 'ps-viewer-tty' 'shell' \
-'title' 'tty-viewer' 'tty-viewer-tty' 'www-viewer' 'www-viewer-tty' \
-'x-viewer' 'x-viewer-tty' 'X-viewer' 'X-viewer-tty'";
-
-##### groffer options inhereted from groff
-
-_OPTS_GROFF_SHORT_NA="'a' 'b' 'c' 'C' 'e' 'E' 'g' 'G' 'i' 'k' 'l' 'N' 'p' \
-'R' 's' 'S' 't' 'U' 'z'";
-_OPTS_GROFF_SHORT_ARG="'d' 'f' 'F' 'I' 'K' 'L' 'm' 'M' 'n' 'o' 'P' 'r' \
-'w' 'W'";
-_OPTS_GROFF_LONG_NA="";
-_OPTS_GROFF_LONG_ARG="";
-
-##### groffer options inhereted from the X Window toolkit
-
-_OPTS_X_SHORT_NA="";
-_OPTS_X_SHORT_ARG="";
-
-_OPTS_X_LONG_NA="'iconic' 'rv'";
-
-_OPTS_X_LONG_ARG="'background' 'bd' 'bg' 'bordercolor' 'borderwidth' \
-'bw' 'display' 'fg' 'fn' 'font' 'foreground' 'ft' 'geometry' \
-'resolution' 'title' 'xrm'";
-
-###### groffer options inherited from man
-
-_OPTS_MAN_SHORT_NA="";
-_OPTS_MAN_SHORT_ARG="";
-
-_OPTS_MAN_LONG_NA="'all' 'ascii' 'catman' 'ditroff' \
-'local-file' 'location' 'troff' 'update' 'where'";
-
-_OPTS_MAN_LONG_ARG="'locale' 'manpath' \
-'pager' 'preprocessor' 'prompt' 'sections' 'systems' 'troff-device'";
-
-###### additional options for parsing $MANOPT only
-
-_OPTS_MANOPT_SHORT_NA="'7' 'a' 'c' 'd' 'D' 'f' 'h' 'k' 'l' 't' 'u' \
-'V' 'w' 'Z'";
-_OPTS_MANOPT_SHORT_ARG="'e' 'L' 'm' 'M' 'p' 'P' 'r' 'S' 'T'";
-
-_OPTS_MANOPT_LONG_NA="${_OPTS_MAN_LONG_NA} \
-'apropos' 'debug' 'default' 'help' 'html' 'ignore-case' 'location-cat' \
-'match-case' 'troff' 'update' 'version' 'whatis' 'where' 'where-cat'";
-
-_OPTS_MANOPT_LONG_ARG="${_OPTS_MAN_LONG_NA} \
-'config_file' 'encoding' 'extension' 'locale'";
-
-###### collections of command line options
-
-_OPTS_CMDLINE_SHORT_NA="${_OPTS_GROFFER_SHORT_NA} \
-${_OPTS_GROFF_SHORT_NA} ${_OPTS_X_SHORT_NA} ${_OPTS_MAN_SHORT_NA}";
-_OPTS_CMDLINE_SHORT_ARG="${_OPTS_GROFFER_SHORT_ARG} \
-${_OPTS_GROFF_SHORT_ARG} ${_OPTS_X_SHORT_ARG} ${_OPTS_MAN_SHORT_ARG}";
-
-_OPTS_CMDLINE_LONG_NA="${_OPTS_GROFFER_LONG_NA} \
-${_OPTS_GROFF_LONG_NA} ${_OPTS_X_LONG_NA} ${_OPTS_MAN_LONG_NA}";
-_OPTS_CMDLINE_LONG_ARG="${_OPTS_GROFFER_LONG_ARG} \
-${_OPTS_GROFF_LONG_ARG} ${_OPTS_MAN_LONG_ARG} ${_OPTS_X_LONG_ARG}";
-
-
-########################################################################
-# read-write variables (global to this file)
-########################################################################
-
-export _ALL_PARAMS; # All options and file name parameters
-export _ADDOPTS_GROFF; # Transp. options for groff (`eval').
-export _APROPOS_PROG; # Program to run apropos.
-export _APROPOS_SECTIONS; # Sections for different --apropos-*.
-export _DISPLAY_MODE; # Display mode.
-export _DISPLAY_PROG; # Viewer program to be used for display.
-export _DISPLAY_ARGS; # X resources for the viewer program.
-export _FILE_NR; # number for temporary `,file,*'
-export _FILEARGS; # Stores filespec parameters.
-export _FILESPEC_ARG; # Stores the actual filespec parameter.
-export _FILESPEC_IS_MAN; # filespec is for searching a man page
-export _FUNC_STACK; # Store debugging information.
-export _MACRO_PACKAGES; # groff's macro packages.
-export _MACRO_PKG; # Macro package for each found file.
-export _NO_FILESPECS; # Yes, if there are no filespec arguments.
-export _OUTPUT_FILE_NAME; # output generated, see main_set_res..()
-export _REG_TITLE_LIST; # Processed file names.
-export _SOELIM_R; # option -r for soelim
-export _SPECIAL_FILESPEC; # Filespec ran for apropos or whatis.
-export _SPECIAL_SETUP; # Test on setup for apropos or whatis.
-export _VIEWER_BACKGROUND; # viewer shall be run in the background or not
-# _MAN_* finally used configuration of man searching
-export _MAN_ALL; # search all man pages per filespec
-export _MAN_ENABLE; # enable search for man pages
-export _MAN_EXT; # extension for man pages
-export _MAN_FORCE; # force file parameter to be man pages
-export _MAN_IS_SETUP; # setup man variables only once
-export _MAN_LANG; # language for man pages
-export _MAN_LANG2; # language for man pages
-export _MAN_PATH; # search path for man pages as a list
-export _MAN_SEC; # sections for man pages; sep. `:'
-export _MAN_SEC_CHARS; # sections for man pages as [] construct
-export _MAN_SEC_LIST; # sections for man pages as a list
-export _MAN_SYS; # system names for man pages as a list
-# _MANOPT_* as parsed from $MANOPT
-export _MANOPT_ALL; # $MANOPT --all
-export _MANOPT_EXTENSION; # $MANOPT --extension
-export _MANOPT_LANG; # $MANOPT --locale
-export _MANOPT_PATH; # $MANOPT --manpath
-export _MANOPT_PAGER; # $MANOPT --pager
-export _MANOPT_SEC; # $MANOPT --sections
-export _MANOPT_SYS; # $MANOPT --systems
-# variables for mode pdf
-export _PDF_DID_NOT_WORK;
-export _PDF_HAS_GS;
-export _PDF_HAS_PS2PDF;
-# _OPT_* as parsed from groffer command line
-export _OPT_ALL; # display all suitable man pages
-export _OPT_APROPOS; # call `apropos' program
-export _OPT_BD; # set border color in some modes
-export _OPT_BG; # set background color in some modes
-export _OPT_BW; # set border width in some modes
-export _OPT_DEFAULT_MODES; # `,'-list of modes when no mode given
-export _OPT_DEVICE; # device option
-export _OPT_DO_NOTHING; # do nothing in main_display()
-export _OPT_DISPLAY; # set X display
-export _OPT_EXTENSION; # set extension for man page search
-export _OPT_FG; # set foreground color in some modes
-export _OPT_FN; # set font in some modes
-export _OPT_GEOMETRY; # set size and position of viewer in X
-export _OPT_ICONIC; # -iconic option for X viewers
-export _OPT_LANG; # set language for man pages
-export _OPT_MODE; # values: X, tty, Q, Z, ""
-export _OPT_MANPATH; # manual setting of path for man-pages
-export _OPT_PAGER; # specify paging program for tty mode
-export _OPT_RESOLUTION; # set X resolution in dpi
-export _OPT_RV; # reverse fore- and background colors
-export _OPT_SECTIONS; # sections for man page search
-export _OPT_STDOUT; # print mode file to standard output
-export _OPT_SYSTEMS; # man pages of different OS's
-export _OPT_TITLE; # title for gxditview window
-export _OPT_TEXT_DEVICE; # set device for tty mode
-export _OPT_V; # groff option -V
-export _OPT_VIEWER_DVI; # viewer program for dvi mode
-export _OPT_VIEWER_HTML; # viewer program for html mode
-export _OPT_VIEWER_PDF; # viewer program for pdf mode
-export _OPT_VIEWER_PS; # viewer program for ps mode
-export _OPT_VIEWER_X; # viewer program for x mode
-export _OPT_WHATIS; # print the man description
-export _OPT_XRM; # specify X resource
-export _OPT_Z; # groff option -Z
-# _TMP_* temporary directory and files
-export _TMP_DIR; # groffer directory for temporary files
-export _TMP_CAT; # stores concatenation of everything
-export _TMP_MAN; # stores find of man path
-export _TMP_MANSPEC; # filters man pages with filespec
-export _TMP_STDIN; # stores stdin, if any
-
-# these variables are preset in section `Preset' after the rudim. test
-
-
-########################################################################
-# Preset and reset of read-write global variables
-########################################################################
-
-# For variables that can be reset by option `--default', see reset().
-
-_FILE_NR=0;
-_FILEARGS='';
-_MACRO_PACKAGES="'-man' '-mdoc' '-me' '-mm' '-mom' '-ms'";
-_SPECIAL_FILESPEC='no';
-_SPECIAL_SETUP='no';
-
-# _TMP_* temporary files
-_TMP_DIR='';
-_TMP_CAT='';
-_TMP_MAN='';
-_TMP_CONF='';
-_TMP_STDIN='';
-
-# variables for mode pdf
-_PDF_DID_NOT_WORK='no';
-_PDF_HAS_GS='no';
-_PDF_HAS_PS2PDF='no';
-
-# option -r for soelim
-if : | soelim -r 2>${_NULL_DEV} >${_NULL_DEV}
-then
- _SOELIM_R='-r';
-else
- _SOELIM_R='';
-fi;
-
-########################################################################
-# reset ()
-#
-# Reset the variables that can be affected by options to their default.
-#
-reset()
-{
- if test "$#" -ne 0
- then
- error "reset() does not have arguments.";
- fi;
-
- _ADDOPTS_GROFF='';
- _APROPOS_PROG='';
- _APROPOS_SECTIONS='';
- _DISPLAY_ARGS='';
- _DISPLAY_MODE='';
- _DISPLAY_PROG='';
- _MACRO_PKG='';
- _NO_FILESPECS='';
- _REG_TITLE_LIST='';
-
- # _MAN_* finally used configuration of man searching
- _MAN_ALL='no';
- _MAN_ENABLE='yes'; # do search for man-pages
- _MAN_EXT='';
- _MAN_FORCE='no'; # first local file, then search man page
- _MAN_IS_SETUP='no';
- _MAN_LANG='';
- _MAN_LANG2='';
- _MAN_PATH='';
- _MAN_SEC='';
- _MAN_SEC_CHARS='';
- _MAN_SEC_LIST='';
- _MAN_SYS='';
-
- # _MANOPT_* as parsed from $MANOPT
- _MANOPT_ALL='no';
- _MANOPT_EXTENSION='';
- _MANOPT_LANG='';
- _MANOPT_PATH='';
- _MANOPT_PAGER='';
- _MANOPT_SEC='';
- _MANOPT_SYS='';
-
- # _OPT_* as parsed from groffer command line
- _OPT_ALL='no';
- _OPT_APROPOS='no';
- _OPT_BD='';
- _OPT_BG='';
- _OPT_BW='';
- _OPT_DEFAULT_MODES='';
- _OPT_DEVICE='';
- _OPT_DISPLAY='';
- _OPT_DO_NOTHING='no';
- _OPT_EXTENSION='';
- _OPT_FG='';
- _OPT_FN='';
- _OPT_GEOMETRY='';
- _OPT_ICONIC='no';
- _OPT_LANG='';
- _OPT_MODE='';
- _OPT_MANPATH='';
- _OPT_PAGER='';
- _OPT_RESOLUTION='';
- _OPT_RV='no';
- _OPT_SECTIONS='';
- _OPT_SYSTEMS='';
- _OPT_STDOUT='no';
- _OPT_TITLE='';
- _OPT_TEXT_DEVICE='';
- _OPT_V='no';
- _OPT_VIEWER_DVI='';
- _OPT_VIEWER_PDF='';
- _OPT_VIEWER_PS='';
- _OPT_VIEWER_HTML='';
- _OPT_VIEWER_X='';
- _OPT_WHATIS='no';
- _OPT_XRM='';
- _OPT_Z='no';
- _VIEWER_BACKGROUND='no';
-}
-
-reset;
-
-
-########################################################################
-# Preliminary functions for error handling
-########################################################################
-
-landmark "2: preliminary functions";
-
-# These functions do not have a func-check frame. Basically they could be
-# moved to the functions in alphabetical order.
-
-##############
-# echo1 (<text>*)
-#
-# Output to stdout with final line break.
-#
-# Arguments : arbitrary text including `-'.
-#
-echo1()
-{
- cat <<EOF
-$@
-EOF
-} # echo1()
-
-
-##############
-# echo2 (<text>*)
-#
-# Output to stderr with final line break.
-#
-# Arguments : arbitrary text including `-'.
-#
-echo2()
-{
- cat >&2 <<EOF
-$@
-EOF
-} # echo2()
-
-
-
-
-##############
-# clean_up ()
-#
-# Clean up at exit.
-#
-cu_already='no';
-clean_up()
-{
- cd "${_START_DIR}" >"${_NULL_DEV}" 2>&1;
- if test _${_DEBUG_KEEP_FILES}_ = _yes_
- then
- if test _"$cu_already"_ = _yes_
- then
- eval "${return_ok}";
- fi;
- cu_already=yes;
- echo2 "Kept temporary directory ${_TMP_DIR}."
- else
- if test _"${_TMP_DIR}"_ != __
- then
- if test -e "${_TMP_DIR}"
- then
- rm -f -r "${_TMP_DIR}" >${_NULL_DEV} 2>&1;
- fi;
- fi;
- fi;
- eval "${return_ok}";
-} # clean_up()
-
-
-#############
-# diag (text>*)
-#
-# Output a diagnostic message to stderr.
-#
-diag()
-{
- echo2 '>>>>>'"$*";
-} # diag()
-
-
-#############
-# error (<text>*)
-#
-# Print an error message to standard error, print the function stack,
-# exit with an error condition. The argument should contain the name
-# of the function from which it was called. This is for system errors.
-#
-error()
-{
- case "$#" in
- 1) echo2 'groffer error: '"$1"; ;;
- *) echo2 'groffer error: wrong number of arguments in error().'; ;;
- esac;
- func_stack_dump;
- if test _"${_TMP_DIR}"_ != __ && test -d "${_TMP_DIR}"
- then
- : >"${_TMP_DIR}"/,error;
- fi;
- exit "${_ERROR}";
-} # error()
-
-
-#############
-# error_user (<text>*)
-#
-# Print an error message to standard error; exit with an error condition.
-# The error is supposed to be produced by the user. So the funtion stack
-# is omitted.
-#
-error_user()
-{
- case "$#" in
- 1)
- echo2 'groffer error: '"$1";
- ;;
- *)
- echo2 'groffer error: wrong number of arguments in error_user().';
- ;;
- esac;
- if test _"${_DEBUG_USER_WITH_STACK}"_ = _yes_
- then
- func_stack_dump;
- fi;
- if test _"${_TMP_DIR}"_ != __ && test -d "${_TMP_DIR}"
- then
- : >"${_TMP_DIR}"/,error;
- fi;
- exit "${_ERROR}";
-} # error_user()
-
-
-
-#############
-# exit_test ()
-#
-# Test whether the former command ended with error(). Exit again.
-#
-# Globals: $_ERROR
-#
-exit_test()
-{
- if test "$?" = "${_ERROR}"
- then
- exit ${_ERROR};
- fi;
- if test _"${_TMP_DIR}"_ != __ && test -f "${_TMP_DIR}"/,error
- then
- exit ${_ERROR};
- fi;
-} # exit_test()
-
-
-########################################################################
-# Definition of normal Functions in alphabetical order
-########################################################################
-
-landmark "3: functions";
-
-########################################################################
-# apropos_filespec ()
-#
-# Compose temporary file for filspec.
-#
-# Globals: in: $_OPT_APROPOS, $_SPECIAL_SETUP, $_FILESPEC_ARG,
-# $_APROPOS_PROG, $_APROPOS_SECTIONS, $_OPT_SECTIONS
-# out: $_SPECIAL_FILESPEC
-#
-# Variable prefix: af
-#
-apropos_filespec()
-{
-
- func_check apropos_filespec '=' 0 "$@";
- if obj _OPT_APROPOS is_yes
- then
- if obj _SPECIAL_SETUP is_not_yes
- then
- error 'apropos_filespec(): apropos_setup() must be run first.';
- fi;
- _SPECIAL_FILESPEC='yes';
- if obj _NO_FILESPECS is_yes
- then
- to_tmp_line '.SH no filespec';
- eval "${_APROPOS_PROG}" | sed 's/^/\\\&/' >>"${_TMP_CAT}";
- eval "${return_ok}";
- fi;
- eval to_tmp_line \
- "'.SH $(echo1 "${_FILESPEC_ARG}" | sed 's/[^\\]-/\\-/g')'";
- exit_test;
- if obj _APROPOS_SECTIONS is_empty
- then
- if obj _OPT_SECTIONS is_empty
- then
- s='^.*(..*).*$';
- else
- s='^.*(['"$(echo1 "${_OPT_SECTIONS}" | sed 's/://g')"']';
- fi;
- else
- s='^.*(['"${_APROPOS_SECTIONS}"']';
- fi;
-### apropos_filespec()
- af_filespec="$(echo1 "${_FILESPEC_ARG}" | sed '
-s,/,\\/,g
-s/\./\\./g
-')";
- eval "${_APROPOS_PROG}" "'${_FILESPEC_ARG}'" | \
- sed -n '
-/^'"${af_filespec}"': /s/^\(.*\)$/\\\&\1/p
-/'"$s"'/p
-' | \
- sort |\
- sed '
-s/^\(.*(..*).*\) *- *\(.*\)$/\.br\n\.TP 15\n\.BR \"\1\"\n\\\&\2/
-' >>"${_TMP_CAT}";
- eval ${_UNSET} af_filespec;
- eval "${return_ok}";
- else
- eval "${return_bad}";
- fi;
-} # apropos_filespec()
-
-
-########################################################################
-# apropos_setup ()
-#
-# Setup for the --apropos* options, just 2 global variables are set.
-#
-# Globals: in: $_OPT_APROPOS
-# out: $_SPECIAL_SETUP, $_APROPOS_PROG
-#
-apropos_setup()
-{
- func_check apropos_setup '=' 0 "$@";
- if obj _OPT_APROPOS is_yes
- then
- if is_prog apropos
- then
- _APROPOS_PROG='apropos';
- elif is_prog man
- then
- if man --apropos man >${_NULL_DEV} 2>${_NULL_DEV}
- then
- _APROPOS_PROG='man --apropos';
- elif man -k man >${_NULL_DEV} 2>${_NULL_DEV}
- then
- _APROPOS_PROG='man -k';
- fi;
- fi;
- if obj _APROPOS_PROG is_empty
- then
- error 'apropos_setup(): no apropos program available.';
- fi;
- to_tmp_line '.TH GROFFER APROPOS';
- _SPECIAL_SETUP='yes';
- if obj _OPT_TITLE is_empty
- then
- _OPT_TITLE='apropos';
- fi;
- eval "${return_ok}";
- else
- eval "${return_bad}";
- fi;
-} # apropos_setup()
-
-
-########################################################################
-# base_name (<path>)
-#
-# Get the file name part of <path>, i.e. delete everything up to last
-# `/' from the beginning of <path>. Remove final slashes, too, to get
-# a non-empty output. The output is constructed according the shell
-# program `basename'.
-#
-# Arguments : 1
-# Output : the file name part (without slashes)
-#
-# Variable prefix: bn
-#
-base_name()
-{
- func_check base_name = 1 "$@";
- bn_name="$1";
- case "${bn_name}" in
- */)
- # delete all final slashes
- bn_name="$(echo1 "${bn_name}" | sed 's|//*$||')";
- exit_test;
- ;;
- esac;
- case "${bn_name}" in
- '')
- eval ${_UNSET} bn_name;
- eval "${return_bad}";
- ;;
- /)
- # this is like `basename' does
- echo1 '/';
- ;;
- */*)
- # delete everything before and including the last slash `/'.
- echo1 "${bn_name}" | sed 's|^.*//*\([^/]*\)$|\1|';
- ;;
- *)
- obj bn_name echo1;
- ;;
- esac;
- eval ${_UNSET} bn_name;
- eval "${return_ok}";
-} # base_name()
-
-
-########################################################################
-# cat_z (<file>)
-#
-# Decompress if possible or just print <file> to standard output.
-# gzip, bzip2, and .Z decompression is supported.
-#
-# Arguments: 1, a file name.
-# Output: the content of <file>, possibly decompressed.
-#
-cat_z()
-{
- func_check cat_z = 1 "$@";
- case "$1" in
- '')
- error 'cat_z(): empty file name.';
- ;;
- '-')
- error 'cat_z(): for standard input use save_stdin().';
- ;;
- esac;
- if is_file "$1"
- then
- :;
- else
- error 'cat_z(): argument $1 is not a file.';
- fi;
- if test -s "$1"
- then
- :;
- else
- eval "${return_ok}";
- fi;
- if obj _HAS_COMPRESSION is_yes
- then
- if obj _HAS_BZIP is_yes
- then
- # test whether being compressed with bz2
- if bzip2 -t "$1" 2>${_NULL_DEV}
- then
- bzip2 -c -d "$1" 2>${_NULL_DEV};
- eval "${return_ok}";
- fi;
- fi;
- # if not compressed gzip acts like `cat'
- gzip -c -d -f "$1" 2>${_NULL_DEV};
- else
- cat "$1";
- fi;
- eval "${return_ok}";
-} # cat_z()
-
-
-########################################################################
-# clean_up ()
-#
-# Do the final cleaning up before exiting; used by the trap calls.
-#
-# defined above
-
-
-########################################################################
-# diag (<text>*)
-#
-# Print marked message to standard error; useful for debugging.
-#
-# defined above
-
-
-########################################################################
-landmark '4: dir_name()*';
-########################################################################
-
-#######################################################################
-# dir_name (<name>)
-#
-# Get the directory name of <name>. The output is constructed
-# according to the shell program `dirname'.
-#
-# Arguments : 1
-# Output : the directory part of <name>
-#
-# Variable prefix: dn
-#
-dir_name()
-{
- func_check dir_name = 1 "$@";
- obj_from_output dn_name dir_name_chop "$1";
- case "${dn_name}" in
- ''|.)
- echo1 '.';
- ;;
- /)
- echo1 '/';
- ;;
- */*)
- echo1 "$(echo1 "${dn_name}" | sed 's#/*[^/][^/]*$##')";
- ;;
- *)
- echo1 "${dn_name}";
- ;;
- esac;
- eval "${return_ok}";
-} # dir_name()
-
-
-#######################################################################
-# dir_name_append (<dir> <name>)
-#
-# Append `name' to `dir' with clean handling of `/'.
-#
-# Arguments : 2
-# Output : the generated new directory name <dir>/<name>
-#
-dir_name_append()
-{
- func_check dir_name_append = 2 "$@";
- if is_empty "$1"
- then
- echo1 "$2";
- elif is_empty "$2"
- then
- echo1 "$1";
- else
- dir_name_chop "$1"/"$2";
- fi;
- eval "${return_ok}";
-} # dir_name_append()
-
-
-########################################################################
-# dir_name_chop (<name>)
-#
-# Remove unnecessary slashes from directory name.
-#
-# Argument: 1, a directory name.
-# Output: path without double, or trailing slashes.
-#
-# Variable prefix: dc
-#
-dir_name_chop()
-{
- func_check dir_name_chop = 1 "$@";
- # replace all multiple slashes by a single slash `/'.
- dc_res="$(echo1 "$1" | sed 's|///*|/|g')";
- exit_test;
- case "${dc_res}" in
- ?*/)
- # remove trailing slash '/';
- echo1 "${dc_res}" | sed 's|/$||';
- ;;
- *)
- obj dc_res echo1
- ;;
- esac;
- eval ${_UNSET} dc_res;
- eval "${return_ok}";
-} # dir_name_chop()
-
-
-########################################################################
-# do_nothing ()
-#
-# Dummy function that does nothing.
-#
-do_nothing()
-{
- eval return "${_OK}";
-} # do_nothing()
-
-
-########################################################################
-# echo1 (<text>*)
-#
-# Print to standard output with final line break.
-#
-# defined above
-
-
-########################################################################
-# echo2 (<text>*)
-#
-# Print to standard error with final line break.
-#
-# defined above
-
-
-
-########################################################################
-# error (<text>*)
-#
-# Print error message and exit with error code.
-#
-# defined above
-
-
-########################################################################
-# exit_test ()
-#
-# Test whether the former command ended with error(). Exit again.
-#
-# defined above
-
-
-if test _"${_DEBUG_FUNC_CHECK}"_ = _yes_
-then
-
- #############
- # func_check (<func_name> <rel_op> <nr_args> "$@")
- #
- # This is called at the first line of each function. It checks the
- # number of arguments of function <func_name> and registers the
- # function call to _FUNC_STACK.
- #
- # Arguments: >=3
- # <func_name>: name of the calling function.
- # <rel_op>: a relational operator: = != < > <= >=
- # <nr_args>: number of arguments to be checked against <operator>
- # "$@": the arguments of the calling function.
- #
- # Variable prefix: fc
- #
- func_check()
- {
- if test "$#" -lt 3
- then
- error 'func_check() needs at least 3 arguments.';
- fi;
- fc_fname="$1";
- case "$3" in
- 1)
- fc_nargs="$3";
- fc_s='';
- ;;
- 0|[2-9])
- fc_nargs="$3";
- fc_s='s';
- ;;
- *)
- error "func_check(): third argument must be a digit.";
- ;;
- esac;
-### func_check()
- case "$2" in
- '='|'-eq')
- fc_op='-eq';
- fc_comp='exactly';
- ;;
- '>='|'-ge')
- fc_op='-ge';
- fc_comp='at least';
- ;;
- '<='|'-le')
- fc_op='-le';
- fc_comp='at most';
- ;;
- '<'|'-lt')
- fc_op='-lt';
- fc_comp='less than';
- ;;
- '>'|'-gt')
- fc_op='-gt';
- fc_comp='more than';
- ;;
- '!='|'-ne')
- fc_op='-ne';
- fc_comp='not';
- ;;
-### func_check()
- *)
- error \
- 'func_check(): second argument is not a relational operator.';
- ;;
- esac;
- shift;
- shift;
- shift;
- if test "$#" "${fc_op}" "${fc_nargs}"
- then
- do_nothing;
- else
- error "func_check(): \
-${fc_fname}"'() needs '"${fc_comp} ${fc_nargs}"' argument'"${fc_s}"'.';
- fi;
- func_push "${fc_fname}";
- if test _"${_DEBUG_STACKS}"_ = _yes_
- then
- echo2 '+++ '"${fc_fname} $@";
- echo2 '>>> '"${_FUNC_STACK}";
- fi;
- eval ${_UNSET} fc_comp;
- eval ${_UNSET} fc_fname;
- eval ${_UNSET} fc_nargs;
- eval ${_UNSET} fc_op;
- eval ${_UNSET} fc_s;
- } # func_check()
-
-
- #############
- # func_pop ()
- #
- # Retrieve the top element from the function stack. This is called
- # by every return variable in each function.
- #
- # The stack elements are separated by `!'; the popped element is
- # identical to the original element, except that all `!' characters
- # were removed.
- #
- # Arguments: 1
- #
- func_pop()
- {
- if test "$#" -ne 0
- then
- error 'func_pop() does not have arguments.';
- fi;
- case "${_FUNC_STACK}" in
- '')
- if test _"${_DEBUG_STACKS}"_ = _yes_
- then
- error 'func_pop(): stack is empty.';
- fi;
- ;;
- *!*)
- # split at first bang `!'.
- _FUNC_STACK="$(echo1 "${_FUNC_STACK}" | sed 's/^[^!]*!//')";
- exit_test;
- ;;
- *)
- _FUNC_STACK='';
- ;;
- esac;
- if test _"${_DEBUG_STACKS}"_ = _yes_
- then
- echo2 '<<< '"${_FUNC_STACK}";
- fi;
- } # func_pop()
-
-
- #############
- # func_push (<element>)
- #
- # Store another element to the function stack. This is called by
- # func_check() at the beginning of each function.
- #
- # The stack elements are separated by `!'; if <element> contains a `!'
- # it is removed first.
- #
- # Arguments: 1
- #
- # Variable prefix: fp
- #
- func_push()
- {
- if test "$#" -ne 1
- then
- error 'func_push() needs 1 argument.';
- fi;
- case "$1" in
- *'!'*)
- # remove all bangs `!'.
- fp_element="$(echo1 "$1" | sed 's/!//g')";
- exit_test;
- ;;
- *)
- fp_element="$1";
- ;;
- esac;
- if test _"${_FUNC_STACK}"_ = __
- then
- _FUNC_STACK="${fp_element}";
- else
- _FUNC_STACK="${fp_element}!${_FUNC_STACK}";
- fi;
- eval ${_UNSET} fp_element;
- } # func_push()
-
-
- #############
- # func_stack_dump ()
- #
- # Print the content of the function stack. Ignore the arguments.
- #
- func_stack_dump()
- {
- diag 'call stack(): '"${_FUNC_STACK}";
- } # func_stack_dump()
-
-else # $_DEBUG_FUNC_CHECK is not `yes'
-
- func_check() { return; }
- func_pop() { return; }
- func_push() { return; }
- func_stack_dump() { return; }
-
-fi; # test of $_DEBUG_FUNC_CHECK
-
-
-########################################################################
-# get_first_essential (<arg>*)
-#
-# Retrieve first non-empty argument.
-#
-# Return : `1' if all arguments are empty, `0' if found.
-# Output : the retrieved non-empty argument.
-#
-# Variable prefix: gfe
-#
-get_first_essential()
-{
- func_check get_first_essential '>=' 0 "$@";
- if is_equal "$#" 0
- then
- eval "${return_ok}";
- fi;
- for i
- do
- gfe_var="$i";
- if obj gfe_var is_not_empty
- then
- obj gfe_var echo1;
- eval ${_UNSET} gfe_var;
- eval "${return_ok}";
- fi;
- done;
- eval ${_UNSET} gfe_var;
- eval "${return_bad}";
-} # get_first_essential()
-
-
-########################################################################
-landmark '5: is_*()';
-########################################################################
-
-########################################################################
-# is_dir (<name>)
-#
-# Test whether `name' is a readable directory.
-#
-# Arguments : 1
-# Return : `0' if arg1 is a directory, `1' otherwise.
-#
-is_dir()
-{
- func_check is_dir '=' 1 "$@";
- if is_not_empty "$1" && test -d "$1" && test -r "$1"
- then
- eval "${return_yes}";
- fi;
- eval "${return_no}";
-} # is_dir()
-
-
-########################################################################
-# is_empty (<string>)
-#
-# Test whether <string> is empty.
-#
-# Arguments : <=1
-# Return : `0' if arg1 is empty or does not exist, `1' otherwise.
-#
-is_empty()
-{
- func_check is_empty '=' 1 "$@";
- if test _"$1"_ = __
- then
- eval "${return_yes}";
- fi;
- eval "${return_no}";
-} # is_empty()
-
-
-########################################################################
-# is_empty_file (<file_name>)
-#
-# Test whether <file_name> is an empty existing file.
-#
-# Arguments : <=1
-# Return :
-# `0' if arg1 is an empty existing file
-# `1' otherwise
-#
-is_empty_file()
-{
- func_check is_empty_file '=' 1 "$@";
- if is_file "$1"
- then
- if test -s "$1"
- then
- eval "${return_no}";
- else
- eval "${return_yes}";
- fi;
- fi;
- eval "${return_no}";
-} # is_empty_file()
-
-
-########################################################################
-# is_equal (<string1> <string2>)
-#
-# Test whether <string1> is equal to <string2>.
-#
-# Arguments : 2
-# Return : `0' both arguments are equal strings, `1' otherwise.
-#
-is_equal()
-{
- func_check is_equal '=' 2 "$@";
- if test _"$1"_ = _"$2"_
- then
- eval "${return_yes}";
- fi;
- eval "${return_no}";
-} # is_equal()
-
-
-########################################################################
-# is_existing (<name>)
-#
-# Test whether <name> is an existing file or directory. Solaris 2.5 does
-# not have `test -e'.
-#
-# Arguments : 1
-# Return : `0' if arg1 exists, `1' otherwise.
-#
-is_existing()
-{
- func_check is_existing '=' 1 "$@";
- if is_empty "$1"
- then
- eval "${return_no}";
- fi;
- if test -f "$1" || test -d "$1" || test -c "$1"
- then
- eval "${return_yes}";
- fi;
- eval "${return_no}";
-} # is_existing()
-
-
-########################################################################
-# is_file (<name>)
-#
-# Test whether <name> is a readable file.
-#
-# Arguments : 1
-# Return : `0' if arg1 is a readable file, `1' otherwise.
-#
-is_file()
-{
- func_check is_file '=' 1 "$@";
- if is_not_empty "$1" && test -f "$1" && test -r "$1"
- then
- eval "${return_yes}";
- fi;
- eval "${return_no}";
-} # is_file()
-
-
-########################################################################
-# is_greater_than (<integer1> <integer2>)
-#
-# Test whether <integer1> is greater than <integer2>.
-#
-# Arguments : 2
-# Return : `0' if <integer1> is a greater integer than <integer2>,
-# `1' otherwise.
-#
-is_greater_than()
-{
- func_check is_greater_than '=' 2 "$@";
- if is_integer "$1" && is_integer "$2" && test "$1" -gt "$2"
- then
- eval "${return_yes}";
- fi;
- eval "${return_no}";
-} # is_greater_than()
-
-
-########################################################################
-# is_integer (<string>)
-#
-# Test whether `string' is an integer.
-#
-# Arguments : 1
-# Return : `0' if argument is an integer, `1' otherwise.
-#
-is_integer()
-{
- func_check is_integer '=' 1 "$@";
- if is_equal "$(echo1 "$1" | sed -n '
-s/^[0-9][0-9]*$/ok/p
-s/^[-+][0-9][0-9]*$/ok/p
-')" 'ok'
- then
- eval "${return_yes}";
- fi;
- eval "${return_no}";
-} # is_integer()
-
-
-########################################################################
-# is_not_empty_file (<file_name>)
-#
-# Test whether <file_name> is a non-empty existing file.
-#
-# Arguments : <=1
-# Return :
-# `0' if arg1 is a non-empty existing file
-# `1' otherwise
-#
-is_not_empty_file()
-{
- func_check is_not_empty_file '=' 1 "$@";
- if is_file "$1" && test -s "$1"
- then
- eval "${return_yes}";
- fi;
- eval "${return_no}";
-} # is_not_empty_file()
-
-
-########################################################################
-# is_not_dir (<name>)
-#
-# Test whether <name> is not a readable directory.
-#
-# Arguments : 1
-# Return : `0' if arg1 is a directory, `1' otherwise.
-#
-is_not_dir()
-{
- func_check is_not_dir '=' 1 "$@";
- if is_dir "$1"
- then
- eval "${return_no}";
- fi;
- eval "${return_yes}";
-} # is_not_dir()
-
-
-########################################################################
-# is_not_empty (<string>)
-#
-# Test whether <string> is not empty.
-#
-# Arguments : <=1
-# Return : `0' if arg1 exists and is not empty, `1' otherwise.
-#
-is_not_empty()
-{
- func_check is_not_empty '=' 1 "$@";
- if is_empty "$1"
- then
- eval "${return_no}";
- fi;
- eval "${return_yes}";
-} # is_not_empty()
-
-
-########################################################################
-# is_not_equal (<string1> <string2>)
-#
-# Test whether <string1> differs from <string2>.
-#
-# Arguments : 2
-#
-is_not_equal()
-{
- func_check is_not_equal '=' 2 "$@";
- if is_equal "$1" "$2"
- then
- eval "${return_no}";
- fi
- eval "${return_yes}";
-} # is_not_equal()
-
-
-########################################################################
-# is_not_file (<filename>)
-#
-# Test whether <filename> is a not readable file.
-#
-# Arguments : 1 (empty allowed)
-#
-is_not_file()
-{
- func_check is_not_file '=' 1 "$@";
- if is_file "$1"
- then
- eval "${return_no}";
- fi;
- eval "${return_yes}";
-} # is_not_file()
-
-
-########################################################################
-# is_not_prog (<program>)
-#
-# Verify that <program> is not a command in $PATH.
-#
-# Arguments : 1, <program> can have spaces and arguments.
-#
-is_not_prog()
-{
- func_check is_not_prog '=' 1 "$@";
- if where_is_prog "$1" >${_NULL_DEV}
- then
- eval "${return_no}";
- fi;
- eval "${return_yes}";
-} # is_not_prog()
-
-
-########################################################################
-# is_not_writable (<name>)
-#
-# Test whether <name> is not a writable file or directory.
-#
-# Arguments : >=1 (empty allowed), more args are ignored
-#
-is_not_writable()
-{
- func_check is_not_writable '>=' 1 "$@";
- if is_writable "$1"
- then
- eval "${return_no}";
- fi;
- eval "${return_yes}";
-} # is_not_writable()
-
-
-########################################################################
-# is_not_X ()
-#
-# Test whether the script is not running in X Window by checking $DISPLAY.
-#
-is_not_X()
-{
- func_check is_not_X '=' 0 "$@";
- if obj DISPLAY is_empty
- then
- eval "${return_yes}";
- fi;
- eval "${return_no}";
-} # is_not_X()
-
-
-########################################################################
-# is_not_yes (<string>)
-#
-# Test whether <string> is not `yes'.
-#
-# Arguments : 1
-#
-is_not_yes()
-{
- func_check is_not_yes = 1 "$@";
- if is_yes "$1"
- then
- eval "${return_no}";
- fi;
- eval "${return_yes}";
-} # is_not_yes()
-
-
-########################################################################
-# is_prog (<name>)
-#
-# Determine whether <name> is a program in $PATH.
-#
-# Arguments : 1, <program> can have spaces and arguments.
-#
-is_prog()
-{
- func_check is_prog '=' 1 "$@";
- if where_is_prog "$1" >${_NULL_DEV}
- then
- eval "${return_yes}";
- fi;
- eval "${return_no}";
-} # is_prog()
-
-
-########################################################################
-# is_writable (<name>)
-#
-# Test whether <name> is a writable file or directory.
-#
-# Arguments : >=1 (empty allowed), more args are ignored
-#
-is_writable()
-{
- func_check is_writable '>=' 1 "$@";
- if is_empty "$1"
- then
- eval "${return_no}";
- fi;
- if test -r "$1"
- then
- if test -w "$1"
- then
- eval "${return_yes}";
- fi;
- fi;
- eval "${return_no}";
-} # is_writable()
-
-
-########################################################################
-# is_X ()
-#
-# Test whether the script is running in X Window by checking $DISPLAY.
-#
-is_X()
-{
- func_check is_X '=' 0 "$@";
- if obj DISPLAY is_not_empty
- then
- eval "${return_yes}";
- fi;
- eval "${return_no}";
-} # is_X()
-
-
-########################################################################
-# is_yes (<string>)
-#
-# Test whether <string> has value `yes'.
-#
-# Return : `0' if arg1 is `yes', `1' otherwise.
-#
-is_yes()
-{
- func_check is_yes '=' 1 "$@";
- if is_equal "$1" 'yes'
- then
- eval "${return_yes}";
- fi;
- eval "${return_no}";
-} # is_yes()
-
-
-########################################################################
-# landmark ()
-#
-# Print debugging information on standard error if $_DEBUG_LM is `yes'.
-#
-# Globals: $_DEBUG_LM
-#
-# Defined in section `Debugging functions'.
-
-
-########################################################################
-# leave ([<code>])
-#
-# Clean exit without an error or with error <code>.
-#
-leave()
-{
- clean_up;
- if test $# = 0
- then
- exit "${_OK}";
- else
- exit "$1";
- fi;
-} # leave()
-
-
-########################################################################
-landmark '6: list_*()';
-########################################################################
-#
-# `list' is an object class that represents an array or list. Its
-# data consists of space-separated single-quoted elements. So a list
-# has the form "'first' 'second' '...' 'last'". See list_append() for
-# more details on the list structure. The array elements of `list'
-# can be get by `eval set x "$list"; shift`.
-
-
-########################################################################
-# list_append (<list> <element>...)
-#
-# Add one or more elements to an existing list. <list> may also be
-# empty.
-#
-# Arguments: >=2
-# <list>: a variable name for a list of single-quoted elements
-# <element>: some sequence of characters.
-# Output: none, but $<list> is set to
-# if <list> is empty: "'<element>' '...'"
-# otherwise: "$list '<element>' ..."
-#
-# Variable prefix: la
-#
-list_append()
-{
- func_check list_append '>=' 2 "$@";
- la_name="$1";
- eval la_list='"${'"$1"'}"';
- shift;
- for s
- do
- la_s="$s";
- case "${la_s}" in
- *\'*)
- # escape each single quote by replacing each
- # "'" (squote) by "'\''" (squote bslash squote squote);
- # note that the backslash must be doubled in the following `sed'
- la_element="$(echo1 "${la_s}" | sed 's/'"${_SQ}"'/&\\&&/g')";
- exit_test;
- ;;
- '')
- la_element="";
- ;;
- *)
- la_element="${la_s}";
- ;;
- esac;
-### list_append()
- if obj la_list is_empty
- then
- la_list="'${la_element}'";
- else
- la_list="${la_list} '${la_element}'";
- fi;
- done;
- eval "${la_name}"='"${la_list}"';
- eval ${_UNSET} la_element;
- eval ${_UNSET} la_list;
- eval ${_UNSET} la_name;
- eval ${_UNSET} la_s;
- eval "${return_ok}";
-} # list_append()
-
-
-########################################################################
-# list_from_cmdline (<pre_name_of_opt_lists> [<cmdline_arg>...])
-#
-# Transform command line arguments into a normalized form.
-#
-# Options, option arguments, and file parameters are identified and
-# output each as a single-quoted argument of its own. Options and
-# file parameters are separated by a '--' argument.
-#
-# Arguments: >=1
-# <pre_name>: common part of a set of 4 environment variable names:
-# $<pre_name>_SHORT_NA: list of short options without an arg.
-# $<pre_name>_SHORT_ARG: list of short options that have an arg.
-# $<pre_name>_LONG_NA: list of long options without an arg.
-# $<pre_name>_LONG_ARG: list of long options that have an arg.
-# <cmdline_arg>...: the arguments from a command line, such as "$@",
-# the content of a variable, or direct arguments.
-#
-# Output: ['-[-]opt' ['optarg']]... '--' ['filename']...
-#
-# Example:
-# list_from_cmdline PRE -a f1 -bcarg --lon=larg f2 low larg2
-# PRE_SHORT_NA="'a' 'b'"
-# PRE_SHORT_ARG="'c' 'd'"
-# PRE_LONG_NA="'help' 'version'"
-# PRE_LONG_ARG="'longer' 'lower'"
-# This will result in printing:
-# '-a' '-b' '-c' 'arg' '--longer' 'larg' '--lower' 'larg2' '--' 'f1' 'f2'
-#
-# Use this function in the following way:
-# eval set x "$(list_from_cmdline PRE_NAME "$@")";
-# shift;
-# while test "$1" != '--'; do
-# case "$1" in
-# ...
-# esac;
-# shift;
-# done;
-# shift; #skip '--'
-# # all positional parameters ("$@") left are file name parameters.
-#
-# Variable prefix: lfc
-#
-list_from_cmdline()
-{
- func_check list_from_cmdline '>=' 1 "$@";
- # short options, no argument
- obj_from_output lfc_short_n obj_data "$1"_SHORT_NA;
- # short options, with argument
- obj_from_output lfc_short_a obj_data "$1"_SHORT_ARG;
- # long options, no argument
- obj_from_output lfc_long_n obj_data "$1"_LONG_NA;
- # long options, with argument
- obj_from_output lfc_long_a obj_data "$1"_LONG_ARG;
- if obj lfc_short_n is_empty
- then
- error 'list_from_cmdline(): no $'"$1"'_SHORT_NA options.';
- fi;
- if obj lfc_short_a is_empty
- then
- error 'list_from_cmdline(): no $'"$1"'_SHORT_ARG options.';
- fi;
- if obj lfc_long_n is_empty
- then
- error 'list_from_cmdline(): no $'"$1"'_LONG_NA options.';
- fi;
- if obj lfc_long_a is_empty
- then
- error 'list_from_cmdline(): no $'"$1"'_LONG_ARG options.';
- fi;
- shift;
-
- if is_equal "$#" 0
- then
- echo1 "'--'"
- eval ${_UNSET} lfc_fparams;
- eval ${_UNSET} lfc_short_a;
- eval ${_UNSET} lfc_short_n;
-### list_from_cmdline()
- eval ${_UNSET} lfc_long_a;
- eval ${_UNSET} lfc_long_n;
- eval ${_UNSET} lfc_result;
- eval "${return_ok}";
- fi;
-
- lfc_fparams='';
- lfc_result='';
- while is_greater_than "$#" 0
- do
- lfc_arg="$1";
- shift;
- case "${lfc_arg}" in
- --) break; ;;
- --*=*)
- # delete leading '--';
- lfc_with_equal="$(echo1 "${lfc_arg}" | sed 's/^--//')";
- # extract option by deleting from the first '=' to the end
- lfc_abbrev="$(echo1 "${lfc_with_equal}" | \
- sed 's/^\([^=]*\)=.*$/\1/')";
- obj_from_output lfc_opt \
- list_single_from_abbrev lfc_long_a "${lfc_abbrev}";
- if obj lfc_opt is_empty
- then
- error_user "--${lfc_abbrev} is not an option.";
- else
- # get the option argument by deleting up to first `='
- lfc_optarg="$(echo1 "${lfc_with_equal}" | sed 's/^[^=]*=//')";
- exit_test;
- list_append lfc_result "--${lfc_opt}" "${lfc_optarg}";
- continue;
- fi;
-### list_from_cmdline()
- ;;
- --*)
- # delete leading '--';
- lfc_abbrev="$(echo1 "${lfc_arg}" | sed 's/^--//')";
- if list_has lfc_long_n "${lfc_abbrev}"
- then
- lfc_opt="${lfc_abbrev}";
- else
- obj_from_output lfc_opt \
- list_single_from_abbrev lfc_long_n "${lfc_abbrev}";
- if obj lfc_opt is_not_empty && is_not_equal "$#" 0
- then
- obj_from_output a \
- list_single_from_abbrev lfc_long_a "${lfc_abbrev}";
- if obj a is_not_empty
- then
- error_user "The abbreviation ${lfc_arg} \
-has multiple options: --${lfc_opt} and --${a}.";
- fi;
- fi;
- fi; # if list_has lfc_long_n "${lfc_abbrev}"
- if obj lfc_opt is_not_empty
- then
- # long option, no argument
- list_append lfc_result "--${lfc_opt}";
- continue;
- fi;
- obj_from_output lfc_opt \
- list_single_from_abbrev lfc_long_a "${lfc_abbrev}";
- if obj lfc_opt is_not_empty
- then
-### list_from_cmdline()
- # long option with argument
- if is_equal "$#" 0
- then
- error_user "no argument for option --${lfc_opt}."
- fi;
- list_append lfc_result "--${lfc_opt}" "$1";
- shift;
- continue;
- fi; # if obj lfc_opt is_not_empty
- error_user "${lfc_arg} is not an option.";
- ;;
- -?*) # short option (cluster)
- # delete leading `-';
- lfc_rest="$(echo1 "${lfc_arg}" | sed 's/^-//')";
- exit_test;
- while obj lfc_rest is_not_empty
- do
- # get next short option from cluster (first char of $lfc_rest)
- lfc_optchar="$(echo1 "${lfc_rest}" | sed 's/^\(.\).*$/\1/')";
- # remove first character from ${lfc_rest};
- lfc_rest="$(echo1 "${lfc_rest}" | sed 's/^.//')";
- exit_test;
- if list_has lfc_short_n "${lfc_optchar}"
- then
- list_append lfc_result "-${lfc_optchar}";
- continue;
- elif list_has lfc_short_a "${lfc_optchar}"
- then
- if obj lfc_rest is_empty
- then
- if is_greater_than "$#" 0
- then
-### list_from_cmdline()
- list_append lfc_result "-${lfc_optchar}" "$1";
- shift;
- continue;
- else
- error_user "no argument for option -${lfc_optchar}.";
- fi;
- else # rest is the argument
- list_append lfc_result "-${lfc_optchar}" "${lfc_rest}";
- lfc_rest='';
- continue;
- fi; # if obj lfc_rest is_empty
- else
- error_user "unknown option -${lfc_optchar}.";
- fi; # if list_has lfc_short_n "${lfc_optchar}"
- done; # while obj lfc_rest is_not_empty
- ;;
- *)
- # Here, $lfc_arg is not an option, so a file parameter.
- list_append lfc_fparams "${lfc_arg}";
-
- # Ignore the strange POSIX option handling to end option
- # parsing after the first file name argument. To reuse it, do
- # a `break' here if $POSIXLY_CORRECT of `bash' is not empty.
- # When `bash' is called as `sh' $POSIXLY_CORRECT is set
- # automatically to `y'.
- ;;
- esac; # case "${lfc_arg}" in
- done; # while is_greater_than "$#" 0
- list_append lfc_result '--';
- if obj lfc_fparams is_not_empty
- then
- lfc_result="${lfc_result} ${lfc_fparams}";
- fi;
-### list_from_cmdline()
- if is_greater_than "$#" 0
- then
- list_append lfc_result "$@";
- fi;
- obj lfc_result echo1;
- eval ${_UNSET} lfc_abbrev;
- eval ${_UNSET} lfc_fparams;
- eval ${_UNSET} lfc_short_a;
- eval ${_UNSET} lfc_short_n;
- eval ${_UNSET} lfc_long_a;
- eval ${_UNSET} lfc_long_n;
- eval ${_UNSET} lfc_result;
- eval ${_UNSET} lfc_arg;
- eval ${_UNSET} lfc_opt;
- eval ${_UNSET} lfc_opt_arg;
- eval ${_UNSET} lfc_opt_char;
- eval ${_UNSET} lfc_with_equal;
- eval ${_UNSET} lfc_rest;
- eval "${return_ok}";
-} # list_from_cmdline()
-
-
-########################################################################
-# list_from_cmdline_with_minus (<pre_name_of_opt_lists> [<cmdline_arg>...])
-#
-# Transform command line arguments into a normalized form with a double
-# abbreviation before and after an internal `-' sign.
-#
-# Options, option arguments, and file parameters are identified and
-# output each as a single-quoted argument of its own. Options and
-# file parameters are separated by a `--' argument.
-#
-# Arguments: >=1
-# <pre_name>: common part of a set of 4 environment variable names:
-# $<pre_name>_SHORT_NA: list of short options without an arg.
-# $<pre_name>_SHORT_ARG: list of short options that have an arg.
-# $<pre_name>_LONG_NA: list of long options without an arg.
-# $<pre_name>_LONG_ARG: list of long options that have an arg.
-# <cmdline_arg>...: the arguments from a command line, such as "$@",
-# the content of a variable, or direct arguments.
-#
-# Output: ['-[-]opt' ['optarg']]... '--' ['filename']...
-#
-# Example:
-# list_from_cmdline PRE -a f1 -bcarg --lon=larg --h-n f2 low larg2
-# PRE_SHORT_NA="'a' 'b'"
-# PRE_SHORT_ARG="'c' 'd'"
-# PRE_LONG_NA="'help' 'version' 'hi-non-arg'"
-# PRE_LONG_ARG="'long-arg' 'low-arg'"
-# This will result in printing:
-# '-a' '-b' '-c' 'arg' '--long-arg' 'larg' '--hi-non-arg' \
-# '--low-arg' 'larg2' '--' 'f1' 'f2'
-#
-# Use this function in the following way:
-# eval set x "$(list_from_cmdline_with_minus PRE_NAME "$@")";
-# shift;
-# while test "$1" != '--'; do
-# case "$1" in
-# ...
-# esac;
-# shift;
-# done;
-# shift; #skip '--'
-# # all positional parameters ("$@") left are file name parameters.
-#
-# Variable prefix: lfcwm
-#
-list_from_cmdline_with_minus()
-{
- func_check list_from_cmdline_with_minus '>=' 1 "$@";
- # short options, no argument
- obj_from_output lfcwm_short_n obj_data "$1"_SHORT_NA;
- # short options, with argument
- obj_from_output lfcwm_short_a obj_data "$1"_SHORT_ARG;
- # long options, no argument
- obj_from_output lfcwm_long_n obj_data "$1"_LONG_NA;
- # long options, with argument
- obj_from_output lfcwm_long_a obj_data "$1"_LONG_ARG;
- if obj lfcwm_short_n is_empty
- then
- error 'list_from_cmdline(): no $'"$1"'_SHORT_NA options.';
- fi;
- if obj lfcwm_short_a is_empty
- then
- error 'list_from_cmdline(): no $'"$1"'_SHORT_ARG options.';
- fi;
- if obj lfcwm_long_n is_empty
- then
- error 'list_from_cmdline(): no $'"$1"'_LONG_NA options.';
- fi;
- if obj lfcwm_long_a is_empty
- then
- error 'list_from_cmdline(): no $'"$1"'_LONG_ARG options.';
- fi;
- shift;
-
- if is_equal "$#" 0
- then
- echo1 "'--'";
- eval ${_UNSET} lfcwm_short_a;
- eval ${_UNSET} lfcwm_short_n;
-### list_from_cmdline_with_minus()
- eval ${_UNSET} lfcwm_long_a;
- eval ${_UNSET} lfcwm_long_n;
- eval "${return_ok}";
- fi;
- obj_from_output lfcwm_long_both lists_combine lfcwm_long_a lfcwm_long_n;
- lfcwm_fparams='';
- lfcwm_result='';
- while is_greater_than "$#" 0 # command line arguments
- do
- lfcwm_arg="$1";
- shift;
- lfcwm_optarg='';
- case "${lfcwm_arg}" in
- --)
- break;
- ;;
- --*=*)
- # delete leading '--';
- lfcwm_with_equal="$(echo1 "${lfcwm_arg}" | sed 's/^--//')";
- # extract option by deleting from the first '=' to the end
- lfcwm_abbrev="$(echo1 "${lfcwm_with_equal}" | \
- sed 's/^\([^=]*\)=.*$/\1/')";
- # extract option argument by deleting up to the first '='
- lfcwm_optarg="$(echo1 "${lfcwm_with_equal}" | \
- sed 's/^[^=]*=\(.*\)$/\1/')";
-### list_from_cmdline_with_minus()
- if list_has lfcwm_long_a "${lfcwm_abbrev}"
- then
- lfcwm_opt="${lfcwm_abbrev}";
- else
- obj_from_output lfcwm_opt \
- _search_abbrev lfcwm_long_a "${lfcwm_abbrev}";
- fi;
- list_append lfcwm_result "--${lfcwm_opt}" "${lfcwm_optarg}";
- continue;
- ;;
- --*)
- # delete leading '--';
- lfcwm_abbrev="$(echo1 "${lfcwm_arg}" | sed 's/^--//')";
- if list_has lfcwm_long_both "${lfcwm_abbrev}"
- then
- lfcwm_opt="${lfcwm_abbrev}";
- else
- obj_from_output lfcwm_opt \
- _search_abbrev lfcwm_long_both "${lfcwm_abbrev}";
- fi;
-### list_from_cmdline_with_minus()
- if list_has lfcwm_long_a "${lfcwm_opt}"
- then
- if is_equal "$#" 0
- then
- error_user "Option ${lfcwm_opt} needs an argument.";
- fi;
- lfcwm_optarg="$1";
- shift;
- list_append lfcwm_result "--${lfcwm_opt}" "${lfcwm_optarg}";
- else
- list_append lfcwm_result "--${lfcwm_opt}";
- fi;
- continue;
- ;;
- -?*) # short option (cluster)
- # delete leading '-';
- lfcwm_rest="$(echo1 "${lfcwm_arg}" | sed 's/^-//')";
- while obj lfcwm_rest is_not_empty
- do
- # get next short option from cluster (first char of $lfcwm_rest)
- lfcwm_optchar="$(echo1 "${lfcwm_rest}" | sed 's/^\(.\).*$/\1/')";
- # remove first character from ${lfcwm_rest};
- lfcwm_rest="$(echo1 "${lfcwm_rest}" | sed 's/^.//')";
- if list_has lfcwm_short_n "${lfcwm_optchar}"
- then
- list_append lfcwm_result "-${lfcwm_optchar}";
- continue;
- elif list_has lfcwm_short_a "${lfcwm_optchar}"
- then
- if obj lfcwm_rest is_empty
- then
- if is_greater_than "$#" 0
- then
-### list_from_cmdline_with_minus()
- list_append lfcwm_result "-${lfcwm_optchar}" "$1";
- shift;
- continue;
- else
- error_user "no argument for option -${lfcwm_optchar}.";
- fi;
- else # rest is the argument
- list_append lfcwm_result "-${lfcwm_optchar}" "${lfcwm_rest}";
- lfcwm_rest='';
- continue;
- fi; # if obj lfcwm_rest is_empty
- else
- error_user "unknown option -${lfcwm_optchar}.";
- fi; # if list_has lfcwm_short_n "${lfcwm_optchar}"
- done; # while obj lfcwm_rest is_not_empty
- ;;
- *)
- # Here, $lfcwm_arg is not an option, so a file parameter.
- list_append lfcwm_fparams "${lfcwm_arg}";
-
- # Ignore the strange POSIX option handling to end option
- # parsing after the first file name argument. To reuse it, do
- # a `break' here if $POSIXLY_CORRECT of `bash' is not empty.
- # When `bash' is called as `sh' $POSIXLY_CORRECT is set
- # automatically to `y'.
- ;;
- esac;
- done;
-
- list_append lfcwm_result '--';
- if obj lfcwm_fparams is_not_empty
- then
- lfcwm_result="${lfcwm_result} ${lfcwm_fparams}";
- fi;
-### list_from_cmdline_with_minus()
- if is_greater_than "$#" 0
- then
- list_append lfcwm_result "$@";
- fi;
- obj lfcwm_result echo1;
- eval ${_UNSET} lfcwm_abbrev;
- eval ${_UNSET} lfcwm_fparams;
- eval ${_UNSET} lfcwm_short_a;
- eval ${_UNSET} lfcwm_short_n;
- eval ${_UNSET} lfcwm_long_a;
- eval ${_UNSET} lfcwm_long_both;
- eval ${_UNSET} lfcwm_long_n;
- eval ${_UNSET} lfcwm_result;
- eval ${_UNSET} lfcwm_arg;
- eval ${_UNSET} lfcwm_opt;
- eval ${_UNSET} lfcwm_optarg;
- eval ${_UNSET} lfcwm_optchar;
- eval ${_UNSET} lfcwm_with_equal;
- eval ${_UNSET} lfcwm_rest;
- eval "${return_ok}";
-} # list_from_cmdline_with_minus()
-
-
-# _search_abbrev (<list> <abbrev>)
-#
-# Check whether <list> has an element constructed from the abbreviation
-# <abbrev>. All `-' in <abbrev> are replaced by `-*'. This construction
-# is searched first with `<construction>[^-]*'. If there is more than a
-# single element an error is created. If none is found `<construction>*'
-# is searched. Again an error is created for several results.
-# This function was constructed from the former function
-# list_single_from_abbrev().
-#
-# This is a local function of list_from_cmdline_with_minus().
-#
-# Arguments: 2
-# <list>: a variable name for a list of single-quoted elements
-# <abbrev>: some sequence of characters.
-#
-# Output: the found element (always not empty), error when none found.
-#
-# Variable prefix: _sa
-#
-_search_abbrev()
-{
- func_check _search_abbrev '=' 2 "$@";
- eval _sa_list='"${'$1'}"';
- if obj _sa_list is_empty
- then
- error "_search_abbrev(): list is empty.";
- fi;
-
- _sa_abbrev="$2";
- if obj _sa_abbrev is_empty
- then
- error "_search_abbrev(): abbreviation argument is empty.";
- fi;
-
- _sa_case="$(echo1 "${_sa_abbrev}" | sed 's/-/\*-/g')";
- _sa_opt='';
- case " ${_sa_list}" in
- *\ \'${_sa_case}*) # list has the abbreviation
- _sa_m1='';
- _sa_m2='';
- _sa_nm='';
- eval set x "${_sa_list}";
- shift;
- for i # over the option list
- do
- _sa_i="$i";
-### _search_abbrev() of list_from_cmdline_with_minus()
- case "${_sa_i}" in
- ${_sa_case}*-*)
- if obj _sa_m1 is_empty
- then
- _sa_m1="${_sa_i}";
- continue;
- fi;
- _sa_m2="${_sa_i}";
- continue;
- ;;
- ${_sa_case}*)
- if obj _sa_nm is_empty
- then
- _sa_nm="${_sa_i}";
- continue;
- fi;
- error_user "The abbreviation --${_sa_abbrev} has multiple options "\
-"--${_sa_nm} and --${_sa_i}.";
- ;;
- esac;
- done;
- if obj _sa_nm is_empty
- then
- if obj _sa_m2 is_not_empty
- then
- error_user "The abbreviation --${_sa_abbrev} has multiple options "\
-"--${_sa_m1} and --${_sa_m2}.";
- fi;
-### _search_abbrev() of list_from_cmdline_with_minus()
- if obj _sa_m1 is_not_empty
- then
- _sa_opt="${_sa_m1}";
- fi;
- else
- _sa_opt="${_sa_nm}";
- fi;
- ;;
- esac;
- if obj _sa_opt is_empty
- then
- error_user "--${_sa_abbrev} is not an option.";
- fi;
- obj _sa_opt echo1;
- eval "${_UNSET}" _sa_abbrev;
- eval "${_UNSET}" _sa_case;
- eval "${_UNSET}" _sa_i;
- eval "${_UNSET}" _sa_list;
- eval "${_UNSET}" _sa_m1;
- eval "${_UNSET}" _sa_m2;
- eval "${_UNSET}" _sa_nm;
- eval "${_UNSET}" _sa_opt;
- eval "${return_ok}";
-} # _search_abbrev() of list_from_cmdline_with_minus()
-
-
-########################################################################
-# list_from_file (<list_name> <file_name>)
-#
-# Extrect the lines from <file_name> and store them as elements to list
-# <list_name>.
-#
-# Arguments: 2
-# <list_name>: a variable name for output, a list of single-quoted elts
-# <file_name>: the name of an existing file
-#
-# Variable prefix: lff
-#
-list_from_file()
-{
- func_check list_from_file '=' 2 "$@";
- if is_not_file "$2"
- then
- eval "${return_bad}";
- fi;
- lff_n="$(wc -l "$2" | eval sed "'s/^[ ${_TAB}]*\([0-9]\+\).*$/\1/'")";
- eval "$1"="''";
- if obj lff_n is_equal 0
- then
- eval "${return_good}";
- fi;
- lff_i=0;
- while obj lff_i is_not_equal "${lff_n}"
- do
- lff_i="$(expr "${lff_i}" + 1)";
- list_append "$1" "$(eval sed -n "'${lff_i}p
-${lff_i}q'" "'$2'")";
- done;
- eval "${_UNSET}" lff_i;
- eval "${_UNSET}" lff_n;
- eval "${return_good}";
-} # list_from_file()
-
-
-########################################################################
-# list_from_split (<string> <separator_char>)
-#
-# Split <string> by <separator_char> into a list, omitting the separator.
-#
-# Arguments: 2: a <string> that is to be split into parts divided by
-# character <separator_char>
-# Output: the resulting list string
-#
-# Variable prefix: lfs
-#
-list_from_split()
-{
- func_check list_from_split = 2 "$@";
- if is_empty "$1"
- then
- eval "${return_ok}";
- fi;
- case "$2" in
- ?)
- lfs_splitter="$2";
- ;;
- '\:')
- lfs_splitter=':';
- ;;
- *)
- error "list_from_split(): split argument $2 must be a single character.";
- ;;
- esac;
- lfs_list='';
- lfs_rest="$1";
- while :
- do
- case "${lfs_rest}" in
- *${lfs_splitter}*)
- case "${lfs_splitter}" in
- /)
- lfs_elt="$(echo1 ${lfs_rest} | sed \
- 's|^\([^'"${lfs_splitter}"']*\)'"${lfs_splitter}"'.*|\1|')";
- lfs_rest="$(echo1 ${lfs_rest} | sed \
- 's|^[^'"${lfs_splitter}"']*'"${lfs_splitter}"'\(.*\)$|\1|')";
- ;;
- *)
-### list_from_split()
- lfs_elt="$(echo1 ${lfs_rest} | sed \
- 's/^\([^'"${lfs_splitter}"']*\)'"${lfs_splitter}"'.*/\1/')";
- lfs_rest="$(echo1 ${lfs_rest} | sed \
- 's/^[^'"${lfs_splitter}"']*'"${lfs_splitter}"'\(.*\)$/\1/')";
- ;;
- esac;
- list_append lfs_list "${lfs_elt}"
- continue;
- ;;
- *)
- list_append lfs_list "${lfs_rest}"
- break
- ;;
- esac;
- done
- echo1 "${lfs_list}";
-
- eval ${_UNSET} lfs_elt;
- eval ${_UNSET} lfs_list;
- eval ${_UNSET} lfs_rest;
- eval ${_UNSET} lfs_splitter;
- eval "${return_ok}";
-} # list_from_split()
-
-
-########################################################################
-# list_has (<list-name> <element>)
-#
-# Test whether the list <list-name> has the element <element>.
-#
-# Arguments: 2
-# <list_name>: a variable name for a list of single-quoted elements
-# <element>: some sequence of characters.
-#
-# Variable prefix: lh
-#
-list_has()
-{
- func_check list_has = 2 "$@";
- eval lh_list='"${'$1'}"';
- if obj lh_list is_empty
- then
- eval "${_UNSET}" lh_list;
- eval "${return_no}";
- fi;
- case "$2" in
- \'*\') lh_element=" $2 "; ;;
- *) lh_element=" '$2' "; ;;
- esac;
- if string_contains " ${lh_list} " "${lh_element}"
- then
- eval "${_UNSET}" lh_list;
- eval "${_UNSET}" lh_element;
- eval "${return_yes}";
- else
- eval "${_UNSET}" lh_list;
- eval "${_UNSET}" lh_element;
- eval "${return_no}";
- fi;
-} # list_has()
-
-
-########################################################################
-# list_has_abbrev (<list_var> <abbrev>)
-#
-# Test whether the list of <list_var> has an element starting with
-# <abbrev>.
-#
-# Arguments: 2
-# <list_var>: a variable name for a list of single-quoted elements
-# <abbrev>: some sequence of characters.
-#
-# Variable prefix: lha
-#
-list_has_abbrev()
-{
- func_check list_has_abbrev '=' 2 "$@";
- eval lha_list='"${'$1'}"';
- if obj lha_list is_empty
- then
- eval "${_UNSET}" lha_list;
- eval "${return_no}";
- fi;
- case "$2" in
- \'*)
- lha_element="$(echo1 "$2" | sed 's/'"${_SQ}"'$//')";
- ;;
- *)
- lha_element="'$2";
- ;;
- esac;
- if string_contains " ${lha_list}" " ${lha_element}"
- then
- eval "${_UNSET}" lha_list;
- eval "${_UNSET}" lha_element;
- eval "${return_yes}";
- else
- eval "${_UNSET}" lha_list;
- eval "${_UNSET}" lha_element;
- eval "${return_no}";
- fi;
- eval "${return_ok}";
-} # list_has_abbrev()
-
-
-########################################################################
-# list_has_not (<list> <element>)
-#
-# Test whether <list> has no <element>.
-#
-# Arguments: 2
-# <list>: a space-separated list of single-quoted elements.
-# <element>: some sequence of characters.
-#
-# Variable prefix: lhn
-#
-list_has_not()
-{
- func_check list_has_not = 2 "$@";
- eval lhn_list='"${'$1'}"';
- if obj lhn_list is_empty
- then
- eval "${_UNSET}" lhn_list;
- eval "${return_yes}";
- fi;
- case "$2" in
- \'*\') lhn_element=" $2 "; ;;
- *) lhn_element=" '$2' "; ;;
- esac;
- if string_contains " ${lhn_list} " "${lhn_element}"
- then
- eval "${_UNSET}" lhn_list;
- eval "${_UNSET}" lhn_element;
- eval "${return_no}";
- else
- eval "${_UNSET}" lhn_list;
- eval "${_UNSET}" lhn_element;
- eval "${return_yes}";
- fi;
-} # list_has_not()
-
-
-########################################################################
-# list_single_from_abbrev (<list-var> <abbrev>)
-#
-# Check whether the list has an element starting with <abbrev>. If
-# there are more than a single element an error is raised.
-#
-# Arguments: 2
-# <list-var>: a variable name for a list of single-quoted elements
-# <abbrev>: some sequence of characters.
-#
-# Output: the found element.
-#
-# Variable prefix: lsfa
-#
-list_single_from_abbrev()
-{
- func_check list_single_from_abbrev '=' 2 "$@";
- eval lsfa_list='"${'$1'}"';
- if obj lsfa_list is_empty
- then
- eval "${_UNSET}" lsfa_list;
- eval "${return_no}";
- fi;
- lsfa_abbrev="$2";
- if list_has lsfa_list "${lsfa_abbrev}"
- then
- obj lsfa_abbrev echo1;
- eval "${_UNSET}" lsfa_abbrev;
- eval "${_UNSET}" lsfa_list;
- eval "${return_yes}";
- fi;
- if list_has_abbrev lsfa_list "${lsfa_abbrev}"
- then
- lsfa_element='';
- eval set x "${lsfa_list}";
- shift;
-### list_single_from_abbrev()
- for i
- do
- case "$i" in
- ${lsfa_abbrev}*)
- if obj lsfa_element is_not_empty
- then
- error_user "The abbreviation --${lsfa_abbrev} \
-has multiple options: --${lsfa_element} and --${i}.";
- fi;
- lsfa_element="$i";
- ;;
- esac;
- done;
- obj lsfa_element echo1;
- eval "${_UNSET}" lsfa_abbrev;
- eval "${_UNSET}" lsfa_element;
- eval "${_UNSET}" lsfa_list;
- eval "${return_yes}";
- else
- eval "${_UNSET}" lsfa_abbrev;
- eval "${_UNSET}" lsfa_element;
- eval "${_UNSET}" lsfa_list;
- eval "${return_no}";
- fi;
-} # list_single_from_abbrev()
-
-
-########################################################################
-# list_uniq (<list>)
-#
-# Generate a list with only unique elements.
-#
-# Output: the corrected list
-#
-# Variable prefix: lu
-#
-list_uniq()
-{
- func_check list_uniq '=' 1 "$@";
- if is_empty "$1"
- then
- eval "${return_ok}";
- fi;
- eval a='"${'"$1"'}"';
- if obj a is_empty
- then
- eval "${return_ok}";
- fi;
- eval set x "$a";
- shift;
- lu_list='';
- for i
- do
- lu_i="$i";
- if list_has lu_list "${lu_i}"
- then
- continue;
- else
- list_append lu_list ${lu_i};
- fi;
- done;
- obj lu_list echo1;
- eval "${_UNSET}" lu_i;
- eval "${_UNSET}" lu_list;
- eval "${return_ok}";
-} # list_uniq()
-
-
-########################################################################
-# lists_combine (<list1> <list2> ...)
-#
-# Combine several lists to a single list. All arguments are list names.
-#
-# Output: the combined list
-#
-# Variable prefix: lc
-#
-lists_combine()
-{
- func_check lists_combine '>=' 2 "$@";
- lc_list='';
- for i
- do
- eval lc_arg='"${'"$i"'}"';
- case "${lc_arg}" in
- '') :; ;;
- "'"*"'")
- if obj lc_list is_empty
- then
- lc_list="${lc_arg}";
- else
- lc_list="${lc_list} ${lc_arg}";
- fi;
- ;;
- *)
- error 'lists_combine(): $'"$i"' is not a list.';
- ;;
- esac;
- done;
- obj lc_list echo1;
- eval "${_UNSET}" lc_arg;
- eval "${_UNSET}" lc_list;
- eval "${return_ok}";
-} # lists_combine()
-
-
-########################################################################
-landmark '7: man_*()';
-########################################################################
-
-########################################################################
-# Information on the search of man pages in groffer
-
-# The search of man pages is based on a set of directories. That
-# starts with the so-called man path. This is determined in function
-# man_setup() either by the command-line option --manpath, by $MANOPT,
-# or by $MANPATH. There is also a program `manpath'. If all of this
-# does not work a man path is created from $PATH with function
-# manpath_set_from_path(). We now have a set of existing directories
-# for the search of man pages; usually they end with `/man'.
-
-# The directory set of the man path can be changed in 2 ways. If
-# operating system names are given in $SYSTEM or by --systems on the
-# command-line all man path directory will be appended by these names.
-# The appended system names replace the original man path; but if no
-# system name is set, the original man path is kept. In `groffer',
-# this is done by the function manpath_add_lang_sys() in man_setup().
-
-# The next addition for directories is the language. It is specified
-# by --locale or by one of the environment variables $LC_ALL,
-# $LC_MESSAGES, and $LANG. The language name of `C' or `POSIX' means
-# the return to the default language (usually English); this deletes
-# former language specifications. The language name and its
-# abbreviation with 2 characters is appended to the man page
-# directories. But these new arising directories are added to the man
-# page, they do not replace it such as the system names did. This is
-# done by function manpath_add_lang_sys() in man_setup() as well.
-
-# Now we have the basic set of directories for the search of man pages
-# for given filespec arguments. The real directories with the man
-# page source files are gotten by appending `man<section>' to each
-# directory, where section is a single character of the form
-# `[1-9on]'.
-
-# There you find files named according to the form
-# <name>.<section>[<extension>][<compression>], where `[]' means
-# optional this time. <name> is the name of the man page; <section>
-# is the single character from the last paragraphe; the optional
-# <extension> consists of some letters denoting special aspects for
-# the section; and the optional <compression> is something like `.gz',
-# `.Z', or `.bz2', meaning that the file is compressed.
-
-# If name, section. and extension are specified on the command-line
-# the file of the form <name>.<section><extension> with or without
-# <compression> are handled. The first one found according to the
-# directory set for the section is shown.
-
-# If just name and section are specified on the command-line then
-# first <name>.<section> with or without <compression> are searched.
-# If no matching file was found, <name>.<section><extension> with or
-# without <compression> are searched for all possible extensions.
-
-# If only name is specified on the command-line then the section
-# directories are searched by and by, starting with section `1', until
-# a file is matched.
-
-# The function man_is_man() determines all suitable man files for a
-# command-line argument, while man_get() searches the single matching
-# file for display.
-
-
-########################################################################
-# man_get (<man-name> [<section> [<extension>]])
-#
-# Write a man page to the temporary file.
-#
-# Globals in: $_TMP_MANSPEC, $_MAN_SEC_CHARS, $_MAN_EXT, $_MAN_ALL
-#
-# Arguments: 1, 2, or 3
-#
-# Variable prefix: mg
-#
-man_get()
-{
- func_check man_get '>=' 1 "$@";
- if obj _TMP_MANSPEC is_empty
- then
- error 'man_get(): man_is_man() must be run first on '"$*".;
- fi;
- mg_name="$1";
- mg_sec="$2";
- if is_empty "$2"
- then
- mg_sec="${_MAN_SEC_CHARS}"; # take care it is not a single section
- fi;
- mg_ext="$3";
- if is_empty "$3"
- then
- mg_ext="${_MAN_EXT}";
- fi;
- if obj _TMP_MANSPEC is_not_equal "${_TMP_DIR}/,man:$1:${mg_sec}${mg_ext}"
- then
- error 'man_get(): $_TMP_MANSPEC does not suit to the arguments '"$*".;
- fi;
-### man_get()
-
- if obj _MAN_ALL is_yes
- then
- list_from_file mg_list "${_TMP_MANSPEC}";
- eval set x ${mg_list};
- shift;
- mg_ok='no';
- mg_list='';
- for f
- do
- mg_f="$f";
- if list_has mg_list "${mg_f}"
- then
- continue;
- else
- list_append mg_list "${mg_f}";
- fi;
-### man_get()
- if obj mg_f is_file
- then
- to_tmp "${mg_f}" && mg_ok='yes';
- fi;
- done;
- if obj mg_ok is_yes
- then
- register_title man:"${mg_name}";
- fi;
- eval ${_UNSET} mg_ext;
- eval ${_UNSET} mg_f;
- eval ${_UNSET} mg_list;
- eval ${_UNSET} mg_name;
- eval ${_UNSET} mg_sec;
- eval "${return_ok}";
- else # $_MAN_ALL is not 'yes'
- if is_empty "$2"
- then # no section from command line
- if obj _MAN_SEC_LIST is_empty
- then
- m="${_MAN_AUTO_SEC_LIST}"; # list of all sections
- else
- m="${_MAN_SEC_LIST}"; # from --sections
- fi;
-### man_get()
- for s in $(eval set x $m; shift; echo1 "$@")
- do
- mg_s="$s";
- list_from_file mg_list "${_TMP_MANSPEC}";
- eval set x ${mg_list};
- shift;
- if obj mg_ext is_empty
- then
- for f
- do
- mg_f="$f";
- case "${mg_f}" in
-*/man"${mg_s}"/"${mg_name}"."${mg_s}"|*/man"${mg_s}"/"${mg_name}"."${mg_s}".*)
- if obj mg_f is_file
- then
- to_tmp "${mg_f}" && register_title "${mg_name}(${mg_s})";
- eval ${_UNSET} mg_ext;
- eval ${_UNSET} mg_f;
- eval ${_UNSET} mg_list;
- eval ${_UNSET} mg_name;
- eval ${_UNSET} mg_s;
- eval ${_UNSET} mg_sec;
- eval "${return_ok}";
- fi;
- ;;
- esac; # "$mg_f"
- done; # for f
- fi; # mg_ext is_empty
-### man_get()
- for f
- do
- mg_f="$f";
- case "${mg_f}" in
- */man"${mg_s}"/"${mg_name}"."${mg_s}""${mg_ext}"*)
- if obj mg_f is_file
- then
- to_tmp "${mg_f}" && register_title "${mg_name}(${mg_s})";
- eval ${_UNSET} mg_ext;
- eval ${_UNSET} mg_f;
- eval ${_UNSET} mg_list;
- eval ${_UNSET} mg_name;
- eval ${_UNSET} mg_s;
- eval ${_UNSET} mg_sec;
- eval "${return_ok}";
- fi;
- ;;
- esac; # "$mg_f"
- done; # for f
- done; # for s
- else # $mg_sec is not empty, do with section
- list_from_file mg_list "${_TMP_MANSPEC}";
- eval set x ${mg_list};
- shift;
- if obj mg_ext is_empty
- then
- for f
- do
- mg_f="$f";
-### man_get()
- case "${mg_f}" in
-*/man"${mg_sec}"/"${mg_name}"."${mg_sec}"|\
-*/man"${mg_sec}"/"${mg_name}"."${mg_sec}".*)
- if obj mg_f is_file
- then
- obj mg_f to_tmp && \
- register_title "${mg_name}(${mg_sec})";
- eval ${_UNSET} mg_ext;
- eval ${_UNSET} mg_f;
- eval ${_UNSET} mg_list;
- eval ${_UNSET} mg_name;
- eval ${_UNSET} mg_s;
- eval ${_UNSET} mg_sec;
- eval "${return_ok}";
- fi;
- ;;
- esac;
- done; # for f
- for f
- do
- mg_f="$f";
-### man_get()
- case "${mg_f}" in
-*/man"${mg_sec}"/"${mg_name}"."${mg_sec}"*)
- if obj mg_f is_file
- then
- obj mg_f to_tmp && \
- register_title "${mg_name}(${mg_sec})";
- eval ${_UNSET} mg_ext;
- eval ${_UNSET} mg_f;
- eval ${_UNSET} mg_list;
- eval ${_UNSET} mg_name;
- eval ${_UNSET} mg_s;
- eval ${_UNSET} mg_sec;
- eval "${return_ok}";
- fi;
- ;;
- esac;
- done; # for f
- else # mg_ext is not empty
- for f
- do
- mg_f="$f";
-### man_get()
- case "${mg_f}" in
-*/man"${mg_sec}"/"${mg_name}"."${mg_sec}""${mg_ext}"|\
-*/man"${mg_sec}"/"${mg_name}"."${mg_sec}""${mg_ext}".*)
- if obj mg_f is_file
- then
- obj mg_f to_tmp && \
- register_title "${mg_name}(${mg_sec}${mg_ext})";
- eval ${_UNSET} mg_ext;
- eval ${_UNSET} mg_f;
- eval ${_UNSET} mg_list;
- eval ${_UNSET} mg_name;
- eval ${_UNSET} mg_s;
- eval ${_UNSET} mg_sec;
- eval "${return_ok}";
- fi;
- ;;
- esac;
- done; # for f
- for f
- do
- mg_f="$f";
-### man_get()
- case "${mg_f}" in
- */man"${mg_sec}"/"${mg_name}"."${mg_sec}""${mg_ext}"*)
- if obj mg_f is_file
- then
- obj mg_f to_tmp && \
- register_title "${mg_name}(${mg_sec}${mg_ext})";
- eval ${_UNSET} mg_ext;
- eval ${_UNSET} mg_f;
- eval ${_UNSET} mg_list;
- eval ${_UNSET} mg_name;
- eval ${_UNSET} mg_s;
- eval ${_UNSET} mg_sec;
- eval "${return_ok}";
- fi;
- ;;
- esac;
- done; # for f
- fi;
- fi; # $mg_sec
- fi; # $_MAN_ALL
-
- eval ${_UNSET} mg_ext;
- eval ${_UNSET} mg_f;
- eval ${_UNSET} mg_list;
- eval ${_UNSET} mg_name;
- eval ${_UNSET} mg_sec;
- eval ${_UNSET} mg_s;
- eval "${return_ok}";
-} # man_get()
-
-
-########################################################################
-# man_is_man (<man-name> [<section> [<extension>]])
-#
-# Test whether <man-name> exists as man page.
-#
-# Globals: in: $_TMP_MAN, $_MAN_SEC_CHARS, $_TMP_DIR, $_MAN_EXT,
-# $_MAN_AUTO_SEC_CHARS
-# out: $_TMP_MANSPEC
-#
-# Arguments: 1, 2, or 3
-#
-# Variable prefix: mim
-#
-man_is_man()
-{
- func_check man_is_man '>=' 1 "$@";
- if is_empty "$1"
- then
- _TMP_MANSPEC='';
- eval "${return_no}";
- fi;
- if obj _TMP_DIR is_empty
- then
- error 'man_is_man(): main_init() must be run first.';
- fi;
- if obj _MAN_IS_SETUP is_not_yes
- then
- error 'man_is_man(): man_setup() must be run first.';
- fi;
- mim_sec="$2";
- if is_empty "$2"
- then
- mim_sec="${_MAN_SEC_CHARS}";
- fi;
- if is_empty "$3"
- then
- mim_ext="${_MAN_EXT}";
- else
- mim_ext="$3";
- fi;
- _TMP_MANSPEC="${_TMP_DIR}/,man:$1:${mim_sec}${mim_ext}";
-### man_is_man()
- if obj _TMP_MANSPEC is_not_file
- then
- if obj mim_sec is_empty
- then
- m="${_MAN_AUTO_SEC_CHARS}";
- eval grep "'/man$m/$1\.$m${mim_ext}'" \
- "${_TMP_MAN}" > "${_TMP_MANSPEC}";
- else
- eval grep "'/man${mim_sec}/$1\.${mim_sec}${mim_ext}'" \
- "${_TMP_MAN}" > "${_TMP_MANSPEC}";
- fi;
- fi;
- eval ${_UNSET} mim_ext;
- eval ${_UNSET} mim_sec;
- if obj _TMP_MANSPEC is_empty_file
- then
- rm_file_with_debug "${_TMP_MANSPEC}";
- eval "${return_no}";
- else
- eval "${return_yes}";
- fi;
-} # man_is_man()
-
-
-########################################################################
-# man_setup ()
-#
-# Setup the variables $_MAN_* needed for man page searching.
-#
-# Globals:
-# in: $_OPT_*, $_MANOPT_*, $LANG, $LC_MESSAGES, $LC_ALL,
-# $MANPATH, $MANSEC, $PAGER, $SYSTEM, $MANOPT.
-# out: $_MAN_PATH, $_MAN_LANG, $_MAN_SYS, $_MAN_LANG, $_MAN_LANG2,
-# $_MAN_SEC, $_MAN_ALL, $_TMP_MAN
-# in/out: $_MAN_ENABLE
-#
-# The precedence for the variables related to `man' is that of GNU
-# `man', i.e.
-#
-# $LANG; overridden by
-# $LC_MESSAGES; overridden by
-# $LC_ALL; this has the same precedence as
-# $MANPATH, $MANSEC, $PAGER, $SYSTEM; overridden by
-# $MANOPT; overridden by
-# the groffer command line options.
-#
-# $MANROFFSEQ is ignored because grog determines the preprocessors.
-#
-# Variable prefix: ms
-#
-man_setup()
-{
- func_check man_setup '=' 0 "$@";
-
- if obj _MAN_IS_SETUP is_yes
- then
- eval "${return_ok}";
- fi;
- _MAN_IS_SETUP='yes';
-
- if obj _MAN_ENABLE is_not_yes
- then
- eval "${return_ok}";
- fi;
-
- # determine basic path for man pages
- obj_from_output ms_path \
- get_first_essential "${_OPT_MANPATH}" "${_MANOPT_PATH}" "${MANPATH}";
- if obj ms_path is_empty && is_prog 'manpath'
- then
- obj_from_output ms_path manpath 2>${_NULL_DEV}; # not always available
- fi;
- if obj ms_path is_empty
- then
- manpath_set_from_path;
- else
- obj_from_output _MAN_PATH path_list "${ms_path}";
- fi;
- if obj _MAN_PATH is_empty
- then
- _MAN_ENABLE="no";
- echo2 "man_setup(): man path is empty";
- eval ${_UNSET} ms_path;
- eval "${return_ok}";
- fi;
- obj_from_output _MAN_PATH list_uniq _MAN_PATH;
-### man_setup()
-
- if obj _MAN_ALL is_not_yes
- then
- if obj _OPT_ALL is_yes || obj _MANOPT_ALL is_yes
- then
- _MAN_ALL='yes';
- else
- _MAN_ALL='no';
- fi;
- fi;
-
- ms_sys="$(get_first_essential \
- "${_OPT_SYSTEMS}" "${_MANOPT_SYS}" "${SYSTEM}")";
- if obj ms_sys is_not_empty
- then
- obj_from_output _MAN_SYS list_from_split "${ms_sys}" ',';
- fi;
-
- obj_from_output ms_lang get_first_essential \
- "${_OPT_LANG}" "${LC_ALL}" "${LC_MESSAGES}" "${LANG}";
- case "${ms_lang}" in
- C|POSIX)
- _MAN_LANG="";
- _MAN_LANG2="";
- ;;
- ?)
- _MAN_LANG="${ms_lang}";
- _MAN_LANG2="";
- ;;
- ??)
- _MAN_LANG="${ms_lang}";
- _MAN_LANG2="${ms_lang}";
- ;;
-### man_setup()
- *)
- _MAN_LANG="${ms_lang}";
- # get first two characters of $ms_lang
- _MAN_LANG2="$(echo1 "${ms_lang}" | sed 's/^\(..\).*$/\1/')";
- exit_test;
- ;;
- esac;
- # from now on, use only $_MAN_LANG*, forget about $_OPT_LANG, $LC_*.
-
- manpath_add_lang_sys;
- obj_from_output _MAN_PATH list_uniq _MAN_PATH;
-
- obj_from_output _MAN_SEC get_first_essential \
- "${_OPT_SECTIONS}" "${_MANOPT_SEC}" "${MANSEC}";
- _MAN_SEC_LIST="";
- _MAN_SEC_CHARS="";
- case "${_MAN_SEC}" in
- *:*)
- eval set x "$(list_from_split "${_MAN_SEC}" :)";
- shift;
- for s
- do
- if list_has _MAN_AUTO_SEC_LIST "$s"
- then
- list_append _MAN_SEC_LIST "$s";
- _MAN_SEC_CHARS="${_MAN_SEC_CHARS}$s";
- fi;
- done
- if obj _MAN_SEC_CHARS is_not_empty
- then
- _MAN_SEC_CHARS="[${_MAN_SEC_CHARS}]";
- fi;
- ;;
- *)
- if list_has _MAN_AUTO_SEC_LIST "${_MAN_SEC}"
- then
- list_append _MAN_SEC_LIST "${_MAN_SEC}";
- _MAN_SEC_CHARS="[${_MAN_SEC}]";
- fi;
- ;;
- esac;
-
-### man_setup()
- obj_from_output _MAN_EXT get_first_essential \
- "${_OPT_EXTENSION}" "${_MANOPT_EXTENSION}" "${EXTENSION}";
-
- _TMP_MAN="$(tmp_create man)";
-
- eval set x "${_MAN_PATH}";
- shift;
- if is_not_equal "$#" 0
- then
- for i
- do
- for j in "$i"/man*
- do
- if obj j is_dir
- then
- find "$j" >>"${_TMP_MAN}";
- fi;
- done
- done;
- fi;
-
- eval ${_UNSET} ms_lang;
- eval ${_UNSET} ms_list;
- eval ${_UNSET} ms_path;
- eval ${_UNSET} ms_sys;
- eval "${return_ok}";
-} # man_setup()
-
-
-########################################################################
-landmark '8: manpath_*()';
-########################################################################
-
-########################################################################
-# manpath_add_lang_sys ()
-#
-# Add language and operating system specific directories to man path.
-#
-# Arguments : 0
-# Output : none
-# Globals:
-# in: $_MAN_SYS: a list of names of operating systems.
-# $_MAN_LANG and $_MAN_LANG2: each a single name
-# in/out: $_MAN_PATH: list of directories which shall have the `man?'
-# subdirectories.
-#
-# Variable prefix: mals
-#
-manpath_add_lang_sys()
-{
- func_check manpath_add_lang_sys '=' 0 "$@";
- if obj _MAN_PATH is_empty
- then
- eval "${return_ok}";
- fi;
- if obj _MAN_SYS is_empty
- then
- mals_mp="${_MAN_PATH}";
- else
- mals_mp='';
- eval set x "${_MAN_SYS}";
- shift;
- for s
- do
- _manpath_add_sys "$s";
- done;
- fi;
-
- if obj mals_mp is_not_empty
- then
- mals_lang_path='';
- if is_equal "$_MAN_LANG" "$_MAN_LANG2"
- then
- mals_man_lang2='';
- else
- mals_man_lang2="${_MAN_LANG2}";
- fi;
- for i in "${_MAN_LANG}" "${mals_man_lang2}"
- do
- if obj i is_empty
- then
- continue;
- fi;
-### manpath_add_lang_sys()
- mals_lang="$i";
- eval set x "${mals_mp}";
- shift;
- for p
- do
- obj_from_output mals_dir dir_name_append "${p}" "${mals_lang}";
- if obj mals_dir is_dir
- then
- list_append mals_lang_path "${mals_dir}";
- fi;
- done;
- done;
- obj_from_output mals_mp lists_combine mals_lang_path mals_mp;
- fi;
-
- _MAN_PATH="${mals_mp}";
- eval ${_UNSET} mals_dir;
- eval ${_UNSET} mals_lang;
- eval ${_UNSET} mals_lang_path;
- eval ${_UNSET} mals_man_lang2;
- eval ${_UNSET} mals_mp;
- eval "${return_ok}";
-} # manpath_add_lang_sys()
-
-
-# _manpath_add_sys (<system>)
-#
-# Append the existing subdirectories <system> of man path directories to
-# the list $mals_mp.
-#
-# Local function to manpath_add_lang_sys().
-#
-# Argument: 1, a operating system name (for appending to a man path
-# directory)
-#
-# Globals in: $_MAN_PATH
-# Globals in/out: $mals_mp
-#
-# Variable prefix: _mas
-#
-_manpath_add_sys()
-{
- func_check _manpath_add_sys '=' 1 "$@";
- case "$1" in
- '')
- :;
- ;;
- man)
- obj_from_output mals_mp lists_combine mals_mp _MAN_PATH;
- ;;
- *)
- _mas_sys="$1";
- eval set x "${_MAN_PATH}";
- shift;
- for p
- do
- obj_from_output _mas_dir dir_name_append "${p}" "${_mas_sys}";
- if obj _mas_dir is_dir
- then
- list_append mals_mp "${_mas_dir}";
- fi;
- done;
- ;;
- esac;
- eval ${_UNSET} _mas_dir;
- eval ${_UNSET} _mas_sys;
- eval "${return_ok}";
-} # _manpath_add_sys() of manpath_add_lang_sys()
-
-
-########################################################################
-# manpath_set_from_path ()
-#
-# Determine basic search path for man pages from $PATH.
-#
-# Return: `0' if a valid man path was retrieved.
-# Output: none
-# Globals:
-# in: $PATH
-# out: $_MAN_PATH
-#
-# Variable prefix: msfp
-#
-manpath_set_from_path()
-{
- func_check manpath_set_from_path '=' 0 "$@";
-
- msfp_manpath='';
-
- # get a basic man path from $PATH
- if obj PATH is_not_empty
- then
- # delete the final `/bin' part
- p="$(echo1 "${PATH}" | sed 's|//*bin/*:|:|g')";
- obj_from_output msfp_list path_list "$p";
- # append some default directories
- for b in /usr/local /usr/local /usr /usr \
- /usr/X11R6 /usr/openwin \
- /opt /opt/gnome /opt/kde
- do
- msfp_base="$b";
- if list_has_not msfp_list "${msfp_base}" && obj msfp_base is_dir
- then
- list_append msfp_list "${msfp_base}";
- fi;
- done;
- eval set x "${msfp_list}";
- shift;
- for d
- do
- # including empty for former `/bin'.
- msfp_base="$d";
- for e in /share/man /share/MAN /man /MAN
- do
- msfp_mandir="${msfp_base}$e";
- if obj msfp_mandir is_dir
- then
- list_append msfp_manpath "${msfp_mandir}";
- fi;
- done;
- done;
- fi;
-
- _MAN_PATH="${msfp_manpath}";
- eval ${_UNSET} msfp_base;
- eval ${_UNSET} msfp_list;
- eval ${_UNSET} msfp_mandir;
- eval ${_UNSET} msfp_manpath;
- eval "${return_ok}";
-} # manpath_set_from_path()
-
-
-########################################################################
-landmark '9: obj_*()';
-########################################################################
-
-########################################################################
-# obj (<object> <call_name> <arg>...)
-#
-# This works like a method (object function) call for an object.
-# Run "<call_name> $<object> <arg> ...".
-#
-# The first argument represents an object name whose data is given as
-# first argument to <call_name>().
-#
-# Argument: >=2
-# <object>: variable name
-# <call_name>: a program or function name
-#
-# Variable prefix: o
-#
-obj()
-{
- func_check obj '>=' 2 "$@";
- eval o_arg1='"${'$1'}"';
- if is_empty "$2"
- then
- error "obj(): function name is empty."
- else
- o_func="$2";
- fi;
- shift;
- shift;
- eval "${o_func}"' "${o_arg1}" "$@"';
- n="$?";
- eval ${_UNSET} o_arg1;
- eval ${_UNSET} o_func;
- eval "${return_var} $n";
-} # obj()
-
-
-########################################################################
-# obj_data (<object>)
-#
-# Print the data of <object>, i.e. the content of $<object>.
-# For possible later extensions.
-#
-# Arguments: 1
-# <object>: a variable name
-# Output: the data of <object>
-#
-# Variable prefix: od
-#
-obj_data()
-{
- func_check obj_data '=' 1 "$@";
- if is_empty "$1"
- then
- error "obj_data(): object name is empty."
- fi;
- eval od_res='"${'"$1"'}"';
- obj od_res echo1;
- eval ${_UNSET} od_res;
- eval "${return_ok}";
-} # obj_data()
-
-
-########################################################################
-# obj_from_output (<object> <call_name> <arg>...)
-#
-# Run '$<object>="$(<call_name> <arg>...)"' to set the result of a
-# function call to a global variable. Variables are not stored.
-#
-# Arguments: >=2
-# <object>: a variable name
-# <call_name>: the name of a function or program
-# <arg>: optional argument to <call_name>
-# Output: none
-#
-# Variable prefix: ofo
-#
-obj_from_output()
-{
- func_check obj_from_output '>=' 2 "$@";
- if is_empty "$1"
- then
- error "obj_from_output(): variable name is empty.";
- fi;
- if is_empty "$2"
- then
- error "obj_from_output(): function name is empty."
- fi;
- ofo_result_name="$1";
- shift;
- ofo_return=0;
- if is_equal "$#" 0
- then
- eval "${ofo_result_name}"'=""';
- else
- ofo_list='';
- for i
- do
- list_append ofo_list "$i";
- done;
- eval "${ofo_result_name}"'="$('"${ofo_list}"')"';
- ofo_return="$?";
- exit_test;
- fi;
- r="${ofo_return}";
- eval ${_UNSET} ofo_list;
- eval ${_UNSET} ofo_return;
- eval ${_UNSET} ofo_result_name;
- eval "${return_var} $r";
-} # obj_from_output()
-
-
-########################################################################
-# obj_set (<object> <data>)
-#
-# Set the data of <object>, i.e. call "$<object>=<data>".
-#
-# Arguments: 2
-# <object>: a variable name
-# <data>: a string
-# Output:: none
-#
-obj_set()
-{
- func_check obj_set '=' 2 "$@";
- if is_empty "$1"
- then
- error "obj_set(): object name is empty."
- fi;
- eval "$1"='"$2"';
- eval "${return_ok}";
-} # obj_set()
-
-
-########################################################################
-# path_chop (<path>)
-#
-# Remove unnecessary colons from path.
-#
-# Argument: 1, a colon separated path.
-# Output: path without leading, double, or trailing colons.
-#
-path_chop()
-{
- func_check path_chop = 1 "$@";
-
- # replace multiple colons by a single colon `:'
- # remove leading and trailing colons
- echo1 "$1" | sed '
-s/^:*//
-s/:::*/:/g
-s/:*$//
-';
- eval "${return_ok}";
-} # path_chop()
-
-
-########################################################################
-# path_clean (<path>)
-#
-# Remove non-existing directories from a colon-separated list.
-#
-# Argument: 1, a colon separated path.
-# Output: colon-separated list of existing directories.
-#
-# Variable prefix: pc
-#
-path_clean()
-{
- func_check path_clean = 1 "$@";
- if is_not_equal "$#" 1
- then
- error 'path_clean() needs 1 argument.';
- fi;
- pc_arg="$1";
- eval set x "$(path_list "${pc_arg}")";
- exit_test;
- shift;
- pc_res="";
- for i
- do
- pc_i="$i";
- if obj pc_i is_not_empty \
- && obj pc_res path_not_contains "${pc_i}" \
- && obj pc_i is_dir
- then
- case "${pc_i}" in
- ?*/)
- pc_res="${pc_res}:$(dir_name_chop "${pc_i}")";
- exit_test;
- ;;
- *)
- pc_res="${pc_res}:${pc_i}";
- ;;
- esac;
- fi;
- done;
- path_chop "${pc_res}";
- eval ${_UNSET} pc_arg;
- eval ${_UNSET} pc_i;
- eval ${_UNSET} pc_res;
- eval "${return_ok}";
-} # path_clean()
-
-
-########################################################################
-# path_contains (<path> <dir>)
-#
-# Test whether <dir> is contained in <path>, a list separated by `:'.
-#
-# Arguments : 2
-# Return : `0' if arg2 is substring of arg1, `1' otherwise.
-#
-path_contains()
-{
- func_check path_contains = 2 "$@";
- case ":$1:" in
- *:${2}:*)
- eval "${return_yes}";
- ;;
- *)
- eval "${return_no}";
- ;;
- esac;
- eval "${return_ok}";
-} # path_contains()
-
-
-########################################################################
-# path_not_contains (<path> <dir>)
-#
-# Test whether <dir> is not contained in colon separated <path>.
-#
-# Arguments : 2
-#
-path_not_contains()
-{
- func_check path_not_contains = 2 "$@";
- if path_contains "$1" "$2"
- then
- eval "${return_no}";
- else
- eval "${return_yes}";
- fi;
- eval "${return_ok}";
-} # path_not_contains()
-
-
-########################################################################
-# path_list (<path>)
-#
-# From a `:' separated path generate a list with unique elements.
-#
-# Arguments: 1: a colon-separated path
-# Output: the resulting list, process it with `eval set'
-#
-# Variable prefix: pl
-#
-path_list()
-{
- func_check path_list = 1 "$@";
- eval set x "$(list_from_split "$1" '\:')";
- shift;
- pl_list='';
- for e
- do
- pl_elt="$e";
- if list_has pl_list "${pl_elt}"
- then
- continue;
- else
- list_append pl_list "${pl_elt}";
- fi;
- done;
- obj pl_list echo1;
- eval ${_UNSET} pl_elt;
- eval ${_UNSET} pl_list;
- eval "${return_ok}";
-} # path_list()
-
-
-########################################################################
-landmark '10: register_*()';
-########################################################################
-
-########################################################################
-# register_file (<filename>)
-#
-# Write a found file and register the title element.
-#
-# Arguments: 1: a file name
-# Output: none
-#
-register_file()
-{
- func_check register_file = 1 "$@";
- if is_empty "$1"
- then
- error 'register_file(): file name is empty';
- fi;
- if is_equal "$1" '-'
- then
- to_tmp "${_TMP_STDIN}" && register_title 'stdin';
- else
- to_tmp "$1" && register_title "$1";
- exit_test;
- fi;
- eval "${return_ok}";
-} # register_file()
-
-
-########################################################################
-# register_title (<filespec>)
-#
-# Create title element from <filespec> and append to $_REG_TITLE_LIST.
-# Basename is created.
-#
-# Globals: $_REG_TITLE_LIST (rw)
-#
-# Variable prefix: rt
-#
-register_title()
-{
- func_check register_title '=' 1 "$@";
- if is_empty "$1"
- then
- eval "${return_ok}";
- fi;
-
- if obj _DEBUG_PRINT_FILENAMES is_yes
- then
- if is_equal "$1" 'stdin'
- then
- echo2 "file: standard input";
- else
- if obj _FILESPEC_IS_MAN is_yes
- then
- echo2 "file title: $1";
- else
- echo2 "file: $1";
- fi;
- fi;
- fi;
-
- case "${_REG_TITLE_LIST}" in
- *\ *\ *\ *)
- eval "${return_ok}";
- ;;
- esac;
-
- # remove directory part
- obj_from_output rt_title base_name "$1";
- # replace space characters by `_'
- rt_title="$(echo1 "${rt_title}" | sed 's/[ ]/_/g')";
- # remove extension `.bz2'
- rt_title="$(echo1 "${rt_title}" | sed 's/\.bz2$//')";
- # remove extension `.gz'
- rt_title="$(echo1 "${rt_title}" | sed 's/\.gz$//')";
- # remove extension `.Z'
- rt_title="$(echo1 "${rt_title}" | sed 's/\.Z$//')";
-
- if obj rt_title is_empty
- then
- eval ${_UNSET} rt_title;
- eval "${return_ok}";
- fi;
- list_append _REG_TITLE_LIST "${rt_title}";
- eval ${_UNSET} rt_title;
- eval "${return_ok}";
-} # register_title()
-
-
-########################################################################
-# reset ()
-#
-# Reset the variables that can be affected by options to their default.
-#
-#
-# Defined in section `Preset' after the rudimentary shell tests.
-
-
-########################################################################
-# rm_file (<file_name>)
-#
-# Remove file.
-#
-rm_file()
-{
- func_check rm_file '=' 1 "$@";
- if is_file "$1"
- then
- rm -f "$1" >${_NULL_DEV} 2>&1;
- fi;
- if is_existing "$1"
- then
- eval "${return_bad}";
- else
- eval "${return_good}";
- fi;
-} # rm_file()
-
-
-########################################################################
-# rm_file_with_debug (<file_name>)
-#
-# Remove file if $_DEBUG_KEEP_FILES allows it.
-#
-# Globals: $_DEBUG_KEEP_FILES
-#
-rm_file_with_debug()
-{
- func_check rm_file_with_debug '=' 1 "$@";
- if obj _DEBUG_KEEP_FILES is_not_yes
- then
- if is_file "$1"
- then
- rm -f "$1" >${_NULL_DEV} 2>&1;
- fi;
- fi;
- if is_existing "$1"
- then
- eval "${return_bad}";
- else
- eval "${return_good}";
- fi;
-} # rm_file_with_debug()
-
-
-########################################################################
-# rm_tree (<dir_name>)
-#
-# Remove a file or a complete directory tree.
-#
-# Globals: $_DEBUG_KEEP_FILES
-#
-rm_tree()
-{
- func_check rm_tree '=' 1 "$@";
- if is_existing "$1"
- then
- rm -f -r "$1" >${_NULL_DEV} 2>&1;
- fi;
- if is_existing "$1"
- then
- eval "${return_bad}";
- else
- eval "${return_good}";
- fi;
-} # rm_tree()
-
-
-########################################################################
-# save_stdin ()
-#
-# Store standard input to temporary file (with decompression).
-#
-# Variable prefix: ss
-#
-if obj _HAS_COMPRESSION is_yes
-then
- save_stdin()
- {
- func_check save_stdin '=' 0 "$@";
- ss_f="${_TMP_DIR}"/INPUT;
- cat >"${ss_f}";
- cat_z "${ss_f}" >"${_TMP_STDIN}";
- rm_file "${ss_f}";
- eval ${_UNSET} ss_f;
- eval "${return_ok}";
- } # save_stdin()
-else # no compression
- save_stdin()
- {
- func_check save_stdin '=' 0 "$@";
- cat >"${_TMP_STDIN}";
- eval "${return_ok}";
- } # save_stdin()
-fi;
-
-
-########################################################################
-# special_filespec ()
-#
-# Handle special modes like whatis and apropos. Run their filespec
-# functions if suitable.
-#
-# Globals: in: $_OPT_APROPOS, $_OPT_WHATIS, $_SPECIAL_SETUP
-# out: $_SPECIAL_FILESPEC (internal)
-#
-special_filespec()
-{
- func_check special_filespec '=' 0 "$@";
- if obj _OPT_APROPOS is_not_yes && obj _OPT_WHATIS is_not_yes
- then
- eval "${return_bad}";
- fi;
- if obj _OPT_APROPOS is_yes && obj _OPT_WHATIS is_yes
- then
- error \
- 'special_filespec(): $_OPT_APROPOS and $_OPT_WHATIS are both "yes"';
- fi;
- if obj _SPECIAL_SETUP is_not_yes
- then
- error 'special_filespec(): setup for apropos or whatis must be run first.';
- fi;
- if apropos_filespec || whatis_filespec;
- then
- eval "${return_ok}";
- else
- eval "${return_bad}";
- fi;
-} # special_filespec()
-
-
-########################################################################
-# special_setup ()
-#
-# Handle special modes like whatis and apropos. Run their setup
-# functions if suitable.
-#
-special_setup()
-{
- func_check special_setup '=' 0 "$@";
- if obj _OPT_APROPOS is_yes && obj _OPT_WHATIS is_yes
- then
- error \
- 'special_setup(): $_OPT_APROPOS and $_OPT_WHATIS are both "yes"';
- fi;
- if apropos_setup || whatis_setup
- then
- eval "${return_ok}";
- else
- eval "${return_bad}";
- fi;
-} # special_setup()
-
-
-########################################################################
-landmark '11: stack_*()';
-########################################################################
-
-########################################################################
-# string_contains (<string> <part>)
-#
-# Test whether <part> is contained in <string>.
-#
-# Arguments : 2 text arguments.
-# Return : `0' if arg2 is substring of arg1, `1' otherwise.
-#
-string_contains()
-{
- func_check string_contains '=' 2 "$@";
- case "$1" in
- *${2}*)
- eval "${return_yes}";
- ;;
- *)
- eval "${return_no}";
- ;;
- esac;
- eval "${return_ok}";
-} # string_contains()
-
-
-########################################################################
-# string_not_contains (<string> <part>)
-#
-# Test whether <part> is not substring of <string>.
-#
-# Arguments : 2 text arguments.
-# Return : `0' if arg2 is substring of arg1, `1' otherwise.
-#
-string_not_contains()
-{
- func_check string_not_contains '=' 2 "$@";
- if string_contains "$1" "$2"
- then
- eval "${return_no}";
- else
- eval "${return_yes}";
- fi;
- eval "${return_ok}";
-} # string_not_contains()
-
-
-########################################################################
-landmark '12: tmp_*()';
-########################################################################
-
-########################################################################
-# tmp_cat ()
-#
-# Output the temporary cat file (the concatenation of all input).
-#
-tmp_cat()
-{
- func_check tmp_cat '=' 0 "$@";
- cat "${_TMP_CAT}";
- eval "${return_var}" "$?";
-} # tmp_cat()
-
-
-########################################################################
-# tmp_create (<suffix>?)
-#
-# Create temporary file. The generated name is `,' followed by
-# <suffix>.
-#
-# Argument: 0 or 1
-#
-# Globals: $_TMP_DIR
-#
-# Output : name of created file
-#
-# Variable prefix: tc
-#
-tmp_create()
-{
- func_check tmp_create '<=' 1 "$@";
- if obj _TMP_DIR is_empty || obj _TMP_DIR is_not_dir
- then
- error 'tmp_create(): there is no temporary directory.';
- else
- # the output file does not have `,' as first character, so these are
- # different names from the output file.
- tc_tmp="${_TMP_DIR}/,$1";
- obj tc_tmp rm_file;
- : >"${tc_tmp}"
- obj tc_tmp echo1;
- fi;
- eval ${_UNSET} tc_tmp;
- eval "${return_ok}";
-} # tmp_create()
-
-
-########################################################################
-# to_tmp (<filename>)
-#
-# Print file (decompressed) to the temporary cat file.
-#
-# Variable prefix: tt
-#
-to_tmp()
-{
- func_check to_tmp '=' 1 "$@";
- if obj _TMP_CAT is_empty
- then
- error 'to_tmp(): $_TMP_CAT is not yet set';
- fi;
- tt_1="$1";
- tt_so_nr=0; # number for temporary `,so,*,*'
- if is_file "${tt_1}"
- then
- tt_dir="$(dir_name "${tt_1}")";
- if obj _OPT_WHATIS is_yes
- then
- whatis_filename "${tt_1}" >>"${_TMP_CAT}";
- else
- _FILE_NR="$(expr ${_FILE_NR} + 1)";
- tt_file="${_TMP_DIR}/,file${_FILE_NR}";
- if obj _FILESPEC_IS_MAN is_yes
- then
- if obj _DEBUG_PRINT_FILENAMES is_yes
- then
- echo2 "file: ${tt_1}";
- fi;
- tt_tmp="${_TMP_DIR}/,tmp";
- cat_z "${tt_1}" >"${tt_file}";
- grep '^\.[ ]*so[ ]' "${tt_file}" |
- sed 's/^\.[ ]*so[ ]*//' >"${tt_tmp}";
- list_from_file tt_list "${tt_tmp}";
- eval set x ${tt_list};
- shift;
- for i
- do
- tt_i="$i";
- tt_so_nr="$(expr ${tt_so_nr} + 1)";
- tt_sofile="${_TMP_DIR}/,so${_FILE_NR}_${tt_so_nr}";
- tt_sofiles="${tt_sofiles} ${tt_sofile}";
- _do_man_so "${tt_i}";
- done;
- rm_file "${tt_tmp}";
- mv "${tt_file}" "${tt_tmp}";
- cat "${tt_tmp}" | soelim -I "${tt_dir}" ${_SOELIM_R} >"${tt_file}";
- for f in ${tt_sofiles}
- do
- rm_file_with_debug $f;
- done;
- rm_file "${tt_tmp}";
- else # $_FILESPEC_IS_MAN ist not yes
- cat_z "${tt_1}" | soelim -I "${tt_dir}" ${_SOELIM_R} >"${tt_file}";
- fi;
-### to_tmp()
- obj_from_output tt_grog grog "${tt_file}";
- if is_not_equal "$?" 0
- then
- exit "${_ERROR}";
- fi;
- echo2 "grog output: ${tt_grog}";
- case " ${tt_grog} " in
- *\ -m*)
- eval set x "$(echo1 " ${tt_grog} " | sed '
-s/'"${_TAB}"'/ /g
-s/ */ /g
-s/ -m / -m/g
-s/ -mm\([^ ]\)/ -m\1/g
-')";
- shift;
- for i
- do
- tt_i="$i";
- case "${tt_i}" in
- -m*)
- if list_has _MACRO_PACKAGES "${tt_i}"
- then
- case "${_MACRO_PKG}" in
- '')
- _MACRO_PKG="${tt_i}";
- ;;
- ${tt_i})
- :;
- ;;
- -m*)
- echo2 "Ignore ${tt_1} because it needs ${tt_i} instead "\
-"of ${_MACRO_PKG}."
- rm_file_with_debug "${tt_file}";
- eval ${_UNSET} tt_1;
- eval ${_UNSET} tt_dir;
- eval ${_UNSET} tt_file;
- eval ${_UNSET} tt_grog;
- eval ${_UNSET} tt_i;
- eval ${_UNSET} tt_so_nr;
- eval ${_UNSET} tt_sofile;
- eval ${_UNSET} tt_sofiles;
- eval ${_UNSET} tt_sofound;
- eval ${_UNSET} tt_list;
- eval ${_UNSET} tt_tmp;
- eval "${return_bad}";
- ;;
-### to_tmp()
- *)
- error \
-'to_tmp(): $_MACRO_PKG does not start with -m: '"${_MACRO_PKG}";
- ;;
- esac;
- fi;
- ;;
- esac;
- done;
- ;;
- esac;
- cat "${tt_file}" >>"${_TMP_CAT}";
- rm_file_with_debug "${tt_file}";
- fi;
- else
- error "to_tmp(): could not read file \`${tt_1}'.";
- fi;
- eval ${_UNSET} tt_1;
- eval ${_UNSET} tt_dir;
- eval ${_UNSET} tt_file;
- eval ${_UNSET} tt_grog;
- eval ${_UNSET} tt_i;
- eval ${_UNSET} tt_so_nr;
- eval ${_UNSET} tt_sofile;
- eval ${_UNSET} tt_sofiles;
- eval ${_UNSET} tt_sofound;
- eval ${_UNSET} tt_list;
- eval ${_UNSET} tt_tmp;
- eval "${return_ok}";
-} # to_tmp()
-
-
-#############
-# _do_man_so (<so_arg>)
-#
-# Handle single .so file name for man pages.
-#
-# Local function to to_tmp().
-#
-# Globals from to_tmp(): $tt_tmp, $tt_sofile, $tt_file
-# Globals: $_TMP_MAN
-#
-# Variable prefix: dms
-#
-_do_man_so() {
- func_check _do_man_so '=' 1 "$@";
- _dms_so="$1"; # evt. with `\ '
- _dms_soname="$(echo $1 | sed 's/\\[ ]/ /g')"; # without `\ '
- case "${_dms_soname}" in
- /*) # absolute path
- if test -f "${_dms_soname}"
- then
- eval "${return_ok}";
- fi;
- if test -f "${_dms_soname}"'.gz'
- then
- _dms_sofound="${_dms_soname}"'.gz';
- elif test -f "${_dms_soname}"'.Z'
- then
- _dms_sofound="${_dms_soname}"'.Z';
- elif test -f "${_dms_soname}"'.bz2'
- then
- _dms_sofound="${_dms_soname}"'.bz2';
- else
- eval ${_UNSET} _dms_so;
- eval ${_UNSET} _dms_soname;
- eval "${return_ok}";
- fi;
- ;;
-### _do_man_so() of to_tmp()
- *) # relative to man path
- eval grep "'/${_dms_soname}\$'" "${_TMP_MAN}" >"${tt_tmp}";
- if is_empty_file "${tt_tmp}"
- then
- eval grep "'/${_dms_soname}.gz\$'" "${_TMP_MAN}" >"${tt_tmp}";
- if is_empty_file "${tt_tmp}"
- then
- eval grep "'/${_dms_soname}.Z\$'" "${_TMP_MAN}" >"${tt_tmp}";
- if is_empty_file "${tt_tmp}"
- then
- eval grep "'/${_dms_soname}.bz2\$'" "${_TMP_MAN}" >"${tt_tmp}";
- fi;
- fi;
- fi;
- if is_empty_file "${tt_tmp}"
- then
- eval "${return_ok}";
- fi;
- _dms_done='no';
- list_from_file _dms_list "${tt_tmp}";
- eval set x ${_dms_list};
- shift;
- for i
- do
- _dms_sofound="$i";
- if obj _dms_sofound is_empty
- then
- continue;
- fi;
- _dms_done='yes';
- break;
- done;
-### _do_man_so() of to_tmp()
- if obj _dms_done is_not_yes
- then
- eval ${_UNSET} _dms_done;
- eval ${_UNSET} _dms_sofound;
- eval "${return_ok}";
- fi;
- ;;
- esac;
- if obj _DEBUG_PRINT_FILENAMES is_yes
- then
- echo2 "file from .so: ${_dms_so}";
- fi;
- cat_z "${_dms_sofound}" >"${tt_sofile}";
- _dms_esc="$(echo ${_dms_so} | sed 's/\\/\\\\/g')";
- cat "${tt_file}" | eval sed \
-"'s#^\\.[ ]*so[ ]*\(${_dms_so}\|${_dms_esc}\|${_dms_soname}\)[ ]*\$'"\
-"'#.so ${tt_sofile}#'" \
- >"${tt_tmp}";
- rm_file "${tt_file}";
- mv "${tt_tmp}" "${tt_file}";
- eval ${_UNSET} _dms_done;
- eval ${_UNSET} _dms_esc;
- eval ${_UNSET} _dms_so;
- eval ${_UNSET} _dms_sofound;
- eval ${_UNSET} _dms_soname;
- eval "${return_ok}";
-} # _do_man_so() of to_tmp()
-
-
-########################################################################
-# to_tmp_line (<text>...)
-#
-# Print single line with <text> to the temporary cat file.
-#
-to_tmp_line()
-{
- func_check to_tmp_line '>=' 1 "$@";
- if obj _TMP_CAT is_empty
- then
- error 'to_tmp_line(): $_TMP_CAT is not yet set';
- fi;
- echo1 "$*" >>"${_TMP_CAT}";
- eval "${return_ok}";
-} # to_tmp_line()
-
-
-########################################################################
-# trap_set
-#
-# Call function on signal 0.
-#
-trap_set()
-{
- func_check trap_set '=' 0 "$@";
- trap 'clean_up' 0 2>${_NULL_DEV} || :;
- eval "${return_ok}";
-} # trap_set()
-
-
-########################################################################
-# trap_unset ()
-#
-# Disable trap on signal 0.
-#
-trap_unset()
-{
- func_check trap_unset '=' 0 "$@";
- trap '' 0 2>${_NULL_DEV} || :;
- eval "${return_ok}";
-} # trap_unset()
-
-
-########################################################################
-# usage ()
-#
-# Print usage information to standard output; for groffer option --help.
-#
-usage()
-{
- func_check usage = 0 "$@";
- echo;
- version;
- cat <<EOF
-
-Usage: groffer [option]... [filespec]...
-
-Display roff files, standard input, and/or Unix manual pages with a X
-Window viewer or in several text modes. All input is decompressed
-on-the-fly with all formats that gzip can handle.
-
-"filespec" is one of
- "filename" name of a readable file
- "-" for standard input
- "man:name(n)" man page "name" in section "n"
- "man:name.n" man page "name" in section "n"
- "man:name" man page "name" in first section found
- "name(n)" man page "name" in section "n"
- "name.n" man page "name" in section "n"
- "n name" man page "name" in section "n"
- "name" man page "name" in first section found
-where `section' is a single character out of [1-9on], optionally followed
-by some more letters that are called the `extension'.
-
--h --help print this usage message.
--T --device=name pass to groff using output device "name".
--v --version print version information.
--V display the groff execution pipe instead of formatting.
--X display with "gxditview" using groff -X.
--Z --ditroff --intermediate-output
- generate groff intermediate output without
- post-processing and viewing, like groff -Z.
-All other short options are interpreted as "groff" formatting options.
-
-The most important groffer long options are
-
---apropos=name start man's "apropos" program for "name".
---apropos-data=name
- "apropos" for "name" in man's data sections 4, 5, 7.
---apropos-devel=name
- "apropos" for "name" in development sections 2, 3, 9.
---apropos-progs=name
- "apropos" for "name" in man's program sections 1, 6, 8.
---auto choose mode automatically from the default mode list.
---default reset all options to the default value.
---default-modes=mode1,mode2,...
- set sequence of automatically tried modes.
---dvi display in a viewer for TeX device independent format.
---dvi-viewer=prog choose the viewer program for dvi mode.
---groff process like groff, disable viewing features.
---help display this helping output.
---html display in a web browser.
---html-viewer=program
- choose a web browser for html mode.
---man check file parameters first whether they are man pages.
---mode=auto|dvi|groff|html|pdf|ps|source|text|tty|www|x|X
- choose display mode.
---no-man disable man-page facility.
---no-special disable --all, --apropos*, and --whatis
---pager=program preset the paging program for tty mode.
---pdf display in a PDF viewer.
---pdf-viewer=prog choose the viewer program for pdf mode.
---ps display in a Postscript viewer.
---ps-viewer=prog choose the viewer program for ps mode.
---shell=program specify a shell under which to run groffer2.sh.
---source output as roff source.
---text output in a text device without a pager.
---to-stdout output the content of the mode file without display.
---tty display with a pager on text terminal even when in X.
---tty-viewer=prog select a pager for tty mode; same as --pager.
---whatis display the file name and description of man pages
---www same as --html.
---www-viewer=prog same as --html-viewer
---x --X display with "gxditview" using an X* device.
---x-viewer=prog choose viewer program for x mode (X mode).
---X-viewer=prog same as "--xviewer".
-
-The usual X Windows toolkit options transformed into GNU long options:
---background=color, --bd=size, --bg=color, --bordercolor=color,
---borderwidth=size, --bw=size, --display=Xdisplay, --fg=color,
---fn=font, --font=font, --foreground=color, --geometry=geom, --iconic,
---resolution=dpi, --rv, --title=text, --xrm=resource
-
-Long options of GNU "man":
---all, --ascii, --ditroff, --extension=suffix, --locale=language,
---local-file=name, --location, --manpath=dir1:dir2:...,
---sections=s1:s2:..., --systems=s1,s2,..., --where, ...
-
-Development options that are not useful for normal usage:
---debug, --debug-all, --debug-filenames, --debug-func,
---debug-not-func, --debug-grog, --debug-keep, --debug-lm,
---debug-params, --debug-shell, --debug-stacks, --debug-tmpdir,
---debug-user, --do-nothing, --print=text, --shell=prog
-
-EOF
-
- eval "${return_ok}";
-} # usage()
-
-
-########################################################################
-# version ()
-#
-# Print version information to standard output.
-# For groffer option --version.
-#
-version()
-{
- func_check version = 0 "$@";
- y="$(echo "${_LAST_UPDATE}" | sed 's/^.* //')";
- cat <<EOF
-groffer ${_PROGRAM_VERSION} of ${_LAST_UPDATE} (shell version)
-is part of groff version ${_GROFF_VERSION}.
-Copyright (C) $y Free Software Foundation, Inc.
-GNU groff and groffer come with ABSOLUTELY NO WARRANTY.
-You may redistribute copies of groff and its subprograms
-under the terms of the GNU General Public License.
-EOF
- eval "${return_ok}";
-} # version()
-
-
-########################################################################
-# warning (<string>)
-#
-# Print warning to stderr.
-#
-warning()
-{
- echo2 "warning: $*";
-} # warning()
-
-
-########################################################################
-# whatis_filename (<filename>)
-#
-# Interpret <filename> as a man page and display its `whatis'
-# information as a fragment written in the groff language.
-#
-# Globals: in: $_OPT_WHATIS, $_SPECIAL_SETUP, $_SPECIAL_FILESPEC,
-# $_FILESPEC_ARG
-#
-# Variable prefix: wf
-#
-whatis_filename()
-{
- func_check whatis_filename = 1 "$@";
- if obj _OPT_WHATIS is_not_yes
- then
- error 'whatis_filename(): $_OPT_WHATIS is not yes.';
- fi;
- if obj _SPECIAL_SETUP is_not_yes
- then
- error \
- 'whatis_filename(): setup for whatis whatis_setup() must be run first.';
- fi;
- if obj _SPECIAL_FILESPEC is_not_yes
- then
- error 'whatis_filename(): whatis_filespec() must be run first.';
- fi;
- wf_arg="$1";
- if obj wf_arg is_not_file
- then
- error "whatis_filename(): argument is not a readable file."
- fi;
- wf_dot='^\.'"${_SPACE_SED}"'*';
-### whatis_filename()
- if obj _FILESPEC_ARG is_equal '-'
- then
- wf_arg='stdin';
- fi;
- cat <<EOF
-\f[CR]${wf_arg}\f[]:
-.br
-EOF
-
- # get the parts of the file name
- wf_name="$(base_name $1)";
- wf_section="$(echo1 $1 | sed -n '
-s|^.*/man\('"${_MAN_AUTO_SEC_CHARS}"'\).*$|\1|p
-')";
- if obj wf_section is_not_empty
- then
- case "${wf_name}" in
- *.${wf_section}*)
- s='yes';
- ;;
- *)
- s='';
- wf_section='';
- ;;
-### whatis_filename()
- esac
- if obj s is_yes
- then
- wf_name="$(echo1 ${wf_name} | sed '
-s/^\(.*\)\.'${wf_section}'.*$/\1/
-')";
- fi;
- fi;
-
- # traditional man style; grep the line containing `.TH' macro, if any
- wf_res="$(cat_z "$1" | sed '
-/'"${wf_dot}"'TH /p
-d
-')";
- exit_test;
- if obj wf_res is_not_empty
- then # traditional man style
- # get the first line after the first `.SH' macro, by
- # - delete up to first .SH;
- # - print all lines before the next .SH;
- # - quit.
- wf_res="$(cat_z "$1" | sed -n '
-1,/'"${wf_dot}"'SH/d
-/'"${wf_dot}"'SH/q
-p
-')";
-
- if obj wf_section is_not_empty
- then
- case "${wf_res}" in
- ${wf_name}${_SPACE_CASE}*-${_SPACE_CASE}*)
- s='yes';
- ;;
-### whatis_filename()
- *)
- s='';
- ;;
- esac;
- if obj s is_yes
- then
- wf_res="$(obj wf_res echo1 | sed '
-s/^'"${wf_name}${_SPACE_SED}"'[^-]*-'"${_SPACE_SED}"'*\(.*\)$/'"${wf_name}"' ('"${wf_section}"') \\[em] \1/
-')";
- fi;
- fi;
- obj wf_res echo1;
- echo;
- eval ${_UNSET} wf_arg;
- eval ${_UNSET} wf_dot;
- eval ${_UNSET} wf_name;
- eval ${_UNSET} wf_res;
- eval ${_UNSET} wf_section;
- eval "${return_ok}";
- fi;
-
- # mdoc style (BSD doc); grep the line containing `.Nd' macro, if any
- wf_res="$(cat_z "$1" | sed -n '/'"${wf_dot}"'Nd /s///p')";
- exit_test;
- if obj wf_res is_not_empty
- then # BSD doc style
- if obj wf_section is_not_empty
- then
- wf_res="$(obj wf_res echo1 | sed -n '
-s/^\(.*\)$/'"${wf_name}"' ('"${wf_section}"') \\[em] \1/p
-')";
- fi;
-### whatis_filename()
- obj wf_res echo1;
- echo;
- eval ${_UNSET} wf_arg;
- eval ${_UNSET} wf_dot;
- eval ${_UNSET} wf_name;
- eval ${_UNSET} wf_res;
- eval ${_UNSET} wf_section;
- eval "${return_ok}";
- fi;
- echo1 'is not a man page';
- echo;
- eval ${_UNSET} wf_arg;
- eval ${_UNSET} wf_dot;
- eval ${_UNSET} wf_name;
- eval ${_UNSET} wf_res;
- eval ${_UNSET} wf_section;
- eval "${return_bad}";
-} # whatis_filename()
-
-
-
-########################################################################
-# whatis_filespec ()
-#
-# Print the filespec name as .SH to the temporary cat file.
-#
-# Globals: in: $_OPT_WHATIS, $_SPECIAL_SETUP
-# out: $_SPECIAL_FILESPEC
-#
-whatis_filespec()
-{
- func_check whatis_filespec '=' 0 "$@";
- if obj _OPT_WHATIS is_yes
- then
- if obj _SPECIAL_SETUP is_not_yes
- then
- error 'whatis_filespec(): whatis_setup() must be run first.';
- fi;
- _SPECIAL_FILESPEC='yes';
- eval to_tmp_line \
- "'.SH $(echo1 "${_FILESPEC_ARG}" | sed 's/[^\\]-/\\-/g')'";
- exit_test;
- eval "${return_ok}";
- else
- eval "${return_bad}";
- fi;
-} # whatis_filespec()
-
-
-########################################################################
-# whatis_setup ()
-#
-# Print the whatis header to the temporary cat file; this is the setup
-# for whatis.
-#
-# Globals: in: $_OPT_WHATIS
-# out: $_SPECIAL_SETUP
-#
-whatis_setup()
-{
- func_check whatis_setup '=' 0 "$@";
- if obj _OPT_WHATIS is_yes
- then
- to_tmp_line '.TH GROFFER WHATIS';
- _SPECIAL_SETUP='yes';
- if obj _OPT_TITLE is_empty
- then
- _OPT_TITLE='whatis';
- fi;
- eval "${return_ok}";
- else
- eval "${return_bad}";
- fi;
-} # whatis_setup()
-
-
-########################################################################
-# where_is_prog (<program>)
-#
-# Output path of a program and the given arguments if in $PATH.
-#
-# Arguments : 1, <program> can have spaces and arguments.
-# Output : list of 2 elements: prog name (with directory) and arguments
-# Return : `0' if arg1 is a program in $PATH, `1' otherwise.
-#
-# Variable prefix: wip
-#
-where_is_prog()
-{
- func_check where_is_prog '=' 1 "$@";
- if is_empty "$1"
- then
- eval "${return_bad}";
- fi;
-
- # Remove disturbing multiple spaces and tabs
- wip_1="$(echo1 "$1" | sed 's/[ ][ ]*/ /g' | \
- sed 's/\(\\\)* / /g' | sed 's/^ //' | sed 's/ $//')";
- wip_noarg="$(echo1 "${wip_1}" | sed 's/ -.*$//')";
- exit_test;
-
- if obj wip_noarg is_empty
- then
- eval ${_UNSET} wip_1;
- eval ${_UNSET} wip_noarg;
- eval "${return_bad}";
- fi;
-
- case "${wip_1}" in
- *\ -*)
- wip_args="$(echo1 "${wip_1}" |
- eval sed "'s#^${wip_noarg} ##'")";
- exit_test;
- ;;
- *)
- wip_args='';
- ;;
- esac;
-
- wip_result='';
-### where_is_prog()
-
- if test -f "${wip_noarg}" && test -x "${wip_noarg}"
- then
- list_append wip_result "${wip_noarg}" "${wip_args}";
- exit_test;
- obj wip_result echo1;
- exit_test;
- eval ${_UNSET} wip_1;
- eval ${_UNSET} wip_args;
- eval ${_UNSET} wip_noarg;
- eval ${_UNSET} wip_result;
- eval "${return_ok}";
- fi;
-
- # test whether $wip_noarg has directory, so it is not tested with $PATH
- case "${wip_noarg}" in
- */*)
- # now $wip_noarg (with /) is not an executable file
-
- # test name with space
- obj_from_output wip_name base_name "${wip_noarg}";
- obj_from_output wip_dir dir_name "${wip_noarg}";
- case "${wip_name}" in
- *\ *)
- wip_base="$(echo1 "${wip_name}" | sed 's/ .*$//')";
- exit_test;
- obj_from_output wip_file dir_name_append "${wip_dir}" "${wip_base}";
- exit_test;
-### where_is_prog()
- if test -f "${wip_file}" && test -x "${wip_file}"
- then
- wip_baseargs="$(echo1 "${wip_name}" |
- eval sed "'s#^${wip_base} ##'")";
- exit_test;
- if obj wip_args is_empty
- then
- wip_args="${wip_baseargs}";
- else
- wip_args="${wip_baseargs} ${wip_args}";
- fi;
-
- list_append wip_result "${wip_file}" "${wip_args}";
- exit_test;
- obj wip_result echo1;
- exit_test;
- eval ${_UNSET} wip_1;
- eval ${_UNSET} wip_args;
- eval ${_UNSET} wip_base;
- eval ${_UNSET} wip_baseargs;
- eval ${_UNSET} wip_dir;
- eval ${_UNSET} wip_file;
- eval ${_UNSET} wip_name;
- eval ${_UNSET} wip_noarg;
- eval ${_UNSET} wip_result;
- eval "${return_ok}";
- fi; # test ${wip_file}
- ;;
- esac; # end of test name with space
-
-### where_is_prog()
- eval ${_UNSET} wip_1;
- eval ${_UNSET} wip_args;
- eval ${_UNSET} wip_base;
- eval ${_UNSET} wip_dir;
- eval ${_UNSET} wip_name;
- eval ${_UNSET} wip_noarg;
- eval ${_UNSET} wip_result;
- eval "${return_bad}";
- ;;
- esac; # test of $wip_noarg on path with directory
-
-
- # now $wip_noarg does not have a /, so it is checked with $PATH.
-
- eval set x "$(path_list "${PATH}")";
- exit_test;
- shift;
-
- # test path with $win_noarg, evt. with spaces
- for d
- do
- wip_dir="$d";
- obj_from_output wip_file dir_name_append "${wip_dir}" "${wip_noarg}";
-### where_is_prog()
-
- # test $win_file on executable file
- if test -f "${wip_file}" && test -x "${wip_file}"
- then
- list_append wip_result "${wip_file}" "${wip_args}";
- exit_test;
- obj wip_result echo1;
- exit_test;
- eval ${_UNSET} wip_1;
- eval ${_UNSET} wip_dir;
- eval ${_UNSET} wip_file;
- eval ${_UNSET} wip_noarg;
- eval ${_UNSET} wip_result;
- eval "${return_ok}";
- fi; # test $win_file on executable file
- done; # test path with $win_prog with spaces
-
- case "${wip_noarg}" in
- *\ *)
- # test on path with base name without space
- wip_base="$(echo1 "${wip_noarg}" | sed 's/^\([^ ]*\) .*$/\1/')";
- exit_test;
- for d
- do
- wip_dir="$d";
- obj_from_output wip_file dir_name_append "${wip_dir}" "${wip_base}";
- exit_test;
-### where_is_prog()
-
- # test $win_file on executable file
- if test -f "${wip_file}" && test -x "${wip_file}"
- then
- wip_baseargs="$(echo1 "${wip_noarg}" |
- sed 's/[^ ]* \(.*\)$/\1/')";
- exit_test;
- if obj wip_args is_empty
- then
- wip_args="${wip_baseargs}";
- else
- wip_args="${wip_args} ${wip_baseargs}";
- fi;
- list_append wip_result "${wip_file}" "${wip_args}";
- exit_test;
- obj wip_result echo1;
- exit_test;
- eval ${_UNSET} wip_1;
- eval ${_UNSET} wip_args;
- eval ${_UNSET} wip_base;
- eval ${_UNSET} wip_baseargs;
- eval ${_UNSET} wip_dir;
- eval ${_UNSET} wip_file;
- eval ${_UNSET} wip_name;
- eval ${_UNSET} wip_noarg;
- eval ${_UNSET} wip_result;
- eval "${return_ok}";
- fi; # test of $wip_file on executable file
- done; # test path with base name without space
-### where_is_prog()
- ;;
- esac; # test of $wip_noarg on space
-
- eval ${_UNSET} wip_1;
- eval ${_UNSET} wip_args;
- eval ${_UNSET} wip_base;
- eval ${_UNSET} wip_baseargs;
- eval ${_UNSET} wip_dir;
- eval ${_UNSET} wip_file;
- eval ${_UNSET} wip_name;
- eval ${_UNSET} wip_noarg;
- eval ${_UNSET} wip_result;
- eval "${return_bad}";
-} # where_is_prog()
-
-
-########################################################################
-# main* Functions
-########################################################################
-
-# The main area contains the following parts:
-# - main_init(): initialize temporary files and set exit trap
-# - main_parse_MANOPT(): parse $MANOPT
-# - main_parse_args(): argument parsing
-# - main_set_mode (): determine the display mode
-# - main_do_fileargs(): process filespec arguments
-# - main_set_resources(): setup X resources
-# - main_display(): do the displaying
-# - main(): the main function that calls all main_*()
-
-
-#######################################################################
-# main_init ()
-#
-# Set exit trap and create temporary directory and some temporary files.
-#
-# Globals: $_TMP_DIR, $_TMP_CAT, $_TMP_STDIN
-#
-# Variable prefix: mi
-#
-main_init()
-{
- func_check main_init = 0 "$@";
- # call clean_up() on shell termination.
- trap_set;
-
- # create temporary directory
- umask 0077;
- _TMP_DIR='';
- for d in "${GROFF_TMPDIR}" "${TMPDIR}" "${TMP}" "${TEMP}" \
- "${TEMPDIR}" "${HOME}"'/tmp' '/tmp' "${HOME}" '.'
- do
- mi_dir="$d";
- if obj mi_dir is_empty || obj mi_dir is_not_dir || \
- obj mi_dir is_not_writable
- then
- continue;
- fi;
-
- case "${mi_dir}" in
- */)
- _TMP_DIR="${mi_dir}";
- ;;
- *)
- _TMP_DIR="${mi_dir}"'/';
- ;;
- esac;
- _TMP_DIR="${_TMP_DIR}groffer${_PROCESS_ID}";
- if obj _TMP_DIR rm_tree
- then
- :
- else
- mi_tdir_="${_TMP_DIR}"_;
- mi_n=1;
- mi_tdir_n="${mi_tdir_}${mi_n}";
-### main_init()
- while obj mi_tdir_n is_existing
- do
- if obj mi_tdir_n rm_tree
- then
- # directory could not be removed
- mi_n="$(expr "${mi_n}" + 1)";
- mi_tdir_n="${mi_tdir_}${mi_n}";
- continue;
- fi;
- done;
- _TMP_DIR="${mi_tdir_n}";
- fi;
- eval mkdir "${_TMP_DIR}";
- if is_not_equal "$?" 0
- then
- obj _TMP_DIR rm_tree;
- _TMP_DIR='';
- continue;
- fi;
- if obj _TMP_DIR is_dir && obj _TMP_DIR is_writable
- then
- # $_TMP_DIR can now be used as temporary directory
- break;
- fi;
- obj _TMP_DIR rm_tree;
- _TMP_DIR='';
- continue;
- done;
- if obj _TMP_DIR is_empty
- then
- error "main_init(): \
-Couldn't create a directory for storing temporary files.";
- fi;
-### main_init()
- if obj _DEBUG_PRINT_TMPDIR is_yes
- then
- echo2 "temporary directory: ${_TMP_DIR}";
- fi;
-
- obj_from_output _TMP_CAT tmp_create groffer_cat;
- obj_from_output _TMP_STDIN tmp_create groffer_input;
-
- eval ${_UNSET} mi_dir;
- eval ${_UNSET} mi_n;
- eval ${_UNSET} mi_tdir_;
- eval ${_UNSET} mi_tdir_n;
- eval "${return_ok}";
-} # main_init()
-
-
-########################################################################
-# main_parse_MANOPT ()
-#
-# Parse $MANOPT to retrieve man options, but only if it is a non-empty
-# string; found man arguments can be overwritten by the command line.
-#
-# Globals:
-# in: $MANOPT, $_OPTS_MANOPT_*
-# out: $_MANOPT_*
-#
-# Variable prefix: mpm
-#
-main_parse_MANOPT()
-{
- func_check main_parse_MANOPT = 0 "$@";
-
- if obj MANOPT is_not_empty
- then
- # Delete leading and final spaces
- MANOPT="$(echo1 "${MANOPT}" | sed '
-s/^'"${_SPACE_SED}"'*//
-s/'"${_SPACE_SED}"'*$//
-')";
- exit_test;
- fi;
- if obj MANOPT is_empty
- then
- eval "${return_ok}";
- fi;
-
- mpm_list='';
- # add arguments in $MANOPT by mapping them to groffer options
- eval set x "$(list_from_cmdline _OPTS_MANOPT "${MANOPT}")";
- exit_test;
- shift;
- until test "$#" -le 0 || is_equal "$1" '--'
- do
- mpm_opt="$1";
- shift;
- case "${mpm_opt}" in
- -7|--ascii)
- list_append mpm_list '--ascii';
- ;;
- -a|--all)
- list_append mpm_list '--all';
- ;;
-### main_parse_MANOPT()
- -c|--catman)
- do_nothing;
- shift;
- ;;
- -d|--debug)
- do_nothing;
- ;;
- -D|--default)
- # undo all man options so far
- mpm_list='';
- ;;
- -e|--extension)
- list_append mpm_list '--extension';
- shift;
- ;;
- -f|--whatis)
- list_append mpm_list '--whatis';
- shift;
- ;;
- -h|--help)
- do_nothing;
- ;;
- -k|--apropos)
- # groffer's --apropos takes an argument, but man's does not, so
- do_nothing;
- ;;
- -l|--local-file)
- do_nothing;
- ;;
- -L|--locale)
- list_append mpm_list '--locale' "$1";
- shift;
- ;;
-### main_parse_MANOPT()
- -m|--systems)
- list_append mpm_list '--systems' "$1";
- shift;
- ;;
- -M|--manpath)
- list_append mpm_list '--manpath' "$1";
- shift;
- ;;
- -p|--preprocessor)
- do_nothing;
- shift;
- ;;
- -P|--pager)
- list_append mpm_list '--pager' "$1";
- shift;
- ;;
- -r|--prompt)
- do_nothing;
- shift;
- ;;
- -S|--sections)
- list_append mpm_list '--sections' "$1";
- shift;
- ;;
- -t|--troff)
- do_nothing;
- ;;
- -T|--device)
- list_append mpm_list '-T' "$1";
- shift;
- ;;
-### main_parse_MANOPT()
- -u|--update)
- do_nothing;
- ;;
- -V|--version)
- do_nothing;
- ;;
- -w|--where|--location)
- list_append mpm_list '--location';
- ;;
- -Z|--ditroff)
- do_nothing;
- ;;
- # ignore all other options
- esac;
- done;
-
- # prepend $mpm_list to the command line
- if obj mpm_list is_not_empty
- then
- eval set x "${mpm_list}" '"$@"';
- shift;
- fi;
-
- eval ${_UNSET} mpm_list;
- eval ${_UNSET} mpm_opt;
- eval "${return_ok}";
-} # main_parse_MANOPT()
-
-
-########################################################################
-# main_parse_args (<command_line_args>*)
-#
-# Parse arguments; process options and filespec parameters.
-#
-# Arguments: pass the command line arguments unaltered.
-# Globals:
-# in: $_OPTS_*
-# out: $_OPT_*, $_ADDOPTS, $_FILEARGS
-#
-# Variable prefix: mpa
-#
-main_parse_args()
-{
- func_check main_parse_args '>=' 0 "$@";
- obj_from_output _ALL_PARAMS list_from_cmdline_with_minus _OPTS_CMDLINE "$@";
- if obj _DEBUG_PRINT_PARAMS is_yes
- then
- echo2 "parameters: ${_ALL_PARAMS}";
- fi;
- eval set x "${_ALL_PARAMS}";
- shift;
-
- # By the call of `eval', unnecessary quoting was removed. So the
- # positional shell parameters ($1, $2, ...) are now guaranteed to
- # represent an option or an argument to the previous option, if any;
- # then a `--' argument for separating options and
- # parameters; followed by the filespec parameters if any.
-
- # Note, the existence of arguments to options has already been checked.
- # So a check for `$#' or `--' should not be done for arguments.
-
- until test "$#" -le 0 || is_equal "$1" '--'
- do
- mpa_opt="$1"; # $mpa_opt is fed into the option handler
- shift;
- case "${mpa_opt}" in
- -h|--help)
- usage;
- leave;
- ;;
- -Q|--source) # output source code (`Quellcode').
- _OPT_MODE='source';
- ;;
-### main_parse_args()
- -T|--device|--troff-device) # device; arg
- _OPT_DEVICE="$1";
- _check_device_with_mode;
- shift;
- ;;
- -v|--version)
- version;
- leave;
- ;;
- -V)
- _OPT_V='yes';
- ;;
- -Z|--ditroff|--intermediate-output) # groff intermediate output
- _OPT_Z='yes';
- ;;
- -X)
- _OPT_MODE=X;
- ;;
- -?)
- # delete leading `-'
- mpa_optchar="$(echo1 "${mpa_opt}" | sed 's/^-//')";
- exit_test;
- if list_has _OPTS_GROFF_SHORT_NA "${mpa_optchar}"
- then
- list_append _ADDOPTS_GROFF "${mpa_opt}";
- elif list_has _OPTS_GROFF_SHORT_ARG "${mpa_optchar}"
- then
- list_append _ADDOPTS_GROFF "${mpa_opt}" "$1";
- shift;
-### main_parse_args()
- else
- error "main_parse_args(): Unknown option : \`$1'";
- fi;
- ;;
- --all)
- _OPT_ALL='yes';
- ;;
- --apropos) # run `apropos'
- _OPT_APROPOS='yes';
- _APROPOS_SECTIONS='';
- _OPT_WHATIS='no';
- ;;
- --apropos-data) # run `apropos' for data sections
- _OPT_APROPOS='yes';
- _APROPOS_SECTIONS='457';
- _OPT_WHATIS='no';
- ;;
- --apropos-devel) # run `apropos' for development sections
- _OPT_APROPOS='yes';
- _APROPOS_SECTIONS='239';
- _OPT_WHATIS='no';
- ;;
- --apropos-progs) # run `apropos' for program sections
- _OPT_APROPOS='yes';
- _APROPOS_SECTIONS='168';
- _OPT_WHATIS='no';
- ;;
-### main_parse_args()
- --ascii)
- list_append _ADDOPTS_GROFF '-mtty-char';
- if obj _OPT_MODE is_empty
- then
- _OPT_MODE='text';
- fi;
- ;;
- --auto) # the default automatic mode
- _OPT_MODE='';
- ;;
- --bd|--bordercolor) # border color for viewers, arg;
- _OPT_BD="$1";
- shift;
- ;;
- --bg|--backgroud) # background color for viewers, arg;
- _OPT_BG="$1";
- shift;
- ;;
- --bw|--borderwidth) # border width for viewers, arg;
- _OPT_BW="$1";
- shift;
- ;;
- --debug|--debug-all|--debug-filenames|--debug-func|--debug-not-func|\
---debug-grog|--debug-keep|--debug-lm|--debug-params|--debug-shell|\
---debug-stacks|--debug-tmpdir|--debug-user)
- # debug is handled at the beginning
- :;
- ;;
- --default) # reset variables to default
- reset;
- ;;
-### main_parse_args()
- --default-modes) # sequence of modes in auto mode; arg
- _OPT_DEFAULT_MODES="$1";
- shift;
- ;;
- --display) # set X display, arg
- _OPT_DISPLAY="$1";
- shift;
- ;;
- --do-nothing)
- _OPT_DO_NOTHING='yes';
- ;;
- --dvi)
- _OPT_MODE='dvi';
- ;;
- --dvi-viewer|--dvi-viewer-tty) # viewer program for dvi mode; arg
- _OPT_VIEWER_DVI="$1";
- shift;
- ;;
- --extension) # the extension for man pages, arg
- _OPT_EXTENSION="$1";
- shift;
- ;;
-### main_parse_args()
- --fg|--foreground) # foreground color for viewers, arg;
- _OPT_FG="$1";
- shift;
- ;;
- --fn|--ft|--font) # set font for viewers, arg;
- _OPT_FN="$1";
- shift;
- ;;
- --geometry) # window geometry for viewers, arg;
- _OPT_GEOMETRY="$1";
- shift;
- ;;
- --groff)
- _OPT_MODE='groff';
- ;;
- --html|--www) # display with web browser
- _OPT_MODE=html;
- ;;
- --html-viewer|--www-viewer|--html-viewer-tty|--www-viewer-tty)
- # viewer program for html mode; arg
- _OPT_VIEWER_HTML="$1";
- shift;
- ;;
- --iconic) # start viewers as icons
- _OPT_ICONIC='yes';
- ;;
-### main_parse_args()
- --locale) # set language for man pages, arg
- # argument is xx[_territory[.codeset[@modifier]]] (ISO 639,...)
- _OPT_LANG="$1";
- shift;
- ;;
- --local-file) # force local files; same as `--no-man'
- _MAN_FORCE='no';
- _MAN_ENABLE='no';
- ;;
- --location|--where) # print file locations to stderr
- _DEBUG_PRINT_FILENAMES='yes';
- ;;
- --man) # force all file params to be man pages
- _MAN_ENABLE='yes';
- _MAN_FORCE='yes';
- ;;
- --manpath) # specify search path for man pages, arg
- # arg is colon-separated list of directories
- _OPT_MANPATH="$1";
- shift;
- ;;
- --mode) # display mode
- mpa_arg="$1";
- shift;
- case "${mpa_arg}" in
- auto|'') # search mode automatically among default
- _OPT_MODE='';
- ;;
- groff) # pass input to plain groff
- _OPT_MODE='groff';
- ;;
-### main_parse_args()
- html|www) # display with a web browser
- _OPT_MODE='html';
- ;;
- dvi) # display with xdvi viewer
- _OPT_MODE='dvi';
- ;;
- pdf) # display with PDF viewer
- _OPT_MODE='pdf';
- ;;
- ps) # display with Postscript viewer
- _OPT_MODE='ps';
- ;;
- text) # output on terminal
- _OPT_MODE='text';
- ;;
- tty) # output on terminal
- _OPT_MODE='tty';
- ;;
- X|x) # output on X roff viewer
- _OPT_MODE='x';
- ;;
-### main_parse_args()
- Q|source) # display source code
- _OPT_MODE="source";
- ;;
- *)
- error "main_parse_args(): unknown mode ${mpa_arg}";
- ;;
- esac;
- ;;
- --no-location) # disable former call to `--location'
- _DEBUG_PRINT_FILENAMES='no';
- ;;
- --no-man) # disable search for man pages
- # the same as --local-file
- _MAN_FORCE='no';
- _MAN_ENABLE='no';
- ;;
- --no-special) # disable some special former calls
- _OPT_ALL='no'
- _OPT_APROPOS='no'
- _OPT_WHATIS='no'
- ;;
- --pager|--tty-viewer|--tty-viewer-tty)
- # set paging program for tty mode, arg
- _OPT_PAGER="$1";
- shift;
- ;;
- --pdf)
- _OPT_MODE='pdf';
- ;;
-### main_parse_args()
- --pdf-viewer|--pdf-viewer-tty) # viewer program for pdf mode; arg
- _OPT_VIEWER_PDF="$1";
- shift;
- ;;
- --print) # for argument test
- echo2 "$1";
- shift;
- ;;
- --ps)
- _OPT_MODE='ps';
- ;;
- --ps-viewer|--ps-viewer-tty) # viewer program for ps mode; arg
- _OPT_VIEWER_PS="$1";
- shift;
- ;;
-### main_parse_args()
- --resolution) # set resolution for X devices, arg
- mpa_arg="$1";
- shift;
- case "${mpa_arg}" in
- 75|75dpi)
- mpa_dpi=75;
- ;;
- 100|100dpi)
- mpa_dpi=100;
- ;;
- *)
- error "main_parse_args(): \
-only resoutions of 75 or 100 dpi are supported";
- ;;
- esac;
- _OPT_RESOLUTION="${mpa_dpi}";
- ;;
- --rv)
- _OPT_RV='yes';
- ;;
- --sections) # specify sections for man pages, arg
- # arg is colon-separated list of section names
- _OPT_SECTIONS="$1";
- shift;
- ;;
- --shell)
- # already done during the first run; so ignore the argument
- shift;
- ;;
-### main_parse_args()
- --systems) # man pages for different OS's, arg
- # argument is a comma-separated list
- _OPT_SYSTEMS="$1";
- shift;
- ;;
- --text) # text mode without pager
- _OPT_MODE=text;
- ;;
- --title) # title for X viewers; arg
- if is_not_empty "$1"
- then
- list_append _OPT_TITLE "$1";
- fi;
- shift;
- ;;
- --to-stdout) # print mode file without display
- _OPT_STDOUT='yes';
- ;;
- --tty) # tty mode, text with pager
- _OPT_MODE=tty;
- ;;
- --text-device|--tty-device) # device for tty mode; arg
- _OPT_TEXT_DEVICE="$1";
- shift;
- ;;
- --whatis)
- _OPT_WHATIS='yes';
- _OPT_APROPOS='no';
- ;;
- --X|--x)
- _OPT_MODE=x;
- ;;
-### main_parse_args()
- --xrm) # pass X resource string, arg;
- list_append _OPT_XRM "$1";
- shift;
- ;;
- --x-viewer|--X-viewer|--x-viewer-tty|--X-viewer-tty)
- # viewer program for x mode; arg
- _OPT_VIEWER_X="$1";
- shift;
- ;;
- *)
- error 'main_parse_args(): unknown option '"\`${mpa_opt}'.";
- ;;
- esac;
- done;
- shift; # remove `--' argument
-
- if obj _OPT_WHATIS is_yes
- then
- _MAN_ALL='yes';
- _APROPOS_SECTIONS='';
- fi;
-
- if obj _OPT_DO_NOTHING is_yes
- then
- leave;
- fi;
-
-### main_parse_args()
- case "$_OPT_DEFAULT_MODES" in
- '') :; ;;
- *,*)
- obj_from_output _OPT_DEFAULT_MODES \
- obj _OPT_DEFAULT_MODES list_from_split ',';
- ;;
- *) :; ;;
- esac;
-
- # Remaining arguments are file names (filespecs).
- # Save them to list $_FILEARGS
- if is_equal "$#" 0
- then # use "-" for standard input
- _NO_FILESPECS='yes';
- set x '-';
- shift;
- fi;
- _FILEARGS='';
- list_append _FILEARGS "$@";
- # $_FILEARGS must be retrieved with `eval set x "$_FILEARGS"; shift;'
- eval ${_UNSET} mpa_arg;
- eval ${_UNSET} mpa_dpi;
- eval ${_UNSET} mpa_opt;
- eval ${_UNSET} mpa_optchar;
- eval "${return_ok}";
-} # main_parse_args()
-
-
-# Called from main_parse_args() because double `case' is not possible.
-# Globals: $_OPT_DEVICE, $_OPT_MODE
-_check_device_with_mode()
-{
- func_check _check_device_with_mode = 0 "$@";
- case "${_OPT_DEVICE}" in
- dvi)
- _OPT_MODE=dvi;
- eval "${return_ok}";
- ;;
- html)
- _OPT_MODE=html;
- eval "${return_ok}";
- ;;
- lbp|lj4)
- _OPT_MODE=groff;
- eval "${return_ok}";
- ;;
- ps)
- _OPT_MODE=ps;
- eval "${return_ok}";
- ;;
- ascii|cp1047|latin1|utf8)
- if obj _OPT_MODE is_not_equal text
- then
- _OPT_MODE=tty; # default text mode
- fi;
- eval "${return_ok}";
- ;;
- X*)
- _OPT_MODE=x;
- eval "${return_ok}";
- ;;
- *) # unknown device, go to groff mode
- _OPT_MODE=groff;
- eval "${return_ok}";
- ;;
- esac;
- eval "${return_error}";
-} # _check_device_with_mode() of main_parse_args()
-
-
-########################################################################
-# main_set_mode ()
-#
-# Determine the display mode and the corresponding viewer program.
-#
-# Globals:
-# in: $DISPLAY, $_OPT_MODE, $_OPT_DEVICE
-# out: $_DISPLAY_MODE
-#
-# Variable prefix: msm
-#
-main_set_mode()
-{
- func_check main_set_mode = 0 "$@";
-
- # set display
- if obj _OPT_DISPLAY is_not_empty
- then
- DISPLAY="${_OPT_DISPLAY}";
- fi;
-
- if obj _OPT_V is_yes
- then
- list_append _ADDOPTS_GROFF '-V';
- fi;
- if obj _OPT_Z is_yes
- then
- _DISPLAY_MODE='groff';
- list_append _ADDOPTS_GROFF '-Z';
- fi;
- if obj _OPT_MODE is_equal 'groff'
- then
- _DISPLAY_MODE='groff';
- fi;
- if obj _DISPLAY_MODE is_equal 'groff'
- then
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- fi;
-
-### main_set_mode()
-
- case "${_OPT_MODE}" in
- '') # automatic mode
- case "${_OPT_DEVICE}" in
- X*)
- if is_not_X
- then
- error_user "no X display found for device ${_OPT_DEVICE}";
- fi;
- _DISPLAY_MODE='x';
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- ;;
- ascii|cp1047|latin1|utf8)
- if obj _DISPLAY_MODE is_not_equal 'text'
- then
- _DISPLAY_MODE='tty';
- fi;
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- ;;
-### main_set_mode()
- esac;
- if is_not_X
- then
- _DISPLAY_MODE='tty';
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- fi;
-
- if obj _OPT_DEFAULT_MODES is_empty
- then
- msm_modes="${_DEFAULT_MODES}";
- else
- msm_modes="${_OPT_DEFAULT_MODES}";
- fi;
- ;;
- source)
- _DISPLAY_MODE='source';
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- ;;
- text)
- _DISPLAY_MODE='text';
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- ;;
- tty)
- _DISPLAY_MODE='tty';
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- ;;
-### main_set_mode()
- html)
- _DISPLAY_MODE='html';
- msm_modes="${_OPT_MODE}";
- ;;
- *) # display mode was given
- msm_modes="${_OPT_MODE}";
- ;;
- esac;
-
- eval set x "${msm_modes}";
- shift;
- while is_greater_than "$#" 0
- do
- msm_1="$1";
- shift;
-
- _VIEWER_BACKGROUND='no';
-
- case "${msm_1}" in
- dvi)
- _get_prog_args DVI;
- if is_not_equal "$?" 0
- then
- continue;
- fi;
- if obj _DISPLAY_PROG is_empty
- then
- if is_equal "$#" 0
- then
- error 'main_set_mode(): No viewer for dvi mode available.';
- else
- continue;
- fi;
- fi;
-### main_set_mode()
- _DISPLAY_MODE="dvi";
- eval ${_UNSET} msm_1;
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- ;;
- html)
- _get_prog_args HTML;
- if is_not_equal "$?" 0
- then
- continue;
- fi;
- if obj _DISPLAY_PROG is_empty
- then
- if is_equal "$#" 0
- then
- error 'main_set_mode(): No viewer for html mode available.';
- else
- continue;
- fi;
- fi;
-### main_set_mode()
- _DISPLAY_MODE=html;
- eval ${_UNSET} msm_1;
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- ;;
- pdf)
- if obj _PDF_DID_NOT_WORK is_yes
- then
- if is_equal "$#" 0
- then
- error 'main_set_mode(): pdf mode did not work.';
- else
- continue;
- fi;
- fi;
- if obj _PDF_HAS_PS2PDF is_not_yes
- then
- if is_prog ps2pdf
- then
- _PDF_HAS_PS2PDF='yes';
- fi;
- fi;
- if obj _PDF_HAS_GS is_not_yes
- then
- if is_prog gs
- then
- _PDF_HAS_GS='yes';
- fi;
- fi;
- _get_prog_args PDF;
- if is_not_equal "$?" 0
- then
- _PDF_DID_NOT_WORK='yes';
- continue;
- fi;
- if obj _DISPLAY_PROG is_empty
- then
- _PDF_DID_NOT_WORK='yes';
- if is_equal "$#" 0
- then
- error 'main_set_mode(): No viewer for pdf mode available.';
- else
- continue;
- fi;
- fi;
- _DISPLAY_MODE="pdf";
- eval ${_UNSET} msm_1;
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- ;;
-### main_set_mode()
- ps)
- _get_prog_args PS;
- if is_not_equal "$?" 0
- then
- continue;
- fi;
- if obj _DISPLAY_PROG is_empty
- then
- if is_equal "$#" 0
- then
- error 'main_set_mode(): No viewer for ps mode available.';
- else
- continue;
- fi;
- fi;
- _DISPLAY_MODE="ps";
- eval ${_UNSET} msm_1;
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- ;;
- text)
- _DISPLAY_MODE='text';
- eval ${_UNSET} msm_1;
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- ;;
-### main_set_mode()
- tty)
- _DISPLAY_MODE='tty';
- eval ${_UNSET} msm_1;
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- ;;
- x)
- _get_prog_args x;
- if is_not_equal "$?" 0
- then
- continue;
- fi;
- if obj _DISPLAY_PROG is_empty
- then
- if is_equal "$#" 0
- then
- error 'main_set_mode(): No viewer for x mode available.';
- else
- continue;
- fi;
- fi;
- _DISPLAY_MODE='x';
- eval ${_UNSET} msm_1;
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- ;;
-### main_set_mode()
- X)
- _DISPLAY_MODE='X';
- eval ${_UNSET} msm_1;
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- eval "${return_ok}";
- ;;
- esac;
- done;
- eval ${_UNSET} msm_1;
- eval ${_UNSET} msm_modes;
- eval ${_UNSET} msm_viewers;
- error_user "No suitable display mode found.";
-} # main_set_mode()
-
-
-# _get_prog_args (<MODE>)
-#
-# Simplification for loop in main_set_mode().
-#
-# Globals in/out: $_VIEWER_BACKGROUND
-# Globals in : $_OPT_VIEWER_<MODE>, $_VIEWER_<MODE>_X, $_VIEWER_<MODE>_TTY
-#
-# Variable prefix: _gpa
-#
-_get_prog_args()
-{
- func_check _get_prog_args '=' 1 "$@";
-
- x="$(echo1 $1 | tr [a-z] [A-Z])";
- eval _gpa_opt='"${_OPT_VIEWER_'"$x"'}"';
- _gpa_xlist=_VIEWER_"$x"_X;
- _gpa_ttylist=_VIEWER_"$x"_TTY;
-
- if obj _gpa_opt is_empty
- then
- _VIEWER_BACKGROUND='no';
- if is_X
- then
- _get_first_prog "${_gpa_xlist}";
- x="$?";
- if is_equal "$x" 0
- then
- _VIEWER_BACKGROUND='yes';
- fi;
- else
- _get_first_prog "${_gpa_ttylist}";
- x="$?";
- fi;
- exit_test;
- eval ${_UNSET} _gpa_opt;
- eval ${_UNSET} _gpa_prog;
- eval ${_UNSET} _gpa_ttylist;
- eval ${_UNSET} _gpa_xlist;
- eval "${return_var} $x";
-### _get_prog_args() of main_set_mode()
- else # $_gpa_opt is not empty
- obj_from_output _gpa_prog where_is_prog "${_gpa_opt}";
- if is_not_equal "$?" 0 || obj _gpa_prog is_empty
- then
- exit_test;
- echo2 "_get_prog_args(): '${_gpa_opt}' is not an existing program.";
- eval ${_UNSET} _gpa_opt;
- eval ${_UNSET} _gpa_prog;
- eval ${_UNSET} _gpa_ttylist;
- eval ${_UNSET} _gpa_xlist;
- eval "${return_bad}";
- fi;
- exit_test;
-
- # $_gpa_prog from opt is an existing program
-
-### _get_prog_args() of main_set_mode()
- if is_X
- then
- eval _check_prog_on_list ${_gpa_prog} ${_gpa_xlist};
- if is_equal "$?" 0
- then
- _VIEWER_BACKGROUND='yes';
- else
- _VIEWER_BACKGROUND='no';
- eval _check_prog_on_list ${_gpa_prog} ${_gpa_ttylist};
- fi;
- else # is not X
- _VIEWER_BACKGROUND='no';
- eval _check_prog_on_list ${_gpa_prog} ${_gpa_ttylist};
- fi; # is_X
- fi; # test of $_gpa_opt
- eval ${_UNSET} _gpa_opt;
- eval ${_UNSET} _gpa_prog;
- eval ${_UNSET} _gpa_ttylist;
- eval ${_UNSET} _gpa_xlist;
- eval "${return_good}";
-} # _get_prog_args() of main_set_mode()
-
-
-# _get_first_prog (<prog_list_name>)
-#
-# Retrieve from the elements of the list in the argument the first
-# existing program in $PATH.
-#
-# Local function for main_set_mode().
-#
-# Return : `1' if none found, `0' if found.
-# Output : none
-#
-# Variable prefix: _gfp
-#
-_get_first_prog()
-{
- func_check _get_first_prog '=' 1 "$@";
- eval x='"${'"$1"'}"';
- eval set x "$x";
- shift;
- for i
- do
- _gfp_i="$i";
- if obj _gfp_i is_empty
- then
- continue;
- fi;
- obj_from_output _gfp_result where_is_prog "${_gfp_i}";
- if is_equal "$?" 0 && obj _gfp_result is_not_empty
- then
- exit_test;
- eval set x ${_gfp_result};
- shift;
- _DISPLAY_PROG="$1";
- _DISPLAY_ARGS="$2";
- eval ${_UNSET} _gfp_i;
- eval ${_UNSET} _gfp_result;
- eval "${return_good}";
- fi;
- exit_test;
- done;
- eval ${_UNSET} _gfp_i;
- eval ${_UNSET} _gfp_result;
- eval "${return_bad}";
-} # _get_first_prog() of main_set_mode()
-
-
-# _check_prog_on_list (<prog> <args> <prog_list_name>)
-#
-# Check whether the content of <prog> is in the list <prog_list_name>.
-# The globals are set correspondingly.
-#
-# Local function for main_set_mode().
-#
-# Arguments: 3
-#
-# Return : `1' if not a part of the list, `0' if found in the list.
-# Output : none
-#
-# Globals in : $_VIEWER_<MODE>_X, $_VIEWER_<MODE>_TTY
-# Globals in/out: $_DISPLAY_PROG, $_DISPLAY_ARGS
-#
-# Variable prefix: _cpol
-#
-_check_prog_on_list()
-{
- func_check _check_prog_on_list '=' 3 "$@";
- _DISPLAY_PROG="$1";
- _DISPLAY_ARGS="$2";
-
- eval _cpol_3='"${'"$3"'}"';
- eval set x "${_cpol_3}";
- shift;
- eval ${_UNSET} _cpol_3;
-
- for i
- do
- _cpol_i="$i";
- obj_from_output _cpol_list where_is_prog "${_cpol_i}";
- if is_not_equal "$?" 0 || obj _cpol_list is_empty
- then
- exit_test;
- continue;
- fi;
- exit_test;
- _cpol_prog="$(eval set x ${_cpol_list}; shift; echo1 "$1")";
-
- if is_not_equal "${_DISPLAY_PROG}" "${_cpol_prog}"
- then
- exit_test;
- continue;
- fi;
- exit_test;
-### _check_prog_on_list() of main_set_mode()
-
- # equal, prog found
-
- _cpol_args="$(eval set x ${_cpol_list}; shift; echo1 "$2")";
- eval ${_UNSET} _cpol_list;
- if obj _cpol_args is_not_empty
- then
- if obj _DISPLAY_ARGS is_empty
- then
- _DISPLAY_ARGS="${_cpol_args}";
- else
- _DISPLAY_ARGS="${_cpol_args} ${_DISPLAY_ARGS}";
- fi;
- fi;
-
- eval ${_UNSET} _cpol_i;
- eval ${_UNSET} _cpol_args;
- eval ${_UNSET} _cpol_prog;
- eval "${return_good}";
- done; # for vars in list
-
- # prog was not in the list
- eval ${_UNSET} _cpol_i;
- eval ${_UNSET} _cpol_args;
- eval ${_UNSET} _cpol_list;
- eval ${_UNSET} _cpol_prog;
- eval "${return_bad}";
-} # _check_prog_on_list() of main_set_mode()
-
-
-#######################################################################
-# main_do_fileargs ()
-#
-# Process filespec arguments.
-#
-# Globals:
-# in: $_FILEARGS (process with `eval set x "$_FILEARGS"; shift;')
-#
-# Variable prefix: mdfa
-#
-main_do_fileargs()
-{
- func_check main_do_fileargs = 0 "$@";
- special_setup;
- if obj _OPT_APROPOS is_yes
- then
- if obj _NO_FILESPECS is_yes
- then
- apropos_filespec;
- eval "${return_ok}";
- fi;
- else
- if list_has _FILEARGS '-'
- then
- save_stdin;
- fi;
- fi;
- eval set x "${_FILEARGS}";
- shift;
- eval ${_UNSET} _FILEARGS;
-### main_do_fileargs()
- while is_greater_than "$#" 0
- do
- mdfa_filespec="$1";
- _FILESPEC_ARG="$1";
- shift;
- _FILESPEC_IS_MAN='no';
- _TMP_MANSPEC='';
- _SPECIAL_FILESPEC='no';
-
- case "${mdfa_filespec}" in
- '')
- continue;
- ;;
- esac;
-
- # check for file
- case "${mdfa_filespec}" in
- '-')
- special_filespec;
- if obj _OPT_APROPOS is_yes
- then
- continue;
- fi;
- register_file '-';
- continue;
- ;;
-### main_do_fileargs()
- */*)
- special_filespec;
- if obj _OPT_APROPOS is_yes
- then
- continue;
- fi;
- if obj mdfa_filespec is_file
- then
- obj mdfa_filespec register_file;
- else
- echo2 "The argument ${mdfa_filespec} is not a file.";
- fi;
- continue;
- ;;
- *)
- if obj _OPT_APROPOS is_yes
- then
- special_filespec;
- continue;
- fi;
- # check whether filespec is an existing file
- if obj _MAN_FORCE is_not_yes
- then
- if obj mdfa_filespec is_file
- then
- special_filespec;
- obj mdfa_filespec register_file;
- continue;
- fi;
- fi;
- ;;
- esac;
-### main_do_fileargs()
-
- # now it must be a man page pattern
-
- if obj _MACRO_PKG is_not_empty && obj _MACRO_PKG is_not_equal '-man'
- then
- echo2 "${mdfa_filespec} is not a file, man pages are ignored "\
-"due to ${_MACRO_PKG}.";
- continue;
- fi;
-
- # check for man page
- if obj _MAN_ENABLE is_not_yes
- then
- echo2 "The argument ${mdfa_filespec} is not a file.";
- continue;
- fi;
- if obj _MAN_FORCE is_yes
- then
- mdfa_errmsg='is not a man page.';
- else
- mdfa_errmsg='is neither a file nor a man page.';
- fi;
-### main_do_fileargs()
- man_setup;
- _FILESPEC_IS_MAN='yes';
-
- # test filespec with `man:...' or `...(...)' on man page
- mdfa_name='';
- mdfa_section='';
- mdfa_ext='';
-
- mdfa_names="${mdfa_filespec}";
- case "${mdfa_filespec}" in
- man:*)
- mdfa_names="${mdfa_names} "\
-"$(obj mdfa_filespec echo1 | sed 's/^man://')";
- ;;
- esac;
-
- mdfa_continue='no';
- for i in ${mdfa_names}
- do
- mdfa_i=$i;
- if obj mdfa_i man_is_man
- then
- special_filespec;
- obj mdfa_i man_get;
- mdfa_continue='yes';
- break;
- fi;
- case "${mdfa_i}" in
- *\(${_MAN_AUTO_SEC_CHARS}*\))
- mdfa_section="$(obj mdfa_i echo1 | sed 's/^[^(]*(\(.\).*)$/\1/')";
- mdfa_name="$(obj mdfa_i echo1 | sed 's/^\([^(]*\)(.*)$/\1/')";
- mdfa_ext="$(obj mdfa_i echo1 | sed 's/^[^(]*(.\(.*\))$/\1/')";
- if man_is_man "${mdfa_name}" "${mdfa_section}" "${mdfa_ext}"
- then
- special_filespec;
- man_get "${mdfa_name}" "${mdfa_section}" "${mdfa_ext}";
- mdfa_continue='yes';
- break;
- fi;
- ;;
- *.${_MAN_AUTO_SEC_CHARS}*)
- mdfa_name="$(obj mdfa_i echo1 | \
- sed 's/^\(.*\)\.'"${_MAN_AUTO_SEC_CHARS}"'.*$/\1/')";
- mdfa_section="$(obj mdfa_i echo1 | \
- sed 's/^.*\.\('"${_MAN_AUTO_SEC_CHARS}"'\).*$/\1/')";
- mdfa_ext="$(obj mdfa_i echo1 | \
- sed 's/^.*\.'"${_MAN_AUTO_SEC_CHARS}"'\(.*\)$/\1/')";
- if man_is_man "${mdfa_name}" "${mdfa_section}" "${mdfa_ext}"
- then
- special_filespec;
- man_get "${mdfa_name}" "${mdfa_section}" "${mdfa_ext}";
- mdfa_continue='yes';
- break;
- fi;
- ;;
- esac;
- done;
-
- if obj mdfa_continue is_yes
- then
- continue;
- fi;
-
-### main_do_fileargs()
- # check on "s name", where "s" is a section with or without an extension
- if is_not_empty "$1"
- then
- mdfa_name="$1";
- case "${mdfa_filespec}" in
- ${_MAN_AUTO_SEC_CHARS})
- mdfa_section="${mdfa_filespec}";
- mdfa_ext='';
- ;;
- ${_MAN_AUTO_SEC_CHARS}*)
- mdfa_section="$(echo1 "${mdfa_filespec}" | \
- sed 's/^\(.\).*$/\1/')";
- mdfa_ext="$(echo1 "${mdfa_filespec}" | \
- sed 's/^.\(.*\)$/\1/')";
- ;;
- *)
- echo2 "${mdfa_filespec} ${mdfa_errmsg}";
- continue;
- ;;
- esac;
- shift;
- if man_is_man "${mdfa_name}" "${mdfa_section}" "${mdfa_ext}"
- then
- _FILESPEC_ARG="${mdfa_filespec} ${mdfa_name}";
- special_filespec;
- man_get "${mdfa_name}" "${mdfa_section}" "${mdfa_ext}";
- continue;
- else
- echo2 "No man page for ${mdfa_name} with section ${mdfa_filespec}.";
- continue;
- fi;
- fi;
-
-### main_do_fileargs()
- echo2 "${mdfa_filespec} ${mdfa_errmsg}";
- continue;
- done;
-
- obj _TMP_STDIN rm_file_with_debug;
- eval ${_UNSET} mdfa_filespec;
- eval ${_UNSET} mdfa_i;
- eval ${_UNSET} mdfa_name;
- eval ${_UNSET} mdfa_names;
- eval "${return_ok}";
-} # main_do_fileargs()
-
-
-########################################################################
-# main_set_resources ()
-#
-# Determine options for setting X resources with $_DISPLAY_PROG.
-#
-# Globals: $_DISPLAY_PROG, $_OUTPUT_FILE_NAME
-#
-# Variable prefix: msr
-#
-main_set_resources()
-{
- func_check main_set_resources = 0 "$@";
- # $msr_prog viewer program
- # $msr_rl resource list
- for f in ${_TMP_DIR}/,man*
- do
- rm_file_with_debug $f;
- done;
- obj_from_output msr_title \
- get_first_essential "${_OPT_TITLE}" "${_REG_TITLE_LIST}";
- _OUTPUT_FILE_NAME='';
- eval set x "${msr_title}";
- shift;
- until is_equal "$#" 0
- do
- msr_n="$1";
- case "${msr_n}" in
- '')
- continue;
- ;;
- ,*)
- msr_n="$(echo1 "$1" | sed 's/^,,*//')";
- exit_test;
- ;;
- esac;
- if obj msr_n is_empty
- then
- continue;
- fi;
- if obj _OUTPUT_FILE_NAME is_not_empty
- then
- _OUTPUT_FILE_NAME="${_OUTPUT_FILE_NAME}"',';
- fi;
- _OUTPUT_FILE_NAME="${_OUTPUT_FILE_NAME}${msr_n}";
- shift;
- done; # until $# is 0
-### main_set_resources()
-
- case "${_OUTPUT_FILE_NAME}" in
- '')
- _OUTPUT_FILE_NAME='-';
- ;;
- ,*)
- error "main_set_resources(): ${_OUTPUT_FILE_NAME} starts with a comma.";
- ;;
- esac;
- _OUTPUT_FILE_NAME="${_TMP_DIR}/${_OUTPUT_FILE_NAME}";
-
- if obj _DISPLAY_PROG is_empty
- then # for example, for groff mode
- _DISPLAY_ARGS='';
- eval ${_UNSET} msr_n;
- eval ${_UNSET} msr_prog;
- eval ${_UNSET} msr_rl;
- eval ${_UNSET} msr_title;
- eval "${return_ok}";
- fi;
-
- eval set x "${_DISPLAY_PROG}";
- shift;
- obj_from_output msr_prog base_name "$1";
- shift;
- if is_greater_than $# 0
- then
- if obj _DISPLAY_ARGS is_empty
- then
- _DISPLAY_ARGS="$*";
- else
- _DISPLAY_ARGS="$* ${_DISPLAY_ARGS}";
- fi;
- fi;
-### main_set_resources()
- msr_rl='';
- if obj _OPT_BD is_not_empty
- then
- case "${msr_prog}" in
- ghostview|gv|gxditview|xditview|xdvi)
- list_append msr_rl '-bd' "${_OPT_BD}";
- ;;
- esac;
- fi;
- if obj _OPT_BG is_not_empty
- then
- case "${msr_prog}" in
- ghostview|gv|gxditview|xditview|xdvi)
- list_append msr_rl '-bg' "${_OPT_BG}";
- ;;
- kghostview)
- list_append msr_rl '--bg' "${_OPT_BG}";
- ;;
- xpdf)
- list_append msr_rl '-papercolor' "${_OPT_BG}";
- ;;
- esac;
- fi;
- if obj _OPT_BW is_not_empty
- then
- case "${msr_prog}" in
- ghostview|gv|gxditview|xditview|xdvi)
- _list_append msr_rl '-bw' "${_OPT_BW}";
- ;;
- esac;
- fi;
-### main_set_resources()
- if obj _OPT_FG is_not_empty
- then
- case "${msr_prog}" in
- ghostview|gv|gxditview|xditview|xdvi)
- list_append msr_rl '-fg' "${_OPT_FG}";
- ;;
- kghostview)
- list_append msr_rl '--fg' "${_OPT_FG}";
- ;;
- esac;
- fi;
- if is_not_empty "${_OPT_FN}"
- then
- case "${msr_prog}" in
- ghostview|gv|gxditview|xditview|xdvi)
- list_append msr_rl '-fn' "${_OPT_FN}";
- ;;
- kghostview)
- list_append msr_rl '--fn' "${_OPT_FN}";
- ;;
- esac;
- fi;
- if is_not_empty "${_OPT_GEOMETRY}"
- then
- case "${msr_prog}" in
- ghostview|gv|gxditview|xditview|xdvi|xpdf)
- list_append msr_rl '-geometry' "${_OPT_GEOMETRY}";
- ;;
- kghostview)
- list_append msr_rl '--geometry' "${_OPT_GEOMETRY}";
- ;;
- esac;
- fi;
-### main_set_resources()
- if is_empty "${_OPT_RESOLUTION}"
- then
- _OPT_RESOLUTION="${_DEFAULT_RESOLUTION}";
- case "${msr_prog}" in
- gxditview|xditview)
- list_append msr_rl '-resolution' "${_DEFAULT_RESOLUTION}";
- ;;
- xpdf)
- case "${_DISPLAY_PROG}" in
- *-z*)
- :;
- ;;
- *) # if xpdf does not have option -z
- case "${_DEFAULT_RESOLUTION}" in
- 75)
- # 72dpi is '100'
- list_append msr_rl '-z' '104';
- ;;
- 100)
- list_append msr_rl '-z' '139';
- ;;
- esac;
- ;;
- esac;
- ;;
- esac;
- else
- case "${msr_prog}" in
- ghostview|gv|gxditview|xditview|xdvi)
- list_append msr_rl '-resolution' "${_OPT_RESOLUTION}";
- ;;
- xpdf)
- case "${_DISPLAY_PROG}" in
- *-z*)
- :;
- ;;
- *) # if xpdf does not have option -z
- case "${_OPT_RESOLUTION}" in
- 75)
- list_append msr_rl '-z' '104';
- # '100' corresponds to 72dpi
- ;;
-### main_set_resources()
- 100)
- list_append msr_rl '-z' '139';
- ;;
- esac;
- ;;
- esac;
- ;;
- esac;
- fi;
- if is_yes "${_OPT_ICONIC}"
- then
- case "${msr_prog}" in
- ghostview|gv|gxditview|xditview|xdvi)
- list_append msr_rl '-iconic';
- ;;
- esac;
- fi;
- if is_yes "${_OPT_RV}"
- then
- case "${msr_prog}" in
- ghostview|gv|gxditview|xditview|xdvi)
- list_append msr_rl '-rv';
- ;;
- esac;
- fi;
- if is_not_empty "${_OPT_XRM}"
- then
- case "${msr_prog}" in
- ghostview|gv|gxditview|xditview|xdvi|xpdf)
- eval set x "${_OPT_XRM}";
- shift;
- for i
- do
- list_append msr_rl '-xrm' "$i";
- done;
-### main_set_resources()
- ;;
- esac;
- fi;
- if is_not_empty "${msr_title}"
- then
- case "${msr_prog}" in
- gxditview|xditview)
- list_append msr_rl '-title' "${msr_title}";
- ;;
- esac;
- fi;
- if obj _DISPLAY_ARGS is_empty
- then
- _DISPLAY_ARGS="${msr_rl}";
- else
- _DISPLAY_ARGS="${msr_l} ${_DISPLAY_ARGS}";
- fi;
- eval ${_UNSET} msr_n;
- eval ${_UNSET} msr_prog;
- eval ${_UNSET} msr_rl;
- eval ${_UNSET} msr_title;
- eval "${return_ok}";
-} # main_set_resources
-
-
-########################################################################
-# main_display ()
-#
-# Do the actual display of the whole thing.
-#
-# Globals:
-# in: $_DISPLAY_MODE, $_OPT_DEVICE, $_ADDOPTS_GROFF,
-# $_TMP_CAT, $_OPT_PAGER, $_MANOPT_PAGER, $_OUTPUT_FILE_NAME
-#
-# Variable prefix: md
-#
-main_display()
-{
- func_check main_display = 0 "$@";
-
- export md_addopts;
- export md_groggy;
- export md_modefile;
-
- if obj _TMP_CAT is_empty_file
- then
- echo2 'groffer: empty input.';
- clean_up;
- eval "${return_ok}";
- fi;
-
- md_modefile="${_OUTPUT_FILE_NAME}";
-
- # go to the temporary directory to be able to access internal data files
- cd "${_TMP_DIR}" >"${_NULL_DEV}" 2>&1;
-
- case "${_DISPLAY_MODE}" in
- groff)
- if obj _OPT_DEVICE is_not_empty
- then
- _ADDOPTS_GROFF="${_ADDOPTS_GROFF} -T${_OPT_DEVICE}";
- fi;
- md_groggy="$(tmp_cat | eval grog)";
- if is_not_equal "$?" 0
- then
- exit "${_ERROR}";
- fi;
- echo2 "grog output: ${md_groggy}";
- exit_test;
- _do_opt_V;
-
-### main_display()
- obj md_modefile rm_file;
- mv "${_TMP_CAT}" "${md_modefile}";
- trap_unset;
- cat "${md_modefile}" | \
- {
- trap_set;
- eval "${md_groggy}" "${_ADDOPTS_GROFF}";
- } &
- ;;
- text|tty)
- case "${_OPT_DEVICE}" in
- '')
- obj_from_output md_device \
- get_first_essential "${_OPT_TEXT_DEVICE}" "${_DEFAULT_TTY_DEVICE}";
- ;;
- ascii|cp1047|latin1|utf8)
- md_device="${_OPT_DEVICE}";
- ;;
- *)
- warning "main_display(): \
-wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}";
- ;;
- esac;
- md_addopts="${_ADDOPTS_GROFF}";
- md_groggy="$(tmp_cat | grog -T${md_device})";
- if is_not_equal "$?" 0
- then
- exit "${_ERROR}";
- fi;
- echo2 "grog output: ${md_groggy}";
- exit_test;
- if obj _DISPLAY_MODE is_equal 'text'
- then
- _do_opt_V;
- tmp_cat | eval "${md_groggy}" "${md_addopts}";
- else # $_DISPLAY_MODE is 'tty'
-### main_display()
- md_pager='';
- for p in "${_OPT_PAGER}" "${_MANOPT_PAGER}" "${PAGER}"
- do
- if obj p is_empty
- then
- continue;
- fi;
- obj_from_output md_pager where_is_prog "$p";
- if is_not_equal "$?" 0 || obj md_pager is_empty
- then
- md_pager='';
- continue;
- fi;
- eval set x $md_pager;
- shift;
- case "$1" in
- */less)
- if is_empty "$2"
- then
- md_pager="$1"' -r -R';
- else
- md_pager="$1"' -r -R '"$2";
- fi;
- ;;
-### main_display()
- *)
- if is_empty "$2"
- then
- md_pager="$1";
- else
- md_pager="$1 $2";
- fi;
- ;;
- esac;
- break;
- done;
- if obj md_pager is_empty
- then
- eval set x ${_VIEWER_TTY_TTY} ${_VIEWER_TTY_X} 'cat';
- shift;
- # that is: 'less -r -R' 'more' 'pager' 'xless' 'cat'
- for p
- do
- if obj p is_empty
- then
- continue;
- fi;
- md_p="$p";
- if is_prog "${md_p}"
- then
- md_pager="${md_p}";
- break;
- fi;
- done;
- fi;
-### main_display()
- if obj md_pager is_empty
- then
- error 'main_display(): no pager program found for tty mode';
- fi;
- _do_opt_V;
- tmp_cat | eval "${md_groggy}" "${md_addopts}" | \
- eval "${md_pager}";
- fi; # $_DISPLAY_MODE
- clean_up;
- ;; # text|tty)
- source)
- tmp_cat;
- clean_up;
- ;;
-
- #### viewer modes
-
-### main_display()
- dvi)
- case "${_OPT_DEVICE}" in
- ''|dvi) do_nothing; ;;
- *)
- warning "main_display(): \
-wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"
- ;;
- esac;
- md_modefile="${md_modefile}".dvi;
- md_groggy="$(tmp_cat | grog -Tdvi)";
- if is_not_equal "$?" 0
- then
- exit "${_ERROR}";
- fi;
- echo2 "grog output: ${md_groggy}";
- exit_test;
- _do_display;
- ;;
- html)
- case "${_OPT_DEVICE}" in
- ''|html) do_nothing; ;;
- *)
- warning "main_display(): \
-wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}";
- ;;
- esac;
- md_modefile="${md_modefile}".html;
- md_groggy="$(tmp_cat | grog -Thtml)";
- if is_not_equal "$?" 0
- then
- exit "${_ERROR}";
- fi;
- echo2 "grog output: ${md_groggy}";
- exit_test;
- _do_display;
- ;;
-### main_display()
- pdf)
- case "${_OPT_DEVICE}" in
- ''|ps)
- do_nothing;
- ;;
- *)
- warning "main_display(): \
-wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}";
- ;;
- esac;
- md_groggy="$(tmp_cat | grog -Tps)";
- if is_not_equal "$?" 0
- then
- exit "${_ERROR}";
- fi;
- echo2 "grog output: ${md_groggy}";
- exit_test;
- _do_display _make_pdf;
- ;;
- ps)
- case "${_OPT_DEVICE}" in
- ''|ps)
- do_nothing;
- ;;
- *)
- warning "main_display(): \
-wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}";
- ;;
- esac;
- md_modefile="${md_modefile}".ps;
- md_groggy="$(tmp_cat | grog -Tps)";
- if is_not_equal "$?" 0
- then
- exit "${_ERROR}";
- fi;
- echo2 "grog output: ${md_groggy}";
- exit_test;
- _do_display;
- ;;
-### main_display()
- x)
- case "${_OPT_DEVICE}" in
- X*)
- md_device="${_OPT_DEVICE}"
- ;;
- *)
- case "${_OPT_RESOLUTION}" in
- 100)
- md_device='X100';
- if obj _OPT_GEOMETRY is_empty
- then
- case "${_DISPLAY_PROG}" in
- gxditview|xditview)
- # add width of 800dpi for resolution of 100dpi to the args
- list_append _DISPLAY_ARGS '-geometry' '800';
- ;;
- esac;
- fi;
- ;;
- *)
- md_device='X75-12';
- ;;
- esac
- esac;
- md_groggy="$(tmp_cat | grog -T${md_device} -Z)";
- if is_not_equal "$?" 0
- then
- exit "${_ERROR}";
- fi;
- echo2 "grog output: ${md_groggy}";
- exit_test;
- _do_display;
- ;;
-### main_display()
- X)
- case "${_OPT_DEVICE}" in
- '')
- md_groggy="$(tmp_cat | grog -X)";
- if is_not_equal "$?" 0
- then
- exit "${_ERROR}";
- fi;
- echo2 "grog output: ${md_groggy}";
- exit_test;
- ;;
- X*|dvi|html|lbp|lj4|ps)
- # these devices work with
- md_groggy="$(tmp_cat | grog -T"${_OPT_DEVICE}" -X)";
- if is_not_equal "$?" 0
- then
- exit "${_ERROR}";
- fi;
- echo2 "grog output: ${md_groggy}";
- exit_test;
- ;;
- *)
- warning "main_display(): \
-wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}";
- md_groggy="$(tmp_cat | grog -Z)";
- if is_not_equal "$?" 0
- then
- exit "${_ERROR}";
- fi;
- echo2 "grog output: ${md_groggy}";
- exit_test;
- ;;
- esac;
- _do_display;
- ;;
- *)
- error "main_display(): unknown mode \`${_DISPLAY_MODE}'";
- ;;
- esac;
- eval ${_UNSET} md_addopts;
- eval ${_UNSET} md_device;
- eval ${_UNSET} md_groggy;
- eval ${_UNSET} md_modefile;
- eval ${_UNSET} md_p;
- eval ${_UNSET} md_pager;
- eval "${return_ok}";
-} # main_display()
-
-
-########################
-# _do_display ([<prog>])
-#
-# Perform the generation of the output and view the result. If an
-# argument is given interpret it as a function name that is called in
-# the midst (actually only for `pdf').
-#
-# Globals: $md_modefile, $md_groggy (from main_display())
-#
-_do_display()
-{
- func_check _do_display '>=' 0 "$@";
- _do_opt_V;
- if obj _DISPLAY_PROG is_empty
- then
- trap_unset;
- {
- trap_set;
- eval "${md_groggy}" "${_ADDOPTS_GROFF}" "${_TMP_CAT}";
- } &
- else
- obj md_modefile rm_file;
- cat "${_TMP_CAT}" | \
- eval "${md_groggy}" "${_ADDOPTS_GROFF}" > "${md_modefile}";
- if obj md_modefile is_empty_file
- then
- echo2 '_do_display(): empty output.';
- clean_up;
- exit;
- fi;
- if is_not_empty "$1"
- then
- eval "$1";
- fi;
-### _do_display() of main_display()
- obj _TMP_CAT rm_file_with_debug;
- if obj _OPT_STDOUT is_yes
- then
- cat "${md_modefile}";
- clean_up;
- exit;
- fi;
- if obj _VIEWER_BACKGROUND is_not_yes # for programs that run on tty
- then
- eval "'${_DISPLAY_PROG}'" ${_DISPLAY_ARGS} "\"${md_modefile}\"";
- else
- trap_unset;
- {
- trap_set;
- eval "${_DISPLAY_PROG}" ${_DISPLAY_ARGS} "\"${md_modefile}\"";
- } &
- fi;
- fi;
- eval "${return_ok}";
-} # _do_display() of main_display()
-
-
-#############
-# _do_opt_V ()
-#
-# Check on option `-V'; if set print the corresponding output and leave.
-#
-# Globals: $_ALL_PARAMS, $_ADDOPTS_GROFF, $_DISPLAY_MODE, $_DISPLAY_PROG,
-# $_DISPLAY_ARGS, $md_groggy, $md_modefile
-#
-# Variable prefix: _doV
-#
-_do_opt_V()
-{
- func_check _do_opt_V '=' 0 "$@";
- if obj _OPT_V is_yes
- then
- _OPT_V='no';
- echo1 "Parameters: ${_ALL_PARAMS}";
- echo1 "Display mode: ${_DISPLAY_MODE}";
- echo1 "Output file: ${md_modefile}";
- echo1 "Display prog: ${_DISPLAY_PROG} ${_DISPLAY_ARGS}";
- a="$(eval echo1 "'${_ADDOPTS_GROFF}'")";
- exit_test;
- echo1 "Output of grog: ${md_groggy} $a";
- _doV_res="$(eval "${md_groggy}" "${_ADDOPTS_GROFF}")";
- exit_test;
- echo1 "groff -V: ${_doV_res}"
- leave;
- fi;
- eval "${return_ok}";
-} # _do_opt_V() of main_display()
-
-
-##############
-# _make_pdf ()
-#
-# Transform to pdf format; for pdf mode in _do_display().
-#
-# Globals: $md_modefile (from main_display())
-#
-# Variable prefix: _mp
-#
-_make_pdf()
-{
- func_check _make_pdf '=' 0 "$@";
- _mp_psfile="${md_modefile}";
- md_modefile="${md_modefile}.pdf";
- obj md_modefile rm_file;
- if obj _PDF_HAS_PS2PDF is_yes && ps2pdf "${_mp_psfile}" "${md_modefile}";
- then
- :;
- elif obj _PDF_HAS_GS is_yes && gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
- -sOutputFile="${md_modefile}" -c save pop -f "${_mp_psfile}";
- then
- :;
- else
- _PDF_DID_NOT_WORK='yes';
- echo2 '_make_pdf(): Could not transform into pdf format. '\
-'The Postscript mode (ps) is used instead.';
- _OPT_MODE='ps';
- main_set_mode;
- main_set_resources;
- main_display;
- exit;
- fi;
- obj _mp_psfile rm_file_with_debug;
- eval ${_UNSET} _mp_psfile;
- eval "${return_ok}";
-} # _make_pdf() of main_display()
-
-
-########################################################################
-# main (<command_line_args>*)
-#
-# The main function for groffer.
-#
-# Arguments:
-#
-main()
-{
- func_check main '>=' 0 "$@";
- # Do not change the sequence of the following functions!
- landmark '13: main_init()';
- main_init;
- landmark '14: main_parse_MANOPT()';
- main_parse_MANOPT;
- landmark '15: main_parse_args()';
- main_parse_args "$@";
- landmark '16: main_set_mode()';
- main_set_mode;
- landmark '17: main_do_fileargs()';
- main_do_fileargs;
- landmark '18: main_set_resources()';
- main_set_resources;
- landmark '19: main_display()';
- main_display;
- eval "${return_ok}";
-}
-
-
-########################################################################
-
-main "$@";
diff --git a/contrib/groffer/shell/roff2.sh b/contrib/groffer/shell/roff2.sh
deleted file mode 100755
index 03db4896..00000000
--- a/contrib/groffer/shell/roff2.sh
+++ /dev/null
@@ -1,339 +0,0 @@
-#! /bin/sh
-
-# roff2* - transform roff files into other formats
-
-# Source file position: <groff-source>/contrib/groffer/shell/roff2.sh
-# Installed position: <prefix>/bin/roff2*
-
-# Copyright (C) 2006, 2009 Free Software Foundation, Inc.
-# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
-# Last update: 5 Jan 2009
-
-# This file is part of `groffer', which 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 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/>.
-
-########################################################################
-
-
-##############
-# echo1 (<text>*)
-#
-# Output to stdout with final line break.
-#
-# Arguments : arbitrary text including `-'.
-#
-echo1()
-{
- cat <<EOF
-$@
-EOF
-} # echo1()
-
-
-##############
-# echo2 (<text>*)
-#
-# Output to stderr with final line break.
-#
-# Arguments : arbitrary text including `-'.
-#
-echo2()
-{
- cat >&2 <<EOF
-$@
-EOF
-} # echo2()
-
-
-error_no_groffer='no';
-error_no_groffer() {
- if test _"$error_no_groffer" = _yes
- then
- return;
- fi;
- error_no_groffer='yes';
- echo2 "$name: groffer is not available.";
-}
-
-
-error_no_options='no';
-error_no_options() {
- if test _"$error_no_options" = _yes
- then
- return;
- fi;
- error_no_groffer='yes';
- echo2 "$name: groffer options are not allowed.";
-}
-
-
-usage_with_groffer() {
- cat <<EOF
-usage: $Name [option]... [--] [filespec]...
-
--h | --help print usage information
--v | --version print version information
-
-All other options are arbitrary options of "groffer"; the options
-override the behavior of this program.
-
-"filespec"s are the same as in "groffer": either the names of
-existing, readable files or "-" for standard input or a search pattern
-for man pages. No "filespec" assumes standard input automatically.
-EOF
-}
-
-usage_without_groffer() {
- cat <<EOF
-usage: $Name [option]... [--] [filespec]...
-
--h | --help print usage information
--v | --version print version information
-
-No other options are allowed because "groffer" is not available.
-
-The only "filespec"s allowed are the names of existing, readable files
-or "-" for standard input. No "filespec" assumes standard input
-automatically.
-EOF
-}
-
-
-where_is_prog() {
- for p in `echo $PATH|sed "s/:/ /g"`
- do
- f="${p}/$1";
- if test -f "$f" && test -x "$f"
- then
- echo1 "$f";
- return;
- fi;
- done;
-}
-
-
-########################################################################
-
-export NULL_DEV;
-if test -c /dev/null
-then
- NULL_DEV='/dev/null';
-else
- NULL_DEV='NUL';
-fi;
-
-name="$(echo1 "$0" | sed 's|^.*//*\([^/]*\)$|\1|')";
-
-case "$name" in
-roff2[a-z]*)
- mode="$(echo1 "$name" | sed 's/^roff2//')";
- ;;
-*)
- echo2 "wrong program name: $name";
- exit 1;
- ;;
-esac;
-
-groff_version="$(groff --version 2>$NULL_DEV)";
-if test $? -gt 0
-then
- echo2 "$name error: groff does not work.";
- exit 1;
-fi;
-groffer_version="$(groffer --version 2>$NULL_DEV)";
-if test $? -gt 0
-then
- has_groffer='no';
-else
- has_groffer='yes';
-fi;
-
-if test _"${has_groffer}" = _yes
-then
- for i
- do
- case $i in
- -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
- echo1 "$name in $groffer_version";
- exit 0;
- ;;
- -h|--h|--he|--hel|--help)
- usage_with_groffer;
- exit 0;
- ;;
- esac;
- done;
- groffer --to-stdout --$mode "$@";
-else # not has_groffer
- reset=no;
- double_minus=no;
- for i
- do
- if test _"${reset}" = _no
- then
- set --;
- reset=yes;
- fi;
- if test _"${double_minus}" = _yes
- then
- set -- "$@" "$i";
- continue;
- fi;
- case "$i" in
- --)
- double_minus=yes;
- continue;
- ;;
- -)
- set -- "$@" '-';
- continue;
- ;;
- -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
- echo1 "$name in $groff_version";
- exit 0;
- ;;
- -h|--h|--he|--hel|--help)
- usage_without_groffer;
- exit 0;
- ;;
- -*)
- error_no_groffer;
- error_no_options;
- ;;
- *)
- if test -f "$i" && test -r "$i"
- then
- set -- "$@" "$i";
- else
- error_no_groffer;
- echo2 "$i is not an existing, readable file.";
- fi;
- continue;
- ;;
- esac;
- done; # for i
-
- if test $# -eq 0
- then
- set -- '-';
- fi;
- has_stdin=no;
- for i
- do
- case "$i" in
- -)
- has_stdin=yes;
- break;
- ;;
- esac;
- done;
-
- if test _$has_stdin = _yes
- then
- umask 0077;
- tempdir='';
- for d in "${GROFF_TMPDIR}" "${TMPDIR}" "${TMP}" "${TEMP}" \
- "${TEMPDIR}" "${HOME}"'/tmp' '/tmp' "${HOME}" '.'
- do
- if test _"$d" = _ || ! test -d "$d" || ! test -w "$d"
- then
- continue;
- fi;
- case "$d" in
- */)
- tempdir="$d";
- ;;
- *)
- tempdir="$d"'/';
- ;;
- esac;
- done;
- if test _$tempdir = _
- then
- echo2 "${name}: could not find a temporary directory."
- exit 1;
- fi;
- stdin=${tempdir}${name}_$$;
- if test -e "$stdin"
- then
- rm -f "$stdin";
- n=0;
- f="${stdin}_$n";
- while test -e "$f"
- do
- rm -f "$f";
- if ! test -e "$f"
- then
- break;
- fi;
- n="$(expr $n + 1)";
- f="${stdin}_$n";
- done;
- stdin="$f";
- fi;
- reset=no;
- for i
- do
- if test _"${reset}" = _no
- then
- set --;
- reset=yes;
- fi;
- case "$i" in
- -)
- set -- "$@" "$stdin";
- ;;
- *)
- set -- "$@" "$i";
- ;;
- esac;
- done;
- cat>"$stdin";
- fi; # if has_stdin
-
- case "$mode" in
- x)
- groff_options='-TX75-12 -Z';
- ;;
- text)
- groff_options='-Tlatin1';
- ;;
- pdf)
- ps2pdf="$(where_is_prog ps2pdf)";
- if test _"$ps2pdf" = _
- then
- ps2pdf="$(where_is_prog gs)";
- if test _"$ps2pdf" = _
- then
- echo2 "$name: cannot transform to pdf format.";
- exit 1;
- fi;
- ps2pdf="$ps2pdf -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite '-sOutputFile=- -c save pop -f -";
- else
- ps2pdf="$ps2pdf -";
- fi;
- grog="$(grog -Tps "$@")";
- eval $grog | ${ps2pdf};
- exit $?;
- ;;
- *)
- groff_options="-T$mode";
- ;;
- esac;
- grog="$(grog $groff_options "$@")";
- eval $grog;
- exit $?;
-fi; # not has_groffer
diff --git a/contrib/groffer/version.sh b/contrib/groffer/version.sh
deleted file mode 100644
index 447b24f3..00000000
--- a/contrib/groffer/version.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#! /bin/sh
-
-# groffer - display groff files
-
-# Source file position: <groff-source>/contrib/groffer/version.sh
-# Installed position: <prefix>/lib/groff/groffer/version.sh
-
-# Copyright (C) 2001-2006, 2009, 2011, 2013
-# Free Software Foundation, Inc.
-# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
-
-# This file is part of `groffer', which 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 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/>.
-
-########################################################################
-
-export _PROGRAM_VERSION;
-export _LAST_UPDATE;
-
-_PROGRAM_VERSION='1.1.3';
-_LAST_UPDATE='29 Mar 2013';
-
-# this setting of the groff version is only used before make is run,
-# otherwise @VERSION@ will set it, see groffer.sh.
-export _GROFF_VERSION_PRESET;
-_GROFF_VERSION_PRESET='1.22.2';