4 use File::Basename qw(&basename &dirname);
7 # List explicitly here the variables you want Configure to
8 # generate. Metaconfig only looks for shell variables, so you
9 # have to mention them as if they were shell variables, not
10 # %Config entries. Thus you write
13 # to ensure Configure will look for $Config{startperl}.
15 # This forces PL files to create target in same directory as PL file.
16 # This is so that make depend always knows where to find PL derivatives.
19 $file = basename($0, '.PL');
20 $file .= '.com' if $^O eq 'VMS';
22 open OUT,">$file" or die "Can't create $file: $!";
24 print "Extracting $file (with variable substitutions)\n";
26 # In this section, perl variables will be expanded during extraction.
27 # You can use $Config{...} to use Configure variables.
29 print OUT <<"!GROK!THIS!";
31 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
32 if \$running_under_some_shell;
34 \$DEF_PM_SECTION = '$Config{man3ext}' || '3';
37 # In the following, perl variables are not expanded during extraction.
39 print OUT <<'!NO!SUBS!';
43 pod2man - translate embedded Perl pod directives into man pages
48 [ B<--section=>I<manext> ]
49 [ B<--release=>I<relpatch> ]
50 [ B<--center=>I<string> ]
51 [ B<--date=>I<string> ]
52 [ B<--fixed=>I<font> ]
59 B<pod2man> converts its input file containing embedded pod directives (see
60 L<perlpod>) into nroff source suitable for viewing with nroff(1) or
61 troff(1) using the man(7) macro set.
63 Besides the obvious pod conversions, B<pod2man> also takes care of
64 func(), func(n), and simple variable references like $foo or @bar so
65 you don't have to use code escapes for them; complex expressions like
66 C<$fred{'stuff'}> will still need to be escaped, though. Other nagging
67 little roffish things that it catches include translating the minus in
68 something like foo-bar, making a long dash--like this--into a real em
69 dash, fixing up "paired quotes", putting a little space after the
70 parens in something like func(), making C++ and PI look right, making
71 double underbars have a little tiny space between them, making ALLCAPS
72 a teeny bit smaller in troff(1), and escaping backslashes so you don't
81 Set the centered header to a specific string. The default is
82 "User Contributed Perl Documentation", unless the C<--official> flag is
83 given, in which case the default is "Perl Programmers Reference Guide".
87 Set the left-hand footer string to this value. By default,
88 the modification date of the input file will be used.
92 The fixed font to use for code refs. Defaults to CW.
96 Set the default header to indicate that this page is of
97 the standard release in case C<--center> is not given.
101 Set the centered footer. By default, this is the current
106 Set the section for the C<.TH> macro. The standard conventions on
107 sections are to use 1 for user commands, 2 for system calls, 3 for
108 functions, 4 for devices, 5 for file formats, 6 for games, 7 for
109 miscellaneous information, and 8 for administrator commands. This works
110 best if you put your Perl man pages in a separate tree, like
111 F</usr/local/perl/man/>. By default, section 1 will be used
112 unless the file ends in F<.pm> in which case section 3 will be selected.
116 Don't complain when required sections aren't present.
120 =head1 Anatomy of a Proper Man Page
122 For those not sure of the proper layout of a man page, here's
123 an example of the skeleton of a proper man page. Head of the
124 major headers should be setout as a C<=head1> directive, and
125 are historically written in the rather startling ALL UPPER CASE
126 format, although this is not mandatory.
127 Minor headers may be included using C<=head2>, and are
128 typically in mixed case.
134 Mandatory section; should be a comma-separated list of programs or
135 functions documented by this podpage, such as:
137 foo, bar - programs to do something
141 A short usage summary for programs and functions, which
142 may someday be deemed mandatory.
146 Long drawn out discussion of the program. It's a good idea to break this
147 up into subsections using the C<=head2> directives, like
149 =head2 A Sample Subection
151 =head2 Yet Another Sample Subection
155 Some people make this separate from the description.
159 What the program or function returns if successful.
163 Exceptions, return codes, exit stati, and errno settings.
167 Give some example uses of the program.
171 Envariables this program might care about.
175 All files used by the program. You should probably use the FE<lt>E<gt>
180 Other man pages to check out, like man(1), man(7), makewhatis(8), or catman(8).
184 Miscellaneous commentary.
188 Things to take special care with; sometimes called WARNINGS.
192 All possible messages the program can print out--and
197 Things that are broken or just don't work quite right.
201 Bugs you don't plan to fix :-)
205 Who wrote it (or AUTHORS if multiple).
209 Programs derived from other sources sometimes have this, or
210 you might keep a modification log here.
216 pod2man program > program.1
217 pod2man some_module.pm > /usr/perl/man/man3/some_module.3
218 pod2man --section=7 note.pod > note.7
222 The following diagnostics are generated by B<pod2man>. Items
223 marked "(W)" are non-fatal, whereas the "(F)" errors will cause
224 B<pod2man> to immediately exit with a non-zero status.
228 =item bad option in paragraph %d of %s: ``%s'' should be [%s]<%s>
230 (W) If you start include an option, you should set it off
231 as bold, italic, or code.
233 =item can't open %s: %s
235 (F) The input file wasn't available for the given reason.
237 =item Improper man page - no dash in NAME header in paragraph %d of %s
239 (W) The NAME header did not have an isolated dash in it. This is
240 considered important.
242 =item Invalid man page - no NAME line in %s
244 (F) You did not include a NAME header, which is essential.
246 =item roff font should be 1 or 2 chars, not `%s' (F)
248 (F) The font specified with the C<--fixed> option was not
249 a one- or two-digit roff font.
251 =item %s is missing required section: %s
253 (W) Required sections include NAME, DESCRIPTION, and if you're
254 using a section starting with a 3, also a SYNOPSIS. Actually,
255 not having a NAME is a fatal.
257 =item Unknown escape: %s in %s
259 (W) An unknown HTML entity (probably for an 8-bit character) was given via
260 a C<EE<lt>E<gt>> directive. Besides amp, lt, gt, and quot, recognized
261 entities are Aacute, aacute, Acirc, acirc, AElig, aelig, Agrave, agrave,
262 Aring, aring, Atilde, atilde, Auml, auml, Ccedil, ccedil, Eacute, eacute,
263 Ecirc, ecirc, Egrave, egrave, ETH, eth, Euml, euml, Iacute, iacute, Icirc,
264 icirc, Igrave, igrave, Iuml, iuml, Ntilde, ntilde, Oacute, oacute, Ocirc,
265 ocirc, Ograve, ograve, Oslash, oslash, Otilde, otilde, Ouml, ouml, szlig,
266 THORN, thorn, Uacute, uacute, Ucirc, ucirc, Ugrave, ugrave, Uuml, uuml,
267 Yacute, yacute, and yuml.
269 =item Unmatched =back
271 (W) You have a C<=back> without a corresponding C<=over>.
273 =item Unrecognized pod directive: %s
275 (W) You specified a pod directive that isn't in the known list of
276 C<=head1>, C<=head2>, C<=item>, C<=over>, C<=back>, or C<=cut>.
283 If you would like to print out a lot of man page continuously, you
284 probably want to set the C and D registers to set contiguous page
285 numbering and even/odd paging, at least on some versions of man(7).
286 Settting the F register will get you some additional experimental
289 troff -man -rC1 -rD1 -rF1 perl.1 perldata.1 perlsyn.1 ...
291 The indexing merely outputs messages via C<.tm> for each
292 major page, section, subsection, item, and any C<XE<lt>E<gt>>
302 The =over and =back directives don't really work right. They
303 take absolute positions instead of offsets, don't nest well, and
304 making people count is suboptimal in any event.
308 Original prototype by Larry Wall, but so massively hacked over by
309 Tom Christiansen such that Larry probably doesn't recognize it anymore.
317 # We try first to get the version number from a local binary, in case we're
318 # running an installed version of Perl to produce documentation from an
319 # uninstalled newer version's pod files.
320 if ($^O ne 'plan9' and $^O ne 'dos' and $^O ne 'os2' and $^O ne 'MSWin32') {
321 my $perl = (-x './perl' && -f './perl' ) ?
323 ((-x '../perl' && -f '../perl') ?
326 ($version,$patch) = `$perl -e 'print $]'` =~ /^(\d\.\d{3})(\d{2})?/ if $perl;
328 # No luck; we'll just go with the running Perl's version
329 ($version,$patch) = $] =~ /^(.{5})(\d{2})?/ unless $version;
330 $DEF_RELEASE = "perl $version";
331 $DEF_RELEASE .= ", patch $patch" if $patch;
336 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($secs);
337 my $mname = (qw{Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec})[$mon];
339 return "$mday/$mname/$year";
345 $DEF_CENTER = "User Contributed Perl Documentation";
346 $STD_CENTER = "Perl Programmers Reference Guide";
351 warn "$0: @_\n" if @_;
353 usage: $0 [options] podpage
355 --section=manext (default "$DEF_SECTION")
356 --release=relpatch (default "$DEF_RELEASE")
357 --center=string (default "$DEF_CENTER")
358 --date=string (default "$DEF_DATE")
359 --fixed=font (default "$DEF_FIXED")
360 --official (default NOT)
365 $uok = GetOptions( qw(
375 $DEF_DATE = makedate((stat($ARGV[0]))[9] || time());
377 usage("Usage error!") unless $uok;
378 usage() if $opt_help;
379 usage("Need one and only one podpage argument") unless @ARGV == 1;
381 $section = $opt_section || ($ARGV[0] =~ /\.pm$/
382 ? $DEF_PM_SECTION : $DEF_SECTION);
383 $RP = $opt_release || $DEF_RELEASE;
384 $center = $opt_center || ($opt_official ? $STD_CENTER : $DEF_CENTER);
385 $lax = $opt_lax || $DEF_LAX;
387 $CFont = $opt_fixed || $DEF_FIXED;
389 if (length($CFont) == 2) {
390 $CFont_embed = "\\f($CFont";
392 elsif (length($CFont) == 1) {
393 $CFont_embed = "\\f$CFont";
396 die "roff font should be 1 or 2 chars, not `$CFont_embed'";
399 $date = $opt_date || $DEF_DATE;
401 for (qw{NAME DESCRIPTION}) {
402 # for (qw{NAME DESCRIPTION AUTHOR}) {
405 $wanna_see{SYNOPSIS}++ if $section =~ /^3/;
408 $name = @ARGV ? $ARGV[0] : "<STDIN>";
410 if ($section =~ /^1/) {
411 require File::Basename;
412 $name = uc File::Basename::basename($name);
414 $name =~ s/\.(pod|p[lm])$//i;
416 # Lose everything up to the first of
417 # */lib/*perl* standard or site_perl module
418 # */*perl*/lib from -D prefix=/opt/perl
419 # */*perl*/ random module hierarchy
422 if ($name =~ s-^.*?/lib/[^/]*perl[^/]*/--i
423 or $name =~ s-^.*?/[^/]*perl[^/]*/lib/--i
424 or $name =~ s-^.*?/[^/]*perl[^/]*/--i) {
425 # Lose ^site(_perl)?/.
426 $name =~ s-^site(_perl)?/--;
427 # Lose ^arch/. (XXX should we use Config? Just for archname?)
428 $name =~ s~^(.*-$^O|$^O-.*)/~~o;
430 $name =~ s-^\d+\.\d+/--;
433 # Translate Getopt/Long to Getopt::Long, etc.
436 if ($name ne 'something') {
438 open(F, "< $ARGV[0]") || die "can't open $ARGV[0]: $!";
441 if (/^=head1\s+NAME\s*$/) { # an /m would forgive mistakes
443 unless (/\s*-+\s+/) {
445 warn "$0: Improper man page - no dash in NAME header in paragraph $. of $ARGV[0]\n"
447 my @n = split /\s+-+\s+/;
450 warn "$0: Improper man page - malformed NAME header in paragraph $. of $ARGV[0]\n"
458 next if /^=cut\b/; # DB_File and Net::Ping have =cut before NAME
459 next if /^=pod\b/; # It is OK to have =pod before NAME
460 die "$0: Invalid man page - 1st pod line is not NAME in $ARGV[0]\n" unless $lax;
462 die "$0: Invalid man page - no documentation in $ARGV[0]\n" unless $lax;
469 ''' \$RCSfile\$\$Revision\$\$Date\$
487 .ie \\\\n(.\$>=3 .ne \\\\\$3
489 .IP "\\\\\$1" \\\\\$2
503 ''' Set up \\*(-- to give an unbreakable dash;
504 ''' string Tr holds user defined translation string.
505 ''' Bell System Logo is used as a dummy character.
507 .tr \\(*W-|\\(bv\\*(Tr
511 .if (\\n(.H=4u)&(1m=24u) .ds -- \\(*W\\h'-12u'\\(*W\\h'-12u'-\\" diablo 10 pitch
512 .if (\\n(.H=4u)&(1m=20u) .ds -- \\(*W\\h'-12u'\\(*W\\h'-8u'-\\" diablo 12 pitch
515 ''' \\*(M", \\*(S", \\*(N" and \\*(T" are the equivalent of
516 ''' \\*(L" and \\*(R", except that they are used on ".xx" lines,
517 ''' such as .IP and .SH, which do another additional levels of
518 ''' double-quote interpretation
550 .\" If the F register is turned on, we'll generate
551 .\" index entries out stderr for the following things:
556 .\" X<> Xref (embedded
557 .\" Of course, you have to process the output yourself
558 .\" in some meaninful fashion.
561 .tm Index:\\$1\t\\n%\t"\\$2"
569 .TH $name $section "$RP" "$date" "$center"
573 push(@Indices, qq{.IX Title "$name $section"});
575 while (($name, $desc) = each %namedesc) {
576 for ($name, $desc) { s/^\s+//; s/\s+$//; }
577 push(@Indices, qq(.IX Name "$name - $desc"\n));
583 .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
584 .de CQ \" put $1 in typewriter font
586 print ".ft $CFont\n";
592 \\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7
595 .\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2
596 . \" AM - accent mark definitions
598 . \" fudge factors for nroff and troff
607 . ds #H ((1u-(\\\\n(.fu%2u))*.13m)
613 . \" simple accents for nroff and troff
626 . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
627 . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
628 . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
629 . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
630 . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
631 . ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10'
632 . ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m'
633 . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
634 . ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10'
636 . \" troff and (daisy-wheel) nroff accents
637 .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
638 .ds 8 \h'\*(#H'\(*b\h'-\*(#H'
639 .ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#]
640 .ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u'
641 .ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u'
642 .ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#]
643 .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
644 .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
645 .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
646 .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
647 .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
648 .ds ae a\h'-(\w'a'u*4/10)'e
649 .ds Ae A\h'-(\w'A'u*4/10)'E
650 .ds oe o\h'-(\w'o'u*4/10)'e
651 .ds Oe O\h'-(\w'O'u*4/10)'E
652 . \" corrections for vroff
653 .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
654 .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
655 . \" for low resolution devices (crt and lpr)
656 .if \n(.H>23 .if \n(.V>19 \
660 . ds v \h'-1'\o'\(aa\(ga'
681 # Unrolling [^-=A-Z>]|[A-Z](?!<)|[-=](?![A-Z]<)[\x00-\xFF] gives: // MRE pp 165.
682 my $nonest = '(?x) # Turn on /x mode.
684 [^-=A-Z>]* # Anything that isn't a dash, equal sign or
685 # closing hook isn't special. Eat as much as
689 [-=] # We want to recognize -> and =>.
690 (?![A-Z]<) # So, as long as it isn't followed by markup
691 [\x00-\xFF] # anything may follow - and =
693 [A-Z] # Capitals are fine too,
694 (?!<) # But not if they start markup.
695 ) # End of special sequences.
696 [^-=A-Z>]* # Followed by zero or more non-special chars.
697 )* # And we can repeat this as often as we can.
698 )'; # That's all folks.
706 if (/^=end\s+$begun/) {
709 elsif ($begun =~ /^(roff|man)$/) {
716 # Translate verbatim paragraph
719 @lines = split(/\n/);
722 {^( [^\t]* ) \t ( \t* ) }
723 { $1 . ' ' x (8 - (length($1)%8) + 8 * (length($2))) }ex;
728 makespace() unless $verbatim++;
729 print ".Vb $lines\n";
730 print join("\n", @lines), "\n";
738 if (/^=for\s+(\S+)\s*/s) {
739 if ($1 eq "man" or $1 eq "roff") {
740 print STDOUT $',"\n\n";
746 elsif (/^=begin\s+(\S+)\s*/s) {
748 if ($1 eq "man" or $1 eq "roff") {
749 print STDOUT $'."\n\n";
754 # check for things that'll hosed our noremap scheme; affects $_
759 # trofficate backslashes; must do it before what happens below
760 s/\\/noremap('\\e')/ge;
762 # protect leading periods and quotes against *roff
763 # mistaking them for directives
764 s/^(?:[A-Z]<)?[.']/\\&$&/gm;
766 # first hide the escapes in case we need to
767 # intuit something and get it wrong due to fmting
769 1 while s/([A-Z]<$nonest>)/noremap($1)/ge;
771 # func() is a reference to a perl function
779 # func(n) is a reference to a perl function or a man page
787 # convert simple variable references
788 s/(\s+)([\$\@%][\w:]+)(?!\()/${1}C<$2>/g;
798 }x && $` !~ /([LCI]<[^<>]*|-)$/ && !/^=\w/)
800 warn "$0: bad option in paragraph $. of $ARGV: ``$1'' should be [LCI]<$1>\n";
804 while (/(-[a-zA-Z])\b/g && $` !~ /[\w\-]$/) {
805 warn "$0: bad option in paragraph $. of $ARGV: ``$1'' should be [CB]<$1>\n";
809 # put it back so we get the <> processed again;
810 clear_noremap(0); # 0 means leave the E's
813 # trofficate backslashes
814 s/\\/noremap('\\e')/ge;
818 # need to hide E<> first; they're processed in clear_noremap
819 s/(E<[^<>]+>)/noremap($1)/ge;
823 while ($maxnest-- && /[A-Z]</) {
825 # can't do C font here
826 s/([BI])<($nonest)>/font($1) . $2 . font('R')/eg;
828 # files and filelike refs in italics
829 s/F<($nonest)>/I<$1>/g;
831 # no break -- usually we want C<> for this
832 s/S<($nonest)>/nobreak($1)/eg;
834 # LREF: a la HREF L<show this text|man/section>
835 s:L<([^|>]+)\|[^>]+>:$1:g;
837 # LREF: a manpage(3f)
838 s:L<([a-zA-Z][^\s\/]+)(\([^\)]+\))?>:the I<$1>$2 manpage:g;
840 # LREF: an =item on another manpage
850 } {the C<$2> entry in the I<$1> manpage}gx;
852 # LREF: an =item on this manpage
864 } { internal_lrefs($1) }gex;
866 # LREF: a =head2 (head1?), maybe on a manpage, maybe right here
867 # the "func" can disambiguate
877 $1 # if no $1, assume it means on this page.
878 ? "the section on I<$2> in the I<$1> manpage"
879 : "the section on I<$2>"
881 }gesx; # s in case it goes over multiple lines, so . matches \n
885 # comes last because not subject to reprocessing
886 s/C<($nonest)>/noremap("${CFont_embed}${1}\\fR")/eg;
890 $needspace = 0; # Assume this.
894 ($Cmd, $_) = split(' ', $_, 2);
897 if ($Cmd eq 'head1') {
900 elsif ($Cmd eq 'head2') {
903 elsif ($Cmd eq 'item') {
917 elsif ($Cmd eq 'head1') {
919 delete $wanna_see{$_} if exists $wanna_see{$_};
920 print qq{.SH "$_"\n};
921 push(@Indices, qq{.IX Header "$_"\n});
923 elsif ($Cmd eq 'head2') {
924 print qq{.Sh "$_"\n};
925 push(@Indices, qq{.IX Subsection "$_"\n});
927 elsif ($Cmd eq 'over') {
928 push(@indent,$indent);
929 $indent += ($_ + 0) || 5;
931 elsif ($Cmd eq 'back') {
932 $indent = pop(@indent);
933 warn "$0: Unmatched =back in paragraph $. of $ARGV\n" unless defined $indent;
936 elsif ($Cmd eq 'item') {
937 s/^\*( |$)/\\(bu$1/g;
938 # if you know how to get ":s please do
939 s/\\\*\(L"([^"]+?)\\\*\(R"/'$1'/g;
940 s/\\\*\(L"([^"]+?)""/'$1'/g;
941 s/[^"]""([^"]+?)""[^"]/'$1'/g;
942 # here do something about the $" in perlvar?
943 print STDOUT qq{.Ip "$_" $indent\n};
944 push(@Indices, qq{.IX Item "$_"\n});
946 elsif ($Cmd eq 'pod') {
947 # this is just a comment
950 warn "$0: Unrecognized pod directive in paragraph $. of $ARGV: $Cmd\n";
969 if (%wanna_see && !$lax) {
970 @missing = keys %wanna_see;
971 warn "$0: $Filename is missing required section"
972 . (@missing > 1 && "s")
977 foreach (@Indices) { print "$_\n"; }
982 #########################################################################
986 $string =~ s/ /\\ /g;
993 s/X<(.*?)>/mkindex($1)/ge;
995 # translate the minus in foo-bar into foo\-bar for roff
996 s/([^0-9a-z-])-([^-])/$1\\-$2/g;
998 # make -- into the string version \*(-- (defined above)
1000 s/"--([^"])/"\\*(--$1/g; # should be a better way
1001 s/([^"])--"/$1\\*(--"/g;
1003 # fix up quotes; this is somewhat tricky
1004 my $dotmacroL = 'L';
1005 my $dotmacroR = 'R';
1006 if ( $indot == 1 ) {
1010 elsif ( $indot >= 2 ) {
1015 s/(^|\s)(['"])/noremap("$1\\*($dotmacroL$2")/ge;
1016 s/(['"])($|[\-\s,;\\!?.])/noremap("\\*($dotmacroR$1$2")/ge;
1019 #s/(?!")(?:.)--(?!")(?:.)/\\*(--/g;
1020 #s/(?:(?!")(?:.)--(?:"))|(?:(?:")--(?!")(?:.))/\\*(--/g;
1023 # make sure that func() keeps a bit a space tween the parens
1024 ### s/\b\(\)/\\|()/g;
1025 ### s/\b\(\)/(\\|)/g;
1027 # make C++ into \*C+, which is a squinched version (defined above)
1030 # make double underbars have a little tiny space between them
1033 # PI goes to \*(PI (defined above)
1034 s/\bPI\b/noremap('\\*(PI')/ge;
1036 # make all caps a teeny bit smaller, but don't muck with embedded code literals
1037 my $hidCFont = font('C');
1038 if ($Cmd !~ /^head1/) { # SH already makes smaller
1039 # /g isn't enough; 1 while or we'll be off
1042 # (?!$hidCFont)(..|^.|^)
1045 # [A-Z][\/A-Z+:\-\d_$.]+
1049 # } {$1\\s-1$2\\s0}gmox;
1052 (?!$hidCFont)(..|^.|^)
1054 \b[A-Z]{2,}[\/A-Z+:\-\d_\$]*\b
1057 $1 . noremap( '\\s-1' . $2 . '\\s0' )
1063 # make troff just be normal, but make small nroff get quoted
1064 # decided to just put the quotes in the text; sigh;
1066 local($_,$prev) = @_;
1067 noremap(qq{.CQ "$_" \n\\&});
1081 my @entries = split m:\s*/\s*:, $entry;
1082 push @Indices, ".IX Xref " . join ' ', map {qq("$_")} @entries;
1087 local($font) = shift;
1088 return '\\f' . noremap($font);
1092 local($thing_to_hide) = shift;
1093 $thing_to_hide =~ tr/\000-\177/\200-\377/;
1094 return $thing_to_hide;
1098 # escape high bit characters in input stream
1099 s/([\200-\377])/"E<".ord($1).">"/ge;
1103 my $ready_to_print = $_[0];
1105 tr/\200-\377/\000-\177/;
1107 # trofficate backslashes
1108 # s/(?!\\e)(?:..|^.|^)\\/\\e/g;
1110 # now for the E<>s, which have been hidden until now
1111 # otherwise the interative \w<> processing would have
1112 # been hosed by the E<gt>
1125 exists $HTML_Escapes{$3}
1126 ? do { $HTML_Escapes{$3} }
1128 warn "$0: Unknown escape in paragraph $. of $ARGV: ``$&''\n";
1132 }egx if $ready_to_print;
1135 sub internal_lrefs {
1137 local $trailing_and = s/and\s+$// ? "and " : "";
1139 s{L</([^>]+)>}{$1}g;
1140 my(@items) = split( /(?:,?\s+(?:and\s+)?)/ );
1141 my $retstr = "the ";
1143 for ($i = 0; $i <= $#items; $i++) {
1144 $retstr .= "C<$items[$i]>";
1145 $retstr .= ", " if @items > 2 && $i != $#items;
1146 $retstr .= " and " if $i+2 == @items;
1149 $retstr .= " entr" . ( @items > 1 ? "ies" : "y" )
1150 . " elsewhere in this document";
1151 # terminal space to avoid words running together (pattern used
1152 # strips terminal spaces)
1153 $retstr .= " " if length $trailing_and;
1154 $retstr .= $trailing_and;
1162 'amp' => '&', # ampersand
1163 'lt' => '<', # left chevron, less-than
1164 'gt' => '>', # right chevron, greater-than
1165 'quot' => '"', # double quote
1167 "Aacute" => "A\\*'", # capital A, acute accent
1168 "aacute" => "a\\*'", # small a, acute accent
1169 "Acirc" => "A\\*^", # capital A, circumflex accent
1170 "acirc" => "a\\*^", # small a, circumflex accent
1171 "AElig" => '\*(AE', # capital AE diphthong (ligature)
1172 "aelig" => '\*(ae', # small ae diphthong (ligature)
1173 "Agrave" => "A\\*`", # capital A, grave accent
1174 "agrave" => "A\\*`", # small a, grave accent
1175 "Aring" => 'A\\*o', # capital A, ring
1176 "aring" => 'a\\*o', # small a, ring
1177 "Atilde" => 'A\\*~', # capital A, tilde
1178 "atilde" => 'a\\*~', # small a, tilde
1179 "Auml" => 'A\\*:', # capital A, dieresis or umlaut mark
1180 "auml" => 'a\\*:', # small a, dieresis or umlaut mark
1181 "Ccedil" => 'C\\*,', # capital C, cedilla
1182 "ccedil" => 'c\\*,', # small c, cedilla
1183 "Eacute" => "E\\*'", # capital E, acute accent
1184 "eacute" => "e\\*'", # small e, acute accent
1185 "Ecirc" => "E\\*^", # capital E, circumflex accent
1186 "ecirc" => "e\\*^", # small e, circumflex accent
1187 "Egrave" => "E\\*`", # capital E, grave accent
1188 "egrave" => "e\\*`", # small e, grave accent
1189 "ETH" => '\\*(D-', # capital Eth, Icelandic
1190 "eth" => '\\*(d-', # small eth, Icelandic
1191 "Euml" => "E\\*:", # capital E, dieresis or umlaut mark
1192 "euml" => "e\\*:", # small e, dieresis or umlaut mark
1193 "Iacute" => "I\\*'", # capital I, acute accent
1194 "iacute" => "i\\*'", # small i, acute accent
1195 "Icirc" => "I\\*^", # capital I, circumflex accent
1196 "icirc" => "i\\*^", # small i, circumflex accent
1197 "Igrave" => "I\\*`", # capital I, grave accent
1198 "igrave" => "i\\*`", # small i, grave accent
1199 "Iuml" => "I\\*:", # capital I, dieresis or umlaut mark
1200 "iuml" => "i\\*:", # small i, dieresis or umlaut mark
1201 "Ntilde" => 'N\*~', # capital N, tilde
1202 "ntilde" => 'n\*~', # small n, tilde
1203 "Oacute" => "O\\*'", # capital O, acute accent
1204 "oacute" => "o\\*'", # small o, acute accent
1205 "Ocirc" => "O\\*^", # capital O, circumflex accent
1206 "ocirc" => "o\\*^", # small o, circumflex accent
1207 "Ograve" => "O\\*`", # capital O, grave accent
1208 "ograve" => "o\\*`", # small o, grave accent
1209 "Oslash" => "O\\*/", # capital O, slash
1210 "oslash" => "o\\*/", # small o, slash
1211 "Otilde" => "O\\*~", # capital O, tilde
1212 "otilde" => "o\\*~", # small o, tilde
1213 "Ouml" => "O\\*:", # capital O, dieresis or umlaut mark
1214 "ouml" => "o\\*:", # small o, dieresis or umlaut mark
1215 "szlig" => '\*8', # small sharp s, German (sz ligature)
1216 "THORN" => '\\*(Th', # capital THORN, Icelandic
1217 "thorn" => '\\*(th',, # small thorn, Icelandic
1218 "Uacute" => "U\\*'", # capital U, acute accent
1219 "uacute" => "u\\*'", # small u, acute accent
1220 "Ucirc" => "U\\*^", # capital U, circumflex accent
1221 "ucirc" => "u\\*^", # small u, circumflex accent
1222 "Ugrave" => "U\\*`", # capital U, grave accent
1223 "ugrave" => "u\\*`", # small u, grave accent
1224 "Uuml" => "U\\*:", # capital U, dieresis or umlaut mark
1225 "uuml" => "u\\*:", # small u, dieresis or umlaut mark
1226 "Yacute" => "Y\\*'", # capital Y, acute accent
1227 "yacute" => "y\\*'", # small y, acute accent
1228 "yuml" => "y\\*:", # small y, dieresis or umlaut mark
1234 close OUT or die "Can't close $file: $!";
1235 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1236 exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';