3 # Unconditionally regenerate:
8 # from information stored in
11 # plus all the .c and .h files listed in MANIFEST
13 # Has an optional arg, which is the directory to chdir to before reading
14 # MANIFEST and *.[ch].
16 # This script is invoked as part of 'make all'
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.
30 or die "Couldn't chdir to '$workdir': $!";
32 require 'regen/regen_lib.pl';
33 require 'regen/embed_lib.pl';
36 # See database of global and static function prototypes in embed.fnc
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.
52 my $curheader = "Unknown section";
54 sub autodoc ($$) { # parse a file and extract documentation info
56 my($in, $doc, $line, $header_doc);
59 my $get_next_line = sub { $line++; return <$fh> };
62 while (defined($in = $get_next_line->())) {
63 if ($in =~ /^#\s*define\s+([A-Za-z_][A-Za-z_0-9]+)\(/ &&
64 ($file ne 'embed.h' || $file ne 'proto.h')) {
68 if ($in=~ /^=head1 (.*)/) {
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->())) {
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
91 while (defined($doc = $get_next_line->())) {
97 if ($doc =~ m:^\s*\*/$:) {
98 warn "=cut missing? $file:$line:$doc";;
106 if ($in =~ /^=for\s+apidoc\s+(.*?)\s*\n/) {
108 $proto = "||$proto" unless $proto =~ /\|/;
109 my($flags, $ret, $name, @args) = split /\|/, $proto;
112 while (defined($doc = $get_next_line->())) {
113 last DOC if $doc =~ /^=\w+/;
114 if ($doc =~ m:^\*/$:) {
115 warn "=cut missing? $file:$line:$doc";;
120 $docs = "\n$docs" if $docs and $docs !~ /^\n/;
122 # Check the consistency of the flags
123 my ($embed_where, $inline_where);
124 my ($embed_may_change, $inline_may_change);
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/;
130 $flags .= 'D' if $docref->{flags} =~ /D/;
132 $missing{$name} = $file;
135 $inline_where = $flags =~ /A/ ? 'api' : 'guts';
136 $inline_may_change = $flags =~ /x/;
138 if (defined $embed_where && $inline_where ne $embed_where) {
139 warn "Function '$name' inconsistency: embed.fnc says $embed_where, Pod says $inline_where";
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";
148 $message .= "Pod says 'may change', embed.fnc does not";
152 } elsif (!defined $embed_where) {
153 warn "Unable to place $name!\n";
156 $inline_where = $embed_where;
157 $flags .= 'x' if $embed_may_change;
158 @args = @{$docref->{args}};
159 $ret = $docref->{retval};
162 $docs{$inline_where}{$curheader}{$name}
163 = [$flags, $docs, $ret, $file, @args];
165 # Create a special entry with an empty-string name for the
166 # heading-level documentation.
167 if (defined $header_doc) {
168 $docs{$inline_where}{$curheader}{""} = $header_doc;
173 if ($doc =~ /^=(?:for|head)/) {
178 warn "$file:$line:$in";
184 sub docout ($$$) { # output the docs for one function
185 my($fh, $name, $docref) = @_;
186 my($flags, $docs, $ret, $file, @args) = @$docref;
190 $docs = "\n\nDEPRECATED! It is planned to remove this function from a
191 future release of Perl. Do not use it for new code; remove it from
192 existing code.\n\n$docs";
195 $docs = "\n\nNOTE: this function is experimental and may change or be
196 removed without notice.\n\n$docs" if $flags =~ /x/;
198 $docs .= "NOTE: the perl_ form of this function is deprecated.\n\n"
200 $docs .= "NOTE: this function must be explicitly called as Perl_$name with an aTHX_ parameter.\n\n"
203 print $fh "=item $name\nX<$name>\n$docs";
205 if ($flags =~ /U/) { # no usage
207 } elsif ($flags =~ /s/) { # semicolon ("dTHR;")
208 print $fh "\t\t$name;\n\n";
209 } elsif ($flags =~ /n/) { # no args
210 print $fh "\t$ret\t$name\n\n";
211 } else { # full usage
212 my $p = $flags =~ /o/; # no #define foo Perl_foo
213 my $n = "Perl_"x$p . $name;
214 my $large_ret = length $ret > 7;
215 my $indent_size = 7+8 # nroff: 7 under =head + 8 under =item
216 +8+($large_ret ? 1 + length $ret : 8)
219 print $fh "\t$ret" . ($large_ret ? ' ' : "\t") . "$n(";
222 if ($indent_size + 2 + length > 79) {
224 $indent_size -= length($n) - 3;
230 $args = @args ? "pTHX_ " : "pTHX";
231 if ($long_args) { print $fh $args; $args = '' }
233 $long_args and print $fh "\n";
234 my $first = !$long_args;
238 && $indent_size + 3 + length($args[0]) + length $args > 79
243 "\t".($large_ret ? " " x (1+length $ret) : "\t")
244 ." "x($long_args ? 4 : 1 + length $n)
246 $args, (","x($args ne 'pTHX_ ') . "\n")x!!@args;
250 $args .= ", "x!!(length $args && $args ne 'pTHX_ ')
253 if ($long_args) { print $fh "\n", substr $indent, 0, -4 }
256 print $fh "=for hackers\nFound in file $file\n\n";
260 # Do a case-insensitive dictionary sort, with only alphabetics
261 # significant, falling back to using everything for determinancy
262 return (uc($a =~ s/[[^:alpha]]//r) cmp uc($b =~ s/[[^:alpha]]//r))
268 my ($podname, $header, $dochash, $missing, $footer) = @_;
269 my $fh = open_new("pod/$podname.pod", undef,
270 {by => "$0 extracting documentation",
271 from => 'the C source files'}, 1);
276 for $key (sort sort_helper keys %$dochash) {
277 my $section = $dochash->{$key};
278 print $fh "\n=head1 $key\n\n";
280 # Output any heading-level documentation and delete so won't get in
282 if (exists $section->{""}) {
283 print $fh $section->{""} . "\n";
284 delete $section->{""};
286 print $fh "=over 8\n\n";
288 for my $key (sort sort_helper keys %$section) {
289 docout($fh, $key, $section->{$key});
291 print $fh "\n=back\n";
295 print $fh "\n=head1 Undocumented functions\n\n";
296 print $fh $podname eq 'perlapi' ? <<'_EOB_' : <<'_EOB_';
297 The following functions have been flagged as part of the public API,
298 but are currently undocumented. Use them at your own risk, as the
299 interfaces are subject to change. Functions that are not listed in this
300 document are not intended for public use, and should NOT be used under any
303 If you use one of the undocumented functions below, you may wish to consider
304 creating and submitting documentation
305 for it. If your patch is accepted, this
306 will indicate that the interface is stable (unless it is explicitly marked
312 The following functions are currently undocumented. If you use one of
313 them, you may wish to consider creating and submitting documentation for
319 for my $missing (sort @$missing) {
320 print $fh "=item $missing\nX<$missing>\n\n";
322 print $fh "=back\n\n";
324 print $fh $footer, "=cut\n";
326 read_only_bottom_close_and_rename($fh);
329 foreach (@{(setup_embed())[0]}) {
331 my ($flags, $retval, $func, @args) = @$_;
332 s/\b(?:NN|NULLOK)\b\s+//g for @args;
334 $funcflags{$func} = {
341 # glob() picks up docs from extra .c or .h files that may be in unclean
343 open my $fh, '<', 'MANIFEST'
344 or die "Can't open MANIFEST: $!";
345 while (my $line = <$fh>) {
346 next unless my ($file) = $line =~ /^(\S+\.[ch])\t/;
348 open F, "< $file" or die "Cannot open $file for docs: $!\n";
349 $curheader = "Functions in file $file\n";
351 close F or die "Error closing $file: $!\n";
353 close $fh or die "Error whilst reading MANIFEST: $!";
355 for (sort keys %funcflags) {
356 next unless $funcflags{$_}{flags} =~ /d/;
357 warn "no docs for $_\n"
360 foreach (sort keys %missing) {
362 # Heuristics for known not-a-function macros:
366 warn "Function '$_', documented in $missing{$_}, not listed in embed.fnc";
369 # walk table providing an array of components in each line to
370 # subroutine, printing the result
372 # List of funcs in the public API that aren't also marked as experimental nor
374 my @missing_api = grep $funcflags{$_}{flags} =~ /A/ && $funcflags{$_}{flags} !~ /[MD]/ && !$docs{api}{$_}, keys %funcflags;
375 output('perlapi', <<'_EOB_', $docs{api}, \@missing_api, <<'_EOE_');
378 perlapi - autogenerated documentation for the perl public API
381 X<Perl API> X<API> X<api>
383 This file contains the documentation of the perl public API generated by
384 F<embed.pl>, specifically a listing of functions, macros, flags, and variables
385 that may be used by extension writers. L<At the end|/Undocumented functions>
386 is a list of functions which have yet to be documented. The interfaces of
387 those are subject to change without notice. Anything not listed here is
388 not part of the public API, and should not be used by extension writers at
389 all. For these reasons, blindly using functions listed in proto.h is to be
390 avoided when writing extensions.
392 Note that all Perl API global variables must be referenced with the C<PL_>
393 prefix. Again, those not listed here are not to be used by extension writers,
394 and can be changed or removed without notice; same with macros.
395 Some macros are provided for compatibility with the older,
396 unadorned names, but this support may be disabled in a future release.
398 Perl was originally written to handle US-ASCII only (that is characters
399 whose ordinal numbers are in the range 0 - 127).
400 And documentation and comments may still use the term ASCII, when
401 sometimes in fact the entire range from 0 - 255 is meant.
403 Note that Perl can be compiled and run under EBCDIC (See L<perlebcdic>)
404 or ASCII. Most of the documentation (and even comments in the code)
405 ignore the EBCDIC possibility.
406 For almost all purposes the differences are transparent.
407 As an example, under EBCDIC,
408 instead of UTF-8, UTF-EBCDIC is used to encode Unicode strings, and so
409 whenever this documentation refers to C<utf8>
410 (and variants of that name, including in function names),
411 it also (essentially transparently) means C<UTF-EBCDIC>.
412 But the ordinals of characters differ between ASCII, EBCDIC, and
413 the UTF- encodings, and a string encoded in UTF-EBCDIC may occupy more bytes
416 The listing below is alphabetical, case insensitive.
422 Until May 1997, this document was maintained by Jeff Okamoto
423 <okamoto@corp.hp.com>. It is now maintained as part of Perl itself.
425 With lots of help and suggestions from Dean Roehrich, Malcolm Beattie,
426 Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil
427 Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer,
428 Stephen McCamant, and Gurusamy Sarathy.
430 API Listing originally by Dean Roehrich <roehrich@cray.com>.
432 Updated to be autogenerated from comments in the source by Benjamin Stuhl.
436 L<perlguts>, L<perlxs>, L<perlxstut>, L<perlintern>
440 # List of non-static internal functions
442 grep $funcflags{$_}{flags} !~ /[As]/ && !$docs{guts}{$_}, keys %funcflags;
444 output('perlintern', <<'END', $docs{guts}, \@missing_guts, <<'END');
447 perlintern - autogenerated documentation of purely B<internal>
451 X<internal Perl functions> X<interpreter functions>
453 This file is the autogenerated documentation of functions in the
454 Perl interpreter that are documented using Perl's internal documentation
455 format but are not marked as part of the Perl API. In other words,
456 B<they are not for use in extensions>!
462 The autodocumentation system was originally added to the Perl core by
463 Benjamin Stuhl. Documentation is by whoever was kind enough to
464 document their functions.
468 L<perlguts>, L<perlapi>