[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[groff] 01/01: [grog] Don't use CR/LF line endings.
From: |
Werner LEMBERG |
Subject: |
[groff] 01/01: [grog] Don't use CR/LF line endings. |
Date: |
Thu, 23 Jul 2015 06:26:17 +0000 |
wl pushed a commit to branch master
in repository groff.
commit bb001e7fdf11408276d8c18a5357403baa7e6fc3
Author: Werner Lemberg <address@hidden>
Date: Thu Jul 23 08:25:39 2015 +0200
[grog] Don't use CR/LF line endings.
---
ChangeLog | 10 +-
src/roff/grog/grog.pl | 204 ++--
src/roff/grog/subs.pl | 2546 ++++++++++++++++++++++++------------------------
3 files changed, 1381 insertions(+), 1379 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 75520c3..0a51b5d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,15 +1,17 @@
2015-07-19 Bernd Warken <address@hidden>
- * src/roff/grog/*.pl: Add last update.
+ * src/roff/grog/*.pl: Add last update.
- * src/roff/grog/subs.pl: Remove call to Perl INC::System::Simple,
- use backticks instead. Define &err(). Reorder some extensions.
+ * src/roff/grog/subs.pl: Remove call to Perl INC::System::Simple,
+ use backticks instead.
+ Define &err().
+ Reorder some extensions.
Distinguish between .TH at first command for man and later on for
ms.
2015-07-01 Peter Bray <address@hidden>
- Fix Savannah bug #44784
+ Fix Savannah bug #44784.
Compatibility Mode rendering of groff manual pages
diff --git a/src/roff/grog/grog.pl b/src/roff/grog/grog.pl
index b78963e..4bfd2db 100644
--- a/src/roff/grog/grog.pl
+++ b/src/roff/grog/grog.pl
@@ -1,102 +1,102 @@
-#! /usr/bin/env perl
-# grog - guess options for groff command
-# Inspired by doctype script in Kernighan & Pike, Unix Programming
-# Environment, pp 306-8.
-
-# Source file position: <groff-source>/src/roff/grog/grog.pl
-# Installed position: <prefix>/bin/grog
-
-# Copyright (C) 1993-2015 Free Software Foundation, Inc.
-# Written by James Clark, maintained by Werner Lemberg.
-# Rewritten with Perl by Bernd Warken <address@hidden>.
-# The macros for identifying the devices were taken from Ralph
-# Corderoy's `grog.sh' of 2006.
-
-# Last update: 19 Jul 2015
-
-# This file is part of `grog', 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 2 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/gpl-2.0.html>.
-
-########################################################################
-
-require v5.6;
-
-use warnings;
-use strict;
-
-# $Bin is the directory where this script is located
-use FindBin;
-
-my $before_make; # script before run of `make'
-{
- my $at = '@';
- $before_make = 1 if '@VERSION@' eq "${at}VERSION${at}";
-}
-
-
-our %at_at;
-my $grog_dir;
-
-if ($before_make) { # before installation
- my $grog_source_dir = $FindBin::Bin;
- $at_at{'BINDIR'} = $grog_source_dir;
-# $grog_dir = $grog_source_dir;
- $grog_dir = '.';
- my $top = $grog_source_dir . '/../../../';
- open FILE, '<', $top . 'VERSION' ||
- die 'Could not open top file VERSION.';
- my $version = <FILE>;
- chomp $version;
- close FILE;
- open FILE, '<', $top . 'REVISION' ||
- die 'Could not open top file REVISION.';
- my $revision = <FILE>;
- chomp $revision;
- $at_at{'GROFF_VERSION'} = $version . '.' . $revision;
-} else { # after installation}
- $at_at{'GROFF_VERSION'} = '@VERSION@';
- $at_at{'BINDIR'} = '@BINDIR@';
- $grog_dir = '@grog_dir@';
-} # before make
-
-die "$grog_dir is not an existing directory;" unless -d $grog_dir;
-
-
-#############
-# import subs
-
-unshift(@INC, $grog_dir);
-require 'subs.pl';
-
-
-##########
-# run subs
-
-&handle_args();
-&handle_file_ext(); # see $tmac_ext for gotten value
-&handle_whole_files();
-&make_groff_device();
-&make_groff_preproc();
-&make_groff_tmac_man_ms() || &make_groff_tmac_others();
-&make_groff_line_rest();
-
-
-1;
-########################################################################
-### Emacs settings
-# Local Variables:
-# mode: CPerl
-# End:
+#! /usr/bin/env perl
+# grog - guess options for groff command
+# Inspired by doctype script in Kernighan & Pike, Unix Programming
+# Environment, pp 306-8.
+
+# Source file position: <groff-source>/src/roff/grog/grog.pl
+# Installed position: <prefix>/bin/grog
+
+# Copyright (C) 1993-2015 Free Software Foundation, Inc.
+# Written by James Clark, maintained by Werner Lemberg.
+# Rewritten with Perl by Bernd Warken <address@hidden>.
+# The macros for identifying the devices were taken from Ralph
+# Corderoy's `grog.sh' of 2006.
+
+# Last update: 19 Jul 2015
+
+# This file is part of `grog', 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 2 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/gpl-2.0.html>.
+
+########################################################################
+
+require v5.6;
+
+use warnings;
+use strict;
+
+# $Bin is the directory where this script is located
+use FindBin;
+
+my $before_make; # script before run of `make'
+{
+ my $at = '@';
+ $before_make = 1 if '@VERSION@' eq "${at}VERSION${at}";
+}
+
+
+our %at_at;
+my $grog_dir;
+
+if ($before_make) { # before installation
+ my $grog_source_dir = $FindBin::Bin;
+ $at_at{'BINDIR'} = $grog_source_dir;
+# $grog_dir = $grog_source_dir;
+ $grog_dir = '.';
+ my $top = $grog_source_dir . '/../../../';
+ open FILE, '<', $top . 'VERSION' ||
+ die 'Could not open top file VERSION.';
+ my $version = <FILE>;
+ chomp $version;
+ close FILE;
+ open FILE, '<', $top . 'REVISION' ||
+ die 'Could not open top file REVISION.';
+ my $revision = <FILE>;
+ chomp $revision;
+ $at_at{'GROFF_VERSION'} = $version . '.' . $revision;
+} else { # after installation}
+ $at_at{'GROFF_VERSION'} = '@VERSION@';
+ $at_at{'BINDIR'} = '@BINDIR@';
+ $grog_dir = '@grog_dir@';
+} # before make
+
+die "$grog_dir is not an existing directory;" unless -d $grog_dir;
+
+
+#############
+# import subs
+
+unshift(@INC, $grog_dir);
+require 'subs.pl';
+
+
+##########
+# run subs
+
+&handle_args();
+&handle_file_ext(); # see $tmac_ext for gotten value
+&handle_whole_files();
+&make_groff_device();
+&make_groff_preproc();
+&make_groff_tmac_man_ms() || &make_groff_tmac_others();
+&make_groff_line_rest();
+
+
+1;
+########################################################################
+### Emacs settings
+# Local Variables:
+# mode: CPerl
+# End:
diff --git a/src/roff/grog/subs.pl b/src/roff/grog/subs.pl
index ec5e1a9..06121b8 100644
--- a/src/roff/grog/subs.pl
+++ b/src/roff/grog/subs.pl
@@ -1,1273 +1,1273 @@
-#! /usr/bin/env perl
-# grog - guess options for groff command
-# Inspired by doctype script in Kernighan & Pike, Unix Programming
-# Environment, pp 306-8.
-
-# Source file position: <groff-source>/src/roff/grog/subs.pl
-# Installed position: <prefix>/lib/grog/subs.pl
-
-# Copyright (C) 1993-2015 Free Software Foundation, Inc.
-# This file was split from grog.pl and put under GPL2 by
-# Bernd Warken <address@hidden>.
-# The macros for identifying the devices were taken from Ralph
-# Corderoy's `grog.sh' of 2006.
-
-# Last update: 19 Jul 2015
-
-# This file is part of `grog', 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 2 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 can get the license text for the GNU General Public License
-# version 2 in the internet at
-# <http://www.gnu.org/licenses/gpl-2.0.html>.
-
-########################################################################
-
-require v5.6;
-
-use warnings;
-use strict;
-
-use File::Spec;
-
-# printing of hashes: my %hash = ...; print Dumper(\%hash);
-use Data::Dumper;
-
-# for running shell based programs within Perl; use `` instead of
-# use IPC::System::Simple qw(capture capturex run runx system systemx);
-
-$\ = "\n";
-
-# my $Sp = "[\\s\\n]";
-# my $Sp = qr([\s\n]);
-# my $Sp = '' if $arg eq '-C';
-my $Sp = '';
-
-# from `src/roff/groff/groff.cpp' near `getopt_long'
-my $groff_opts =
- 'abcCd:D:eEf:F:gGhiI:jJkK:lL:m:M:n:No:pP:r:RsStT:UvVw:W:XzZ';
-
-my @Command = (); # stores the final output
-my @Mparams = (); # stores the options `-m*'
-my @devices = ();
-my $do_run = 0; # run generated `groff' command
-my $pdf_with_ligatures = 0; # `-P-y -PU' for `pdf' device
-my $with_warnings = 0;
-
-my $Prog = $0;
-{
- my ($v, $d, $f) = File::Spec->splitpath($Prog);
- $Prog = $f;
-}
-
-
-my %macros;
-my %Groff =
- (
- # preprocessors
- 'chem' => 0,
- 'eqn' => 0,
- 'gperl' => 0,
- 'grap' => 0,
- 'grn' => 0,
- 'gideal' => 0,
- 'gpinyin' => 0,
- 'lilypond' => 0,
-
- 'pic' => 0,
- 'PS' => 0, # opening for pic
- 'PF' => 0, # alternative opening for pic
- 'PE' => 0, # closing for pic
-
- 'refer' => 0,
- 'refer_open' => 0,
- 'refer_close' => 0,
- 'soelim' => 0,
- 'tbl' => 0,
-
- # tmacs
-# 'man' => 0,
-# 'mandoc' => 0,
-# 'mdoc' => 0,
-# 'mdoc_old' => 0,
-# 'me' => 0,
-# 'mm' => 0,
-# 'mom' => 0,
-# 'ms' => 0,
-
- # requests
- 'AB' => 0, # ms
- 'AE' => 0, # ms
- 'AI' => 0, # ms
- 'AU' => 0, # ms
- 'NH' => 0, # ms
- 'TH_later' => 0, # TH not 1st command is ms
- 'TL' => 0, # ms
- 'UL' => 0, # ms
- 'XP' => 0, # ms
-
- 'IP' => 0, # man and ms
- 'LP' => 0, # man and ms
- 'P' => 0, # man and ms
- 'PP' => 0, # man and ms
- 'SH' => 0, # man and ms
-
- 'OP' => 0, # man
- 'SS' => 0, # man
- 'SY' => 0, # man
- 'TH_first' => 0, # TH as 1st command is man
- 'TP' => 0, # man
- 'UR' => 0, # man
- 'YS' => 0, # man
-
- # for mdoc and mdoc-old
- # .Oo and .Oc for modern mdoc, only .Oo for mdoc-old
- 'Oo' => 0, # mdoc and mdoc-old
- 'Oc' => 0, # mdoc
- 'Dd' => 0, # mdoc
- ); # end of %Groff
-
-
-# for first line check
-my %preprocs_tmacs =
- (
- 'chem' => 0,
- 'eqn' => 0,
- 'gideal' => 0,
- 'gpinyin' => 0,
- 'grap' => 0,
- 'grn' => 0,
- 'pic' => 0,
- 'refer' => 0,
- 'soelim' => 0,
- 'tbl' => 0,
-
- 'geqn' => 0,
- 'gpic' => 0,
- 'neqn' => 0,
-
- 'man' => 0,
- 'mandoc' => 0,
- 'mdoc' => 0,
- 'mdoc-old' => 0,
- 'me' => 0,
- 'mm' => 0,
- 'mom' => 0,
- 'ms' => 0,
- );
-
-my @filespec;
-
-my $tmac_ext = '';
-
-
-########################################################################
-# err()
-########################################################################
-
-sub err {
- my $text = shift;
- print STDERR $text;
-}
-
-
-########################################################################
-# handle_args()
-########################################################################
-
-sub handle_args {
- my $double_minus = 0;
- my $was_minus = 0;
- my $was_T = 0;
- my $optarg = 0;
- # globals: @filespec, @Command, @devices, @Mparams
-
- foreach my $arg (@ARGV) {
-
- if ( $optarg ) {
- push @Command, $arg;
- $optarg = 0;
- next;
- }
-
- if ( $double_minus ) {
- if (-f $arg && -r $arg) {
- push @filespec, $arg;
- } else {
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- "grog: $arg is not a readable file.";
- }
- next;
- }
-
- if ( $was_T ) {
- push @devices, $arg;
- $was_T = 0;
- next;
- }
-####### handle_args()
-
- unless ( $arg =~ /^-/ ) { # file name, no opt, no optarg
- unless (-f $arg && -r $arg) {
- print 'unknown file name: ' . $arg;
- }
- push @filespec, $arg;
- next;
- }
-
- # now $arg starts with `-'
-
- if ($arg eq '-') {
- unless ($was_minus) {
- push @filespec, $arg;
- $was_minus = 1;
- }
- next;
- }
-
- if ($arg eq '--') {
- $double_minus = 1;
- push(@filespec, $arg);
- next;
- }
-
- &version() if $arg =~ /^--?v/; # --version, with exit
- &help() if $arg =~ /--?h/; # --help, with exit
-
- if ( $arg =~ /^--r/ ) { # --run, no exit
- $do_run = 1;
- next;
- }
-
- if ( $arg =~ /^--wa/ ) { # --warnings, no exit
- $with_warnings = 1;
- next;
- }
-####### handle_args()
-
- if ( $arg =~ /^--(wi|l)/ ) { # --ligatures, no exit
- # the old --with_ligatures is only kept for compatibility
- $pdf_with_ligatures = 1;
- next;
- }
-
- if ($arg =~ /^-m/) {
- push @Mparams, $arg;
- next;
- }
-
- if ($arg =~ /^-T$/) {
- $was_T = 1;
- next;
- }
-
- if ($arg =~ s/^-T(\w+)$/$1/) {
- push @devices, $1;
- next;
- }
-
- if ($arg =~ /^-(\w)(\w*)$/) { # maybe a groff option
- my $opt_char = $1;
- my $opt_char_with_arg = $opt_char . ':';
- my $others = $2;
- if ( $groff_opts =~ /$opt_char_with_arg/ ) { # groff optarg
- if ( $others ) { # optarg is here
- push @Command, '-' . $opt_char;
- push @Command, '-' . $others;
- next;
- }
- # next arg is optarg
- $optarg = 1;
- next;
-####### handle_args()
- } elsif ( $groff_opts =~ /$opt_char/ ) { # groff no optarg
- push @Command, '-' . $opt_char;
- if ( $others ) { # $others is now an opt collection
- $arg = '-' . $others;
- redo;
- }
- # arg finished
- next;
- } else { # not a groff opt
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- 'unknown argument ' . $arg;
- push(@Command, $arg);
- next;
- }
- }
- }
- @filespec = ('-') unless (@filespec);
-} # handle_args()
-
-
-
-########################################################################
-# handle_file_ext()
-########################################################################
-
-sub handle_file_ext {
- # get tmac from file name extension
- # output number of found single tmac
-
- # globals: @filespec, $tmac_ext;
-
- foreach my $file ( @filespec ) {
- # test for each file name in the arguments
- unless ( open(FILE, $file eq "-" ? $file : "< $file") ) {
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- "$Prog: can't open \`$file\': $!";
- next;
- }
-
- next unless ( $file =~ /\./ ); # file name has no dot `.'
-
-##### handle_file_ext()
- # get extension
- my $ext = $file;
- $ext =~ s/^
- .*
- \.
- ([^.]*)
- $
- /$1/x;
- next unless ( $ext );
-
-##### handle_file_ext()
- # these extensions are correct, but not based on a tmac
- next if ( $ext =~ /^(
- chem|
- eqn|
- g|
- grap|
- grn|
- groff|
- hdtbl|
- pdfroff|
- pic|
- pinyin|
- ref|
- roff|
- t|
- tbl|
- tr|
- www
- )$/x );
-
-##### handle_file_ext()
- # extensions for man tmac
- if ( $ext =~ /^(
- [1-9lno]|
- man|
- n|
- 1b
- )$/x ) {
- # `man|n' from `groff' source
- # `1b' from `heirloom'
- # `[1-9lno]' from man-pages
- if ( $tmac_ext && $tmac_ext ne 'man' ) {
- # found tmac is not 'man'
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- '2 different file name extensions found ' .
- $tmac_ext . ' and ' . $ext;
- $tmac_ext = '';
- next;
- }
-
-##### handle_file_ext()
- $tmac_ext = 'man';
- next;
- }
-
- if ( $ext =~ /^(
- mandoc|
- mdoc|
- me|
- mm|
- mmse|
- mom|
- ms|
- $)/x ) {
- if ( $tmac_ext && $tmac_ext ne $ext ) {
- # found tmac is not identical to former found tmac
-##### handle_file_ext()
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- '2 different file name extensions found ' .
- $tmac_ext . ' and ' . $ext;
- $tmac_ext = '';
- next;
- }
-
- $tmac_ext = $ext;
- next;
- }
-
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- 'Unknown file name extension '. $file . '.';
- next;
- } # end foreach file
-
- 1;
-} # handle_file_ext()
-
-
-########################################################################
-# handle_whole_files()
-########################################################################
-
-sub handle_whole_files {
- # globals: @filespec
-
- foreach my $file ( @filespec ) {
- unless ( open(FILE, $file eq "-" ? $file : "< $file") ) {
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- "$Prog: can't open \`$file\': $!";
- next;
- }
- my $line = <FILE>; # get single line
-
- unless ( defined($line) ) {
- # empty file, go to next filearg
- close (FILE);
- next;
- }
-
- if ( $line ) {
- chomp $line;
- unless ( &do_first_line( $line, $file ) ) {
- # not an option line
- &do_line( $line, $file );
- }
- } else { # empty line
- next;
- }
-
- while (<FILE>) { # get lines by and by
- chomp;
- &do_line( $_, $file );
- }
- close(FILE);
- } # end foreach
-} # handle_whole_files()
-
-
-########################################################################
-# do_first_line()
-########################################################################
-
-# As documented for the `man' program, the first line can be
-# used as a groff option line. This is done by:
-# - start the line with '\" (apostrophe, backslash, double quote)
-# - add a space character
-# - a word using the following characters can be appended: `egGjJpRst'.
-# Each of these characters means an option for the generated
-# `groff' command line, e.g. `-t'.
-
-sub do_first_line {
- my ( $line, $file ) = @_;
-
- # globals: %preprocs_tmacs
-
- # For a leading groff options line use only [egGjJpRst]
- if ( $line =~ /^[.']\\"[\segGjJpRst]+&/ ) {
- # this is a groff options leading line
- if ( $line =~ /^\./ ) {
- # line is a groff options line with . instead of '
- print "First line in $file must start with an apostrophe \ " .
- "instead of a period . for groff options line!";
- }
-
- if ( $line =~ /j/ ) {
- $Groff{'chem'}++;
- }
- if ( $line =~ /e/ ) {
- $Groff{'eqn'}++;
- }
- if ( $line =~ /g/ ) {
- $Groff{'grn'}++;
- }
- if ( $line =~ /G/ ) {
- $Groff{'grap'}++;
- }
- if ( $line =~ /i/ ) {
- $Groff{'gideal'}++;
- }
- if ( $line =~ /p/ ) {
- $Groff{'pic'}++;
- }
- if ( $line =~ /R/ ) {
- $Groff{'refer'}++;
- }
- if ( $line =~ /s/ ) {
- $Groff{'soelim'}++;
- }
-####### do_first_line()
- if ( $line =~ /t/ ) {
- $Groff{'tbl'}++;
- }
- return 1; # a leading groff options line, 1 means yes, 0 means no
- }
-
- # not a leading short groff options line
-
- return 0 if ( $line !~ /^[.']\\"\s*(.*)$/ ); # ignore non-comments
-
- return 0 unless ( $1 ); # for empty comment
-
- # all following array members are either preprocs or 1 tmac
- my @words = split '\s+', $1;
-
- my @in = ();
- my $word;
- for $word ( @words ) {
- if ( $word eq 'ideal' ) {
- $word = 'gideal';
- } elsif ( $word eq 'gpic' ) {
- $word = 'pic';
- } elsif ( $word =~ /^(gn|)eqn$/ ) {
- $word = 'eqn';
- }
- if ( exists $preprocs_tmacs{$word} ) {
- push @in, $word;
- } else {
- # not word for preproc or tmac
- return 0;
- }
- }
-
- for $word ( @in ) {
- $Groff{$word}++;
- }
-} # do_first_line()
-
-
-########################################################################
-# do_line()
-########################################################################
-
-my $before_first_command = 1; # for check of .TH
-
-sub do_line {
- my ( $line, $file ) = @_;
-
- return if ( $line =~ /^[.']\s*\\"/ ); # comment
-
- return unless ( $line =~ /^[.']/ ); # ignore text lines
-
- $line =~ s/^['.]\s*/./; # let only a dot as leading character,
- # remove spaces after the leading dot
- $line =~ s/\s+$//; # remove final spaces
-
- return if ( $line =~ /^\.$/ ); # ignore .
- return if ( $line =~ /^\.\.$/ ); # ignore ..
-
- if ( $before_first_command ) { # so far without 1st command
- if ( $line =~ /^\.TH/ ) {
- # check if .TH is 1st command for man
- $Groff{'TH_first'} = 1 if ( $line =~ /^\.\s*TH/ );
- }
- if ( $line =~ /^\./ ) {
- $before_first_command = 0;
- }
- }
-
- # split command
- $line =~ /^(\.\w+)\s*(.*)$/;
- my $command = $1;
- $command = '' unless ( defined $command );
- my $args = $2;
- $args = '' unless ( defined $args );
-
-
- ######################################################################
- # soelim
- if ( $line =~ /^\.(do)?\s*(so|mso|PS\s*<|SO_START).*$/ ) {
- # `.so', `.mso', `.PS<...', `.SO_START'
- $Groff{'soelim'}++;
- return;
- }
- if ( $line =~ /^\.(do)?\s*(so|mso|PS\s*<|SO_START).*$/ ) {
- # `.do so', `.do mso', `.do PS<...', `.do SO_START'
- $Groff{'soelim'}++;
- return;
- }
-####### do_line()
-
- ######################################################################
- # macros
-
- if ( $line =~ /^\.de1?\W?/ ) {
- # this line is a macro definition, add it to %macros
- my $macro = $line;
- $macro =~ s/^\.de1?\s+(\w+)\W*/.$1/;
- return if ( exists $macros{$macro} );
- $macros{$macro} = 1;
- return;
- }
-
-
- # if line command is a defined macro, just ignore this line
- return if ( exists $macros{$command} );
-
-
- ######################################################################
- # preprocessors
-
- if ( $command =~ /^(\.cstart)|(begin\s+chem)$/ ) {
- $Groff{'chem'}++; # for chem
- return;
- }
- if ( $command =~ /^\.EQ$/ ) {
- $Groff{'eqn'}++; # for eqn
- return;
- }
- if ( $command =~ /^\.G1$/ ) {
- $Groff{'grap'}++; # for grap
- return;
- }
- if ( $command =~ /^\.Perl/ ) {
- $Groff{'gperl'}++; # for gperl
- return;
- }
- if ( $command =~ /^\.pinyin/ ) {
- $Groff{'gpinyin'}++; # for gperl
- return;
- }
- if ( $command =~ /^\.GS$/ ) {
- $Groff{'grn'}++; # for grn
- return;
- }
- if ( $command =~ /^\.IS$/ ) {
- $Groff{'gideal'}++; # preproc gideal for ideal
- return;
- }
- if ( $command =~ /^\.lilypond$/ ) {
- $Groff{'lilypond'}++; # for glilypond
- return;
- }
-
-####### do_line()
-
- # pic can be opened by .PS or .PF and closed by .PE
- if ( $command =~ /^\.PS$/ ) {
- $Groff{'pic'}++; # normal opening for pic
- return;
- }
- if ( $command =~ /^\.PF$/ ) {
- $Groff{'PF'}++; # alternate opening for pic
- return;
- }
- if ( $command =~ /^\.PE$/ ) {
- $Groff{'PE'}++; # closing for pic
- return;
- }
-
- if ( $command =~ /^\.R1$/ ) {
- $Groff{'refer'}++; # for refer
- return;
- }
- if ( $command =~ /^\.\[$/ ) {
- $Groff{'refer_open'}++; # for refer open
- return;
- }
- if ( $command =~ /^\.\]$/ ) {
- $Groff{'refer_close'}++; # for refer close
- return;
- }
- if ( $command =~ /^\.TS$/ ) {
- $Groff{'tbl'}++; # for tbl
- return;
- }
- if ( $command =~ /^\.TH$/ ) {
- unless ( $Groff{'TH_first'} ) {
- $Groff{'TH_later'}++; # for tbl
- }
- return;
- }
-
-
- ######################################################################
- # macro package (tmac)
- ######################################################################
-
- ##########
- # modern mdoc
-
- if ( $command =~ /^\.(Dd)$/ ) {
- $Groff{'Dd'}++; # for modern mdoc
- return;
- }
-
-####### do_line()
- # In the old version of -mdoc `Oo' is a toggle, in the new it's
- # closed by `Oc'.
- if ( $command =~ /^\.Oc$/ ) {
- $Groff{'Oc'}++; # only for modern mdoc
- return;
- }
-
-
- ##########
- # old and modern mdoc
-
- if ( $command =~ /^\.Oo$/ ) {
- $Groff{'Oo'}++; # for mdoc and mdoc-old
- return;
- }
-
-
- ##########
- # old mdoc
- if ( $command =~ /^\.(Tp|Dp|De|Cx|Cl)$/ ) {
- $Groff{'mdoc_old'}++; # true for old mdoc
- return;
- }
-
-
- ##########
- # for ms
-
-####### do_line()
- if ( $command =~ /^\.AB$/ ) {
- $Groff{'AB'}++; # for ms
- return;
- }
- if ( $command =~ /^\.AE$/ ) {
- $Groff{'AE'}++; # for ms
- return;
- }
- if ( $command =~ /^\.AI$/ ) {
- $Groff{'AI'}++; # for ms
- return;
- }
- if ( $command =~ /^\.AU$/ ) {
- $Groff{'AU'}++; # for ms
- return;
- }
- if ( $command =~ /^\.NH$/ ) {
- $Groff{'NH'}++; # for ms
- return;
- }
- if ( $command =~ /^\.TL$/ ) {
- $Groff{'TL'}++; # for ms
- return;
- }
- if ( $command =~ /^\.XP$/ ) {
- $Groff{'XP'}++; # for ms
- return;
- }
-
-
- ##########
- # for man and ms
-
- if ( $command =~ /^\.IP$/ ) {
- $Groff{'IP'}++; # for man and ms
- return;
- }
- if ( $command =~ /^\.LP$/ ) {
- $Groff{'LP'}++; # for man and ms
- return;
- }
-####### do_line()
- if ( $command =~ /^\.P$/ ) {
- $Groff{'P'}++; # for man and ms
- return;
- }
- if ( $command =~ /^\.PP$/ ) {
- $Groff{'PP'}++; # for man and ms
- return;
- }
- if ( $command =~ /^\.SH$/ ) {
- $Groff{'SH'}++; # for man and ms
- return;
- }
- if ( $command =~ /^\.UL$/ ) {
- $Groff{'UL'}++; # for man and ms
- return;
- }
-
-
- ##########
- # for man only
-
- if ( $command =~ /^\.OP$/ ) { # for man
- $Groff{'OP'}++;
- return;
- }
- if ( $command =~ /^\.SS$/ ) { # for man
- $Groff{'SS'}++;
- return;
- }
- if ( $command =~ /^\.SY$/ ) { # for man
- $Groff{'SY'}++;
- return;
- }
- if ( $command =~ /^\.TP$/ ) { # for man
- $Groff{'TP'}++;
- return;
- }
- if ( $command =~ /^\.UR$/ ) {
- $Groff{'UR'}++; # for man
- return;
- }
- if ( $command =~ /^\.YS$/ ) { # for man
- $Groff{'YS'}++;
- return;
- }
-####### do_line()
-
-
- ##########
- # me
-
- if ( $command =~ /^\.(
- [ilnp]p|
- sh
- )$/x ) {
- $Groff{'me'}++; # for me
- return;
- }
-
-
- #############
- # mm and mmse
-
- if ( $command =~ /^\.(
- H|
- MULB|
- LO|
- LT|
- NCOL|
- P\$|
- PH|
- SA
- )$/x ) {
- $Groff{'mm'}++; # for mm and mmse
- if ( $command =~ /^\.LO$/ ) {
- if ( $args =~ /^(DNAMN|MDAT|BIL|KOMP|DBET|BET|SIDOR)/ ) {
- $Groff{'mmse'}++; # for mmse
- }
- } elsif ( $command =~ /^\.LT$/ ) {
- if ( $args =~ /^(SVV|SVH)/ ) {
- $Groff{'mmse'}++; # for mmse
- }
- }
- return;
- }
-####### do_line()
-
- ##########
- # mom
-
- if ( $line =~ /^\.(
- ALD|
- DOCTYPE|
- FAMILY|
- FT|
- FAM|
- LL|
- LS|
- NEWPAGE|
- PAGE|
- PAPER|
- PRINTSTYLE|
- PT_SIZE|
- T_MARGIN
- )$/x ) {
- $Groff{'mom'}++; # for mom
- return;
- }
-
-} # do_line()
-
-
-########################################################################
-# sub make_groff_device
-########################################################################
-
-my @m = ();
-my @preprograms = ();
-my $correct_tmac = '';
-
-sub make_groff_device {
- # globals: @devices
-
- # default device is empty, i.e. it is `ps' when without `-T'
- my $device = '';
-
- for my $d ( @devices ) {
- if ( $d =~ # suitable devices
- /^(
- dvi|
- html|
- xhtml|
- lbp|
- lj4|
- ps|
- pdf|
- ascii|
- cp1047|
- latin1|
- utf8
- )$/x ) {
-###### make_groff_device()
- if ( $device ) {
- next if ( $device eq $d );
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- 'several different devices given: ' .
- $device . ' and ' .$d;
- $device = $d; # the last provided device is taken
- next;
- } else { # empty $device
- $device = $d;
- next;
- }
- } else { # not suitable device
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- 'not a suitable device for groff: ' . $d;
- next;
- }
-
- if ( $device ) {
- push @Command, '-T';
- push @Command, $device;
- }
- }
-
-###### make_groff_device()
- if ( $device eq 'pdf' ) {
- if ( $pdf_with_ligatures ) { # with --ligature argument
- push( @Command, '-P-y' );
- push( @Command, '-PU' );
- } else { # no --ligature argument
- if ( $with_warnings ) {
- print STDERR <<EOF;
-If you have trouble with ligatures like `fi' in the `groff' output, you
-can proceed as one of
-- add `grog' option `--with_ligatures' or
-- use the `grog' option combination `-P-y -PU' or
-- try to remove the font named similar to `fonts-texgyre' from your system.
-EOF
- } # end of warning
- } # end of ligature
- } # end of pdf device
-} # make_groff_device()
-
-
-########################################################################
-# make_groff_preproc()
-########################################################################
-
-sub make_groff_preproc {
- # globals: %Groff, @preprograms, @Command
-
- # preprocessors without `groff' option
- if ( $Groff{'lilypond'} ) {
- push @preprograms, 'glilypond';
- }
- if ( $Groff{'gperl'} ) {
- push @preprograms, 'gperl';
- }
- if ( $Groff{'gpinyin'} ) {
- push @preprograms, 'gpinyin';
- }
-
- # preprocessors with `groff' option
- if ( ( $Groff{'PS'} || $Groff{'PF'} ) && $Groff{'PE'} ) {
- $Groff{'pic'} = 1;
- }
- if ( $Groff{'gideal'} ) {
- $Groff{'pic'} = 1;
- }
-
-###### make_groff_preproc()
- $Groff{'refer'} ||= $Groff{'refer_open'} && $Groff{'refer_close'};
-
- if ( $Groff{'chem'} || $Groff{'eqn'} || $Groff{'gideal'} ||
- $Groff{'grap'} || $Groff{'grn'} || $Groff{'pic'} ||
- $Groff{'refer'} || $Groff{'tbl'} ) {
- push(@Command, '-s') if $Groff{'soelim'};
-
- push(@Command, '-R') if $Groff{'refer'};
-
- push(@Command, '-t') if $Groff{'tbl'}; # tbl before eqn
- push(@Command, '-e') if $Groff{'eqn'};
-
- push(@Command, '-j') if $Groff{'chem'}; # chem produces pic code
- push(@Command, '-J') if $Groff{'gideal'}; # gideal produces pic
- push(@Command, '-G') if $Groff{'grap'};
- push(@Command, '-g') if $Groff{'grn'}; # gremlin files for -me
- push(@Command, '-p') if $Groff{'pic'};
-
- }
-} # make_groff_preproc()
-
-
-########################################################################
-# make_groff_tmac_man_ms()
-########################################################################
-
-sub make_groff_tmac_man_ms {
- # globals: @filespec, $tmac_ext, %Groff
-
- # `man' requests, not from `ms'
- if ( $Groff{'SS'} || $Groff{'SY'} || $Groff{'OP'} ||
- $Groff{'TH_first'} || $Groff{'TP'} || $Groff{'UR'} ) {
- $Groff{'man'} = 1;
- push(@m, '-man');
-
- $tmac_ext = 'man' unless ( $tmac_ext );
- &err('man requests found, but file name extension ' .
- 'was: ' . $tmac_ext) unless ( $tmac_ext eq 'man' );
- $tmac_ext = 'man';
- return 1; # true
- }
-
-###### make_groff_tmac_man_ms()
- # `ms' requests, not from `man'
- if (
- $Groff{'1C'} || $Groff{'2C'} ||
- $Groff{'AB'} || $Groff{'AE'} || $Groff{'AI'} || $Groff{'AU'} ||
- $Groff{'BX'} || $Groff{'CD'} || $Groff{'DA'} || $Groff{'DE'} ||
- $Groff{'DS'} || $Groff{'ID'} || $Groff{'LD'} || $Groff{'NH'} ||
- $Groff{'TH_later'} ||
- $Groff{'TL'} || $Groff{'UL'} || $Groff{'XP'}
- ) {
- $Groff{'ms'} = 1;
- push(@m, '-ms');
-
- $tmac_ext = 'ms' unless ( $tmac_ext );
- &err('ms requests found, but file name extension ' .
- 'was: ' . $tmac_ext) unless ( $tmac_ext eq 'ms' );
- $tmac_ext = 'ms';
- return 1; # true
- }
-
-###### make_groff_tmac_man_ms()
-
- # both `man' and `ms' requests
- if ( $Groff{'P'} || $Groff{'IP'} ||
- $Groff{'LP'} || $Groff{'PP'} || $Groff{'SH'} ) {
- if ( $tmac_ext eq 'man' ) {
- $Groff{'man'} = 1;
- push(@m, '-man');
- return 1; # true
- } elsif ( $tmac_ext eq 'ms' ) {
- $Groff{'ms'} = 1;
- push(@m, '-ms');
- return 1; # true
- }
- return 0;
- }
-} # make_groff_tmac_man_ms()
-
-
-
-########################################################################
-# make_groff_tmac_others()
-########################################################################
-
-sub make_groff_tmac_others {
- # globals: @filespec, $tmac_ext, %Groff
-
- # mdoc
- if ( ( $Groff{'Oo'} && $Groff{'Oc'} ) || $Groff{'Dd'} ) {
- $Groff{'Oc'} = 0;
- $Groff{'Oo'} = 0;
- push(@m, '-mdoc');
- return 1; # true
- }
- if ( $Groff{'mdoc_old'} || $Groff{'Oo'} ) {
- push(@m, '-mdoc_old');
- return 1; # true
- }
-
- # me
- if ( $Groff{'me'} ) {
- push(@m, '-me');
- return 1; # true
- }
-
-##### make_groff_tmac_others()
- # mm and mmse
- if ( $Groff{'mm'} ) {
- push(@m, '-mm');
- return 1; # true
- }
- if ( $Groff{'mmse'} ) { # Swedish mm
- push(@m, '-mmse');
- return 1; # true
- }
-
- # mom
- if ( $Groff{'mom'} ) {
- push(@m, '-mom');
- return 1; # true
- }
-} # make_groff_tmac_others()
-
-
-########################################################################
-# make_groff_line_rest()
-########################################################################
-
-sub make_groff_line_rest {
- my $file_args_included; # file args now only at 1st preproc
- unshift @Command, 'groff';
- if ( @preprograms ) {
- my @progs;
- $progs[0] = shift @preprograms;
- push(@progs, @filespec);
- for ( @preprograms ) {
- push @progs, '|';
- push @progs, $_;
- }
- push @progs, '|';
- unshift @Command, @progs;
- $file_args_included = 1;
- } else {
- $file_args_included = 0;
- }
-
- foreach (@Command) {
- next unless /\s/;
- # when one argument has several words, use accents
- $_ = "'" . $_ . "'";
- }
-
-
- ##########
- # -m arguments
- my $nr_m_guessed = scalar @m;
- if ( $nr_m_guessed > 1 ) {
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- 'argument for -m found: ' . @m;
- }
-
-###### make_groff_line()
-
- my $nr_m_args = scalar @Mparams; # m-arguments for grog
- my $last_m_arg = ''; # last provided -m option
- if ( $nr_m_args > 1 ) {
- # take the last given -m argument of grog call,
- # ignore other -m arguments and the found ones
- $last_m_arg = $Mparams[-1]; # take the last -m argument
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- $Prog . ": more than 1 `-m' argument: @Mparams";
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- 'We take the last one: ' . $last_m_arg;
- } elsif ( $nr_m_args == 1 ) {
- $last_m_arg = $Mparams[0];
- }
-
- my $final_m = '';
- if ( $last_m_arg ) {
- my $is_equal = 0;
- for ( @m ) {
- if ( $_ eq $last_m_arg ) {
- $is_equal = 1;
- last;
- }
- next;
- } # end for @m
- if ( $is_equal ) {
- $final_m = $last_m_arg;
- } else {
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- 'Provided -m argument ' . $last_m_arg .
- ' differs from guessed -m args: ' . @m;
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- 'The argument is taken.';
- $final_m = $last_m_arg;
- }
-###### make_groff_line()
- } else { # no -m arg provided
- if ( $nr_m_guessed > 1 ) {
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
- 'More than 1 -m arguments were guessed: ' . @m;
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' . 'Guessing stopped.';
- exit 1;
- } elsif ( $nr_m_guessed == 1 ) {
- $final_m = $m[0];
- } else {
- # no -m provided or guessed
- }
- }
- push @Command, $final_m if ( $final_m );
-
- push(@Command, @filespec) unless ( $file_args_included );
-
- #########
- # execute the `groff' command here with option `--run'
- if ( $do_run ) { # with --run
- print STDERR __FILE__ . ' ' . __LINE__ . ': ' . "@Command";
- my $cmd = join ' ', @Command;
- system($cmd);
- } else {
- print "@Command";
- }
-
- exit 0;
-} # make_groff_line()
-
-
-########################################################################
-# sub help
-########################################################################
-
-sub help {
- print <<EOF;
-usage: grog [option]... [--] [filespec]...
-
-"filespec" is either the name of an existing, readable file or "-" for
-standard input. If no `filespec' is specified, standard input is
-assumed automatically. All arguments after a `--' are regarded as file
-names, even if they start with a `-' character.
-
-`option' is either a `groff' option or one of these:
-
--h|--help print this uasge message and exit
--v|--version print version information and exit
-
--C compatibility mode
---ligatures include options `-P-y -PU' for internal font, which
- preserverses the ligatures like `fi'
---run run the checked-out groff command
---warnings display more warnings to standard error
-
-All other options should be `groff' 1-character options. These are then
-appended to the generated `groff' command line. The `-m' options will
-be checked by `grog'.
-
-EOF
- exit 0;
-} # help()
-
-
-########################################################################
-# sub version
-########################################################################
-
-sub version {
- our %at_at;
- print "Perl version of GNU $Prog " .
- "in groff version " . $at_at{'GROFF_VERSION'};
- exit 0;
-} # version()
-
-
-1;
-########################################################################
-### Emacs settings
-# Local Variables:
-# mode: CPerl
-# End:
+#! /usr/bin/env perl
+# grog - guess options for groff command
+# Inspired by doctype script in Kernighan & Pike, Unix Programming
+# Environment, pp 306-8.
+
+# Source file position: <groff-source>/src/roff/grog/subs.pl
+# Installed position: <prefix>/lib/grog/subs.pl
+
+# Copyright (C) 1993-2015 Free Software Foundation, Inc.
+# This file was split from grog.pl and put under GPL2 by
+# Bernd Warken <address@hidden>.
+# The macros for identifying the devices were taken from Ralph
+# Corderoy's `grog.sh' of 2006.
+
+# Last update: 19 Jul 2015
+
+# This file is part of `grog', 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 2 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 can get the license text for the GNU General Public License
+# version 2 in the internet at
+# <http://www.gnu.org/licenses/gpl-2.0.html>.
+
+########################################################################
+
+require v5.6;
+
+use warnings;
+use strict;
+
+use File::Spec;
+
+# printing of hashes: my %hash = ...; print Dumper(\%hash);
+use Data::Dumper;
+
+# for running shell based programs within Perl; use `` instead of
+# use IPC::System::Simple qw(capture capturex run runx system systemx);
+
+$\ = "\n";
+
+# my $Sp = "[\\s\\n]";
+# my $Sp = qr([\s\n]);
+# my $Sp = '' if $arg eq '-C';
+my $Sp = '';
+
+# from `src/roff/groff/groff.cpp' near `getopt_long'
+my $groff_opts =
+ 'abcCd:D:eEf:F:gGhiI:jJkK:lL:m:M:n:No:pP:r:RsStT:UvVw:W:XzZ';
+
+my @Command = (); # stores the final output
+my @Mparams = (); # stores the options `-m*'
+my @devices = ();
+my $do_run = 0; # run generated `groff' command
+my $pdf_with_ligatures = 0; # `-P-y -PU' for `pdf' device
+my $with_warnings = 0;
+
+my $Prog = $0;
+{
+ my ($v, $d, $f) = File::Spec->splitpath($Prog);
+ $Prog = $f;
+}
+
+
+my %macros;
+my %Groff =
+ (
+ # preprocessors
+ 'chem' => 0,
+ 'eqn' => 0,
+ 'gperl' => 0,
+ 'grap' => 0,
+ 'grn' => 0,
+ 'gideal' => 0,
+ 'gpinyin' => 0,
+ 'lilypond' => 0,
+
+ 'pic' => 0,
+ 'PS' => 0, # opening for pic
+ 'PF' => 0, # alternative opening for pic
+ 'PE' => 0, # closing for pic
+
+ 'refer' => 0,
+ 'refer_open' => 0,
+ 'refer_close' => 0,
+ 'soelim' => 0,
+ 'tbl' => 0,
+
+ # tmacs
+# 'man' => 0,
+# 'mandoc' => 0,
+# 'mdoc' => 0,
+# 'mdoc_old' => 0,
+# 'me' => 0,
+# 'mm' => 0,
+# 'mom' => 0,
+# 'ms' => 0,
+
+ # requests
+ 'AB' => 0, # ms
+ 'AE' => 0, # ms
+ 'AI' => 0, # ms
+ 'AU' => 0, # ms
+ 'NH' => 0, # ms
+ 'TH_later' => 0, # TH not 1st command is ms
+ 'TL' => 0, # ms
+ 'UL' => 0, # ms
+ 'XP' => 0, # ms
+
+ 'IP' => 0, # man and ms
+ 'LP' => 0, # man and ms
+ 'P' => 0, # man and ms
+ 'PP' => 0, # man and ms
+ 'SH' => 0, # man and ms
+
+ 'OP' => 0, # man
+ 'SS' => 0, # man
+ 'SY' => 0, # man
+ 'TH_first' => 0, # TH as 1st command is man
+ 'TP' => 0, # man
+ 'UR' => 0, # man
+ 'YS' => 0, # man
+
+ # for mdoc and mdoc-old
+ # .Oo and .Oc for modern mdoc, only .Oo for mdoc-old
+ 'Oo' => 0, # mdoc and mdoc-old
+ 'Oc' => 0, # mdoc
+ 'Dd' => 0, # mdoc
+ ); # end of %Groff
+
+
+# for first line check
+my %preprocs_tmacs =
+ (
+ 'chem' => 0,
+ 'eqn' => 0,
+ 'gideal' => 0,
+ 'gpinyin' => 0,
+ 'grap' => 0,
+ 'grn' => 0,
+ 'pic' => 0,
+ 'refer' => 0,
+ 'soelim' => 0,
+ 'tbl' => 0,
+
+ 'geqn' => 0,
+ 'gpic' => 0,
+ 'neqn' => 0,
+
+ 'man' => 0,
+ 'mandoc' => 0,
+ 'mdoc' => 0,
+ 'mdoc-old' => 0,
+ 'me' => 0,
+ 'mm' => 0,
+ 'mom' => 0,
+ 'ms' => 0,
+ );
+
+my @filespec;
+
+my $tmac_ext = '';
+
+
+########################################################################
+# err()
+########################################################################
+
+sub err {
+ my $text = shift;
+ print STDERR $text;
+}
+
+
+########################################################################
+# handle_args()
+########################################################################
+
+sub handle_args {
+ my $double_minus = 0;
+ my $was_minus = 0;
+ my $was_T = 0;
+ my $optarg = 0;
+ # globals: @filespec, @Command, @devices, @Mparams
+
+ foreach my $arg (@ARGV) {
+
+ if ( $optarg ) {
+ push @Command, $arg;
+ $optarg = 0;
+ next;
+ }
+
+ if ( $double_minus ) {
+ if (-f $arg && -r $arg) {
+ push @filespec, $arg;
+ } else {
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ "grog: $arg is not a readable file.";
+ }
+ next;
+ }
+
+ if ( $was_T ) {
+ push @devices, $arg;
+ $was_T = 0;
+ next;
+ }
+####### handle_args()
+
+ unless ( $arg =~ /^-/ ) { # file name, no opt, no optarg
+ unless (-f $arg && -r $arg) {
+ print 'unknown file name: ' . $arg;
+ }
+ push @filespec, $arg;
+ next;
+ }
+
+ # now $arg starts with `-'
+
+ if ($arg eq '-') {
+ unless ($was_minus) {
+ push @filespec, $arg;
+ $was_minus = 1;
+ }
+ next;
+ }
+
+ if ($arg eq '--') {
+ $double_minus = 1;
+ push(@filespec, $arg);
+ next;
+ }
+
+ &version() if $arg =~ /^--?v/; # --version, with exit
+ &help() if $arg =~ /--?h/; # --help, with exit
+
+ if ( $arg =~ /^--r/ ) { # --run, no exit
+ $do_run = 1;
+ next;
+ }
+
+ if ( $arg =~ /^--wa/ ) { # --warnings, no exit
+ $with_warnings = 1;
+ next;
+ }
+####### handle_args()
+
+ if ( $arg =~ /^--(wi|l)/ ) { # --ligatures, no exit
+ # the old --with_ligatures is only kept for compatibility
+ $pdf_with_ligatures = 1;
+ next;
+ }
+
+ if ($arg =~ /^-m/) {
+ push @Mparams, $arg;
+ next;
+ }
+
+ if ($arg =~ /^-T$/) {
+ $was_T = 1;
+ next;
+ }
+
+ if ($arg =~ s/^-T(\w+)$/$1/) {
+ push @devices, $1;
+ next;
+ }
+
+ if ($arg =~ /^-(\w)(\w*)$/) { # maybe a groff option
+ my $opt_char = $1;
+ my $opt_char_with_arg = $opt_char . ':';
+ my $others = $2;
+ if ( $groff_opts =~ /$opt_char_with_arg/ ) { # groff optarg
+ if ( $others ) { # optarg is here
+ push @Command, '-' . $opt_char;
+ push @Command, '-' . $others;
+ next;
+ }
+ # next arg is optarg
+ $optarg = 1;
+ next;
+####### handle_args()
+ } elsif ( $groff_opts =~ /$opt_char/ ) { # groff no optarg
+ push @Command, '-' . $opt_char;
+ if ( $others ) { # $others is now an opt collection
+ $arg = '-' . $others;
+ redo;
+ }
+ # arg finished
+ next;
+ } else { # not a groff opt
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ 'unknown argument ' . $arg;
+ push(@Command, $arg);
+ next;
+ }
+ }
+ }
+ @filespec = ('-') unless (@filespec);
+} # handle_args()
+
+
+
+########################################################################
+# handle_file_ext()
+########################################################################
+
+sub handle_file_ext {
+ # get tmac from file name extension
+ # output number of found single tmac
+
+ # globals: @filespec, $tmac_ext;
+
+ foreach my $file ( @filespec ) {
+ # test for each file name in the arguments
+ unless ( open(FILE, $file eq "-" ? $file : "< $file") ) {
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ "$Prog: can't open \`$file\': $!";
+ next;
+ }
+
+ next unless ( $file =~ /\./ ); # file name has no dot `.'
+
+##### handle_file_ext()
+ # get extension
+ my $ext = $file;
+ $ext =~ s/^
+ .*
+ \.
+ ([^.]*)
+ $
+ /$1/x;
+ next unless ( $ext );
+
+##### handle_file_ext()
+ # these extensions are correct, but not based on a tmac
+ next if ( $ext =~ /^(
+ chem|
+ eqn|
+ g|
+ grap|
+ grn|
+ groff|
+ hdtbl|
+ pdfroff|
+ pic|
+ pinyin|
+ ref|
+ roff|
+ t|
+ tbl|
+ tr|
+ www
+ )$/x );
+
+##### handle_file_ext()
+ # extensions for man tmac
+ if ( $ext =~ /^(
+ [1-9lno]|
+ man|
+ n|
+ 1b
+ )$/x ) {
+ # `man|n' from `groff' source
+ # `1b' from `heirloom'
+ # `[1-9lno]' from man-pages
+ if ( $tmac_ext && $tmac_ext ne 'man' ) {
+ # found tmac is not 'man'
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ '2 different file name extensions found ' .
+ $tmac_ext . ' and ' . $ext;
+ $tmac_ext = '';
+ next;
+ }
+
+##### handle_file_ext()
+ $tmac_ext = 'man';
+ next;
+ }
+
+ if ( $ext =~ /^(
+ mandoc|
+ mdoc|
+ me|
+ mm|
+ mmse|
+ mom|
+ ms|
+ $)/x ) {
+ if ( $tmac_ext && $tmac_ext ne $ext ) {
+ # found tmac is not identical to former found tmac
+##### handle_file_ext()
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ '2 different file name extensions found ' .
+ $tmac_ext . ' and ' . $ext;
+ $tmac_ext = '';
+ next;
+ }
+
+ $tmac_ext = $ext;
+ next;
+ }
+
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ 'Unknown file name extension '. $file . '.';
+ next;
+ } # end foreach file
+
+ 1;
+} # handle_file_ext()
+
+
+########################################################################
+# handle_whole_files()
+########################################################################
+
+sub handle_whole_files {
+ # globals: @filespec
+
+ foreach my $file ( @filespec ) {
+ unless ( open(FILE, $file eq "-" ? $file : "< $file") ) {
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ "$Prog: can't open \`$file\': $!";
+ next;
+ }
+ my $line = <FILE>; # get single line
+
+ unless ( defined($line) ) {
+ # empty file, go to next filearg
+ close (FILE);
+ next;
+ }
+
+ if ( $line ) {
+ chomp $line;
+ unless ( &do_first_line( $line, $file ) ) {
+ # not an option line
+ &do_line( $line, $file );
+ }
+ } else { # empty line
+ next;
+ }
+
+ while (<FILE>) { # get lines by and by
+ chomp;
+ &do_line( $_, $file );
+ }
+ close(FILE);
+ } # end foreach
+} # handle_whole_files()
+
+
+########################################################################
+# do_first_line()
+########################################################################
+
+# As documented for the `man' program, the first line can be
+# used as a groff option line. This is done by:
+# - start the line with '\" (apostrophe, backslash, double quote)
+# - add a space character
+# - a word using the following characters can be appended: `egGjJpRst'.
+# Each of these characters means an option for the generated
+# `groff' command line, e.g. `-t'.
+
+sub do_first_line {
+ my ( $line, $file ) = @_;
+
+ # globals: %preprocs_tmacs
+
+ # For a leading groff options line use only [egGjJpRst]
+ if ( $line =~ /^[.']\\"[\segGjJpRst]+&/ ) {
+ # this is a groff options leading line
+ if ( $line =~ /^\./ ) {
+ # line is a groff options line with . instead of '
+ print "First line in $file must start with an apostrophe \ " .
+ "instead of a period . for groff options line!";
+ }
+
+ if ( $line =~ /j/ ) {
+ $Groff{'chem'}++;
+ }
+ if ( $line =~ /e/ ) {
+ $Groff{'eqn'}++;
+ }
+ if ( $line =~ /g/ ) {
+ $Groff{'grn'}++;
+ }
+ if ( $line =~ /G/ ) {
+ $Groff{'grap'}++;
+ }
+ if ( $line =~ /i/ ) {
+ $Groff{'gideal'}++;
+ }
+ if ( $line =~ /p/ ) {
+ $Groff{'pic'}++;
+ }
+ if ( $line =~ /R/ ) {
+ $Groff{'refer'}++;
+ }
+ if ( $line =~ /s/ ) {
+ $Groff{'soelim'}++;
+ }
+####### do_first_line()
+ if ( $line =~ /t/ ) {
+ $Groff{'tbl'}++;
+ }
+ return 1; # a leading groff options line, 1 means yes, 0 means no
+ }
+
+ # not a leading short groff options line
+
+ return 0 if ( $line !~ /^[.']\\"\s*(.*)$/ ); # ignore non-comments
+
+ return 0 unless ( $1 ); # for empty comment
+
+ # all following array members are either preprocs or 1 tmac
+ my @words = split '\s+', $1;
+
+ my @in = ();
+ my $word;
+ for $word ( @words ) {
+ if ( $word eq 'ideal' ) {
+ $word = 'gideal';
+ } elsif ( $word eq 'gpic' ) {
+ $word = 'pic';
+ } elsif ( $word =~ /^(gn|)eqn$/ ) {
+ $word = 'eqn';
+ }
+ if ( exists $preprocs_tmacs{$word} ) {
+ push @in, $word;
+ } else {
+ # not word for preproc or tmac
+ return 0;
+ }
+ }
+
+ for $word ( @in ) {
+ $Groff{$word}++;
+ }
+} # do_first_line()
+
+
+########################################################################
+# do_line()
+########################################################################
+
+my $before_first_command = 1; # for check of .TH
+
+sub do_line {
+ my ( $line, $file ) = @_;
+
+ return if ( $line =~ /^[.']\s*\\"/ ); # comment
+
+ return unless ( $line =~ /^[.']/ ); # ignore text lines
+
+ $line =~ s/^['.]\s*/./; # let only a dot as leading character,
+ # remove spaces after the leading dot
+ $line =~ s/\s+$//; # remove final spaces
+
+ return if ( $line =~ /^\.$/ ); # ignore .
+ return if ( $line =~ /^\.\.$/ ); # ignore ..
+
+ if ( $before_first_command ) { # so far without 1st command
+ if ( $line =~ /^\.TH/ ) {
+ # check if .TH is 1st command for man
+ $Groff{'TH_first'} = 1 if ( $line =~ /^\.\s*TH/ );
+ }
+ if ( $line =~ /^\./ ) {
+ $before_first_command = 0;
+ }
+ }
+
+ # split command
+ $line =~ /^(\.\w+)\s*(.*)$/;
+ my $command = $1;
+ $command = '' unless ( defined $command );
+ my $args = $2;
+ $args = '' unless ( defined $args );
+
+
+ ######################################################################
+ # soelim
+ if ( $line =~ /^\.(do)?\s*(so|mso|PS\s*<|SO_START).*$/ ) {
+ # `.so', `.mso', `.PS<...', `.SO_START'
+ $Groff{'soelim'}++;
+ return;
+ }
+ if ( $line =~ /^\.(do)?\s*(so|mso|PS\s*<|SO_START).*$/ ) {
+ # `.do so', `.do mso', `.do PS<...', `.do SO_START'
+ $Groff{'soelim'}++;
+ return;
+ }
+####### do_line()
+
+ ######################################################################
+ # macros
+
+ if ( $line =~ /^\.de1?\W?/ ) {
+ # this line is a macro definition, add it to %macros
+ my $macro = $line;
+ $macro =~ s/^\.de1?\s+(\w+)\W*/.$1/;
+ return if ( exists $macros{$macro} );
+ $macros{$macro} = 1;
+ return;
+ }
+
+
+ # if line command is a defined macro, just ignore this line
+ return if ( exists $macros{$command} );
+
+
+ ######################################################################
+ # preprocessors
+
+ if ( $command =~ /^(\.cstart)|(begin\s+chem)$/ ) {
+ $Groff{'chem'}++; # for chem
+ return;
+ }
+ if ( $command =~ /^\.EQ$/ ) {
+ $Groff{'eqn'}++; # for eqn
+ return;
+ }
+ if ( $command =~ /^\.G1$/ ) {
+ $Groff{'grap'}++; # for grap
+ return;
+ }
+ if ( $command =~ /^\.Perl/ ) {
+ $Groff{'gperl'}++; # for gperl
+ return;
+ }
+ if ( $command =~ /^\.pinyin/ ) {
+ $Groff{'gpinyin'}++; # for gperl
+ return;
+ }
+ if ( $command =~ /^\.GS$/ ) {
+ $Groff{'grn'}++; # for grn
+ return;
+ }
+ if ( $command =~ /^\.IS$/ ) {
+ $Groff{'gideal'}++; # preproc gideal for ideal
+ return;
+ }
+ if ( $command =~ /^\.lilypond$/ ) {
+ $Groff{'lilypond'}++; # for glilypond
+ return;
+ }
+
+####### do_line()
+
+ # pic can be opened by .PS or .PF and closed by .PE
+ if ( $command =~ /^\.PS$/ ) {
+ $Groff{'pic'}++; # normal opening for pic
+ return;
+ }
+ if ( $command =~ /^\.PF$/ ) {
+ $Groff{'PF'}++; # alternate opening for pic
+ return;
+ }
+ if ( $command =~ /^\.PE$/ ) {
+ $Groff{'PE'}++; # closing for pic
+ return;
+ }
+
+ if ( $command =~ /^\.R1$/ ) {
+ $Groff{'refer'}++; # for refer
+ return;
+ }
+ if ( $command =~ /^\.\[$/ ) {
+ $Groff{'refer_open'}++; # for refer open
+ return;
+ }
+ if ( $command =~ /^\.\]$/ ) {
+ $Groff{'refer_close'}++; # for refer close
+ return;
+ }
+ if ( $command =~ /^\.TS$/ ) {
+ $Groff{'tbl'}++; # for tbl
+ return;
+ }
+ if ( $command =~ /^\.TH$/ ) {
+ unless ( $Groff{'TH_first'} ) {
+ $Groff{'TH_later'}++; # for tbl
+ }
+ return;
+ }
+
+
+ ######################################################################
+ # macro package (tmac)
+ ######################################################################
+
+ ##########
+ # modern mdoc
+
+ if ( $command =~ /^\.(Dd)$/ ) {
+ $Groff{'Dd'}++; # for modern mdoc
+ return;
+ }
+
+####### do_line()
+ # In the old version of -mdoc `Oo' is a toggle, in the new it's
+ # closed by `Oc'.
+ if ( $command =~ /^\.Oc$/ ) {
+ $Groff{'Oc'}++; # only for modern mdoc
+ return;
+ }
+
+
+ ##########
+ # old and modern mdoc
+
+ if ( $command =~ /^\.Oo$/ ) {
+ $Groff{'Oo'}++; # for mdoc and mdoc-old
+ return;
+ }
+
+
+ ##########
+ # old mdoc
+ if ( $command =~ /^\.(Tp|Dp|De|Cx|Cl)$/ ) {
+ $Groff{'mdoc_old'}++; # true for old mdoc
+ return;
+ }
+
+
+ ##########
+ # for ms
+
+####### do_line()
+ if ( $command =~ /^\.AB$/ ) {
+ $Groff{'AB'}++; # for ms
+ return;
+ }
+ if ( $command =~ /^\.AE$/ ) {
+ $Groff{'AE'}++; # for ms
+ return;
+ }
+ if ( $command =~ /^\.AI$/ ) {
+ $Groff{'AI'}++; # for ms
+ return;
+ }
+ if ( $command =~ /^\.AU$/ ) {
+ $Groff{'AU'}++; # for ms
+ return;
+ }
+ if ( $command =~ /^\.NH$/ ) {
+ $Groff{'NH'}++; # for ms
+ return;
+ }
+ if ( $command =~ /^\.TL$/ ) {
+ $Groff{'TL'}++; # for ms
+ return;
+ }
+ if ( $command =~ /^\.XP$/ ) {
+ $Groff{'XP'}++; # for ms
+ return;
+ }
+
+
+ ##########
+ # for man and ms
+
+ if ( $command =~ /^\.IP$/ ) {
+ $Groff{'IP'}++; # for man and ms
+ return;
+ }
+ if ( $command =~ /^\.LP$/ ) {
+ $Groff{'LP'}++; # for man and ms
+ return;
+ }
+####### do_line()
+ if ( $command =~ /^\.P$/ ) {
+ $Groff{'P'}++; # for man and ms
+ return;
+ }
+ if ( $command =~ /^\.PP$/ ) {
+ $Groff{'PP'}++; # for man and ms
+ return;
+ }
+ if ( $command =~ /^\.SH$/ ) {
+ $Groff{'SH'}++; # for man and ms
+ return;
+ }
+ if ( $command =~ /^\.UL$/ ) {
+ $Groff{'UL'}++; # for man and ms
+ return;
+ }
+
+
+ ##########
+ # for man only
+
+ if ( $command =~ /^\.OP$/ ) { # for man
+ $Groff{'OP'}++;
+ return;
+ }
+ if ( $command =~ /^\.SS$/ ) { # for man
+ $Groff{'SS'}++;
+ return;
+ }
+ if ( $command =~ /^\.SY$/ ) { # for man
+ $Groff{'SY'}++;
+ return;
+ }
+ if ( $command =~ /^\.TP$/ ) { # for man
+ $Groff{'TP'}++;
+ return;
+ }
+ if ( $command =~ /^\.UR$/ ) {
+ $Groff{'UR'}++; # for man
+ return;
+ }
+ if ( $command =~ /^\.YS$/ ) { # for man
+ $Groff{'YS'}++;
+ return;
+ }
+####### do_line()
+
+
+ ##########
+ # me
+
+ if ( $command =~ /^\.(
+ [ilnp]p|
+ sh
+ )$/x ) {
+ $Groff{'me'}++; # for me
+ return;
+ }
+
+
+ #############
+ # mm and mmse
+
+ if ( $command =~ /^\.(
+ H|
+ MULB|
+ LO|
+ LT|
+ NCOL|
+ P\$|
+ PH|
+ SA
+ )$/x ) {
+ $Groff{'mm'}++; # for mm and mmse
+ if ( $command =~ /^\.LO$/ ) {
+ if ( $args =~ /^(DNAMN|MDAT|BIL|KOMP|DBET|BET|SIDOR)/ ) {
+ $Groff{'mmse'}++; # for mmse
+ }
+ } elsif ( $command =~ /^\.LT$/ ) {
+ if ( $args =~ /^(SVV|SVH)/ ) {
+ $Groff{'mmse'}++; # for mmse
+ }
+ }
+ return;
+ }
+####### do_line()
+
+ ##########
+ # mom
+
+ if ( $line =~ /^\.(
+ ALD|
+ DOCTYPE|
+ FAMILY|
+ FT|
+ FAM|
+ LL|
+ LS|
+ NEWPAGE|
+ PAGE|
+ PAPER|
+ PRINTSTYLE|
+ PT_SIZE|
+ T_MARGIN
+ )$/x ) {
+ $Groff{'mom'}++; # for mom
+ return;
+ }
+
+} # do_line()
+
+
+########################################################################
+# sub make_groff_device
+########################################################################
+
+my @m = ();
+my @preprograms = ();
+my $correct_tmac = '';
+
+sub make_groff_device {
+ # globals: @devices
+
+ # default device is empty, i.e. it is `ps' when without `-T'
+ my $device = '';
+
+ for my $d ( @devices ) {
+ if ( $d =~ # suitable devices
+ /^(
+ dvi|
+ html|
+ xhtml|
+ lbp|
+ lj4|
+ ps|
+ pdf|
+ ascii|
+ cp1047|
+ latin1|
+ utf8
+ )$/x ) {
+###### make_groff_device()
+ if ( $device ) {
+ next if ( $device eq $d );
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ 'several different devices given: ' .
+ $device . ' and ' .$d;
+ $device = $d; # the last provided device is taken
+ next;
+ } else { # empty $device
+ $device = $d;
+ next;
+ }
+ } else { # not suitable device
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ 'not a suitable device for groff: ' . $d;
+ next;
+ }
+
+ if ( $device ) {
+ push @Command, '-T';
+ push @Command, $device;
+ }
+ }
+
+###### make_groff_device()
+ if ( $device eq 'pdf' ) {
+ if ( $pdf_with_ligatures ) { # with --ligature argument
+ push( @Command, '-P-y' );
+ push( @Command, '-PU' );
+ } else { # no --ligature argument
+ if ( $with_warnings ) {
+ print STDERR <<EOF;
+If you have trouble with ligatures like `fi' in the `groff' output, you
+can proceed as one of
+- add `grog' option `--with_ligatures' or
+- use the `grog' option combination `-P-y -PU' or
+- try to remove the font named similar to `fonts-texgyre' from your system.
+EOF
+ } # end of warning
+ } # end of ligature
+ } # end of pdf device
+} # make_groff_device()
+
+
+########################################################################
+# make_groff_preproc()
+########################################################################
+
+sub make_groff_preproc {
+ # globals: %Groff, @preprograms, @Command
+
+ # preprocessors without `groff' option
+ if ( $Groff{'lilypond'} ) {
+ push @preprograms, 'glilypond';
+ }
+ if ( $Groff{'gperl'} ) {
+ push @preprograms, 'gperl';
+ }
+ if ( $Groff{'gpinyin'} ) {
+ push @preprograms, 'gpinyin';
+ }
+
+ # preprocessors with `groff' option
+ if ( ( $Groff{'PS'} || $Groff{'PF'} ) && $Groff{'PE'} ) {
+ $Groff{'pic'} = 1;
+ }
+ if ( $Groff{'gideal'} ) {
+ $Groff{'pic'} = 1;
+ }
+
+###### make_groff_preproc()
+ $Groff{'refer'} ||= $Groff{'refer_open'} && $Groff{'refer_close'};
+
+ if ( $Groff{'chem'} || $Groff{'eqn'} || $Groff{'gideal'} ||
+ $Groff{'grap'} || $Groff{'grn'} || $Groff{'pic'} ||
+ $Groff{'refer'} || $Groff{'tbl'} ) {
+ push(@Command, '-s') if $Groff{'soelim'};
+
+ push(@Command, '-R') if $Groff{'refer'};
+
+ push(@Command, '-t') if $Groff{'tbl'}; # tbl before eqn
+ push(@Command, '-e') if $Groff{'eqn'};
+
+ push(@Command, '-j') if $Groff{'chem'}; # chem produces pic code
+ push(@Command, '-J') if $Groff{'gideal'}; # gideal produces pic
+ push(@Command, '-G') if $Groff{'grap'};
+ push(@Command, '-g') if $Groff{'grn'}; # gremlin files for -me
+ push(@Command, '-p') if $Groff{'pic'};
+
+ }
+} # make_groff_preproc()
+
+
+########################################################################
+# make_groff_tmac_man_ms()
+########################################################################
+
+sub make_groff_tmac_man_ms {
+ # globals: @filespec, $tmac_ext, %Groff
+
+ # `man' requests, not from `ms'
+ if ( $Groff{'SS'} || $Groff{'SY'} || $Groff{'OP'} ||
+ $Groff{'TH_first'} || $Groff{'TP'} || $Groff{'UR'} ) {
+ $Groff{'man'} = 1;
+ push(@m, '-man');
+
+ $tmac_ext = 'man' unless ( $tmac_ext );
+ &err('man requests found, but file name extension ' .
+ 'was: ' . $tmac_ext) unless ( $tmac_ext eq 'man' );
+ $tmac_ext = 'man';
+ return 1; # true
+ }
+
+###### make_groff_tmac_man_ms()
+ # `ms' requests, not from `man'
+ if (
+ $Groff{'1C'} || $Groff{'2C'} ||
+ $Groff{'AB'} || $Groff{'AE'} || $Groff{'AI'} || $Groff{'AU'} ||
+ $Groff{'BX'} || $Groff{'CD'} || $Groff{'DA'} || $Groff{'DE'} ||
+ $Groff{'DS'} || $Groff{'ID'} || $Groff{'LD'} || $Groff{'NH'} ||
+ $Groff{'TH_later'} ||
+ $Groff{'TL'} || $Groff{'UL'} || $Groff{'XP'}
+ ) {
+ $Groff{'ms'} = 1;
+ push(@m, '-ms');
+
+ $tmac_ext = 'ms' unless ( $tmac_ext );
+ &err('ms requests found, but file name extension ' .
+ 'was: ' . $tmac_ext) unless ( $tmac_ext eq 'ms' );
+ $tmac_ext = 'ms';
+ return 1; # true
+ }
+
+###### make_groff_tmac_man_ms()
+
+ # both `man' and `ms' requests
+ if ( $Groff{'P'} || $Groff{'IP'} ||
+ $Groff{'LP'} || $Groff{'PP'} || $Groff{'SH'} ) {
+ if ( $tmac_ext eq 'man' ) {
+ $Groff{'man'} = 1;
+ push(@m, '-man');
+ return 1; # true
+ } elsif ( $tmac_ext eq 'ms' ) {
+ $Groff{'ms'} = 1;
+ push(@m, '-ms');
+ return 1; # true
+ }
+ return 0;
+ }
+} # make_groff_tmac_man_ms()
+
+
+
+########################################################################
+# make_groff_tmac_others()
+########################################################################
+
+sub make_groff_tmac_others {
+ # globals: @filespec, $tmac_ext, %Groff
+
+ # mdoc
+ if ( ( $Groff{'Oo'} && $Groff{'Oc'} ) || $Groff{'Dd'} ) {
+ $Groff{'Oc'} = 0;
+ $Groff{'Oo'} = 0;
+ push(@m, '-mdoc');
+ return 1; # true
+ }
+ if ( $Groff{'mdoc_old'} || $Groff{'Oo'} ) {
+ push(@m, '-mdoc_old');
+ return 1; # true
+ }
+
+ # me
+ if ( $Groff{'me'} ) {
+ push(@m, '-me');
+ return 1; # true
+ }
+
+##### make_groff_tmac_others()
+ # mm and mmse
+ if ( $Groff{'mm'} ) {
+ push(@m, '-mm');
+ return 1; # true
+ }
+ if ( $Groff{'mmse'} ) { # Swedish mm
+ push(@m, '-mmse');
+ return 1; # true
+ }
+
+ # mom
+ if ( $Groff{'mom'} ) {
+ push(@m, '-mom');
+ return 1; # true
+ }
+} # make_groff_tmac_others()
+
+
+########################################################################
+# make_groff_line_rest()
+########################################################################
+
+sub make_groff_line_rest {
+ my $file_args_included; # file args now only at 1st preproc
+ unshift @Command, 'groff';
+ if ( @preprograms ) {
+ my @progs;
+ $progs[0] = shift @preprograms;
+ push(@progs, @filespec);
+ for ( @preprograms ) {
+ push @progs, '|';
+ push @progs, $_;
+ }
+ push @progs, '|';
+ unshift @Command, @progs;
+ $file_args_included = 1;
+ } else {
+ $file_args_included = 0;
+ }
+
+ foreach (@Command) {
+ next unless /\s/;
+ # when one argument has several words, use accents
+ $_ = "'" . $_ . "'";
+ }
+
+
+ ##########
+ # -m arguments
+ my $nr_m_guessed = scalar @m;
+ if ( $nr_m_guessed > 1 ) {
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ 'argument for -m found: ' . @m;
+ }
+
+###### make_groff_line()
+
+ my $nr_m_args = scalar @Mparams; # m-arguments for grog
+ my $last_m_arg = ''; # last provided -m option
+ if ( $nr_m_args > 1 ) {
+ # take the last given -m argument of grog call,
+ # ignore other -m arguments and the found ones
+ $last_m_arg = $Mparams[-1]; # take the last -m argument
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ $Prog . ": more than 1 `-m' argument: @Mparams";
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ 'We take the last one: ' . $last_m_arg;
+ } elsif ( $nr_m_args == 1 ) {
+ $last_m_arg = $Mparams[0];
+ }
+
+ my $final_m = '';
+ if ( $last_m_arg ) {
+ my $is_equal = 0;
+ for ( @m ) {
+ if ( $_ eq $last_m_arg ) {
+ $is_equal = 1;
+ last;
+ }
+ next;
+ } # end for @m
+ if ( $is_equal ) {
+ $final_m = $last_m_arg;
+ } else {
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ 'Provided -m argument ' . $last_m_arg .
+ ' differs from guessed -m args: ' . @m;
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ 'The argument is taken.';
+ $final_m = $last_m_arg;
+ }
+###### make_groff_line()
+ } else { # no -m arg provided
+ if ( $nr_m_guessed > 1 ) {
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' .
+ 'More than 1 -m arguments were guessed: ' . @m;
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' . 'Guessing stopped.';
+ exit 1;
+ } elsif ( $nr_m_guessed == 1 ) {
+ $final_m = $m[0];
+ } else {
+ # no -m provided or guessed
+ }
+ }
+ push @Command, $final_m if ( $final_m );
+
+ push(@Command, @filespec) unless ( $file_args_included );
+
+ #########
+ # execute the `groff' command here with option `--run'
+ if ( $do_run ) { # with --run
+ print STDERR __FILE__ . ' ' . __LINE__ . ': ' . "@Command";
+ my $cmd = join ' ', @Command;
+ system($cmd);
+ } else {
+ print "@Command";
+ }
+
+ exit 0;
+} # make_groff_line()
+
+
+########################################################################
+# sub help
+########################################################################
+
+sub help {
+ print <<EOF;
+usage: grog [option]... [--] [filespec]...
+
+"filespec" is either the name of an existing, readable file or "-" for
+standard input. If no `filespec' is specified, standard input is
+assumed automatically. All arguments after a `--' are regarded as file
+names, even if they start with a `-' character.
+
+`option' is either a `groff' option or one of these:
+
+-h|--help print this uasge message and exit
+-v|--version print version information and exit
+
+-C compatibility mode
+--ligatures include options `-P-y -PU' for internal font, which
+ preserverses the ligatures like `fi'
+--run run the checked-out groff command
+--warnings display more warnings to standard error
+
+All other options should be `groff' 1-character options. These are then
+appended to the generated `groff' command line. The `-m' options will
+be checked by `grog'.
+
+EOF
+ exit 0;
+} # help()
+
+
+########################################################################
+# sub version
+########################################################################
+
+sub version {
+ our %at_at;
+ print "Perl version of GNU $Prog " .
+ "in groff version " . $at_at{'GROFF_VERSION'};
+ exit 0;
+} # version()
+
+
+1;
+########################################################################
+### Emacs settings
+# Local Variables:
+# mode: CPerl
+# End:
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [groff] 01/01: [grog] Don't use CR/LF line endings.,
Werner LEMBERG <=