From 653c6faab591f3c5f290a18a7f58c29cb1a3b0a7 Mon Sep 17 00:00:00 2001 From: wlemb Date: Sun, 6 Feb 2000 09:34:01 +0000 Subject: Initial revision --- src/roff/grog/Makefile.sub | 22 +++++++ src/roff/grog/grog.man | 72 ++++++++++++++++++++++ src/roff/grog/grog.pl | 149 +++++++++++++++++++++++++++++++++++++++++++++ src/roff/grog/grog.sh | 78 ++++++++++++++++++++++++ 4 files changed, 321 insertions(+) create mode 100644 src/roff/grog/Makefile.sub create mode 100644 src/roff/grog/grog.man create mode 100644 src/roff/grog/grog.pl create mode 100644 src/roff/grog/grog.sh (limited to 'src/roff/grog') diff --git a/src/roff/grog/Makefile.sub b/src/roff/grog/Makefile.sub new file mode 100644 index 00000000..e1c53e17 --- /dev/null +++ b/src/roff/grog/Makefile.sub @@ -0,0 +1,22 @@ +MAN1=grog.n +CLEANADD=grog + +all: grog + +grog: grog.pl grog.sh + if test -n "$(PERLPATH)" && test -f "$(PERLPATH)"; then \ + rm -f $@; \ + sed -e 's;/usr/bin/perl;$(PERLPATH);' $(srcdir)/grog.pl >$@; \ + else \ + rm -f $@; \ + sed "$(SH_SCRIPT_SED_CMD)" $(srcdir)/grog.sh >$@; \ + fi + chmod +x $@ + +install_data: grog + -test -d $(bindir) || $(mkinstalldirs) $(bindir) + -rm -f $(bindir)/grog + $(INSTALL_PROGRAM) grog $(bindir)/grog + +uninstall_sub: + -rm -f $(bindir)/grog diff --git a/src/roff/grog/grog.man b/src/roff/grog/grog.man new file mode 100644 index 00000000..8e926573 --- /dev/null +++ b/src/roff/grog/grog.man @@ -0,0 +1,72 @@ +.ig \"-*- nroff -*- +Copyright (C) 1989-1995 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that this permission notice may be included in +translations approved by the Free Software Foundation instead of in +the original English. +.. +.TH GROG @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +.SH NAME +grog \- guess options for groff command +.SH SYNOPSIS +.B grog +[ +.BI \- option +\|.\|.\|. +] +[ +.IR files \|.\|.\|. +] +.SH DESCRIPTION +.B grog +reads +.I files +and guesses which of the +.BR groff (@MAN1EXT@) +options +.BR \-e , +.BR \-man , +.BR \-me , +.BR \-mm , +.BR \-ms , +.BR \-p , +.BR \-s , +and +.BR \-t +are required for printing +.IR files , +and prints the groff command including those options on the standard output. +A filename of +.B \- +is taken to refer to the standard input. +If no files are specified the standard input will be read. +Any specified options will be included in the printed command. +No space is allowed between options and their arguments. +For example, +.IP +.B `grog \-Tdvi paper.ms` +.LP +will guess the appropriate command to print +.B paper.ms +and then run it after adding the +.B \-Tdvi +option. +.SH "SEE ALSO" +.BR doctype (1), +.BR groff (@MAN1EXT@), +.BR @g@troff (@MAN1EXT@), +.BR @g@tbl (@MAN1EXT@), +.BR @g@pic (@MAN1EXT@), +.BR @g@eqn (@MAN1EXT@), +.BR @g@soelim (@MAN1EXT@) diff --git a/src/roff/grog/grog.pl b/src/roff/grog/grog.pl new file mode 100644 index 00000000..b131da64 --- /dev/null +++ b/src/roff/grog/grog.pl @@ -0,0 +1,149 @@ +#!/usr/bin/perl +# grog -- guess options for groff command +# Inspired by doctype script in Kernighan & Pike, Unix Programming +# Environment, pp 306-8. + +$prog = $0; +$prog =~ s@.*/@@; + +push(@command, "groff"); + +while ($ARGV[0] =~ /^-./) { + $arg = shift(@ARGV); + last if $arg eq "--"; + push(@command, $arg); +} + +if (@ARGV) { + foreach $arg (@ARGV) { + &process($arg, 0); + } +} +else { + &process("-", 0); +} + +sub process { + local($filename, $level) = @_; + local(*FILE); + + if (!open(FILE, $filename eq "-" ? $filename : "< $filename")) { + print STDERR "$prog: can't open \`$filename': $!\n"; + exit 1 unless $level; + return; + } + while () { + if (/^\.TS/) { + $_ = ; + if (!/^\./) { + $tbl++; + $soelim++ if $level; + } + } + elsif (/^\.EQ/) { + $_ = ; + if (!/^\./ || /^\.[0-9]/) { + $eqn++; + $soelim++ if $level; + } + } + elsif (/^\.PS([ 0-9.<].*)?$/) { + if (/^\.PS\s*<\s*(\S+)/) { + $pic++; + $soelim++ if $level; + &process($1, $level); + } + else { + $_ = ; + if (!/^\./ || /^\.ps/) { + $pic++; + $soelim++ if $level; + } + } + } + elsif (/^\.R1/ || /^\.\[/) { + $refer++; + $soelim++ if $level; + } + elsif (/^\.[PLI]P/) { + $PP++; + } + elsif (/^\.P$/) { + $P++; + } + elsif (/^\.(PH|SA)/) { + $mm++; + } + elsif (/^\.TH/) { + $TH++; + } + elsif (/^\.SH/) { + $SH++; + } + elsif (/^\.([pnil]p|sh)/) { + $me++; + } + elsif (/^\.Dd/) { + $mdoc++; + } + elsif (/^\.(Tp|Dp|De|Cx|Cl)/) { + $mdoc_old = 1; + } + # In the old version of -mdoc `Oo' is a toggle, in the new it's + # closed by `Oc'. + elsif (/^\.Oo/) { + $Oo++; + } + elsif (/^\.Oc/) { + $Oo--; + } + if (/^\.so/) { + chop; + s/^.so *//; + s/\\\".*//; + s/ .*$//; + &process($_, $level + 1) unless /\\/ || $_ eq ""; + } + } + close(FILE); +} + +if ($pic || $tbl || $eqn || $refer) { + $s = "-"; + $s .= "s" if $soelim; + $s .= "R" if $refer; + $s .= "p" if $pic; + $s .= "t" if $tbl; + $s .= "e" if $eqn; + push(@command, $s); +} + +if ($me > 0) { + push(@command, "-me"); +} +elsif ($SH > 0 && $TH > 0) { + push(@command, "-man"); +} +elsif ($PP > 0) { + push(@command, "-ms"); +} +elsif ($P > 0 || $mm > 0) { + push(@command, "-mm"); +} +elsif ($mdoc > 0) { + push(@command, ($mdoc_old || $Oo > 0) ? "-mdoc.old" : "-mdoc"); +} + +push(@command, "--") if @ARGV && $ARGV[0] =~ /^-./; + +push(@command, @ARGV); + +# We could implement an option to execute the command here. + +foreach (@command) { + next unless /[\$\\\"\';&()|<> \t\n]/; + s/\'/\'\\\'\'/; + $_ = "'" . $_ . "'"; +} + +print join(' ', @command), "\n"; diff --git a/src/roff/grog/grog.sh b/src/roff/grog/grog.sh new file mode 100644 index 00000000..631b356a --- /dev/null +++ b/src/roff/grog/grog.sh @@ -0,0 +1,78 @@ +#!/bin/sh +# grog -- guess options for groff command +# Like doctype in Kernighan & Pike, Unix Programming Environment, pp 306-8. + +soelim=gsoelim + +opts= + +for arg +do + case "$arg" in + --) + shift; break;; + -) + break;; + -*) + opts="$opts $arg"; shift;; + *) + break;; + esac +done + +egrep -h '^\.(P|[LI]P|[pnil]p|sh|Dd|Tp|Dp|De|Cx|Cl|Oo|Oc|TS|EQ|TH|SH|so|\[|R1|PH|SA)' $* \ +| sed -e '/^\.so/s/^.*$/.SO_START\ +&\ +.SO_END/' \ +| $soelim \ +| egrep '^\.(P|[LI]P|[pnil]p|sh|Dd|Tp|Dp|De|Cx|Cl|Oo|Oc|TS|EQ|TH|SH|\[|R1|PH|SA|SO_START|SO_END)' \ +| awk ' +/^\.SO_START$/ { so = 1 } +/^\.SO_END$/ { so = 0 } +/^\.TS/ { tbl++; if (so > 0) soelim++ } +/^\.PS([ 0-9.<].*)?$/ { pic++; if (so > 0) soelim++ } +/^\.EQ/ { eqn++; if (so > 0) soelim++ } +/^\.(R1|\[)/ { refer++; if (so > 0) soelim++ } +/^\.TH/ { TH++ } +/^\.[PLI]P/ { PP++ } +/^\.P$/ { P++ } +/^\.SH/ { SH++ } +/^\.(PH|SA)/ { mm++ } +/^\.([pnil]p|sh)/ { me++ } +/^\.Dd/ { mdoc++ } +/^\.(Tp|Dp|De|Cx|Cl)/ { mdoc_old++ } +/^\.Oo/ { Oo++ } +/^\.Oc/ { Oo-- } + +END { + if (files ~ /^-/) + files = "-- " files + printf "groff" + if (pic > 0 || tbl > 0 || eqn > 0 || refer > 0) { + printf " -" + if (soelim > 0) printf "s" + if (refer > 0) printf "R" + if (pic > 0) printf "p" + if (tbl > 0) printf "t" + if (eqn > 0) printf "e" + } + if (me > 0) + printf " -me" + else if (SH > 0 && TH > 0) + printf " -man" + else if (PP > 0) + printf " -ms" + else if (P > 0 || mm > 0) + printf " -mm" + else if (mdoc > 0) { + if (mdoc_old > 0 || Oo > 0) + printf " -mdoc.old" + else + printf " -mdoc" + } + if (opts != "") + printf "%s", opts + if (files != "") + printf " %s", files + print "" +}' "opts=$opts" "files=$*" - -- cgit v1.2.1