diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 2d4ce154401..1163275a8d4 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -1153,6 +1153,33 @@ sub check_absolute_file { } } +sub cleanup_continuation_headers { + # Collapse any header-continuation lines into a single line so they + # can be parsed meaningfully, as the parser only has one line + # of context to work with. + my $again; + do { + $again = 0; + foreach my $n (0 .. scalar(@rawlines) - 2) { + if ($rawlines[$n]=~/^\s*$/) { + # A blank line means there's no more chance + # of finding headers. Shortcut to done. + return; + } + if ($rawlines[$n]=~/^[\x21-\x39\x3b-\x7e]+:/ && + $rawlines[$n+1]=~/^\s+/) { + # Continuation header. Collapse it. + my $line = splice @rawlines, $n+1, 1; + $line=~s/^\s+/ /; + $rawlines[$n] .= $line; + # We've 'destabilized' the list, so restart. + $again = 1; + last; + } + } + } while ($again); +} + sub process { my $filename = shift; @@ -1209,28 +1236,8 @@ sub process { my $shorttext_exspc = 0; sanitise_line_reset(); + cleanup_continuation_headers(); my $line; - # Before sanitizing the rawlines, collapse any header-continuation - # lines into a single line so they can be parsed meaningfully. - my $end_of_hdrs = 0; - foreach my $rawline (@rawlines) { - if ($rawline=~/^\s*$/) { - last; - } else { - $end_of_hdrs++; - } - } - my @continuation_hdrs; - foreach my $n (0 .. $end_of_hdrs) { - if ($rawlines[$n]=~/^\s+/) { - push @continuation_hdrs, $n; - } - } - while (my $n = pop @continuation_hdrs) { - $line = splice @rawlines, $n, 1; - $line=~s/^\s+/ /; - $rawlines[$n - 1] .= $line; - } foreach my $rawline (@rawlines) { $linenr++;