X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/6a477168226f5506df9ce7c01de57e2808b61d82..7eb7d786de9bebe120f2143ce65237684a3a5d80:/autodoc.pl diff --git a/autodoc.pl b/autodoc.pl index f0b9919..cb77a14 100644 --- a/autodoc.pl +++ b/autodoc.pl @@ -6,7 +6,7 @@ require 5.003; # keep this compatible, an old perl is all we may have before BEGIN { push @INC, 'lib'; require 'regen_lib.pl'; -} # glob() below requires File::Glob +} # @@ -33,6 +33,7 @@ sub walk_table (&@) { else { safer_unlink $filename; open F, ">$filename" or die "Can't open $filename: $!"; + binmode F; $F = \*F; } print $F $leader if $leader; @@ -44,6 +45,7 @@ sub walk_table (&@) { $_ .= ; chomp; } + s/\s+$//; my @args; if (/^\s*(#|$)/) { @args = $_; @@ -51,6 +53,7 @@ sub walk_table (&@) { else { @args = split /\s*\|\s*/, $_; } + s/\b(NN|NULLOK)\b\s+//g for @args; print $F $function->(@args); } print $F $trailer if $trailer; @@ -62,6 +65,7 @@ sub walk_table (&@) { my %apidocs; my %gutsdocs; my %docfuncs; +my %seenfuncs; my $curheader = "Unknown section"; @@ -82,10 +86,6 @@ FUNC: my $docs = ""; DOC: while (defined($doc = <$fh>)) { - if ($doc =~ /^=head1 (.*)/) { - $curheader = $1; - next DOC; - } $line++; last DOC if $doc =~ /^=\w+/; if ($doc =~ m:^\*/$:) { @@ -107,7 +107,7 @@ DOC: $docfuncs{$name} = [$flags, $docs, $ret, $file, $curheader, @args]; } if (defined $doc) { - if ($doc =~ /^=for/) { + if ($doc =~ /^=(?:for|head)/) { $in = $doc; redo FUNC; } @@ -121,13 +121,14 @@ DOC: sub docout ($$$) { # output the docs for one function my($fh, $name, $docref) = @_; my($flags, $docs, $ret, $file, @args) = @$docref; + $name =~ s/\s*$//; $docs .= "NOTE: this function is experimental and may change or be removed without notice.\n\n" if $flags =~ /x/; $docs .= "NOTE: the perl_ form of this function is deprecated.\n\n" if $flags =~ /p/; - print $fh "=item $name\n$docs"; + print $fh "=item $name\nX<$name>\n$docs"; if ($flags =~ /U/) { # no usage # nothing @@ -144,7 +145,15 @@ removed without notice.\n\n" if $flags =~ /x/; } my $file; -for $file (glob('*.c'), glob('*.h')) { +# glob() picks up docs from extra .c or .h files that may be in unclean +# development trees. +my $MANIFEST = do { + local ($/, *FH); + open FH, "MANIFEST" or die "Can't open MANIFEST: $!"; + ; +}; + +for $file (($MANIFEST =~ /^(\S+\.c)\t/gm), ($MANIFEST =~ /^(\S+\.h)\t/gm)) { open F, "< $file" or die "Cannot open $file for docs: $!\n"; $curheader = "Functions in file $file\n"; autodoc(\*F,$file); @@ -154,27 +163,29 @@ for $file (glob('*.c'), glob('*.h')) { safer_unlink "pod/perlapi.pod"; open (DOC, ">pod/perlapi.pod") or die "Can't create pod/perlapi.pod: $!\n"; +binmode DOC; -walk_table { # load documented functions into approriate hash +walk_table { # load documented functions into appropriate hash if (@_ > 1) { my($flags, $retval, $func, @args) = @_; return "" unless $flags =~ /d/; $func =~ s/\t//g; $flags =~ s/p//; # clean up fields from embed.pl $retval =~ s/\t//; my $docref = delete $docfuncs{$func}; + $seenfuncs{$func} = 1; if ($docref and @$docref) { if ($flags =~ /A/) { $docref->[0].="x" if $flags =~ /M/; - $apidocs{$docref->[4]}{$func} = - [$docref->[0] . 'A', $docref->[1], $retval, - $docref->[3], @args]; + $apidocs{$docref->[4]}{$func} = + [$docref->[0] . 'A', $docref->[1], $retval, $docref->[3], + @args]; } else { - $gutsdocs{$docref->[4]}{$func} = + $gutsdocs{$docref->[4]}{$func} = [$docref->[0], $docref->[1], $retval, $docref->[3], @args]; } } else { - warn "no docs for $func\n" unless $docref and @$docref; + warn "no docs for $func\n" unless $seenfuncs{$func}; } } return ""; @@ -192,6 +203,7 @@ print DOC <<'_EOB_'; perlapi - autogenerated documentation for the perl public API =head1 DESCRIPTION +X X X This file contains the documentation of the perl public API generated by embed.pl, specifically a listing of functions, macros, flags, and variables @@ -213,7 +225,8 @@ my $key; for $key (sort { uc($a) cmp uc($b) || $a cmp $b } keys %apidocs) { my $section = $apidocs{$key}; print DOC "\n=head1 $key\n\n=over 8\n\n"; - for my $key (sort { uc($a) cmp uc($b); } keys %$section) { + # Again, fallback for determinacy + for my $key (sort { uc($a) cmp uc($b) || $a cmp $b } keys %$section) { docout(\*DOC, $key, $section->{$key}); } print DOC "\n=back\n"; @@ -247,6 +260,7 @@ close(DOC) or die "Error closing pod/perlapi.pod: $!"; safer_unlink "pod/perlintern.pod"; open(GUTS, ">pod/perlintern.pod") or die "Unable to create pod/perlintern.pod: $!\n"; +binmode GUTS; print GUTS <<'END'; =head1 NAME @@ -254,6 +268,7 @@ perlintern - autogenerated documentation of purely B Perl functions =head1 DESCRIPTION +X X This file is the autogenerated documentation of functions in the Perl interpreter that are documented using Perl's internal documentation