h2xs grammar nit
[p5sagit/p5-mst-13.2.git] / utils / perldoc.PL
CommitLineData
4633a7c4 1#!/usr/local/bin/perl
2
3use Config;
4use File::Basename qw(&basename &dirname);
8a5546a1 5use Cwd;
4633a7c4 6
85880f03 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
4633a7c4 11# $startperl
85880f03 12# to ensure Configure will look for $Config{startperl}.
4633a7c4 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.
8a5546a1 16$origdir = cwd;
44a8e56a 17chdir dirname($0);
18$file = basename($0, '.PL');
774d564b 19$file .= '.com' if $^O eq 'VMS';
4633a7c4 20
21open OUT,">$file" or die "Can't create $file: $!";
22
23print "Extracting $file (with variable substitutions)\n";
24
25# In this section, perl variables will be expanded during extraction.
26# You can use $Config{...} to use Configure variables.
27
85880f03 28print OUT <<"!GROK!THIS!";
5f05dabc 29$Config{startperl}
30 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
c5ae3962 31 if 0;
55497cff 32
8167b455 33use warnings;
c5ae3962 34use strict;
8167b455 35
36# make sure creat()s are neither too much nor too little
37INIT { eval { umask(0077) } } # doubtless someone has no mask
38
ed6d8ea1 39(my \$pager = <<'/../') =~ s/\\s*\\z//;
40$Config{pager}
41/../
c5ae3962 42my \@pagers = ();
ed6d8ea1 43push \@pagers, \$pager if -x \$pager;
44
45(my \$bindir = <<'/../') =~ s/\\s*\\z//;
46$Config{scriptdir}
47/../
8167b455 48
4633a7c4 49!GROK!THIS!
50
51# In the following, perl variables are not expanded during extraction.
52
53print OUT <<'!NO!SUBS!';
54
8167b455 55use Fcntl; # for sysopen
56use Getopt::Std;
57use Config '%Config';
14178d34 58use File::Spec::Functions qw(catfile splitdir);
8167b455 59
4633a7c4 60#
61# Perldoc revision #1 -- look up a piece of documentation in .pod format that
62# is embedded in the perl installation tree.
63#
8167b455 64# This is not to be confused with Tom Christiansen's perlman, which is a
4633a7c4 65# man replacement, written in perl. This perldoc is strictly for reading
66# the perl manuals, though it too is written in perl.
8167b455 67#
68# Massive security and correctness patches applied to this
69# noisome program by Tom Christiansen Sat Mar 11 15:22:33 MST 2000
4633a7c4 70
febd60db 71if (@ARGV<1) {
c5ae3962 72 my $me = $0; # Editing $0 is unportable
fb73857a 73 $me =~ s,.*/,,;
4633a7c4 74 die <<EOF;
a85d71bc 75Usage: $me [-h] [-r] [-i] [-v] [-t] [-u] [-m] [-n program] [-l] [-F] [-X] PageName|ModuleName|ProgramName
0b166b66 76 $me -f PerlFunc
a3cb178b 77 $me -q FAQKeywords
4633a7c4 78
89b8affa 79The -h option prints more help. Also try "perldoc perldoc" to get
54884818 80acquainted with the system.
4633a7c4 81EOF
82}
83
c5ae3962 84my @global_found = ();
85my $global_target = "";
fb73857a 86
c5ae3962 87my $Is_VMS = $^O eq 'VMS';
88my $Is_MSWin32 = $^O eq 'MSWin32';
89my $Is_Dos = $^O eq 'dos';
6dbadf30 90my $Is_OS2 = $^O eq 'os2';
4633a7c4 91
92sub usage{
ff0cee69 93 warn "@_\n" if @_;
94 # Erase evidence of previous errors (if any), so exit status is simple.
95 $! = 0;
4633a7c4 96 die <<EOF;
31bdbec1 97perldoc [options] PageName|ModuleName|ProgramName...
98perldoc [options] -f BuiltinFunction
a3cb178b 99perldoc [options] -q FAQRegex
31bdbec1 100
101Options:
137443ea 102 -h Display this help message
5315ba28 103 -r Recursive search (slow)
febd60db 104 -i Ignore case
137443ea 105 -t Display pod using pod2text instead of pod2man and nroff
106 (-t is the default on win32)
85880f03 107 -u Display unformatted pod text
a3cb178b 108 -m Display module's file in its entirety
a85d71bc 109 -n Specify replacement for nroff
a3cb178b 110 -l Display the module's file name
cce34969 111 -F Arguments are file names, not modules
137443ea 112 -v Verbosely describe what's going on
89b8affa 113 -X use index if present (looks for pod.idx at $Config{archlib})
54ac30b1 114 -q Search the text of questions (not answers) in perlfaq[1-9]
c185d8c4 115 -U Run in insecure mode (superuser only)
a3cb178b 116
4633a7c4 117PageName|ModuleName...
febd60db 118 is the name of a piece of documentation that you want to look at. You
4633a7c4 119 may either give a descriptive name of the page (as in the case of
febd60db 120 `perlfunc') the name of a module, either like `Term::Info',
121 `Term/Info', the partial name of a module, like `info', or
4633a7c4 122 `makemaker', or the name of a program, like `perldoc'.
31bdbec1 123
124BuiltinFunction
125 is the name of a perl function. Will extract documentation from
126 `perlfunc'.
a3cb178b 127
128FAQRegex
129 is a regex. Will search perlfaq[1-9] for and extract any
130 questions that match.
131
febd60db 132Any switches in the PERLDOC environment variable will be used before the
89b8affa 133command line arguments. The optional pod index file contains a list of
134filenames, one per line.
4633a7c4 135
136EOF
137}
138
febd60db 139if (defined $ENV{"PERLDOC"}) {
c5ae3962 140 require Text::ParseWords;
141 unshift(@ARGV, Text::ParseWords::shellwords($ENV{"PERLDOC"}));
142}
143!NO!SUBS!
144
c185d8c4 145my $getopts = "mhtluvriFf:Xq:n:U";
c5ae3962 146print OUT <<"!GET!OPTS!";
4633a7c4 147
c5ae3962 148use vars qw( @{[map "\$opt_$_", ($getopts =~ /\w/g)]} );
4633a7c4 149
c5ae3962 150getopts("$getopts") || usage;
151!GET!OPTS!
4633a7c4 152
c5ae3962 153print OUT <<'!NO!SUBS!';
85880f03 154
c5ae3962 155usage if $opt_h;
c185d8c4 156
157# refuse to run if we should be tainting and aren't
158# (but regular users deserve protection too, though!)
6dbadf30 159if (!($Is_VMS || $Is_MSWin32 || $Is_Dos || $Is_OS2) && ($> == 0 || $< == 0)
c185d8c4 160 && !am_taint_checking())
161{{
162 if ($opt_U) {
163 my $id = eval { getpwnam("nobody") };
164 $id = eval { getpwnam("nouser") } unless defined $id;
165 $id = -2 unless defined $id;
166 eval {
167 $> = $id; # must do this one first!
168 $< = $id;
169 };
170 last if !$@ && $< && $>;
171 }
172 die "Superuser must not run $0 without security audit and taint checks.\n";
173}}
174
a85d71bc 175$opt_n = "nroff" if !$opt_n;
4633a7c4 176
c5ae3962 177my $podidx;
febd60db 178if ($opt_X) {
0d3da1c8 179 $podidx = "$Config{'archlib'}/pod.idx";
180 $podidx = "" unless -f $podidx && -r _ && -M _ <= 7;
181}
89b8affa 182
8167b455 183if ((my $opts = do{ no warnings; $opt_t + $opt_u + $opt_m + $opt_l }) > 1) {
137443ea 184 usage("only one of -t, -u, -m or -l")
febd60db 185}
d49321e7 186elsif ($Is_MSWin32
187 || $Is_Dos
8167b455 188 || !($ENV{TERM} && $ENV{TERM} !~ /dumb|emacs|none|unknown/i))
d49321e7 189{
8167b455 190 $opt_t = 1 unless $opts;
137443ea 191}
4633a7c4 192
7eda7aea 193if ($opt_t) { require Pod::Text; import Pod::Text; }
4633a7c4 194
c5ae3962 195my @pages;
31bdbec1 196if ($opt_f) {
febd60db 197 @pages = ("perlfunc");
198}
199elsif ($opt_q) {
200 @pages = ("perlfaq1" .. "perlfaq9");
201}
202else {
203 @pages = @ARGV;
31bdbec1 204}
205
fb73857a 206# Does this look like a module or extension directory?
207if (-f "Makefile.PL") {
8167b455 208
209 # Add ., lib to @INC (if they exist)
210 eval q{ use lib qw(. lib); 1; } or die;
211
212 # don't add if superuser
aafed681 213 if ($< && $> && -f "blib") { # don't be looking too hard now!
6d0835e5 214 eval q{ use blib; 1 };
215 warn $@ if $@ && $opt_v;
8167b455 216 }
fb73857a 217}
218
4633a7c4 219sub containspod {
fb73857a 220 my($file, $readit) = @_;
8167b455 221 return 1 if !$readit && $file =~ /\.pod\z/i;
fb73857a 222 local($_);
8167b455 223 open(TEST,"<", $file) or die "Can't open $file: $!";
febd60db 224 while (<TEST>) {
225 if (/^=head/) {
8167b455 226 close(TEST) or die "Can't close $file: $!";
fb73857a 227 return 1;
4633a7c4 228 }
fb73857a 229 }
8167b455 230 close(TEST) or die "Can't close $file: $!";
fb73857a 231 return 0;
4633a7c4 232}
233
84902520 234sub minus_f_nocase {
5315ba28 235 my($dir,$file) = @_;
14178d34 236 my $path = catfile($dir,$file);
5315ba28 237 return $path if -f $path and -r _;
238 if (!$opt_i or $Is_VMS or $Is_MSWin32 or $Is_Dos or $^O eq 'os2') {
febd60db 239 # on a case-forgiving file system or if case is important
5315ba28 240 # that is it all we can do
0cf744f2 241 warn "Ignored $path: unreadable\n" if -f _;
fb73857a 242 return '';
84902520 243 }
4633a7c4 244 local *DIR;
8167b455 245 # this is completely wicked. don't mess with $", and if
246 # you do, don't assume / is the dirsep!
4633a7c4 247 local($")="/";
5315ba28 248 my @p = ($dir);
249 my($p,$cip);
14178d34 250 foreach $p (splitdir $file){
251 my $try = catfile @p, $p;
fb73857a 252 stat $try;
febd60db 253 if (-d _) {
4633a7c4 254 push @p, $p;
fb73857a 255 if ( $p eq $global_target) {
14178d34 256 my $tmp_path = catfile @p;
fb73857a 257 my $path_f = 0;
258 for (@global_found) {
259 $path_f = 1 if $_ eq $tmp_path;
260 }
261 push (@global_found, $tmp_path) unless $path_f;
262 print STDERR "Found as @p but directory\n" if $opt_v;
263 }
febd60db 264 }
265 elsif (-f _ && -r _) {
fb73857a 266 return $try;
febd60db 267 }
268 elsif (-f _) {
fb73857a 269 warn "Ignored $try: unreadable\n";
febd60db 270 }
8167b455 271 elsif (-d "@p") {
4633a7c4 272 my $found=0;
273 my $lcp = lc $p;
8167b455 274 opendir DIR, "@p" or die "opendir @p: $!";
4633a7c4 275 while ($cip=readdir(DIR)) {
276 if (lc $cip eq $lcp){
277 $found++;
278 last;
279 }
280 }
8167b455 281 closedir DIR or die "closedir @p: $!";
4633a7c4 282 return "" unless $found;
283 push @p, $cip;
fb73857a 284 return "@p" if -f "@p" and -r _;
0cf744f2 285 warn "Ignored @p: unreadable\n" if -f _;
4633a7c4 286 }
287 }
5315ba28 288 return "";
fb73857a 289}
eb459f90 290
fb73857a 291
292sub check_file {
5315ba28 293 my($dir,$file) = @_;
7ec2cea4 294 return "" if length $dir and not -d $dir;
3046dd9f 295 if ($opt_m) {
5315ba28 296 return minus_f_nocase($dir,$file);
febd60db 297 }
298 else {
5315ba28 299 my $path = minus_f_nocase($dir,$file);
249edfdf 300 return $path if length $path and containspod($path);
3046dd9f 301 }
5315ba28 302 return "";
fb73857a 303}
304
305
306sub searchfor {
307 my($recurse,$s,@dirs) = @_;
308 $s =~ s!::!/!g;
309 $s = VMS::Filespec::unixify($s) if $Is_VMS;
310 return $s if -f $s && containspod($s);
311 printf STDERR "Looking for $s in @dirs\n" if $opt_v;
312 my $ret;
313 my $i;
314 my $dir;
14178d34 315 $global_target = (splitdir $s)[-1]; # XXX: why not use File::Basename?
fb73857a 316 for ($i=0; $i<@dirs; $i++) {
317 $dir = $dirs[$i];
8167b455 318 ($dir = VMS::Filespec::unixpath($dir)) =~ s!/\z!! if $Is_VMS;
5315ba28 319 if ( ( $ret = check_file $dir,"$s.pod")
320 or ( $ret = check_file $dir,"$s.pm")
321 or ( $ret = check_file $dir,$s)
fb73857a 322 or ( $Is_VMS and
5315ba28 323 $ret = check_file $dir,"$s.com")
febd60db 324 or ( $^O eq 'os2' and
5315ba28 325 $ret = check_file $dir,"$s.cmd")
0151c6ef 326 or ( ($Is_MSWin32 or $Is_Dos or $^O eq 'os2') and
5315ba28 327 $ret = check_file $dir,"$s.bat")
328 or ( $ret = check_file "$dir/pod","$s.pod")
329 or ( $ret = check_file "$dir/pod",$s)
7ec2cea4 330 or ( $ret = check_file "$dir/pods","$s.pod")
331 or ( $ret = check_file "$dir/pods",$s)
fb73857a 332 ) {
333 return $ret;
334 }
eb459f90 335
fb73857a 336 if ($recurse) {
8167b455 337 opendir(D,$dir) or die "Can't opendir $dir: $!";
14178d34 338 my @newdirs = map catfile($dir, $_), grep {
8167b455 339 not /^\.\.?\z/s and
340 not /^auto\z/s and # save time! don't search auto dirs
14178d34 341 -d catfile($dir, $_)
fb73857a 342 } readdir D;
8167b455 343 closedir(D) or die "Can't closedir $dir: $!";
fb73857a 344 next unless @newdirs;
8167b455 345 # what a wicked map!
346 @newdirs = map((s/\.dir\z//,$_)[1],@newdirs) if $Is_VMS;
fb73857a 347 print STDERR "Also looking in @newdirs\n" if $opt_v;
348 push(@dirs,@newdirs);
349 }
350 }
351 return ();
352}
4633a7c4 353
eb459f90 354sub filter_nroff {
355 my @data = split /\n{2,}/, shift;
356 shift @data while @data and $data[0] !~ /\S/; # Go to header
357 shift @data if @data and $data[0] =~ /Contributed\s+Perl/; # Skip header
358 pop @data if @data and $data[-1] =~ /^\w/; # Skip footer, like
359 # 28/Jan/99 perl 5.005, patch 53 1
360 join "\n\n", @data;
361}
362
febd60db 363sub page {
364 my ($tmp, $no_tty, @pagers) = @_;
365 if ($no_tty) {
8167b455 366 open(TMP,"<", $tmp) or die "Can't open $tmp: $!";
367 local $_;
368 while (<TMP>) {
369 print or die "Can't print to stdout: $!";
370 }
371 close TMP or die "Can't close while $tmp: $!";
febd60db 372 }
373 else {
374 foreach my $pager (@pagers) {
e0d5f7b4 375 if ($Is_VMS) {
376 last if system("$pager $tmp") == 0; # quoting prevents logical expansion
377 } else {
a79ff105 378 last if system("$pager \"$tmp\"") == 0;
e0d5f7b4 379 }
febd60db 380 }
381 }
382}
383
384sub cleanup {
385 my @files = @_;
386 for (@files) {
6a43d2f9 387 next unless defined;
8167b455 388 if ($Is_VMS) {
389 1 while unlink($_); # XXX: expect failure
390 } else {
391 unlink($_); # or die "Can't unlink $_: $!";
392 }
febd60db 393 }
394}
395
c5ae3962 396my @found;
4633a7c4 397foreach (@pages) {
febd60db 398 if ($podidx && open(PODIDX, $podidx)) {
14178d34 399 my $searchfor = catfile split '::';
febd60db 400 print STDERR "Searching for '$searchfor' in $podidx\n" if $opt_v;
8167b455 401 local $_;
febd60db 402 while (<PODIDX>) {
403 chomp;
8167b455 404 push(@found, $_) if m,/$searchfor(?:\.(?:pod|pm))?\z,i;
cce34969 405 }
8167b455 406 close(PODIDX) or die "Can't close $podidx: $!";
febd60db 407 next;
408 }
409 print STDERR "Searching for $_\n" if $opt_v;
febd60db 410 if ($opt_F) {
411 next unless -r;
412 push @found, $_ if $opt_m or containspod($_);
413 next;
414 }
6a43d2f9 415 # We must look both in @INC for library modules and in $bindir
416 # for executables, like h2xs or perldoc itself.
417 my @searchdirs = ($bindir, @INC);
febd60db 418 unless ($opt_m) {
419 if ($Is_VMS) {
420 my($i,$trn);
421 for ($i = 0; $trn = $ENV{'DCL$PATH;'.$i}; $i++) {
422 push(@searchdirs,$trn);
7eda7aea 423 }
febd60db 424 push(@searchdirs,'perl_root:[lib.pod]') # installed pods
425 }
426 else {
427 push(@searchdirs, grep(-d, split($Config{path_sep},
428 $ENV{'PATH'})));
85880f03 429 }
febd60db 430 }
431 my @files = searchfor(0,$_,@searchdirs);
432 if (@files) {
433 print STDERR "Found as @files\n" if $opt_v;
434 }
435 else {
436 # no match, try recursive search
8167b455 437 @searchdirs = grep(!/^\.\z/s,@INC);
febd60db 438 @files= searchfor(1,$_,@searchdirs) if $opt_r;
439 if (@files) {
440 print STDERR "Loosely found as @files\n" if $opt_v;
441 }
442 else {
443 print STDERR "No documentation found for \"$_\".\n";
444 if (@global_found) {
445 print STDERR "However, try\n";
446 for my $dir (@global_found) {
8167b455 447 opendir(DIR, $dir) or die "opendir $dir: $!";
febd60db 448 while (my $file = readdir(DIR)) {
8167b455 449 next if ($file =~ /^\./s);
450 $file =~ s/\.(pm|pod)\z//; # XXX: badfs
febd60db 451 print STDERR "\tperldoc $_\::$file\n";
452 }
8167b455 453 closedir DIR or die "closedir $dir: $!";
4633a7c4 454 }
febd60db 455 }
4633a7c4 456 }
febd60db 457 }
458 push(@found,@files);
4633a7c4 459}
460
febd60db 461if (!@found) {
462 exit ($Is_VMS ? 98962 : 1);
4633a7c4 463}
464
44a8e56a 465if ($opt_l) {
466 print join("\n", @found), "\n";
467 exit;
468}
469
877622ba 470my $lines = $ENV{LINES} || 24;
471
c5ae3962 472my $no_tty;
febd60db 473if (! -t STDOUT) { $no_tty = 1 }
8167b455 474END { close(STDOUT) || die "Can't close STDOUT: $!" }
febd60db 475
137443ea 476if ($Is_MSWin32) {
febd60db 477 push @pagers, qw( more< less notepad );
478 unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
479 for (@found) { s,/,\\,g }
480}
481elsif ($Is_VMS) {
febd60db 482 push @pagers, qw( most more less type/page );
483}
484elsif ($Is_Dos) {
febd60db 485 push @pagers, qw( less.exe more.com< );
486 unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
487}
488else {
489 if ($^O eq 'os2') {
febd60db 490 unshift @pagers, 'less', 'cmd /c more <';
491 }
febd60db 492 push @pagers, qw( more less pg view cat );
493 unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
4633a7c4 494}
44a8e56a 495unshift @pagers, $ENV{PERLDOC_PAGER} if $ENV{PERLDOC_PAGER};
4633a7c4 496
7eda7aea 497if ($opt_m) {
febd60db 498 foreach my $pager (@pagers) {
8167b455 499 if (system($pager, @found) == 0) {
500 exit;
501 }
febd60db 502 }
8167b455 503 if ($Is_VMS) {
504 eval q{
505 use vmsish qw(status exit);
506 exit $?;
507 1;
508 } or die;
509 }
510 exit(1);
eb459f90 511}
7eda7aea 512
eb459f90 513my @pod;
31bdbec1 514if ($opt_f) {
febd60db 515 my $perlfunc = shift @found;
8167b455 516 open(PFUNC, "<", $perlfunc)
517 or die("Can't open $perlfunc: $!");
31bdbec1 518
febd60db 519 # Functions like -r, -e, etc. are listed under `-X'.
520 my $search_string = ($opt_f =~ /^-[rwxoRWXOeszfdlpSbctugkTBMAC]$/)
521 ? 'I<-X' : $opt_f ;
a3cb178b 522
febd60db 523 # Skip introduction
8167b455 524 local $_;
febd60db 525 while (<PFUNC>) {
526 last if /^=head2 Alphabetical Listing of Perl Functions/;
527 }
7eda7aea 528
febd60db 529 # Look for our function
530 my $found = 0;
531 my $inlist = 0;
532 while (<PFUNC>) {
533 if (/^=item\s+\Q$search_string\E\b/o) {
534 $found = 1;
85880f03 535 }
febd60db 536 elsif (/^=item/) {
537 last if $found > 1 and not $inlist;
538 }
539 next unless $found;
540 if (/^=over/) {
541 ++$inlist;
542 }
543 elsif (/^=back/) {
544 --$inlist;
4633a7c4 545 }
febd60db 546 push @pod, $_;
547 ++$found if /^\w/; # found descriptive text
548 }
549 if (!@pod) {
550 die "No documentation for perl function `$opt_f' found\n";
551 }
8167b455 552 close PFUNC or die "Can't open $perlfunc: $!";
4633a7c4 553}
554
febd60db 555if ($opt_q) {
556 local @ARGV = @found; # I'm lazy, sue me.
557 my $found = 0;
558 my %found_in;
8167b455 559 my $rx = eval { qr/$opt_q/ } or die <<EOD;
b62b7eeb 560Invalid regular expression '$opt_q' given as -q pattern:
561 $@
562Did you mean \\Q$opt_q ?
563
564EOD
febd60db 565
8167b455 566 for (@found) { die "invalid file spec: $!" if /[<>|]/ }
567 local $_;
febd60db 568 while (<>) {
569 if (/^=head2\s+.*(?:$opt_q)/oi) {
570 $found = 1;
571 push @pod, "=head1 Found in $ARGV\n\n" unless $found_in{$ARGV}++;
4633a7c4 572 }
febd60db 573 elsif (/^=head2/) {
574 $found = 0;
575 }
576 next unless $found;
577 push @pod, $_;
578 }
579 if (!@pod) {
8167b455 580 die("No documentation for perl FAQ keyword `$opt_q' found\n");
febd60db 581 }
582}
583
6a43d2f9 584# until here we could simply exit or die
585# now we create temporary files that we have to clean up
586# namely $tmp, $buffer
587# that's because you did it wrong, should be descriptor based --tchrist
588
589my $tmp;
590my $tmpfd;
591my $buffer;
592
593require File::Temp;
594
595($tmpfd, $tmp) = File::Temp::tempfile();
596
597# make sure cleanup called
598eval q{
599 sub END { cleanup($tmp, $buffer) }
600 1;
601} || die;
602
603# exit/die in a windows sighandler is dangerous, so let it do the
604# default thing, which is to exit
605eval q{ use sigtrap qw(die INT TERM HUP QUIT) } unless $^O eq 'MSWin32';
606
febd60db 607my $filter;
608
609if (@pod) {
6a43d2f9 610 my $buffd;
611 ($buffd, $buffer) = File::Temp::tempfile();
612 print $buffd "=over 8\n\n";
613 print $buffd @pod or die "Can't print $buffer: $!";
614 print $buffd "=back\n";
615 close $buffd or die "Can't close $buffer: $!";
febd60db 616 @found = $buffer;
617 $filter = 1;
4633a7c4 618}
619
febd60db 620foreach (@found) {
6a43d2f9 621 my $file = $_;
622 my $err;
623
624 if ($opt_t) {
625 Pod::Text->new()->parse_from_file($file, $tmpfd);
626 }
627 elsif (not $opt_u) {
628 my $cmd = catfile($bindir, 'pod2man') . " --lax $file | $opt_n -man";
629 $cmd .= " | col -x" if $^O =~ /hpux/;
630 my $rslt = `$cmd`;
631 $rslt = filter_nroff($rslt) if $filter;
632 unless (($err = $?)) {
633 print $tmpfd $rslt
634 or die "Can't print $tmp: $!";
635 }
636 }
637 if ($opt_u or $err) {
638 open(IN,"<", $file) or die("Can't open $file: $!");
639 my $cut = 1;
640 local $_;
641 while (<IN>) {
642 $cut = $1 eq 'cut' if /^=(\w+)/;
643 next if $cut;
644 print $tmpfd $_
645 or die "Can't print $tmp: $!";
646 }
647 close IN or die "Can't close $file: $!";
648 }
eb459f90 649}
6a43d2f9 650close $tmpfd
651 or die "Can't close $tmp: $!";
febd60db 652page($tmp, $no_tty, @pagers);
4633a7c4 653
8167b455 654exit;
655
656sub is_tainted {
657 my $arg = shift;
658 my $nada = substr($arg, 0, 0); # zero-length
659 local $@; # preserve caller's version
660 eval { eval "# $nada" };
661 return length($@) != 0;
662}
663
664sub am_taint_checking {
665 my($k,$v) = each %ENV;
666 return is_tainted($v);
667}
668
7eda7aea 669
670__END__
671
672=head1 NAME
673
674perldoc - Look up Perl documentation in pod format.
675
676=head1 SYNOPSIS
677
89b8affa 678B<perldoc> [B<-h>] [B<-v>] [B<-t>] [B<-u>] [B<-m>] [B<-l>] [B<-F>] [B<-X>] PageName|ModuleName|ProgramName
7eda7aea 679
31bdbec1 680B<perldoc> B<-f> BuiltinFunction
681
c8950503 682B<perldoc> B<-q> FAQ Keyword
683
7eda7aea 684=head1 DESCRIPTION
685
40fc7247 686I<perldoc> looks up a piece of documentation in .pod format that is embedded
687in the perl installation tree or in a perl script, and displays it via
688C<pod2man | nroff -man | $PAGER>. (In addition, if running under HP-UX,
689C<col -x> will be used.) This is primarily used for the documentation for
690the perl library modules.
7eda7aea 691
692Your system may also have man pages installed for those modules, in
693which case you can probably just use the man(1) command.
694
695=head1 OPTIONS
696
697=over 5
698
699=item B<-h> help
700
701Prints out a brief help message.
702
703=item B<-v> verbose
704
705Describes search for the item in detail.
706
707=item B<-t> text output
708
709Display docs using plain text converter, instead of nroff. This may be faster,
710but it won't look as nice.
711
712=item B<-u> unformatted
713
714Find docs only; skip reformatting by pod2*
715
716=item B<-m> module
717
718Display the entire module: both code and unformatted pod documentation.
719This may be useful if the docs don't explain a function in the detail
720you need, and you'd like to inspect the code directly; perldoc will find
721the file for you and simply hand it off for display.
722
44a8e56a 723=item B<-l> file name only
724
725Display the file name of the module found.
726
cce34969 727=item B<-F> file names
728
89b8affa 729Consider arguments as file names, no search in directories will be performed.
cce34969 730
31bdbec1 731=item B<-f> perlfunc
732
733The B<-f> option followed by the name of a perl built in function will
734extract the documentation of this function from L<perlfunc>.
735
c8950503 736=item B<-q> perlfaq
737
738The B<-q> option takes a regular expression as an argument. It will search
739the question headings in perlfaq[1-9] and print the entries matching
740the regular expression.
741
89b8affa 742=item B<-X> use an index if present
743
744The B<-X> option looks for a entry whose basename matches the name given on the
745command line in the file C<$Config{archlib}/pod.idx>. The pod.idx file should
746contain fully qualified filenames, one per line.
747
c185d8c4 748=item B<-U> run insecurely
749
750Because B<perldoc> does not run properly tainted, and is known to
751have security issues, it will not normally execute as the superuser.
752If you use the B<-U> flag, it will do so, but only after setting
753the effective and real IDs to nobody's or nouser's account, or -2
754if unavailable. If it cannot relinguish its privileges, it will not
755run.
756
7eda7aea 757=item B<PageName|ModuleName|ProgramName>
758
759The item you want to look up. Nested modules (such as C<File::Basename>)
760are specified either as C<File::Basename> or C<File/Basename>. You may also
1b420867 761give a descriptive name of a page, such as C<perlfunc>. You may also give a
7eda7aea 762partial or wrong-case name, such as "basename" for "File::Basename", but
763this will be slower, if there is more then one page with the same partial
764name, you will only get the first one.
765
766=back
767
768=head1 ENVIRONMENT
769
febd60db 770Any switches in the C<PERLDOC> environment variable will be used before the
7eda7aea 771command line arguments. C<perldoc> also searches directories
772specified by the C<PERL5LIB> (or C<PERLLIB> if C<PERL5LIB> is not
773defined) and C<PATH> environment variables.
774(The latter is so that embedded pods for executables, such as
a3cb178b 775C<perldoc> itself, are available.) C<perldoc> will use, in order of
776preference, the pager defined in C<PERLDOC_PAGER>, C<MANPAGER>, or
777C<PAGER> before trying to find a pager on its own. (C<MANPAGER> is not
778used if C<perldoc> was told to display plain text or unformatted pod.)
7eda7aea 779
eb459f90 780One useful value for C<PERLDOC_PAGER> is C<less -+C -E>.
781
febd60db 782=head1 VERSION
783
6d0835e5 784This is perldoc v2.03.
febd60db 785
7eda7aea 786=head1 AUTHOR
787
788Kenneth Albanowski <kjahds@kjahds.com>
789
febd60db 790Minor updates by Andy Dougherty <doughera@lafcol.lafayette.edu>,
791and others.
7eda7aea 792
7eda7aea 793=cut
794
795#
6d0835e5 796# Version 2.03: Sun Apr 23 16:56:34 BST 2000
797# Hugo van der Sanden <hv@crypt0.demon.co.uk>
798# don't die when 'use blib' fails
c185d8c4 799# Version 2.02: Mon Mar 13 18:03:04 MST 2000
800# Tom Christiansen <tchrist@perl.com>
801# Added -U insecurity option
8167b455 802# Version 2.01: Sat Mar 11 15:22:33 MST 2000
803# Tom Christiansen <tchrist@perl.com>, querulously.
804# Security and correctness patches.
805# What a twisted bit of distasteful spaghetti code.
806# Version 2.0: ????
7ec2cea4 807# Version 1.15: Tue Aug 24 01:50:20 EST 1999
808# Charles Wilson <cwilson@ece.gatech.edu>
809# changed /pod/ directory to /pods/ for cygwin
810# to support cygwin/win32
c5ae3962 811# Version 1.14: Wed Jul 15 01:50:20 EST 1998
812# Robin Barker <rmb1@cise.npl.co.uk>
813# -strict, -w cleanups
89b8affa 814# Version 1.13: Fri Feb 27 16:20:50 EST 1997
6e238990 815# Gurusamy Sarathy <gsar@activestate.com>
89b8affa 816# -doc tweaks for -F and -X options
137443ea 817# Version 1.12: Sat Apr 12 22:41:09 EST 1997
6e238990 818# Gurusamy Sarathy <gsar@activestate.com>
137443ea 819# -various fixes for win32
7eda7aea 820# Version 1.11: Tue Dec 26 09:54:33 EST 1995
821# Kenneth Albanowski <kjahds@kjahds.com>
822# -added Charles Bailey's further VMS patches, and -u switch
823# -added -t switch, with pod2text support
febd60db 824#
7eda7aea 825# Version 1.10: Thu Nov 9 07:23:47 EST 1995
826# Kenneth Albanowski <kjahds@kjahds.com>
827# -added VMS support
828# -added better error recognition (on no found pages, just exit. On
829# missing nroff/pod2man, just display raw pod.)
830# -added recursive/case-insensitive matching (thanks, Andreas). This
831# slows things down a bit, unfortunately. Give a precise name, and
832# it'll run faster.
833#
834# Version 1.01: Tue May 30 14:47:34 EDT 1995
835# Andy Dougherty <doughera@lafcol.lafayette.edu>
836# -added pod documentation.
837# -added PATH searching.
838# -added searching pod/ subdirectory (mainly to pick up perlfunc.pod
839# and friends.
840#
841#
842# TODO:
843#
844# Cache directories read during sloppy match
4633a7c4 845!NO!SUBS!
846
847close OUT or die "Can't close $file: $!";
848chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
849exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
8a5546a1 850chdir $origdir;