This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Devel::Peek:Peek.t: Fix to work on EBCDIC
[perl5.git] / autodoc.pl
CommitLineData
94bdecf9 1#!/usr/bin/perl -w
6294c161
DM
2#
3# Unconditionally regenerate:
4#
5# pod/perlintern.pod
6# pod/perlapi.pod
7#
8# from information stored in
9#
10# embed.fnc
11# plus all the .c and .h files listed in MANIFEST
12#
13# Has an optional arg, which is the directory to chdir to before reading
14# MANIFEST and *.[ch].
15#
52a9d53b 16# This script is invoked as part of 'make all'
151c3fe5 17#
f554dfc5
MH
18# '=head1' are the only headings looked for. If the first non-blank line after
19# the heading begins with a word character, it is considered to be the first
20# line of documentation that applies to the heading itself. That is, it is
21# output immediately after the heading, before the first function, and not
22# indented. The next input line that is a pod directive terminates this
23# heading-level documentation.
94bdecf9 24
56a0c332 25use strict;
a64c954a 26
7882b24a
NC
27if (@ARGV) {
28 my $workdir = shift;
29 chdir $workdir
30 or die "Couldn't chdir to '$workdir': $!";
31}
32require 'regen/regen_lib.pl';
e8e591c9 33require 'regen/embed_lib.pl';
7882b24a 34
94bdecf9 35#
346f75ff 36# See database of global and static function prototypes in embed.fnc
94bdecf9
JH
37# This is used to generate prototype headers under various configurations,
38# export symbols lists for different platforms, and macros to provide an
39# implicit interpreter context argument.
40#
41
6a235718 42my %docs;
5ce57792
NC
43my %funcflags;
44my %macro = (
45 ax => 1,
46 items => 1,
47 ix => 1,
48 svtype => 1,
49 );
50my %missing;
94bdecf9
JH
51
52my $curheader = "Unknown section";
53
54sub autodoc ($$) { # parse a file and extract documentation info
55 my($fh,$file) = @_;
151c3fe5 56 my($in, $doc, $line, $header_doc);
f554dfc5
MH
57
58 # Count lines easier
59 my $get_next_line = sub { $line++; return <$fh> };
60
94bdecf9 61FUNC:
f554dfc5 62 while (defined($in = $get_next_line->())) {
5ce57792
NC
63 if ($in =~ /^#\s*define\s+([A-Za-z_][A-Za-z_0-9]+)\(/ &&
64 ($file ne 'embed.h' || $file ne 'proto.h')) {
65 $macro{$1} = $file;
66 next FUNC;
67 }
94bdecf9
JH
68 if ($in=~ /^=head1 (.*)/) {
69 $curheader = $1;
151c3fe5 70
f554dfc5
MH
71 # If the next non-space line begins with a word char, then it is
72 # the start of heading-ldevel documentation.
73 if (defined($doc = $get_next_line->())) {
74 # Skip over empty lines
75 while ($doc =~ /^\s+$/) {
76 if (! defined($doc = $get_next_line->())) {
77 next FUNC;
78 }
79 }
80
151c3fe5
KW
81 if ($doc !~ /^\w/) {
82 $in = $doc;
83 redo FUNC;
84 }
85 $header_doc = $doc;
151c3fe5
KW
86
87 # Continue getting the heading-level documentation until read
88 # in any pod directive (or as a fail-safe, find a closing
89 # comment to this pod in a C language file
90HDR_DOC:
f554dfc5 91 while (defined($doc = $get_next_line->())) {
151c3fe5
KW
92 if ($doc =~ /^=\w/) {
93 $in = $doc;
94 redo FUNC;
95 }
151c3fe5
KW
96
97 if ($doc =~ m:^\s*\*/$:) {
98 warn "=cut missing? $file:$line:$doc";;
99 last HDR_DOC;
100 }
101 $header_doc .= $doc;
102 }
103 }
94bdecf9
JH
104 next FUNC;
105 }
78c9d763 106 if ($in =~ /^=for\s+apidoc\s+(.*?)\s*\n/) {
94bdecf9
JH
107 my $proto = $1;
108 $proto = "||$proto" unless $proto =~ /\|/;
109 my($flags, $ret, $name, @args) = split /\|/, $proto;
110 my $docs = "";
111DOC:
f554dfc5 112 while (defined($doc = $get_next_line->())) {
94bdecf9
JH
113 last DOC if $doc =~ /^=\w+/;
114 if ($doc =~ m:^\*/$:) {
115 warn "=cut missing? $file:$line:$doc";;
116 last DOC;
117 }
118 $docs .= $doc;
119 }
120 $docs = "\n$docs" if $docs and $docs !~ /^\n/;
5ce57792
NC
121
122 # Check the consistency of the flags
123 my ($embed_where, $inline_where);
124 my ($embed_may_change, $inline_may_change);
125
126 my $docref = delete $funcflags{$name};
127 if ($docref and %$docref) {
128 $embed_where = $docref->{flags} =~ /A/ ? 'api' : 'guts';
129 $embed_may_change = $docref->{flags} =~ /M/;
d4e99c76 130 $flags .= 'D' if $docref->{flags} =~ /D/;
5ce57792
NC
131 } else {
132 $missing{$name} = $file;
94bdecf9 133 }
5ce57792
NC
134 if ($flags =~ /m/) {
135 $inline_where = $flags =~ /A/ ? 'api' : 'guts';
136 $inline_may_change = $flags =~ /x/;
137
138 if (defined $embed_where && $inline_where ne $embed_where) {
139 warn "Function '$name' inconsistency: embed.fnc says $embed_where, Pod says $inline_where";
140 }
141
142 if (defined $embed_may_change
143 && $inline_may_change ne $embed_may_change) {
144 my $message = "Function '$name' inconsistency: ";
145 if ($embed_may_change) {
146 $message .= "embed.fnc says 'may change', Pod does not";
147 } else {
148 $message .= "Pod says 'may change', embed.fnc does not";
149 }
150 warn $message;
151 }
152 } elsif (!defined $embed_where) {
153 warn "Unable to place $name!\n";
154 next;
155 } else {
156 $inline_where = $embed_where;
157 $flags .= 'x' if $embed_may_change;
158 @args = @{$docref->{args}};
159 $ret = $docref->{retval};
94bdecf9 160 }
5ce57792 161
7a6610ca
DM
162 if (exists $docs{$inline_where}{$curheader}{$name}) {
163 warn "$0: duplicate API entry for '$name' in $inline_where/$curheader\n";
164 next;
165 }
5ce57792
NC
166 $docs{$inline_where}{$curheader}{$name}
167 = [$flags, $docs, $ret, $file, @args];
168
151c3fe5
KW
169 # Create a special entry with an empty-string name for the
170 # heading-level documentation.
171 if (defined $header_doc) {
172 $docs{$inline_where}{$curheader}{""} = $header_doc;
173 undef $header_doc;
174 }
175
94bdecf9 176 if (defined $doc) {
e509e693 177 if ($doc =~ /^=(?:for|head)/) {
94bdecf9
JH
178 $in = $doc;
179 redo FUNC;
180 }
181 } else {
182 warn "$file:$line:$in";
183 }
184 }
185 }
186}
187
188sub docout ($$$) { # output the docs for one function
189 my($fh, $name, $docref) = @_;
190 my($flags, $docs, $ret, $file, @args) = @$docref;
d8c40edc 191 $name =~ s/\s*$//;
94bdecf9 192
d4e99c76
KW
193 if ($flags =~ /D/) {
194 $docs = "\n\nDEPRECATED! It is planned to remove this function from a
195future release of Perl. Do not use it for new code; remove it from
196existing code.\n\n$docs";
197 }
198 else {
58a428bb
KW
199 $docs = "\n\nNOTE: this function is experimental and may change or be
200removed without notice.\n\n$docs" if $flags =~ /x/;
d4e99c76 201 }
94bdecf9
JH
202 $docs .= "NOTE: the perl_ form of this function is deprecated.\n\n"
203 if $flags =~ /p/;
5afac1eb
BM
204 $docs .= "NOTE: this function must be explicitly called as Perl_$name with an aTHX_ parameter.\n\n"
205 if $flags =~ /o/;
94bdecf9 206
d8c40edc 207 print $fh "=item $name\nX<$name>\n$docs";
94bdecf9
JH
208
209 if ($flags =~ /U/) { # no usage
210 # nothing
211 } elsif ($flags =~ /s/) { # semicolon ("dTHR;")
212 print $fh "\t\t$name;\n\n";
213 } elsif ($flags =~ /n/) { # no args
214 print $fh "\t$ret\t$name\n\n";
215 } else { # full usage
dee6204d
FC
216 my $p = $flags =~ /o/; # no #define foo Perl_foo
217 my $n = "Perl_"x$p . $name;
218 my $large_ret = length $ret > 7;
219 my $indent_size = 7+8 # nroff: 7 under =head + 8 under =item
220 +8+($large_ret ? 1 + length $ret : 8)
221 +length($n) + 1;
222 my $indent;
223 print $fh "\t$ret" . ($large_ret ? ' ' : "\t") . "$n(";
06e9ce89
FC
224 my $long_args;
225 for (@args) {
d2086f64 226 if ($indent_size + 2 + length > 79) {
06e9ce89
FC
227 $long_args=1;
228 $indent_size -= length($n) - 3;
229 last;
230 }
231 }
232 my $args = '';
233 if ($p) {
234 $args = @args ? "pTHX_ " : "pTHX";
235 if ($long_args) { print $fh $args; $args = '' }
236 }
237 $long_args and print $fh "\n";
238 my $first = !$long_args;
dee6204d
FC
239 while () {
240 if (!@args or
241 length $args
d2086f64 242 && $indent_size + 3 + length($args[0]) + length $args > 79
dee6204d
FC
243 ) {
244 print $fh
245 $first ? '' : (
246 $indent //=
247 "\t".($large_ret ? " " x (1+length $ret) : "\t")
06e9ce89 248 ." "x($long_args ? 4 : 1 + length $n)
dee6204d
FC
249 ),
250 $args, (","x($args ne 'pTHX_ ') . "\n")x!!@args;
251 $args = $first = '';
252 }
253 @args or last;
254 $args .= ", "x!!(length $args && $args ne 'pTHX_ ')
255 . shift @args;
256 }
06e9ce89 257 if ($long_args) { print $fh "\n", substr $indent, 0, -4 }
dee6204d 258 print $fh ")\n\n";
94bdecf9
JH
259 }
260 print $fh "=for hackers\nFound in file $file\n\n";
261}
262
f83c6033
KW
263sub sort_helper {
264 # Do a case-insensitive dictionary sort, with only alphabetics
265 # significant, falling back to using everything for determinancy
266 return (uc($a =~ s/[[^:alpha]]//r) cmp uc($b =~ s/[[^:alpha]]//r))
267 || uc($a) cmp uc($b)
268 || $a cmp $b;
269}
270
7b73ff98 271sub output {
5a0155e6 272 my ($podname, $header, $dochash, $missing, $footer) = @_;
7882b24a
NC
273 my $fh = open_new("pod/$podname.pod", undef,
274 {by => "$0 extracting documentation",
f1f44974 275 from => 'the C source files'}, 1);
e0492643 276
7882b24a 277 print $fh $header;
e0492643 278
7b73ff98 279 my $key;
f83c6033 280 for $key (sort sort_helper keys %$dochash) {
7b73ff98 281 my $section = $dochash->{$key};
151c3fe5
KW
282 print $fh "\n=head1 $key\n\n";
283
284 # Output any heading-level documentation and delete so won't get in
285 # the way later
286 if (exists $section->{""}) {
287 print $fh $section->{""} . "\n";
288 delete $section->{""};
289 }
290 print $fh "=over 8\n\n";
291
f83c6033 292 for my $key (sort sort_helper keys %$section) {
7b73ff98
NC
293 docout($fh, $key, $section->{$key});
294 }
295 print $fh "\n=back\n";
296 }
297
5a0155e6 298 if (@$missing) {
a23e6e20 299 print $fh "\n=head1 Undocumented functions\n\n";
2616800a 300 print $fh $podname eq 'perlapi' ? <<'_EOB_' : <<'_EOB_';
474d0ac8 301The following functions have been flagged as part of the public API,
72d33970 302but are currently undocumented. Use them at your own risk, as the
ba4591a5
KW
303interfaces are subject to change. Functions that are not listed in this
304document are not intended for public use, and should NOT be used under any
305circumstances.
306
307If you use one of the undocumented functions below, you may wish to consider
72d33970
FC
308creating and submitting documentation
309for it. If your patch is accepted, this
ba4591a5
KW
310will indicate that the interface is stable (unless it is explicitly marked
311otherwise).
cf5f2f8f
KW
312
313=over
314
315_EOB_
2616800a
FC
316The following functions are currently undocumented. If you use one of
317them, you may wish to consider creating and submitting documentation for
318it.
319
320=over
321
322_EOB_
cf5f2f8f
KW
323 for my $missing (sort @$missing) {
324 print $fh "=item $missing\nX<$missing>\n\n";
5a0155e6 325 }
cf5f2f8f
KW
326 print $fh "=back\n\n";
327}
7882b24a 328 print $fh $footer, "=cut\n";
5a0155e6 329
7882b24a 330 read_only_bottom_close_and_rename($fh);
cd093254
MM
331}
332
e8e591c9
NC
333foreach (@{(setup_embed())[0]}) {
334 next if @$_ < 2;
335 my ($flags, $retval, $func, @args) = @$_;
336 s/\b(?:NN|NULLOK)\b\s+//g for @args;
bc350081 337
5ce57792
NC
338 $funcflags{$func} = {
339 flags => $flags,
340 retval => $retval,
341 args => \@args,
342 };
343}
344
5ce57792
NC
345# glob() picks up docs from extra .c or .h files that may be in unclean
346# development trees.
741c0772
NC
347open my $fh, '<', 'MANIFEST'
348 or die "Can't open MANIFEST: $!";
349while (my $line = <$fh>) {
350 next unless my ($file) = $line =~ /^(\S+\.[ch])\t/;
5ce57792 351
5ce57792
NC
352 open F, "< $file" or die "Cannot open $file for docs: $!\n";
353 $curheader = "Functions in file $file\n";
354 autodoc(\*F,$file);
355 close F or die "Error closing $file: $!\n";
356}
741c0772 357close $fh or die "Error whilst reading MANIFEST: $!";
5ce57792
NC
358
359for (sort keys %funcflags) {
360 next unless $funcflags{$_}{flags} =~ /d/;
361 warn "no docs for $_\n"
bc350081 362}
94bdecf9 363
5ce57792
NC
364foreach (sort keys %missing) {
365 next if $macro{$_};
366 # Heuristics for known not-a-function macros:
367 next if /^[A-Z]/;
368 next if /^dj?[A-Z]/;
369
370 warn "Function '$_', documented in $missing{$_}, not listed in embed.fnc";
94bdecf9
JH
371}
372
5ce57792
NC
373# walk table providing an array of components in each line to
374# subroutine, printing the result
375
8c869419
KW
376# List of funcs in the public API that aren't also marked as experimental nor
377# deprecated.
378my @missing_api = grep $funcflags{$_}{flags} =~ /A/ && $funcflags{$_}{flags} !~ /[MD]/ && !$docs{api}{$_}, keys %funcflags;
5a0155e6 379output('perlapi', <<'_EOB_', $docs{api}, \@missing_api, <<'_EOE_');
94bdecf9
JH
380=head1 NAME
381
382perlapi - autogenerated documentation for the perl public API
383
384=head1 DESCRIPTION
d8c40edc 385X<Perl API> X<API> X<api>
94bdecf9
JH
386
387This file contains the documentation of the perl public API generated by
ef9741a5 388F<embed.pl>, specifically a listing of functions, macros, flags, and variables
cf5f2f8f
KW
389that may be used by extension writers. L<At the end|/Undocumented functions>
390is a list of functions which have yet to be documented. The interfaces of
37a519b2 391those are subject to change without notice. Anything not listed here is
cf5f2f8f
KW
392not part of the public API, and should not be used by extension writers at
393all. For these reasons, blindly using functions listed in proto.h is to be
394avoided when writing extensions.
94bdecf9
JH
395
396Note that all Perl API global variables must be referenced with the C<PL_>
37a519b2
KW
397prefix. Again, those not listed here are not to be used by extension writers,
398and can be changed or removed without notice; same with macros.
399Some macros are provided for compatibility with the older,
94bdecf9
JH
400unadorned names, but this support may be disabled in a future release.
401
2bbc8d55
SP
402Perl was originally written to handle US-ASCII only (that is characters
403whose ordinal numbers are in the range 0 - 127).
404And documentation and comments may still use the term ASCII, when
405sometimes in fact the entire range from 0 - 255 is meant.
406
407Note that Perl can be compiled and run under EBCDIC (See L<perlebcdic>)
408or ASCII. Most of the documentation (and even comments in the code)
409ignore the EBCDIC possibility.
410For almost all purposes the differences are transparent.
411As an example, under EBCDIC,
412instead of UTF-8, UTF-EBCDIC is used to encode Unicode strings, and so
413whenever this documentation refers to C<utf8>
414(and variants of that name, including in function names),
415it also (essentially transparently) means C<UTF-EBCDIC>.
416But the ordinals of characters differ between ASCII, EBCDIC, and
417the UTF- encodings, and a string encoded in UTF-EBCDIC may occupy more bytes
418than in UTF-8.
419
2bbc8d55 420The listing below is alphabetical, case insensitive.
94bdecf9
JH
421
422_EOB_
423
94bdecf9
JH
424=head1 AUTHORS
425
426Until May 1997, this document was maintained by Jeff Okamoto
427<okamoto@corp.hp.com>. It is now maintained as part of Perl itself.
428
429With lots of help and suggestions from Dean Roehrich, Malcolm Beattie,
430Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil
431Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer,
432Stephen McCamant, and Gurusamy Sarathy.
433
434API Listing originally by Dean Roehrich <roehrich@cray.com>.
435
436Updated to be autogenerated from comments in the source by Benjamin Stuhl.
437
438=head1 SEE ALSO
439
b92fc6c1 440L<perlguts>, L<perlxs>, L<perlxstut>, L<perlintern>
94bdecf9
JH
441
442_EOE_
443
79fc8511
FC
444# List of non-static internal functions
445my @missing_guts =
446 grep $funcflags{$_}{flags} !~ /[As]/ && !$docs{guts}{$_}, keys %funcflags;
5a0155e6
TC
447
448output('perlintern', <<'END', $docs{guts}, \@missing_guts, <<'END');
94bdecf9
JH
449=head1 NAME
450
451perlintern - autogenerated documentation of purely B<internal>
452 Perl functions
453
454=head1 DESCRIPTION
d8c40edc 455X<internal Perl functions> X<interpreter functions>
94bdecf9
JH
456
457This file is the autogenerated documentation of functions in the
458Perl interpreter that are documented using Perl's internal documentation
154e47c8 459format but are not marked as part of the Perl API. In other words,
94bdecf9
JH
460B<they are not for use in extensions>!
461
462END
463
94bdecf9
JH
464=head1 AUTHORS
465
466The autodocumentation system was originally added to the Perl core by
154e47c8 467Benjamin Stuhl. Documentation is by whoever was kind enough to
94bdecf9
JH
468document their functions.
469
470=head1 SEE ALSO
471
b92fc6c1 472L<perlguts>, L<perlapi>
94bdecf9
JH
473
474END