xref: /onnv-gate/usr/src/cmd/perl/5.8.4/distrib/pod/podchecker.PL (revision 0:68f95e015346)
1#!/usr/local/bin/perl
2
3use Config;
4use File::Basename qw(&basename &dirname);
5use Cwd;
6
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
11#  $startperl
12# to ensure Configure will look for $Config{startperl}.
13
14# This forces PL files to create target in same directory as PL file.
15# This is so that make depend always knows where to find PL derivatives.
16$origdir = cwd;
17chdir(dirname($0));
18($file = basename($0)) =~ s/\.PL$//;
19$file =~ s/\.pl$//
20        if ($^O eq 'VMS' or $^O eq 'os2' or $^O eq 'dos');  # "case-forgiving"
21$file .= '.com' if $^O eq 'VMS';
22
23open OUT,">$file" or die "Can't create $file: $!";
24
25print "Extracting $file (with variable substitutions)\n";
26
27# In this section, perl variables will be expanded during extraction.
28# You can use $Config{...} to use Configure variables.
29
30print OUT <<"!GROK!THIS!";
31$Config{'startperl'}
32    eval 'exec perl -S \$0 "\$@"'
33        if 0;
34!GROK!THIS!
35
36# In the following, perl variables are not expanded during extraction.
37
38print OUT <<'!NO!SUBS!';
39#############################################################################
40# podchecker -- command to invoke the podchecker function in Pod::Checker
41#
42# Copyright (c) 1998-2000 by Bradford Appleton. All rights reserved.
43# This file is part of "PodParser". PodParser is free software;
44# you can redistribute it and/or modify it under the same terms
45# as Perl itself.
46#############################################################################
47
48use strict;
49#use diagnostics;
50
51=head1 NAME
52
53podchecker - check the syntax of POD format documentation files
54
55=head1 SYNOPSIS
56
57B<podchecker> [B<-help>] [B<-man>] [B<-(no)warnings>] [I<file>S< >...]
58
59=head1 OPTIONS AND ARGUMENTS
60
61=over 8
62
63=item B<-help>
64
65Print a brief help message and exit.
66
67=item B<-man>
68
69Print the manual page and exit.
70
71=item B<-warnings> B<-nowarnings>
72
73Turn on/off printing of warnings. Repeating B<-warnings> increases the
74warning level, i.e. more warnings are printed. Currently increasing to
75level two causes flagging of unescaped "E<lt>,E<gt>" characters.
76
77=item I<file>
78
79The pathname of a POD file to syntax-check (defaults to standard input).
80
81=back
82
83=head1 DESCRIPTION
84
85B<podchecker> will read the given input files looking for POD
86syntax errors in the POD documentation and will print any errors
87it find to STDERR. At the end, it will print a status message
88indicating the number of errors found.
89
90Directories are ignored, an appropriate warning message is printed.
91
92B<podchecker> invokes the B<podchecker()> function exported by B<Pod::Checker>
93Please see L<Pod::Checker/podchecker()> for more details.
94
95=head1 RETURN VALUE
96
97B<podchecker> returns a 0 (zero) exit status if all specified
98POD files are ok.
99
100=head1 ERRORS
101
102B<podchecker> returns the exit status 1 if at least one of
103the given POD files has syntax errors.
104
105The status 2 indicates that at least one of the specified
106files does not contain I<any> POD commands.
107
108Status 1 overrides status 2. If you want unambigouus
109results, call B<podchecker> with one single argument only.
110
111=head1 SEE ALSO
112
113L<Pod::Parser> and L<Pod::Checker>
114
115=head1 AUTHORS
116
117Brad Appleton E<lt>bradapp@enteract.comE<gt>,
118Marek Rouchal E<lt>marek@saftsack.fs.uni-bayreuth.deE<gt>
119
120Based on code for B<Pod::Text::pod2text(1)> written by
121Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
122
123=cut
124
125
126use Pod::Checker;
127use Pod::Usage;
128use Getopt::Long;
129
130## Define options
131my %options;
132
133## Parse options
134GetOptions(\%options, qw(help man warnings+ nowarnings))  ||  pod2usage(2);
135pod2usage(1)  if ($options{help});
136pod2usage(-verbose => 2)  if ($options{man});
137
138if($options{nowarnings}) {
139  $options{warnings} = 0;
140}
141elsif(!defined $options{warnings}) {
142  $options{warnings} = 1; # default is warnings on
143}
144
145## Dont default to STDIN if connected to a terminal
146pod2usage(2) if ((@ARGV == 0) && (-t STDIN));
147
148## Invoke podchecker()
149my $status = 0;
150@ARGV = qw(-) unless(@ARGV);
151for my $podfile (@ARGV) {
152    if($podfile eq '-') {
153      $podfile = "<&STDIN";
154    }
155    elsif(-d $podfile) {
156      warn "podchecker: Warning: Ignoring directory '$podfile'\n";
157      next;
158    }
159    my $errors =
160      podchecker($podfile, undef, '-warnings' => $options{warnings});
161    if($errors > 0) {
162        # errors occurred
163        $status = 1;
164        printf STDERR ("%s has %d pod syntax %s.\n",
165                       $podfile, $errors,
166                       ($errors == 1) ? "error" : "errors");
167    }
168    elsif($errors < 0) {
169        # no pod found
170        $status = 2 unless($status);
171        print STDERR "$podfile does not contain any pod commands.\n";
172    }
173    else {
174        print STDERR "$podfile pod syntax OK.\n";
175    }
176}
177exit $status;
178
179!NO!SUBS!
180
181close OUT or die "Can't close $file: $!";
182chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
183exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
184chdir $origdir;
185