X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=scripts%2Fkernel-doc;h=8be269ffbf9d4f8159ca7a49a589f879a3d38583;hb=f03e1666d6164da6f098dc1a2e539eced3e4461a;hp=fc0835bf65e238bb6b17b5cf0f161f8fddcd2202;hpb=05189497d10c715bf41c05fb2fd89aa2cf7602f1;p=safe%2Fjmp%2Flinux-2.6
diff --git a/scripts/kernel-doc b/scripts/kernel-doc
index fc0835b..8be269f 100755
--- a/scripts/kernel-doc
+++ b/scripts/kernel-doc
@@ -57,8 +57,8 @@ use strict;
# other functions are ignored.
#
# -nofunction funcname
-# If set, then only generate documentation for the other function(s). All
-# other functions are ignored. Cannot be used with -function together
+# If set, then only generate documentation for the other function(s).
+# Cannot be used together with -function
# (yes, that's a bug -- perl hackers can fix it 8))
#
# c files - list of 'c' files to process
@@ -83,7 +83,7 @@ use strict;
# * my_function
# **/
#
-# If the Description: header tag is ommitted, then there must be a blank line
+# If the Description: header tag is omitted, then there must be a blank line
# after the last parameter specification.
# e.g.
# /**
@@ -253,6 +253,7 @@ my $lineprefix="";
# 3 - scanning prototype.
# 4 - documentation block
my $state;
+my $in_doc_sect;
#declaration types: can be
# 'function', 'struct', 'union', 'enum', 'typedef'
@@ -264,7 +265,7 @@ my $doc_start = '^/\*\*\s*$'; # Allow whitespace at end of comment start.
my $doc_end = '\*/';
my $doc_com = '\s*\*\s*';
my $doc_decl = $doc_com.'(\w+)';
-my $doc_sect = $doc_com.'(['.$doc_special.']?[\w ]+):(.*)';
+my $doc_sect = $doc_com.'(['.$doc_special.']?[\w\s]+):(.*)';
my $doc_content = $doc_com.'(.*)';
my $doc_block = $doc_com.'DOC:\s*(.*)?';
@@ -364,7 +365,7 @@ sub dump_section {
# parameterlist => @list of parameters
# parameterdescs => %parameter descriptions
# sectionlist => @list of sections
-# sections => %descriont descriptions
+# sections => %section descriptions
#
sub output_highlight {
@@ -451,7 +452,7 @@ sub output_struct_html(%) {
my %args = %{$_[0]};
my ($parameter);
- print "
".$args{'type'}." ".$args{'struct'}."
\n";
+ print "".$args{'type'}." ".$args{'struct'}. " - " .$args{'purpose'}."
\n";
print "".$args{'type'}." ".$args{'struct'}." {
\n";
foreach $parameter (@{$args{'parameterlist'}}) {
if ($parameter =~ /^#/) {
@@ -497,8 +498,8 @@ sub output_function_html(%) {
my %args = %{$_[0]};
my ($parameter, $section);
my $count;
- print "Function
\n";
+ print "" .$args{'function'}." - ".$args{'purpose'}."
\n";
print "".$args{'functiontype'}."\n";
print "".$args{'function'}."\n";
print "(";
@@ -582,14 +583,14 @@ sub output_function_xml(%) {
$id = "API-".$args{'function'};
$id =~ s/[^A-Za-z0-9]/-/g;
- print "\n";
+ print "\n";
print "\n";
print " LINUX\n";
print " Kernel Hackers Manual\n";
print " $man_date\n";
print "\n";
print "\n";
- print " ".$args{'function'}."\n";
+ print " ".$args{'function'}."\n";
print " 9\n";
print "\n";
print "\n";
@@ -658,14 +659,14 @@ sub output_struct_xml(%) {
$id = "API-struct-".$args{'struct'};
$id =~ s/[^A-Za-z0-9]/-/g;
- print "\n";
+ print "\n";
print "\n";
print " LINUX\n";
print " Kernel Hackers Manual\n";
print " $man_date\n";
print "\n";
print "\n";
- print " ".$args{'type'}." ".$args{'struct'}."\n";
+ print " ".$args{'type'}." ".$args{'struct'}."\n";
print " 9\n";
print "\n";
print "\n";
@@ -742,14 +743,14 @@ sub output_enum_xml(%) {
$id = "API-enum-".$args{'enum'};
$id =~ s/[^A-Za-z0-9]/-/g;
- print "\n";
+ print "\n";
print "\n";
print " LINUX\n";
print " Kernel Hackers Manual\n";
print " $man_date\n";
print "\n";
print "\n";
- print " enum ".$args{'enum'}."\n";
+ print " enum ".$args{'enum'}."\n";
print " 9\n";
print "\n";
print "\n";
@@ -808,14 +809,14 @@ sub output_typedef_xml(%) {
$id = "API-typedef-".$args{'typedef'};
$id =~ s/[^A-Za-z0-9]/-/g;
- print "\n";
+ print "\n";
print "\n";
print " LINUX\n";
print " Kernel Hackers Manual\n";
print " $man_date\n";
print "\n";
print "\n";
- print " typedef ".$args{'typedef'}."\n";
+ print " typedef ".$args{'typedef'}."\n";
print " 9\n";
print "\n";
print "\n";
@@ -952,7 +953,11 @@ sub output_function_man(%) {
print $args{'function'}." \\- ".$args{'purpose'}."\n";
print ".SH SYNOPSIS\n";
- print ".B \"".$args{'functiontype'}."\" ".$args{'function'}."\n";
+ if ($args{'functiontype'} ne "") {
+ print ".B \"".$args{'functiontype'}."\" ".$args{'function'}."\n";
+ } else {
+ print ".B \"".$args{'function'}."\n";
+ }
$count = 0;
my $parenth = "(";
my $post = ",";
@@ -1055,7 +1060,8 @@ sub output_struct_man(%) {
# pointer-to-function
print ".BI \" ".$1."\" ".$parameter." \") (".$2.")"."\"\n;\n";
} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
- print ".BI \" ".$1."\" ".$parameter.$2." \""."\"\n;\n";
+ # bitfield
+ print ".BI \" ".$1."\ \" ".$parameter.$2." \""."\"\n;\n";
} else {
$type =~ s/([^\*])$/$1 /;
print ".BI \" ".$type."\" ".$parameter." \""."\"\n;\n";
@@ -1064,7 +1070,7 @@ sub output_struct_man(%) {
}
print "};\n.br\n";
- print ".SH Arguments\n";
+ print ".SH Members\n";
foreach $parameter (@{$args{'parameterlist'}}) {
($parameter =~ /^#/) && next;
@@ -1116,10 +1122,19 @@ sub output_intro_man(%) {
sub output_function_text(%) {
my %args = %{$_[0]};
my ($parameter, $section);
+ my $start;
+
+ print "Name:\n\n";
+ print $args{'function'}." - ".$args{'purpose'}."\n";
- print "Function:\n\n";
- my $start=$args{'functiontype'}." ".$args{'function'}." (";
+ print "\nSynopsis:\n\n";
+ if ($args{'functiontype'} ne "") {
+ $start = $args{'functiontype'}." ".$args{'function'}." (";
+ } else {
+ $start = $args{'function'}." (";
+ }
print $start;
+
my $count = 0;
foreach my $parameter (@{$args{'parameterlist'}}) {
$type = $args{'parametertypes'}{$parameter};
@@ -1168,6 +1183,7 @@ sub output_enum_text(%) {
my $count;
print "Enum:\n\n";
+ print "enum ".$args{'enum'}." - ".$args{'purpose'}."\n\n";
print "enum ".$args{'enum'}." {\n";
$count = 0;
foreach $parameter (@{$args{'parameterlist'}}) {
@@ -1196,7 +1212,7 @@ sub output_typedef_text(%) {
my $count;
print "Typedef:\n\n";
- print "typedef ".$args{'typedef'}."\n";
+ print "typedef ".$args{'typedef'}." - ".$args{'purpose'}."\n";
output_section_text(@_);
}
@@ -1205,7 +1221,7 @@ sub output_struct_text(%) {
my %args = %{$_[0]};
my ($parameter);
- print $args{'type'}." ".$args{'struct'}.":\n\n";
+ print $args{'type'}." ".$args{'struct'}." - ".$args{'purpose'}."\n\n";
print $args{'type'}." ".$args{'struct'}." {\n";
foreach $parameter (@{$args{'parameterlist'}}) {
if ($parameter =~ /^#/) {
@@ -1256,7 +1272,9 @@ sub output_intro_text(%) {
}
##
-# generic output function for typedefs
+# generic output function for all types (function, struct/union, typedef, enum);
+# calls the generated, variable output_ function name based on
+# functype and output_mode
sub output_declaration {
no strict 'refs';
my $name = shift;
@@ -1272,8 +1290,7 @@ sub output_declaration {
}
##
-# generic output function - calls the right one based
-# on current output mode.
+# generic output function - calls the right one based on current output mode.
sub output_intro {
no strict 'refs';
my $func = "output_intro_".$output_mode;
@@ -1423,10 +1440,10 @@ sub create_parameterlist($$$) {
# corresponding data structures "correctly". Catch it later in
# output_* subs.
push_parameter($arg, "", $file);
- } elsif ($arg =~ m/\(/) {
+ } elsif ($arg =~ m/\(.*\*/) {
# pointer-to-function
$arg =~ tr/#/,/;
- $arg =~ m/[^\(]+\(\*([^\)]+)\)/;
+ $arg =~ m/[^\(]+\(\*\s*([^\)]+)\)/;
$param = $1;
$type = $arg;
$type =~ s/([^\(]+\(\*)$param/$1/;
@@ -1462,6 +1479,7 @@ sub push_parameter($$$) {
my $param = shift;
my $type = shift;
my $file = shift;
+ my $anon = 0;
my $param_name = $param;
$param_name =~ s/\[.*//;
@@ -1477,9 +1495,20 @@ sub push_parameter($$$) {
$param="void";
$parameterdescs{void} = "no arguments";
}
+ elsif ($type eq "" && ($param eq "struct" or $param eq "union"))
+ # handle unnamed (anonymous) union or struct:
+ {
+ $type = $param;
+ $param = "{unnamed_" . $param. "}";
+ $parameterdescs{$param} = "anonymous\n";
+ $anon = 1;
+ }
+
# warn if parameter has no description
- # (but ignore ones starting with # as these are no parameters
- # but inline preprocessor statements
+ # (but ignore ones starting with # as these are not parameters
+ # but inline preprocessor statements);
+ # also ignore unnamed structs/unions;
+ if (!$anon) {
if (!defined $parameterdescs{$param_name} && $param_name !~ /^#/) {
$parameterdescs{$param_name} = $undescribed;
@@ -1493,6 +1522,7 @@ sub push_parameter($$$) {
" No description found for parameter '$param'\n";
++$warnings;
}
+ }
push @parameterlist, $param;
$parametertypes{$param} = $type;
@@ -1512,8 +1542,12 @@ sub dump_function($$) {
$prototype =~ s/^asmlinkage +//;
$prototype =~ s/^inline +//;
$prototype =~ s/^__inline__ +//;
- $prototype =~ s/^#define +//; #ak added
- $prototype =~ s/__attribute__ \(\([a-z,]*\)\)//;
+ $prototype =~ s/^__inline +//;
+ $prototype =~ s/^__always_inline +//;
+ $prototype =~ s/^noinline +//;
+ $prototype =~ s/__devinit +//;
+ $prototype =~ s/^#define\s+//; #ak added
+ $prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//;
# Yes, this truly is vile. We are looking for:
# 1. Return type (may be nothing if we're looking at a macro)
@@ -1546,7 +1580,8 @@ sub dump_function($$) {
$prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
$prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
$prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
- $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/) {
+ $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+ $prototype =~ m/^(\w+\s+\w+\s*\*\s*\w+\s*\*\s*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/) {
$return_type = $1;
$declaration_name = $2;
my $args = $3;
@@ -1673,6 +1708,9 @@ sub process_state3_type($$) {
# replace <, >, and &
sub xml_escape($) {
my $text = shift;
+ if (($output_mode eq "text") || ($output_mode eq "man")) {
+ return $text;
+ }
$text =~ s/\&/\\\\\\amp;/g;
$text =~ s/\\\\\\\lt;/g;
$text =~ s/\>/\\\\\\gt;/g;
@@ -1683,6 +1721,7 @@ sub process_file($) {
my $file;
my $identifier;
my $func;
+ my $descr;
my $initial_section_counter = $section_counter;
if (defined($ENV{'SRCTREE'})) {
@@ -1706,6 +1745,7 @@ sub process_file($) {
if ($state == 0) {
if (/$doc_start/o) {
$state = 1; # next line is always the function name
+ $in_doc_sect = 0;
}
} elsif ($state == 1) { # this line is the function name (always)
if (/$doc_block/o) {
@@ -1725,7 +1765,12 @@ sub process_file($) {
$state = 2;
if (/-(.*)/) {
- $declaration_purpose = xml_escape($1);
+ # strip leading/trailing/multiple spaces #RDD:T:
+ $descr= $1;
+ $descr =~ s/^\s*//;
+ $descr =~ s/\s*$//;
+ $descr =~ s/\s+/ /;
+ $declaration_purpose = xml_escape($descr);
} else {
$declaration_purpose = "";
}
@@ -1756,14 +1801,20 @@ sub process_file($) {
$newcontents = $2;
if ($contents ne "") {
+ if (!$in_doc_sect && $verbose) {
+ print STDERR "Warning(${file}:$.): contents before sections\n";
+ ++$warnings;
+ }
dump_section($section, xml_escape($contents));
$section = $section_default;
}
+ $in_doc_sect = 1;
$contents = $newcontents;
if ($contents ne "") {
- if (substr($contents, 0, 1) eq " ") {
- $contents = substr($contents, 1);
+ while ((substr($contents, 0, 1) eq " ") ||
+ substr($contents, 0, 1) eq "\t") {
+ $contents = substr($contents, 1);
}
$contents .= "\n";
}
@@ -1779,7 +1830,7 @@ sub process_file($) {
$prototype = "";
$state = 3;
$brcount = 0;
-# print STDERR "end of doc comment, looking for prototype\n";
+# print STDERR "end of doc comment, looking for prototype\n";
} elsif (/$doc_content/) {
# miguel-style comment kludge, look for blank lines after
# @parameter line to signify start of description
@@ -1796,7 +1847,7 @@ sub process_file($) {
print STDERR "Warning(${file}:$.): bad line: $_";
++$warnings;
}
- } elsif ($state == 3) { # scanning for function { (end of prototype)
+ } elsif ($state == 3) { # scanning for function '{' (end of prototype)
if ($decl_type eq 'function') {
process_state3_function($_, $file);
} else {