diff options
Diffstat (limited to 'scripts/kernel-doc')
| -rwxr-xr-x | scripts/kernel-doc | 471 | 
1 files changed, 404 insertions, 67 deletions
diff --git a/scripts/kernel-doc b/scripts/kernel-doc index cdb6dc1f645..16a07cfa4d3 100755 --- a/scripts/kernel-doc +++ b/scripts/kernel-doc @@ -5,7 +5,8 @@ use strict;  ## Copyright (c) 1998 Michael Zucchi, All Rights Reserved        ##  ## Copyright (C) 2000, 1  Tim Waugh <twaugh@redhat.com>          ##  ## Copyright (C) 2001  Simon Huggins                             ## -## Copyright (C) 2005-2009  Randy Dunlap                         ## +## Copyright (C) 2005-2012  Randy Dunlap                         ## +## Copyright (C) 2012  Dan Luedtke                               ##  ## 								 ##  ## #define enhancements by Armin Kuster <akuster@mvista.com>	 ##  ## Copyright (c) 2000 MontaVista Software, Inc.			 ## @@ -35,6 +36,8 @@ use strict;  #              Small fixes (like spaces vs. \s in regex)  # -- Tim Jansen <tim@tjansen.de> +# 25/07/2012 - Added support for HTML5 +# -- Dan Luedtke <mail@danrl.de>  #  # This will read a 'c' file and scan for embedded comments in the @@ -44,12 +47,16 @@ use strict;  # Note: This only supports 'c'.  # usage: -# kernel-doc [ -docbook | -html | -text | -man | -list ] [ -no-doc-sections ] -#           [ -function funcname [ -function funcname ...] ] c file(s)s > outputfile +# kernel-doc [ -docbook | -html | -html5 | -text | -man | -list ] +#            [ -no-doc-sections ] +#            [ -function funcname [ -function funcname ...] ] +#            c file(s)s > outputfile  # or -#           [ -nofunction funcname [ -function funcname ...] ] c file(s)s > outputfile +#            [ -nofunction funcname [ -function funcname ...] ] +#            c file(s)s > outputfile  # -#  Set output format using one of -docbook -html -text or -man.  Default is man. +#  Set output format using one of -docbook -html -html5 -text or -man. +#  Default is man.  #  The -list format is for internal use by docproc.  #  #  -no-doc-sections @@ -130,6 +137,8 @@ use strict;  # should document the "Context:" of the function, e.g. whether the functions  # can be called form interrupts. Unlike other sections you can end it with an  # empty line. +# A non-void function should have a "Return:" section describing the return +# value(s).  # Example-sections should contain the string EXAMPLE so that they are marked  # appropriately in DocBook.  # @@ -155,6 +164,8 @@ use strict;  # '@parameter' - name of a parameter  # '%CONST' - name of a constant. +## init lots of data +  my $errors = 0;  my $warnings = 0;  my $anon_struct_union = 0; @@ -180,6 +191,14 @@ my $local_lt = "\\\\\\\\lt:";  my $local_gt = "\\\\\\\\gt:";  my $blankline_html = $local_lt . "p" . $local_gt;	# was "<p>" +# html version 5 +my %highlights_html5 = ( $type_constant, "<span class=\"const\">\$1</span>", +			$type_func, "<span class=\"func\">\$1</span>", +			$type_struct_xml, "<span class=\"struct\">\$1</span>", +			$type_env, "<span class=\"env\">\$1</span>", +			$type_param, "<span class=\"param\">\$1</span>" ); +my $blankline_html5 = $local_lt . "br /" . $local_gt; +  # XML, docbook format  my %highlights_xml = ( "([^=])\\\"([^\\\"<]+)\\\"", "\$1<quote>\$2</quote>",  			$type_constant, "<constant>\$1</constant>", @@ -218,23 +237,17 @@ my %highlights_list = ( $type_constant, "\$1",  			$type_param, "\$1" );  my $blankline_list = ""; -sub usage { -    print "Usage: $0 [ -v ] [ -docbook | -html | -text | -man | -list ]\n"; -    print "         [ -no-doc-sections ]\n"; -    print "         [ -function funcname [ -function funcname ...] ]\n"; -    print "         [ -nofunction funcname [ -nofunction funcname ...] ]\n"; -    print "         c source file(s) > outputfile\n"; -    print "         -v : verbose output, more warnings & other info listed\n"; -    exit 1; -} -  # read arguments  if ($#ARGV == -1) {      usage();  } +my $kernelversion; +my $dohighlight = ""; +  my $verbose = 0;  my $output_mode = "man"; +my $output_preformatted = 0;  my $no_doc_sections = 0;  my %highlights = %highlights_man;  my $blankline = $blankline_man; @@ -244,8 +257,9 @@ my $man_date = ('January', 'February', 'March', 'April', 'May', 'June',  		'July', 'August', 'September', 'October',  		'November', 'December')[(localtime)[4]] .    " " . ((localtime)[5]+1900); +my $show_not_found = 0; -# Essentially these are globals +# Essentially these are globals.  # They probably want to be tidied up, made more localised or something.  # CAVEAT EMPTOR!  Some of the others I localised may not want to be, which  # could cause "use of undefined value" or other bugs. @@ -285,9 +299,10 @@ my $doc_special = "\@\%\$\&";  my $doc_start = '^/\*\*\s*$'; # Allow whitespace at end of comment start.  my $doc_end = '\*/';  my $doc_com = '\s*\*\s*'; +my $doc_com_body = '\s*\* ?';  my $doc_decl = $doc_com . '(\w+)';  my $doc_sect = $doc_com . '([' . $doc_special . ']?[\w\s]+):(.*)'; -my $doc_content = $doc_com . '(.*)'; +my $doc_content = $doc_com_body . '(.*)';  my $doc_block = $doc_com . 'DOC:\s*(.*)?';  my %constants; @@ -303,6 +318,7 @@ my $section_default = "Description";	# default section  my $section_intro = "Introduction";  my $section = $section_default;  my $section_context = "Context"; +my $section_return = "Return";  my $undescribed = "-- undescribed --"; @@ -314,6 +330,10 @@ while ($ARGV[0] =~ m/^-(.*)/) {  	$output_mode = "html";  	%highlights = %highlights_html;  	$blankline = $blankline_html; +    } elsif ($cmd eq "-html5") { +	$output_mode = "html5"; +	%highlights = %highlights_html5; +	$blankline = $blankline_html5;      } elsif ($cmd eq "-man") {  	$output_mode = "man";  	%highlights = %highlights_man; @@ -350,9 +370,24 @@ while ($ARGV[0] =~ m/^-(.*)/) {  	usage();      } elsif ($cmd eq '-no-doc-sections') {  	    $no_doc_sections = 1; +    } elsif ($cmd eq '-show-not-found') { +	$show_not_found = 1;      }  } +# continue execution near EOF; + +sub usage { +    print "Usage: $0 [ -docbook | -html | -html5 | -text | -man | -list ]\n"; +    print "         [ -no-doc-sections ]\n"; +    print "         [ -function funcname [ -function funcname ...] ]\n"; +    print "         [ -nofunction funcname [ -nofunction funcname ...] ]\n"; +    print "         [ -v ]\n"; +    print "         c source file(s) > outputfile\n"; +    print "         -v : verbose output, more warnings & other info listed\n"; +    exit 1; +} +  # get kernel version from env  sub get_kernel_version() {      my $version = 'unknown kernel version'; @@ -362,15 +397,6 @@ sub get_kernel_version() {      }      return $version;  } -my $kernelversion = get_kernel_version(); - -# generate a sequence of code that will splice in highlighting information -# using the s// operator. -my $dohighlight = ""; -foreach my $pattern (keys %highlights) { -#   print STDERR "scanning pattern:$pattern, highlight:($highlights{$pattern})\n"; -    $dohighlight .=  "\$contents =~ s:$pattern:$highlights{$pattern}:gs;\n"; -}  ##  # dumps section contents to arrays/hashes intended for that purpose. @@ -450,19 +476,30 @@ sub output_highlight {  #	confess "output_highlight got called with no args?\n";  #   } -    if ($output_mode eq "html" || $output_mode eq "xml") { +    if ($output_mode eq "html" || $output_mode eq "html5" || +	$output_mode eq "xml") {  	$contents = local_unescape($contents);  	# convert data read & converted thru xml_escape() into &xyz; format: -	$contents =~ s/\\\\\\/&/g; +	$contents =~ s/\\\\\\/\&/g;      }  #   print STDERR "contents b4:$contents\n";      eval $dohighlight;      die $@ if $@;  #   print STDERR "contents af:$contents\n"; +#   strip whitespaces when generating html5 +    if ($output_mode eq "html5") { +	$contents =~ s/^\s+//; +	$contents =~ s/\s+$//; +    }      foreach $line (split "\n", $contents) { +	if (! $output_preformatted) { +	    $line =~ s/^\s*//; +	}  	if ($line eq ""){ -	    print $lineprefix, local_unescape($blankline); +	    if (! $output_preformatted) { +		print $lineprefix, local_unescape($blankline); +	    }  	} else {  	    $line =~ s/\\\\\\/\&/g;  	    if ($output_mode eq "man" && substr($line, 0, 1) eq ".") { @@ -475,7 +512,7 @@ sub output_highlight {      }  } -#output sections in html +# output sections in html  sub output_section_html(%) {      my %args = %{$_[0]};      my $section; @@ -635,6 +672,239 @@ sub output_blockhead_html(%) {      print "<hr>\n";  } +# output sections in html5 +sub output_section_html5(%) { +    my %args = %{$_[0]}; +    my $section; + +    foreach $section (@{$args{'sectionlist'}}) { +	print "<section>\n"; +	print "<h1>$section</h1>\n"; +	print "<p>\n"; +	output_highlight($args{'sections'}{$section}); +	print "</p>\n"; +	print "</section>\n"; +    } +} + +# output enum in html5 +sub output_enum_html5(%) { +    my %args = %{$_[0]}; +    my ($parameter); +    my $count; +    my $html5id; + +    $html5id = $args{'enum'}; +    $html5id =~ s/[^a-zA-Z0-9\-]+/_/g; +    print "<article class=\"enum\" id=\"enum:". $html5id . "\">"; +    print "<h1>enum " . $args{'enum'} . "</h1>\n"; +    print "<ol class=\"code\">\n"; +    print "<li>"; +    print "<span class=\"keyword\">enum</span> "; +    print "<span class=\"identifier\">" . $args{'enum'} . "</span> {"; +    print "</li>\n"; +    $count = 0; +    foreach $parameter (@{$args{'parameterlist'}}) { +	print "<li class=\"indent\">"; +	print "<span class=\"param\">" . $parameter . "</span>"; +	if ($count != $#{$args{'parameterlist'}}) { +	    $count++; +	    print ","; +	} +	print "</li>\n"; +    } +    print "<li>};</li>\n"; +    print "</ol>\n"; + +    print "<section>\n"; +    print "<h1>Constants</h1>\n"; +    print "<dl>\n"; +    foreach $parameter (@{$args{'parameterlist'}}) { +	print "<dt>" . $parameter . "</dt>\n"; +	print "<dd>"; +	output_highlight($args{'parameterdescs'}{$parameter}); +	print "</dd>\n"; +    } +    print "</dl>\n"; +    print "</section>\n"; +    output_section_html5(@_); +    print "</article>\n"; +} + +# output typedef in html5 +sub output_typedef_html5(%) { +    my %args = %{$_[0]}; +    my ($parameter); +    my $count; +    my $html5id; + +    $html5id = $args{'typedef'}; +    $html5id =~ s/[^a-zA-Z0-9\-]+/_/g; +    print "<article class=\"typedef\" id=\"typedef:" . $html5id . "\">\n"; +    print "<h1>typedef " . $args{'typedef'} . "</h1>\n"; + +    print "<ol class=\"code\">\n"; +    print "<li>"; +    print "<span class=\"keyword\">typedef</span> "; +    print "<span class=\"identifier\">" . $args{'typedef'} . "</span>"; +    print "</li>\n"; +    print "</ol>\n"; +    output_section_html5(@_); +    print "</article>\n"; +} + +# output struct in html5 +sub output_struct_html5(%) { +    my %args = %{$_[0]}; +    my ($parameter); +    my $html5id; + +    $html5id = $args{'struct'}; +    $html5id =~ s/[^a-zA-Z0-9\-]+/_/g; +    print "<article class=\"struct\" id=\"struct:" . $html5id . "\">\n"; +    print "<hgroup>\n"; +    print "<h1>" . $args{'type'} . " " . $args{'struct'} . "</h1>"; +    print "<h2>". $args{'purpose'} . "</h2>\n"; +    print "</hgroup>\n"; +    print "<ol class=\"code\">\n"; +    print "<li>"; +    print "<span class=\"type\">" . $args{'type'} . "</span> "; +    print "<span class=\"identifier\">" . $args{'struct'} . "</span> {"; +    print "</li>\n"; +    foreach $parameter (@{$args{'parameterlist'}}) { +	print "<li class=\"indent\">"; +	if ($parameter =~ /^#/) { +		print "<span class=\"param\">" . $parameter ."</span>\n"; +		print "</li>\n"; +		next; +	} +	my $parameter_name = $parameter; +	$parameter_name =~ s/\[.*//; + +	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; +	$type = $args{'parametertypes'}{$parameter}; +	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { +	    # pointer-to-function +	    print "<span class=\"type\">$1</span> "; +	    print "<span class=\"param\">$parameter</span>"; +	    print "<span class=\"type\">)</span> "; +	    print "(<span class=\"args\">$2</span>);"; +	} elsif ($type =~ m/^(.*?)\s*(:.*)/) { +	    # bitfield +	    print "<span class=\"type\">$1</span> "; +	    print "<span class=\"param\">$parameter</span>"; +	    print "<span class=\"bits\">$2</span>;"; +	} else { +	    print "<span class=\"type\">$type</span> "; +	    print "<span class=\"param\">$parameter</span>;"; +	} +	print "</li>\n"; +    } +    print "<li>};</li>\n"; +    print "</ol>\n"; + +    print "<section>\n"; +    print "<h1>Members</h1>\n"; +    print "<dl>\n"; +    foreach $parameter (@{$args{'parameterlist'}}) { +	($parameter =~ /^#/) && next; + +	my $parameter_name = $parameter; +	$parameter_name =~ s/\[.*//; + +	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; +	print "<dt>" . $parameter . "</dt>\n"; +	print "<dd>"; +	output_highlight($args{'parameterdescs'}{$parameter_name}); +	print "</dd>\n"; +    } +    print "</dl>\n"; +    print "</section>\n"; +    output_section_html5(@_); +    print "</article>\n"; +} + +# output function in html5 +sub output_function_html5(%) { +    my %args = %{$_[0]}; +    my ($parameter, $section); +    my $count; +    my $html5id; + +    $html5id = $args{'function'}; +    $html5id =~ s/[^a-zA-Z0-9\-]+/_/g; +    print "<article class=\"function\" id=\"func:". $html5id . "\">\n"; +    print "<hgroup>\n"; +    print "<h1>" . $args{'function'} . "</h1>"; +    print "<h2>" . $args{'purpose'} . "</h2>\n"; +    print "</hgroup>\n"; +    print "<ol class=\"code\">\n"; +    print "<li>"; +    print "<span class=\"type\">" . $args{'functiontype'} . "</span> "; +    print "<span class=\"identifier\">" . $args{'function'} . "</span> ("; +    print "</li>"; +    $count = 0; +    foreach $parameter (@{$args{'parameterlist'}}) { +	print "<li class=\"indent\">"; +	$type = $args{'parametertypes'}{$parameter}; +	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { +	    # pointer-to-function +	    print "<span class=\"type\">$1</span> "; +	    print "<span class=\"param\">$parameter</span>"; +	    print "<span class=\"type\">)</span> "; +	    print "(<span class=\"args\">$2</span>)"; +	} else { +	    print "<span class=\"type\">$type</span> "; +	    print "<span class=\"param\">$parameter</span>"; +	} +	if ($count != $#{$args{'parameterlist'}}) { +	    $count++; +	    print ","; +	} +	print "</li>\n"; +    } +    print "<li>)</li>\n"; +    print "</ol>\n"; + +    print "<section>\n"; +    print "<h1>Arguments</h1>\n"; +    print "<p>\n"; +    print "<dl>\n"; +    foreach $parameter (@{$args{'parameterlist'}}) { +	my $parameter_name = $parameter; +	$parameter_name =~ s/\[.*//; + +	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; +	print "<dt>" . $parameter . "</dt>\n"; +	print "<dd>"; +	output_highlight($args{'parameterdescs'}{$parameter_name}); +	print "</dd>\n"; +    } +    print "</dl>\n"; +    print "</section>\n"; +    output_section_html5(@_); +    print "</article>\n"; +} + +# output DOC: block header in html5 +sub output_blockhead_html5(%) { +    my %args = %{$_[0]}; +    my ($parameter, $section); +    my $count; +    my $html5id; + +    foreach $section (@{$args{'sectionlist'}}) { +	$html5id = $section; +	$html5id =~ s/[^a-zA-Z0-9\-]+/_/g; +	print "<article class=\"doc\" id=\"doc:". $html5id . "\">\n"; +	print "<h1>$section</h1>\n"; +	print "<p>\n"; +	output_highlight($args{'sections'}{$section}); +	print "</p>\n"; +    } +    print "</article>\n"; +} +  sub output_section_xml(%) {      my %args = %{$_[0]};      my $section; @@ -645,10 +915,12 @@ sub output_section_xml(%) {  	print "<title>$section</title>\n";  	if ($section =~ m/EXAMPLE/i) {  	    print "<informalexample><programlisting>\n"; +	    $output_preformatted = 1;  	} else {  	    print "<para>\n";  	}  	output_highlight($args{'sections'}{$section}); +	$output_preformatted = 0;  	if ($section =~ m/EXAMPLE/i) {  	    print "</programlisting></informalexample>\n";  	} else { @@ -770,7 +1042,11 @@ sub output_struct_xml(%) {      print $args{'type'} . " " . $args{'struct'} . " {\n";      foreach $parameter (@{$args{'parameterlist'}}) {  	if ($parameter =~ /^#/) { -	    print "$parameter\n"; +	    my $prm = $parameter; +	    # convert data read & converted thru xml_escape() into &xyz; format: +	    # This allows us to have #define macros interspersed in a struct. +	    $prm =~ s/\\\\\\/\&/g; +	    print "$prm\n";  	    next;  	} @@ -947,10 +1223,12 @@ sub output_blockhead_xml(%) {  	}  	if ($section =~ m/EXAMPLE/i) {  	    print "<example><para>\n"; +	    $output_preformatted = 1;  	} else {  	    print "<para>\n";  	}  	output_highlight($args{'sections'}{$section}); +	$output_preformatted = 0;  	if ($section =~ m/EXAMPLE/i) {  	    print "</para></example>\n";  	} else { @@ -1026,10 +1304,12 @@ sub output_function_gnome {  	print "<simplesect>\n <title>$section</title>\n";  	if ($section =~ m/EXAMPLE/i) {  	    print "<example><programlisting>\n"; +	    $output_preformatted = 1;  	} else {  	}  	print "<para>\n";  	output_highlight($args{'sections'}{$section}); +	$output_preformatted = 0;  	print "</para>\n";  	if ($section =~ m/EXAMPLE/i) {  	    print "</programlisting></example>\n"; @@ -1473,7 +1753,7 @@ sub dump_struct($$) {  	# strip kmemcheck_bitfield_{begin,end}.*;  	$members =~ s/kmemcheck_bitfield_.*?;//gos;  	# strip attributes -	$members =~ s/__aligned\s*\(\d+\)//gos; +	$members =~ s/__aligned\s*\(.+\)//gos;  	create_parameterlist($members, ';', $file);  	check_sections($file, $declaration_name, "struct", $sectcheck, $struct_actual, $nested); @@ -1701,7 +1981,9 @@ sub push_parameter($$$) {  	}  	} -	# strip spaces from $param so that it is one continous string +	$param = xml_escape($param); + +	# strip spaces from $param so that it is one continuous string  	# on @parameterlist;  	# this fixes a problem where check_sections() cannot find  	# a parameter like "addr[6 + 2]" because it actually appears @@ -1763,12 +2045,35 @@ sub check_sections($$$$$$) {  }  ## +# Checks the section describing the return value of a function. +sub check_return_section { +        my $file = shift; +        my $declaration_name = shift; +        my $return_type = shift; + +        # Ignore an empty return type (It's a macro) +        # Ignore functions with a "void" return type. (But don't ignore "void *") +        if (($return_type eq "") || ($return_type =~ /void\s*\w*\s*$/)) { +                return; +        } + +        if (!defined($sections{$section_return}) || +            $sections{$section_return} eq "") { +                print STDERR "Warning(${file}:$.): " . +                        "No description found for return value of " . +                        "'$declaration_name'\n"; +                ++$warnings; +        } +} + +##  # takes a function prototype and the name of the current file being  # processed and spits out all the details stored in the global  # arrays/hashes.  sub dump_function($$) {      my $prototype = shift;      my $file = shift; +    my $noret = 0;      $prototype =~ s/^static +//;      $prototype =~ s/^extern +//; @@ -1778,10 +2083,11 @@ sub dump_function($$) {      $prototype =~ s/^__inline +//;      $prototype =~ s/^__always_inline +//;      $prototype =~ s/^noinline +//; -    $prototype =~ s/__devinit +//;      $prototype =~ s/__init +//;      $prototype =~ s/__init_or_module +//; -    $prototype =~ s/^#\s*define\s+//; #ak added +    $prototype =~ s/__must_check +//; +    $prototype =~ s/__weak +//; +    my $define = $prototype =~ s/^#\s*define\s+//; #ak added      $prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//;      # Yes, this truly is vile.  We are looking for: @@ -1800,7 +2106,15 @@ sub dump_function($$) {      # - atomic_set (macro)      # - pci_match_device, __copy_to_user (long return type) -    if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || +    if ($define && $prototype =~ m/^()([a-zA-Z0-9_~:]+)\s+/) { +        # This is an object-like macro, it has no return type and no parameter +        # list. +        # Function-like macros are not allowed to have spaces between +        # declaration_name and opening parenthesis (notice the \s+). +        $return_type = $1; +        $declaration_name = $2; +        $noret = 1; +    } elsif ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||  	$prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||  	$prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||  	$prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || @@ -1823,14 +2137,22 @@ sub dump_function($$) {  	create_parameterlist($args, ',', $file);      } else { -	print STDERR "Error(${file}:$.): cannot understand prototype: '$prototype'\n"; -	++$errors; +	print STDERR "Warning(${file}:$.): cannot understand function prototype: '$prototype'\n";  	return;      }  	my $prms = join " ", @parameterlist;  	check_sections($file, $declaration_name, "function", $sectcheck, $prms, ""); +        # This check emits a lot of warnings at the moment, because many +        # functions don't have a 'Return' doc section. So until the number +        # of warnings goes sufficiently down, the check is only performed in +        # verbose mode. +        # TODO: always perform the check. +        if ($verbose && !$noret) { +                check_return_section($file, $declaration_name, $return_type); +        } +      output_declaration($declaration_name,  		       'function',  		       {'function' => $declaration_name, @@ -1845,34 +2167,6 @@ sub dump_function($$) {  		       });  } -sub process_file($); - -# Read the file that maps relative names to absolute names for -# separate source and object directories and for shadow trees. -if (open(SOURCE_MAP, "<.tmp_filelist.txt")) { -	my ($relname, $absname); -	while(<SOURCE_MAP>) { -		chop(); -		($relname, $absname) = (split())[0..1]; -		$relname =~ s:^/+::; -		$source_map{$relname} = $absname; -	} -	close(SOURCE_MAP); -} - -foreach (@ARGV) { -    chomp; -    process_file($_); -} -if ($verbose && $errors) { -  print STDERR "$errors errors\n"; -} -if ($verbose && $warnings) { -  print STDERR "$warnings warnings\n"; -} - -exit($errors); -  sub reset_state {      $function = "";      %constants = (); @@ -2068,6 +2362,9 @@ sub process_file($) {      $section_counter = 0;      while (<IN>) { +	while (s/\\\s*$//) { +	    $_ .= <IN>; +	}  	if ($state == 0) {  	    if (/$doc_start/o) {  		$state = 1;		# next line is always the function name @@ -2095,7 +2392,7 @@ sub process_file($) {  		    $descr= $1;  		    $descr =~ s/^\s*//;  		    $descr =~ s/\s*$//; -		    $descr =~ s/\s+/ /; +		    $descr =~ s/\s+/ /g;  		    $declaration_purpose = xml_escape($descr);  		    $in_purpose = 1;  		} else { @@ -2187,6 +2484,7 @@ sub process_file($) {  		    # Continued declaration purpose  		    chomp($declaration_purpose);  		    $declaration_purpose .= " " . xml_escape($1); +		    $declaration_purpose =~ s/\s+/ /g;  		} else {  		    $contents .= $1 . "\n";  		} @@ -2249,6 +2547,9 @@ sub process_file($) {      }      if ($initial_section_counter == $section_counter) {  	print STDERR "Warning(${file}): no structured comments found\n"; +	if (($function_only == 1) && ($show_not_found == 1)) { +	    print STDERR "    Was looking for '$_'.\n" for keys %function_table; +	}  	if ($output_mode eq "xml") {  	    # The template wants at least one RefEntry here; make one.  	    print "<refentry>\n"; @@ -2279,3 +2580,39 @@ sub process_file($) {  	}      }  } + + +$kernelversion = get_kernel_version(); + +# generate a sequence of code that will splice in highlighting information +# using the s// operator. +foreach my $pattern (keys %highlights) { +#   print STDERR "scanning pattern:$pattern, highlight:($highlights{$pattern})\n"; +    $dohighlight .=  "\$contents =~ s:$pattern:$highlights{$pattern}:gs;\n"; +} + +# Read the file that maps relative names to absolute names for +# separate source and object directories and for shadow trees. +if (open(SOURCE_MAP, "<.tmp_filelist.txt")) { +	my ($relname, $absname); +	while(<SOURCE_MAP>) { +		chop(); +		($relname, $absname) = (split())[0..1]; +		$relname =~ s:^/+::; +		$source_map{$relname} = $absname; +	} +	close(SOURCE_MAP); +} + +foreach (@ARGV) { +    chomp; +    process_file($_); +} +if ($verbose && $errors) { +  print STDERR "$errors errors\n"; +} +if ($verbose && $warnings) { +  print STDERR "$warnings warnings\n"; +} + +exit($errors);  | 
