aboutsummaryrefslogtreecommitdiffstats
path: root/meta-oe/recipes-support/multipath-tools/files/0008-multipath-tools-refresh-kernel-doc-from-kernel-sourc.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-oe/recipes-support/multipath-tools/files/0008-multipath-tools-refresh-kernel-doc-from-kernel-sourc.patch')
-rw-r--r--meta-oe/recipes-support/multipath-tools/files/0008-multipath-tools-refresh-kernel-doc-from-kernel-sourc.patch784
1 files changed, 784 insertions, 0 deletions
diff --git a/meta-oe/recipes-support/multipath-tools/files/0008-multipath-tools-refresh-kernel-doc-from-kernel-sourc.patch b/meta-oe/recipes-support/multipath-tools/files/0008-multipath-tools-refresh-kernel-doc-from-kernel-sourc.patch
new file mode 100644
index 0000000000..3752158704
--- /dev/null
+++ b/meta-oe/recipes-support/multipath-tools/files/0008-multipath-tools-refresh-kernel-doc-from-kernel-sourc.patch
@@ -0,0 +1,784 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Xose Vazquez Perez <xose.vazquez@gmail.com>
+Date: Sun, 13 May 2018 00:39:42 +0200
+Subject: [PATCH] multipath-tools: refresh kernel-doc from kernel sources
+
+Cc: Gris Ge <fge@redhat.com>
+Cc: Christophe Varoqui <christophe.varoqui@opensvc.com>
+Cc: device-mapper development <dm-devel@redhat.com>
+Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com>
+Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
+---
+ libdmmp/docs/kernel-doc | 671 ++++++++++++++++++++++++++----------------------
+ 1 file changed, 368 insertions(+), 303 deletions(-)
+
+diff --git a/libdmmp/docs/kernel-doc b/libdmmp/docs/kernel-doc
+index fee8952..0057d8e 100755
+--- a/libdmmp/docs/kernel-doc
++++ b/libdmmp/docs/kernel-doc
+@@ -1,4 +1,5 @@
+ #!/usr/bin/env perl
++# SPDX-License-Identifier: GPL-2.0
+
+ use warnings;
+ use strict;
+@@ -328,13 +329,15 @@ my $lineprefix="";
+ use constant {
+ STATE_NORMAL => 0, # normal code
+ STATE_NAME => 1, # looking for function name
+- STATE_FIELD => 2, # scanning field start
+- STATE_PROTO => 3, # scanning prototype
+- STATE_DOCBLOCK => 4, # documentation block
+- STATE_INLINE => 5, # gathering documentation outside main block
++ STATE_BODY_MAYBE => 2, # body - or maybe more description
++ STATE_BODY => 3, # the body of the comment
++ STATE_PROTO => 4, # scanning prototype
++ STATE_DOCBLOCK => 5, # documentation block
++ STATE_INLINE => 6, # gathering documentation outside main block
+ };
+ my $state;
+ my $in_doc_sect;
++my $leading_space;
+
+ # Inline documentation state
+ use constant {
+@@ -363,7 +366,7 @@ my $doc_sect = $doc_com .
+ my $doc_content = $doc_com_body . '(.*)';
+ my $doc_block = $doc_com . 'DOC:\s*(.*)?';
+ my $doc_inline_start = '^\s*/\*\*\s*$';
+-my $doc_inline_sect = '\s*\*\s*(@[\w\s]+):(.*)';
++my $doc_inline_sect = '\s*\*\s*(@\s*[\w][\w\.]*\s*):(.*)';
+ my $doc_inline_end = '^\s*\*/\s*$';
+ my $doc_inline_oneline = '^\s*/\*\*\s*(@[\w\s]+):\s*(.*)\s*\*/\s*$';
+ my $export_symbol = '^\s*EXPORT_SYMBOL(_GPL)?\s*\(\s*(\w+)\s*\)\s*;';
+@@ -553,10 +556,9 @@ sub output_highlight {
+ }
+ if ($line eq ""){
+ if (! $output_preformatted) {
+- print $lineprefix, local_unescape($blankline);
++ print $lineprefix, $blankline;
+ }
+ } else {
+- $line =~ s/\\\\\\/\&/g;
+ if ($output_mode eq "man" && substr($line, 0, 1) eq ".") {
+ print "\\&$line";
+ } else {
+@@ -747,17 +749,73 @@ sub output_blockhead_rst(%) {
+ }
+ }
+
+-sub output_highlight_rst {
+- my $contents = join "\n",@_;
+- my $line;
+-
+- # undo the evil effects of xml_escape() earlier
+- $contents = xml_unescape($contents);
+-
++#
++# Apply the RST highlights to a sub-block of text.
++#
++sub highlight_block($) {
++ # The dohighlight kludge requires the text be called $contents
++ my $contents = shift;
+ eval $dohighlight;
+ die $@ if $@;
++ return $contents;
++}
+
+- foreach $line (split "\n", $contents) {
++#
++# Regexes used only here.
++#
++my $sphinx_literal = '^[^.].*::$';
++my $sphinx_cblock = '^\.\.\ +code-block::';
++
++sub output_highlight_rst {
++ my $input = join "\n",@_;
++ my $output = "";
++ my $line;
++ my $in_literal = 0;
++ my $litprefix;
++ my $block = "";
++
++ foreach $line (split "\n",$input) {
++ #
++ # If we're in a literal block, see if we should drop out
++ # of it. Otherwise pass the line straight through unmunged.
++ #
++ if ($in_literal) {
++ if (! ($line =~ /^\s*$/)) {
++ #
++ # If this is the first non-blank line in a literal
++ # block we need to figure out what the proper indent is.
++ #
++ if ($litprefix eq "") {
++ $line =~ /^(\s*)/;
++ $litprefix = '^' . $1;
++ $output .= $line . "\n";
++ } elsif (! ($line =~ /$litprefix/)) {
++ $in_literal = 0;
++ } else {
++ $output .= $line . "\n";
++ }
++ } else {
++ $output .= $line . "\n";
++ }
++ }
++ #
++ # Not in a literal block (or just dropped out)
++ #
++ if (! $in_literal) {
++ $block .= $line . "\n";
++ if (($line =~ /$sphinx_literal/) || ($line =~ /$sphinx_cblock/)) {
++ $in_literal = 1;
++ $litprefix = "";
++ $output .= highlight_block($block);
++ $block = ""
++ }
++ }
++ }
++
++ if ($block) {
++ $output .= highlight_block($block);
++ }
++ foreach $line (split "\n", $output) {
+ print $lineprefix . $line . "\n";
+ }
+ }
+@@ -1062,7 +1120,7 @@ sub dump_struct($$) {
+ # Handle bitmaps
+ $arg =~ s/:\s*\d+\s*//g;
+ # Handle arrays
+- $arg =~ s/\[\S+\]//g;
++ $arg =~ s/\[.*\]//g;
+ # The type may have multiple words,
+ # and multiple IDs can be defined, like:
+ # const struct foo, *bar, foobar
+@@ -1422,8 +1480,6 @@ sub push_parameter($$$$) {
+ }
+ }
+
+- $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
+@@ -1522,6 +1578,7 @@ sub dump_function($$) {
+ $prototype =~ s/__meminit +//;
+ $prototype =~ s/__must_check +//;
+ $prototype =~ s/__weak +//;
++ $prototype =~ s/__sched +//;
+ my $define = $prototype =~ s/^#\s*define\s+//; #ak added
+ $prototype =~ s/__attribute__\s*\(\(
+ (?:
+@@ -1748,47 +1805,6 @@ sub process_proto_type($$) {
+ }
+ }
+
+-# xml_escape: replace <, >, and & in the text stream;
+-#
+-# however, formatting controls that are generated internally/locally in the
+-# kernel-doc script are not escaped here; instead, they begin life like
+-# $blankline_html (4 of '\' followed by a mnemonic + ':'), then these strings
+-# are converted to their mnemonic-expected output, without the 4 * '\' & ':',
+-# just before actual output; (this is done by local_unescape())
+-sub xml_escape($) {
+- my $text = shift;
+- if ($output_mode eq "man") {
+- return $text;
+- }
+- $text =~ s/\&/\\\\\\amp;/g;
+- $text =~ s/\</\\\\\\lt;/g;
+- $text =~ s/\>/\\\\\\gt;/g;
+- return $text;
+-}
+-
+-# xml_unescape: reverse the effects of xml_escape
+-sub xml_unescape($) {
+- my $text = shift;
+- if ($output_mode eq "man") {
+- return $text;
+- }
+- $text =~ s/\\\\\\amp;/\&/g;
+- $text =~ s/\\\\\\lt;/</g;
+- $text =~ s/\\\\\\gt;/>/g;
+- return $text;
+-}
+-
+-# convert local escape strings to html
+-# local escape strings look like: '\\\\menmonic:' (that's 4 backslashes)
+-sub local_unescape($) {
+- my $text = shift;
+- if ($output_mode eq "man") {
+- return $text;
+- }
+- $text =~ s/\\\\\\\\lt:/</g;
+- $text =~ s/\\\\\\\\gt:/>/g;
+- return $text;
+-}
+
+ sub map_filename($) {
+ my $file;
+@@ -1826,15 +1842,291 @@ sub process_export_file($) {
+ close(IN);
+ }
+
+-sub process_file($) {
+- my $file;
++#
++# Parsers for the various processing states.
++#
++# STATE_NORMAL: looking for the /** to begin everything.
++#
++sub process_normal() {
++ if (/$doc_start/o) {
++ $state = STATE_NAME; # next line is always the function name
++ $in_doc_sect = 0;
++ $declaration_start_line = $. + 1;
++ }
++}
++
++#
++# STATE_NAME: Looking for the "name - description" line
++#
++sub process_name($$) {
++ my $file = shift;
+ my $identifier;
+- my $func;
+ my $descr;
+- my $in_purpose = 0;
++
++ if (/$doc_block/o) {
++ $state = STATE_DOCBLOCK;
++ $contents = "";
++ $new_start_line = $. + 1;
++
++ if ( $1 eq "" ) {
++ $section = $section_intro;
++ } else {
++ $section = $1;
++ }
++ }
++ elsif (/$doc_decl/o) {
++ $identifier = $1;
++ if (/\s*([\w\s]+?)(\(\))?\s*-/) {
++ $identifier = $1;
++ }
++
++ $state = STATE_BODY;
++ # if there's no @param blocks need to set up default section
++ # here
++ $contents = "";
++ $section = $section_default;
++ $new_start_line = $. + 1;
++ if (/-(.*)/) {
++ # strip leading/trailing/multiple spaces
++ $descr= $1;
++ $descr =~ s/^\s*//;
++ $descr =~ s/\s*$//;
++ $descr =~ s/\s+/ /g;
++ $declaration_purpose = $descr;
++ $state = STATE_BODY_MAYBE;
++ } else {
++ $declaration_purpose = "";
++ }
++
++ if (($declaration_purpose eq "") && $verbose) {
++ print STDERR "${file}:$.: warning: missing initial short description on line:\n";
++ print STDERR $_;
++ ++$warnings;
++ }
++
++ if ($identifier =~ m/^struct/) {
++ $decl_type = 'struct';
++ } elsif ($identifier =~ m/^union/) {
++ $decl_type = 'union';
++ } elsif ($identifier =~ m/^enum/) {
++ $decl_type = 'enum';
++ } elsif ($identifier =~ m/^typedef/) {
++ $decl_type = 'typedef';
++ } else {
++ $decl_type = 'function';
++ }
++
++ if ($verbose) {
++ print STDERR "${file}:$.: info: Scanning doc for $identifier\n";
++ }
++ } else {
++ print STDERR "${file}:$.: warning: Cannot understand $_ on line $.",
++ " - I thought it was a doc line\n";
++ ++$warnings;
++ $state = STATE_NORMAL;
++ }
++}
++
++
++#
++# STATE_BODY and STATE_BODY_MAYBE: the bulk of a kerneldoc comment.
++#
++sub process_body($$) {
++ my $file = shift;
++
++ if (/$doc_sect/i) { # case insensitive for supported section names
++ $newsection = $1;
++ $newcontents = $2;
++
++ # map the supported section names to the canonical names
++ if ($newsection =~ m/^description$/i) {
++ $newsection = $section_default;
++ } elsif ($newsection =~ m/^context$/i) {
++ $newsection = $section_context;
++ } elsif ($newsection =~ m/^returns?$/i) {
++ $newsection = $section_return;
++ } elsif ($newsection =~ m/^\@return$/) {
++ # special: @return is a section, not a param description
++ $newsection = $section_return;
++ }
++
++ if (($contents ne "") && ($contents ne "\n")) {
++ if (!$in_doc_sect && $verbose) {
++ print STDERR "${file}:$.: warning: contents before sections\n";
++ ++$warnings;
++ }
++ dump_section($file, $section, $contents);
++ $section = $section_default;
++ }
++
++ $in_doc_sect = 1;
++ $state = STATE_BODY;
++ $contents = $newcontents;
++ $new_start_line = $.;
++ while (substr($contents, 0, 1) eq " ") {
++ $contents = substr($contents, 1);
++ }
++ if ($contents ne "") {
++ $contents .= "\n";
++ }
++ $section = $newsection;
++ $leading_space = undef;
++ } elsif (/$doc_end/) {
++ if (($contents ne "") && ($contents ne "\n")) {
++ dump_section($file, $section, $contents);
++ $section = $section_default;
++ $contents = "";
++ }
++ # look for doc_com + <text> + doc_end:
++ if ($_ =~ m'\s*\*\s*[a-zA-Z_0-9:\.]+\*/') {
++ print STDERR "${file}:$.: warning: suspicious ending line: $_";
++ ++$warnings;
++ }
++
++ $prototype = "";
++ $state = STATE_PROTO;
++ $brcount = 0;
++ } elsif (/$doc_content/) {
++ # miguel-style comment kludge, look for blank lines after
++ # @parameter line to signify start of description
++ if ($1 eq "") {
++ if ($section =~ m/^@/ || $section eq $section_context) {
++ dump_section($file, $section, $contents);
++ $section = $section_default;
++ $contents = "";
++ $new_start_line = $.;
++ } else {
++ $contents .= "\n";
++ }
++ $state = STATE_BODY;
++ } elsif ($state == STATE_BODY_MAYBE) {
++ # Continued declaration purpose
++ chomp($declaration_purpose);
++ $declaration_purpose .= " " . $1;
++ $declaration_purpose =~ s/\s+/ /g;
++ } else {
++ my $cont = $1;
++ if ($section =~ m/^@/ || $section eq $section_context) {
++ if (!defined $leading_space) {
++ if ($cont =~ m/^(\s+)/) {
++ $leading_space = $1;
++ } else {
++ $leading_space = "";
++ }
++ }
++ $cont =~ s/^$leading_space//;
++ }
++ $contents .= $cont . "\n";
++ }
++ } else {
++ # i dont know - bad line? ignore.
++ print STDERR "${file}:$.: warning: bad line: $_";
++ ++$warnings;
++ }
++}
++
++
++#
++# STATE_PROTO: reading a function/whatever prototype.
++#
++sub process_proto($$) {
++ my $file = shift;
++
++ if (/$doc_inline_oneline/) {
++ $section = $1;
++ $contents = $2;
++ if ($contents ne "") {
++ $contents .= "\n";
++ dump_section($file, $section, $contents);
++ $section = $section_default;
++ $contents = "";
++ }
++ } elsif (/$doc_inline_start/) {
++ $state = STATE_INLINE;
++ $inline_doc_state = STATE_INLINE_NAME;
++ } elsif ($decl_type eq 'function') {
++ process_proto_function($_, $file);
++ } else {
++ process_proto_type($_, $file);
++ }
++}
++
++#
++# STATE_DOCBLOCK: within a DOC: block.
++#
++sub process_docblock($$) {
++ my $file = shift;
++
++ if (/$doc_end/) {
++ dump_doc_section($file, $section, $contents);
++ $section = $section_default;
++ $contents = "";
++ $function = "";
++ %parameterdescs = ();
++ %parametertypes = ();
++ @parameterlist = ();
++ %sections = ();
++ @sectionlist = ();
++ $prototype = "";
++ $state = STATE_NORMAL;
++ } elsif (/$doc_content/) {
++ if ( $1 eq "" ) {
++ $contents .= $blankline;
++ } else {
++ $contents .= $1 . "\n";
++ }
++ }
++}
++
++#
++# STATE_INLINE: docbook comments within a prototype.
++#
++sub process_inline($$) {
++ my $file = shift;
++
++ # First line (state 1) needs to be a @parameter
++ if ($inline_doc_state == STATE_INLINE_NAME && /$doc_inline_sect/o) {
++ $section = $1;
++ $contents = $2;
++ $new_start_line = $.;
++ if ($contents ne "") {
++ while (substr($contents, 0, 1) eq " ") {
++ $contents = substr($contents, 1);
++ }
++ $contents .= "\n";
++ }
++ $inline_doc_state = STATE_INLINE_TEXT;
++ # Documentation block end */
++ } elsif (/$doc_inline_end/) {
++ if (($contents ne "") && ($contents ne "\n")) {
++ dump_section($file, $section, $contents);
++ $section = $section_default;
++ $contents = "";
++ }
++ $state = STATE_PROTO;
++ $inline_doc_state = STATE_INLINE_NA;
++ # Regular text
++ } elsif (/$doc_content/) {
++ if ($inline_doc_state == STATE_INLINE_TEXT) {
++ $contents .= $1 . "\n";
++ # nuke leading blank lines
++ if ($contents =~ /^\s*$/) {
++ $contents = "";
++ }
++ } elsif ($inline_doc_state == STATE_INLINE_NAME) {
++ $inline_doc_state = STATE_INLINE_ERROR;
++ print STDERR "${file}:$.: warning: ";
++ print STDERR "Incorrect use of kernel-doc format: $_";
++ ++$warnings;
++ }
++ }
++}
++
++
++sub process_file($) {
++ my $file;
+ my $initial_section_counter = $section_counter;
+ my ($orig_file) = @_;
+- my $leading_space;
+
+ $file = map_filename($orig_file);
+
+@@ -1853,250 +2145,23 @@ sub process_file($) {
+ }
+ # Replace tabs by spaces
+ while ($_ =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e) {};
++ # Hand this line to the appropriate state handler
+ if ($state == STATE_NORMAL) {
+- if (/$doc_start/o) {
+- $state = STATE_NAME; # next line is always the function name
+- $in_doc_sect = 0;
+- $declaration_start_line = $. + 1;
+- }
+- } elsif ($state == STATE_NAME) {# this line is the function name (always)
+- if (/$doc_block/o) {
+- $state = STATE_DOCBLOCK;
+- $contents = "";
+- $new_start_line = $. + 1;
+-
+- if ( $1 eq "" ) {
+- $section = $section_intro;
+- } else {
+- $section = $1;
+- }
+- }
+- elsif (/$doc_decl/o) {
+- $identifier = $1;
+- if (/\s*([\w\s]+?)\s*-/) {
+- $identifier = $1;
+- }
+-
+- $state = STATE_FIELD;
+- # if there's no @param blocks need to set up default section
+- # here
+- $contents = "";
+- $section = $section_default;
+- $new_start_line = $. + 1;
+- if (/-(.*)/) {
+- # strip leading/trailing/multiple spaces
+- $descr= $1;
+- $descr =~ s/^\s*//;
+- $descr =~ s/\s*$//;
+- $descr =~ s/\s+/ /g;
+- $declaration_purpose = xml_escape($descr);
+- $in_purpose = 1;
+- } else {
+- $declaration_purpose = "";
+- }
+-
+- if (($declaration_purpose eq "") && $verbose) {
+- print STDERR "${file}:$.: warning: missing initial short description on line:\n";
+- print STDERR $_;
+- ++$warnings;
+- }
+-
+- if ($identifier =~ m/^struct/) {
+- $decl_type = 'struct';
+- } elsif ($identifier =~ m/^union/) {
+- $decl_type = 'union';
+- } elsif ($identifier =~ m/^enum/) {
+- $decl_type = 'enum';
+- } elsif ($identifier =~ m/^typedef/) {
+- $decl_type = 'typedef';
+- } else {
+- $decl_type = 'function';
+- }
+-
+- if ($verbose) {
+- print STDERR "${file}:$.: info: Scanning doc for $identifier\n";
+- }
+- } else {
+- print STDERR "${file}:$.: warning: Cannot understand $_ on line $.",
+- " - I thought it was a doc line\n";
+- ++$warnings;
+- $state = STATE_NORMAL;
+- }
+- } elsif ($state == STATE_FIELD) { # look for head: lines, and include content
+- if (/$doc_sect/i) { # case insensitive for supported section names
+- $newsection = $1;
+- $newcontents = $2;
+-
+- # map the supported section names to the canonical names
+- if ($newsection =~ m/^description$/i) {
+- $newsection = $section_default;
+- } elsif ($newsection =~ m/^context$/i) {
+- $newsection = $section_context;
+- } elsif ($newsection =~ m/^returns?$/i) {
+- $newsection = $section_return;
+- } elsif ($newsection =~ m/^\@return$/) {
+- # special: @return is a section, not a param description
+- $newsection = $section_return;
+- }
+-
+- if (($contents ne "") && ($contents ne "\n")) {
+- if (!$in_doc_sect && $verbose) {
+- print STDERR "${file}:$.: warning: contents before sections\n";
+- ++$warnings;
+- }
+- dump_section($file, $section, xml_escape($contents));
+- $section = $section_default;
+- }
+-
+- $in_doc_sect = 1;
+- $in_purpose = 0;
+- $contents = $newcontents;
+- $new_start_line = $.;
+- while (substr($contents, 0, 1) eq " ") {
+- $contents = substr($contents, 1);
+- }
+- if ($contents ne "") {
+- $contents .= "\n";
+- }
+- $section = $newsection;
+- $leading_space = undef;
+- } elsif (/$doc_end/) {
+- if (($contents ne "") && ($contents ne "\n")) {
+- dump_section($file, $section, xml_escape($contents));
+- $section = $section_default;
+- $contents = "";
+- }
+- # look for doc_com + <text> + doc_end:
+- if ($_ =~ m'\s*\*\s*[a-zA-Z_0-9:\.]+\*/') {
+- print STDERR "${file}:$.: warning: suspicious ending line: $_";
+- ++$warnings;
+- }
+-
+- $prototype = "";
+- $state = STATE_PROTO;
+- $brcount = 0;
+-# 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
+- if ($1 eq "") {
+- if ($section =~ m/^@/ || $section eq $section_context) {
+- dump_section($file, $section, xml_escape($contents));
+- $section = $section_default;
+- $contents = "";
+- $new_start_line = $.;
+- } else {
+- $contents .= "\n";
+- }
+- $in_purpose = 0;
+- } elsif ($in_purpose == 1) {
+- # Continued declaration purpose
+- chomp($declaration_purpose);
+- $declaration_purpose .= " " . xml_escape($1);
+- $declaration_purpose =~ s/\s+/ /g;
+- } else {
+- my $cont = $1;
+- if ($section =~ m/^@/ || $section eq $section_context) {
+- if (!defined $leading_space) {
+- if ($cont =~ m/^(\s+)/) {
+- $leading_space = $1;
+- } else {
+- $leading_space = "";
+- }
+- }
+-
+- $cont =~ s/^$leading_space//;
+- }
+- $contents .= $cont . "\n";
+- }
+- } else {
+- # i dont know - bad line? ignore.
+- print STDERR "${file}:$.: warning: bad line: $_";
+- ++$warnings;
+- }
++ process_normal();
++ } elsif ($state == STATE_NAME) {
++ process_name($file, $_);
++ } elsif ($state == STATE_BODY || $state == STATE_BODY_MAYBE) {
++ process_body($file, $_);
+ } elsif ($state == STATE_INLINE) { # scanning for inline parameters
+- # First line (state 1) needs to be a @parameter
+- if ($inline_doc_state == STATE_INLINE_NAME && /$doc_inline_sect/o) {
+- $section = $1;
+- $contents = $2;
+- $new_start_line = $.;
+- if ($contents ne "") {
+- while (substr($contents, 0, 1) eq " ") {
+- $contents = substr($contents, 1);
+- }
+- $contents .= "\n";
+- }
+- $inline_doc_state = STATE_INLINE_TEXT;
+- # Documentation block end */
+- } elsif (/$doc_inline_end/) {
+- if (($contents ne "") && ($contents ne "\n")) {
+- dump_section($file, $section, xml_escape($contents));
+- $section = $section_default;
+- $contents = "";
+- }
+- $state = STATE_PROTO;
+- $inline_doc_state = STATE_INLINE_NA;
+- # Regular text
+- } elsif (/$doc_content/) {
+- if ($inline_doc_state == STATE_INLINE_TEXT) {
+- $contents .= $1 . "\n";
+- # nuke leading blank lines
+- if ($contents =~ /^\s*$/) {
+- $contents = "";
+- }
+- } elsif ($inline_doc_state == STATE_INLINE_NAME) {
+- $inline_doc_state = STATE_INLINE_ERROR;
+- print STDERR "${file}:$.: warning: ";
+- print STDERR "Incorrect use of kernel-doc format: $_";
+- ++$warnings;
+- }
+- }
+- } elsif ($state == STATE_PROTO) { # scanning for function '{' (end of prototype)
+- if (/$doc_inline_oneline/) {
+- $section = $1;
+- $contents = $2;
+- if ($contents ne "") {
+- $contents .= "\n";
+- dump_section($file, $section, xml_escape($contents));
+- $section = $section_default;
+- $contents = "";
+- }
+- } elsif (/$doc_inline_start/) {
+- $state = STATE_INLINE;
+- $inline_doc_state = STATE_INLINE_NAME;
+- } elsif ($decl_type eq 'function') {
+- process_proto_function($_, $file);
+- } else {
+- process_proto_type($_, $file);
+- }
++ process_inline($file, $_);
++ } elsif ($state == STATE_PROTO) {
++ process_proto($file, $_);
+ } elsif ($state == STATE_DOCBLOCK) {
+- if (/$doc_end/)
+- {
+- dump_doc_section($file, $section, xml_escape($contents));
+- $section = $section_default;
+- $contents = "";
+- $function = "";
+- %parameterdescs = ();
+- %parametertypes = ();
+- @parameterlist = ();
+- %sections = ();
+- @sectionlist = ();
+- $prototype = "";
+- $state = STATE_NORMAL;
+- }
+- elsif (/$doc_content/)
+- {
+- if ( $1 eq "" )
+- {
+- $contents .= $blankline;
+- }
+- else
+- {
+- $contents .= $1 . "\n";
+- }
+- }
++ process_docblock($file, $_);
+ }
+ }
++
++ # Make sure we got something interesting.
+ if ($initial_section_counter == $section_counter) {
+ if ($output_mode ne "none") {
+ print STDERR "${file}:1: warning: no structured comments found\n";
+--
+2.7.4
+