qemu/scripts/checkpatch.pl
<<
>>
Prefs
   1#!/usr/bin/perl -w
   2# (c) 2001, Dave Jones. (the file handling bit)
   3# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
   4# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
   5# (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
   6# Licensed under the terms of the GNU GPL License version 2
   7
   8use strict;
   9
  10my $P = $0;
  11$P =~ s@.*/@@g;
  12
  13my $V = '0.31';
  14
  15use Getopt::Long qw(:config no_auto_abbrev);
  16
  17my $quiet = 0;
  18my $tree = 1;
  19my $chk_signoff = 1;
  20my $chk_patch = 1;
  21my $tst_only;
  22my $emacs = 0;
  23my $terse = 0;
  24my $file = 0;
  25my $check = 0;
  26my $summary = 1;
  27my $mailback = 0;
  28my $summary_file = 0;
  29my $root;
  30my %debug;
  31my $help = 0;
  32
  33sub help {
  34        my ($exitcode) = @_;
  35
  36        print << "EOM";
  37Usage: $P [OPTION]... [FILE]...
  38Version: $V
  39
  40Options:
  41  -q, --quiet                quiet
  42  --no-tree                  run without a kernel tree
  43  --no-signoff               do not check for 'Signed-off-by' line
  44  --patch                    treat FILE as patchfile (default)
  45  --emacs                    emacs compile window format
  46  --terse                    one line per report
  47  -f, --file                 treat FILE as regular source file
  48  --subjective, --strict     enable more subjective tests
  49  --root=PATH                PATH to the kernel tree root
  50  --no-summary               suppress the per-file summary
  51  --mailback                 only produce a report in case of warnings/errors
  52  --summary-file             include the filename in summary
  53  --debug KEY=[0|1]          turn on/off debugging of KEY, where KEY is one of
  54                             'values', 'possible', 'type', and 'attr' (default
  55                             is all off)
  56  --test-only=WORD           report only warnings/errors containing WORD
  57                             literally
  58  -h, --help, --version      display this help and exit
  59
  60When FILE is - read standard input.
  61EOM
  62
  63        exit($exitcode);
  64}
  65
  66GetOptions(
  67        'q|quiet+'      => \$quiet,
  68        'tree!'         => \$tree,
  69        'signoff!'      => \$chk_signoff,
  70        'patch!'        => \$chk_patch,
  71        'emacs!'        => \$emacs,
  72        'terse!'        => \$terse,
  73        'f|file!'       => \$file,
  74        'subjective!'   => \$check,
  75        'strict!'       => \$check,
  76        'root=s'        => \$root,
  77        'summary!'      => \$summary,
  78        'mailback!'     => \$mailback,
  79        'summary-file!' => \$summary_file,
  80
  81        'debug=s'       => \%debug,
  82        'test-only=s'   => \$tst_only,
  83        'h|help'        => \$help,
  84        'version'       => \$help
  85) or help(1);
  86
  87help(0) if ($help);
  88
  89my $exit = 0;
  90
  91if ($#ARGV < 0) {
  92        print "$P: no input files\n";
  93        exit(1);
  94}
  95
  96my $dbg_values = 0;
  97my $dbg_possible = 0;
  98my $dbg_type = 0;
  99my $dbg_attr = 0;
 100my $dbg_adv_dcs = 0;
 101my $dbg_adv_checking = 0;
 102my $dbg_adv_apw = 0;
 103for my $key (keys %debug) {
 104        ## no critic
 105        eval "\${dbg_$key} = '$debug{$key}';";
 106        die "$@" if ($@);
 107}
 108
 109my $rpt_cleaners = 0;
 110
 111if ($terse) {
 112        $emacs = 1;
 113        $quiet++;
 114}
 115
 116if ($tree) {
 117        if (defined $root) {
 118                if (!top_of_kernel_tree($root)) {
 119                        die "$P: $root: --root does not point at a valid tree\n";
 120                }
 121        } else {
 122                if (top_of_kernel_tree('.')) {
 123                        $root = '.';
 124                } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
 125                                                top_of_kernel_tree($1)) {
 126                        $root = $1;
 127                }
 128        }
 129
 130        if (!defined $root) {
 131                print "Must be run from the top-level dir. of a kernel tree\n";
 132                exit(2);
 133        }
 134}
 135
 136my $emitted_corrupt = 0;
 137
 138our $Ident      = qr{
 139                        [A-Za-z_][A-Za-z\d_]*
 140                        (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
 141                }x;
 142our $Storage    = qr{extern|static|asmlinkage};
 143our $Sparse     = qr{
 144                        __force
 145                }x;
 146
 147# Notes to $Attribute:
 148our $Attribute  = qr{
 149                        const|
 150                        volatile|
 151                        QEMU_NORETURN|
 152                        QEMU_WARN_UNUSED_RESULT|
 153                        QEMU_SENTINEL|
 154                        QEMU_ARTIFICIAL|
 155                        QEMU_PACKED|
 156                        GCC_FMT_ATTR
 157                  }x;
 158our $Modifier;
 159our $Inline     = qr{inline};
 160our $Member     = qr{->$Ident|\.$Ident|\[[^]]*\]};
 161our $Lval       = qr{$Ident(?:$Member)*};
 162
 163our $Constant   = qr{(?:[0-9]+|0x[0-9a-fA-F]+)[UL]*};
 164our $Assignment = qr{(?:\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=)};
 165our $Compare    = qr{<=|>=|==|!=|<|>};
 166our $Operators  = qr{
 167                        <=|>=|==|!=|
 168                        =>|->|<<|>>|<|>|!|~|
 169                        &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%
 170                  }x;
 171
 172our $NonptrType;
 173our $Type;
 174our $Declare;
 175
 176our $UTF8       = qr {
 177        [\x09\x0A\x0D\x20-\x7E]              # ASCII
 178        | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
 179        |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
 180        | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
 181        |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
 182        |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
 183        | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
 184        |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
 185}x;
 186
 187# There are still some false positives, but this catches most
 188# common cases.
 189our $typeTypedefs = qr{(?x:
 190        [A-Z][A-Z\d_]*[a-z][A-Za-z\d_]*     # camelcase
 191        | [A-Z][A-Z\d_]*AIOCB               # all uppercase
 192        | [A-Z][A-Z\d_]*CPU                 # all uppercase
 193        | QEMUBH                            # all uppercase
 194)};
 195
 196our @typeList = (
 197        qr{void},
 198        qr{(?:unsigned\s+)?char},
 199        qr{(?:unsigned\s+)?short},
 200        qr{(?:unsigned\s+)?int},
 201        qr{(?:unsigned\s+)?long},
 202        qr{(?:unsigned\s+)?long\s+int},
 203        qr{(?:unsigned\s+)?long\s+long},
 204        qr{(?:unsigned\s+)?long\s+long\s+int},
 205        qr{unsigned},
 206        qr{float},
 207        qr{double},
 208        qr{bool},
 209        qr{struct\s+$Ident},
 210        qr{union\s+$Ident},
 211        qr{enum\s+$Ident},
 212        qr{${Ident}_t},
 213        qr{${Ident}_handler},
 214        qr{${Ident}_handler_fn},
 215        qr{target_(?:u)?long},
 216);
 217
 218# This can be modified by sub possible.  Since it can be empty, be careful
 219# about regexes that always match, because they can cause infinite loops.
 220our @modifierList = (
 221);
 222
 223sub build_types {
 224        my $all = "(?x:  \n" . join("|\n  ", @typeList) . "\n)";
 225        if (@modifierList > 0) {
 226                my $mods = "(?x:  \n" . join("|\n  ", @modifierList) . "\n)";
 227                $Modifier = qr{(?:$Attribute|$Sparse|$mods)};
 228        } else {
 229                $Modifier = qr{(?:$Attribute|$Sparse)};
 230        }
 231        $NonptrType     = qr{
 232                        (?:$Modifier\s+|const\s+)*
 233                        (?:
 234                                (?:typeof|__typeof__)\s*\(\s*\**\s*$Ident\s*\)|
 235                                (?:$typeTypedefs\b)|
 236                                (?:${all}\b)
 237                        )
 238                        (?:\s+$Modifier|\s+const)*
 239                  }x;
 240        $Type   = qr{
 241                        $NonptrType
 242                        (?:[\s\*]+\s*const|[\s\*]+|(?:\s*\[\s*\])+)?
 243                        (?:\s+$Inline|\s+$Modifier)*
 244                  }x;
 245        $Declare        = qr{(?:$Storage\s+)?$Type};
 246}
 247build_types();
 248
 249$chk_signoff = 0 if ($file);
 250
 251my @rawlines = ();
 252my @lines = ();
 253my $vname;
 254for my $filename (@ARGV) {
 255        my $FILE;
 256        if ($file) {
 257                open($FILE, '-|', "diff -u /dev/null $filename") ||
 258                        die "$P: $filename: diff failed - $!\n";
 259        } elsif ($filename eq '-') {
 260                open($FILE, '<&STDIN');
 261        } else {
 262                open($FILE, '<', "$filename") ||
 263                        die "$P: $filename: open failed - $!\n";
 264        }
 265        if ($filename eq '-') {
 266                $vname = 'Your patch';
 267        } else {
 268                $vname = $filename;
 269        }
 270        while (<$FILE>) {
 271                chomp;
 272                push(@rawlines, $_);
 273        }
 274        close($FILE);
 275        if (!process($filename)) {
 276                $exit = 1;
 277        }
 278        @rawlines = ();
 279        @lines = ();
 280}
 281
 282exit($exit);
 283
 284sub top_of_kernel_tree {
 285        my ($root) = @_;
 286
 287        my @tree_check = (
 288                "COPYING", "MAINTAINERS", "Makefile",
 289                "README", "docs", "VERSION",
 290                "vl.c"
 291        );
 292
 293        foreach my $check (@tree_check) {
 294                if (! -e $root . '/' . $check) {
 295                        return 0;
 296                }
 297        }
 298        return 1;
 299}
 300
 301sub expand_tabs {
 302        my ($str) = @_;
 303
 304        my $res = '';
 305        my $n = 0;
 306        for my $c (split(//, $str)) {
 307                if ($c eq "\t") {
 308                        $res .= ' ';
 309                        $n++;
 310                        for (; ($n % 8) != 0; $n++) {
 311                                $res .= ' ';
 312                        }
 313                        next;
 314                }
 315                $res .= $c;
 316                $n++;
 317        }
 318
 319        return $res;
 320}
 321sub copy_spacing {
 322        (my $res = shift) =~ tr/\t/ /c;
 323        return $res;
 324}
 325
 326sub line_stats {
 327        my ($line) = @_;
 328
 329        # Drop the diff line leader and expand tabs
 330        $line =~ s/^.//;
 331        $line = expand_tabs($line);
 332
 333        # Pick the indent from the front of the line.
 334        my ($white) = ($line =~ /^(\s*)/);
 335
 336        return (length($line), length($white));
 337}
 338
 339my $sanitise_quote = '';
 340
 341sub sanitise_line_reset {
 342        my ($in_comment) = @_;
 343
 344        if ($in_comment) {
 345                $sanitise_quote = '*/';
 346        } else {
 347                $sanitise_quote = '';
 348        }
 349}
 350sub sanitise_line {
 351        my ($line) = @_;
 352
 353        my $res = '';
 354        my $l = '';
 355
 356        my $qlen = 0;
 357        my $off = 0;
 358        my $c;
 359
 360        # Always copy over the diff marker.
 361        $res = substr($line, 0, 1);
 362
 363        for ($off = 1; $off < length($line); $off++) {
 364                $c = substr($line, $off, 1);
 365
 366                # Comments we are wacking completely including the begin
 367                # and end, all to $;.
 368                if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
 369                        $sanitise_quote = '*/';
 370
 371                        substr($res, $off, 2, "$;$;");
 372                        $off++;
 373                        next;
 374                }
 375                if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
 376                        $sanitise_quote = '';
 377                        substr($res, $off, 2, "$;$;");
 378                        $off++;
 379                        next;
 380                }
 381                if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
 382                        $sanitise_quote = '//';
 383
 384                        substr($res, $off, 2, $sanitise_quote);
 385                        $off++;
 386                        next;
 387                }
 388
 389                # A \ in a string means ignore the next character.
 390                if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
 391                    $c eq "\\") {
 392                        substr($res, $off, 2, 'XX');
 393                        $off++;
 394                        next;
 395                }
 396                # Regular quotes.
 397                if ($c eq "'" || $c eq '"') {
 398                        if ($sanitise_quote eq '') {
 399                                $sanitise_quote = $c;
 400
 401                                substr($res, $off, 1, $c);
 402                                next;
 403                        } elsif ($sanitise_quote eq $c) {
 404                                $sanitise_quote = '';
 405                        }
 406                }
 407
 408                #print "c<$c> SQ<$sanitise_quote>\n";
 409                if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
 410                        substr($res, $off, 1, $;);
 411                } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
 412                        substr($res, $off, 1, $;);
 413                } elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
 414                        substr($res, $off, 1, 'X');
 415                } else {
 416                        substr($res, $off, 1, $c);
 417                }
 418        }
 419
 420        if ($sanitise_quote eq '//') {
 421                $sanitise_quote = '';
 422        }
 423
 424        # The pathname on a #include may be surrounded by '<' and '>'.
 425        if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
 426                my $clean = 'X' x length($1);
 427                $res =~ s@\<.*\>@<$clean>@;
 428
 429        # The whole of a #error is a string.
 430        } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
 431                my $clean = 'X' x length($1);
 432                $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
 433        }
 434
 435        return $res;
 436}
 437
 438sub ctx_statement_block {
 439        my ($linenr, $remain, $off) = @_;
 440        my $line = $linenr - 1;
 441        my $blk = '';
 442        my $soff = $off;
 443        my $coff = $off - 1;
 444        my $coff_set = 0;
 445
 446        my $loff = 0;
 447
 448        my $type = '';
 449        my $level = 0;
 450        my @stack = ();
 451        my $p;
 452        my $c;
 453        my $len = 0;
 454
 455        my $remainder;
 456        while (1) {
 457                @stack = (['', 0]) if ($#stack == -1);
 458
 459                #warn "CSB: blk<$blk> remain<$remain>\n";
 460                # If we are about to drop off the end, pull in more
 461                # context.
 462                if ($off >= $len) {
 463                        for (; $remain > 0; $line++) {
 464                                last if (!defined $lines[$line]);
 465                                next if ($lines[$line] =~ /^-/);
 466                                $remain--;
 467                                $loff = $len;
 468                                $blk .= $lines[$line] . "\n";
 469                                $len = length($blk);
 470                                $line++;
 471                                last;
 472                        }
 473                        # Bail if there is no further context.
 474                        #warn "CSB: blk<$blk> off<$off> len<$len>\n";
 475                        if ($off >= $len) {
 476                                last;
 477                        }
 478                }
 479                $p = $c;
 480                $c = substr($blk, $off, 1);
 481                $remainder = substr($blk, $off);
 482
 483                #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
 484
 485                # Handle nested #if/#else.
 486                if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
 487                        push(@stack, [ $type, $level ]);
 488                } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
 489                        ($type, $level) = @{$stack[$#stack - 1]};
 490                } elsif ($remainder =~ /^#\s*endif\b/) {
 491                        ($type, $level) = @{pop(@stack)};
 492                }
 493
 494                # Statement ends at the ';' or a close '}' at the
 495                # outermost level.
 496                if ($level == 0 && $c eq ';') {
 497                        last;
 498                }
 499
 500                # An else is really a conditional as long as its not else if
 501                if ($level == 0 && $coff_set == 0 &&
 502                                (!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
 503                                $remainder =~ /^(else)(?:\s|{)/ &&
 504                                $remainder !~ /^else\s+if\b/) {
 505                        $coff = $off + length($1) - 1;
 506                        $coff_set = 1;
 507                        #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
 508                        #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
 509                }
 510
 511                if (($type eq '' || $type eq '(') && $c eq '(') {
 512                        $level++;
 513                        $type = '(';
 514                }
 515                if ($type eq '(' && $c eq ')') {
 516                        $level--;
 517                        $type = ($level != 0)? '(' : '';
 518
 519                        if ($level == 0 && $coff < $soff) {
 520                                $coff = $off;
 521                                $coff_set = 1;
 522                                #warn "CSB: mark coff<$coff>\n";
 523                        }
 524                }
 525                if (($type eq '' || $type eq '{') && $c eq '{') {
 526                        $level++;
 527                        $type = '{';
 528                }
 529                if ($type eq '{' && $c eq '}') {
 530                        $level--;
 531                        $type = ($level != 0)? '{' : '';
 532
 533                        if ($level == 0) {
 534                                if (substr($blk, $off + 1, 1) eq ';') {
 535                                        $off++;
 536                                }
 537                                last;
 538                        }
 539                }
 540                $off++;
 541        }
 542        # We are truly at the end, so shuffle to the next line.
 543        if ($off == $len) {
 544                $loff = $len + 1;
 545                $line++;
 546                $remain--;
 547        }
 548
 549        my $statement = substr($blk, $soff, $off - $soff + 1);
 550        my $condition = substr($blk, $soff, $coff - $soff + 1);
 551
 552        #warn "STATEMENT<$statement>\n";
 553        #warn "CONDITION<$condition>\n";
 554
 555        #print "coff<$coff> soff<$off> loff<$loff>\n";
 556
 557        return ($statement, $condition,
 558                        $line, $remain + 1, $off - $loff + 1, $level);
 559}
 560
 561sub statement_lines {
 562        my ($stmt) = @_;
 563
 564        # Strip the diff line prefixes and rip blank lines at start and end.
 565        $stmt =~ s/(^|\n)./$1/g;
 566        $stmt =~ s/^\s*//;
 567        $stmt =~ s/\s*$//;
 568
 569        my @stmt_lines = ($stmt =~ /\n/g);
 570
 571        return $#stmt_lines + 2;
 572}
 573
 574sub statement_rawlines {
 575        my ($stmt) = @_;
 576
 577        my @stmt_lines = ($stmt =~ /\n/g);
 578
 579        return $#stmt_lines + 2;
 580}
 581
 582sub statement_block_size {
 583        my ($stmt) = @_;
 584
 585        $stmt =~ s/(^|\n)./$1/g;
 586        $stmt =~ s/^\s*\{//;
 587        $stmt =~ s/}\s*$//;
 588        $stmt =~ s/^\s*//;
 589        $stmt =~ s/\s*$//;
 590
 591        my @stmt_lines = ($stmt =~ /\n/g);
 592        my @stmt_statements = ($stmt =~ /;/g);
 593
 594        my $stmt_lines = $#stmt_lines + 2;
 595        my $stmt_statements = $#stmt_statements + 1;
 596
 597        if ($stmt_lines > $stmt_statements) {
 598                return $stmt_lines;
 599        } else {
 600                return $stmt_statements;
 601        }
 602}
 603
 604sub ctx_statement_full {
 605        my ($linenr, $remain, $off) = @_;
 606        my ($statement, $condition, $level);
 607
 608        my (@chunks);
 609
 610        # Grab the first conditional/block pair.
 611        ($statement, $condition, $linenr, $remain, $off, $level) =
 612                                ctx_statement_block($linenr, $remain, $off);
 613        #print "F: c<$condition> s<$statement> remain<$remain>\n";
 614        push(@chunks, [ $condition, $statement ]);
 615        if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
 616                return ($level, $linenr, @chunks);
 617        }
 618
 619        # Pull in the following conditional/block pairs and see if they
 620        # could continue the statement.
 621        for (;;) {
 622                ($statement, $condition, $linenr, $remain, $off, $level) =
 623                                ctx_statement_block($linenr, $remain, $off);
 624                #print "C: c<$condition> s<$statement> remain<$remain>\n";
 625                last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
 626                #print "C: push\n";
 627                push(@chunks, [ $condition, $statement ]);
 628        }
 629
 630        return ($level, $linenr, @chunks);
 631}
 632
 633sub ctx_block_get {
 634        my ($linenr, $remain, $outer, $open, $close, $off) = @_;
 635        my $line;
 636        my $start = $linenr - 1;
 637        my $blk = '';
 638        my @o;
 639        my @c;
 640        my @res = ();
 641
 642        my $level = 0;
 643        my @stack = ($level);
 644        for ($line = $start; $remain > 0; $line++) {
 645                next if ($rawlines[$line] =~ /^-/);
 646                $remain--;
 647
 648                $blk .= $rawlines[$line];
 649
 650                # Handle nested #if/#else.
 651                if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
 652                        push(@stack, $level);
 653                } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
 654                        $level = $stack[$#stack - 1];
 655                } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
 656                        $level = pop(@stack);
 657                }
 658
 659                foreach my $c (split(//, $lines[$line])) {
 660                        ##print "C<$c>L<$level><$open$close>O<$off>\n";
 661                        if ($off > 0) {
 662                                $off--;
 663                                next;
 664                        }
 665
 666                        if ($c eq $close && $level > 0) {
 667                                $level--;
 668                                last if ($level == 0);
 669                        } elsif ($c eq $open) {
 670                                $level++;
 671                        }
 672                }
 673
 674                if (!$outer || $level <= 1) {
 675                        push(@res, $rawlines[$line]);
 676                }
 677
 678                last if ($level == 0);
 679        }
 680
 681        return ($level, @res);
 682}
 683sub ctx_block_outer {
 684        my ($linenr, $remain) = @_;
 685
 686        my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
 687        return @r;
 688}
 689sub ctx_block {
 690        my ($linenr, $remain) = @_;
 691
 692        my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
 693        return @r;
 694}
 695sub ctx_statement {
 696        my ($linenr, $remain, $off) = @_;
 697
 698        my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
 699        return @r;
 700}
 701sub ctx_block_level {
 702        my ($linenr, $remain) = @_;
 703
 704        return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
 705}
 706sub ctx_statement_level {
 707        my ($linenr, $remain, $off) = @_;
 708
 709        return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
 710}
 711
 712sub ctx_locate_comment {
 713        my ($first_line, $end_line) = @_;
 714
 715        # Catch a comment on the end of the line itself.
 716        my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
 717        return $current_comment if (defined $current_comment);
 718
 719        # Look through the context and try and figure out if there is a
 720        # comment.
 721        my $in_comment = 0;
 722        $current_comment = '';
 723        for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
 724                my $line = $rawlines[$linenr - 1];
 725                #warn "           $line\n";
 726                if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
 727                        $in_comment = 1;
 728                }
 729                if ($line =~ m@/\*@) {
 730                        $in_comment = 1;
 731                }
 732                if (!$in_comment && $current_comment ne '') {
 733                        $current_comment = '';
 734                }
 735                $current_comment .= $line . "\n" if ($in_comment);
 736                if ($line =~ m@\*/@) {
 737                        $in_comment = 0;
 738                }
 739        }
 740
 741        chomp($current_comment);
 742        return($current_comment);
 743}
 744sub ctx_has_comment {
 745        my ($first_line, $end_line) = @_;
 746        my $cmt = ctx_locate_comment($first_line, $end_line);
 747
 748        ##print "LINE: $rawlines[$end_line - 1 ]\n";
 749        ##print "CMMT: $cmt\n";
 750
 751        return ($cmt ne '');
 752}
 753
 754sub raw_line {
 755        my ($linenr, $cnt) = @_;
 756
 757        my $offset = $linenr - 1;
 758        $cnt++;
 759
 760        my $line;
 761        while ($cnt) {
 762                $line = $rawlines[$offset++];
 763                next if (defined($line) && $line =~ /^-/);
 764                $cnt--;
 765        }
 766
 767        return $line;
 768}
 769
 770sub cat_vet {
 771        my ($vet) = @_;
 772        my ($res, $coded);
 773
 774        $res = '';
 775        while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
 776                $res .= $1;
 777                if ($2 ne '') {
 778                        $coded = sprintf("^%c", unpack('C', $2) + 64);
 779                        $res .= $coded;
 780                }
 781        }
 782        $res =~ s/$/\$/;
 783
 784        return $res;
 785}
 786
 787my $av_preprocessor = 0;
 788my $av_pending;
 789my @av_paren_type;
 790my $av_pend_colon;
 791
 792sub annotate_reset {
 793        $av_preprocessor = 0;
 794        $av_pending = '_';
 795        @av_paren_type = ('E');
 796        $av_pend_colon = 'O';
 797}
 798
 799sub annotate_values {
 800        my ($stream, $type) = @_;
 801
 802        my $res;
 803        my $var = '_' x length($stream);
 804        my $cur = $stream;
 805
 806        print "$stream\n" if ($dbg_values > 1);
 807
 808        while (length($cur)) {
 809                @av_paren_type = ('E') if ($#av_paren_type < 0);
 810                print " <" . join('', @av_paren_type) .
 811                                "> <$type> <$av_pending>" if ($dbg_values > 1);
 812                if ($cur =~ /^(\s+)/o) {
 813                        print "WS($1)\n" if ($dbg_values > 1);
 814                        if ($1 =~ /\n/ && $av_preprocessor) {
 815                                $type = pop(@av_paren_type);
 816                                $av_preprocessor = 0;
 817                        }
 818
 819                } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
 820                        print "CAST($1)\n" if ($dbg_values > 1);
 821                        push(@av_paren_type, $type);
 822                        $type = 'C';
 823
 824                } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
 825                        print "DECLARE($1)\n" if ($dbg_values > 1);
 826                        $type = 'T';
 827
 828                } elsif ($cur =~ /^($Modifier)\s*/) {
 829                        print "MODIFIER($1)\n" if ($dbg_values > 1);
 830                        $type = 'T';
 831
 832                } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
 833                        print "DEFINE($1,$2)\n" if ($dbg_values > 1);
 834                        $av_preprocessor = 1;
 835                        push(@av_paren_type, $type);
 836                        if ($2 ne '') {
 837                                $av_pending = 'N';
 838                        }
 839                        $type = 'E';
 840
 841                } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
 842                        print "UNDEF($1)\n" if ($dbg_values > 1);
 843                        $av_preprocessor = 1;
 844                        push(@av_paren_type, $type);
 845
 846                } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
 847                        print "PRE_START($1)\n" if ($dbg_values > 1);
 848                        $av_preprocessor = 1;
 849
 850                        push(@av_paren_type, $type);
 851                        push(@av_paren_type, $type);
 852                        $type = 'E';
 853
 854                } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
 855                        print "PRE_RESTART($1)\n" if ($dbg_values > 1);
 856                        $av_preprocessor = 1;
 857
 858                        push(@av_paren_type, $av_paren_type[$#av_paren_type]);
 859
 860                        $type = 'E';
 861
 862                } elsif ($cur =~ /^(\#\s*(?:endif))/o) {
 863                        print "PRE_END($1)\n" if ($dbg_values > 1);
 864
 865                        $av_preprocessor = 1;
 866
 867                        # Assume all arms of the conditional end as this
 868                        # one does, and continue as if the #endif was not here.
 869                        pop(@av_paren_type);
 870                        push(@av_paren_type, $type);
 871                        $type = 'E';
 872
 873                } elsif ($cur =~ /^(\\\n)/o) {
 874                        print "PRECONT($1)\n" if ($dbg_values > 1);
 875
 876                } elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
 877                        print "ATTR($1)\n" if ($dbg_values > 1);
 878                        $av_pending = $type;
 879                        $type = 'N';
 880
 881                } elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
 882                        print "SIZEOF($1)\n" if ($dbg_values > 1);
 883                        if (defined $2) {
 884                                $av_pending = 'V';
 885                        }
 886                        $type = 'N';
 887
 888                } elsif ($cur =~ /^(if|while|for)\b/o) {
 889                        print "COND($1)\n" if ($dbg_values > 1);
 890                        $av_pending = 'E';
 891                        $type = 'N';
 892
 893                } elsif ($cur =~/^(case)/o) {
 894                        print "CASE($1)\n" if ($dbg_values > 1);
 895                        $av_pend_colon = 'C';
 896                        $type = 'N';
 897
 898                } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
 899                        print "KEYWORD($1)\n" if ($dbg_values > 1);
 900                        $type = 'N';
 901
 902                } elsif ($cur =~ /^(\()/o) {
 903                        print "PAREN('$1')\n" if ($dbg_values > 1);
 904                        push(@av_paren_type, $av_pending);
 905                        $av_pending = '_';
 906                        $type = 'N';
 907
 908                } elsif ($cur =~ /^(\))/o) {
 909                        my $new_type = pop(@av_paren_type);
 910                        if ($new_type ne '_') {
 911                                $type = $new_type;
 912                                print "PAREN('$1') -> $type\n"
 913                                                        if ($dbg_values > 1);
 914                        } else {
 915                                print "PAREN('$1')\n" if ($dbg_values > 1);
 916                        }
 917
 918                } elsif ($cur =~ /^($Ident)\s*\(/o) {
 919                        print "FUNC($1)\n" if ($dbg_values > 1);
 920                        $type = 'V';
 921                        $av_pending = 'V';
 922
 923                } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
 924                        if (defined $2 && $type eq 'C' || $type eq 'T') {
 925                                $av_pend_colon = 'B';
 926                        } elsif ($type eq 'E') {
 927                                $av_pend_colon = 'L';
 928                        }
 929                        print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
 930                        $type = 'V';
 931
 932                } elsif ($cur =~ /^($Ident|$Constant)/o) {
 933                        print "IDENT($1)\n" if ($dbg_values > 1);
 934                        $type = 'V';
 935
 936                } elsif ($cur =~ /^($Assignment)/o) {
 937                        print "ASSIGN($1)\n" if ($dbg_values > 1);
 938                        $type = 'N';
 939
 940                } elsif ($cur =~/^(;|{|})/) {
 941                        print "END($1)\n" if ($dbg_values > 1);
 942                        $type = 'E';
 943                        $av_pend_colon = 'O';
 944
 945                } elsif ($cur =~/^(,)/) {
 946                        print "COMMA($1)\n" if ($dbg_values > 1);
 947                        $type = 'C';
 948
 949                } elsif ($cur =~ /^(\?)/o) {
 950                        print "QUESTION($1)\n" if ($dbg_values > 1);
 951                        $type = 'N';
 952
 953                } elsif ($cur =~ /^(:)/o) {
 954                        print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
 955
 956                        substr($var, length($res), 1, $av_pend_colon);
 957                        if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
 958                                $type = 'E';
 959                        } else {
 960                                $type = 'N';
 961                        }
 962                        $av_pend_colon = 'O';
 963
 964                } elsif ($cur =~ /^(\[)/o) {
 965                        print "CLOSE($1)\n" if ($dbg_values > 1);
 966                        $type = 'N';
 967
 968                } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
 969                        my $variant;
 970
 971                        print "OPV($1)\n" if ($dbg_values > 1);
 972                        if ($type eq 'V') {
 973                                $variant = 'B';
 974                        } else {
 975                                $variant = 'U';
 976                        }
 977
 978                        substr($var, length($res), 1, $variant);
 979                        $type = 'N';
 980
 981                } elsif ($cur =~ /^($Operators)/o) {
 982                        print "OP($1)\n" if ($dbg_values > 1);
 983                        if ($1 ne '++' && $1 ne '--') {
 984                                $type = 'N';
 985                        }
 986
 987                } elsif ($cur =~ /(^.)/o) {
 988                        print "C($1)\n" if ($dbg_values > 1);
 989                }
 990                if (defined $1) {
 991                        $cur = substr($cur, length($1));
 992                        $res .= $type x length($1);
 993                }
 994        }
 995
 996        return ($res, $var);
 997}
 998
 999sub possible {
1000        my ($possible, $line) = @_;
1001        my $notPermitted = qr{(?:
1002                ^(?:
1003                        $Modifier|
1004                        $Storage|
1005                        $Type|
1006                        DEFINE_\S+
1007                )$|
1008                ^(?:
1009                        goto|
1010                        return|
1011                        case|
1012                        else|
1013                        asm|__asm__|
1014                        do|
1015                        \#|
1016                        \#\#
1017                )(?:\s|$)|
1018                ^(?:typedef|struct|enum)\b
1019            )}x;
1020        warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
1021        if ($possible !~ $notPermitted) {
1022                # Check for modifiers.
1023                $possible =~ s/\s*$Storage\s*//g;
1024                $possible =~ s/\s*$Sparse\s*//g;
1025                if ($possible =~ /^\s*$/) {
1026
1027                } elsif ($possible =~ /\s/) {
1028                        $possible =~ s/\s*$Type\s*//g;
1029                        for my $modifier (split(' ', $possible)) {
1030                                if ($modifier !~ $notPermitted) {
1031                                        warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
1032                                        push(@modifierList, $modifier);
1033                                }
1034                        }
1035
1036                } else {
1037                        warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
1038                        push(@typeList, $possible);
1039                }
1040                build_types();
1041        } else {
1042                warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
1043        }
1044}
1045
1046my $prefix = '';
1047
1048sub report {
1049        if (defined $tst_only && $_[0] !~ /\Q$tst_only\E/) {
1050                return 0;
1051        }
1052        my $line = $prefix . $_[0];
1053
1054        $line = (split('\n', $line))[0] . "\n" if ($terse);
1055
1056        push(our @report, $line);
1057
1058        return 1;
1059}
1060sub report_dump {
1061        our @report;
1062}
1063sub ERROR {
1064        if (report("ERROR: $_[0]\n")) {
1065                our $clean = 0;
1066                our $cnt_error++;
1067        }
1068}
1069sub WARN {
1070        if (report("WARNING: $_[0]\n")) {
1071                our $clean = 0;
1072                our $cnt_warn++;
1073        }
1074}
1075sub CHK {
1076        if ($check && report("CHECK: $_[0]\n")) {
1077                our $clean = 0;
1078                our $cnt_chk++;
1079        }
1080}
1081
1082sub process {
1083        my $filename = shift;
1084
1085        my $linenr=0;
1086        my $prevline="";
1087        my $prevrawline="";
1088        my $stashline="";
1089        my $stashrawline="";
1090
1091        my $length;
1092        my $indent;
1093        my $previndent=0;
1094        my $stashindent=0;
1095
1096        our $clean = 1;
1097        my $signoff = 0;
1098        my $is_patch = 0;
1099
1100        our @report = ();
1101        our $cnt_lines = 0;
1102        our $cnt_error = 0;
1103        our $cnt_warn = 0;
1104        our $cnt_chk = 0;
1105
1106        # Trace the real file/line as we go.
1107        my $realfile = '';
1108        my $realline = 0;
1109        my $realcnt = 0;
1110        my $here = '';
1111        my $in_comment = 0;
1112        my $comment_edge = 0;
1113        my $first_line = 0;
1114        my $p1_prefix = '';
1115
1116        my $prev_values = 'E';
1117
1118        # suppression flags
1119        my %suppress_ifbraces;
1120        my %suppress_whiletrailers;
1121        my %suppress_export;
1122
1123        # Pre-scan the patch sanitizing the lines.
1124
1125        sanitise_line_reset();
1126        my $line;
1127        foreach my $rawline (@rawlines) {
1128                $linenr++;
1129                $line = $rawline;
1130
1131                if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
1132                        $realline=$1-1;
1133                        if (defined $2) {
1134                                $realcnt=$3+1;
1135                        } else {
1136                                $realcnt=1+1;
1137                        }
1138                        $in_comment = 0;
1139
1140                        # Guestimate if this is a continuing comment.  Run
1141                        # the context looking for a comment "edge".  If this
1142                        # edge is a close comment then we must be in a comment
1143                        # at context start.
1144                        my $edge;
1145                        my $cnt = $realcnt;
1146                        for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
1147                                next if (defined $rawlines[$ln - 1] &&
1148                                         $rawlines[$ln - 1] =~ /^-/);
1149                                $cnt--;
1150                                #print "RAW<$rawlines[$ln - 1]>\n";
1151                                last if (!defined $rawlines[$ln - 1]);
1152                                if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
1153                                    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
1154                                        ($edge) = $1;
1155                                        last;
1156                                }
1157                        }
1158                        if (defined $edge && $edge eq '*/') {
1159                                $in_comment = 1;
1160                        }
1161
1162                        # Guestimate if this is a continuing comment.  If this
1163                        # is the start of a diff block and this line starts
1164                        # ' *' then it is very likely a comment.
1165                        if (!defined $edge &&
1166                            $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
1167                        {
1168                                $in_comment = 1;
1169                        }
1170
1171                        ##print "COMMENT:$in_comment edge<$edge> $rawline\n";
1172                        sanitise_line_reset($in_comment);
1173
1174                } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
1175                        # Standardise the strings and chars within the input to
1176                        # simplify matching -- only bother with positive lines.
1177                        $line = sanitise_line($rawline);
1178                }
1179                push(@lines, $line);
1180
1181                if ($realcnt > 1) {
1182                        $realcnt-- if ($line =~ /^(?:\+| |$)/);
1183                } else {
1184                        $realcnt = 0;
1185                }
1186
1187                #print "==>$rawline\n";
1188                #print "-->$line\n";
1189        }
1190
1191        $prefix = '';
1192
1193        $realcnt = 0;
1194        $linenr = 0;
1195        foreach my $line (@lines) {
1196                $linenr++;
1197
1198                my $rawline = $rawlines[$linenr - 1];
1199
1200#extract the line range in the file after the patch is applied
1201                if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
1202                        $is_patch = 1;
1203                        $first_line = $linenr + 1;
1204                        $realline=$1-1;
1205                        if (defined $2) {
1206                                $realcnt=$3+1;
1207                        } else {
1208                                $realcnt=1+1;
1209                        }
1210                        annotate_reset();
1211                        $prev_values = 'E';
1212
1213                        %suppress_ifbraces = ();
1214                        %suppress_whiletrailers = ();
1215                        %suppress_export = ();
1216                        next;
1217
1218# track the line number as we move through the hunk, note that
1219# new versions of GNU diff omit the leading space on completely
1220# blank context lines so we need to count that too.
1221                } elsif ($line =~ /^( |\+|$)/) {
1222                        $realline++;
1223                        $realcnt-- if ($realcnt != 0);
1224
1225                        # Measure the line length and indent.
1226                        ($length, $indent) = line_stats($rawline);
1227
1228                        # Track the previous line.
1229                        ($prevline, $stashline) = ($stashline, $line);
1230                        ($previndent, $stashindent) = ($stashindent, $indent);
1231                        ($prevrawline, $stashrawline) = ($stashrawline, $rawline);
1232
1233                        #warn "line<$line>\n";
1234
1235                } elsif ($realcnt == 1) {
1236                        $realcnt--;
1237                }
1238
1239                my $hunk_line = ($realcnt != 0);
1240
1241#make up the handle for any error we report on this line
1242                $prefix = "$filename:$realline: " if ($emacs && $file);
1243                $prefix = "$filename:$linenr: " if ($emacs && !$file);
1244
1245                $here = "#$linenr: " if (!$file);
1246                $here = "#$realline: " if ($file);
1247
1248                # extract the filename as it passes
1249                if ($line =~ /^diff --git.*?(\S+)$/) {
1250                        $realfile = $1;
1251                        $realfile =~ s@^([^/]*)/@@;
1252
1253                } elsif ($line =~ /^\+\+\+\s+(\S+)/) {
1254                        $realfile = $1;
1255                        $realfile =~ s@^([^/]*)/@@;
1256
1257                        $p1_prefix = $1;
1258                        if (!$file && $tree && $p1_prefix ne '' &&
1259                            -e "$root/$p1_prefix") {
1260                                WARN("patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
1261                        }
1262
1263                        next;
1264                }
1265
1266                $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
1267
1268                my $hereline = "$here\n$rawline\n";
1269                my $herecurr = "$here\n$rawline\n";
1270                my $hereprev = "$here\n$prevrawline\n$rawline\n";
1271
1272                $cnt_lines++ if ($realcnt != 0);
1273
1274# Check for incorrect file permissions
1275                if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
1276                        my $permhere = $here . "FILE: $realfile\n";
1277                        if ($realfile =~ /(\bMakefile(?:\.objs)?|\.c|\.cc|\.cpp|\.h|\.mak|\.[sS])$/) {
1278                                ERROR("do not set execute permissions for source files\n" . $permhere);
1279                        }
1280                }
1281
1282#check the patch for a signoff:
1283                if ($line =~ /^\s*signed-off-by:/i) {
1284                        # This is a signoff, if ugly, so do not double report.
1285                        $signoff++;
1286                        if (!($line =~ /^\s*Signed-off-by:/)) {
1287                                WARN("Signed-off-by: is the preferred form\n" .
1288                                        $herecurr);
1289                        }
1290                        if ($line =~ /^\s*signed-off-by:\S/i) {
1291                                WARN("space required after Signed-off-by:\n" .
1292                                        $herecurr);
1293                        }
1294                }
1295
1296# Check for wrappage within a valid hunk of the file
1297                if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
1298                        ERROR("patch seems to be corrupt (line wrapped?)\n" .
1299                                $herecurr) if (!$emitted_corrupt++);
1300                }
1301
1302# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
1303                if (($realfile =~ /^$/ || $line =~ /^\+/) &&
1304                    $rawline !~ m/^$UTF8*$/) {
1305                        my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
1306
1307                        my $blank = copy_spacing($rawline);
1308                        my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
1309                        my $hereptr = "$hereline$ptr\n";
1310
1311                        ERROR("Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
1312                }
1313
1314# ignore non-hunk lines and lines being removed
1315                next if (!$hunk_line || $line =~ /^-/);
1316
1317#trailing whitespace
1318                if ($line =~ /^\+.*\015/) {
1319                        my $herevet = "$here\n" . cat_vet($rawline) . "\n";
1320                        ERROR("DOS line endings\n" . $herevet);
1321
1322                } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
1323                        my $herevet = "$here\n" . cat_vet($rawline) . "\n";
1324                        ERROR("trailing whitespace\n" . $herevet);
1325                        $rpt_cleaners = 1;
1326                }
1327
1328# check we are in a valid source file if not then ignore this hunk
1329                next if ($realfile !~ /\.(h|c|cpp|s|S|pl|sh)$/);
1330
1331#80 column limit
1332                if ($line =~ /^\+/ &&
1333                    !($line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
1334                    $length > 80)
1335                {
1336                        WARN("line over 80 characters\n" . $herecurr);
1337                }
1338
1339# check for spaces before a quoted newline
1340                if ($rawline =~ /^.*\".*\s\\n/) {
1341                        WARN("unnecessary whitespace before a quoted newline\n" . $herecurr);
1342                }
1343
1344# check for adding lines without a newline.
1345                if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
1346                        WARN("adding a line without newline at end of file\n" . $herecurr);
1347                }
1348
1349# check we are in a valid source file C or perl if not then ignore this hunk
1350                next if ($realfile !~ /\.(h|c|cpp|pl)$/);
1351
1352# in QEMU, no tabs are allowed
1353                if ($rawline =~ /^\+.*\t/) {
1354                        my $herevet = "$here\n" . cat_vet($rawline) . "\n";
1355                        ERROR("code indent should never use tabs\n" . $herevet);
1356                        $rpt_cleaners = 1;
1357                }
1358
1359# check we are in a valid C source file if not then ignore this hunk
1360                next if ($realfile !~ /\.(h|c|cpp)$/);
1361
1362# check for RCS/CVS revision markers
1363                if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
1364                        WARN("CVS style keyword markers, these will _not_ be updated\n". $herecurr);
1365                }
1366
1367# Check for potential 'bare' types
1368                my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
1369                    $realline_next);
1370                if ($realcnt && $line =~ /.\s*\S/) {
1371                        ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
1372                                ctx_statement_block($linenr, $realcnt, 0);
1373                        $stat =~ s/\n./\n /g;
1374                        $cond =~ s/\n./\n /g;
1375
1376                        # Find the real next line.
1377                        $realline_next = $line_nr_next;
1378                        if (defined $realline_next &&
1379                            (!defined $lines[$realline_next - 1] ||
1380                             substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
1381                                $realline_next++;
1382                        }
1383
1384                        my $s = $stat;
1385                        $s =~ s/{.*$//s;
1386
1387                        # Ignore goto labels.
1388                        if ($s =~ /$Ident:\*$/s) {
1389
1390                        # Ignore functions being called
1391                        } elsif ($s =~ /^.\s*$Ident\s*\(/s) {
1392
1393                        } elsif ($s =~ /^.\s*else\b/s) {
1394
1395                        # declarations always start with types
1396                        } elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+?)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))(?:\s*$Modifier)?\s*(?:;|=|,|\()/s) {
1397                                my $type = $1;
1398                                $type =~ s/\s+/ /g;
1399                                possible($type, "A:" . $s);
1400
1401                        # definitions in global scope can only start with types
1402                        } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
1403                                possible($1, "B:" . $s);
1404                        }
1405
1406                        # any (foo ... *) is a pointer cast, and foo is a type
1407                        while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
1408                                possible($1, "C:" . $s);
1409                        }
1410
1411                        # Check for any sort of function declaration.
1412                        # int foo(something bar, other baz);
1413                        # void (*store_gdt)(x86_descr_ptr *);
1414                        if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
1415                                my ($name_len) = length($1);
1416
1417                                my $ctx = $s;
1418                                substr($ctx, 0, $name_len + 1, '');
1419                                $ctx =~ s/\)[^\)]*$//;
1420
1421                                for my $arg (split(/\s*,\s*/, $ctx)) {
1422                                        if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
1423
1424                                                possible($1, "D:" . $s);
1425                                        }
1426                                }
1427                        }
1428
1429                }
1430
1431#
1432# Checks which may be anchored in the context.
1433#
1434
1435# Check for switch () and associated case and default
1436# statements should be at the same indent.
1437                if ($line=~/\bswitch\s*\(.*\)/) {
1438                        my $err = '';
1439                        my $sep = '';
1440                        my @ctx = ctx_block_outer($linenr, $realcnt);
1441                        shift(@ctx);
1442                        for my $ctx (@ctx) {
1443                                my ($clen, $cindent) = line_stats($ctx);
1444                                if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
1445                                                        $indent != $cindent) {
1446                                        $err .= "$sep$ctx\n";
1447                                        $sep = '';
1448                                } else {
1449                                        $sep = "[...]\n";
1450                                }
1451                        }
1452                        if ($err ne '') {
1453                                ERROR("switch and case should be at the same indent\n$hereline$err");
1454                        }
1455                }
1456
1457# if/while/etc brace do not go on next line, unless defining a do while loop,
1458# or if that brace on the next line is for something else
1459                if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
1460                        my $pre_ctx = "$1$2";
1461
1462                        my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
1463                        my $ctx_cnt = $realcnt - $#ctx - 1;
1464                        my $ctx = join("\n", @ctx);
1465
1466                        my $ctx_ln = $linenr;
1467                        my $ctx_skip = $realcnt;
1468
1469                        while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
1470                                        defined $lines[$ctx_ln - 1] &&
1471                                        $lines[$ctx_ln - 1] =~ /^-/)) {
1472                                ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
1473                                $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
1474                                $ctx_ln++;
1475                        }
1476
1477                        #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
1478                        #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
1479
1480                        # The length of the "previous line" is checked against 80 because it
1481                        # includes the + at the beginning of the line (if the actual line has
1482                        # 79 or 80 characters, it is no longer possible to add a space and an
1483                        # opening brace there)
1484                        if ($#ctx == 0 && $ctx !~ /{\s*/ &&
1485                            defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*\{/ &&
1486                            defined($lines[$ctx_ln - 2]) && length($lines[$ctx_ln - 2]) < 80) {
1487                                ERROR("that open brace { should be on the previous line\n" .
1488                                        "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
1489                        }
1490                        if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
1491                            $ctx =~ /\)\s*\;\s*$/ &&
1492                            defined $lines[$ctx_ln - 1])
1493                        {
1494                                my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
1495                                if ($nindent > $indent) {
1496                                        WARN("trailing semicolon indicates no statements, indent implies otherwise\n" .
1497                                                "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
1498                                }
1499                        }
1500                }
1501
1502# Check relative indent for conditionals and blocks.
1503                if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
1504                        my ($s, $c) = ($stat, $cond);
1505
1506                        substr($s, 0, length($c), '');
1507
1508                        # Make sure we remove the line prefixes as we have
1509                        # none on the first line, and are going to readd them
1510                        # where necessary.
1511                        $s =~ s/\n./\n/gs;
1512
1513                        # Find out how long the conditional actually is.
1514                        my @newlines = ($c =~ /\n/gs);
1515                        my $cond_lines = 1 + $#newlines;
1516
1517                        # We want to check the first line inside the block
1518                        # starting at the end of the conditional, so remove:
1519                        #  1) any blank line termination
1520                        #  2) any opening brace { on end of the line
1521                        #  3) any do (...) {
1522                        my $continuation = 0;
1523                        my $check = 0;
1524                        $s =~ s/^.*\bdo\b//;
1525                        $s =~ s/^\s*\{//;
1526                        if ($s =~ s/^\s*\\//) {
1527                                $continuation = 1;
1528                        }
1529                        if ($s =~ s/^\s*?\n//) {
1530                                $check = 1;
1531                                $cond_lines++;
1532                        }
1533
1534                        # Also ignore a loop construct at the end of a
1535                        # preprocessor statement.
1536                        if (($prevline =~ /^.\s*#\s*define\s/ ||
1537                            $prevline =~ /\\\s*$/) && $continuation == 0) {
1538                                $check = 0;
1539                        }
1540
1541                        my $cond_ptr = -1;
1542                        $continuation = 0;
1543                        while ($cond_ptr != $cond_lines) {
1544                                $cond_ptr = $cond_lines;
1545
1546                                # If we see an #else/#elif then the code
1547                                # is not linear.
1548                                if ($s =~ /^\s*\#\s*(?:else|elif)/) {
1549                                        $check = 0;
1550                                }
1551
1552                                # Ignore:
1553                                #  1) blank lines, they should be at 0,
1554                                #  2) preprocessor lines, and
1555                                #  3) labels.
1556                                if ($continuation ||
1557                                    $s =~ /^\s*?\n/ ||
1558                                    $s =~ /^\s*#\s*?/ ||
1559                                    $s =~ /^\s*$Ident\s*:/) {
1560                                        $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
1561                                        if ($s =~ s/^.*?\n//) {
1562                                                $cond_lines++;
1563                                        }
1564                                }
1565                        }
1566
1567                        my (undef, $sindent) = line_stats("+" . $s);
1568                        my $stat_real = raw_line($linenr, $cond_lines);
1569
1570                        # Check if either of these lines are modified, else
1571                        # this is not this patch's fault.
1572                        if (!defined($stat_real) ||
1573                            $stat !~ /^\+/ && $stat_real !~ /^\+/) {
1574                                $check = 0;
1575                        }
1576                        if (defined($stat_real) && $cond_lines > 1) {
1577                                $stat_real = "[...]\n$stat_real";
1578                        }
1579
1580                        #print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat>\n";
1581
1582                        if ($check && (($sindent % 4) != 0 ||
1583                            ($sindent <= $indent && $s ne ''))) {
1584                                WARN("suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
1585                        }
1586                }
1587
1588                # Track the 'values' across context and added lines.
1589                my $opline = $line; $opline =~ s/^./ /;
1590                my ($curr_values, $curr_vars) =
1591                                annotate_values($opline . "\n", $prev_values);
1592                $curr_values = $prev_values . $curr_values;
1593                if ($dbg_values) {
1594                        my $outline = $opline; $outline =~ s/\t/ /g;
1595                        print "$linenr > .$outline\n";
1596                        print "$linenr > $curr_values\n";
1597                        print "$linenr >  $curr_vars\n";
1598                }
1599                $prev_values = substr($curr_values, -1);
1600
1601#ignore lines not being added
1602                if ($line=~/^[^\+]/) {next;}
1603
1604# TEST: allow direct testing of the type matcher.
1605                if ($dbg_type) {
1606                        if ($line =~ /^.\s*$Declare\s*$/) {
1607                                ERROR("TEST: is type\n" . $herecurr);
1608                        } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
1609                                ERROR("TEST: is not type ($1 is)\n". $herecurr);
1610                        }
1611                        next;
1612                }
1613# TEST: allow direct testing of the attribute matcher.
1614                if ($dbg_attr) {
1615                        if ($line =~ /^.\s*$Modifier\s*$/) {
1616                                ERROR("TEST: is attr\n" . $herecurr);
1617                        } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
1618                                ERROR("TEST: is not attr ($1 is)\n". $herecurr);
1619                        }
1620                        next;
1621                }
1622
1623# check for initialisation to aggregates open brace on the next line
1624                if ($line =~ /^.\s*\{/ &&
1625                    $prevline =~ /(?:^|[^=])=\s*$/) {
1626                        ERROR("that open brace { should be on the previous line\n" . $hereprev);
1627                }
1628
1629#
1630# Checks which are anchored on the added line.
1631#
1632
1633# check for malformed paths in #include statements (uses RAW line)
1634                if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
1635                        my $path = $1;
1636                        if ($path =~ m{//}) {
1637                                ERROR("malformed #include filename\n" .
1638                                        $herecurr);
1639                        }
1640                }
1641
1642# no C99 // comments
1643                if ($line =~ m{//}) {
1644                        ERROR("do not use C99 // comments\n" . $herecurr);
1645                }
1646                # Remove C99 comments.
1647                $line =~ s@//.*@@;
1648                $opline =~ s@//.*@@;
1649
1650# check for global initialisers.
1651                if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) {
1652                        ERROR("do not initialise globals to 0 or NULL\n" .
1653                                $herecurr);
1654                }
1655# check for static initialisers.
1656                if ($line =~ /\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
1657                        ERROR("do not initialise statics to 0 or NULL\n" .
1658                                $herecurr);
1659                }
1660
1661# * goes on variable not on type
1662                # (char*[ const])
1663                if ($line =~ m{\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\)}) {
1664                        my ($from, $to) = ($1, $1);
1665
1666                        # Should start with a space.
1667                        $to =~ s/^(\S)/ $1/;
1668                        # Should not end with a space.
1669                        $to =~ s/\s+$//;
1670                        # '*'s should not have spaces between.
1671                        while ($to =~ s/\*\s+\*/\*\*/) {
1672                        }
1673
1674                        #print "from<$from> to<$to>\n";
1675                        if ($from ne $to) {
1676                                ERROR("\"(foo$from)\" should be \"(foo$to)\"\n" .  $herecurr);
1677                        }
1678                } elsif ($line =~ m{\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident)}) {
1679                        my ($from, $to, $ident) = ($1, $1, $2);
1680
1681                        # Should start with a space.
1682                        $to =~ s/^(\S)/ $1/;
1683                        # Should not end with a space.
1684                        $to =~ s/\s+$//;
1685                        # '*'s should not have spaces between.
1686                        while ($to =~ s/\*\s+\*/\*\*/) {
1687                        }
1688                        # Modifiers should have spaces.
1689                        $to =~ s/(\b$Modifier$)/$1 /;
1690
1691                        #print "from<$from> to<$to> ident<$ident>\n";
1692                        if ($from ne $to && $ident !~ /^$Modifier$/) {
1693                                ERROR("\"foo${from}bar\" should be \"foo${to}bar\"\n" .  $herecurr);
1694                        }
1695                }
1696
1697# function brace can't be on same line, except for #defines of do while,
1698# or if closed on same line
1699                if (($line=~/$Type\s*$Ident\(.*\).*\s\{/) and
1700                    !($line=~/\#\s*define.*do\s\{/) and !($line=~/}/)) {
1701                        ERROR("open brace '{' following function declarations go on the next line\n" . $herecurr);
1702                }
1703
1704# open braces for enum, union and struct go on the same line.
1705                if ($line =~ /^.\s*\{/ &&
1706                    $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
1707                        ERROR("open brace '{' following $1 go on the same line\n" . $hereprev);
1708                }
1709
1710# missing space after union, struct or enum definition
1711                if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?(?:\s+$Ident)?[=\{]/) {
1712                    ERROR("missing space after $1 definition\n" . $herecurr);
1713                }
1714
1715# check for spacing round square brackets; allowed:
1716#  1. with a type on the left -- int [] a;
1717#  2. at the beginning of a line for slice initialisers -- [0...10] = 5,
1718#  3. inside a curly brace -- = { [0...10] = 5 }
1719#  4. after a comma -- [1] = 5, [2] = 6
1720#  5. in a macro definition -- #define abc(x) [x] = y
1721                while ($line =~ /(.*?\s)\[/g) {
1722                        my ($where, $prefix) = ($-[1], $1);
1723                        if ($prefix !~ /$Type\s+$/ &&
1724                            ($where != 0 || $prefix !~ /^.\s+$/) &&
1725                            $prefix !~ /{\s+$/ &&
1726                            $prefix !~ /\#\s*define[^(]*\([^)]*\)\s+$/ &&
1727                            $prefix !~ /,\s+$/) {
1728                                ERROR("space prohibited before open square bracket '['\n" . $herecurr);
1729                        }
1730                }
1731
1732# check for spaces between functions and their parentheses.
1733                while ($line =~ /($Ident)\s+\(/g) {
1734                        my $name = $1;
1735                        my $ctx_before = substr($line, 0, $-[1]);
1736                        my $ctx = "$ctx_before$name";
1737
1738                        # Ignore those directives where spaces _are_ permitted.
1739                        if ($name =~ /^(?:
1740                                if|for|while|switch|return|case|
1741                                volatile|__volatile__|
1742                                __attribute__|format|__extension__|
1743                                asm|__asm__)$/x)
1744                        {
1745
1746                        # Ignore 'catch (...)' in C++
1747                        } elsif ($name =~ /^catch$/ && $realfile =~ /(\.cpp|\.h)$/) {
1748
1749                        # cpp #define statements have non-optional spaces, ie
1750                        # if there is a space between the name and the open
1751                        # parenthesis it is simply not a parameter group.
1752                        } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
1753
1754                        # cpp #elif statement condition may start with a (
1755                        } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
1756
1757                        # If this whole things ends with a type its most
1758                        # likely a typedef for a function.
1759                        } elsif ($ctx =~ /$Type$/) {
1760
1761                        } else {
1762                                WARN("space prohibited between function name and open parenthesis '('\n" . $herecurr);
1763                        }
1764                }
1765# Check operator spacing.
1766                if (!($line=~/\#\s*include/)) {
1767                        my $ops = qr{
1768                                <<=|>>=|<=|>=|==|!=|
1769                                \+=|-=|\*=|\/=|%=|\^=|\|=|&=|
1770                                =>|->|<<|>>|<|>|=|!|~|
1771                                &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
1772                                \?|::|:
1773                        }x;
1774                        my @elements = split(/($ops|;)/, $opline);
1775                        my $off = 0;
1776
1777                        my $blank = copy_spacing($opline);
1778
1779                        for (my $n = 0; $n < $#elements; $n += 2) {
1780                                $off += length($elements[$n]);
1781
1782                                # Pick up the preceding and succeeding characters.
1783                                my $ca = substr($opline, 0, $off);
1784                                my $cc = '';
1785                                if (length($opline) >= ($off + length($elements[$n + 1]))) {
1786                                        $cc = substr($opline, $off + length($elements[$n + 1]));
1787                                }
1788                                my $cb = "$ca$;$cc";
1789
1790                                my $a = '';
1791                                $a = 'V' if ($elements[$n] ne '');
1792                                $a = 'W' if ($elements[$n] =~ /\s$/);
1793                                $a = 'C' if ($elements[$n] =~ /$;$/);
1794                                $a = 'B' if ($elements[$n] =~ /(\[|\()$/);
1795                                $a = 'O' if ($elements[$n] eq '');
1796                                $a = 'E' if ($ca =~ /^\s*$/);
1797
1798                                my $op = $elements[$n + 1];
1799
1800                                my $c = '';
1801                                if (defined $elements[$n + 2]) {
1802                                        $c = 'V' if ($elements[$n + 2] ne '');
1803                                        $c = 'W' if ($elements[$n + 2] =~ /^\s/);
1804                                        $c = 'C' if ($elements[$n + 2] =~ /^$;/);
1805                                        $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
1806                                        $c = 'O' if ($elements[$n + 2] eq '');
1807                                        $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
1808                                } else {
1809                                        $c = 'E';
1810                                }
1811
1812                                my $ctx = "${a}x${c}";
1813
1814                                my $at = "(ctx:$ctx)";
1815
1816                                my $ptr = substr($blank, 0, $off) . "^";
1817                                my $hereptr = "$hereline$ptr\n";
1818
1819                                # Pull out the value of this operator.
1820                                my $op_type = substr($curr_values, $off + 1, 1);
1821
1822                                # Get the full operator variant.
1823                                my $opv = $op . substr($curr_vars, $off, 1);
1824
1825                                # Ignore operators passed as parameters.
1826                                if ($op_type ne 'V' &&
1827                                    $ca =~ /\s$/ && $cc =~ /^\s*,/) {
1828
1829#                               # Ignore comments
1830#                               } elsif ($op =~ /^$;+$/) {
1831
1832                                # ; should have either the end of line or a space or \ after it
1833                                } elsif ($op eq ';') {
1834                                        if ($ctx !~ /.x[WEBC]/ &&
1835                                            $cc !~ /^\\/ && $cc !~ /^;/) {
1836                                                ERROR("space required after that '$op' $at\n" . $hereptr);
1837                                        }
1838
1839                                # // is a comment
1840                                } elsif ($op eq '//') {
1841
1842                                # Ignore : used in class declaration in C++
1843                                } elsif ($opv eq ':B' && $ctx =~ /Wx[WE]/ &&
1844                                                 $line =~ /class/ && $realfile =~ /(\.cpp|\.h)$/) {
1845
1846                                # No spaces for:
1847                                #   ->
1848                                #   :   when part of a bitfield
1849                                } elsif ($op eq '->' || $opv eq ':B') {
1850                                        if ($ctx =~ /Wx.|.xW/) {
1851                                                ERROR("spaces prohibited around that '$op' $at\n" . $hereptr);
1852                                        }
1853
1854                                # , must have a space on the right.
1855                                # not required when having a single },{ on one line
1856                                } elsif ($op eq ',') {
1857                                        if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/ &&
1858                                            ($elements[$n] . $elements[$n + 2]) !~ " *}\\{") {
1859                                                ERROR("space required after that '$op' $at\n" . $hereptr);
1860                                        }
1861
1862                                # '*' as part of a type definition -- reported already.
1863                                } elsif ($opv eq '*_') {
1864                                        #warn "'*' is part of type\n";
1865
1866                                # unary operators should have a space before and
1867                                # none after.  May be left adjacent to another
1868                                # unary operator, or a cast
1869                                } elsif ($op eq '!' || $op eq '~' ||
1870                                         $opv eq '*U' || $opv eq '-U' ||
1871                                         $opv eq '&U' || $opv eq '&&U') {
1872                                        if ($op eq '~' && $ca =~ /::$/ && $realfile =~ /(\.cpp|\.h)$/) {
1873                                                # '~' used as a name of Destructor
1874
1875                                        } elsif ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
1876                                                ERROR("space required before that '$op' $at\n" . $hereptr);
1877                                        }
1878                                        if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
1879                                                # A unary '*' may be const
1880
1881                                        } elsif ($ctx =~ /.xW/) {
1882                                                ERROR("space prohibited after that '$op' $at\n" . $hereptr);
1883                                        }
1884
1885                                # unary ++ and unary -- are allowed no space on one side.
1886                                } elsif ($op eq '++' or $op eq '--') {
1887                                        if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
1888                                                ERROR("space required one side of that '$op' $at\n" . $hereptr);
1889                                        }
1890                                        if ($ctx =~ /Wx[BE]/ ||
1891                                            ($ctx =~ /Wx./ && $cc =~ /^;/)) {
1892                                                ERROR("space prohibited before that '$op' $at\n" . $hereptr);
1893                                        }
1894                                        if ($ctx =~ /ExW/) {
1895                                                ERROR("space prohibited after that '$op' $at\n" . $hereptr);
1896                                        }
1897
1898                                # A colon needs no spaces before when it is
1899                                # terminating a case value or a label.
1900                                } elsif ($opv eq ':C' || $opv eq ':L') {
1901                                        if ($ctx =~ /Wx./) {
1902                                                ERROR("space prohibited before that '$op' $at\n" . $hereptr);
1903                                        }
1904
1905                                # All the others need spaces both sides.
1906                                } elsif ($ctx !~ /[EWC]x[CWE]/) {
1907                                        my $ok = 0;
1908
1909                                        if ($realfile =~ /\.cpp|\.h$/) {
1910                                                # Ignore template arguments <...> in C++
1911                                                if (($op eq '<' || $op eq '>') && $line =~ /<.*>/) {
1912                                                        $ok = 1;
1913                                                }
1914
1915                                                # Ignore :: in C++
1916                                                if ($op eq '::') {
1917                                                        $ok = 1;
1918                                                }
1919                                        }
1920
1921                                        # Ignore email addresses <foo@bar>
1922                                        if (($op eq '<' &&
1923                                             $cc =~ /^\S+\@\S+>/) ||
1924                                            ($op eq '>' &&
1925                                             $ca =~ /<\S+\@\S+$/))
1926                                        {
1927                                                $ok = 1;
1928                                        }
1929
1930                                        # Ignore ?:
1931                                        if (($opv eq ':O' && $ca =~ /\?$/) ||
1932                                            ($op eq '?' && $cc =~ /^:/)) {
1933                                                $ok = 1;
1934                                        }
1935
1936                                        if ($ok == 0) {
1937                                                ERROR("spaces required around that '$op' $at\n" . $hereptr);
1938                                        }
1939                                }
1940                                $off += length($elements[$n + 1]);
1941                        }
1942                }
1943
1944#need space before brace following if, while, etc
1945                if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
1946                    $line =~ /do\{/) {
1947                        ERROR("space required before the open brace '{'\n" . $herecurr);
1948                }
1949
1950# closing brace should have a space following it when it has anything
1951# on the line
1952                if ($line =~ /}(?!(?:,|;|\)))\S/) {
1953                        ERROR("space required after that close brace '}'\n" . $herecurr);
1954                }
1955
1956# check spacing on square brackets
1957                if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
1958                        ERROR("space prohibited after that open square bracket '['\n" . $herecurr);
1959                }
1960                if ($line =~ /\s\]/) {
1961                        ERROR("space prohibited before that close square bracket ']'\n" . $herecurr);
1962                }
1963
1964# check spacing on parentheses
1965                if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
1966                    $line !~ /for\s*\(\s+;/) {
1967                        ERROR("space prohibited after that open parenthesis '('\n" . $herecurr);
1968                }
1969                if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
1970                    $line !~ /for\s*\(.*;\s+\)/ &&
1971                    $line !~ /:\s+\)/) {
1972                        ERROR("space prohibited before that close parenthesis ')'\n" . $herecurr);
1973                }
1974
1975# Return is not a function.
1976                if (defined($stat) && $stat =~ /^.\s*return(\s*)(\(.*);/s) {
1977                        my $spacing = $1;
1978                        my $value = $2;
1979
1980                        # Flatten any parentheses
1981                        $value =~ s/\(/ \(/g;
1982                        $value =~ s/\)/\) /g;
1983                        while ($value =~ s/\[[^\{\}]*\]/1/ ||
1984                               $value !~ /(?:$Ident|-?$Constant)\s*
1985                                             $Compare\s*
1986                                             (?:$Ident|-?$Constant)/x &&
1987                               $value =~ s/\([^\(\)]*\)/1/) {
1988                        }
1989#print "value<$value>\n";
1990                        if ($value =~ /^\s*(?:$Ident|-?$Constant)\s*$/) {
1991                                ERROR("return is not a function, parentheses are not required\n" . $herecurr);
1992
1993                        } elsif ($spacing !~ /\s+/) {
1994                                ERROR("space required before the open parenthesis '('\n" . $herecurr);
1995                        }
1996                }
1997# Return of what appears to be an errno should normally be -'ve
1998                if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
1999                        my $name = $1;
2000                        if ($name ne 'EOF' && $name ne 'ERROR') {
2001                                WARN("return of an errno should typically be -ve (return -$1)\n" . $herecurr);
2002                        }
2003                }
2004
2005# Need a space before open parenthesis after if, while etc
2006                if ($line=~/\b(if|while|for|switch)\(/) {
2007                        ERROR("space required before the open parenthesis '('\n" . $herecurr);
2008                }
2009
2010# Check for illegal assignment in if conditional -- and check for trailing
2011# statements after the conditional.
2012                if ($line =~ /do\s*(?!{)/) {
2013                        my ($stat_next) = ctx_statement_block($line_nr_next,
2014                                                $remain_next, $off_next);
2015                        $stat_next =~ s/\n./\n /g;
2016                        ##print "stat<$stat> stat_next<$stat_next>\n";
2017
2018                        if ($stat_next =~ /^\s*while\b/) {
2019                                # If the statement carries leading newlines,
2020                                # then count those as offsets.
2021                                my ($whitespace) =
2022                                        ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
2023                                my $offset =
2024                                        statement_rawlines($whitespace) - 1;
2025
2026                                $suppress_whiletrailers{$line_nr_next +
2027                                                                $offset} = 1;
2028                        }
2029                }
2030                if (!defined $suppress_whiletrailers{$linenr} &&
2031                    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
2032                        my ($s, $c) = ($stat, $cond);
2033
2034                        if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
2035                                ERROR("do not use assignment in if condition\n" . $herecurr);
2036                        }
2037
2038                        # Find out what is on the end of the line after the
2039                        # conditional.
2040                        substr($s, 0, length($c), '');
2041                        $s =~ s/\n.*//g;
2042                        $s =~ s/$;//g;  # Remove any comments
2043                        if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
2044                            $c !~ /}\s*while\s*/)
2045                        {
2046                                # Find out how long the conditional actually is.
2047                                my @newlines = ($c =~ /\n/gs);
2048                                my $cond_lines = 1 + $#newlines;
2049                                my $stat_real = '';
2050
2051                                $stat_real = raw_line($linenr, $cond_lines)
2052                                                        . "\n" if ($cond_lines);
2053                                if (defined($stat_real) && $cond_lines > 1) {
2054                                        $stat_real = "[...]\n$stat_real";
2055                                }
2056
2057                                ERROR("trailing statements should be on next line\n" . $herecurr . $stat_real);
2058                        }
2059                }
2060
2061# Check for bitwise tests written as boolean
2062                if ($line =~ /
2063                        (?:
2064                                (?:\[|\(|\&\&|\|\|)
2065                                \s*0[xX][0-9]+\s*
2066                                (?:\&\&|\|\|)
2067                        |
2068                                (?:\&\&|\|\|)
2069                                \s*0[xX][0-9]+\s*
2070                                (?:\&\&|\|\||\)|\])
2071                        )/x)
2072                {
2073                        WARN("boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
2074                }
2075
2076# if and else should not have general statements after it
2077                if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
2078                        my $s = $1;
2079                        $s =~ s/$;//g;  # Remove any comments
2080                        if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
2081                                ERROR("trailing statements should be on next line\n" . $herecurr);
2082                        }
2083                }
2084# if should not continue a brace
2085                if ($line =~ /}\s*if\b/) {
2086                        ERROR("trailing statements should be on next line\n" .
2087                                $herecurr);
2088                }
2089# case and default should not have general statements after them
2090                if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
2091                    $line !~ /\G(?:
2092                        (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
2093                        \s*return\s+
2094                    )/xg)
2095                {
2096                        ERROR("trailing statements should be on next line\n" . $herecurr);
2097                }
2098
2099                # Check for }<nl>else {, these must be at the same
2100                # indent level to be relevant to each other.
2101                if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
2102                                                $previndent == $indent) {
2103                        ERROR("else should follow close brace '}'\n" . $hereprev);
2104                }
2105
2106                if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and
2107                                                $previndent == $indent) {
2108                        my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
2109
2110                        # Find out what is on the end of the line after the
2111                        # conditional.
2112                        substr($s, 0, length($c), '');
2113                        $s =~ s/\n.*//g;
2114
2115                        if ($s =~ /^\s*;/) {
2116                                ERROR("while should follow close brace '}'\n" . $hereprev);
2117                        }
2118                }
2119
2120#studly caps, commented out until figure out how to distinguish between use of existing and adding new
2121#               if (($line=~/[\w_][a-z\d]+[A-Z]/) and !($line=~/print/)) {
2122#                   print "No studly caps, use _\n";
2123#                   print "$herecurr";
2124#                   $clean = 0;
2125#               }
2126
2127#no spaces allowed after \ in define
2128                if ($line=~/\#\s*define.*\\\s$/) {
2129                        WARN("Whitepspace after \\ makes next lines useless\n" . $herecurr);
2130                }
2131
2132# multi-statement macros should be enclosed in a do while loop, grab the
2133# first statement and ensure its the whole macro if its not enclosed
2134# in a known good container
2135                if ($realfile !~ m@/vmlinux.lds.h$@ &&
2136                    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
2137                        my $ln = $linenr;
2138                        my $cnt = $realcnt;
2139                        my ($off, $dstat, $dcond, $rest);
2140                        my $ctx = '';
2141
2142                        my $args = defined($1);
2143
2144                        # Find the end of the macro and limit our statement
2145                        # search to that.
2146                        while ($cnt > 0 && defined $lines[$ln - 1] &&
2147                                $lines[$ln - 1] =~ /^(?:-|..*\\$)/)
2148                        {
2149                                $ctx .= $rawlines[$ln - 1] . "\n";
2150                                $cnt-- if ($lines[$ln - 1] !~ /^-/);
2151                                $ln++;
2152                        }
2153                        $ctx .= $rawlines[$ln - 1];
2154
2155                        ($dstat, $dcond, $ln, $cnt, $off) =
2156                                ctx_statement_block($linenr, $ln - $linenr + 1, 0);
2157                        #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
2158                        #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
2159
2160                        # Extract the remainder of the define (if any) and
2161                        # rip off surrounding spaces, and trailing \'s.
2162                        $rest = '';
2163                        while ($off != 0 || ($cnt > 0 && $rest =~ /\\\s*$/)) {
2164                                #print "ADDING cnt<$cnt> $off <" . substr($lines[$ln - 1], $off) . "> rest<$rest>\n";
2165                                if ($off != 0 || $lines[$ln - 1] !~ /^-/) {
2166                                        $rest .= substr($lines[$ln - 1], $off) . "\n";
2167                                        $cnt--;
2168                                }
2169                                $ln++;
2170                                $off = 0;
2171                        }
2172                        $rest =~ s/\\\n.//g;
2173                        $rest =~ s/^\s*//s;
2174                        $rest =~ s/\s*$//s;
2175
2176                        # Clean up the original statement.
2177                        if ($args) {
2178                                substr($dstat, 0, length($dcond), '');
2179                        } else {
2180                                $dstat =~ s/^.\s*\#\s*define\s+$Ident\s*//;
2181                        }
2182                        $dstat =~ s/$;//g;
2183                        $dstat =~ s/\\\n.//g;
2184                        $dstat =~ s/^\s*//s;
2185                        $dstat =~ s/\s*$//s;
2186
2187                        # Flatten any parentheses and braces
2188                        while ($dstat =~ s/\([^\(\)]*\)/1/ ||
2189                               $dstat =~ s/\{[^\{\}]*\}/1/ ||
2190                               $dstat =~ s/\[[^\{\}]*\]/1/)
2191                        {
2192                        }
2193
2194                        my $exceptions = qr{
2195                                $Declare|
2196                                module_param_named|
2197                                MODULE_PARAM_DESC|
2198                                DECLARE_PER_CPU|
2199                                DEFINE_PER_CPU|
2200                                __typeof__\(|
2201                                union|
2202                                struct|
2203                                \.$Ident\s*=\s*|
2204                                ^\"|\"$
2205                        }x;
2206                        #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
2207                        if ($rest ne '' && $rest ne ',') {
2208                                if ($rest !~ /while\s*\(/ &&
2209                                    $dstat !~ /$exceptions/)
2210                                {
2211                                        ERROR("Macros with multiple statements should be enclosed in a do - while loop\n" . "$here\n$ctx\n");
2212                                }
2213
2214                        } elsif ($ctx !~ /;/) {
2215                                if ($dstat ne '' &&
2216                                    $dstat !~ /^(?:$Ident|-?$Constant)$/ &&
2217                                    $dstat !~ /$exceptions/ &&
2218                                    $dstat !~ /^\.$Ident\s*=/ &&
2219                                    $dstat =~ /$Operators/)
2220                                {
2221                                        ERROR("Macros with complex values should be enclosed in parenthesis\n" . "$here\n$ctx\n");
2222                                }
2223                        }
2224                }
2225
2226# check for missing bracing round if etc
2227                if ($line =~ /(^.*)\bif\b/ && $line !~ /\#\s*if/) {
2228                        my ($level, $endln, @chunks) =
2229                                ctx_statement_full($linenr, $realcnt, 1);
2230                        if ($dbg_adv_apw) {
2231                            print "APW: chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
2232                            print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n"
2233                                if $#chunks >= 1;
2234                        }
2235                        if ($#chunks >= 0 && $level == 0) {
2236                                my $allowed = 0;
2237                                my $seen = 0;
2238                                my $herectx = $here . "\n";
2239                                my $ln = $linenr - 1;
2240                                for my $chunk (@chunks) {
2241                                        my ($cond, $block) = @{$chunk};
2242
2243                                        # If the condition carries leading newlines, then count those as offsets.
2244                                        my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
2245                                        my $offset = statement_rawlines($whitespace) - 1;
2246
2247                                        #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
2248
2249                                        # We have looked at and allowed this specific line.
2250                                        $suppress_ifbraces{$ln + $offset} = 1;
2251
2252                                        $herectx .= "$rawlines[$ln + $offset]\n[...]\n";
2253                                        $ln += statement_rawlines($block) - 1;
2254
2255                                        substr($block, 0, length($cond), '');
2256
2257                                        my $spaced_block = $block;
2258                                        $spaced_block =~ s/\n\+/ /g;
2259
2260                                        $seen++ if ($spaced_block =~ /^\s*\{/);
2261
2262                                        print "APW: cond<$cond> block<$block> allowed<$allowed>\n"
2263                                            if $dbg_adv_apw;
2264                                        if (statement_lines($cond) > 1) {
2265                                            print "APW: ALLOWED: cond<$cond>\n"
2266                                                if $dbg_adv_apw;
2267                                            $allowed = 1;
2268                                        }
2269                                        if ($block =~/\b(?:if|for|while)\b/) {
2270                                            print "APW: ALLOWED: block<$block>\n"
2271                                                if $dbg_adv_apw;
2272                                            $allowed = 1;
2273                                        }
2274                                        if (statement_block_size($block) > 1) {
2275                                            print "APW: ALLOWED: lines block<$block>\n"
2276                                                if $dbg_adv_apw;
2277                                            $allowed = 1;
2278                                        }
2279                                }
2280                                if ($seen != ($#chunks + 1)) {
2281                                        WARN("braces {} are necessary for all arms of this statement\n" . $herectx);
2282                                }
2283                        }
2284                }
2285                if (!defined $suppress_ifbraces{$linenr - 1} &&
2286                                        $line =~ /\b(if|while|for|else)\b/ &&
2287                                        $line !~ /\#\s*if/ &&
2288                                        $line !~ /\#\s*else/) {
2289                        my $allowed = 0;
2290
2291                        # Check the pre-context.
2292                        if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
2293                            my $pre = $1;
2294
2295                            if ($line !~ /else/) {
2296                                print "APW: ALLOWED: pre<$pre> line<$line>\n"
2297                                    if $dbg_adv_apw;
2298                                $allowed = 1;
2299                            }
2300                        }
2301
2302                        my ($level, $endln, @chunks) =
2303                                ctx_statement_full($linenr, $realcnt, $-[0]);
2304
2305                        # Check the condition.
2306                        my ($cond, $block) = @{$chunks[0]};
2307                        print "CHECKING<$linenr> cond<$cond> block<$block>\n"
2308                            if $dbg_adv_checking;
2309                        if (defined $cond) {
2310                                substr($block, 0, length($cond), '');
2311                        }
2312                        if (statement_lines($cond) > 1) {
2313                            print "APW: ALLOWED: cond<$cond>\n"
2314                                if $dbg_adv_apw;
2315                            $allowed = 1;
2316                        }
2317                        if ($block =~/\b(?:if|for|while)\b/) {
2318                            print "APW: ALLOWED: block<$block>\n"
2319                                if $dbg_adv_apw;
2320                            $allowed = 1;
2321                        }
2322                        if (statement_block_size($block) > 1) {
2323                            print "APW: ALLOWED: lines block<$block>\n"
2324                                if $dbg_adv_apw;
2325                            $allowed = 1;
2326                        }
2327                        # Check the post-context.
2328                        if (defined $chunks[1]) {
2329                                my ($cond, $block) = @{$chunks[1]};
2330                                if (defined $cond) {
2331                                        substr($block, 0, length($cond), '');
2332                                }
2333                                if ($block =~ /^\s*\{/) {
2334                                    print "APW: ALLOWED: chunk-1 block<$block>\n"
2335                                        if $dbg_adv_apw;
2336                                    $allowed = 1;
2337                                }
2338                        }
2339                        print "DCS: level=$level block<$block> allowed=$allowed\n"
2340                            if $dbg_adv_dcs;
2341                        if ($level == 0 && $block !~ /^\s*\{/ && !$allowed) {
2342                                my $herectx = $here . "\n";;
2343                                my $cnt = statement_rawlines($block);
2344
2345                                for (my $n = 0; $n < $cnt; $n++) {
2346                                        $herectx .= raw_line($linenr, $n) . "\n";;
2347                                }
2348
2349                                WARN("braces {} are necessary even for single statement blocks\n" . $herectx);
2350                        }
2351                }
2352
2353# no volatiles please
2354                my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
2355                if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
2356                        WARN("Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
2357                }
2358
2359# warn about #if 0
2360                if ($line =~ /^.\s*\#\s*if\s+0\b/) {
2361                        WARN("if this code is redundant consider removing it\n" .
2362                                $herecurr);
2363                }
2364
2365# check for needless g_free() checks
2366                if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
2367                        my $expr = $1;
2368                        if ($line =~ /\bg_free\(\Q$expr\E\);/) {
2369                                WARN("g_free(NULL) is safe this check is probably not required\n" . $hereprev);
2370                        }
2371                }
2372
2373# warn about #ifdefs in C files
2374#               if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
2375#                       print "#ifdef in C files should be avoided\n";
2376#                       print "$herecurr";
2377#                       $clean = 0;
2378#               }
2379
2380# warn about spacing in #ifdefs
2381                if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
2382                        ERROR("exactly one space required after that #$1\n" . $herecurr);
2383                }
2384# check for memory barriers without a comment.
2385                if ($line =~ /\b(smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
2386                        if (!ctx_has_comment($first_line, $linenr)) {
2387                                WARN("memory barrier without comment\n" . $herecurr);
2388                        }
2389                }
2390# check of hardware specific defines
2391# we have e.g. CONFIG_LINUX and CONFIG_WIN32 for common cases
2392# where they might be necessary.
2393                if ($line =~ m@^.\s*\#\s*if.*\b__@) {
2394                        WARN("architecture specific defines should be avoided\n" .  $herecurr);
2395                }
2396
2397# Check that the storage class is at the beginning of a declaration
2398                if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
2399                        WARN("storage class should be at the beginning of the declaration\n" . $herecurr)
2400                }
2401
2402# check the location of the inline attribute, that it is between
2403# storage class and type.
2404                if ($line =~ /\b$Type\s+$Inline\b/ ||
2405                    $line =~ /\b$Inline\s+$Storage\b/) {
2406                        ERROR("inline keyword should sit between storage class and type\n" . $herecurr);
2407                }
2408
2409# check for sizeof(&)
2410                if ($line =~ /\bsizeof\s*\(\s*\&/) {
2411                        WARN("sizeof(& should be avoided\n" . $herecurr);
2412                }
2413
2414# check for new externs in .c files.
2415                if ($realfile =~ /\.c$/ && defined $stat &&
2416                    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
2417                {
2418                        my $function_name = $1;
2419                        my $paren_space = $2;
2420
2421                        my $s = $stat;
2422                        if (defined $cond) {
2423                                substr($s, 0, length($cond), '');
2424                        }
2425                        if ($s =~ /^\s*;/ &&
2426                            $function_name ne 'uninitialized_var')
2427                        {
2428                                WARN("externs should be avoided in .c files\n" .  $herecurr);
2429                        }
2430
2431                        if ($paren_space =~ /\n/) {
2432                                WARN("arguments for function declarations should follow identifier\n" . $herecurr);
2433                        }
2434
2435                } elsif ($realfile =~ /\.c$/ && defined $stat &&
2436                    $stat =~ /^.\s*extern\s+/)
2437                {
2438                        WARN("externs should be avoided in .c files\n" .  $herecurr);
2439                }
2440
2441# check for pointless casting of g_malloc return
2442                if ($line =~ /\*\s*\)\s*g_(try)?(m|re)alloc(0?)(_n)?\b/) {
2443                        if ($2 == 'm') {
2444                                WARN("unnecessary cast may hide bugs, use g_$1new$3 instead\n" . $herecurr);
2445                        } else {
2446                                WARN("unnecessary cast may hide bugs, use g_$1renew$3 instead\n" . $herecurr);
2447                        }
2448                }
2449
2450# check for gcc specific __FUNCTION__
2451                if ($line =~ /__FUNCTION__/) {
2452                        WARN("__func__ should be used instead of gcc specific __FUNCTION__\n"  . $herecurr);
2453                }
2454
2455# recommend qemu_strto* over strto* for numeric conversions
2456                if ($line =~ /\b(strto[^k].*?)\s*\(/) {
2457                        WARN("consider using qemu_$1 in preference to $1\n" . $herecurr);
2458                }
2459# check for module_init(), use category-specific init macros explicitly please
2460                if ($line =~ /^module_init\s*\(/) {
2461                        WARN("please use block_init(), type_init() etc. instead of module_init()\n" . $herecurr);
2462                }
2463# check for various ops structs, ensure they are const.
2464                my $struct_ops = qr{AIOCBInfo|
2465                                BdrvActionOps|
2466                                BlockDevOps|
2467                                BlockJobDriver|
2468                                DisplayChangeListenerOps|
2469                                GraphicHwOps|
2470                                IDEDMAOps|
2471                                KVMCapabilityInfo|
2472                                MemoryRegionIOMMUOps|
2473                                MemoryRegionOps|
2474                                MemoryRegionPortio|
2475                                QEMUFileOps|
2476                                SCSIBusInfo|
2477                                SCSIReqOps|
2478                                Spice[A-Z][a-zA-Z0-9]*Interface|
2479                                TPMDriverOps|
2480                                USBDesc[A-Z][a-zA-Z0-9]*|
2481                                VhostOps|
2482                                VMStateDescription|
2483                                VMStateInfo}x;
2484                if ($line !~ /\bconst\b/ &&
2485                    $line =~ /\b($struct_ops)\b/) {
2486                        WARN("struct $1 should normally be const\n" .
2487                                $herecurr);
2488                }
2489
2490# check for %L{u,d,i} in strings
2491                my $string;
2492                while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
2493                        $string = substr($rawline, $-[1], $+[1] - $-[1]);
2494                        $string =~ s/%%/__/g;
2495                        if ($string =~ /(?<!%)%L[udi]/) {
2496                                WARN("\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
2497                                last;
2498                        }
2499                }
2500
2501# QEMU specific tests
2502                if ($rawline =~ /\b(?:Qemu|QEmu)\b/) {
2503                        WARN("use QEMU instead of Qemu or QEmu\n" . $herecurr);
2504                }
2505
2506# Qemu error function tests
2507
2508        # Find newlines in error messages
2509        my $qemu_error_funcs = qr{error_setg|
2510                                error_setg_errno|
2511                                error_setg_win32|
2512                                error_set|
2513                                error_vreport|
2514                                error_report}x;
2515
2516        if ($rawline =~ /\b(?:$qemu_error_funcs)\s*\(\s*\".*\\n/) {
2517                WARN("Error messages should not contain newlines\n" . $herecurr);
2518        }
2519
2520        # Continue checking for error messages that contains newlines. This
2521        # check handles cases where string literals are spread over multiple lines.
2522        # Example:
2523        # error_report("Error msg line #1"
2524        #              "Error msg line #2\n");
2525        my $quoted_newline_regex = qr{\+\s*\".*\\n.*\"};
2526        my $continued_str_literal = qr{\+\s*\".*\"};
2527
2528        if ($rawline =~ /$quoted_newline_regex/) {
2529                # Backtrack to first line that does not contain only a quoted literal
2530                # and assume that it is the start of the statement.
2531                my $i = $linenr - 2;
2532
2533                while (($i >= 0) & $rawlines[$i] =~ /$continued_str_literal/) {
2534                        $i--;
2535                }
2536
2537                if ($rawlines[$i] =~ /\b(?:$qemu_error_funcs)\s*\(/) {
2538                        WARN("Error messages should not contain newlines\n" . $herecurr);
2539                }
2540        }
2541
2542# check for non-portable ffs() calls that have portable alternatives in QEMU
2543                if ($line =~ /\bffs\(/) {
2544                        ERROR("use ctz32() instead of ffs()\n" . $herecurr);
2545                }
2546                if ($line =~ /\bffsl\(/) {
2547                        ERROR("use ctz32() or ctz64() instead of ffsl()\n" . $herecurr);
2548                }
2549                if ($line =~ /\bffsll\(/) {
2550                        ERROR("use ctz64() instead of ffsll()\n" . $herecurr);
2551                }
2552        }
2553
2554        # If we have no input at all, then there is nothing to report on
2555        # so just keep quiet.
2556        if ($#rawlines == -1) {
2557                exit(0);
2558        }
2559
2560        # In mailback mode only produce a report in the negative, for
2561        # things that appear to be patches.
2562        if ($mailback && ($clean == 1 || !$is_patch)) {
2563                exit(0);
2564        }
2565
2566        # This is not a patch, and we are are in 'no-patch' mode so
2567        # just keep quiet.
2568        if (!$chk_patch && !$is_patch) {
2569                exit(0);
2570        }
2571
2572        if (!$is_patch) {
2573                ERROR("Does not appear to be a unified-diff format patch\n");
2574        }
2575        if ($is_patch && $chk_signoff && $signoff == 0) {
2576                ERROR("Missing Signed-off-by: line(s)\n");
2577        }
2578
2579        print report_dump();
2580        if ($summary && !($clean == 1 && $quiet == 1)) {
2581                print "$filename " if ($summary_file);
2582                print "total: $cnt_error errors, $cnt_warn warnings, " .
2583                        (($check)? "$cnt_chk checks, " : "") .
2584                        "$cnt_lines lines checked\n";
2585                print "\n" if ($quiet == 0);
2586        }
2587
2588        if ($quiet == 0) {
2589                # If there were whitespace errors which cleanpatch can fix
2590                # then suggest that.
2591#               if ($rpt_cleaners) {
2592#                       print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n";
2593#                       print "      scripts/cleanfile\n\n";
2594#               }
2595        }
2596
2597        if ($clean == 1 && $quiet == 0) {
2598                print "$vname has no obvious style problems and is ready for submission.\n"
2599        }
2600        if ($clean == 0 && $quiet == 0) {
2601                print "$vname has style problems, please review.  If any of these errors\n";
2602                print "are false positives report them to the maintainer, see\n";
2603                print "CHECKPATCH in MAINTAINERS.\n";
2604        }
2605
2606        return $clean;
2607}
2608