Tidying
[exim.git] / doc / doc-scripts / g2man
CommitLineData
495ae4b0 1#! /usr/bin/perl -w
495ae4b0
PH
2
3# Script to find the command line options in the Exim spec, and turn them
4# into a man page, because people like that.
5
6
7##################################################
8# De-markup one line #
9##################################################
10
11sub process {
12my($x) = $_[0];
13
14# Hide SGCAL escapes
15
16$x =~ s/\@\@/&&a/g; # @@
17$x =~ s/\@\\/&&b/g; # @\
18$x =~ s/\@</&&l/g; # @<
19$x =~ s/\@>/&&g/g; # @>
20$x =~ s/\@\{/&&c/g; # @{
21$x =~ s/\@\}/&&d/g; # @}
22$x =~ s/\@#/&&s/g; # @#
23$x =~ s/\@(.)/$1/g; # all other @s
24
25# Convert SGCAL markup
26
27$x =~ s/#/ /g; # turn # into a space
28$x =~ s/\$~//g; # turn $~ into nothing
29$x =~ s/__/_/g; # turn __ into _
30$x =~ s/\$sc\{([^\}]*?)\}/$1/g; # turn $sc{xxx} into xxx
31$x =~ s/\$st\{([^\}]*?)\}/$1/g; # turn $st{xxx} into xxx
32$x =~ s/\$si\{([^\}]*?)\}/$1/g; # turn $si{xxx} into xxx
33$x =~ s/\$tt\{([^\}]*?)\}/$1/g; # turn $tt{xxx} into xxx
34$x =~ s/\$it\{([^\}]*?)\}/$1/g; # turn $it{xxx} into xxx
35$x =~ s/\$bf\{([^\}]*?)\}/$1/g; # turn $bf{xxx} into xxx
36$x =~ s/\$rm\{([^\}]*?)\}/$1/g; # turn $rm{xxx} into xxx
37$x =~ s/\$cb\{([^\}]*?)\}/$1/g; # turn $cb{xxx} into xxx
38
39
40$x =~ s/\\\\([^\\]*?)\\\\/\U$1/g; # turn \\xxx\\ into XXX
41$x =~ s/\\\(([^)]*?)\)\\/$1/g; # turn \(xxx)\ into xxx
42$x =~ s/\\\"([^\"]*?)\"\\/$1/g; # turn \"xxx"\ into xxx
43$x =~ s/\\\%([^\%]*?)\%\\/"$1"/g; # turn \%xxx%\ into "xxx"
44
45$x =~ s/\\\?([^?]*?)\?\\/$1/g; # turn \?URL?\ into URL
46$x =~ s/<<([^>]*?)>>/<$1>/g; # turn <<xxx>> into <xxx>
47$x =~ s/\\\$([^\$]*?)\$\\/\$$1/g; # turn \$xxx$\ into $xxx
48$x =~ s/\\\-([^\\]*?)\-\\/\-$1/g; # turn \-xxx-\ into -xxx
49$x =~ s/\\\*\*([^*]*?)\*\*\\/$1/g; # turn \**xxx**\ into xxx
50$x =~ s/\[\(([\w\/]*)\)\]//g; # remove inline HTML
51
52$x =~ s/\\\*([^*]*?)\*\\/$1/g; # turn \*xxx*\ into xxx
53$x =~ s/\\([^\\]*?)\\/"$1"/g; # turn \xxx\ into "xxx"
54$x =~ s/\$\*\$/\*/g; # turn $*$ into *
55$x =~ s/\$t\b//g; # turn $t into nothing
56
57$x =~ s/::([^:]+)::/$1:/g; # turn ::xxx:: into xxx:
58
59# Put back escaped SGCAL specials
60
61$x =~ s/&&a/\@/g; # @@ => @
62$x =~ s/&&b/\\/g; # @\ => \
63$x =~ s/&&l/</g; # @< => <
64$x =~ s/&&g/>/g; # @> => >
65$x =~ s/&&c/\@{/g; # @{ => @{
66# $x =~ s/&&rc/{/g; #
67# $x =~ s/&&rd/}/g; #
68$x =~ s/&&d/\@}/g; # @} => @}
69$x =~ s/&&s/#/g; # @#
70
71# Remove any null flags ($$)
72
73$x =~ s/\$\$//g;
74
75$x;
76}
77
78
79##################################################
80# De-reference a paragraph #
81##################################################
82
83# Remove sentences or parenthetical comments that contain references.
84
85sub deref {
86my($t) = $_[0];
87
88$t =~ s/^(\n*)[^.()]+~~[^.]+\.\s*/$1/;
89$t =~ s/\s?\.[^.()]+~~[^.]+\././g;
90$t =~ s/\s?\([^~).]+~~[^)]+\)//g;
91
92$t;
93}
94
95
96##################################################
97# Quote what needs quoting #
98##################################################
99
100# This is for anything that must be quoted in the final output, independent
101# of whether it is in "asis" text or not.
102
103sub mustquote {
104my($t) = $_[0];
105$t =~ s/(?<!\\)-/\\-/g;
106
107$t;
108}
109
110
111
112##################################################
113# Main Program #
114##################################################
115
116open(IN, "spec.src") || die "Can't open spec.src\n";
117open(OUT, ">exim.8" ) || die "Can't open exim.8\n";
118
119print OUT <<End;
120.TH EXIM 8
121.SH NAME
122exim \\- a Mail Transfer Agent
123.SH SYNOPSIS
124.B exim [options] arguments ...
125.br
126.B mailq [options] arguments ...
127.br
128.B rsmtp [options] arguments ...
129.br
130.B rmail [options] arguments ...
131.br
132.B runq [options] arguments ...
133.br
134.B newaliases [options] arguments ...
135
136.SH DESCRIPTION
137Exim is a mail transfer agent (MTA) developed at the University of Cambridge.
138It is a large program with very many facilities. For a full specification, see
139the reference manual. This man page contains only a description of the command
140line options. It has been automatically generated from the reference manual
141source, which is why the formatting is poor in some places.
142
143.SH SETTING OPTIONS BY PROGRAM NAME
144.TP 10
145\\fBmailq\\fR
146Behave as if the option \\-bp were present before any other options. The \\-bp
147option requests a listing of the contents of the mail queue on the standard
148output.
149.TP
150\\fBrsmtp\\fR
151Behaves as if the option \\-bS were present before any other options, for
152compatibility with Smail. The \\-bS option is used for reading in a number of
153messages in batched SMTP format.
154.TP
155\\fBrmail\\fR
156Behave as if the \\-i and \\-oee options were present before any other options,
157for compatibility with Smail. The name \\fBrmail\\fR is used as an interface by
158some UUCP systems. The \\-i option specifies that a dot on a line by itself
159does not terminate a non\\-SMTP message; \\-oee requests that errors detected in
160non\\-SMTP messages be reported by emailing the sender.
161.TP
162\\fBrunq\\fR
163Behave as if the option \\-q were present before any other options, for
164compatibility with Smail. The \\-q option causes a single queue runner process
165to be started. It processes the queue once, then exits.
166.TP
167\\fBnewaliases\\fR
168Behave as if the option \\-bi were present before any other options, for
169compatibility with Sendmail. This option is used for rebuilding Sendmail's
170alias file. Exim does not have the concept of a single alias file, but can be
171configured to run a specified command if called with the \\-bi option.
172
173
174.SH OPTIONS
175.TP 10
176End
177
178while (<IN>) { last if /^\.startoptions/; }
179die "Can't find start of options\n" if ! defined $_;
180
181# Find the start of the first option
182
183while (<IN>) { last if /^\.option/; }
184die "Can't find start of first option\n" if ! defined $_;
185
186# Loop for each individual option
187
188while (/^\.option (.*)/)
189 {
190 $nlpending = 0;
191 $itemtext = "";
192
193 printf OUT ("\\fB\\-%s\\fR\n", &mustquote(&process($1)));
194
195 # Process the data for the option
196
197 while (<IN>)
198 {
199 last if /^\.(?:option|endoptions)/;
200 next if /^\.index/;
201 next if /^\.em\s*$/;
202 next if /^\.nem\s*$/;
203
204 if (/^\.display(?:\s+flow)?(?:\s+rm)?\s*$/)
205 {
206 print OUT &mustquote(&deref($itemtext));
207 $itemtext = "";
208 print OUT "\n";
209 while (($_ = <IN>) !~ /^\.endd/)
210 {
211 print OUT " ", &mustquote(&deref(&process($_))) if ! /^\./;
212 }
213 $nlpending = 1;
214 }
215
216 elsif (/^\.display asis\s*$/)
217 {
218 print OUT &mustquote(&deref($itemtext));
219 $itemtext = "";
220 print OUT "\n";
221 while (($_ = <IN>) !~ /^\.endd/)
222 {
223 print OUT &mustquote(" $_");
224 }
225 $nlpending = 1;
226 }
227
228 elsif (/^\s*$/)
229 {
230 print OUT &mustquote(&deref($itemtext));
231 $itemtext = "";
232 $nlpending++;
233 }
234
235 else
236 {
237 while ($nlpending > 0)
238 {
239 $itemtext .= "\n";
240 $nlpending--;
241 }
242 $itemtext .= &process($_);
243 }
244 }
245
246 print OUT &mustquote(&deref($itemtext));
247 print OUT ".TP\n";
248 }
249
250# End of g2man