1dd88ab32SMasahiro Yamada#!/usr/bin/perl -w 2dd88ab32SMasahiro Yamada# (c) 2001, Dave Jones. (the file handling bit) 3dd88ab32SMasahiro Yamada# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit) 4dd88ab32SMasahiro Yamada# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite) 5dd88ab32SMasahiro Yamada# (c) 2008-2010 Andy Whitcroft <apw@canonical.com> 6dd88ab32SMasahiro Yamada# Licensed under the terms of the GNU GPL License version 2 7dd88ab32SMasahiro Yamada 8dd88ab32SMasahiro Yamadause strict; 96b9709d9STom Riniuse POSIX; 10*c10e0f5bSDan Murphyuse File::Basename; 11*c10e0f5bSDan Murphyuse Cwd 'abs_path'; 12dd88ab32SMasahiro Yamada 13dd88ab32SMasahiro Yamadamy $P = $0; 14dd88ab32SMasahiro Yamada$P =~ s@.*/@@g; 15*c10e0f5bSDan Murphymy $D = dirname(abs_path($P)); 16dd88ab32SMasahiro Yamada 17dd88ab32SMasahiro Yamadamy $V = '0.32'; 18dd88ab32SMasahiro Yamada 19dd88ab32SMasahiro Yamadause Getopt::Long qw(:config no_auto_abbrev); 20dd88ab32SMasahiro Yamada 21dd88ab32SMasahiro Yamadamy $quiet = 0; 22dd88ab32SMasahiro Yamadamy $tree = 1; 23dd88ab32SMasahiro Yamadamy $chk_signoff = 1; 24dd88ab32SMasahiro Yamadamy $chk_patch = 1; 25dd88ab32SMasahiro Yamadamy $tst_only; 26dd88ab32SMasahiro Yamadamy $emacs = 0; 27dd88ab32SMasahiro Yamadamy $terse = 0; 28dd88ab32SMasahiro Yamadamy $file = 0; 29dd88ab32SMasahiro Yamadamy $check = 0; 30dd88ab32SMasahiro Yamadamy $summary = 1; 31dd88ab32SMasahiro Yamadamy $mailback = 0; 32dd88ab32SMasahiro Yamadamy $summary_file = 0; 33dd88ab32SMasahiro Yamadamy $show_types = 0; 346b9709d9STom Rinimy $fix = 0; 356b9709d9STom Rinimy $fix_inplace = 0; 36dd88ab32SMasahiro Yamadamy $root; 37dd88ab32SMasahiro Yamadamy %debug; 386b9709d9STom Rinimy %camelcase = (); 396b9709d9STom Rinimy %use_type = (); 406b9709d9STom Rinimy @use = (); 41dd88ab32SMasahiro Yamadamy %ignore_type = (); 42dd88ab32SMasahiro Yamadamy @ignore = (); 43dd88ab32SMasahiro Yamadamy $help = 0; 44dd88ab32SMasahiro Yamadamy $configuration_file = ".checkpatch.conf"; 45dd88ab32SMasahiro Yamadamy $max_line_length = 80; 466b9709d9STom Rinimy $ignore_perl_version = 0; 476b9709d9STom Rinimy $minimum_perl_version = 5.10.0; 48*c10e0f5bSDan Murphymy $spelling_file = "$D/spelling.txt"; 49*c10e0f5bSDan Murphymy $codespell = 0; 50*c10e0f5bSDan Murphymy $codespellfile = "/usr/share/codespell/dictionary.txt"; 51dd88ab32SMasahiro Yamada 52dd88ab32SMasahiro Yamadasub help { 53dd88ab32SMasahiro Yamada my ($exitcode) = @_; 54dd88ab32SMasahiro Yamada 55dd88ab32SMasahiro Yamada print << "EOM"; 56dd88ab32SMasahiro YamadaUsage: $P [OPTION]... [FILE]... 57dd88ab32SMasahiro YamadaVersion: $V 58dd88ab32SMasahiro Yamada 59dd88ab32SMasahiro YamadaOptions: 60dd88ab32SMasahiro Yamada -q, --quiet quiet 61dd88ab32SMasahiro Yamada --no-tree run without a kernel tree 62dd88ab32SMasahiro Yamada --no-signoff do not check for 'Signed-off-by' line 63dd88ab32SMasahiro Yamada --patch treat FILE as patchfile (default) 64dd88ab32SMasahiro Yamada --emacs emacs compile window format 65dd88ab32SMasahiro Yamada --terse one line per report 66dd88ab32SMasahiro Yamada -f, --file treat FILE as regular source file 67dd88ab32SMasahiro Yamada --subjective, --strict enable more subjective tests 686b9709d9STom Rini --types TYPE(,TYPE2...) show only these comma separated message types 69dd88ab32SMasahiro Yamada --ignore TYPE(,TYPE2...) ignore various comma separated message types 70dd88ab32SMasahiro Yamada --max-line-length=n set the maximum line length, if exceeded, warn 71dd88ab32SMasahiro Yamada --show-types show the message "types" in the output 72dd88ab32SMasahiro Yamada --root=PATH PATH to the kernel tree root 73dd88ab32SMasahiro Yamada --no-summary suppress the per-file summary 74dd88ab32SMasahiro Yamada --mailback only produce a report in case of warnings/errors 75dd88ab32SMasahiro Yamada --summary-file include the filename in summary 76dd88ab32SMasahiro Yamada --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of 77dd88ab32SMasahiro Yamada 'values', 'possible', 'type', and 'attr' (default 78dd88ab32SMasahiro Yamada is all off) 79dd88ab32SMasahiro Yamada --test-only=WORD report only warnings/errors containing WORD 80dd88ab32SMasahiro Yamada literally 816b9709d9STom Rini --fix EXPERIMENTAL - may create horrible results 826b9709d9STom Rini If correctable single-line errors exist, create 836b9709d9STom Rini "<inputfile>.EXPERIMENTAL-checkpatch-fixes" 846b9709d9STom Rini with potential errors corrected to the preferred 856b9709d9STom Rini checkpatch style 866b9709d9STom Rini --fix-inplace EXPERIMENTAL - may create horrible results 876b9709d9STom Rini Is the same as --fix, but overwrites the input 886b9709d9STom Rini file. It's your fault if there's no backup or git 896b9709d9STom Rini --ignore-perl-version override checking of perl version. expect 906b9709d9STom Rini runtime errors. 91*c10e0f5bSDan Murphy --codespell Use the codespell dictionary for spelling/typos 92*c10e0f5bSDan Murphy (default:/usr/local/share/codespell/dictionary.txt) 93*c10e0f5bSDan Murphy --codespellfile Use this codespell dictionary 94dd88ab32SMasahiro Yamada -h, --help, --version display this help and exit 95dd88ab32SMasahiro Yamada 96dd88ab32SMasahiro YamadaWhen FILE is - read standard input. 97dd88ab32SMasahiro YamadaEOM 98dd88ab32SMasahiro Yamada 99dd88ab32SMasahiro Yamada exit($exitcode); 100dd88ab32SMasahiro Yamada} 101dd88ab32SMasahiro Yamada 102dd88ab32SMasahiro Yamadamy $conf = which_conf($configuration_file); 103dd88ab32SMasahiro Yamadaif (-f $conf) { 104dd88ab32SMasahiro Yamada my @conf_args; 105dd88ab32SMasahiro Yamada open(my $conffile, '<', "$conf") 106dd88ab32SMasahiro Yamada or warn "$P: Can't find a readable $configuration_file file $!\n"; 107dd88ab32SMasahiro Yamada 108dd88ab32SMasahiro Yamada while (<$conffile>) { 109dd88ab32SMasahiro Yamada my $line = $_; 110dd88ab32SMasahiro Yamada 111dd88ab32SMasahiro Yamada $line =~ s/\s*\n?$//g; 112dd88ab32SMasahiro Yamada $line =~ s/^\s*//g; 113dd88ab32SMasahiro Yamada $line =~ s/\s+/ /g; 114dd88ab32SMasahiro Yamada 115dd88ab32SMasahiro Yamada next if ($line =~ m/^\s*#/); 116dd88ab32SMasahiro Yamada next if ($line =~ m/^\s*$/); 117dd88ab32SMasahiro Yamada 118dd88ab32SMasahiro Yamada my @words = split(" ", $line); 119dd88ab32SMasahiro Yamada foreach my $word (@words) { 120dd88ab32SMasahiro Yamada last if ($word =~ m/^#/); 121dd88ab32SMasahiro Yamada push (@conf_args, $word); 122dd88ab32SMasahiro Yamada } 123dd88ab32SMasahiro Yamada } 124dd88ab32SMasahiro Yamada close($conffile); 125dd88ab32SMasahiro Yamada unshift(@ARGV, @conf_args) if @conf_args; 126dd88ab32SMasahiro Yamada} 127dd88ab32SMasahiro Yamada 128dd88ab32SMasahiro YamadaGetOptions( 129dd88ab32SMasahiro Yamada 'q|quiet+' => \$quiet, 130dd88ab32SMasahiro Yamada 'tree!' => \$tree, 131dd88ab32SMasahiro Yamada 'signoff!' => \$chk_signoff, 132dd88ab32SMasahiro Yamada 'patch!' => \$chk_patch, 133dd88ab32SMasahiro Yamada 'emacs!' => \$emacs, 134dd88ab32SMasahiro Yamada 'terse!' => \$terse, 135dd88ab32SMasahiro Yamada 'f|file!' => \$file, 136dd88ab32SMasahiro Yamada 'subjective!' => \$check, 137dd88ab32SMasahiro Yamada 'strict!' => \$check, 138dd88ab32SMasahiro Yamada 'ignore=s' => \@ignore, 1396b9709d9STom Rini 'types=s' => \@use, 140dd88ab32SMasahiro Yamada 'show-types!' => \$show_types, 141dd88ab32SMasahiro Yamada 'max-line-length=i' => \$max_line_length, 142dd88ab32SMasahiro Yamada 'root=s' => \$root, 143dd88ab32SMasahiro Yamada 'summary!' => \$summary, 144dd88ab32SMasahiro Yamada 'mailback!' => \$mailback, 145dd88ab32SMasahiro Yamada 'summary-file!' => \$summary_file, 1466b9709d9STom Rini 'fix!' => \$fix, 1476b9709d9STom Rini 'fix-inplace!' => \$fix_inplace, 1486b9709d9STom Rini 'ignore-perl-version!' => \$ignore_perl_version, 149dd88ab32SMasahiro Yamada 'debug=s' => \%debug, 150dd88ab32SMasahiro Yamada 'test-only=s' => \$tst_only, 151*c10e0f5bSDan Murphy 'codespell!' => \$codespell, 152*c10e0f5bSDan Murphy 'codespellfile=s' => \$codespellfile, 153dd88ab32SMasahiro Yamada 'h|help' => \$help, 154dd88ab32SMasahiro Yamada 'version' => \$help 155dd88ab32SMasahiro Yamada) or help(1); 156dd88ab32SMasahiro Yamada 157dd88ab32SMasahiro Yamadahelp(0) if ($help); 158dd88ab32SMasahiro Yamada 1596b9709d9STom Rini$fix = 1 if ($fix_inplace); 1606b9709d9STom Rini 161dd88ab32SMasahiro Yamadamy $exit = 0; 162dd88ab32SMasahiro Yamada 1636b9709d9STom Riniif ($^V && $^V lt $minimum_perl_version) { 1646b9709d9STom Rini printf "$P: requires at least perl version %vd\n", $minimum_perl_version; 1656b9709d9STom Rini if (!$ignore_perl_version) { 1666b9709d9STom Rini exit(1); 1676b9709d9STom Rini } 1686b9709d9STom Rini} 1696b9709d9STom Rini 170dd88ab32SMasahiro Yamadaif ($#ARGV < 0) { 171dd88ab32SMasahiro Yamada print "$P: no input files\n"; 172dd88ab32SMasahiro Yamada exit(1); 173dd88ab32SMasahiro Yamada} 174dd88ab32SMasahiro Yamada 1756b9709d9STom Rinisub hash_save_array_words { 1766b9709d9STom Rini my ($hashRef, $arrayRef) = @_; 1776b9709d9STom Rini 1786b9709d9STom Rini my @array = split(/,/, join(',', @$arrayRef)); 1796b9709d9STom Rini foreach my $word (@array) { 180dd88ab32SMasahiro Yamada $word =~ s/\s*\n?$//g; 181dd88ab32SMasahiro Yamada $word =~ s/^\s*//g; 182dd88ab32SMasahiro Yamada $word =~ s/\s+/ /g; 183dd88ab32SMasahiro Yamada $word =~ tr/[a-z]/[A-Z]/; 184dd88ab32SMasahiro Yamada 185dd88ab32SMasahiro Yamada next if ($word =~ m/^\s*#/); 186dd88ab32SMasahiro Yamada next if ($word =~ m/^\s*$/); 187dd88ab32SMasahiro Yamada 1886b9709d9STom Rini $hashRef->{$word}++; 189dd88ab32SMasahiro Yamada } 1906b9709d9STom Rini} 1916b9709d9STom Rini 1926b9709d9STom Rinisub hash_show_words { 1936b9709d9STom Rini my ($hashRef, $prefix) = @_; 1946b9709d9STom Rini 1956b9709d9STom Rini if ($quiet == 0 && keys %$hashRef) { 1966b9709d9STom Rini print "NOTE: $prefix message types:"; 1976b9709d9STom Rini foreach my $word (sort keys %$hashRef) { 1986b9709d9STom Rini print " $word"; 1996b9709d9STom Rini } 2006b9709d9STom Rini print "\n\n"; 2016b9709d9STom Rini } 2026b9709d9STom Rini} 2036b9709d9STom Rini 2046b9709d9STom Rinihash_save_array_words(\%ignore_type, \@ignore); 2056b9709d9STom Rinihash_save_array_words(\%use_type, \@use); 206dd88ab32SMasahiro Yamada 207dd88ab32SMasahiro Yamadamy $dbg_values = 0; 208dd88ab32SMasahiro Yamadamy $dbg_possible = 0; 209dd88ab32SMasahiro Yamadamy $dbg_type = 0; 210dd88ab32SMasahiro Yamadamy $dbg_attr = 0; 211dd88ab32SMasahiro Yamadafor my $key (keys %debug) { 212dd88ab32SMasahiro Yamada ## no critic 213dd88ab32SMasahiro Yamada eval "\${dbg_$key} = '$debug{$key}';"; 214dd88ab32SMasahiro Yamada die "$@" if ($@); 215dd88ab32SMasahiro Yamada} 216dd88ab32SMasahiro Yamada 217dd88ab32SMasahiro Yamadamy $rpt_cleaners = 0; 218dd88ab32SMasahiro Yamada 219dd88ab32SMasahiro Yamadaif ($terse) { 220dd88ab32SMasahiro Yamada $emacs = 1; 221dd88ab32SMasahiro Yamada $quiet++; 222dd88ab32SMasahiro Yamada} 223dd88ab32SMasahiro Yamada 224dd88ab32SMasahiro Yamadaif ($tree) { 225dd88ab32SMasahiro Yamada if (defined $root) { 226dd88ab32SMasahiro Yamada if (!top_of_kernel_tree($root)) { 227dd88ab32SMasahiro Yamada die "$P: $root: --root does not point at a valid tree\n"; 228dd88ab32SMasahiro Yamada } 229dd88ab32SMasahiro Yamada } else { 230dd88ab32SMasahiro Yamada if (top_of_kernel_tree('.')) { 231dd88ab32SMasahiro Yamada $root = '.'; 232dd88ab32SMasahiro Yamada } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ && 233dd88ab32SMasahiro Yamada top_of_kernel_tree($1)) { 234dd88ab32SMasahiro Yamada $root = $1; 235dd88ab32SMasahiro Yamada } 236dd88ab32SMasahiro Yamada } 237dd88ab32SMasahiro Yamada 238dd88ab32SMasahiro Yamada if (!defined $root) { 239dd88ab32SMasahiro Yamada print "Must be run from the top-level dir. of a kernel tree\n"; 240dd88ab32SMasahiro Yamada exit(2); 241dd88ab32SMasahiro Yamada } 242dd88ab32SMasahiro Yamada} 243dd88ab32SMasahiro Yamada 244dd88ab32SMasahiro Yamadamy $emitted_corrupt = 0; 245dd88ab32SMasahiro Yamada 246dd88ab32SMasahiro Yamadaour $Ident = qr{ 247dd88ab32SMasahiro Yamada [A-Za-z_][A-Za-z\d_]* 248dd88ab32SMasahiro Yamada (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)* 249dd88ab32SMasahiro Yamada }x; 250dd88ab32SMasahiro Yamadaour $Storage = qr{extern|static|asmlinkage}; 251dd88ab32SMasahiro Yamadaour $Sparse = qr{ 252dd88ab32SMasahiro Yamada __user| 253dd88ab32SMasahiro Yamada __kernel| 254dd88ab32SMasahiro Yamada __force| 255dd88ab32SMasahiro Yamada __iomem| 256dd88ab32SMasahiro Yamada __must_check| 257dd88ab32SMasahiro Yamada __init_refok| 258dd88ab32SMasahiro Yamada __kprobes| 259dd88ab32SMasahiro Yamada __ref| 260dd88ab32SMasahiro Yamada __rcu 261dd88ab32SMasahiro Yamada }x; 2626b9709d9STom Riniour $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)}; 2636b9709d9STom Riniour $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)}; 2646b9709d9STom Riniour $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)}; 2656b9709d9STom Riniour $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)}; 2666b9709d9STom Riniour $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit}; 267dd88ab32SMasahiro Yamada 268dd88ab32SMasahiro Yamada# Notes to $Attribute: 269dd88ab32SMasahiro Yamada# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check 270dd88ab32SMasahiro Yamadaour $Attribute = qr{ 271dd88ab32SMasahiro Yamada const| 272dd88ab32SMasahiro Yamada __percpu| 273dd88ab32SMasahiro Yamada __nocast| 274dd88ab32SMasahiro Yamada __safe| 275dd88ab32SMasahiro Yamada __bitwise__| 276dd88ab32SMasahiro Yamada __packed__| 277dd88ab32SMasahiro Yamada __packed2__| 278dd88ab32SMasahiro Yamada __naked| 279dd88ab32SMasahiro Yamada __maybe_unused| 280dd88ab32SMasahiro Yamada __always_unused| 281dd88ab32SMasahiro Yamada __noreturn| 282dd88ab32SMasahiro Yamada __used| 283dd88ab32SMasahiro Yamada __cold| 284dd88ab32SMasahiro Yamada __noclone| 285dd88ab32SMasahiro Yamada __deprecated| 286dd88ab32SMasahiro Yamada __read_mostly| 287dd88ab32SMasahiro Yamada __kprobes| 2886b9709d9STom Rini $InitAttribute| 289dd88ab32SMasahiro Yamada ____cacheline_aligned| 290dd88ab32SMasahiro Yamada ____cacheline_aligned_in_smp| 291dd88ab32SMasahiro Yamada ____cacheline_internodealigned_in_smp| 292dd88ab32SMasahiro Yamada __weak 293dd88ab32SMasahiro Yamada }x; 294dd88ab32SMasahiro Yamadaour $Modifier; 295dd88ab32SMasahiro Yamadaour $Inline = qr{inline|__always_inline|noinline}; 296dd88ab32SMasahiro Yamadaour $Member = qr{->$Ident|\.$Ident|\[[^]]*\]}; 297dd88ab32SMasahiro Yamadaour $Lval = qr{$Ident(?:$Member)*}; 298dd88ab32SMasahiro Yamada 2996b9709d9STom Riniour $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u}; 3006b9709d9STom Riniour $Binary = qr{(?i)0b[01]+$Int_type?}; 3016b9709d9STom Riniour $Hex = qr{(?i)0x[0-9a-f]+$Int_type?}; 3026b9709d9STom Riniour $Int = qr{[0-9]+$Int_type?}; 303dd88ab32SMasahiro Yamadaour $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?}; 304dd88ab32SMasahiro Yamadaour $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?}; 305dd88ab32SMasahiro Yamadaour $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?}; 306dd88ab32SMasahiro Yamadaour $Float = qr{$Float_hex|$Float_dec|$Float_int}; 3076b9709d9STom Riniour $Constant = qr{$Float|$Binary|$Hex|$Int}; 308dd88ab32SMasahiro Yamadaour $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=}; 309dd88ab32SMasahiro Yamadaour $Compare = qr{<=|>=|==|!=|<|>}; 3106b9709d9STom Riniour $Arithmetic = qr{\+|-|\*|\/|%}; 311dd88ab32SMasahiro Yamadaour $Operators = qr{ 312dd88ab32SMasahiro Yamada <=|>=|==|!=| 313dd88ab32SMasahiro Yamada =>|->|<<|>>|<|>|!|~| 3146b9709d9STom Rini &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic 315dd88ab32SMasahiro Yamada }x; 316dd88ab32SMasahiro Yamada 317dd88ab32SMasahiro Yamadaour $NonptrType; 3186b9709d9STom Riniour $NonptrTypeWithAttr; 319dd88ab32SMasahiro Yamadaour $Type; 320dd88ab32SMasahiro Yamadaour $Declare; 321dd88ab32SMasahiro Yamada 322dd88ab32SMasahiro Yamadaour $NON_ASCII_UTF8 = qr{ 323dd88ab32SMasahiro Yamada [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte 324dd88ab32SMasahiro Yamada | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs 325dd88ab32SMasahiro Yamada | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte 326dd88ab32SMasahiro Yamada | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates 327dd88ab32SMasahiro Yamada | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 328dd88ab32SMasahiro Yamada | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 329dd88ab32SMasahiro Yamada | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 330dd88ab32SMasahiro Yamada}x; 331dd88ab32SMasahiro Yamada 332dd88ab32SMasahiro Yamadaour $UTF8 = qr{ 333dd88ab32SMasahiro Yamada [\x09\x0A\x0D\x20-\x7E] # ASCII 334dd88ab32SMasahiro Yamada | $NON_ASCII_UTF8 335dd88ab32SMasahiro Yamada}x; 336dd88ab32SMasahiro Yamada 337dd88ab32SMasahiro Yamadaour $typeTypedefs = qr{(?x: 338dd88ab32SMasahiro Yamada (?:__)?(?:u|s|be|le)(?:8|16|32|64)| 339dd88ab32SMasahiro Yamada atomic_t 340dd88ab32SMasahiro Yamada)}; 341dd88ab32SMasahiro Yamada 342dd88ab32SMasahiro Yamadaour $logFunctions = qr{(?x: 343dd88ab32SMasahiro Yamada printk(?:_ratelimited|_once|)| 3446b9709d9STom Rini (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)| 345dd88ab32SMasahiro Yamada WARN(?:_RATELIMIT|_ONCE|)| 346dd88ab32SMasahiro Yamada panic| 347dd88ab32SMasahiro Yamada debug| 348dd88ab32SMasahiro Yamada printf| 3496b9709d9STom Rini puts| 3506b9709d9STom Rini MODULE_[A-Z_]+| 3516b9709d9STom Rini seq_vprintf|seq_printf|seq_puts 352dd88ab32SMasahiro Yamada)}; 353dd88ab32SMasahiro Yamada 354dd88ab32SMasahiro Yamadaour $signature_tags = qr{(?xi: 355dd88ab32SMasahiro Yamada Signed-off-by:| 356dd88ab32SMasahiro Yamada Acked-by:| 357dd88ab32SMasahiro Yamada Tested-by:| 358dd88ab32SMasahiro Yamada Reviewed-by:| 359dd88ab32SMasahiro Yamada Reported-by:| 3606b9709d9STom Rini Suggested-by:| 361dd88ab32SMasahiro Yamada To:| 362dd88ab32SMasahiro Yamada Cc: 363dd88ab32SMasahiro Yamada)}; 364dd88ab32SMasahiro Yamada 365dd88ab32SMasahiro Yamadaour @typeList = ( 366dd88ab32SMasahiro Yamada qr{void}, 367dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?char}, 368dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?short}, 369dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?int}, 370dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?long}, 371dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?long\s+int}, 372dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?long\s+long}, 373dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?long\s+long\s+int}, 374dd88ab32SMasahiro Yamada qr{unsigned}, 375dd88ab32SMasahiro Yamada qr{float}, 376dd88ab32SMasahiro Yamada qr{double}, 377dd88ab32SMasahiro Yamada qr{bool}, 378dd88ab32SMasahiro Yamada qr{struct\s+$Ident}, 379dd88ab32SMasahiro Yamada qr{union\s+$Ident}, 380dd88ab32SMasahiro Yamada qr{enum\s+$Ident}, 381dd88ab32SMasahiro Yamada qr{${Ident}_t}, 382dd88ab32SMasahiro Yamada qr{${Ident}_handler}, 383dd88ab32SMasahiro Yamada qr{${Ident}_handler_fn}, 384dd88ab32SMasahiro Yamada); 3856b9709d9STom Riniour @typeListWithAttr = ( 3866b9709d9STom Rini @typeList, 3876b9709d9STom Rini qr{struct\s+$InitAttribute\s+$Ident}, 3886b9709d9STom Rini qr{union\s+$InitAttribute\s+$Ident}, 3896b9709d9STom Rini); 3906b9709d9STom Rini 391dd88ab32SMasahiro Yamadaour @modifierList = ( 392dd88ab32SMasahiro Yamada qr{fastcall}, 393dd88ab32SMasahiro Yamada); 394dd88ab32SMasahiro Yamada 395dd88ab32SMasahiro Yamadaour $allowed_asm_includes = qr{(?x: 396dd88ab32SMasahiro Yamada irq| 397dd88ab32SMasahiro Yamada memory 398dd88ab32SMasahiro Yamada)}; 399dd88ab32SMasahiro Yamada# memory.h: ARM has a custom one 400dd88ab32SMasahiro Yamada 401*c10e0f5bSDan Murphy# Load common spelling mistakes and build regular expression list. 402*c10e0f5bSDan Murphymy $misspellings; 403*c10e0f5bSDan Murphymy %spelling_fix; 404*c10e0f5bSDan Murphy 405*c10e0f5bSDan Murphyif (open(my $spelling, '<', $spelling_file)) { 406*c10e0f5bSDan Murphy while (<$spelling>) { 407*c10e0f5bSDan Murphy my $line = $_; 408*c10e0f5bSDan Murphy 409*c10e0f5bSDan Murphy $line =~ s/\s*\n?$//g; 410*c10e0f5bSDan Murphy $line =~ s/^\s*//g; 411*c10e0f5bSDan Murphy 412*c10e0f5bSDan Murphy next if ($line =~ m/^\s*#/); 413*c10e0f5bSDan Murphy next if ($line =~ m/^\s*$/); 414*c10e0f5bSDan Murphy 415*c10e0f5bSDan Murphy my ($suspect, $fix) = split(/\|\|/, $line); 416*c10e0f5bSDan Murphy 417*c10e0f5bSDan Murphy $spelling_fix{$suspect} = $fix; 418*c10e0f5bSDan Murphy } 419*c10e0f5bSDan Murphy close($spelling); 420*c10e0f5bSDan Murphy} else { 421*c10e0f5bSDan Murphy warn "No typos will be found - file '$spelling_file': $!\n"; 422*c10e0f5bSDan Murphy} 423*c10e0f5bSDan Murphy 424*c10e0f5bSDan Murphyif ($codespell) { 425*c10e0f5bSDan Murphy if (open(my $spelling, '<', $codespellfile)) { 426*c10e0f5bSDan Murphy while (<$spelling>) { 427*c10e0f5bSDan Murphy my $line = $_; 428*c10e0f5bSDan Murphy 429*c10e0f5bSDan Murphy $line =~ s/\s*\n?$//g; 430*c10e0f5bSDan Murphy $line =~ s/^\s*//g; 431*c10e0f5bSDan Murphy 432*c10e0f5bSDan Murphy next if ($line =~ m/^\s*#/); 433*c10e0f5bSDan Murphy next if ($line =~ m/^\s*$/); 434*c10e0f5bSDan Murphy next if ($line =~ m/, disabled/i); 435*c10e0f5bSDan Murphy 436*c10e0f5bSDan Murphy $line =~ s/,.*$//; 437*c10e0f5bSDan Murphy 438*c10e0f5bSDan Murphy my ($suspect, $fix) = split(/->/, $line); 439*c10e0f5bSDan Murphy 440*c10e0f5bSDan Murphy $spelling_fix{$suspect} = $fix; 441*c10e0f5bSDan Murphy } 442*c10e0f5bSDan Murphy close($spelling); 443*c10e0f5bSDan Murphy } else { 444*c10e0f5bSDan Murphy warn "No codespell typos will be found - file '$codespellfile': $!\n"; 445*c10e0f5bSDan Murphy } 446*c10e0f5bSDan Murphy} 447*c10e0f5bSDan Murphy 448*c10e0f5bSDan Murphy$misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix; 449*c10e0f5bSDan Murphy 450*c10e0f5bSDan Murphy 451dd88ab32SMasahiro Yamadasub build_types { 452dd88ab32SMasahiro Yamada my $mods = "(?x: \n" . join("|\n ", @modifierList) . "\n)"; 453dd88ab32SMasahiro Yamada my $all = "(?x: \n" . join("|\n ", @typeList) . "\n)"; 4546b9709d9STom Rini my $allWithAttr = "(?x: \n" . join("|\n ", @typeListWithAttr) . "\n)"; 455dd88ab32SMasahiro Yamada $Modifier = qr{(?:$Attribute|$Sparse|$mods)}; 456dd88ab32SMasahiro Yamada $NonptrType = qr{ 457dd88ab32SMasahiro Yamada (?:$Modifier\s+|const\s+)* 458dd88ab32SMasahiro Yamada (?: 459dd88ab32SMasahiro Yamada (?:typeof|__typeof__)\s*\([^\)]*\)| 460dd88ab32SMasahiro Yamada (?:$typeTypedefs\b)| 461dd88ab32SMasahiro Yamada (?:${all}\b) 462dd88ab32SMasahiro Yamada ) 463dd88ab32SMasahiro Yamada (?:\s+$Modifier|\s+const)* 464dd88ab32SMasahiro Yamada }x; 4656b9709d9STom Rini $NonptrTypeWithAttr = qr{ 4666b9709d9STom Rini (?:$Modifier\s+|const\s+)* 4676b9709d9STom Rini (?: 4686b9709d9STom Rini (?:typeof|__typeof__)\s*\([^\)]*\)| 4696b9709d9STom Rini (?:$typeTypedefs\b)| 4706b9709d9STom Rini (?:${allWithAttr}\b) 4716b9709d9STom Rini ) 4726b9709d9STom Rini (?:\s+$Modifier|\s+const)* 4736b9709d9STom Rini }x; 474dd88ab32SMasahiro Yamada $Type = qr{ 475dd88ab32SMasahiro Yamada $NonptrType 476dd88ab32SMasahiro Yamada (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*|\[\])+|(?:\s*\[\s*\])+)? 477dd88ab32SMasahiro Yamada (?:\s+$Inline|\s+$Modifier)* 478dd88ab32SMasahiro Yamada }x; 479dd88ab32SMasahiro Yamada $Declare = qr{(?:$Storage\s+)?$Type}; 480dd88ab32SMasahiro Yamada} 481dd88ab32SMasahiro Yamadabuild_types(); 482dd88ab32SMasahiro Yamada 483dd88ab32SMasahiro Yamadaour $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*}; 484dd88ab32SMasahiro Yamada 485dd88ab32SMasahiro Yamada# Using $balanced_parens, $LvalOrFunc, or $FuncArg 486dd88ab32SMasahiro Yamada# requires at least perl version v5.10.0 487dd88ab32SMasahiro Yamada# Any use must be runtime checked with $^V 488dd88ab32SMasahiro Yamada 489dd88ab32SMasahiro Yamadaour $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/; 490dd88ab32SMasahiro Yamadaour $LvalOrFunc = qr{($Lval)\s*($balanced_parens{0,1})\s*}; 491dd88ab32SMasahiro Yamadaour $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)}; 492dd88ab32SMasahiro Yamada 493dd88ab32SMasahiro Yamadasub deparenthesize { 494dd88ab32SMasahiro Yamada my ($string) = @_; 495dd88ab32SMasahiro Yamada return "" if (!defined($string)); 496dd88ab32SMasahiro Yamada $string =~ s@^\s*\(\s*@@g; 497dd88ab32SMasahiro Yamada $string =~ s@\s*\)\s*$@@g; 498dd88ab32SMasahiro Yamada $string =~ s@\s+@ @g; 499dd88ab32SMasahiro Yamada return $string; 500dd88ab32SMasahiro Yamada} 501dd88ab32SMasahiro Yamada 5026b9709d9STom Rinisub seed_camelcase_file { 5036b9709d9STom Rini my ($file) = @_; 5046b9709d9STom Rini 5056b9709d9STom Rini return if (!(-f $file)); 5066b9709d9STom Rini 5076b9709d9STom Rini local $/; 5086b9709d9STom Rini 5096b9709d9STom Rini open(my $include_file, '<', "$file") 5106b9709d9STom Rini or warn "$P: Can't read '$file' $!\n"; 5116b9709d9STom Rini my $text = <$include_file>; 5126b9709d9STom Rini close($include_file); 5136b9709d9STom Rini 5146b9709d9STom Rini my @lines = split('\n', $text); 5156b9709d9STom Rini 5166b9709d9STom Rini foreach my $line (@lines) { 5176b9709d9STom Rini next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/); 5186b9709d9STom Rini if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) { 5196b9709d9STom Rini $camelcase{$1} = 1; 5206b9709d9STom Rini } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) { 5216b9709d9STom Rini $camelcase{$1} = 1; 5226b9709d9STom Rini } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) { 5236b9709d9STom Rini $camelcase{$1} = 1; 5246b9709d9STom Rini } 5256b9709d9STom Rini } 5266b9709d9STom Rini} 5276b9709d9STom Rini 5286b9709d9STom Rinimy $camelcase_seeded = 0; 5296b9709d9STom Rinisub seed_camelcase_includes { 5306b9709d9STom Rini return if ($camelcase_seeded); 5316b9709d9STom Rini 5326b9709d9STom Rini my $files; 5336b9709d9STom Rini my $camelcase_cache = ""; 5346b9709d9STom Rini my @include_files = (); 5356b9709d9STom Rini 5366b9709d9STom Rini $camelcase_seeded = 1; 5376b9709d9STom Rini 5386b9709d9STom Rini if (-e ".git") { 5396b9709d9STom Rini my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`; 5406b9709d9STom Rini chomp $git_last_include_commit; 5416b9709d9STom Rini $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit"; 5426b9709d9STom Rini } else { 5436b9709d9STom Rini my $last_mod_date = 0; 5446b9709d9STom Rini $files = `find $root/include -name "*.h"`; 5456b9709d9STom Rini @include_files = split('\n', $files); 5466b9709d9STom Rini foreach my $file (@include_files) { 5476b9709d9STom Rini my $date = POSIX::strftime("%Y%m%d%H%M", 5486b9709d9STom Rini localtime((stat $file)[9])); 5496b9709d9STom Rini $last_mod_date = $date if ($last_mod_date < $date); 5506b9709d9STom Rini } 5516b9709d9STom Rini $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date"; 5526b9709d9STom Rini } 5536b9709d9STom Rini 5546b9709d9STom Rini if ($camelcase_cache ne "" && -f $camelcase_cache) { 5556b9709d9STom Rini open(my $camelcase_file, '<', "$camelcase_cache") 5566b9709d9STom Rini or warn "$P: Can't read '$camelcase_cache' $!\n"; 5576b9709d9STom Rini while (<$camelcase_file>) { 5586b9709d9STom Rini chomp; 5596b9709d9STom Rini $camelcase{$_} = 1; 5606b9709d9STom Rini } 5616b9709d9STom Rini close($camelcase_file); 5626b9709d9STom Rini 5636b9709d9STom Rini return; 5646b9709d9STom Rini } 5656b9709d9STom Rini 5666b9709d9STom Rini if (-e ".git") { 5676b9709d9STom Rini $files = `git ls-files "include/*.h"`; 5686b9709d9STom Rini @include_files = split('\n', $files); 5696b9709d9STom Rini } 5706b9709d9STom Rini 5716b9709d9STom Rini foreach my $file (@include_files) { 5726b9709d9STom Rini seed_camelcase_file($file); 5736b9709d9STom Rini } 5746b9709d9STom Rini 5756b9709d9STom Rini if ($camelcase_cache ne "") { 5766b9709d9STom Rini unlink glob ".checkpatch-camelcase.*"; 5776b9709d9STom Rini open(my $camelcase_file, '>', "$camelcase_cache") 5786b9709d9STom Rini or warn "$P: Can't write '$camelcase_cache' $!\n"; 5796b9709d9STom Rini foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) { 5806b9709d9STom Rini print $camelcase_file ("$_\n"); 5816b9709d9STom Rini } 5826b9709d9STom Rini close($camelcase_file); 5836b9709d9STom Rini } 5846b9709d9STom Rini} 5856b9709d9STom Rini 586dd88ab32SMasahiro Yamada$chk_signoff = 0 if ($file); 587dd88ab32SMasahiro Yamada 588dd88ab32SMasahiro Yamadamy @rawlines = (); 589dd88ab32SMasahiro Yamadamy @lines = (); 5906b9709d9STom Rinimy @fixed = (); 591dd88ab32SMasahiro Yamadamy $vname; 592*c10e0f5bSDan Murphymy $fixlinenr = -1; 593*c10e0f5bSDan Murphy 594dd88ab32SMasahiro Yamadafor my $filename (@ARGV) { 595dd88ab32SMasahiro Yamada my $FILE; 596dd88ab32SMasahiro Yamada if ($file) { 597dd88ab32SMasahiro Yamada open($FILE, '-|', "diff -u /dev/null $filename") || 598dd88ab32SMasahiro Yamada die "$P: $filename: diff failed - $!\n"; 599dd88ab32SMasahiro Yamada } elsif ($filename eq '-') { 600dd88ab32SMasahiro Yamada open($FILE, '<&STDIN'); 601dd88ab32SMasahiro Yamada } else { 602dd88ab32SMasahiro Yamada open($FILE, '<', "$filename") || 603dd88ab32SMasahiro Yamada die "$P: $filename: open failed - $!\n"; 604dd88ab32SMasahiro Yamada } 605dd88ab32SMasahiro Yamada if ($filename eq '-') { 606dd88ab32SMasahiro Yamada $vname = 'Your patch'; 607dd88ab32SMasahiro Yamada } else { 608dd88ab32SMasahiro Yamada $vname = $filename; 609dd88ab32SMasahiro Yamada } 610dd88ab32SMasahiro Yamada while (<$FILE>) { 611dd88ab32SMasahiro Yamada chomp; 612dd88ab32SMasahiro Yamada push(@rawlines, $_); 613dd88ab32SMasahiro Yamada } 614dd88ab32SMasahiro Yamada close($FILE); 615dd88ab32SMasahiro Yamada if (!process($filename)) { 616dd88ab32SMasahiro Yamada $exit = 1; 617dd88ab32SMasahiro Yamada } 618dd88ab32SMasahiro Yamada @rawlines = (); 619dd88ab32SMasahiro Yamada @lines = (); 6206b9709d9STom Rini @fixed = (); 621dd88ab32SMasahiro Yamada} 622dd88ab32SMasahiro Yamada 623dd88ab32SMasahiro Yamadaexit($exit); 624dd88ab32SMasahiro Yamada 625dd88ab32SMasahiro Yamadasub top_of_kernel_tree { 626dd88ab32SMasahiro Yamada my ($root) = @_; 627dd88ab32SMasahiro Yamada 628dd88ab32SMasahiro Yamada my @tree_check = ( 6296b9709d9STom Rini "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile", 630dd88ab32SMasahiro Yamada "README", "Documentation", "arch", "include", "drivers", 631dd88ab32SMasahiro Yamada "fs", "init", "ipc", "kernel", "lib", "scripts", 632dd88ab32SMasahiro Yamada ); 633dd88ab32SMasahiro Yamada 634dd88ab32SMasahiro Yamada foreach my $check (@tree_check) { 635dd88ab32SMasahiro Yamada if (! -e $root . '/' . $check) { 636dd88ab32SMasahiro Yamada return 0; 637dd88ab32SMasahiro Yamada } 638dd88ab32SMasahiro Yamada } 639dd88ab32SMasahiro Yamada return 1; 640dd88ab32SMasahiro Yamada} 641dd88ab32SMasahiro Yamada 642dd88ab32SMasahiro Yamadasub parse_email { 643dd88ab32SMasahiro Yamada my ($formatted_email) = @_; 644dd88ab32SMasahiro Yamada 645dd88ab32SMasahiro Yamada my $name = ""; 646dd88ab32SMasahiro Yamada my $address = ""; 647dd88ab32SMasahiro Yamada my $comment = ""; 648dd88ab32SMasahiro Yamada 649dd88ab32SMasahiro Yamada if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) { 650dd88ab32SMasahiro Yamada $name = $1; 651dd88ab32SMasahiro Yamada $address = $2; 652dd88ab32SMasahiro Yamada $comment = $3 if defined $3; 653dd88ab32SMasahiro Yamada } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) { 654dd88ab32SMasahiro Yamada $address = $1; 655dd88ab32SMasahiro Yamada $comment = $2 if defined $2; 656dd88ab32SMasahiro Yamada } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) { 657dd88ab32SMasahiro Yamada $address = $1; 658dd88ab32SMasahiro Yamada $comment = $2 if defined $2; 659dd88ab32SMasahiro Yamada $formatted_email =~ s/$address.*$//; 660dd88ab32SMasahiro Yamada $name = $formatted_email; 6616b9709d9STom Rini $name = trim($name); 662dd88ab32SMasahiro Yamada $name =~ s/^\"|\"$//g; 663dd88ab32SMasahiro Yamada # If there's a name left after stripping spaces and 664dd88ab32SMasahiro Yamada # leading quotes, and the address doesn't have both 665dd88ab32SMasahiro Yamada # leading and trailing angle brackets, the address 666dd88ab32SMasahiro Yamada # is invalid. ie: 667dd88ab32SMasahiro Yamada # "joe smith joe@smith.com" bad 668dd88ab32SMasahiro Yamada # "joe smith <joe@smith.com" bad 669dd88ab32SMasahiro Yamada if ($name ne "" && $address !~ /^<[^>]+>$/) { 670dd88ab32SMasahiro Yamada $name = ""; 671dd88ab32SMasahiro Yamada $address = ""; 672dd88ab32SMasahiro Yamada $comment = ""; 673dd88ab32SMasahiro Yamada } 674dd88ab32SMasahiro Yamada } 675dd88ab32SMasahiro Yamada 6766b9709d9STom Rini $name = trim($name); 677dd88ab32SMasahiro Yamada $name =~ s/^\"|\"$//g; 6786b9709d9STom Rini $address = trim($address); 679dd88ab32SMasahiro Yamada $address =~ s/^\<|\>$//g; 680dd88ab32SMasahiro Yamada 681dd88ab32SMasahiro Yamada if ($name =~ /[^\w \-]/i) { ##has "must quote" chars 682dd88ab32SMasahiro Yamada $name =~ s/(?<!\\)"/\\"/g; ##escape quotes 683dd88ab32SMasahiro Yamada $name = "\"$name\""; 684dd88ab32SMasahiro Yamada } 685dd88ab32SMasahiro Yamada 686dd88ab32SMasahiro Yamada return ($name, $address, $comment); 687dd88ab32SMasahiro Yamada} 688dd88ab32SMasahiro Yamada 689dd88ab32SMasahiro Yamadasub format_email { 690dd88ab32SMasahiro Yamada my ($name, $address) = @_; 691dd88ab32SMasahiro Yamada 692dd88ab32SMasahiro Yamada my $formatted_email; 693dd88ab32SMasahiro Yamada 6946b9709d9STom Rini $name = trim($name); 695dd88ab32SMasahiro Yamada $name =~ s/^\"|\"$//g; 6966b9709d9STom Rini $address = trim($address); 697dd88ab32SMasahiro Yamada 698dd88ab32SMasahiro Yamada if ($name =~ /[^\w \-]/i) { ##has "must quote" chars 699dd88ab32SMasahiro Yamada $name =~ s/(?<!\\)"/\\"/g; ##escape quotes 700dd88ab32SMasahiro Yamada $name = "\"$name\""; 701dd88ab32SMasahiro Yamada } 702dd88ab32SMasahiro Yamada 703dd88ab32SMasahiro Yamada if ("$name" eq "") { 704dd88ab32SMasahiro Yamada $formatted_email = "$address"; 705dd88ab32SMasahiro Yamada } else { 706dd88ab32SMasahiro Yamada $formatted_email = "$name <$address>"; 707dd88ab32SMasahiro Yamada } 708dd88ab32SMasahiro Yamada 709dd88ab32SMasahiro Yamada return $formatted_email; 710dd88ab32SMasahiro Yamada} 711dd88ab32SMasahiro Yamada 712dd88ab32SMasahiro Yamadasub which_conf { 713dd88ab32SMasahiro Yamada my ($conf) = @_; 714dd88ab32SMasahiro Yamada 715dd88ab32SMasahiro Yamada foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) { 716dd88ab32SMasahiro Yamada if (-e "$path/$conf") { 717dd88ab32SMasahiro Yamada return "$path/$conf"; 718dd88ab32SMasahiro Yamada } 719dd88ab32SMasahiro Yamada } 720dd88ab32SMasahiro Yamada 721dd88ab32SMasahiro Yamada return ""; 722dd88ab32SMasahiro Yamada} 723dd88ab32SMasahiro Yamada 724dd88ab32SMasahiro Yamadasub expand_tabs { 725dd88ab32SMasahiro Yamada my ($str) = @_; 726dd88ab32SMasahiro Yamada 727dd88ab32SMasahiro Yamada my $res = ''; 728dd88ab32SMasahiro Yamada my $n = 0; 729dd88ab32SMasahiro Yamada for my $c (split(//, $str)) { 730dd88ab32SMasahiro Yamada if ($c eq "\t") { 731dd88ab32SMasahiro Yamada $res .= ' '; 732dd88ab32SMasahiro Yamada $n++; 733dd88ab32SMasahiro Yamada for (; ($n % 8) != 0; $n++) { 734dd88ab32SMasahiro Yamada $res .= ' '; 735dd88ab32SMasahiro Yamada } 736dd88ab32SMasahiro Yamada next; 737dd88ab32SMasahiro Yamada } 738dd88ab32SMasahiro Yamada $res .= $c; 739dd88ab32SMasahiro Yamada $n++; 740dd88ab32SMasahiro Yamada } 741dd88ab32SMasahiro Yamada 742dd88ab32SMasahiro Yamada return $res; 743dd88ab32SMasahiro Yamada} 744dd88ab32SMasahiro Yamadasub copy_spacing { 745dd88ab32SMasahiro Yamada (my $res = shift) =~ tr/\t/ /c; 746dd88ab32SMasahiro Yamada return $res; 747dd88ab32SMasahiro Yamada} 748dd88ab32SMasahiro Yamada 749dd88ab32SMasahiro Yamadasub line_stats { 750dd88ab32SMasahiro Yamada my ($line) = @_; 751dd88ab32SMasahiro Yamada 752dd88ab32SMasahiro Yamada # Drop the diff line leader and expand tabs 753dd88ab32SMasahiro Yamada $line =~ s/^.//; 754dd88ab32SMasahiro Yamada $line = expand_tabs($line); 755dd88ab32SMasahiro Yamada 756dd88ab32SMasahiro Yamada # Pick the indent from the front of the line. 757dd88ab32SMasahiro Yamada my ($white) = ($line =~ /^(\s*)/); 758dd88ab32SMasahiro Yamada 759dd88ab32SMasahiro Yamada return (length($line), length($white)); 760dd88ab32SMasahiro Yamada} 761dd88ab32SMasahiro Yamada 762dd88ab32SMasahiro Yamadamy $sanitise_quote = ''; 763dd88ab32SMasahiro Yamada 764dd88ab32SMasahiro Yamadasub sanitise_line_reset { 765dd88ab32SMasahiro Yamada my ($in_comment) = @_; 766dd88ab32SMasahiro Yamada 767dd88ab32SMasahiro Yamada if ($in_comment) { 768dd88ab32SMasahiro Yamada $sanitise_quote = '*/'; 769dd88ab32SMasahiro Yamada } else { 770dd88ab32SMasahiro Yamada $sanitise_quote = ''; 771dd88ab32SMasahiro Yamada } 772dd88ab32SMasahiro Yamada} 773dd88ab32SMasahiro Yamadasub sanitise_line { 774dd88ab32SMasahiro Yamada my ($line) = @_; 775dd88ab32SMasahiro Yamada 776dd88ab32SMasahiro Yamada my $res = ''; 777dd88ab32SMasahiro Yamada my $l = ''; 778dd88ab32SMasahiro Yamada 779dd88ab32SMasahiro Yamada my $qlen = 0; 780dd88ab32SMasahiro Yamada my $off = 0; 781dd88ab32SMasahiro Yamada my $c; 782dd88ab32SMasahiro Yamada 783dd88ab32SMasahiro Yamada # Always copy over the diff marker. 784dd88ab32SMasahiro Yamada $res = substr($line, 0, 1); 785dd88ab32SMasahiro Yamada 786dd88ab32SMasahiro Yamada for ($off = 1; $off < length($line); $off++) { 787dd88ab32SMasahiro Yamada $c = substr($line, $off, 1); 788dd88ab32SMasahiro Yamada 789dd88ab32SMasahiro Yamada # Comments we are wacking completly including the begin 790dd88ab32SMasahiro Yamada # and end, all to $;. 791dd88ab32SMasahiro Yamada if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') { 792dd88ab32SMasahiro Yamada $sanitise_quote = '*/'; 793dd88ab32SMasahiro Yamada 794dd88ab32SMasahiro Yamada substr($res, $off, 2, "$;$;"); 795dd88ab32SMasahiro Yamada $off++; 796dd88ab32SMasahiro Yamada next; 797dd88ab32SMasahiro Yamada } 798dd88ab32SMasahiro Yamada if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') { 799dd88ab32SMasahiro Yamada $sanitise_quote = ''; 800dd88ab32SMasahiro Yamada substr($res, $off, 2, "$;$;"); 801dd88ab32SMasahiro Yamada $off++; 802dd88ab32SMasahiro Yamada next; 803dd88ab32SMasahiro Yamada } 804dd88ab32SMasahiro Yamada if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') { 805dd88ab32SMasahiro Yamada $sanitise_quote = '//'; 806dd88ab32SMasahiro Yamada 807dd88ab32SMasahiro Yamada substr($res, $off, 2, $sanitise_quote); 808dd88ab32SMasahiro Yamada $off++; 809dd88ab32SMasahiro Yamada next; 810dd88ab32SMasahiro Yamada } 811dd88ab32SMasahiro Yamada 812dd88ab32SMasahiro Yamada # A \ in a string means ignore the next character. 813dd88ab32SMasahiro Yamada if (($sanitise_quote eq "'" || $sanitise_quote eq '"') && 814dd88ab32SMasahiro Yamada $c eq "\\") { 815dd88ab32SMasahiro Yamada substr($res, $off, 2, 'XX'); 816dd88ab32SMasahiro Yamada $off++; 817dd88ab32SMasahiro Yamada next; 818dd88ab32SMasahiro Yamada } 819dd88ab32SMasahiro Yamada # Regular quotes. 820dd88ab32SMasahiro Yamada if ($c eq "'" || $c eq '"') { 821dd88ab32SMasahiro Yamada if ($sanitise_quote eq '') { 822dd88ab32SMasahiro Yamada $sanitise_quote = $c; 823dd88ab32SMasahiro Yamada 824dd88ab32SMasahiro Yamada substr($res, $off, 1, $c); 825dd88ab32SMasahiro Yamada next; 826dd88ab32SMasahiro Yamada } elsif ($sanitise_quote eq $c) { 827dd88ab32SMasahiro Yamada $sanitise_quote = ''; 828dd88ab32SMasahiro Yamada } 829dd88ab32SMasahiro Yamada } 830dd88ab32SMasahiro Yamada 831dd88ab32SMasahiro Yamada #print "c<$c> SQ<$sanitise_quote>\n"; 832dd88ab32SMasahiro Yamada if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") { 833dd88ab32SMasahiro Yamada substr($res, $off, 1, $;); 834dd88ab32SMasahiro Yamada } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") { 835dd88ab32SMasahiro Yamada substr($res, $off, 1, $;); 836dd88ab32SMasahiro Yamada } elsif ($off != 0 && $sanitise_quote && $c ne "\t") { 837dd88ab32SMasahiro Yamada substr($res, $off, 1, 'X'); 838dd88ab32SMasahiro Yamada } else { 839dd88ab32SMasahiro Yamada substr($res, $off, 1, $c); 840dd88ab32SMasahiro Yamada } 841dd88ab32SMasahiro Yamada } 842dd88ab32SMasahiro Yamada 843dd88ab32SMasahiro Yamada if ($sanitise_quote eq '//') { 844dd88ab32SMasahiro Yamada $sanitise_quote = ''; 845dd88ab32SMasahiro Yamada } 846dd88ab32SMasahiro Yamada 847dd88ab32SMasahiro Yamada # The pathname on a #include may be surrounded by '<' and '>'. 848dd88ab32SMasahiro Yamada if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) { 849dd88ab32SMasahiro Yamada my $clean = 'X' x length($1); 850dd88ab32SMasahiro Yamada $res =~ s@\<.*\>@<$clean>@; 851dd88ab32SMasahiro Yamada 852dd88ab32SMasahiro Yamada # The whole of a #error is a string. 853dd88ab32SMasahiro Yamada } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) { 854dd88ab32SMasahiro Yamada my $clean = 'X' x length($1); 855dd88ab32SMasahiro Yamada $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@; 856dd88ab32SMasahiro Yamada } 857dd88ab32SMasahiro Yamada 858dd88ab32SMasahiro Yamada return $res; 859dd88ab32SMasahiro Yamada} 860dd88ab32SMasahiro Yamada 8616b9709d9STom Rinisub get_quoted_string { 8626b9709d9STom Rini my ($line, $rawline) = @_; 8636b9709d9STom Rini 8646b9709d9STom Rini return "" if ($line !~ m/(\"[X]+\")/g); 8656b9709d9STom Rini return substr($rawline, $-[0], $+[0] - $-[0]); 8666b9709d9STom Rini} 8676b9709d9STom Rini 868dd88ab32SMasahiro Yamadasub ctx_statement_block { 869dd88ab32SMasahiro Yamada my ($linenr, $remain, $off) = @_; 870dd88ab32SMasahiro Yamada my $line = $linenr - 1; 871dd88ab32SMasahiro Yamada my $blk = ''; 872dd88ab32SMasahiro Yamada my $soff = $off; 873dd88ab32SMasahiro Yamada my $coff = $off - 1; 874dd88ab32SMasahiro Yamada my $coff_set = 0; 875dd88ab32SMasahiro Yamada 876dd88ab32SMasahiro Yamada my $loff = 0; 877dd88ab32SMasahiro Yamada 878dd88ab32SMasahiro Yamada my $type = ''; 879dd88ab32SMasahiro Yamada my $level = 0; 880dd88ab32SMasahiro Yamada my @stack = (); 881dd88ab32SMasahiro Yamada my $p; 882dd88ab32SMasahiro Yamada my $c; 883dd88ab32SMasahiro Yamada my $len = 0; 884dd88ab32SMasahiro Yamada 885dd88ab32SMasahiro Yamada my $remainder; 886dd88ab32SMasahiro Yamada while (1) { 887dd88ab32SMasahiro Yamada @stack = (['', 0]) if ($#stack == -1); 888dd88ab32SMasahiro Yamada 889dd88ab32SMasahiro Yamada #warn "CSB: blk<$blk> remain<$remain>\n"; 890dd88ab32SMasahiro Yamada # If we are about to drop off the end, pull in more 891dd88ab32SMasahiro Yamada # context. 892dd88ab32SMasahiro Yamada if ($off >= $len) { 893dd88ab32SMasahiro Yamada for (; $remain > 0; $line++) { 894dd88ab32SMasahiro Yamada last if (!defined $lines[$line]); 895dd88ab32SMasahiro Yamada next if ($lines[$line] =~ /^-/); 896dd88ab32SMasahiro Yamada $remain--; 897dd88ab32SMasahiro Yamada $loff = $len; 898dd88ab32SMasahiro Yamada $blk .= $lines[$line] . "\n"; 899dd88ab32SMasahiro Yamada $len = length($blk); 900dd88ab32SMasahiro Yamada $line++; 901dd88ab32SMasahiro Yamada last; 902dd88ab32SMasahiro Yamada } 903dd88ab32SMasahiro Yamada # Bail if there is no further context. 904dd88ab32SMasahiro Yamada #warn "CSB: blk<$blk> off<$off> len<$len>\n"; 905dd88ab32SMasahiro Yamada if ($off >= $len) { 906dd88ab32SMasahiro Yamada last; 907dd88ab32SMasahiro Yamada } 908dd88ab32SMasahiro Yamada if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) { 909dd88ab32SMasahiro Yamada $level++; 910dd88ab32SMasahiro Yamada $type = '#'; 911dd88ab32SMasahiro Yamada } 912dd88ab32SMasahiro Yamada } 913dd88ab32SMasahiro Yamada $p = $c; 914dd88ab32SMasahiro Yamada $c = substr($blk, $off, 1); 915dd88ab32SMasahiro Yamada $remainder = substr($blk, $off); 916dd88ab32SMasahiro Yamada 917dd88ab32SMasahiro Yamada #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n"; 918dd88ab32SMasahiro Yamada 919dd88ab32SMasahiro Yamada # Handle nested #if/#else. 920dd88ab32SMasahiro Yamada if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) { 921dd88ab32SMasahiro Yamada push(@stack, [ $type, $level ]); 922dd88ab32SMasahiro Yamada } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) { 923dd88ab32SMasahiro Yamada ($type, $level) = @{$stack[$#stack - 1]}; 924dd88ab32SMasahiro Yamada } elsif ($remainder =~ /^#\s*endif\b/) { 925dd88ab32SMasahiro Yamada ($type, $level) = @{pop(@stack)}; 926dd88ab32SMasahiro Yamada } 927dd88ab32SMasahiro Yamada 928dd88ab32SMasahiro Yamada # Statement ends at the ';' or a close '}' at the 929dd88ab32SMasahiro Yamada # outermost level. 930dd88ab32SMasahiro Yamada if ($level == 0 && $c eq ';') { 931dd88ab32SMasahiro Yamada last; 932dd88ab32SMasahiro Yamada } 933dd88ab32SMasahiro Yamada 934dd88ab32SMasahiro Yamada # An else is really a conditional as long as its not else if 935dd88ab32SMasahiro Yamada if ($level == 0 && $coff_set == 0 && 936dd88ab32SMasahiro Yamada (!defined($p) || $p =~ /(?:\s|\}|\+)/) && 937dd88ab32SMasahiro Yamada $remainder =~ /^(else)(?:\s|{)/ && 938dd88ab32SMasahiro Yamada $remainder !~ /^else\s+if\b/) { 939dd88ab32SMasahiro Yamada $coff = $off + length($1) - 1; 940dd88ab32SMasahiro Yamada $coff_set = 1; 941dd88ab32SMasahiro Yamada #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n"; 942dd88ab32SMasahiro Yamada #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n"; 943dd88ab32SMasahiro Yamada } 944dd88ab32SMasahiro Yamada 945dd88ab32SMasahiro Yamada if (($type eq '' || $type eq '(') && $c eq '(') { 946dd88ab32SMasahiro Yamada $level++; 947dd88ab32SMasahiro Yamada $type = '('; 948dd88ab32SMasahiro Yamada } 949dd88ab32SMasahiro Yamada if ($type eq '(' && $c eq ')') { 950dd88ab32SMasahiro Yamada $level--; 951dd88ab32SMasahiro Yamada $type = ($level != 0)? '(' : ''; 952dd88ab32SMasahiro Yamada 953dd88ab32SMasahiro Yamada if ($level == 0 && $coff < $soff) { 954dd88ab32SMasahiro Yamada $coff = $off; 955dd88ab32SMasahiro Yamada $coff_set = 1; 956dd88ab32SMasahiro Yamada #warn "CSB: mark coff<$coff>\n"; 957dd88ab32SMasahiro Yamada } 958dd88ab32SMasahiro Yamada } 959dd88ab32SMasahiro Yamada if (($type eq '' || $type eq '{') && $c eq '{') { 960dd88ab32SMasahiro Yamada $level++; 961dd88ab32SMasahiro Yamada $type = '{'; 962dd88ab32SMasahiro Yamada } 963dd88ab32SMasahiro Yamada if ($type eq '{' && $c eq '}') { 964dd88ab32SMasahiro Yamada $level--; 965dd88ab32SMasahiro Yamada $type = ($level != 0)? '{' : ''; 966dd88ab32SMasahiro Yamada 967dd88ab32SMasahiro Yamada if ($level == 0) { 968dd88ab32SMasahiro Yamada if (substr($blk, $off + 1, 1) eq ';') { 969dd88ab32SMasahiro Yamada $off++; 970dd88ab32SMasahiro Yamada } 971dd88ab32SMasahiro Yamada last; 972dd88ab32SMasahiro Yamada } 973dd88ab32SMasahiro Yamada } 974dd88ab32SMasahiro Yamada # Preprocessor commands end at the newline unless escaped. 975dd88ab32SMasahiro Yamada if ($type eq '#' && $c eq "\n" && $p ne "\\") { 976dd88ab32SMasahiro Yamada $level--; 977dd88ab32SMasahiro Yamada $type = ''; 978dd88ab32SMasahiro Yamada $off++; 979dd88ab32SMasahiro Yamada last; 980dd88ab32SMasahiro Yamada } 981dd88ab32SMasahiro Yamada $off++; 982dd88ab32SMasahiro Yamada } 983dd88ab32SMasahiro Yamada # We are truly at the end, so shuffle to the next line. 984dd88ab32SMasahiro Yamada if ($off == $len) { 985dd88ab32SMasahiro Yamada $loff = $len + 1; 986dd88ab32SMasahiro Yamada $line++; 987dd88ab32SMasahiro Yamada $remain--; 988dd88ab32SMasahiro Yamada } 989dd88ab32SMasahiro Yamada 990dd88ab32SMasahiro Yamada my $statement = substr($blk, $soff, $off - $soff + 1); 991dd88ab32SMasahiro Yamada my $condition = substr($blk, $soff, $coff - $soff + 1); 992dd88ab32SMasahiro Yamada 993dd88ab32SMasahiro Yamada #warn "STATEMENT<$statement>\n"; 994dd88ab32SMasahiro Yamada #warn "CONDITION<$condition>\n"; 995dd88ab32SMasahiro Yamada 996dd88ab32SMasahiro Yamada #print "coff<$coff> soff<$off> loff<$loff>\n"; 997dd88ab32SMasahiro Yamada 998dd88ab32SMasahiro Yamada return ($statement, $condition, 999dd88ab32SMasahiro Yamada $line, $remain + 1, $off - $loff + 1, $level); 1000dd88ab32SMasahiro Yamada} 1001dd88ab32SMasahiro Yamada 1002dd88ab32SMasahiro Yamadasub statement_lines { 1003dd88ab32SMasahiro Yamada my ($stmt) = @_; 1004dd88ab32SMasahiro Yamada 1005dd88ab32SMasahiro Yamada # Strip the diff line prefixes and rip blank lines at start and end. 1006dd88ab32SMasahiro Yamada $stmt =~ s/(^|\n)./$1/g; 1007dd88ab32SMasahiro Yamada $stmt =~ s/^\s*//; 1008dd88ab32SMasahiro Yamada $stmt =~ s/\s*$//; 1009dd88ab32SMasahiro Yamada 1010dd88ab32SMasahiro Yamada my @stmt_lines = ($stmt =~ /\n/g); 1011dd88ab32SMasahiro Yamada 1012dd88ab32SMasahiro Yamada return $#stmt_lines + 2; 1013dd88ab32SMasahiro Yamada} 1014dd88ab32SMasahiro Yamada 1015dd88ab32SMasahiro Yamadasub statement_rawlines { 1016dd88ab32SMasahiro Yamada my ($stmt) = @_; 1017dd88ab32SMasahiro Yamada 1018dd88ab32SMasahiro Yamada my @stmt_lines = ($stmt =~ /\n/g); 1019dd88ab32SMasahiro Yamada 1020dd88ab32SMasahiro Yamada return $#stmt_lines + 2; 1021dd88ab32SMasahiro Yamada} 1022dd88ab32SMasahiro Yamada 1023dd88ab32SMasahiro Yamadasub statement_block_size { 1024dd88ab32SMasahiro Yamada my ($stmt) = @_; 1025dd88ab32SMasahiro Yamada 1026dd88ab32SMasahiro Yamada $stmt =~ s/(^|\n)./$1/g; 1027dd88ab32SMasahiro Yamada $stmt =~ s/^\s*{//; 1028dd88ab32SMasahiro Yamada $stmt =~ s/}\s*$//; 1029dd88ab32SMasahiro Yamada $stmt =~ s/^\s*//; 1030dd88ab32SMasahiro Yamada $stmt =~ s/\s*$//; 1031dd88ab32SMasahiro Yamada 1032dd88ab32SMasahiro Yamada my @stmt_lines = ($stmt =~ /\n/g); 1033dd88ab32SMasahiro Yamada my @stmt_statements = ($stmt =~ /;/g); 1034dd88ab32SMasahiro Yamada 1035dd88ab32SMasahiro Yamada my $stmt_lines = $#stmt_lines + 2; 1036dd88ab32SMasahiro Yamada my $stmt_statements = $#stmt_statements + 1; 1037dd88ab32SMasahiro Yamada 1038dd88ab32SMasahiro Yamada if ($stmt_lines > $stmt_statements) { 1039dd88ab32SMasahiro Yamada return $stmt_lines; 1040dd88ab32SMasahiro Yamada } else { 1041dd88ab32SMasahiro Yamada return $stmt_statements; 1042dd88ab32SMasahiro Yamada } 1043dd88ab32SMasahiro Yamada} 1044dd88ab32SMasahiro Yamada 1045dd88ab32SMasahiro Yamadasub ctx_statement_full { 1046dd88ab32SMasahiro Yamada my ($linenr, $remain, $off) = @_; 1047dd88ab32SMasahiro Yamada my ($statement, $condition, $level); 1048dd88ab32SMasahiro Yamada 1049dd88ab32SMasahiro Yamada my (@chunks); 1050dd88ab32SMasahiro Yamada 1051dd88ab32SMasahiro Yamada # Grab the first conditional/block pair. 1052dd88ab32SMasahiro Yamada ($statement, $condition, $linenr, $remain, $off, $level) = 1053dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $remain, $off); 1054dd88ab32SMasahiro Yamada #print "F: c<$condition> s<$statement> remain<$remain>\n"; 1055dd88ab32SMasahiro Yamada push(@chunks, [ $condition, $statement ]); 1056dd88ab32SMasahiro Yamada if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) { 1057dd88ab32SMasahiro Yamada return ($level, $linenr, @chunks); 1058dd88ab32SMasahiro Yamada } 1059dd88ab32SMasahiro Yamada 1060dd88ab32SMasahiro Yamada # Pull in the following conditional/block pairs and see if they 1061dd88ab32SMasahiro Yamada # could continue the statement. 1062dd88ab32SMasahiro Yamada for (;;) { 1063dd88ab32SMasahiro Yamada ($statement, $condition, $linenr, $remain, $off, $level) = 1064dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $remain, $off); 1065dd88ab32SMasahiro Yamada #print "C: c<$condition> s<$statement> remain<$remain>\n"; 1066dd88ab32SMasahiro Yamada last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s)); 1067dd88ab32SMasahiro Yamada #print "C: push\n"; 1068dd88ab32SMasahiro Yamada push(@chunks, [ $condition, $statement ]); 1069dd88ab32SMasahiro Yamada } 1070dd88ab32SMasahiro Yamada 1071dd88ab32SMasahiro Yamada return ($level, $linenr, @chunks); 1072dd88ab32SMasahiro Yamada} 1073dd88ab32SMasahiro Yamada 1074dd88ab32SMasahiro Yamadasub ctx_block_get { 1075dd88ab32SMasahiro Yamada my ($linenr, $remain, $outer, $open, $close, $off) = @_; 1076dd88ab32SMasahiro Yamada my $line; 1077dd88ab32SMasahiro Yamada my $start = $linenr - 1; 1078dd88ab32SMasahiro Yamada my $blk = ''; 1079dd88ab32SMasahiro Yamada my @o; 1080dd88ab32SMasahiro Yamada my @c; 1081dd88ab32SMasahiro Yamada my @res = (); 1082dd88ab32SMasahiro Yamada 1083dd88ab32SMasahiro Yamada my $level = 0; 1084dd88ab32SMasahiro Yamada my @stack = ($level); 1085dd88ab32SMasahiro Yamada for ($line = $start; $remain > 0; $line++) { 1086dd88ab32SMasahiro Yamada next if ($rawlines[$line] =~ /^-/); 1087dd88ab32SMasahiro Yamada $remain--; 1088dd88ab32SMasahiro Yamada 1089dd88ab32SMasahiro Yamada $blk .= $rawlines[$line]; 1090dd88ab32SMasahiro Yamada 1091dd88ab32SMasahiro Yamada # Handle nested #if/#else. 1092dd88ab32SMasahiro Yamada if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) { 1093dd88ab32SMasahiro Yamada push(@stack, $level); 1094dd88ab32SMasahiro Yamada } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) { 1095dd88ab32SMasahiro Yamada $level = $stack[$#stack - 1]; 1096dd88ab32SMasahiro Yamada } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) { 1097dd88ab32SMasahiro Yamada $level = pop(@stack); 1098dd88ab32SMasahiro Yamada } 1099dd88ab32SMasahiro Yamada 1100dd88ab32SMasahiro Yamada foreach my $c (split(//, $lines[$line])) { 1101dd88ab32SMasahiro Yamada ##print "C<$c>L<$level><$open$close>O<$off>\n"; 1102dd88ab32SMasahiro Yamada if ($off > 0) { 1103dd88ab32SMasahiro Yamada $off--; 1104dd88ab32SMasahiro Yamada next; 1105dd88ab32SMasahiro Yamada } 1106dd88ab32SMasahiro Yamada 1107dd88ab32SMasahiro Yamada if ($c eq $close && $level > 0) { 1108dd88ab32SMasahiro Yamada $level--; 1109dd88ab32SMasahiro Yamada last if ($level == 0); 1110dd88ab32SMasahiro Yamada } elsif ($c eq $open) { 1111dd88ab32SMasahiro Yamada $level++; 1112dd88ab32SMasahiro Yamada } 1113dd88ab32SMasahiro Yamada } 1114dd88ab32SMasahiro Yamada 1115dd88ab32SMasahiro Yamada if (!$outer || $level <= 1) { 1116dd88ab32SMasahiro Yamada push(@res, $rawlines[$line]); 1117dd88ab32SMasahiro Yamada } 1118dd88ab32SMasahiro Yamada 1119dd88ab32SMasahiro Yamada last if ($level == 0); 1120dd88ab32SMasahiro Yamada } 1121dd88ab32SMasahiro Yamada 1122dd88ab32SMasahiro Yamada return ($level, @res); 1123dd88ab32SMasahiro Yamada} 1124dd88ab32SMasahiro Yamadasub ctx_block_outer { 1125dd88ab32SMasahiro Yamada my ($linenr, $remain) = @_; 1126dd88ab32SMasahiro Yamada 1127dd88ab32SMasahiro Yamada my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0); 1128dd88ab32SMasahiro Yamada return @r; 1129dd88ab32SMasahiro Yamada} 1130dd88ab32SMasahiro Yamadasub ctx_block { 1131dd88ab32SMasahiro Yamada my ($linenr, $remain) = @_; 1132dd88ab32SMasahiro Yamada 1133dd88ab32SMasahiro Yamada my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0); 1134dd88ab32SMasahiro Yamada return @r; 1135dd88ab32SMasahiro Yamada} 1136dd88ab32SMasahiro Yamadasub ctx_statement { 1137dd88ab32SMasahiro Yamada my ($linenr, $remain, $off) = @_; 1138dd88ab32SMasahiro Yamada 1139dd88ab32SMasahiro Yamada my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off); 1140dd88ab32SMasahiro Yamada return @r; 1141dd88ab32SMasahiro Yamada} 1142dd88ab32SMasahiro Yamadasub ctx_block_level { 1143dd88ab32SMasahiro Yamada my ($linenr, $remain) = @_; 1144dd88ab32SMasahiro Yamada 1145dd88ab32SMasahiro Yamada return ctx_block_get($linenr, $remain, 0, '{', '}', 0); 1146dd88ab32SMasahiro Yamada} 1147dd88ab32SMasahiro Yamadasub ctx_statement_level { 1148dd88ab32SMasahiro Yamada my ($linenr, $remain, $off) = @_; 1149dd88ab32SMasahiro Yamada 1150dd88ab32SMasahiro Yamada return ctx_block_get($linenr, $remain, 0, '(', ')', $off); 1151dd88ab32SMasahiro Yamada} 1152dd88ab32SMasahiro Yamada 1153dd88ab32SMasahiro Yamadasub ctx_locate_comment { 1154dd88ab32SMasahiro Yamada my ($first_line, $end_line) = @_; 1155dd88ab32SMasahiro Yamada 1156dd88ab32SMasahiro Yamada # Catch a comment on the end of the line itself. 1157dd88ab32SMasahiro Yamada my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@); 1158dd88ab32SMasahiro Yamada return $current_comment if (defined $current_comment); 1159dd88ab32SMasahiro Yamada 1160dd88ab32SMasahiro Yamada # Look through the context and try and figure out if there is a 1161dd88ab32SMasahiro Yamada # comment. 1162dd88ab32SMasahiro Yamada my $in_comment = 0; 1163dd88ab32SMasahiro Yamada $current_comment = ''; 1164dd88ab32SMasahiro Yamada for (my $linenr = $first_line; $linenr < $end_line; $linenr++) { 1165dd88ab32SMasahiro Yamada my $line = $rawlines[$linenr - 1]; 1166dd88ab32SMasahiro Yamada #warn " $line\n"; 1167dd88ab32SMasahiro Yamada if ($linenr == $first_line and $line =~ m@^.\s*\*@) { 1168dd88ab32SMasahiro Yamada $in_comment = 1; 1169dd88ab32SMasahiro Yamada } 1170dd88ab32SMasahiro Yamada if ($line =~ m@/\*@) { 1171dd88ab32SMasahiro Yamada $in_comment = 1; 1172dd88ab32SMasahiro Yamada } 1173dd88ab32SMasahiro Yamada if (!$in_comment && $current_comment ne '') { 1174dd88ab32SMasahiro Yamada $current_comment = ''; 1175dd88ab32SMasahiro Yamada } 1176dd88ab32SMasahiro Yamada $current_comment .= $line . "\n" if ($in_comment); 1177dd88ab32SMasahiro Yamada if ($line =~ m@\*/@) { 1178dd88ab32SMasahiro Yamada $in_comment = 0; 1179dd88ab32SMasahiro Yamada } 1180dd88ab32SMasahiro Yamada } 1181dd88ab32SMasahiro Yamada 1182dd88ab32SMasahiro Yamada chomp($current_comment); 1183dd88ab32SMasahiro Yamada return($current_comment); 1184dd88ab32SMasahiro Yamada} 1185dd88ab32SMasahiro Yamadasub ctx_has_comment { 1186dd88ab32SMasahiro Yamada my ($first_line, $end_line) = @_; 1187dd88ab32SMasahiro Yamada my $cmt = ctx_locate_comment($first_line, $end_line); 1188dd88ab32SMasahiro Yamada 1189dd88ab32SMasahiro Yamada ##print "LINE: $rawlines[$end_line - 1 ]\n"; 1190dd88ab32SMasahiro Yamada ##print "CMMT: $cmt\n"; 1191dd88ab32SMasahiro Yamada 1192dd88ab32SMasahiro Yamada return ($cmt ne ''); 1193dd88ab32SMasahiro Yamada} 1194dd88ab32SMasahiro Yamada 1195dd88ab32SMasahiro Yamadasub raw_line { 1196dd88ab32SMasahiro Yamada my ($linenr, $cnt) = @_; 1197dd88ab32SMasahiro Yamada 1198dd88ab32SMasahiro Yamada my $offset = $linenr - 1; 1199dd88ab32SMasahiro Yamada $cnt++; 1200dd88ab32SMasahiro Yamada 1201dd88ab32SMasahiro Yamada my $line; 1202dd88ab32SMasahiro Yamada while ($cnt) { 1203dd88ab32SMasahiro Yamada $line = $rawlines[$offset++]; 1204dd88ab32SMasahiro Yamada next if (defined($line) && $line =~ /^-/); 1205dd88ab32SMasahiro Yamada $cnt--; 1206dd88ab32SMasahiro Yamada } 1207dd88ab32SMasahiro Yamada 1208dd88ab32SMasahiro Yamada return $line; 1209dd88ab32SMasahiro Yamada} 1210dd88ab32SMasahiro Yamada 1211dd88ab32SMasahiro Yamadasub cat_vet { 1212dd88ab32SMasahiro Yamada my ($vet) = @_; 1213dd88ab32SMasahiro Yamada my ($res, $coded); 1214dd88ab32SMasahiro Yamada 1215dd88ab32SMasahiro Yamada $res = ''; 1216dd88ab32SMasahiro Yamada while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) { 1217dd88ab32SMasahiro Yamada $res .= $1; 1218dd88ab32SMasahiro Yamada if ($2 ne '') { 1219dd88ab32SMasahiro Yamada $coded = sprintf("^%c", unpack('C', $2) + 64); 1220dd88ab32SMasahiro Yamada $res .= $coded; 1221dd88ab32SMasahiro Yamada } 1222dd88ab32SMasahiro Yamada } 1223dd88ab32SMasahiro Yamada $res =~ s/$/\$/; 1224dd88ab32SMasahiro Yamada 1225dd88ab32SMasahiro Yamada return $res; 1226dd88ab32SMasahiro Yamada} 1227dd88ab32SMasahiro Yamada 1228dd88ab32SMasahiro Yamadamy $av_preprocessor = 0; 1229dd88ab32SMasahiro Yamadamy $av_pending; 1230dd88ab32SMasahiro Yamadamy @av_paren_type; 1231dd88ab32SMasahiro Yamadamy $av_pend_colon; 1232dd88ab32SMasahiro Yamada 1233dd88ab32SMasahiro Yamadasub annotate_reset { 1234dd88ab32SMasahiro Yamada $av_preprocessor = 0; 1235dd88ab32SMasahiro Yamada $av_pending = '_'; 1236dd88ab32SMasahiro Yamada @av_paren_type = ('E'); 1237dd88ab32SMasahiro Yamada $av_pend_colon = 'O'; 1238dd88ab32SMasahiro Yamada} 1239dd88ab32SMasahiro Yamada 1240dd88ab32SMasahiro Yamadasub annotate_values { 1241dd88ab32SMasahiro Yamada my ($stream, $type) = @_; 1242dd88ab32SMasahiro Yamada 1243dd88ab32SMasahiro Yamada my $res; 1244dd88ab32SMasahiro Yamada my $var = '_' x length($stream); 1245dd88ab32SMasahiro Yamada my $cur = $stream; 1246dd88ab32SMasahiro Yamada 1247dd88ab32SMasahiro Yamada print "$stream\n" if ($dbg_values > 1); 1248dd88ab32SMasahiro Yamada 1249dd88ab32SMasahiro Yamada while (length($cur)) { 1250dd88ab32SMasahiro Yamada @av_paren_type = ('E') if ($#av_paren_type < 0); 1251dd88ab32SMasahiro Yamada print " <" . join('', @av_paren_type) . 1252dd88ab32SMasahiro Yamada "> <$type> <$av_pending>" if ($dbg_values > 1); 1253dd88ab32SMasahiro Yamada if ($cur =~ /^(\s+)/o) { 1254dd88ab32SMasahiro Yamada print "WS($1)\n" if ($dbg_values > 1); 1255dd88ab32SMasahiro Yamada if ($1 =~ /\n/ && $av_preprocessor) { 1256dd88ab32SMasahiro Yamada $type = pop(@av_paren_type); 1257dd88ab32SMasahiro Yamada $av_preprocessor = 0; 1258dd88ab32SMasahiro Yamada } 1259dd88ab32SMasahiro Yamada 1260dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') { 1261dd88ab32SMasahiro Yamada print "CAST($1)\n" if ($dbg_values > 1); 1262dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1263dd88ab32SMasahiro Yamada $type = 'c'; 1264dd88ab32SMasahiro Yamada 1265dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) { 1266dd88ab32SMasahiro Yamada print "DECLARE($1)\n" if ($dbg_values > 1); 1267dd88ab32SMasahiro Yamada $type = 'T'; 1268dd88ab32SMasahiro Yamada 1269dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Modifier)\s*/) { 1270dd88ab32SMasahiro Yamada print "MODIFIER($1)\n" if ($dbg_values > 1); 1271dd88ab32SMasahiro Yamada $type = 'T'; 1272dd88ab32SMasahiro Yamada 1273dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) { 1274dd88ab32SMasahiro Yamada print "DEFINE($1,$2)\n" if ($dbg_values > 1); 1275dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1276dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1277dd88ab32SMasahiro Yamada if ($2 ne '') { 1278dd88ab32SMasahiro Yamada $av_pending = 'N'; 1279dd88ab32SMasahiro Yamada } 1280dd88ab32SMasahiro Yamada $type = 'E'; 1281dd88ab32SMasahiro Yamada 1282dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) { 1283dd88ab32SMasahiro Yamada print "UNDEF($1)\n" if ($dbg_values > 1); 1284dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1285dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1286dd88ab32SMasahiro Yamada 1287dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) { 1288dd88ab32SMasahiro Yamada print "PRE_START($1)\n" if ($dbg_values > 1); 1289dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1290dd88ab32SMasahiro Yamada 1291dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1292dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1293dd88ab32SMasahiro Yamada $type = 'E'; 1294dd88ab32SMasahiro Yamada 1295dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) { 1296dd88ab32SMasahiro Yamada print "PRE_RESTART($1)\n" if ($dbg_values > 1); 1297dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1298dd88ab32SMasahiro Yamada 1299dd88ab32SMasahiro Yamada push(@av_paren_type, $av_paren_type[$#av_paren_type]); 1300dd88ab32SMasahiro Yamada 1301dd88ab32SMasahiro Yamada $type = 'E'; 1302dd88ab32SMasahiro Yamada 1303dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*(?:endif))/o) { 1304dd88ab32SMasahiro Yamada print "PRE_END($1)\n" if ($dbg_values > 1); 1305dd88ab32SMasahiro Yamada 1306dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1307dd88ab32SMasahiro Yamada 1308dd88ab32SMasahiro Yamada # Assume all arms of the conditional end as this 1309dd88ab32SMasahiro Yamada # one does, and continue as if the #endif was not here. 1310dd88ab32SMasahiro Yamada pop(@av_paren_type); 1311dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1312dd88ab32SMasahiro Yamada $type = 'E'; 1313dd88ab32SMasahiro Yamada 1314dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\\\n)/o) { 1315dd88ab32SMasahiro Yamada print "PRECONT($1)\n" if ($dbg_values > 1); 1316dd88ab32SMasahiro Yamada 1317dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(__attribute__)\s*\(?/o) { 1318dd88ab32SMasahiro Yamada print "ATTR($1)\n" if ($dbg_values > 1); 1319dd88ab32SMasahiro Yamada $av_pending = $type; 1320dd88ab32SMasahiro Yamada $type = 'N'; 1321dd88ab32SMasahiro Yamada 1322dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(sizeof)\s*(\()?/o) { 1323dd88ab32SMasahiro Yamada print "SIZEOF($1)\n" if ($dbg_values > 1); 1324dd88ab32SMasahiro Yamada if (defined $2) { 1325dd88ab32SMasahiro Yamada $av_pending = 'V'; 1326dd88ab32SMasahiro Yamada } 1327dd88ab32SMasahiro Yamada $type = 'N'; 1328dd88ab32SMasahiro Yamada 1329dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(if|while|for)\b/o) { 1330dd88ab32SMasahiro Yamada print "COND($1)\n" if ($dbg_values > 1); 1331dd88ab32SMasahiro Yamada $av_pending = 'E'; 1332dd88ab32SMasahiro Yamada $type = 'N'; 1333dd88ab32SMasahiro Yamada 1334dd88ab32SMasahiro Yamada } elsif ($cur =~/^(case)/o) { 1335dd88ab32SMasahiro Yamada print "CASE($1)\n" if ($dbg_values > 1); 1336dd88ab32SMasahiro Yamada $av_pend_colon = 'C'; 1337dd88ab32SMasahiro Yamada $type = 'N'; 1338dd88ab32SMasahiro Yamada 1339dd88ab32SMasahiro Yamada } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) { 1340dd88ab32SMasahiro Yamada print "KEYWORD($1)\n" if ($dbg_values > 1); 1341dd88ab32SMasahiro Yamada $type = 'N'; 1342dd88ab32SMasahiro Yamada 1343dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\()/o) { 1344dd88ab32SMasahiro Yamada print "PAREN('$1')\n" if ($dbg_values > 1); 1345dd88ab32SMasahiro Yamada push(@av_paren_type, $av_pending); 1346dd88ab32SMasahiro Yamada $av_pending = '_'; 1347dd88ab32SMasahiro Yamada $type = 'N'; 1348dd88ab32SMasahiro Yamada 1349dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\))/o) { 1350dd88ab32SMasahiro Yamada my $new_type = pop(@av_paren_type); 1351dd88ab32SMasahiro Yamada if ($new_type ne '_') { 1352dd88ab32SMasahiro Yamada $type = $new_type; 1353dd88ab32SMasahiro Yamada print "PAREN('$1') -> $type\n" 1354dd88ab32SMasahiro Yamada if ($dbg_values > 1); 1355dd88ab32SMasahiro Yamada } else { 1356dd88ab32SMasahiro Yamada print "PAREN('$1')\n" if ($dbg_values > 1); 1357dd88ab32SMasahiro Yamada } 1358dd88ab32SMasahiro Yamada 1359dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Ident)\s*\(/o) { 1360dd88ab32SMasahiro Yamada print "FUNC($1)\n" if ($dbg_values > 1); 1361dd88ab32SMasahiro Yamada $type = 'V'; 1362dd88ab32SMasahiro Yamada $av_pending = 'V'; 1363dd88ab32SMasahiro Yamada 1364dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) { 1365dd88ab32SMasahiro Yamada if (defined $2 && $type eq 'C' || $type eq 'T') { 1366dd88ab32SMasahiro Yamada $av_pend_colon = 'B'; 1367dd88ab32SMasahiro Yamada } elsif ($type eq 'E') { 1368dd88ab32SMasahiro Yamada $av_pend_colon = 'L'; 1369dd88ab32SMasahiro Yamada } 1370dd88ab32SMasahiro Yamada print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1); 1371dd88ab32SMasahiro Yamada $type = 'V'; 1372dd88ab32SMasahiro Yamada 1373dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Ident|$Constant)/o) { 1374dd88ab32SMasahiro Yamada print "IDENT($1)\n" if ($dbg_values > 1); 1375dd88ab32SMasahiro Yamada $type = 'V'; 1376dd88ab32SMasahiro Yamada 1377dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Assignment)/o) { 1378dd88ab32SMasahiro Yamada print "ASSIGN($1)\n" if ($dbg_values > 1); 1379dd88ab32SMasahiro Yamada $type = 'N'; 1380dd88ab32SMasahiro Yamada 1381dd88ab32SMasahiro Yamada } elsif ($cur =~/^(;|{|})/) { 1382dd88ab32SMasahiro Yamada print "END($1)\n" if ($dbg_values > 1); 1383dd88ab32SMasahiro Yamada $type = 'E'; 1384dd88ab32SMasahiro Yamada $av_pend_colon = 'O'; 1385dd88ab32SMasahiro Yamada 1386dd88ab32SMasahiro Yamada } elsif ($cur =~/^(,)/) { 1387dd88ab32SMasahiro Yamada print "COMMA($1)\n" if ($dbg_values > 1); 1388dd88ab32SMasahiro Yamada $type = 'C'; 1389dd88ab32SMasahiro Yamada 1390dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\?)/o) { 1391dd88ab32SMasahiro Yamada print "QUESTION($1)\n" if ($dbg_values > 1); 1392dd88ab32SMasahiro Yamada $type = 'N'; 1393dd88ab32SMasahiro Yamada 1394dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(:)/o) { 1395dd88ab32SMasahiro Yamada print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1); 1396dd88ab32SMasahiro Yamada 1397dd88ab32SMasahiro Yamada substr($var, length($res), 1, $av_pend_colon); 1398dd88ab32SMasahiro Yamada if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') { 1399dd88ab32SMasahiro Yamada $type = 'E'; 1400dd88ab32SMasahiro Yamada } else { 1401dd88ab32SMasahiro Yamada $type = 'N'; 1402dd88ab32SMasahiro Yamada } 1403dd88ab32SMasahiro Yamada $av_pend_colon = 'O'; 1404dd88ab32SMasahiro Yamada 1405dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\[)/o) { 1406dd88ab32SMasahiro Yamada print "CLOSE($1)\n" if ($dbg_values > 1); 1407dd88ab32SMasahiro Yamada $type = 'N'; 1408dd88ab32SMasahiro Yamada 1409dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) { 1410dd88ab32SMasahiro Yamada my $variant; 1411dd88ab32SMasahiro Yamada 1412dd88ab32SMasahiro Yamada print "OPV($1)\n" if ($dbg_values > 1); 1413dd88ab32SMasahiro Yamada if ($type eq 'V') { 1414dd88ab32SMasahiro Yamada $variant = 'B'; 1415dd88ab32SMasahiro Yamada } else { 1416dd88ab32SMasahiro Yamada $variant = 'U'; 1417dd88ab32SMasahiro Yamada } 1418dd88ab32SMasahiro Yamada 1419dd88ab32SMasahiro Yamada substr($var, length($res), 1, $variant); 1420dd88ab32SMasahiro Yamada $type = 'N'; 1421dd88ab32SMasahiro Yamada 1422dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Operators)/o) { 1423dd88ab32SMasahiro Yamada print "OP($1)\n" if ($dbg_values > 1); 1424dd88ab32SMasahiro Yamada if ($1 ne '++' && $1 ne '--') { 1425dd88ab32SMasahiro Yamada $type = 'N'; 1426dd88ab32SMasahiro Yamada } 1427dd88ab32SMasahiro Yamada 1428dd88ab32SMasahiro Yamada } elsif ($cur =~ /(^.)/o) { 1429dd88ab32SMasahiro Yamada print "C($1)\n" if ($dbg_values > 1); 1430dd88ab32SMasahiro Yamada } 1431dd88ab32SMasahiro Yamada if (defined $1) { 1432dd88ab32SMasahiro Yamada $cur = substr($cur, length($1)); 1433dd88ab32SMasahiro Yamada $res .= $type x length($1); 1434dd88ab32SMasahiro Yamada } 1435dd88ab32SMasahiro Yamada } 1436dd88ab32SMasahiro Yamada 1437dd88ab32SMasahiro Yamada return ($res, $var); 1438dd88ab32SMasahiro Yamada} 1439dd88ab32SMasahiro Yamada 1440dd88ab32SMasahiro Yamadasub possible { 1441dd88ab32SMasahiro Yamada my ($possible, $line) = @_; 1442dd88ab32SMasahiro Yamada my $notPermitted = qr{(?: 1443dd88ab32SMasahiro Yamada ^(?: 1444dd88ab32SMasahiro Yamada $Modifier| 1445dd88ab32SMasahiro Yamada $Storage| 1446dd88ab32SMasahiro Yamada $Type| 1447dd88ab32SMasahiro Yamada DEFINE_\S+ 1448dd88ab32SMasahiro Yamada )$| 1449dd88ab32SMasahiro Yamada ^(?: 1450dd88ab32SMasahiro Yamada goto| 1451dd88ab32SMasahiro Yamada return| 1452dd88ab32SMasahiro Yamada case| 1453dd88ab32SMasahiro Yamada else| 1454dd88ab32SMasahiro Yamada asm|__asm__| 1455dd88ab32SMasahiro Yamada do| 1456dd88ab32SMasahiro Yamada \#| 1457dd88ab32SMasahiro Yamada \#\#| 1458dd88ab32SMasahiro Yamada )(?:\s|$)| 1459dd88ab32SMasahiro Yamada ^(?:typedef|struct|enum)\b 1460dd88ab32SMasahiro Yamada )}x; 1461dd88ab32SMasahiro Yamada warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2); 1462dd88ab32SMasahiro Yamada if ($possible !~ $notPermitted) { 1463dd88ab32SMasahiro Yamada # Check for modifiers. 1464dd88ab32SMasahiro Yamada $possible =~ s/\s*$Storage\s*//g; 1465dd88ab32SMasahiro Yamada $possible =~ s/\s*$Sparse\s*//g; 1466dd88ab32SMasahiro Yamada if ($possible =~ /^\s*$/) { 1467dd88ab32SMasahiro Yamada 1468dd88ab32SMasahiro Yamada } elsif ($possible =~ /\s/) { 1469dd88ab32SMasahiro Yamada $possible =~ s/\s*$Type\s*//g; 1470dd88ab32SMasahiro Yamada for my $modifier (split(' ', $possible)) { 1471dd88ab32SMasahiro Yamada if ($modifier !~ $notPermitted) { 1472dd88ab32SMasahiro Yamada warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible); 1473dd88ab32SMasahiro Yamada push(@modifierList, $modifier); 1474dd88ab32SMasahiro Yamada } 1475dd88ab32SMasahiro Yamada } 1476dd88ab32SMasahiro Yamada 1477dd88ab32SMasahiro Yamada } else { 1478dd88ab32SMasahiro Yamada warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible); 1479dd88ab32SMasahiro Yamada push(@typeList, $possible); 1480dd88ab32SMasahiro Yamada } 1481dd88ab32SMasahiro Yamada build_types(); 1482dd88ab32SMasahiro Yamada } else { 1483dd88ab32SMasahiro Yamada warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1); 1484dd88ab32SMasahiro Yamada } 1485dd88ab32SMasahiro Yamada} 1486dd88ab32SMasahiro Yamada 1487dd88ab32SMasahiro Yamadamy $prefix = ''; 1488dd88ab32SMasahiro Yamada 1489dd88ab32SMasahiro Yamadasub show_type { 14906b9709d9STom Rini return defined $use_type{$_[0]} if (scalar keys %use_type > 0); 14916b9709d9STom Rini 1492dd88ab32SMasahiro Yamada return !defined $ignore_type{$_[0]}; 1493dd88ab32SMasahiro Yamada} 1494dd88ab32SMasahiro Yamada 1495dd88ab32SMasahiro Yamadasub report { 1496dd88ab32SMasahiro Yamada if (!show_type($_[1]) || 1497dd88ab32SMasahiro Yamada (defined $tst_only && $_[2] !~ /\Q$tst_only\E/)) { 1498dd88ab32SMasahiro Yamada return 0; 1499dd88ab32SMasahiro Yamada } 1500dd88ab32SMasahiro Yamada my $line; 1501dd88ab32SMasahiro Yamada if ($show_types) { 1502dd88ab32SMasahiro Yamada $line = "$prefix$_[0]:$_[1]: $_[2]\n"; 1503dd88ab32SMasahiro Yamada } else { 1504dd88ab32SMasahiro Yamada $line = "$prefix$_[0]: $_[2]\n"; 1505dd88ab32SMasahiro Yamada } 1506dd88ab32SMasahiro Yamada $line = (split('\n', $line))[0] . "\n" if ($terse); 1507dd88ab32SMasahiro Yamada 1508dd88ab32SMasahiro Yamada push(our @report, $line); 1509dd88ab32SMasahiro Yamada 1510dd88ab32SMasahiro Yamada return 1; 1511dd88ab32SMasahiro Yamada} 1512dd88ab32SMasahiro Yamadasub report_dump { 1513dd88ab32SMasahiro Yamada our @report; 1514dd88ab32SMasahiro Yamada} 1515dd88ab32SMasahiro Yamada 1516dd88ab32SMasahiro Yamadasub ERROR { 1517dd88ab32SMasahiro Yamada if (report("ERROR", $_[0], $_[1])) { 1518dd88ab32SMasahiro Yamada our $clean = 0; 1519dd88ab32SMasahiro Yamada our $cnt_error++; 15206b9709d9STom Rini return 1; 1521dd88ab32SMasahiro Yamada } 15226b9709d9STom Rini return 0; 1523dd88ab32SMasahiro Yamada} 1524dd88ab32SMasahiro Yamadasub WARN { 1525dd88ab32SMasahiro Yamada if (report("WARNING", $_[0], $_[1])) { 1526dd88ab32SMasahiro Yamada our $clean = 0; 1527dd88ab32SMasahiro Yamada our $cnt_warn++; 15286b9709d9STom Rini return 1; 1529dd88ab32SMasahiro Yamada } 15306b9709d9STom Rini return 0; 1531dd88ab32SMasahiro Yamada} 1532dd88ab32SMasahiro Yamadasub CHK { 1533dd88ab32SMasahiro Yamada if ($check && report("CHECK", $_[0], $_[1])) { 1534dd88ab32SMasahiro Yamada our $clean = 0; 1535dd88ab32SMasahiro Yamada our $cnt_chk++; 15366b9709d9STom Rini return 1; 1537dd88ab32SMasahiro Yamada } 15386b9709d9STom Rini return 0; 1539dd88ab32SMasahiro Yamada} 1540dd88ab32SMasahiro Yamada 1541dd88ab32SMasahiro Yamadasub check_absolute_file { 1542dd88ab32SMasahiro Yamada my ($absolute, $herecurr) = @_; 1543dd88ab32SMasahiro Yamada my $file = $absolute; 1544dd88ab32SMasahiro Yamada 1545dd88ab32SMasahiro Yamada ##print "absolute<$absolute>\n"; 1546dd88ab32SMasahiro Yamada 1547dd88ab32SMasahiro Yamada # See if any suffix of this path is a path within the tree. 1548dd88ab32SMasahiro Yamada while ($file =~ s@^[^/]*/@@) { 1549dd88ab32SMasahiro Yamada if (-f "$root/$file") { 1550dd88ab32SMasahiro Yamada ##print "file<$file>\n"; 1551dd88ab32SMasahiro Yamada last; 1552dd88ab32SMasahiro Yamada } 1553dd88ab32SMasahiro Yamada } 1554dd88ab32SMasahiro Yamada if (! -f _) { 1555dd88ab32SMasahiro Yamada return 0; 1556dd88ab32SMasahiro Yamada } 1557dd88ab32SMasahiro Yamada 1558dd88ab32SMasahiro Yamada # It is, so see if the prefix is acceptable. 1559dd88ab32SMasahiro Yamada my $prefix = $absolute; 1560dd88ab32SMasahiro Yamada substr($prefix, -length($file)) = ''; 1561dd88ab32SMasahiro Yamada 1562dd88ab32SMasahiro Yamada ##print "prefix<$prefix>\n"; 1563dd88ab32SMasahiro Yamada if ($prefix ne ".../") { 1564dd88ab32SMasahiro Yamada WARN("USE_RELATIVE_PATH", 1565dd88ab32SMasahiro Yamada "use relative pathname instead of absolute in changelog text\n" . $herecurr); 1566dd88ab32SMasahiro Yamada } 1567dd88ab32SMasahiro Yamada} 1568dd88ab32SMasahiro Yamada 15696b9709d9STom Rinisub trim { 15706b9709d9STom Rini my ($string) = @_; 15716b9709d9STom Rini 15726b9709d9STom Rini $string =~ s/^\s+|\s+$//g; 15736b9709d9STom Rini 15746b9709d9STom Rini return $string; 15756b9709d9STom Rini} 15766b9709d9STom Rini 15776b9709d9STom Rinisub ltrim { 15786b9709d9STom Rini my ($string) = @_; 15796b9709d9STom Rini 15806b9709d9STom Rini $string =~ s/^\s+//; 15816b9709d9STom Rini 15826b9709d9STom Rini return $string; 15836b9709d9STom Rini} 15846b9709d9STom Rini 15856b9709d9STom Rinisub rtrim { 15866b9709d9STom Rini my ($string) = @_; 15876b9709d9STom Rini 15886b9709d9STom Rini $string =~ s/\s+$//; 15896b9709d9STom Rini 15906b9709d9STom Rini return $string; 15916b9709d9STom Rini} 15926b9709d9STom Rini 15936b9709d9STom Rinisub string_find_replace { 15946b9709d9STom Rini my ($string, $find, $replace) = @_; 15956b9709d9STom Rini 15966b9709d9STom Rini $string =~ s/$find/$replace/g; 15976b9709d9STom Rini 15986b9709d9STom Rini return $string; 15996b9709d9STom Rini} 16006b9709d9STom Rini 16016b9709d9STom Rinisub tabify { 16026b9709d9STom Rini my ($leading) = @_; 16036b9709d9STom Rini 16046b9709d9STom Rini my $source_indent = 8; 16056b9709d9STom Rini my $max_spaces_before_tab = $source_indent - 1; 16066b9709d9STom Rini my $spaces_to_tab = " " x $source_indent; 16076b9709d9STom Rini 16086b9709d9STom Rini #convert leading spaces to tabs 16096b9709d9STom Rini 1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g; 16106b9709d9STom Rini #Remove spaces before a tab 16116b9709d9STom Rini 1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g; 16126b9709d9STom Rini 16136b9709d9STom Rini return "$leading"; 16146b9709d9STom Rini} 16156b9709d9STom Rini 1616dd88ab32SMasahiro Yamadasub pos_last_openparen { 1617dd88ab32SMasahiro Yamada my ($line) = @_; 1618dd88ab32SMasahiro Yamada 1619dd88ab32SMasahiro Yamada my $pos = 0; 1620dd88ab32SMasahiro Yamada 1621dd88ab32SMasahiro Yamada my $opens = $line =~ tr/\(/\(/; 1622dd88ab32SMasahiro Yamada my $closes = $line =~ tr/\)/\)/; 1623dd88ab32SMasahiro Yamada 1624dd88ab32SMasahiro Yamada my $last_openparen = 0; 1625dd88ab32SMasahiro Yamada 1626dd88ab32SMasahiro Yamada if (($opens == 0) || ($closes >= $opens)) { 1627dd88ab32SMasahiro Yamada return -1; 1628dd88ab32SMasahiro Yamada } 1629dd88ab32SMasahiro Yamada 1630dd88ab32SMasahiro Yamada my $len = length($line); 1631dd88ab32SMasahiro Yamada 1632dd88ab32SMasahiro Yamada for ($pos = 0; $pos < $len; $pos++) { 1633dd88ab32SMasahiro Yamada my $string = substr($line, $pos); 1634dd88ab32SMasahiro Yamada if ($string =~ /^($FuncArg|$balanced_parens)/) { 1635dd88ab32SMasahiro Yamada $pos += length($1) - 1; 1636dd88ab32SMasahiro Yamada } elsif (substr($line, $pos, 1) eq '(') { 1637dd88ab32SMasahiro Yamada $last_openparen = $pos; 1638dd88ab32SMasahiro Yamada } elsif (index($string, '(') == -1) { 1639dd88ab32SMasahiro Yamada last; 1640dd88ab32SMasahiro Yamada } 1641dd88ab32SMasahiro Yamada } 1642dd88ab32SMasahiro Yamada 1643dd88ab32SMasahiro Yamada return $last_openparen + 1; 1644dd88ab32SMasahiro Yamada} 1645dd88ab32SMasahiro Yamada 1646dd88ab32SMasahiro Yamadasub process { 1647dd88ab32SMasahiro Yamada my $filename = shift; 1648dd88ab32SMasahiro Yamada 1649dd88ab32SMasahiro Yamada my $linenr=0; 1650dd88ab32SMasahiro Yamada my $prevline=""; 1651dd88ab32SMasahiro Yamada my $prevrawline=""; 1652dd88ab32SMasahiro Yamada my $stashline=""; 1653dd88ab32SMasahiro Yamada my $stashrawline=""; 1654dd88ab32SMasahiro Yamada 1655dd88ab32SMasahiro Yamada my $length; 1656dd88ab32SMasahiro Yamada my $indent; 1657dd88ab32SMasahiro Yamada my $previndent=0; 1658dd88ab32SMasahiro Yamada my $stashindent=0; 1659dd88ab32SMasahiro Yamada 1660dd88ab32SMasahiro Yamada our $clean = 1; 1661dd88ab32SMasahiro Yamada my $signoff = 0; 1662dd88ab32SMasahiro Yamada my $is_patch = 0; 1663dd88ab32SMasahiro Yamada 1664dd88ab32SMasahiro Yamada my $in_header_lines = 1; 1665dd88ab32SMasahiro Yamada my $in_commit_log = 0; #Scanning lines before patch 1666dd88ab32SMasahiro Yamada 1667dd88ab32SMasahiro Yamada my $non_utf8_charset = 0; 1668dd88ab32SMasahiro Yamada 1669dd88ab32SMasahiro Yamada our @report = (); 1670dd88ab32SMasahiro Yamada our $cnt_lines = 0; 1671dd88ab32SMasahiro Yamada our $cnt_error = 0; 1672dd88ab32SMasahiro Yamada our $cnt_warn = 0; 1673dd88ab32SMasahiro Yamada our $cnt_chk = 0; 1674dd88ab32SMasahiro Yamada 1675dd88ab32SMasahiro Yamada # Trace the real file/line as we go. 1676dd88ab32SMasahiro Yamada my $realfile = ''; 1677dd88ab32SMasahiro Yamada my $realline = 0; 1678dd88ab32SMasahiro Yamada my $realcnt = 0; 1679dd88ab32SMasahiro Yamada my $here = ''; 1680dd88ab32SMasahiro Yamada my $in_comment = 0; 1681dd88ab32SMasahiro Yamada my $comment_edge = 0; 1682dd88ab32SMasahiro Yamada my $first_line = 0; 1683dd88ab32SMasahiro Yamada my $p1_prefix = ''; 1684dd88ab32SMasahiro Yamada 1685dd88ab32SMasahiro Yamada my $prev_values = 'E'; 1686dd88ab32SMasahiro Yamada 1687dd88ab32SMasahiro Yamada # suppression flags 1688dd88ab32SMasahiro Yamada my %suppress_ifbraces; 1689dd88ab32SMasahiro Yamada my %suppress_whiletrailers; 1690dd88ab32SMasahiro Yamada my %suppress_export; 1691dd88ab32SMasahiro Yamada my $suppress_statement = 0; 1692dd88ab32SMasahiro Yamada 16936b9709d9STom Rini my %signatures = (); 1694dd88ab32SMasahiro Yamada 1695dd88ab32SMasahiro Yamada # Pre-scan the patch sanitizing the lines. 1696dd88ab32SMasahiro Yamada # Pre-scan the patch looking for any __setup documentation. 1697dd88ab32SMasahiro Yamada # 1698dd88ab32SMasahiro Yamada my @setup_docs = (); 1699dd88ab32SMasahiro Yamada my $setup_docs = 0; 1700dd88ab32SMasahiro Yamada 17016b9709d9STom Rini my $camelcase_file_seeded = 0; 17026b9709d9STom Rini 1703dd88ab32SMasahiro Yamada sanitise_line_reset(); 1704dd88ab32SMasahiro Yamada my $line; 1705dd88ab32SMasahiro Yamada foreach my $rawline (@rawlines) { 1706dd88ab32SMasahiro Yamada $linenr++; 1707dd88ab32SMasahiro Yamada $line = $rawline; 1708dd88ab32SMasahiro Yamada 17096b9709d9STom Rini push(@fixed, $rawline) if ($fix); 17106b9709d9STom Rini 1711dd88ab32SMasahiro Yamada if ($rawline=~/^\+\+\+\s+(\S+)/) { 1712dd88ab32SMasahiro Yamada $setup_docs = 0; 1713dd88ab32SMasahiro Yamada if ($1 =~ m@Documentation/kernel-parameters.txt$@) { 1714dd88ab32SMasahiro Yamada $setup_docs = 1; 1715dd88ab32SMasahiro Yamada } 1716dd88ab32SMasahiro Yamada #next; 1717dd88ab32SMasahiro Yamada } 1718dd88ab32SMasahiro Yamada if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { 1719dd88ab32SMasahiro Yamada $realline=$1-1; 1720dd88ab32SMasahiro Yamada if (defined $2) { 1721dd88ab32SMasahiro Yamada $realcnt=$3+1; 1722dd88ab32SMasahiro Yamada } else { 1723dd88ab32SMasahiro Yamada $realcnt=1+1; 1724dd88ab32SMasahiro Yamada } 1725dd88ab32SMasahiro Yamada $in_comment = 0; 1726dd88ab32SMasahiro Yamada 1727dd88ab32SMasahiro Yamada # Guestimate if this is a continuing comment. Run 1728dd88ab32SMasahiro Yamada # the context looking for a comment "edge". If this 1729dd88ab32SMasahiro Yamada # edge is a close comment then we must be in a comment 1730dd88ab32SMasahiro Yamada # at context start. 1731dd88ab32SMasahiro Yamada my $edge; 1732dd88ab32SMasahiro Yamada my $cnt = $realcnt; 1733dd88ab32SMasahiro Yamada for (my $ln = $linenr + 1; $cnt > 0; $ln++) { 1734dd88ab32SMasahiro Yamada next if (defined $rawlines[$ln - 1] && 1735dd88ab32SMasahiro Yamada $rawlines[$ln - 1] =~ /^-/); 1736dd88ab32SMasahiro Yamada $cnt--; 1737dd88ab32SMasahiro Yamada #print "RAW<$rawlines[$ln - 1]>\n"; 1738dd88ab32SMasahiro Yamada last if (!defined $rawlines[$ln - 1]); 1739dd88ab32SMasahiro Yamada if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ && 1740dd88ab32SMasahiro Yamada $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) { 1741dd88ab32SMasahiro Yamada ($edge) = $1; 1742dd88ab32SMasahiro Yamada last; 1743dd88ab32SMasahiro Yamada } 1744dd88ab32SMasahiro Yamada } 1745dd88ab32SMasahiro Yamada if (defined $edge && $edge eq '*/') { 1746dd88ab32SMasahiro Yamada $in_comment = 1; 1747dd88ab32SMasahiro Yamada } 1748dd88ab32SMasahiro Yamada 1749dd88ab32SMasahiro Yamada # Guestimate if this is a continuing comment. If this 1750dd88ab32SMasahiro Yamada # is the start of a diff block and this line starts 1751dd88ab32SMasahiro Yamada # ' *' then it is very likely a comment. 1752dd88ab32SMasahiro Yamada if (!defined $edge && 1753dd88ab32SMasahiro Yamada $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@) 1754dd88ab32SMasahiro Yamada { 1755dd88ab32SMasahiro Yamada $in_comment = 1; 1756dd88ab32SMasahiro Yamada } 1757dd88ab32SMasahiro Yamada 1758dd88ab32SMasahiro Yamada ##print "COMMENT:$in_comment edge<$edge> $rawline\n"; 1759dd88ab32SMasahiro Yamada sanitise_line_reset($in_comment); 1760dd88ab32SMasahiro Yamada 1761dd88ab32SMasahiro Yamada } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) { 1762dd88ab32SMasahiro Yamada # Standardise the strings and chars within the input to 1763dd88ab32SMasahiro Yamada # simplify matching -- only bother with positive lines. 1764dd88ab32SMasahiro Yamada $line = sanitise_line($rawline); 1765dd88ab32SMasahiro Yamada } 1766dd88ab32SMasahiro Yamada push(@lines, $line); 1767dd88ab32SMasahiro Yamada 1768dd88ab32SMasahiro Yamada if ($realcnt > 1) { 1769dd88ab32SMasahiro Yamada $realcnt-- if ($line =~ /^(?:\+| |$)/); 1770dd88ab32SMasahiro Yamada } else { 1771dd88ab32SMasahiro Yamada $realcnt = 0; 1772dd88ab32SMasahiro Yamada } 1773dd88ab32SMasahiro Yamada 1774dd88ab32SMasahiro Yamada #print "==>$rawline\n"; 1775dd88ab32SMasahiro Yamada #print "-->$line\n"; 1776dd88ab32SMasahiro Yamada 1777dd88ab32SMasahiro Yamada if ($setup_docs && $line =~ /^\+/) { 1778dd88ab32SMasahiro Yamada push(@setup_docs, $line); 1779dd88ab32SMasahiro Yamada } 1780dd88ab32SMasahiro Yamada } 1781dd88ab32SMasahiro Yamada 1782dd88ab32SMasahiro Yamada $prefix = ''; 1783dd88ab32SMasahiro Yamada 1784dd88ab32SMasahiro Yamada $realcnt = 0; 1785dd88ab32SMasahiro Yamada $linenr = 0; 1786dd88ab32SMasahiro Yamada foreach my $line (@lines) { 1787dd88ab32SMasahiro Yamada $linenr++; 17886b9709d9STom Rini my $sline = $line; #copy of $line 17896b9709d9STom Rini $sline =~ s/$;/ /g; #with comments as spaces 1790dd88ab32SMasahiro Yamada 1791dd88ab32SMasahiro Yamada my $rawline = $rawlines[$linenr - 1]; 1792dd88ab32SMasahiro Yamada 1793dd88ab32SMasahiro Yamada#extract the line range in the file after the patch is applied 1794dd88ab32SMasahiro Yamada if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { 1795dd88ab32SMasahiro Yamada $is_patch = 1; 1796dd88ab32SMasahiro Yamada $first_line = $linenr + 1; 1797dd88ab32SMasahiro Yamada $realline=$1-1; 1798dd88ab32SMasahiro Yamada if (defined $2) { 1799dd88ab32SMasahiro Yamada $realcnt=$3+1; 1800dd88ab32SMasahiro Yamada } else { 1801dd88ab32SMasahiro Yamada $realcnt=1+1; 1802dd88ab32SMasahiro Yamada } 1803dd88ab32SMasahiro Yamada annotate_reset(); 1804dd88ab32SMasahiro Yamada $prev_values = 'E'; 1805dd88ab32SMasahiro Yamada 1806dd88ab32SMasahiro Yamada %suppress_ifbraces = (); 1807dd88ab32SMasahiro Yamada %suppress_whiletrailers = (); 1808dd88ab32SMasahiro Yamada %suppress_export = (); 1809dd88ab32SMasahiro Yamada $suppress_statement = 0; 1810dd88ab32SMasahiro Yamada next; 1811dd88ab32SMasahiro Yamada 1812dd88ab32SMasahiro Yamada# track the line number as we move through the hunk, note that 1813dd88ab32SMasahiro Yamada# new versions of GNU diff omit the leading space on completely 1814dd88ab32SMasahiro Yamada# blank context lines so we need to count that too. 1815dd88ab32SMasahiro Yamada } elsif ($line =~ /^( |\+|$)/) { 1816dd88ab32SMasahiro Yamada $realline++; 1817dd88ab32SMasahiro Yamada $realcnt-- if ($realcnt != 0); 1818dd88ab32SMasahiro Yamada 1819dd88ab32SMasahiro Yamada # Measure the line length and indent. 1820dd88ab32SMasahiro Yamada ($length, $indent) = line_stats($rawline); 1821dd88ab32SMasahiro Yamada 1822dd88ab32SMasahiro Yamada # Track the previous line. 1823dd88ab32SMasahiro Yamada ($prevline, $stashline) = ($stashline, $line); 1824dd88ab32SMasahiro Yamada ($previndent, $stashindent) = ($stashindent, $indent); 1825dd88ab32SMasahiro Yamada ($prevrawline, $stashrawline) = ($stashrawline, $rawline); 1826dd88ab32SMasahiro Yamada 1827dd88ab32SMasahiro Yamada #warn "line<$line>\n"; 1828dd88ab32SMasahiro Yamada 1829dd88ab32SMasahiro Yamada } elsif ($realcnt == 1) { 1830dd88ab32SMasahiro Yamada $realcnt--; 1831dd88ab32SMasahiro Yamada } 1832dd88ab32SMasahiro Yamada 1833dd88ab32SMasahiro Yamada my $hunk_line = ($realcnt != 0); 1834dd88ab32SMasahiro Yamada 1835dd88ab32SMasahiro Yamada#make up the handle for any error we report on this line 1836dd88ab32SMasahiro Yamada $prefix = "$filename:$realline: " if ($emacs && $file); 1837dd88ab32SMasahiro Yamada $prefix = "$filename:$linenr: " if ($emacs && !$file); 1838dd88ab32SMasahiro Yamada 1839dd88ab32SMasahiro Yamada $here = "#$linenr: " if (!$file); 1840dd88ab32SMasahiro Yamada $here = "#$realline: " if ($file); 1841dd88ab32SMasahiro Yamada 1842dd88ab32SMasahiro Yamada # extract the filename as it passes 1843dd88ab32SMasahiro Yamada if ($line =~ /^diff --git.*?(\S+)$/) { 1844dd88ab32SMasahiro Yamada $realfile = $1; 18456b9709d9STom Rini $realfile =~ s@^([^/]*)/@@ if (!$file); 1846dd88ab32SMasahiro Yamada $in_commit_log = 0; 1847dd88ab32SMasahiro Yamada } elsif ($line =~ /^\+\+\+\s+(\S+)/) { 1848dd88ab32SMasahiro Yamada $realfile = $1; 18496b9709d9STom Rini $realfile =~ s@^([^/]*)/@@ if (!$file); 1850dd88ab32SMasahiro Yamada $in_commit_log = 0; 1851dd88ab32SMasahiro Yamada 1852dd88ab32SMasahiro Yamada $p1_prefix = $1; 1853dd88ab32SMasahiro Yamada if (!$file && $tree && $p1_prefix ne '' && 1854dd88ab32SMasahiro Yamada -e "$root/$p1_prefix") { 1855dd88ab32SMasahiro Yamada WARN("PATCH_PREFIX", 1856dd88ab32SMasahiro Yamada "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n"); 1857dd88ab32SMasahiro Yamada } 1858dd88ab32SMasahiro Yamada 1859dd88ab32SMasahiro Yamada if ($realfile =~ m@^include/asm/@) { 1860dd88ab32SMasahiro Yamada ERROR("MODIFIED_INCLUDE_ASM", 1861dd88ab32SMasahiro Yamada "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n"); 1862dd88ab32SMasahiro Yamada } 1863dd88ab32SMasahiro Yamada next; 1864dd88ab32SMasahiro Yamada } 1865dd88ab32SMasahiro Yamada 1866dd88ab32SMasahiro Yamada $here .= "FILE: $realfile:$realline:" if ($realcnt != 0); 1867dd88ab32SMasahiro Yamada 1868dd88ab32SMasahiro Yamada my $hereline = "$here\n$rawline\n"; 1869dd88ab32SMasahiro Yamada my $herecurr = "$here\n$rawline\n"; 1870dd88ab32SMasahiro Yamada my $hereprev = "$here\n$prevrawline\n$rawline\n"; 1871dd88ab32SMasahiro Yamada 1872dd88ab32SMasahiro Yamada $cnt_lines++ if ($realcnt != 0); 1873dd88ab32SMasahiro Yamada 1874dd88ab32SMasahiro Yamada# Check for incorrect file permissions 1875dd88ab32SMasahiro Yamada if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) { 1876dd88ab32SMasahiro Yamada my $permhere = $here . "FILE: $realfile\n"; 18776b9709d9STom Rini if ($realfile !~ m@scripts/@ && 18786b9709d9STom Rini $realfile !~ /\.(py|pl|awk|sh)$/) { 1879dd88ab32SMasahiro Yamada ERROR("EXECUTE_PERMISSIONS", 1880dd88ab32SMasahiro Yamada "do not set execute permissions for source files\n" . $permhere); 1881dd88ab32SMasahiro Yamada } 1882dd88ab32SMasahiro Yamada } 1883dd88ab32SMasahiro Yamada 1884dd88ab32SMasahiro Yamada# Check the patch for a signoff: 1885dd88ab32SMasahiro Yamada if ($line =~ /^\s*signed-off-by:/i) { 1886dd88ab32SMasahiro Yamada $signoff++; 1887dd88ab32SMasahiro Yamada $in_commit_log = 0; 1888dd88ab32SMasahiro Yamada } 1889dd88ab32SMasahiro Yamada 1890dd88ab32SMasahiro Yamada# Check signature styles 1891dd88ab32SMasahiro Yamada if (!$in_header_lines && 1892dd88ab32SMasahiro Yamada $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) { 1893dd88ab32SMasahiro Yamada my $space_before = $1; 1894dd88ab32SMasahiro Yamada my $sign_off = $2; 1895dd88ab32SMasahiro Yamada my $space_after = $3; 1896dd88ab32SMasahiro Yamada my $email = $4; 1897dd88ab32SMasahiro Yamada my $ucfirst_sign_off = ucfirst(lc($sign_off)); 1898dd88ab32SMasahiro Yamada 1899dd88ab32SMasahiro Yamada if ($sign_off !~ /$signature_tags/) { 1900dd88ab32SMasahiro Yamada WARN("BAD_SIGN_OFF", 1901dd88ab32SMasahiro Yamada "Non-standard signature: $sign_off\n" . $herecurr); 1902dd88ab32SMasahiro Yamada } 1903dd88ab32SMasahiro Yamada if (defined $space_before && $space_before ne "") { 19046b9709d9STom Rini if (WARN("BAD_SIGN_OFF", 19056b9709d9STom Rini "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) && 19066b9709d9STom Rini $fix) { 19076b9709d9STom Rini $fixed[$linenr - 1] = 19086b9709d9STom Rini "$ucfirst_sign_off $email"; 19096b9709d9STom Rini } 1910dd88ab32SMasahiro Yamada } 1911dd88ab32SMasahiro Yamada if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) { 19126b9709d9STom Rini if (WARN("BAD_SIGN_OFF", 19136b9709d9STom Rini "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) && 19146b9709d9STom Rini $fix) { 19156b9709d9STom Rini $fixed[$linenr - 1] = 19166b9709d9STom Rini "$ucfirst_sign_off $email"; 19176b9709d9STom Rini } 19186b9709d9STom Rini 1919dd88ab32SMasahiro Yamada } 1920dd88ab32SMasahiro Yamada if (!defined $space_after || $space_after ne " ") { 19216b9709d9STom Rini if (WARN("BAD_SIGN_OFF", 19226b9709d9STom Rini "Use a single space after $ucfirst_sign_off\n" . $herecurr) && 19236b9709d9STom Rini $fix) { 19246b9709d9STom Rini $fixed[$linenr - 1] = 19256b9709d9STom Rini "$ucfirst_sign_off $email"; 19266b9709d9STom Rini } 1927dd88ab32SMasahiro Yamada } 1928dd88ab32SMasahiro Yamada 1929dd88ab32SMasahiro Yamada my ($email_name, $email_address, $comment) = parse_email($email); 1930dd88ab32SMasahiro Yamada my $suggested_email = format_email(($email_name, $email_address)); 1931dd88ab32SMasahiro Yamada if ($suggested_email eq "") { 1932dd88ab32SMasahiro Yamada ERROR("BAD_SIGN_OFF", 1933dd88ab32SMasahiro Yamada "Unrecognized email address: '$email'\n" . $herecurr); 1934dd88ab32SMasahiro Yamada } else { 1935dd88ab32SMasahiro Yamada my $dequoted = $suggested_email; 1936dd88ab32SMasahiro Yamada $dequoted =~ s/^"//; 1937dd88ab32SMasahiro Yamada $dequoted =~ s/" </ </; 1938dd88ab32SMasahiro Yamada # Don't force email to have quotes 1939dd88ab32SMasahiro Yamada # Allow just an angle bracketed address 1940dd88ab32SMasahiro Yamada if ("$dequoted$comment" ne $email && 1941dd88ab32SMasahiro Yamada "<$email_address>$comment" ne $email && 1942dd88ab32SMasahiro Yamada "$suggested_email$comment" ne $email) { 1943dd88ab32SMasahiro Yamada WARN("BAD_SIGN_OFF", 1944dd88ab32SMasahiro Yamada "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr); 1945dd88ab32SMasahiro Yamada } 1946dd88ab32SMasahiro Yamada } 19476b9709d9STom Rini 19486b9709d9STom Rini# Check for duplicate signatures 19496b9709d9STom Rini my $sig_nospace = $line; 19506b9709d9STom Rini $sig_nospace =~ s/\s//g; 19516b9709d9STom Rini $sig_nospace = lc($sig_nospace); 19526b9709d9STom Rini if (defined $signatures{$sig_nospace}) { 19536b9709d9STom Rini WARN("BAD_SIGN_OFF", 19546b9709d9STom Rini "Duplicate signature\n" . $herecurr); 19556b9709d9STom Rini } else { 19566b9709d9STom Rini $signatures{$sig_nospace} = 1; 19576b9709d9STom Rini } 1958dd88ab32SMasahiro Yamada } 1959dd88ab32SMasahiro Yamada 1960dd88ab32SMasahiro Yamada# Check for wrappage within a valid hunk of the file 1961dd88ab32SMasahiro Yamada if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) { 1962dd88ab32SMasahiro Yamada ERROR("CORRUPTED_PATCH", 1963dd88ab32SMasahiro Yamada "patch seems to be corrupt (line wrapped?)\n" . 1964dd88ab32SMasahiro Yamada $herecurr) if (!$emitted_corrupt++); 1965dd88ab32SMasahiro Yamada } 1966dd88ab32SMasahiro Yamada 1967dd88ab32SMasahiro Yamada# Check for absolute kernel paths. 1968dd88ab32SMasahiro Yamada if ($tree) { 1969dd88ab32SMasahiro Yamada while ($line =~ m{(?:^|\s)(/\S*)}g) { 1970dd88ab32SMasahiro Yamada my $file = $1; 1971dd88ab32SMasahiro Yamada 1972dd88ab32SMasahiro Yamada if ($file =~ m{^(.*?)(?::\d+)+:?$} && 1973dd88ab32SMasahiro Yamada check_absolute_file($1, $herecurr)) { 1974dd88ab32SMasahiro Yamada # 1975dd88ab32SMasahiro Yamada } else { 1976dd88ab32SMasahiro Yamada check_absolute_file($file, $herecurr); 1977dd88ab32SMasahiro Yamada } 1978dd88ab32SMasahiro Yamada } 1979dd88ab32SMasahiro Yamada } 1980dd88ab32SMasahiro Yamada 1981dd88ab32SMasahiro Yamada# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php 1982dd88ab32SMasahiro Yamada if (($realfile =~ /^$/ || $line =~ /^\+/) && 1983dd88ab32SMasahiro Yamada $rawline !~ m/^$UTF8*$/) { 1984dd88ab32SMasahiro Yamada my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/); 1985dd88ab32SMasahiro Yamada 1986dd88ab32SMasahiro Yamada my $blank = copy_spacing($rawline); 1987dd88ab32SMasahiro Yamada my $ptr = substr($blank, 0, length($utf8_prefix)) . "^"; 1988dd88ab32SMasahiro Yamada my $hereptr = "$hereline$ptr\n"; 1989dd88ab32SMasahiro Yamada 1990dd88ab32SMasahiro Yamada CHK("INVALID_UTF8", 1991dd88ab32SMasahiro Yamada "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr); 1992dd88ab32SMasahiro Yamada } 1993dd88ab32SMasahiro Yamada 1994dd88ab32SMasahiro Yamada# Check if it's the start of a commit log 1995dd88ab32SMasahiro Yamada# (not a header line and we haven't seen the patch filename) 1996dd88ab32SMasahiro Yamada if ($in_header_lines && $realfile =~ /^$/ && 1997dd88ab32SMasahiro Yamada $rawline !~ /^(commit\b|from\b|[\w-]+:).+$/i) { 1998dd88ab32SMasahiro Yamada $in_header_lines = 0; 1999dd88ab32SMasahiro Yamada $in_commit_log = 1; 2000dd88ab32SMasahiro Yamada } 2001dd88ab32SMasahiro Yamada 2002dd88ab32SMasahiro Yamada# Check if there is UTF-8 in a commit log when a mail header has explicitly 2003dd88ab32SMasahiro Yamada# declined it, i.e defined some charset where it is missing. 2004dd88ab32SMasahiro Yamada if ($in_header_lines && 2005dd88ab32SMasahiro Yamada $rawline =~ /^Content-Type:.+charset="(.+)".*$/ && 2006dd88ab32SMasahiro Yamada $1 !~ /utf-8/i) { 2007dd88ab32SMasahiro Yamada $non_utf8_charset = 1; 2008dd88ab32SMasahiro Yamada } 2009dd88ab32SMasahiro Yamada 2010dd88ab32SMasahiro Yamada if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ && 2011dd88ab32SMasahiro Yamada $rawline =~ /$NON_ASCII_UTF8/) { 2012dd88ab32SMasahiro Yamada WARN("UTF8_BEFORE_PATCH", 2013dd88ab32SMasahiro Yamada "8-bit UTF-8 used in possible commit log\n" . $herecurr); 2014dd88ab32SMasahiro Yamada } 2015dd88ab32SMasahiro Yamada 2016*c10e0f5bSDan Murphy# Check for various typo / spelling mistakes 2017*c10e0f5bSDan Murphy if (defined($misspellings) && 2018*c10e0f5bSDan Murphy ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) { 2019*c10e0f5bSDan Murphy while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) { 2020*c10e0f5bSDan Murphy my $typo = $1; 2021*c10e0f5bSDan Murphy my $typo_fix = $spelling_fix{lc($typo)}; 2022*c10e0f5bSDan Murphy $typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/); 2023*c10e0f5bSDan Murphy $typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/); 2024*c10e0f5bSDan Murphy my $msg_type = \&WARN; 2025*c10e0f5bSDan Murphy $msg_type = \&CHK if ($file); 2026*c10e0f5bSDan Murphy if (&{$msg_type}("TYPO_SPELLING", 2027*c10e0f5bSDan Murphy "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) && 2028*c10e0f5bSDan Murphy $fix) { 2029*c10e0f5bSDan Murphy $fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/; 2030*c10e0f5bSDan Murphy } 2031*c10e0f5bSDan Murphy } 2032*c10e0f5bSDan Murphy } 2033*c10e0f5bSDan Murphy 2034dd88ab32SMasahiro Yamada# ignore non-hunk lines and lines being removed 2035dd88ab32SMasahiro Yamada next if (!$hunk_line || $line =~ /^-/); 2036dd88ab32SMasahiro Yamada 2037dd88ab32SMasahiro Yamada#trailing whitespace 2038dd88ab32SMasahiro Yamada if ($line =~ /^\+.*\015/) { 2039dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 20406b9709d9STom Rini if (ERROR("DOS_LINE_ENDINGS", 20416b9709d9STom Rini "DOS line endings\n" . $herevet) && 20426b9709d9STom Rini $fix) { 20436b9709d9STom Rini $fixed[$linenr - 1] =~ s/[\s\015]+$//; 20446b9709d9STom Rini } 2045dd88ab32SMasahiro Yamada } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) { 2046dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 20476b9709d9STom Rini if (ERROR("TRAILING_WHITESPACE", 20486b9709d9STom Rini "trailing whitespace\n" . $herevet) && 20496b9709d9STom Rini $fix) { 20506b9709d9STom Rini $fixed[$linenr - 1] =~ s/\s+$//; 20516b9709d9STom Rini } 20526b9709d9STom Rini 2053dd88ab32SMasahiro Yamada $rpt_cleaners = 1; 2054dd88ab32SMasahiro Yamada } 2055dd88ab32SMasahiro Yamada 20566b9709d9STom Rini# Check for FSF mailing addresses. 20576b9709d9STom Rini if ($rawline =~ /\bwrite to the Free/i || 20586b9709d9STom Rini $rawline =~ /\b59\s+Temple\s+Pl/i || 20596b9709d9STom Rini $rawline =~ /\b51\s+Franklin\s+St/i) { 20606b9709d9STom Rini my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 20616b9709d9STom Rini my $msg_type = \&ERROR; 20626b9709d9STom Rini $msg_type = \&CHK if ($file); 20636b9709d9STom Rini &{$msg_type}("FSF_MAILING_ADDRESS", 20646b9709d9STom Rini "Do not include the paragraph about writing to the Free Software Foundation's mailing address from the sample GPL notice. The FSF has changed addresses in the past, and may do so again. Linux already includes a copy of the GPL.\n" . $herevet) 20656b9709d9STom Rini } 20666b9709d9STom Rini 2067dd88ab32SMasahiro Yamada# check for Kconfig help text having a real description 2068dd88ab32SMasahiro Yamada# Only applies when adding the entry originally, after that we do not have 2069dd88ab32SMasahiro Yamada# sufficient context to determine whether it is indeed long enough. 2070dd88ab32SMasahiro Yamada if ($realfile =~ /Kconfig/ && 2071dd88ab32SMasahiro Yamada $line =~ /.\s*config\s+/) { 2072dd88ab32SMasahiro Yamada my $length = 0; 2073dd88ab32SMasahiro Yamada my $cnt = $realcnt; 2074dd88ab32SMasahiro Yamada my $ln = $linenr + 1; 2075dd88ab32SMasahiro Yamada my $f; 2076dd88ab32SMasahiro Yamada my $is_start = 0; 2077dd88ab32SMasahiro Yamada my $is_end = 0; 2078dd88ab32SMasahiro Yamada for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) { 2079dd88ab32SMasahiro Yamada $f = $lines[$ln - 1]; 2080dd88ab32SMasahiro Yamada $cnt-- if ($lines[$ln - 1] !~ /^-/); 2081dd88ab32SMasahiro Yamada $is_end = $lines[$ln - 1] =~ /^\+/; 2082dd88ab32SMasahiro Yamada 2083dd88ab32SMasahiro Yamada next if ($f =~ /^-/); 2084dd88ab32SMasahiro Yamada 2085dd88ab32SMasahiro Yamada if ($lines[$ln - 1] =~ /.\s*(?:bool|tristate)\s*\"/) { 2086dd88ab32SMasahiro Yamada $is_start = 1; 2087dd88ab32SMasahiro Yamada } elsif ($lines[$ln - 1] =~ /.\s*(?:---)?help(?:---)?$/) { 2088dd88ab32SMasahiro Yamada $length = -1; 2089dd88ab32SMasahiro Yamada } 2090dd88ab32SMasahiro Yamada 2091dd88ab32SMasahiro Yamada $f =~ s/^.//; 2092dd88ab32SMasahiro Yamada $f =~ s/#.*//; 2093dd88ab32SMasahiro Yamada $f =~ s/^\s+//; 2094dd88ab32SMasahiro Yamada next if ($f =~ /^$/); 2095dd88ab32SMasahiro Yamada if ($f =~ /^\s*config\s/) { 2096dd88ab32SMasahiro Yamada $is_end = 1; 2097dd88ab32SMasahiro Yamada last; 2098dd88ab32SMasahiro Yamada } 2099dd88ab32SMasahiro Yamada $length++; 2100dd88ab32SMasahiro Yamada } 2101dd88ab32SMasahiro Yamada WARN("CONFIG_DESCRIPTION", 2102dd88ab32SMasahiro Yamada "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_start && $is_end && $length < 4); 2103dd88ab32SMasahiro Yamada #print "is_start<$is_start> is_end<$is_end> length<$length>\n"; 2104dd88ab32SMasahiro Yamada } 2105dd88ab32SMasahiro Yamada 2106dd88ab32SMasahiro Yamada# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig. 2107dd88ab32SMasahiro Yamada if ($realfile =~ /Kconfig/ && 2108dd88ab32SMasahiro Yamada $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) { 2109dd88ab32SMasahiro Yamada WARN("CONFIG_EXPERIMENTAL", 2110dd88ab32SMasahiro Yamada "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n"); 2111dd88ab32SMasahiro Yamada } 2112dd88ab32SMasahiro Yamada 2113dd88ab32SMasahiro Yamada if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) && 2114dd88ab32SMasahiro Yamada ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) { 2115dd88ab32SMasahiro Yamada my $flag = $1; 2116dd88ab32SMasahiro Yamada my $replacement = { 2117dd88ab32SMasahiro Yamada 'EXTRA_AFLAGS' => 'asflags-y', 2118dd88ab32SMasahiro Yamada 'EXTRA_CFLAGS' => 'ccflags-y', 2119dd88ab32SMasahiro Yamada 'EXTRA_CPPFLAGS' => 'cppflags-y', 2120dd88ab32SMasahiro Yamada 'EXTRA_LDFLAGS' => 'ldflags-y', 2121dd88ab32SMasahiro Yamada }; 2122dd88ab32SMasahiro Yamada 2123dd88ab32SMasahiro Yamada WARN("DEPRECATED_VARIABLE", 2124dd88ab32SMasahiro Yamada "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag}); 2125dd88ab32SMasahiro Yamada } 2126dd88ab32SMasahiro Yamada 21276b9709d9STom Rini# check for DT compatible documentation 21286b9709d9STom Rini if (defined $root && $realfile =~ /\.dts/ && 21296b9709d9STom Rini $rawline =~ /^\+\s*compatible\s*=/) { 21306b9709d9STom Rini my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g; 21316b9709d9STom Rini 21326b9709d9STom Rini foreach my $compat (@compats) { 21336b9709d9STom Rini my $compat2 = $compat; 21346b9709d9STom Rini my $dt_path = $root . "/Documentation/devicetree/bindings/"; 21356b9709d9STom Rini $compat2 =~ s/\,[a-z]*\-/\,<\.\*>\-/; 21366b9709d9STom Rini `grep -Erq "$compat|$compat2" $dt_path`; 21376b9709d9STom Rini if ( $? >> 8 ) { 21386b9709d9STom Rini WARN("UNDOCUMENTED_DT_STRING", 21396b9709d9STom Rini "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr); 21406b9709d9STom Rini } 21416b9709d9STom Rini 21426b9709d9STom Rini my $vendor = $compat; 21436b9709d9STom Rini my $vendor_path = $dt_path . "vendor-prefixes.txt"; 21446b9709d9STom Rini next if (! -f $vendor_path); 21456b9709d9STom Rini $vendor =~ s/^([a-zA-Z0-9]+)\,.*/$1/; 21466b9709d9STom Rini `grep -Eq "$vendor" $vendor_path`; 21476b9709d9STom Rini if ( $? >> 8 ) { 21486b9709d9STom Rini WARN("UNDOCUMENTED_DT_STRING", 21496b9709d9STom Rini "DT compatible string vendor \"$vendor\" appears un-documented -- check $vendor_path\n" . $herecurr); 21506b9709d9STom Rini } 21516b9709d9STom Rini } 21526b9709d9STom Rini } 21536b9709d9STom Rini 2154dd88ab32SMasahiro Yamada# check we are in a valid source file if not then ignore this hunk 2155dd88ab32SMasahiro Yamada next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/); 2156dd88ab32SMasahiro Yamada 2157dd88ab32SMasahiro Yamada#line length limit 2158dd88ab32SMasahiro Yamada if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ && 2159dd88ab32SMasahiro Yamada $rawline !~ /^.\s*\*\s*\@$Ident\s/ && 2160dd88ab32SMasahiro Yamada !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ || 2161dd88ab32SMasahiro Yamada $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) && 2162dd88ab32SMasahiro Yamada $length > $max_line_length) 2163dd88ab32SMasahiro Yamada { 2164dd88ab32SMasahiro Yamada WARN("LONG_LINE", 2165dd88ab32SMasahiro Yamada "line over $max_line_length characters\n" . $herecurr); 2166dd88ab32SMasahiro Yamada } 2167dd88ab32SMasahiro Yamada 2168dd88ab32SMasahiro Yamada# Check for user-visible strings broken across lines, which breaks the ability 21696b9709d9STom Rini# to grep for the string. Make exceptions when the previous string ends in a 21706b9709d9STom Rini# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{' 21716b9709d9STom Rini# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value 2172dd88ab32SMasahiro Yamada if ($line =~ /^\+\s*"/ && 2173dd88ab32SMasahiro Yamada $prevline =~ /"\s*$/ && 21746b9709d9STom Rini $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) { 2175dd88ab32SMasahiro Yamada WARN("SPLIT_STRING", 2176dd88ab32SMasahiro Yamada "quoted string split across lines\n" . $hereprev); 2177dd88ab32SMasahiro Yamada } 2178dd88ab32SMasahiro Yamada 2179dd88ab32SMasahiro Yamada# check for spaces before a quoted newline 2180dd88ab32SMasahiro Yamada if ($rawline =~ /^.*\".*\s\\n/) { 21816b9709d9STom Rini if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE", 21826b9709d9STom Rini "unnecessary whitespace before a quoted newline\n" . $herecurr) && 21836b9709d9STom Rini $fix) { 21846b9709d9STom Rini $fixed[$linenr - 1] =~ s/^(\+.*\".*)\s+\\n/$1\\n/; 21856b9709d9STom Rini } 21866b9709d9STom Rini 2187dd88ab32SMasahiro Yamada } 2188dd88ab32SMasahiro Yamada 2189dd88ab32SMasahiro Yamada# check for adding lines without a newline. 2190dd88ab32SMasahiro Yamada if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) { 2191dd88ab32SMasahiro Yamada WARN("MISSING_EOF_NEWLINE", 2192dd88ab32SMasahiro Yamada "adding a line without newline at end of file\n" . $herecurr); 2193dd88ab32SMasahiro Yamada } 2194dd88ab32SMasahiro Yamada 2195dd88ab32SMasahiro Yamada# Blackfin: use hi/lo macros 2196dd88ab32SMasahiro Yamada if ($realfile =~ m@arch/blackfin/.*\.S$@) { 2197dd88ab32SMasahiro Yamada if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) { 2198dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($line) . "\n"; 2199dd88ab32SMasahiro Yamada ERROR("LO_MACRO", 2200dd88ab32SMasahiro Yamada "use the LO() macro, not (... & 0xFFFF)\n" . $herevet); 2201dd88ab32SMasahiro Yamada } 2202dd88ab32SMasahiro Yamada if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) { 2203dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($line) . "\n"; 2204dd88ab32SMasahiro Yamada ERROR("HI_MACRO", 2205dd88ab32SMasahiro Yamada "use the HI() macro, not (... >> 16)\n" . $herevet); 2206dd88ab32SMasahiro Yamada } 2207dd88ab32SMasahiro Yamada } 2208dd88ab32SMasahiro Yamada 2209dd88ab32SMasahiro Yamada# check we are in a valid source file C or perl if not then ignore this hunk 2210dd88ab32SMasahiro Yamada next if ($realfile !~ /\.(h|c|pl)$/); 2211dd88ab32SMasahiro Yamada 2212dd88ab32SMasahiro Yamada# at the beginning of a line any tabs must come first and anything 2213dd88ab32SMasahiro Yamada# more than 8 must use tabs. 2214dd88ab32SMasahiro Yamada if ($rawline =~ /^\+\s* \t\s*\S/ || 2215dd88ab32SMasahiro Yamada $rawline =~ /^\+\s* \s*/) { 2216dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 2217dd88ab32SMasahiro Yamada $rpt_cleaners = 1; 22186b9709d9STom Rini if (ERROR("CODE_INDENT", 22196b9709d9STom Rini "code indent should use tabs where possible\n" . $herevet) && 22206b9709d9STom Rini $fix) { 22216b9709d9STom Rini $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e; 22226b9709d9STom Rini } 2223dd88ab32SMasahiro Yamada } 2224dd88ab32SMasahiro Yamada 2225dd88ab32SMasahiro Yamada# check for space before tabs. 2226dd88ab32SMasahiro Yamada if ($rawline =~ /^\+/ && $rawline =~ / \t/) { 2227dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 22286b9709d9STom Rini if (WARN("SPACE_BEFORE_TAB", 22296b9709d9STom Rini "please, no space before tabs\n" . $herevet) && 22306b9709d9STom Rini $fix) { 22316b9709d9STom Rini while ($fixed[$linenr - 1] =~ 2232e3a4facdSJoe Perches s/(^\+.*) {8,8}\t/$1\t\t/) {} 22336b9709d9STom Rini while ($fixed[$linenr - 1] =~ 22346b9709d9STom Rini s/(^\+.*) +\t/$1\t/) {} 22356b9709d9STom Rini } 2236dd88ab32SMasahiro Yamada } 2237dd88ab32SMasahiro Yamada 2238dd88ab32SMasahiro Yamada# check for && or || at the start of a line 2239dd88ab32SMasahiro Yamada if ($rawline =~ /^\+\s*(&&|\|\|)/) { 2240dd88ab32SMasahiro Yamada CHK("LOGICAL_CONTINUATIONS", 2241dd88ab32SMasahiro Yamada "Logical continuations should be on the previous line\n" . $hereprev); 2242dd88ab32SMasahiro Yamada } 2243dd88ab32SMasahiro Yamada 2244dd88ab32SMasahiro Yamada# check multi-line statement indentation matches previous line 2245dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 2246dd88ab32SMasahiro Yamada $prevline =~ /^\+(\t*)(if \(|$Ident\().*(\&\&|\|\||,)\s*$/) { 2247dd88ab32SMasahiro Yamada $prevline =~ /^\+(\t*)(.*)$/; 2248dd88ab32SMasahiro Yamada my $oldindent = $1; 2249dd88ab32SMasahiro Yamada my $rest = $2; 2250dd88ab32SMasahiro Yamada 2251dd88ab32SMasahiro Yamada my $pos = pos_last_openparen($rest); 2252dd88ab32SMasahiro Yamada if ($pos >= 0) { 2253dd88ab32SMasahiro Yamada $line =~ /^(\+| )([ \t]*)/; 2254dd88ab32SMasahiro Yamada my $newindent = $2; 2255dd88ab32SMasahiro Yamada 2256dd88ab32SMasahiro Yamada my $goodtabindent = $oldindent . 2257dd88ab32SMasahiro Yamada "\t" x ($pos / 8) . 2258dd88ab32SMasahiro Yamada " " x ($pos % 8); 2259dd88ab32SMasahiro Yamada my $goodspaceindent = $oldindent . " " x $pos; 2260dd88ab32SMasahiro Yamada 2261dd88ab32SMasahiro Yamada if ($newindent ne $goodtabindent && 2262dd88ab32SMasahiro Yamada $newindent ne $goodspaceindent) { 22636b9709d9STom Rini 22646b9709d9STom Rini if (CHK("PARENTHESIS_ALIGNMENT", 22656b9709d9STom Rini "Alignment should match open parenthesis\n" . $hereprev) && 22666b9709d9STom Rini $fix && $line =~ /^\+/) { 22676b9709d9STom Rini $fixed[$linenr - 1] =~ 22686b9709d9STom Rini s/^\+[ \t]*/\+$goodtabindent/; 22696b9709d9STom Rini } 2270dd88ab32SMasahiro Yamada } 2271dd88ab32SMasahiro Yamada } 2272dd88ab32SMasahiro Yamada } 2273dd88ab32SMasahiro Yamada 22746b9709d9STom Rini if ($line =~ /^\+.*\*[ \t]*\)[ \t]+(?!$Assignment|$Arithmetic)/) { 22756b9709d9STom Rini if (CHK("SPACING", 22766b9709d9STom Rini "No space is necessary after a cast\n" . $hereprev) && 22776b9709d9STom Rini $fix) { 22786b9709d9STom Rini $fixed[$linenr - 1] =~ 22796b9709d9STom Rini s/^(\+.*\*[ \t]*\))[ \t]+/$1/; 22806b9709d9STom Rini } 2281dd88ab32SMasahiro Yamada } 2282dd88ab32SMasahiro Yamada 2283dd88ab32SMasahiro Yamada if ($realfile =~ m@^(drivers/net/|net/)@ && 22846b9709d9STom Rini $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ && 22856b9709d9STom Rini $rawline =~ /^\+[ \t]*\*/) { 2286dd88ab32SMasahiro Yamada WARN("NETWORKING_BLOCK_COMMENT_STYLE", 2287dd88ab32SMasahiro Yamada "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev); 2288dd88ab32SMasahiro Yamada } 2289dd88ab32SMasahiro Yamada 2290dd88ab32SMasahiro Yamada if ($realfile =~ m@^(drivers/net/|net/)@ && 22916b9709d9STom Rini $prevrawline =~ /^\+[ \t]*\/\*/ && #starting /* 22926b9709d9STom Rini $prevrawline !~ /\*\/[ \t]*$/ && #no trailing */ 22936b9709d9STom Rini $rawline =~ /^\+/ && #line is new 22946b9709d9STom Rini $rawline !~ /^\+[ \t]*\*/) { #no leading * 22956b9709d9STom Rini WARN("NETWORKING_BLOCK_COMMENT_STYLE", 22966b9709d9STom Rini "networking block comments start with * on subsequent lines\n" . $hereprev); 22976b9709d9STom Rini } 22986b9709d9STom Rini 22996b9709d9STom Rini if ($realfile =~ m@^(drivers/net/|net/)@ && 2300dd88ab32SMasahiro Yamada $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */ 2301dd88ab32SMasahiro Yamada $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/ 2302dd88ab32SMasahiro Yamada $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/ 2303dd88ab32SMasahiro Yamada $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */ 2304dd88ab32SMasahiro Yamada WARN("NETWORKING_BLOCK_COMMENT_STYLE", 2305dd88ab32SMasahiro Yamada "networking block comments put the trailing */ on a separate line\n" . $herecurr); 2306dd88ab32SMasahiro Yamada } 2307dd88ab32SMasahiro Yamada 2308dd88ab32SMasahiro Yamada# check for spaces at the beginning of a line. 2309dd88ab32SMasahiro Yamada# Exceptions: 2310dd88ab32SMasahiro Yamada# 1) within comments 2311dd88ab32SMasahiro Yamada# 2) indented preprocessor commands 2312dd88ab32SMasahiro Yamada# 3) hanging labels 23136b9709d9STom Rini if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) { 2314dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 23156b9709d9STom Rini if (WARN("LEADING_SPACE", 23166b9709d9STom Rini "please, no spaces at the start of a line\n" . $herevet) && 23176b9709d9STom Rini $fix) { 23186b9709d9STom Rini $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e; 23196b9709d9STom Rini } 2320dd88ab32SMasahiro Yamada } 2321dd88ab32SMasahiro Yamada 2322dd88ab32SMasahiro Yamada# check we are in a valid C source file if not then ignore this hunk 2323dd88ab32SMasahiro Yamada next if ($realfile !~ /\.(h|c)$/); 2324dd88ab32SMasahiro Yamada 2325dd88ab32SMasahiro Yamada# discourage the addition of CONFIG_EXPERIMENTAL in #if(def). 2326dd88ab32SMasahiro Yamada if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) { 2327dd88ab32SMasahiro Yamada WARN("CONFIG_EXPERIMENTAL", 2328dd88ab32SMasahiro Yamada "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n"); 2329dd88ab32SMasahiro Yamada } 2330dd88ab32SMasahiro Yamada 2331dd88ab32SMasahiro Yamada# check for RCS/CVS revision markers 2332dd88ab32SMasahiro Yamada if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) { 2333dd88ab32SMasahiro Yamada WARN("CVS_KEYWORD", 2334dd88ab32SMasahiro Yamada "CVS style keyword markers, these will _not_ be updated\n". $herecurr); 2335dd88ab32SMasahiro Yamada } 2336dd88ab32SMasahiro Yamada 2337dd88ab32SMasahiro Yamada# Blackfin: don't use __builtin_bfin_[cs]sync 2338dd88ab32SMasahiro Yamada if ($line =~ /__builtin_bfin_csync/) { 2339dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($line) . "\n"; 2340dd88ab32SMasahiro Yamada ERROR("CSYNC", 2341dd88ab32SMasahiro Yamada "use the CSYNC() macro in asm/blackfin.h\n" . $herevet); 2342dd88ab32SMasahiro Yamada } 2343dd88ab32SMasahiro Yamada if ($line =~ /__builtin_bfin_ssync/) { 2344dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($line) . "\n"; 2345dd88ab32SMasahiro Yamada ERROR("SSYNC", 2346dd88ab32SMasahiro Yamada "use the SSYNC() macro in asm/blackfin.h\n" . $herevet); 2347dd88ab32SMasahiro Yamada } 2348dd88ab32SMasahiro Yamada 2349dd88ab32SMasahiro Yamada# check for old HOTPLUG __dev<foo> section markings 2350dd88ab32SMasahiro Yamada if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) { 2351dd88ab32SMasahiro Yamada WARN("HOTPLUG_SECTION", 2352dd88ab32SMasahiro Yamada "Using $1 is unnecessary\n" . $herecurr); 2353dd88ab32SMasahiro Yamada } 2354dd88ab32SMasahiro Yamada 2355dd88ab32SMasahiro Yamada# Check for potential 'bare' types 2356dd88ab32SMasahiro Yamada my ($stat, $cond, $line_nr_next, $remain_next, $off_next, 2357dd88ab32SMasahiro Yamada $realline_next); 2358dd88ab32SMasahiro Yamada#print "LINE<$line>\n"; 2359dd88ab32SMasahiro Yamada if ($linenr >= $suppress_statement && 23606b9709d9STom Rini $realcnt && $sline =~ /.\s*\S/) { 2361dd88ab32SMasahiro Yamada ($stat, $cond, $line_nr_next, $remain_next, $off_next) = 2362dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0); 2363dd88ab32SMasahiro Yamada $stat =~ s/\n./\n /g; 2364dd88ab32SMasahiro Yamada $cond =~ s/\n./\n /g; 2365dd88ab32SMasahiro Yamada 2366dd88ab32SMasahiro Yamada#print "linenr<$linenr> <$stat>\n"; 2367dd88ab32SMasahiro Yamada # If this statement has no statement boundaries within 2368dd88ab32SMasahiro Yamada # it there is no point in retrying a statement scan 2369dd88ab32SMasahiro Yamada # until we hit end of it. 2370dd88ab32SMasahiro Yamada my $frag = $stat; $frag =~ s/;+\s*$//; 2371dd88ab32SMasahiro Yamada if ($frag !~ /(?:{|;)/) { 2372dd88ab32SMasahiro Yamada#print "skip<$line_nr_next>\n"; 2373dd88ab32SMasahiro Yamada $suppress_statement = $line_nr_next; 2374dd88ab32SMasahiro Yamada } 2375dd88ab32SMasahiro Yamada 2376dd88ab32SMasahiro Yamada # Find the real next line. 2377dd88ab32SMasahiro Yamada $realline_next = $line_nr_next; 2378dd88ab32SMasahiro Yamada if (defined $realline_next && 2379dd88ab32SMasahiro Yamada (!defined $lines[$realline_next - 1] || 2380dd88ab32SMasahiro Yamada substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) { 2381dd88ab32SMasahiro Yamada $realline_next++; 2382dd88ab32SMasahiro Yamada } 2383dd88ab32SMasahiro Yamada 2384dd88ab32SMasahiro Yamada my $s = $stat; 2385dd88ab32SMasahiro Yamada $s =~ s/{.*$//s; 2386dd88ab32SMasahiro Yamada 2387dd88ab32SMasahiro Yamada # Ignore goto labels. 2388dd88ab32SMasahiro Yamada if ($s =~ /$Ident:\*$/s) { 2389dd88ab32SMasahiro Yamada 2390dd88ab32SMasahiro Yamada # Ignore functions being called 2391dd88ab32SMasahiro Yamada } elsif ($s =~ /^.\s*$Ident\s*\(/s) { 2392dd88ab32SMasahiro Yamada 2393dd88ab32SMasahiro Yamada } elsif ($s =~ /^.\s*else\b/s) { 2394dd88ab32SMasahiro Yamada 2395dd88ab32SMasahiro Yamada # declarations always start with types 2396dd88ab32SMasahiro Yamada } 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) { 2397dd88ab32SMasahiro Yamada my $type = $1; 2398dd88ab32SMasahiro Yamada $type =~ s/\s+/ /g; 2399dd88ab32SMasahiro Yamada possible($type, "A:" . $s); 2400dd88ab32SMasahiro Yamada 2401dd88ab32SMasahiro Yamada # definitions in global scope can only start with types 2402dd88ab32SMasahiro Yamada } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) { 2403dd88ab32SMasahiro Yamada possible($1, "B:" . $s); 2404dd88ab32SMasahiro Yamada } 2405dd88ab32SMasahiro Yamada 2406dd88ab32SMasahiro Yamada # any (foo ... *) is a pointer cast, and foo is a type 2407dd88ab32SMasahiro Yamada while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) { 2408dd88ab32SMasahiro Yamada possible($1, "C:" . $s); 2409dd88ab32SMasahiro Yamada } 2410dd88ab32SMasahiro Yamada 2411dd88ab32SMasahiro Yamada # Check for any sort of function declaration. 2412dd88ab32SMasahiro Yamada # int foo(something bar, other baz); 2413dd88ab32SMasahiro Yamada # void (*store_gdt)(x86_descr_ptr *); 2414dd88ab32SMasahiro Yamada if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) { 2415dd88ab32SMasahiro Yamada my ($name_len) = length($1); 2416dd88ab32SMasahiro Yamada 2417dd88ab32SMasahiro Yamada my $ctx = $s; 2418dd88ab32SMasahiro Yamada substr($ctx, 0, $name_len + 1, ''); 2419dd88ab32SMasahiro Yamada $ctx =~ s/\)[^\)]*$//; 2420dd88ab32SMasahiro Yamada 2421dd88ab32SMasahiro Yamada for my $arg (split(/\s*,\s*/, $ctx)) { 2422dd88ab32SMasahiro Yamada if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) { 2423dd88ab32SMasahiro Yamada 2424dd88ab32SMasahiro Yamada possible($1, "D:" . $s); 2425dd88ab32SMasahiro Yamada } 2426dd88ab32SMasahiro Yamada } 2427dd88ab32SMasahiro Yamada } 2428dd88ab32SMasahiro Yamada 2429dd88ab32SMasahiro Yamada } 2430dd88ab32SMasahiro Yamada 2431dd88ab32SMasahiro Yamada# 2432dd88ab32SMasahiro Yamada# Checks which may be anchored in the context. 2433dd88ab32SMasahiro Yamada# 2434dd88ab32SMasahiro Yamada 2435dd88ab32SMasahiro Yamada# Check for switch () and associated case and default 2436dd88ab32SMasahiro Yamada# statements should be at the same indent. 2437dd88ab32SMasahiro Yamada if ($line=~/\bswitch\s*\(.*\)/) { 2438dd88ab32SMasahiro Yamada my $err = ''; 2439dd88ab32SMasahiro Yamada my $sep = ''; 2440dd88ab32SMasahiro Yamada my @ctx = ctx_block_outer($linenr, $realcnt); 2441dd88ab32SMasahiro Yamada shift(@ctx); 2442dd88ab32SMasahiro Yamada for my $ctx (@ctx) { 2443dd88ab32SMasahiro Yamada my ($clen, $cindent) = line_stats($ctx); 2444dd88ab32SMasahiro Yamada if ($ctx =~ /^\+\s*(case\s+|default:)/ && 2445dd88ab32SMasahiro Yamada $indent != $cindent) { 2446dd88ab32SMasahiro Yamada $err .= "$sep$ctx\n"; 2447dd88ab32SMasahiro Yamada $sep = ''; 2448dd88ab32SMasahiro Yamada } else { 2449dd88ab32SMasahiro Yamada $sep = "[...]\n"; 2450dd88ab32SMasahiro Yamada } 2451dd88ab32SMasahiro Yamada } 2452dd88ab32SMasahiro Yamada if ($err ne '') { 2453dd88ab32SMasahiro Yamada ERROR("SWITCH_CASE_INDENT_LEVEL", 2454dd88ab32SMasahiro Yamada "switch and case should be at the same indent\n$hereline$err"); 2455dd88ab32SMasahiro Yamada } 2456dd88ab32SMasahiro Yamada } 2457dd88ab32SMasahiro Yamada 2458dd88ab32SMasahiro Yamada# if/while/etc brace do not go on next line, unless defining a do while loop, 2459dd88ab32SMasahiro Yamada# or if that brace on the next line is for something else 2460dd88ab32SMasahiro Yamada if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) { 2461dd88ab32SMasahiro Yamada my $pre_ctx = "$1$2"; 2462dd88ab32SMasahiro Yamada 2463dd88ab32SMasahiro Yamada my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); 2464dd88ab32SMasahiro Yamada 2465dd88ab32SMasahiro Yamada if ($line =~ /^\+\t{6,}/) { 2466dd88ab32SMasahiro Yamada WARN("DEEP_INDENTATION", 2467dd88ab32SMasahiro Yamada "Too many leading tabs - consider code refactoring\n" . $herecurr); 2468dd88ab32SMasahiro Yamada } 2469dd88ab32SMasahiro Yamada 2470dd88ab32SMasahiro Yamada my $ctx_cnt = $realcnt - $#ctx - 1; 2471dd88ab32SMasahiro Yamada my $ctx = join("\n", @ctx); 2472dd88ab32SMasahiro Yamada 2473dd88ab32SMasahiro Yamada my $ctx_ln = $linenr; 2474dd88ab32SMasahiro Yamada my $ctx_skip = $realcnt; 2475dd88ab32SMasahiro Yamada 2476dd88ab32SMasahiro Yamada while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt && 2477dd88ab32SMasahiro Yamada defined $lines[$ctx_ln - 1] && 2478dd88ab32SMasahiro Yamada $lines[$ctx_ln - 1] =~ /^-/)) { 2479dd88ab32SMasahiro Yamada ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n"; 2480dd88ab32SMasahiro Yamada $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/); 2481dd88ab32SMasahiro Yamada $ctx_ln++; 2482dd88ab32SMasahiro Yamada } 2483dd88ab32SMasahiro Yamada 2484dd88ab32SMasahiro Yamada #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n"; 2485dd88ab32SMasahiro Yamada #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n"; 2486dd88ab32SMasahiro Yamada 2487dd88ab32SMasahiro Yamada if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) { 2488dd88ab32SMasahiro Yamada ERROR("OPEN_BRACE", 2489dd88ab32SMasahiro Yamada "that open brace { should be on the previous line\n" . 2490dd88ab32SMasahiro Yamada "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n"); 2491dd88ab32SMasahiro Yamada } 2492dd88ab32SMasahiro Yamada if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ && 2493dd88ab32SMasahiro Yamada $ctx =~ /\)\s*\;\s*$/ && 2494dd88ab32SMasahiro Yamada defined $lines[$ctx_ln - 1]) 2495dd88ab32SMasahiro Yamada { 2496dd88ab32SMasahiro Yamada my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]); 2497dd88ab32SMasahiro Yamada if ($nindent > $indent) { 2498dd88ab32SMasahiro Yamada WARN("TRAILING_SEMICOLON", 2499dd88ab32SMasahiro Yamada "trailing semicolon indicates no statements, indent implies otherwise\n" . 2500dd88ab32SMasahiro Yamada "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n"); 2501dd88ab32SMasahiro Yamada } 2502dd88ab32SMasahiro Yamada } 2503dd88ab32SMasahiro Yamada } 2504dd88ab32SMasahiro Yamada 2505dd88ab32SMasahiro Yamada# Check relative indent for conditionals and blocks. 2506dd88ab32SMasahiro Yamada if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) { 2507dd88ab32SMasahiro Yamada ($stat, $cond, $line_nr_next, $remain_next, $off_next) = 2508dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0) 2509dd88ab32SMasahiro Yamada if (!defined $stat); 2510dd88ab32SMasahiro Yamada my ($s, $c) = ($stat, $cond); 2511dd88ab32SMasahiro Yamada 2512dd88ab32SMasahiro Yamada substr($s, 0, length($c), ''); 2513dd88ab32SMasahiro Yamada 2514dd88ab32SMasahiro Yamada # Make sure we remove the line prefixes as we have 2515dd88ab32SMasahiro Yamada # none on the first line, and are going to readd them 2516dd88ab32SMasahiro Yamada # where necessary. 2517dd88ab32SMasahiro Yamada $s =~ s/\n./\n/gs; 2518dd88ab32SMasahiro Yamada 2519dd88ab32SMasahiro Yamada # Find out how long the conditional actually is. 2520dd88ab32SMasahiro Yamada my @newlines = ($c =~ /\n/gs); 2521dd88ab32SMasahiro Yamada my $cond_lines = 1 + $#newlines; 2522dd88ab32SMasahiro Yamada 2523dd88ab32SMasahiro Yamada # We want to check the first line inside the block 2524dd88ab32SMasahiro Yamada # starting at the end of the conditional, so remove: 2525dd88ab32SMasahiro Yamada # 1) any blank line termination 2526dd88ab32SMasahiro Yamada # 2) any opening brace { on end of the line 2527dd88ab32SMasahiro Yamada # 3) any do (...) { 2528dd88ab32SMasahiro Yamada my $continuation = 0; 2529dd88ab32SMasahiro Yamada my $check = 0; 2530dd88ab32SMasahiro Yamada $s =~ s/^.*\bdo\b//; 2531dd88ab32SMasahiro Yamada $s =~ s/^\s*{//; 2532dd88ab32SMasahiro Yamada if ($s =~ s/^\s*\\//) { 2533dd88ab32SMasahiro Yamada $continuation = 1; 2534dd88ab32SMasahiro Yamada } 2535dd88ab32SMasahiro Yamada if ($s =~ s/^\s*?\n//) { 2536dd88ab32SMasahiro Yamada $check = 1; 2537dd88ab32SMasahiro Yamada $cond_lines++; 2538dd88ab32SMasahiro Yamada } 2539dd88ab32SMasahiro Yamada 2540dd88ab32SMasahiro Yamada # Also ignore a loop construct at the end of a 2541dd88ab32SMasahiro Yamada # preprocessor statement. 2542dd88ab32SMasahiro Yamada if (($prevline =~ /^.\s*#\s*define\s/ || 2543dd88ab32SMasahiro Yamada $prevline =~ /\\\s*$/) && $continuation == 0) { 2544dd88ab32SMasahiro Yamada $check = 0; 2545dd88ab32SMasahiro Yamada } 2546dd88ab32SMasahiro Yamada 2547dd88ab32SMasahiro Yamada my $cond_ptr = -1; 2548dd88ab32SMasahiro Yamada $continuation = 0; 2549dd88ab32SMasahiro Yamada while ($cond_ptr != $cond_lines) { 2550dd88ab32SMasahiro Yamada $cond_ptr = $cond_lines; 2551dd88ab32SMasahiro Yamada 2552dd88ab32SMasahiro Yamada # If we see an #else/#elif then the code 2553dd88ab32SMasahiro Yamada # is not linear. 2554dd88ab32SMasahiro Yamada if ($s =~ /^\s*\#\s*(?:else|elif)/) { 2555dd88ab32SMasahiro Yamada $check = 0; 2556dd88ab32SMasahiro Yamada } 2557dd88ab32SMasahiro Yamada 2558dd88ab32SMasahiro Yamada # Ignore: 2559dd88ab32SMasahiro Yamada # 1) blank lines, they should be at 0, 2560dd88ab32SMasahiro Yamada # 2) preprocessor lines, and 2561dd88ab32SMasahiro Yamada # 3) labels. 2562dd88ab32SMasahiro Yamada if ($continuation || 2563dd88ab32SMasahiro Yamada $s =~ /^\s*?\n/ || 2564dd88ab32SMasahiro Yamada $s =~ /^\s*#\s*?/ || 2565dd88ab32SMasahiro Yamada $s =~ /^\s*$Ident\s*:/) { 2566dd88ab32SMasahiro Yamada $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0; 2567dd88ab32SMasahiro Yamada if ($s =~ s/^.*?\n//) { 2568dd88ab32SMasahiro Yamada $cond_lines++; 2569dd88ab32SMasahiro Yamada } 2570dd88ab32SMasahiro Yamada } 2571dd88ab32SMasahiro Yamada } 2572dd88ab32SMasahiro Yamada 2573dd88ab32SMasahiro Yamada my (undef, $sindent) = line_stats("+" . $s); 2574dd88ab32SMasahiro Yamada my $stat_real = raw_line($linenr, $cond_lines); 2575dd88ab32SMasahiro Yamada 2576dd88ab32SMasahiro Yamada # Check if either of these lines are modified, else 2577dd88ab32SMasahiro Yamada # this is not this patch's fault. 2578dd88ab32SMasahiro Yamada if (!defined($stat_real) || 2579dd88ab32SMasahiro Yamada $stat !~ /^\+/ && $stat_real !~ /^\+/) { 2580dd88ab32SMasahiro Yamada $check = 0; 2581dd88ab32SMasahiro Yamada } 2582dd88ab32SMasahiro Yamada if (defined($stat_real) && $cond_lines > 1) { 2583dd88ab32SMasahiro Yamada $stat_real = "[...]\n$stat_real"; 2584dd88ab32SMasahiro Yamada } 2585dd88ab32SMasahiro Yamada 2586dd88ab32SMasahiro Yamada #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"; 2587dd88ab32SMasahiro Yamada 2588dd88ab32SMasahiro Yamada if ($check && (($sindent % 8) != 0 || 2589dd88ab32SMasahiro Yamada ($sindent <= $indent && $s ne ''))) { 2590dd88ab32SMasahiro Yamada WARN("SUSPECT_CODE_INDENT", 2591dd88ab32SMasahiro Yamada "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n"); 2592dd88ab32SMasahiro Yamada } 2593dd88ab32SMasahiro Yamada } 2594dd88ab32SMasahiro Yamada 2595dd88ab32SMasahiro Yamada # Track the 'values' across context and added lines. 2596dd88ab32SMasahiro Yamada my $opline = $line; $opline =~ s/^./ /; 2597dd88ab32SMasahiro Yamada my ($curr_values, $curr_vars) = 2598dd88ab32SMasahiro Yamada annotate_values($opline . "\n", $prev_values); 2599dd88ab32SMasahiro Yamada $curr_values = $prev_values . $curr_values; 2600dd88ab32SMasahiro Yamada if ($dbg_values) { 2601dd88ab32SMasahiro Yamada my $outline = $opline; $outline =~ s/\t/ /g; 2602dd88ab32SMasahiro Yamada print "$linenr > .$outline\n"; 2603dd88ab32SMasahiro Yamada print "$linenr > $curr_values\n"; 2604dd88ab32SMasahiro Yamada print "$linenr > $curr_vars\n"; 2605dd88ab32SMasahiro Yamada } 2606dd88ab32SMasahiro Yamada $prev_values = substr($curr_values, -1); 2607dd88ab32SMasahiro Yamada 2608dd88ab32SMasahiro Yamada#ignore lines not being added 26096b9709d9STom Rini next if ($line =~ /^[^\+]/); 2610dd88ab32SMasahiro Yamada 2611dd88ab32SMasahiro Yamada# TEST: allow direct testing of the type matcher. 2612dd88ab32SMasahiro Yamada if ($dbg_type) { 2613dd88ab32SMasahiro Yamada if ($line =~ /^.\s*$Declare\s*$/) { 2614dd88ab32SMasahiro Yamada ERROR("TEST_TYPE", 2615dd88ab32SMasahiro Yamada "TEST: is type\n" . $herecurr); 2616dd88ab32SMasahiro Yamada } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) { 2617dd88ab32SMasahiro Yamada ERROR("TEST_NOT_TYPE", 2618dd88ab32SMasahiro Yamada "TEST: is not type ($1 is)\n". $herecurr); 2619dd88ab32SMasahiro Yamada } 2620dd88ab32SMasahiro Yamada next; 2621dd88ab32SMasahiro Yamada } 2622dd88ab32SMasahiro Yamada# TEST: allow direct testing of the attribute matcher. 2623dd88ab32SMasahiro Yamada if ($dbg_attr) { 2624dd88ab32SMasahiro Yamada if ($line =~ /^.\s*$Modifier\s*$/) { 2625dd88ab32SMasahiro Yamada ERROR("TEST_ATTR", 2626dd88ab32SMasahiro Yamada "TEST: is attr\n" . $herecurr); 2627dd88ab32SMasahiro Yamada } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) { 2628dd88ab32SMasahiro Yamada ERROR("TEST_NOT_ATTR", 2629dd88ab32SMasahiro Yamada "TEST: is not attr ($1 is)\n". $herecurr); 2630dd88ab32SMasahiro Yamada } 2631dd88ab32SMasahiro Yamada next; 2632dd88ab32SMasahiro Yamada } 2633dd88ab32SMasahiro Yamada 2634dd88ab32SMasahiro Yamada# check for initialisation to aggregates open brace on the next line 2635dd88ab32SMasahiro Yamada if ($line =~ /^.\s*{/ && 2636dd88ab32SMasahiro Yamada $prevline =~ /(?:^|[^=])=\s*$/) { 2637dd88ab32SMasahiro Yamada ERROR("OPEN_BRACE", 2638dd88ab32SMasahiro Yamada "that open brace { should be on the previous line\n" . $hereprev); 2639dd88ab32SMasahiro Yamada } 2640dd88ab32SMasahiro Yamada 2641dd88ab32SMasahiro Yamada# 2642dd88ab32SMasahiro Yamada# Checks which are anchored on the added line. 2643dd88ab32SMasahiro Yamada# 2644dd88ab32SMasahiro Yamada 2645dd88ab32SMasahiro Yamada# check for malformed paths in #include statements (uses RAW line) 2646dd88ab32SMasahiro Yamada if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) { 2647dd88ab32SMasahiro Yamada my $path = $1; 2648dd88ab32SMasahiro Yamada if ($path =~ m{//}) { 2649dd88ab32SMasahiro Yamada ERROR("MALFORMED_INCLUDE", 2650dd88ab32SMasahiro Yamada "malformed #include filename\n" . $herecurr); 2651dd88ab32SMasahiro Yamada } 2652dd88ab32SMasahiro Yamada if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) { 2653dd88ab32SMasahiro Yamada ERROR("UAPI_INCLUDE", 2654dd88ab32SMasahiro Yamada "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr); 2655dd88ab32SMasahiro Yamada } 2656dd88ab32SMasahiro Yamada } 2657dd88ab32SMasahiro Yamada 2658dd88ab32SMasahiro Yamada# no C99 // comments 2659dd88ab32SMasahiro Yamada if ($line =~ m{//}) { 26606b9709d9STom Rini if (ERROR("C99_COMMENTS", 26616b9709d9STom Rini "do not use C99 // comments\n" . $herecurr) && 26626b9709d9STom Rini $fix) { 26636b9709d9STom Rini my $line = $fixed[$linenr - 1]; 26646b9709d9STom Rini if ($line =~ /\/\/(.*)$/) { 26656b9709d9STom Rini my $comment = trim($1); 26666b9709d9STom Rini $fixed[$linenr - 1] =~ s@\/\/(.*)$@/\* $comment \*/@; 26676b9709d9STom Rini } 26686b9709d9STom Rini } 2669dd88ab32SMasahiro Yamada } 2670dd88ab32SMasahiro Yamada # Remove C99 comments. 2671dd88ab32SMasahiro Yamada $line =~ s@//.*@@; 2672dd88ab32SMasahiro Yamada $opline =~ s@//.*@@; 2673dd88ab32SMasahiro Yamada 2674dd88ab32SMasahiro Yamada# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider 2675dd88ab32SMasahiro Yamada# the whole statement. 2676dd88ab32SMasahiro Yamada#print "APW <$lines[$realline_next - 1]>\n"; 2677dd88ab32SMasahiro Yamada if (defined $realline_next && 2678dd88ab32SMasahiro Yamada exists $lines[$realline_next - 1] && 2679dd88ab32SMasahiro Yamada !defined $suppress_export{$realline_next} && 2680dd88ab32SMasahiro Yamada ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ || 2681dd88ab32SMasahiro Yamada $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { 2682dd88ab32SMasahiro Yamada # Handle definitions which produce identifiers with 2683dd88ab32SMasahiro Yamada # a prefix: 2684dd88ab32SMasahiro Yamada # XXX(foo); 2685dd88ab32SMasahiro Yamada # EXPORT_SYMBOL(something_foo); 2686dd88ab32SMasahiro Yamada my $name = $1; 2687dd88ab32SMasahiro Yamada if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ && 2688dd88ab32SMasahiro Yamada $name =~ /^${Ident}_$2/) { 2689dd88ab32SMasahiro Yamada#print "FOO C name<$name>\n"; 2690dd88ab32SMasahiro Yamada $suppress_export{$realline_next} = 1; 2691dd88ab32SMasahiro Yamada 2692dd88ab32SMasahiro Yamada } elsif ($stat !~ /(?: 2693dd88ab32SMasahiro Yamada \n.}\s*$| 2694dd88ab32SMasahiro Yamada ^.DEFINE_$Ident\(\Q$name\E\)| 2695dd88ab32SMasahiro Yamada ^.DECLARE_$Ident\(\Q$name\E\)| 2696dd88ab32SMasahiro Yamada ^.LIST_HEAD\(\Q$name\E\)| 2697dd88ab32SMasahiro Yamada ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(| 2698dd88ab32SMasahiro Yamada \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\() 2699dd88ab32SMasahiro Yamada )/x) { 2700dd88ab32SMasahiro Yamada#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n"; 2701dd88ab32SMasahiro Yamada $suppress_export{$realline_next} = 2; 2702dd88ab32SMasahiro Yamada } else { 2703dd88ab32SMasahiro Yamada $suppress_export{$realline_next} = 1; 2704dd88ab32SMasahiro Yamada } 2705dd88ab32SMasahiro Yamada } 2706dd88ab32SMasahiro Yamada if (!defined $suppress_export{$linenr} && 2707dd88ab32SMasahiro Yamada $prevline =~ /^.\s*$/ && 2708dd88ab32SMasahiro Yamada ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ || 2709dd88ab32SMasahiro Yamada $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { 2710dd88ab32SMasahiro Yamada#print "FOO B <$lines[$linenr - 1]>\n"; 2711dd88ab32SMasahiro Yamada $suppress_export{$linenr} = 2; 2712dd88ab32SMasahiro Yamada } 2713dd88ab32SMasahiro Yamada if (defined $suppress_export{$linenr} && 2714dd88ab32SMasahiro Yamada $suppress_export{$linenr} == 2) { 2715dd88ab32SMasahiro Yamada WARN("EXPORT_SYMBOL", 2716dd88ab32SMasahiro Yamada "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); 2717dd88ab32SMasahiro Yamada } 2718dd88ab32SMasahiro Yamada 2719dd88ab32SMasahiro Yamada# check for global initialisers. 27206b9709d9STom Rini if ($line =~ /^\+(\s*$Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/) { 27216b9709d9STom Rini if (ERROR("GLOBAL_INITIALISERS", 2722dd88ab32SMasahiro Yamada "do not initialise globals to 0 or NULL\n" . 27236b9709d9STom Rini $herecurr) && 27246b9709d9STom Rini $fix) { 27256b9709d9STom Rini $fixed[$linenr - 1] =~ s/($Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/$1;/; 27266b9709d9STom Rini } 2727dd88ab32SMasahiro Yamada } 2728dd88ab32SMasahiro Yamada# check for static initialisers. 27296b9709d9STom Rini if ($line =~ /^\+.*\bstatic\s.*=\s*(0|NULL|false)\s*;/) { 27306b9709d9STom Rini if (ERROR("INITIALISED_STATIC", 2731dd88ab32SMasahiro Yamada "do not initialise statics to 0 or NULL\n" . 27326b9709d9STom Rini $herecurr) && 27336b9709d9STom Rini $fix) { 27346b9709d9STom Rini $fixed[$linenr - 1] =~ s/(\bstatic\s.*?)\s*=\s*(0|NULL|false)\s*;/$1;/; 27356b9709d9STom Rini } 2736dd88ab32SMasahiro Yamada } 2737dd88ab32SMasahiro Yamada 2738dd88ab32SMasahiro Yamada# check for static const char * arrays. 2739dd88ab32SMasahiro Yamada if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) { 2740dd88ab32SMasahiro Yamada WARN("STATIC_CONST_CHAR_ARRAY", 2741dd88ab32SMasahiro Yamada "static const char * array should probably be static const char * const\n" . 2742dd88ab32SMasahiro Yamada $herecurr); 2743dd88ab32SMasahiro Yamada } 2744dd88ab32SMasahiro Yamada 2745dd88ab32SMasahiro Yamada# check for static char foo[] = "bar" declarations. 2746dd88ab32SMasahiro Yamada if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) { 2747dd88ab32SMasahiro Yamada WARN("STATIC_CONST_CHAR_ARRAY", 2748dd88ab32SMasahiro Yamada "static char array declaration should probably be static const char\n" . 2749dd88ab32SMasahiro Yamada $herecurr); 2750dd88ab32SMasahiro Yamada } 2751dd88ab32SMasahiro Yamada 27526b9709d9STom Rini# check for function declarations without arguments like "int foo()" 27536b9709d9STom Rini if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) { 27546b9709d9STom Rini if (ERROR("FUNCTION_WITHOUT_ARGS", 27556b9709d9STom Rini "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) && 27566b9709d9STom Rini $fix) { 27576b9709d9STom Rini $fixed[$linenr - 1] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/; 27586b9709d9STom Rini } 27596b9709d9STom Rini } 27606b9709d9STom Rini 27616b9709d9STom Rini# check for uses of DEFINE_PCI_DEVICE_TABLE 27626b9709d9STom Rini if ($line =~ /\bDEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=/) { 27636b9709d9STom Rini if (WARN("DEFINE_PCI_DEVICE_TABLE", 27646b9709d9STom Rini "Prefer struct pci_device_id over deprecated DEFINE_PCI_DEVICE_TABLE\n" . $herecurr) && 27656b9709d9STom Rini $fix) { 27666b9709d9STom Rini $fixed[$linenr - 1] =~ s/\b(?:static\s+|)DEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=\s*/static const struct pci_device_id $1\[\] = /; 27676b9709d9STom Rini } 2768dd88ab32SMasahiro Yamada } 2769dd88ab32SMasahiro Yamada 2770dd88ab32SMasahiro Yamada# check for new typedefs, only function parameters and sparse annotations 2771dd88ab32SMasahiro Yamada# make sense. 2772dd88ab32SMasahiro Yamada if ($line =~ /\btypedef\s/ && 2773dd88ab32SMasahiro Yamada $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ && 2774dd88ab32SMasahiro Yamada $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ && 2775dd88ab32SMasahiro Yamada $line !~ /\b$typeTypedefs\b/ && 2776dd88ab32SMasahiro Yamada $line !~ /\b__bitwise(?:__|)\b/) { 2777dd88ab32SMasahiro Yamada WARN("NEW_TYPEDEFS", 2778dd88ab32SMasahiro Yamada "do not add new typedefs\n" . $herecurr); 2779dd88ab32SMasahiro Yamada } 2780dd88ab32SMasahiro Yamada 2781dd88ab32SMasahiro Yamada# * goes on variable not on type 2782dd88ab32SMasahiro Yamada # (char*[ const]) 2783dd88ab32SMasahiro Yamada while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) { 2784dd88ab32SMasahiro Yamada #print "AA<$1>\n"; 27856b9709d9STom Rini my ($ident, $from, $to) = ($1, $2, $2); 2786dd88ab32SMasahiro Yamada 2787dd88ab32SMasahiro Yamada # Should start with a space. 2788dd88ab32SMasahiro Yamada $to =~ s/^(\S)/ $1/; 2789dd88ab32SMasahiro Yamada # Should not end with a space. 2790dd88ab32SMasahiro Yamada $to =~ s/\s+$//; 2791dd88ab32SMasahiro Yamada # '*'s should not have spaces between. 2792dd88ab32SMasahiro Yamada while ($to =~ s/\*\s+\*/\*\*/) { 2793dd88ab32SMasahiro Yamada } 2794dd88ab32SMasahiro Yamada 27956b9709d9STom Rini## print "1: from<$from> to<$to> ident<$ident>\n"; 2796dd88ab32SMasahiro Yamada if ($from ne $to) { 27976b9709d9STom Rini if (ERROR("POINTER_LOCATION", 27986b9709d9STom Rini "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) && 27996b9709d9STom Rini $fix) { 28006b9709d9STom Rini my $sub_from = $ident; 28016b9709d9STom Rini my $sub_to = $ident; 28026b9709d9STom Rini $sub_to =~ s/\Q$from\E/$to/; 28036b9709d9STom Rini $fixed[$linenr - 1] =~ 28046b9709d9STom Rini s@\Q$sub_from\E@$sub_to@; 28056b9709d9STom Rini } 2806dd88ab32SMasahiro Yamada } 2807dd88ab32SMasahiro Yamada } 2808dd88ab32SMasahiro Yamada while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) { 2809dd88ab32SMasahiro Yamada #print "BB<$1>\n"; 28106b9709d9STom Rini my ($match, $from, $to, $ident) = ($1, $2, $2, $3); 2811dd88ab32SMasahiro Yamada 2812dd88ab32SMasahiro Yamada # Should start with a space. 2813dd88ab32SMasahiro Yamada $to =~ s/^(\S)/ $1/; 2814dd88ab32SMasahiro Yamada # Should not end with a space. 2815dd88ab32SMasahiro Yamada $to =~ s/\s+$//; 2816dd88ab32SMasahiro Yamada # '*'s should not have spaces between. 2817dd88ab32SMasahiro Yamada while ($to =~ s/\*\s+\*/\*\*/) { 2818dd88ab32SMasahiro Yamada } 2819dd88ab32SMasahiro Yamada # Modifiers should have spaces. 2820dd88ab32SMasahiro Yamada $to =~ s/(\b$Modifier$)/$1 /; 2821dd88ab32SMasahiro Yamada 28226b9709d9STom Rini## print "2: from<$from> to<$to> ident<$ident>\n"; 2823dd88ab32SMasahiro Yamada if ($from ne $to && $ident !~ /^$Modifier$/) { 28246b9709d9STom Rini if (ERROR("POINTER_LOCATION", 28256b9709d9STom Rini "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) && 28266b9709d9STom Rini $fix) { 28276b9709d9STom Rini 28286b9709d9STom Rini my $sub_from = $match; 28296b9709d9STom Rini my $sub_to = $match; 28306b9709d9STom Rini $sub_to =~ s/\Q$from\E/$to/; 28316b9709d9STom Rini $fixed[$linenr - 1] =~ 28326b9709d9STom Rini s@\Q$sub_from\E@$sub_to@; 28336b9709d9STom Rini } 2834dd88ab32SMasahiro Yamada } 2835dd88ab32SMasahiro Yamada } 2836dd88ab32SMasahiro Yamada 2837dd88ab32SMasahiro Yamada# # no BUG() or BUG_ON() 2838dd88ab32SMasahiro Yamada# if ($line =~ /\b(BUG|BUG_ON)\b/) { 2839dd88ab32SMasahiro Yamada# print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n"; 2840dd88ab32SMasahiro Yamada# print "$herecurr"; 2841dd88ab32SMasahiro Yamada# $clean = 0; 2842dd88ab32SMasahiro Yamada# } 2843dd88ab32SMasahiro Yamada 2844dd88ab32SMasahiro Yamada if ($line =~ /\bLINUX_VERSION_CODE\b/) { 2845dd88ab32SMasahiro Yamada WARN("LINUX_VERSION_CODE", 2846dd88ab32SMasahiro Yamada "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr); 2847dd88ab32SMasahiro Yamada } 2848dd88ab32SMasahiro Yamada 2849dd88ab32SMasahiro Yamada# check for uses of printk_ratelimit 2850dd88ab32SMasahiro Yamada if ($line =~ /\bprintk_ratelimit\s*\(/) { 2851dd88ab32SMasahiro Yamada WARN("PRINTK_RATELIMITED", 2852dd88ab32SMasahiro Yamada"Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr); 2853dd88ab32SMasahiro Yamada } 2854dd88ab32SMasahiro Yamada 2855dd88ab32SMasahiro Yamada# printk should use KERN_* levels. Note that follow on printk's on the 2856dd88ab32SMasahiro Yamada# same line do not need a level, so we use the current block context 2857dd88ab32SMasahiro Yamada# to try and find and validate the current printk. In summary the current 2858dd88ab32SMasahiro Yamada# printk includes all preceding printk's which have no newline on the end. 2859dd88ab32SMasahiro Yamada# we assume the first bad printk is the one to report. 2860dd88ab32SMasahiro Yamada if ($line =~ /\bprintk\((?!KERN_)\s*"/) { 2861dd88ab32SMasahiro Yamada my $ok = 0; 2862dd88ab32SMasahiro Yamada for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) { 2863dd88ab32SMasahiro Yamada #print "CHECK<$lines[$ln - 1]\n"; 2864dd88ab32SMasahiro Yamada # we have a preceding printk if it ends 2865dd88ab32SMasahiro Yamada # with "\n" ignore it, else it is to blame 2866dd88ab32SMasahiro Yamada if ($lines[$ln - 1] =~ m{\bprintk\(}) { 2867dd88ab32SMasahiro Yamada if ($rawlines[$ln - 1] !~ m{\\n"}) { 2868dd88ab32SMasahiro Yamada $ok = 1; 2869dd88ab32SMasahiro Yamada } 2870dd88ab32SMasahiro Yamada last; 2871dd88ab32SMasahiro Yamada } 2872dd88ab32SMasahiro Yamada } 2873dd88ab32SMasahiro Yamada if ($ok == 0) { 2874dd88ab32SMasahiro Yamada WARN("PRINTK_WITHOUT_KERN_LEVEL", 2875dd88ab32SMasahiro Yamada "printk() should include KERN_ facility level\n" . $herecurr); 2876dd88ab32SMasahiro Yamada } 2877dd88ab32SMasahiro Yamada } 2878dd88ab32SMasahiro Yamada 2879dd88ab32SMasahiro Yamada if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) { 2880dd88ab32SMasahiro Yamada my $orig = $1; 2881dd88ab32SMasahiro Yamada my $level = lc($orig); 2882dd88ab32SMasahiro Yamada $level = "warn" if ($level eq "warning"); 2883dd88ab32SMasahiro Yamada my $level2 = $level; 2884dd88ab32SMasahiro Yamada $level2 = "dbg" if ($level eq "debug"); 2885dd88ab32SMasahiro Yamada WARN("PREFER_PR_LEVEL", 2886dd88ab32SMasahiro Yamada "Prefer netdev_$level2(netdev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr); 2887dd88ab32SMasahiro Yamada } 2888dd88ab32SMasahiro Yamada 2889dd88ab32SMasahiro Yamada if ($line =~ /\bpr_warning\s*\(/) { 28906b9709d9STom Rini if (WARN("PREFER_PR_LEVEL", 28916b9709d9STom Rini "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) && 28926b9709d9STom Rini $fix) { 28936b9709d9STom Rini $fixed[$linenr - 1] =~ 28946b9709d9STom Rini s/\bpr_warning\b/pr_warn/; 28956b9709d9STom Rini } 2896dd88ab32SMasahiro Yamada } 2897dd88ab32SMasahiro Yamada 2898dd88ab32SMasahiro Yamada if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) { 2899dd88ab32SMasahiro Yamada my $orig = $1; 2900dd88ab32SMasahiro Yamada my $level = lc($orig); 2901dd88ab32SMasahiro Yamada $level = "warn" if ($level eq "warning"); 2902dd88ab32SMasahiro Yamada $level = "dbg" if ($level eq "debug"); 2903dd88ab32SMasahiro Yamada WARN("PREFER_DEV_LEVEL", 2904dd88ab32SMasahiro Yamada "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr); 2905dd88ab32SMasahiro Yamada } 2906dd88ab32SMasahiro Yamada 2907dd88ab32SMasahiro Yamada# function brace can't be on same line, except for #defines of do while, 2908dd88ab32SMasahiro Yamada# or if closed on same line 2909d8a1a304SHeiko Schocher if (($line=~/$Type\s*$Ident\(.*\).*\s\{/) and 2910d8a1a304SHeiko Schocher !($line=~/\#\s*define.*do\s\{/) and !($line=~/}/)) { 2911dd88ab32SMasahiro Yamada ERROR("OPEN_BRACE", 2912dd88ab32SMasahiro Yamada "open brace '{' following function declarations go on the next line\n" . $herecurr); 2913dd88ab32SMasahiro Yamada } 2914dd88ab32SMasahiro Yamada 2915dd88ab32SMasahiro Yamada# open braces for enum, union and struct go on the same line. 2916dd88ab32SMasahiro Yamada if ($line =~ /^.\s*{/ && 2917dd88ab32SMasahiro Yamada $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) { 2918dd88ab32SMasahiro Yamada ERROR("OPEN_BRACE", 2919dd88ab32SMasahiro Yamada "open brace '{' following $1 go on the same line\n" . $hereprev); 2920dd88ab32SMasahiro Yamada } 2921dd88ab32SMasahiro Yamada 2922dd88ab32SMasahiro Yamada# missing space after union, struct or enum definition 29236b9709d9STom Rini if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) { 29246b9709d9STom Rini if (WARN("SPACING", 29256b9709d9STom Rini "missing space after $1 definition\n" . $herecurr) && 29266b9709d9STom Rini $fix) { 29276b9709d9STom Rini $fixed[$linenr - 1] =~ 29286b9709d9STom Rini s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/; 29296b9709d9STom Rini } 29306b9709d9STom Rini } 29316b9709d9STom Rini 29326b9709d9STom Rini# Function pointer declarations 29336b9709d9STom Rini# check spacing between type, funcptr, and args 29346b9709d9STom Rini# canonical declaration is "type (*funcptr)(args...)" 29356b9709d9STom Rini# 29366b9709d9STom Rini# the $Declare variable will capture all spaces after the type 29376b9709d9STom Rini# so check it for trailing missing spaces or multiple spaces 29386b9709d9STom Rini if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)$Ident(\s*)\)(\s*)\(/) { 29396b9709d9STom Rini my $declare = $1; 29406b9709d9STom Rini my $pre_pointer_space = $2; 29416b9709d9STom Rini my $post_pointer_space = $3; 29426b9709d9STom Rini my $funcname = $4; 29436b9709d9STom Rini my $post_funcname_space = $5; 29446b9709d9STom Rini my $pre_args_space = $6; 29456b9709d9STom Rini 29466b9709d9STom Rini if ($declare !~ /\s$/) { 2947dd88ab32SMasahiro Yamada WARN("SPACING", 29486b9709d9STom Rini "missing space after return type\n" . $herecurr); 29496b9709d9STom Rini } 29506b9709d9STom Rini 29516b9709d9STom Rini# unnecessary space "type (*funcptr)(args...)" 29526b9709d9STom Rini elsif ($declare =~ /\s{2,}$/) { 29536b9709d9STom Rini WARN("SPACING", 29546b9709d9STom Rini "Multiple spaces after return type\n" . $herecurr); 29556b9709d9STom Rini } 29566b9709d9STom Rini 29576b9709d9STom Rini# unnecessary space "type ( *funcptr)(args...)" 29586b9709d9STom Rini if (defined $pre_pointer_space && 29596b9709d9STom Rini $pre_pointer_space =~ /^\s/) { 29606b9709d9STom Rini WARN("SPACING", 29616b9709d9STom Rini "Unnecessary space after function pointer open parenthesis\n" . $herecurr); 29626b9709d9STom Rini } 29636b9709d9STom Rini 29646b9709d9STom Rini# unnecessary space "type (* funcptr)(args...)" 29656b9709d9STom Rini if (defined $post_pointer_space && 29666b9709d9STom Rini $post_pointer_space =~ /^\s/) { 29676b9709d9STom Rini WARN("SPACING", 29686b9709d9STom Rini "Unnecessary space before function pointer name\n" . $herecurr); 29696b9709d9STom Rini } 29706b9709d9STom Rini 29716b9709d9STom Rini# unnecessary space "type (*funcptr )(args...)" 29726b9709d9STom Rini if (defined $post_funcname_space && 29736b9709d9STom Rini $post_funcname_space =~ /^\s/) { 29746b9709d9STom Rini WARN("SPACING", 29756b9709d9STom Rini "Unnecessary space after function pointer name\n" . $herecurr); 29766b9709d9STom Rini } 29776b9709d9STom Rini 29786b9709d9STom Rini# unnecessary space "type (*funcptr) (args...)" 29796b9709d9STom Rini if (defined $pre_args_space && 29806b9709d9STom Rini $pre_args_space =~ /^\s/) { 29816b9709d9STom Rini WARN("SPACING", 29826b9709d9STom Rini "Unnecessary space before function pointer arguments\n" . $herecurr); 29836b9709d9STom Rini } 29846b9709d9STom Rini 29856b9709d9STom Rini if (show_type("SPACING") && $fix) { 29866b9709d9STom Rini $fixed[$linenr - 1] =~ 29876b9709d9STom Rini s/^(.\s*$Declare)\(\s*\*\s*($Ident)\s*\)\s*\(/rtrim($1) . " " . "\(\*$2\)\("/ex; 29886b9709d9STom Rini } 2989dd88ab32SMasahiro Yamada } 2990dd88ab32SMasahiro Yamada 2991dd88ab32SMasahiro Yamada# check for spacing round square brackets; allowed: 2992dd88ab32SMasahiro Yamada# 1. with a type on the left -- int [] a; 2993dd88ab32SMasahiro Yamada# 2. at the beginning of a line for slice initialisers -- [0...10] = 5, 2994dd88ab32SMasahiro Yamada# 3. inside a curly brace -- = { [0...10] = 5 } 2995dd88ab32SMasahiro Yamada while ($line =~ /(.*?\s)\[/g) { 2996dd88ab32SMasahiro Yamada my ($where, $prefix) = ($-[1], $1); 2997dd88ab32SMasahiro Yamada if ($prefix !~ /$Type\s+$/ && 2998dd88ab32SMasahiro Yamada ($where != 0 || $prefix !~ /^.\s+$/) && 2999dd88ab32SMasahiro Yamada $prefix !~ /[{,]\s+$/) { 30006b9709d9STom Rini if (ERROR("BRACKET_SPACE", 30016b9709d9STom Rini "space prohibited before open square bracket '['\n" . $herecurr) && 30026b9709d9STom Rini $fix) { 30036b9709d9STom Rini $fixed[$linenr - 1] =~ 30046b9709d9STom Rini s/^(\+.*?)\s+\[/$1\[/; 30056b9709d9STom Rini } 3006dd88ab32SMasahiro Yamada } 3007dd88ab32SMasahiro Yamada } 3008dd88ab32SMasahiro Yamada 3009dd88ab32SMasahiro Yamada# check for spaces between functions and their parentheses. 3010dd88ab32SMasahiro Yamada while ($line =~ /($Ident)\s+\(/g) { 3011dd88ab32SMasahiro Yamada my $name = $1; 3012dd88ab32SMasahiro Yamada my $ctx_before = substr($line, 0, $-[1]); 3013dd88ab32SMasahiro Yamada my $ctx = "$ctx_before$name"; 3014dd88ab32SMasahiro Yamada 3015dd88ab32SMasahiro Yamada # Ignore those directives where spaces _are_ permitted. 3016dd88ab32SMasahiro Yamada if ($name =~ /^(?: 3017dd88ab32SMasahiro Yamada if|for|while|switch|return|case| 3018dd88ab32SMasahiro Yamada volatile|__volatile__| 3019dd88ab32SMasahiro Yamada __attribute__|format|__extension__| 3020dd88ab32SMasahiro Yamada asm|__asm__)$/x) 3021dd88ab32SMasahiro Yamada { 3022dd88ab32SMasahiro Yamada # cpp #define statements have non-optional spaces, ie 3023dd88ab32SMasahiro Yamada # if there is a space between the name and the open 3024dd88ab32SMasahiro Yamada # parenthesis it is simply not a parameter group. 3025dd88ab32SMasahiro Yamada } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) { 3026dd88ab32SMasahiro Yamada 3027dd88ab32SMasahiro Yamada # cpp #elif statement condition may start with a ( 3028dd88ab32SMasahiro Yamada } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) { 3029dd88ab32SMasahiro Yamada 3030dd88ab32SMasahiro Yamada # If this whole things ends with a type its most 3031dd88ab32SMasahiro Yamada # likely a typedef for a function. 3032dd88ab32SMasahiro Yamada } elsif ($ctx =~ /$Type$/) { 3033dd88ab32SMasahiro Yamada 3034dd88ab32SMasahiro Yamada } else { 30356b9709d9STom Rini if (WARN("SPACING", 30366b9709d9STom Rini "space prohibited between function name and open parenthesis '('\n" . $herecurr) && 30376b9709d9STom Rini $fix) { 30386b9709d9STom Rini $fixed[$linenr - 1] =~ 30396b9709d9STom Rini s/\b$name\s+\(/$name\(/; 3040dd88ab32SMasahiro Yamada } 3041dd88ab32SMasahiro Yamada } 3042dd88ab32SMasahiro Yamada } 3043dd88ab32SMasahiro Yamada 3044dd88ab32SMasahiro Yamada# Check operator spacing. 3045dd88ab32SMasahiro Yamada if (!($line=~/\#\s*include/)) { 30466b9709d9STom Rini my $fixed_line = ""; 30476b9709d9STom Rini my $line_fixed = 0; 30486b9709d9STom Rini 3049dd88ab32SMasahiro Yamada my $ops = qr{ 3050dd88ab32SMasahiro Yamada <<=|>>=|<=|>=|==|!=| 3051dd88ab32SMasahiro Yamada \+=|-=|\*=|\/=|%=|\^=|\|=|&=| 3052dd88ab32SMasahiro Yamada =>|->|<<|>>|<|>|=|!|~| 3053dd88ab32SMasahiro Yamada &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%| 30546b9709d9STom Rini \?:|\?|: 3055dd88ab32SMasahiro Yamada }x; 3056dd88ab32SMasahiro Yamada my @elements = split(/($ops|;)/, $opline); 30576b9709d9STom Rini 30586b9709d9STom Rini## print("element count: <" . $#elements . ">\n"); 30596b9709d9STom Rini## foreach my $el (@elements) { 30606b9709d9STom Rini## print("el: <$el>\n"); 30616b9709d9STom Rini## } 30626b9709d9STom Rini 30636b9709d9STom Rini my @fix_elements = (); 3064dd88ab32SMasahiro Yamada my $off = 0; 3065dd88ab32SMasahiro Yamada 30666b9709d9STom Rini foreach my $el (@elements) { 30676b9709d9STom Rini push(@fix_elements, substr($rawline, $off, length($el))); 30686b9709d9STom Rini $off += length($el); 30696b9709d9STom Rini } 30706b9709d9STom Rini 30716b9709d9STom Rini $off = 0; 30726b9709d9STom Rini 3073dd88ab32SMasahiro Yamada my $blank = copy_spacing($opline); 30746b9709d9STom Rini my $last_after = -1; 3075dd88ab32SMasahiro Yamada 3076dd88ab32SMasahiro Yamada for (my $n = 0; $n < $#elements; $n += 2) { 30776b9709d9STom Rini 30786b9709d9STom Rini my $good = $fix_elements[$n] . $fix_elements[$n + 1]; 30796b9709d9STom Rini 30806b9709d9STom Rini## print("n: <$n> good: <$good>\n"); 30816b9709d9STom Rini 3082dd88ab32SMasahiro Yamada $off += length($elements[$n]); 3083dd88ab32SMasahiro Yamada 3084dd88ab32SMasahiro Yamada # Pick up the preceding and succeeding characters. 3085dd88ab32SMasahiro Yamada my $ca = substr($opline, 0, $off); 3086dd88ab32SMasahiro Yamada my $cc = ''; 3087dd88ab32SMasahiro Yamada if (length($opline) >= ($off + length($elements[$n + 1]))) { 3088dd88ab32SMasahiro Yamada $cc = substr($opline, $off + length($elements[$n + 1])); 3089dd88ab32SMasahiro Yamada } 3090dd88ab32SMasahiro Yamada my $cb = "$ca$;$cc"; 3091dd88ab32SMasahiro Yamada 3092dd88ab32SMasahiro Yamada my $a = ''; 3093dd88ab32SMasahiro Yamada $a = 'V' if ($elements[$n] ne ''); 3094dd88ab32SMasahiro Yamada $a = 'W' if ($elements[$n] =~ /\s$/); 3095dd88ab32SMasahiro Yamada $a = 'C' if ($elements[$n] =~ /$;$/); 3096dd88ab32SMasahiro Yamada $a = 'B' if ($elements[$n] =~ /(\[|\()$/); 3097dd88ab32SMasahiro Yamada $a = 'O' if ($elements[$n] eq ''); 3098dd88ab32SMasahiro Yamada $a = 'E' if ($ca =~ /^\s*$/); 3099dd88ab32SMasahiro Yamada 3100dd88ab32SMasahiro Yamada my $op = $elements[$n + 1]; 3101dd88ab32SMasahiro Yamada 3102dd88ab32SMasahiro Yamada my $c = ''; 3103dd88ab32SMasahiro Yamada if (defined $elements[$n + 2]) { 3104dd88ab32SMasahiro Yamada $c = 'V' if ($elements[$n + 2] ne ''); 3105dd88ab32SMasahiro Yamada $c = 'W' if ($elements[$n + 2] =~ /^\s/); 3106dd88ab32SMasahiro Yamada $c = 'C' if ($elements[$n + 2] =~ /^$;/); 3107dd88ab32SMasahiro Yamada $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/); 3108dd88ab32SMasahiro Yamada $c = 'O' if ($elements[$n + 2] eq ''); 3109dd88ab32SMasahiro Yamada $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/); 3110dd88ab32SMasahiro Yamada } else { 3111dd88ab32SMasahiro Yamada $c = 'E'; 3112dd88ab32SMasahiro Yamada } 3113dd88ab32SMasahiro Yamada 3114dd88ab32SMasahiro Yamada my $ctx = "${a}x${c}"; 3115dd88ab32SMasahiro Yamada 3116dd88ab32SMasahiro Yamada my $at = "(ctx:$ctx)"; 3117dd88ab32SMasahiro Yamada 3118dd88ab32SMasahiro Yamada my $ptr = substr($blank, 0, $off) . "^"; 3119dd88ab32SMasahiro Yamada my $hereptr = "$hereline$ptr\n"; 3120dd88ab32SMasahiro Yamada 3121dd88ab32SMasahiro Yamada # Pull out the value of this operator. 3122dd88ab32SMasahiro Yamada my $op_type = substr($curr_values, $off + 1, 1); 3123dd88ab32SMasahiro Yamada 3124dd88ab32SMasahiro Yamada # Get the full operator variant. 3125dd88ab32SMasahiro Yamada my $opv = $op . substr($curr_vars, $off, 1); 3126dd88ab32SMasahiro Yamada 3127dd88ab32SMasahiro Yamada # Ignore operators passed as parameters. 3128dd88ab32SMasahiro Yamada if ($op_type ne 'V' && 3129dd88ab32SMasahiro Yamada $ca =~ /\s$/ && $cc =~ /^\s*,/) { 3130dd88ab32SMasahiro Yamada 3131dd88ab32SMasahiro Yamada# # Ignore comments 3132dd88ab32SMasahiro Yamada# } elsif ($op =~ /^$;+$/) { 3133dd88ab32SMasahiro Yamada 3134dd88ab32SMasahiro Yamada # ; should have either the end of line or a space or \ after it 3135dd88ab32SMasahiro Yamada } elsif ($op eq ';') { 3136dd88ab32SMasahiro Yamada if ($ctx !~ /.x[WEBC]/ && 3137dd88ab32SMasahiro Yamada $cc !~ /^\\/ && $cc !~ /^;/) { 31386b9709d9STom Rini if (ERROR("SPACING", 31396b9709d9STom Rini "space required after that '$op' $at\n" . $hereptr)) { 31406b9709d9STom Rini $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " "; 31416b9709d9STom Rini $line_fixed = 1; 31426b9709d9STom Rini } 3143dd88ab32SMasahiro Yamada } 3144dd88ab32SMasahiro Yamada 3145dd88ab32SMasahiro Yamada # // is a comment 3146dd88ab32SMasahiro Yamada } elsif ($op eq '//') { 3147dd88ab32SMasahiro Yamada 3148dd88ab32SMasahiro Yamada # No spaces for: 3149dd88ab32SMasahiro Yamada # -> 3150dd88ab32SMasahiro Yamada # : when part of a bitfield 3151dd88ab32SMasahiro Yamada } elsif ($op eq '->' || $opv eq ':B') { 3152dd88ab32SMasahiro Yamada if ($ctx =~ /Wx.|.xW/) { 31536b9709d9STom Rini if (ERROR("SPACING", 31546b9709d9STom Rini "spaces prohibited around that '$op' $at\n" . $hereptr)) { 31556b9709d9STom Rini $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); 31566b9709d9STom Rini if (defined $fix_elements[$n + 2]) { 31576b9709d9STom Rini $fix_elements[$n + 2] =~ s/^\s+//; 31586b9709d9STom Rini } 31596b9709d9STom Rini $line_fixed = 1; 31606b9709d9STom Rini } 3161dd88ab32SMasahiro Yamada } 3162dd88ab32SMasahiro Yamada 3163dd88ab32SMasahiro Yamada # , must have a space on the right. 3164dd88ab32SMasahiro Yamada } elsif ($op eq ',') { 3165dd88ab32SMasahiro Yamada if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) { 31666b9709d9STom Rini if (ERROR("SPACING", 31676b9709d9STom Rini "space required after that '$op' $at\n" . $hereptr)) { 31686b9709d9STom Rini $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " "; 31696b9709d9STom Rini $line_fixed = 1; 31706b9709d9STom Rini $last_after = $n; 31716b9709d9STom Rini } 3172dd88ab32SMasahiro Yamada } 3173dd88ab32SMasahiro Yamada 3174dd88ab32SMasahiro Yamada # '*' as part of a type definition -- reported already. 3175dd88ab32SMasahiro Yamada } elsif ($opv eq '*_') { 3176dd88ab32SMasahiro Yamada #warn "'*' is part of type\n"; 3177dd88ab32SMasahiro Yamada 3178dd88ab32SMasahiro Yamada # unary operators should have a space before and 3179dd88ab32SMasahiro Yamada # none after. May be left adjacent to another 3180dd88ab32SMasahiro Yamada # unary operator, or a cast 3181dd88ab32SMasahiro Yamada } elsif ($op eq '!' || $op eq '~' || 3182dd88ab32SMasahiro Yamada $opv eq '*U' || $opv eq '-U' || 3183dd88ab32SMasahiro Yamada $opv eq '&U' || $opv eq '&&U') { 3184dd88ab32SMasahiro Yamada if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { 31856b9709d9STom Rini if (ERROR("SPACING", 31866b9709d9STom Rini "space required before that '$op' $at\n" . $hereptr)) { 31876b9709d9STom Rini if ($n != $last_after + 2) { 31886b9709d9STom Rini $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]); 31896b9709d9STom Rini $line_fixed = 1; 31906b9709d9STom Rini } 31916b9709d9STom Rini } 3192dd88ab32SMasahiro Yamada } 3193dd88ab32SMasahiro Yamada if ($op eq '*' && $cc =~/\s*$Modifier\b/) { 3194dd88ab32SMasahiro Yamada # A unary '*' may be const 3195dd88ab32SMasahiro Yamada 3196dd88ab32SMasahiro Yamada } elsif ($ctx =~ /.xW/) { 31976b9709d9STom Rini if (ERROR("SPACING", 31986b9709d9STom Rini "space prohibited after that '$op' $at\n" . $hereptr)) { 31996b9709d9STom Rini $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]); 32006b9709d9STom Rini if (defined $fix_elements[$n + 2]) { 32016b9709d9STom Rini $fix_elements[$n + 2] =~ s/^\s+//; 32026b9709d9STom Rini } 32036b9709d9STom Rini $line_fixed = 1; 32046b9709d9STom Rini } 3205dd88ab32SMasahiro Yamada } 3206dd88ab32SMasahiro Yamada 3207dd88ab32SMasahiro Yamada # unary ++ and unary -- are allowed no space on one side. 3208dd88ab32SMasahiro Yamada } elsif ($op eq '++' or $op eq '--') { 3209dd88ab32SMasahiro Yamada if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) { 32106b9709d9STom Rini if (ERROR("SPACING", 32116b9709d9STom Rini "space required one side of that '$op' $at\n" . $hereptr)) { 32126b9709d9STom Rini $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " "; 32136b9709d9STom Rini $line_fixed = 1; 32146b9709d9STom Rini } 3215dd88ab32SMasahiro Yamada } 3216dd88ab32SMasahiro Yamada if ($ctx =~ /Wx[BE]/ || 3217dd88ab32SMasahiro Yamada ($ctx =~ /Wx./ && $cc =~ /^;/)) { 32186b9709d9STom Rini if (ERROR("SPACING", 32196b9709d9STom Rini "space prohibited before that '$op' $at\n" . $hereptr)) { 32206b9709d9STom Rini $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); 32216b9709d9STom Rini $line_fixed = 1; 32226b9709d9STom Rini } 3223dd88ab32SMasahiro Yamada } 3224dd88ab32SMasahiro Yamada if ($ctx =~ /ExW/) { 32256b9709d9STom Rini if (ERROR("SPACING", 32266b9709d9STom Rini "space prohibited after that '$op' $at\n" . $hereptr)) { 32276b9709d9STom Rini $good = $fix_elements[$n] . trim($fix_elements[$n + 1]); 32286b9709d9STom Rini if (defined $fix_elements[$n + 2]) { 32296b9709d9STom Rini $fix_elements[$n + 2] =~ s/^\s+//; 3230dd88ab32SMasahiro Yamada } 32316b9709d9STom Rini $line_fixed = 1; 32326b9709d9STom Rini } 32336b9709d9STom Rini } 3234dd88ab32SMasahiro Yamada 3235dd88ab32SMasahiro Yamada # << and >> may either have or not have spaces both sides 3236dd88ab32SMasahiro Yamada } elsif ($op eq '<<' or $op eq '>>' or 3237dd88ab32SMasahiro Yamada $op eq '&' or $op eq '^' or $op eq '|' or 3238dd88ab32SMasahiro Yamada $op eq '+' or $op eq '-' or 3239dd88ab32SMasahiro Yamada $op eq '*' or $op eq '/' or 3240dd88ab32SMasahiro Yamada $op eq '%') 3241dd88ab32SMasahiro Yamada { 3242dd88ab32SMasahiro Yamada if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) { 32436b9709d9STom Rini if (ERROR("SPACING", 32446b9709d9STom Rini "need consistent spacing around '$op' $at\n" . $hereptr)) { 32456b9709d9STom Rini $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " "; 32466b9709d9STom Rini if (defined $fix_elements[$n + 2]) { 32476b9709d9STom Rini $fix_elements[$n + 2] =~ s/^\s+//; 32486b9709d9STom Rini } 32496b9709d9STom Rini $line_fixed = 1; 32506b9709d9STom Rini } 3251dd88ab32SMasahiro Yamada } 3252dd88ab32SMasahiro Yamada 3253dd88ab32SMasahiro Yamada # A colon needs no spaces before when it is 3254dd88ab32SMasahiro Yamada # terminating a case value or a label. 3255dd88ab32SMasahiro Yamada } elsif ($opv eq ':C' || $opv eq ':L') { 3256dd88ab32SMasahiro Yamada if ($ctx =~ /Wx./) { 32576b9709d9STom Rini if (ERROR("SPACING", 32586b9709d9STom Rini "space prohibited before that '$op' $at\n" . $hereptr)) { 32596b9709d9STom Rini $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); 32606b9709d9STom Rini $line_fixed = 1; 32616b9709d9STom Rini } 3262dd88ab32SMasahiro Yamada } 3263dd88ab32SMasahiro Yamada 3264dd88ab32SMasahiro Yamada # All the others need spaces both sides. 3265dd88ab32SMasahiro Yamada } elsif ($ctx !~ /[EWC]x[CWE]/) { 3266dd88ab32SMasahiro Yamada my $ok = 0; 3267dd88ab32SMasahiro Yamada 3268dd88ab32SMasahiro Yamada # Ignore email addresses <foo@bar> 3269dd88ab32SMasahiro Yamada if (($op eq '<' && 3270dd88ab32SMasahiro Yamada $cc =~ /^\S+\@\S+>/) || 3271dd88ab32SMasahiro Yamada ($op eq '>' && 3272dd88ab32SMasahiro Yamada $ca =~ /<\S+\@\S+$/)) 3273dd88ab32SMasahiro Yamada { 3274dd88ab32SMasahiro Yamada $ok = 1; 3275dd88ab32SMasahiro Yamada } 3276dd88ab32SMasahiro Yamada 32776b9709d9STom Rini # messages are ERROR, but ?: are CHK 3278dd88ab32SMasahiro Yamada if ($ok == 0) { 32796b9709d9STom Rini my $msg_type = \&ERROR; 32806b9709d9STom Rini $msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/); 32816b9709d9STom Rini 32826b9709d9STom Rini if (&{$msg_type}("SPACING", 32836b9709d9STom Rini "spaces required around that '$op' $at\n" . $hereptr)) { 32846b9709d9STom Rini $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " "; 32856b9709d9STom Rini if (defined $fix_elements[$n + 2]) { 32866b9709d9STom Rini $fix_elements[$n + 2] =~ s/^\s+//; 32876b9709d9STom Rini } 32886b9709d9STom Rini $line_fixed = 1; 32896b9709d9STom Rini } 3290dd88ab32SMasahiro Yamada } 3291dd88ab32SMasahiro Yamada } 3292dd88ab32SMasahiro Yamada $off += length($elements[$n + 1]); 32936b9709d9STom Rini 32946b9709d9STom Rini## print("n: <$n> GOOD: <$good>\n"); 32956b9709d9STom Rini 32966b9709d9STom Rini $fixed_line = $fixed_line . $good; 32976b9709d9STom Rini } 32986b9709d9STom Rini 32996b9709d9STom Rini if (($#elements % 2) == 0) { 33006b9709d9STom Rini $fixed_line = $fixed_line . $fix_elements[$#elements]; 33016b9709d9STom Rini } 33026b9709d9STom Rini 33036b9709d9STom Rini if ($fix && $line_fixed && $fixed_line ne $fixed[$linenr - 1]) { 33046b9709d9STom Rini $fixed[$linenr - 1] = $fixed_line; 33056b9709d9STom Rini } 33066b9709d9STom Rini 33076b9709d9STom Rini 33086b9709d9STom Rini } 33096b9709d9STom Rini 33106b9709d9STom Rini# check for whitespace before a non-naked semicolon 33116b9709d9STom Rini if ($line =~ /^\+.*\S\s+;\s*$/) { 33126b9709d9STom Rini if (WARN("SPACING", 33136b9709d9STom Rini "space prohibited before semicolon\n" . $herecurr) && 33146b9709d9STom Rini $fix) { 33156b9709d9STom Rini 1 while $fixed[$linenr - 1] =~ 33166b9709d9STom Rini s/^(\+.*\S)\s+;/$1;/; 3317dd88ab32SMasahiro Yamada } 3318dd88ab32SMasahiro Yamada } 3319dd88ab32SMasahiro Yamada 3320dd88ab32SMasahiro Yamada# check for multiple assignments 3321dd88ab32SMasahiro Yamada if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) { 3322dd88ab32SMasahiro Yamada CHK("MULTIPLE_ASSIGNMENTS", 3323dd88ab32SMasahiro Yamada "multiple assignments should be avoided\n" . $herecurr); 3324dd88ab32SMasahiro Yamada } 3325dd88ab32SMasahiro Yamada 3326dd88ab32SMasahiro Yamada## # check for multiple declarations, allowing for a function declaration 3327dd88ab32SMasahiro Yamada## # continuation. 3328dd88ab32SMasahiro Yamada## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ && 3329dd88ab32SMasahiro Yamada## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) { 3330dd88ab32SMasahiro Yamada## 3331dd88ab32SMasahiro Yamada## # Remove any bracketed sections to ensure we do not 3332dd88ab32SMasahiro Yamada## # falsly report the parameters of functions. 3333dd88ab32SMasahiro Yamada## my $ln = $line; 3334dd88ab32SMasahiro Yamada## while ($ln =~ s/\([^\(\)]*\)//g) { 3335dd88ab32SMasahiro Yamada## } 3336dd88ab32SMasahiro Yamada## if ($ln =~ /,/) { 3337dd88ab32SMasahiro Yamada## WARN("MULTIPLE_DECLARATION", 3338dd88ab32SMasahiro Yamada## "declaring multiple variables together should be avoided\n" . $herecurr); 3339dd88ab32SMasahiro Yamada## } 3340dd88ab32SMasahiro Yamada## } 3341dd88ab32SMasahiro Yamada 3342dd88ab32SMasahiro Yamada#need space before brace following if, while, etc 3343d8a1a304SHeiko Schocher if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\){/) || 3344d8a1a304SHeiko Schocher $line =~ /do\{/) { 33456b9709d9STom Rini if (ERROR("SPACING", 33466b9709d9STom Rini "space required before the open brace '{'\n" . $herecurr) && 33476b9709d9STom Rini $fix) { 33486b9709d9STom Rini $fixed[$linenr - 1] =~ s/^(\+.*(?:do|\))){/$1 {/; 3349dd88ab32SMasahiro Yamada } 33506b9709d9STom Rini } 33516b9709d9STom Rini 33526b9709d9STom Rini## # check for blank lines before declarations 33536b9709d9STom Rini## if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ && 33546b9709d9STom Rini## $prevrawline =~ /^.\s*$/) { 33556b9709d9STom Rini## WARN("SPACING", 33566b9709d9STom Rini## "No blank lines before declarations\n" . $hereprev); 33576b9709d9STom Rini## } 33586b9709d9STom Rini## 3359dd88ab32SMasahiro Yamada 3360dd88ab32SMasahiro Yamada# closing brace should have a space following it when it has anything 3361dd88ab32SMasahiro Yamada# on the line 3362dd88ab32SMasahiro Yamada if ($line =~ /}(?!(?:,|;|\)))\S/) { 33636b9709d9STom Rini if (ERROR("SPACING", 33646b9709d9STom Rini "space required after that close brace '}'\n" . $herecurr) && 33656b9709d9STom Rini $fix) { 33666b9709d9STom Rini $fixed[$linenr - 1] =~ 33676b9709d9STom Rini s/}((?!(?:,|;|\)))\S)/} $1/; 33686b9709d9STom Rini } 3369dd88ab32SMasahiro Yamada } 3370dd88ab32SMasahiro Yamada 3371dd88ab32SMasahiro Yamada# check spacing on square brackets 3372dd88ab32SMasahiro Yamada if ($line =~ /\[\s/ && $line !~ /\[\s*$/) { 33736b9709d9STom Rini if (ERROR("SPACING", 33746b9709d9STom Rini "space prohibited after that open square bracket '['\n" . $herecurr) && 33756b9709d9STom Rini $fix) { 33766b9709d9STom Rini $fixed[$linenr - 1] =~ 33776b9709d9STom Rini s/\[\s+/\[/; 33786b9709d9STom Rini } 3379dd88ab32SMasahiro Yamada } 3380dd88ab32SMasahiro Yamada if ($line =~ /\s\]/) { 33816b9709d9STom Rini if (ERROR("SPACING", 33826b9709d9STom Rini "space prohibited before that close square bracket ']'\n" . $herecurr) && 33836b9709d9STom Rini $fix) { 33846b9709d9STom Rini $fixed[$linenr - 1] =~ 33856b9709d9STom Rini s/\s+\]/\]/; 33866b9709d9STom Rini } 3387dd88ab32SMasahiro Yamada } 3388dd88ab32SMasahiro Yamada 3389dd88ab32SMasahiro Yamada# check spacing on parentheses 3390dd88ab32SMasahiro Yamada if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ && 3391dd88ab32SMasahiro Yamada $line !~ /for\s*\(\s+;/) { 33926b9709d9STom Rini if (ERROR("SPACING", 33936b9709d9STom Rini "space prohibited after that open parenthesis '('\n" . $herecurr) && 33946b9709d9STom Rini $fix) { 33956b9709d9STom Rini $fixed[$linenr - 1] =~ 33966b9709d9STom Rini s/\(\s+/\(/; 33976b9709d9STom Rini } 3398dd88ab32SMasahiro Yamada } 3399dd88ab32SMasahiro Yamada if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ && 3400dd88ab32SMasahiro Yamada $line !~ /for\s*\(.*;\s+\)/ && 3401dd88ab32SMasahiro Yamada $line !~ /:\s+\)/) { 34026b9709d9STom Rini if (ERROR("SPACING", 34036b9709d9STom Rini "space prohibited before that close parenthesis ')'\n" . $herecurr) && 34046b9709d9STom Rini $fix) { 34056b9709d9STom Rini $fixed[$linenr - 1] =~ 34066b9709d9STom Rini s/\s+\)/\)/; 34076b9709d9STom Rini } 3408dd88ab32SMasahiro Yamada } 3409dd88ab32SMasahiro Yamada 3410dd88ab32SMasahiro Yamada#goto labels aren't indented, allow a single space however 3411dd88ab32SMasahiro Yamada if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and 3412dd88ab32SMasahiro Yamada !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) { 34136b9709d9STom Rini if (WARN("INDENTED_LABEL", 34146b9709d9STom Rini "labels should not be indented\n" . $herecurr) && 34156b9709d9STom Rini $fix) { 34166b9709d9STom Rini $fixed[$linenr - 1] =~ 34176b9709d9STom Rini s/^(.)\s+/$1/; 34186b9709d9STom Rini } 3419dd88ab32SMasahiro Yamada } 3420dd88ab32SMasahiro Yamada 3421dd88ab32SMasahiro Yamada# Return is not a function. 34226b9709d9STom Rini if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) { 3423dd88ab32SMasahiro Yamada my $spacing = $1; 34246b9709d9STom Rini if ($^V && $^V ge 5.10.0 && 34256b9709d9STom Rini $stat =~ /^.\s*return\s*$balanced_parens\s*;\s*$/) { 3426dd88ab32SMasahiro Yamada ERROR("RETURN_PARENTHESES", 3427dd88ab32SMasahiro Yamada "return is not a function, parentheses are not required\n" . $herecurr); 3428dd88ab32SMasahiro Yamada 3429dd88ab32SMasahiro Yamada } elsif ($spacing !~ /\s+/) { 3430dd88ab32SMasahiro Yamada ERROR("SPACING", 3431dd88ab32SMasahiro Yamada "space required before the open parenthesis '('\n" . $herecurr); 3432dd88ab32SMasahiro Yamada } 3433dd88ab32SMasahiro Yamada } 34346b9709d9STom Rini 34356b9709d9STom Rini# if statements using unnecessary parentheses - ie: if ((foo == bar)) 34366b9709d9STom Rini if ($^V && $^V ge 5.10.0 && 34376b9709d9STom Rini $line =~ /\bif\s*((?:\(\s*){2,})/) { 34386b9709d9STom Rini my $openparens = $1; 34396b9709d9STom Rini my $count = $openparens =~ tr@\(@\(@; 34406b9709d9STom Rini my $msg = ""; 34416b9709d9STom Rini if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) { 34426b9709d9STom Rini my $comp = $4; #Not $1 because of $LvalOrFunc 34436b9709d9STom Rini $msg = " - maybe == should be = ?" if ($comp eq "=="); 34446b9709d9STom Rini WARN("UNNECESSARY_PARENTHESES", 34456b9709d9STom Rini "Unnecessary parentheses$msg\n" . $herecurr); 34466b9709d9STom Rini } 34476b9709d9STom Rini } 34486b9709d9STom Rini 3449dd88ab32SMasahiro Yamada# Return of what appears to be an errno should normally be -'ve 3450dd88ab32SMasahiro Yamada if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) { 3451dd88ab32SMasahiro Yamada my $name = $1; 3452dd88ab32SMasahiro Yamada if ($name ne 'EOF' && $name ne 'ERROR') { 3453dd88ab32SMasahiro Yamada WARN("USE_NEGATIVE_ERRNO", 3454dd88ab32SMasahiro Yamada "return of an errno should typically be -ve (return -$1)\n" . $herecurr); 3455dd88ab32SMasahiro Yamada } 3456dd88ab32SMasahiro Yamada } 3457dd88ab32SMasahiro Yamada 3458dd88ab32SMasahiro Yamada# Need a space before open parenthesis after if, while etc 3459dd88ab32SMasahiro Yamada if ($line =~ /\b(if|while|for|switch)\(/) { 34606b9709d9STom Rini if (ERROR("SPACING", 34616b9709d9STom Rini "space required before the open parenthesis '('\n" . $herecurr) && 34626b9709d9STom Rini $fix) { 34636b9709d9STom Rini $fixed[$linenr - 1] =~ 34646b9709d9STom Rini s/\b(if|while|for|switch)\(/$1 \(/; 34656b9709d9STom Rini } 3466dd88ab32SMasahiro Yamada } 3467dd88ab32SMasahiro Yamada 3468dd88ab32SMasahiro Yamada# Check for illegal assignment in if conditional -- and check for trailing 3469dd88ab32SMasahiro Yamada# statements after the conditional. 3470dd88ab32SMasahiro Yamada if ($line =~ /do\s*(?!{)/) { 3471dd88ab32SMasahiro Yamada ($stat, $cond, $line_nr_next, $remain_next, $off_next) = 3472dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0) 3473dd88ab32SMasahiro Yamada if (!defined $stat); 3474dd88ab32SMasahiro Yamada my ($stat_next) = ctx_statement_block($line_nr_next, 3475dd88ab32SMasahiro Yamada $remain_next, $off_next); 3476dd88ab32SMasahiro Yamada $stat_next =~ s/\n./\n /g; 3477dd88ab32SMasahiro Yamada ##print "stat<$stat> stat_next<$stat_next>\n"; 3478dd88ab32SMasahiro Yamada 3479dd88ab32SMasahiro Yamada if ($stat_next =~ /^\s*while\b/) { 3480dd88ab32SMasahiro Yamada # If the statement carries leading newlines, 3481dd88ab32SMasahiro Yamada # then count those as offsets. 3482dd88ab32SMasahiro Yamada my ($whitespace) = 3483dd88ab32SMasahiro Yamada ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s); 3484dd88ab32SMasahiro Yamada my $offset = 3485dd88ab32SMasahiro Yamada statement_rawlines($whitespace) - 1; 3486dd88ab32SMasahiro Yamada 3487dd88ab32SMasahiro Yamada $suppress_whiletrailers{$line_nr_next + 3488dd88ab32SMasahiro Yamada $offset} = 1; 3489dd88ab32SMasahiro Yamada } 3490dd88ab32SMasahiro Yamada } 3491dd88ab32SMasahiro Yamada if (!defined $suppress_whiletrailers{$linenr} && 34926b9709d9STom Rini defined($stat) && defined($cond) && 3493dd88ab32SMasahiro Yamada $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) { 3494dd88ab32SMasahiro Yamada my ($s, $c) = ($stat, $cond); 3495dd88ab32SMasahiro Yamada 3496dd88ab32SMasahiro Yamada if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) { 3497dd88ab32SMasahiro Yamada ERROR("ASSIGN_IN_IF", 3498dd88ab32SMasahiro Yamada "do not use assignment in if condition\n" . $herecurr); 3499dd88ab32SMasahiro Yamada } 3500dd88ab32SMasahiro Yamada 3501dd88ab32SMasahiro Yamada # Find out what is on the end of the line after the 3502dd88ab32SMasahiro Yamada # conditional. 3503dd88ab32SMasahiro Yamada substr($s, 0, length($c), ''); 3504dd88ab32SMasahiro Yamada $s =~ s/\n.*//g; 3505dd88ab32SMasahiro Yamada $s =~ s/$;//g; # Remove any comments 3506dd88ab32SMasahiro Yamada if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ && 3507dd88ab32SMasahiro Yamada $c !~ /}\s*while\s*/) 3508dd88ab32SMasahiro Yamada { 3509dd88ab32SMasahiro Yamada # Find out how long the conditional actually is. 3510dd88ab32SMasahiro Yamada my @newlines = ($c =~ /\n/gs); 3511dd88ab32SMasahiro Yamada my $cond_lines = 1 + $#newlines; 3512dd88ab32SMasahiro Yamada my $stat_real = ''; 3513dd88ab32SMasahiro Yamada 3514dd88ab32SMasahiro Yamada $stat_real = raw_line($linenr, $cond_lines) 3515dd88ab32SMasahiro Yamada . "\n" if ($cond_lines); 3516dd88ab32SMasahiro Yamada if (defined($stat_real) && $cond_lines > 1) { 3517dd88ab32SMasahiro Yamada $stat_real = "[...]\n$stat_real"; 3518dd88ab32SMasahiro Yamada } 3519dd88ab32SMasahiro Yamada 3520dd88ab32SMasahiro Yamada ERROR("TRAILING_STATEMENTS", 3521dd88ab32SMasahiro Yamada "trailing statements should be on next line\n" . $herecurr . $stat_real); 3522dd88ab32SMasahiro Yamada } 3523dd88ab32SMasahiro Yamada } 3524dd88ab32SMasahiro Yamada 3525dd88ab32SMasahiro Yamada# Check for bitwise tests written as boolean 3526dd88ab32SMasahiro Yamada if ($line =~ / 3527dd88ab32SMasahiro Yamada (?: 3528dd88ab32SMasahiro Yamada (?:\[|\(|\&\&|\|\|) 3529dd88ab32SMasahiro Yamada \s*0[xX][0-9]+\s* 3530dd88ab32SMasahiro Yamada (?:\&\&|\|\|) 3531dd88ab32SMasahiro Yamada | 3532dd88ab32SMasahiro Yamada (?:\&\&|\|\|) 3533dd88ab32SMasahiro Yamada \s*0[xX][0-9]+\s* 3534dd88ab32SMasahiro Yamada (?:\&\&|\|\||\)|\]) 3535dd88ab32SMasahiro Yamada )/x) 3536dd88ab32SMasahiro Yamada { 3537dd88ab32SMasahiro Yamada WARN("HEXADECIMAL_BOOLEAN_TEST", 3538dd88ab32SMasahiro Yamada "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr); 3539dd88ab32SMasahiro Yamada } 3540dd88ab32SMasahiro Yamada 3541dd88ab32SMasahiro Yamada# if and else should not have general statements after it 3542dd88ab32SMasahiro Yamada if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) { 3543dd88ab32SMasahiro Yamada my $s = $1; 3544dd88ab32SMasahiro Yamada $s =~ s/$;//g; # Remove any comments 3545dd88ab32SMasahiro Yamada if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) { 3546dd88ab32SMasahiro Yamada ERROR("TRAILING_STATEMENTS", 3547dd88ab32SMasahiro Yamada "trailing statements should be on next line\n" . $herecurr); 3548dd88ab32SMasahiro Yamada } 3549dd88ab32SMasahiro Yamada } 3550dd88ab32SMasahiro Yamada# if should not continue a brace 3551dd88ab32SMasahiro Yamada if ($line =~ /}\s*if\b/) { 3552dd88ab32SMasahiro Yamada ERROR("TRAILING_STATEMENTS", 3553dd88ab32SMasahiro Yamada "trailing statements should be on next line\n" . 3554dd88ab32SMasahiro Yamada $herecurr); 3555dd88ab32SMasahiro Yamada } 3556dd88ab32SMasahiro Yamada# case and default should not have general statements after them 3557dd88ab32SMasahiro Yamada if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g && 3558dd88ab32SMasahiro Yamada $line !~ /\G(?: 3559dd88ab32SMasahiro Yamada (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$| 3560dd88ab32SMasahiro Yamada \s*return\s+ 3561dd88ab32SMasahiro Yamada )/xg) 3562dd88ab32SMasahiro Yamada { 3563dd88ab32SMasahiro Yamada ERROR("TRAILING_STATEMENTS", 3564dd88ab32SMasahiro Yamada "trailing statements should be on next line\n" . $herecurr); 3565dd88ab32SMasahiro Yamada } 3566dd88ab32SMasahiro Yamada 3567dd88ab32SMasahiro Yamada # Check for }<nl>else {, these must be at the same 3568dd88ab32SMasahiro Yamada # indent level to be relevant to each other. 3569dd88ab32SMasahiro Yamada if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and 3570dd88ab32SMasahiro Yamada $previndent == $indent) { 3571dd88ab32SMasahiro Yamada ERROR("ELSE_AFTER_BRACE", 3572dd88ab32SMasahiro Yamada "else should follow close brace '}'\n" . $hereprev); 3573dd88ab32SMasahiro Yamada } 3574dd88ab32SMasahiro Yamada 3575dd88ab32SMasahiro Yamada if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and 3576dd88ab32SMasahiro Yamada $previndent == $indent) { 3577dd88ab32SMasahiro Yamada my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); 3578dd88ab32SMasahiro Yamada 3579dd88ab32SMasahiro Yamada # Find out what is on the end of the line after the 3580dd88ab32SMasahiro Yamada # conditional. 3581dd88ab32SMasahiro Yamada substr($s, 0, length($c), ''); 3582dd88ab32SMasahiro Yamada $s =~ s/\n.*//g; 3583dd88ab32SMasahiro Yamada 3584dd88ab32SMasahiro Yamada if ($s =~ /^\s*;/) { 3585dd88ab32SMasahiro Yamada ERROR("WHILE_AFTER_BRACE", 3586dd88ab32SMasahiro Yamada "while should follow close brace '}'\n" . $hereprev); 3587dd88ab32SMasahiro Yamada } 3588dd88ab32SMasahiro Yamada } 3589dd88ab32SMasahiro Yamada 35906b9709d9STom Rini#Specific variable tests 3591dd88ab32SMasahiro Yamada while ($line =~ m{($Constant|$Lval)}g) { 3592dd88ab32SMasahiro Yamada my $var = $1; 35936b9709d9STom Rini 35946b9709d9STom Rini#gcc binary extension 35956b9709d9STom Rini if ($var =~ /^$Binary$/) { 35966b9709d9STom Rini if (WARN("GCC_BINARY_CONSTANT", 35976b9709d9STom Rini "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) && 35986b9709d9STom Rini $fix) { 35996b9709d9STom Rini my $hexval = sprintf("0x%x", oct($var)); 36006b9709d9STom Rini $fixed[$linenr - 1] =~ 36016b9709d9STom Rini s/\b$var\b/$hexval/; 36026b9709d9STom Rini } 36036b9709d9STom Rini } 36046b9709d9STom Rini 36056b9709d9STom Rini#CamelCase 36066b9709d9STom Rini if ($var !~ /^$Constant$/ && 36076b9709d9STom Rini $var =~ /[A-Z][a-z]|[a-z][A-Z]/ && 36086b9709d9STom Rini#Ignore Page<foo> variants 36096b9709d9STom Rini $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ && 36106b9709d9STom Rini#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show) 36116b9709d9STom Rini $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/) { 36126b9709d9STom Rini while ($var =~ m{($Ident)}g) { 36136b9709d9STom Rini my $word = $1; 36146b9709d9STom Rini next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/); 36156b9709d9STom Rini if ($check) { 36166b9709d9STom Rini seed_camelcase_includes(); 36176b9709d9STom Rini if (!$file && !$camelcase_file_seeded) { 36186b9709d9STom Rini seed_camelcase_file($realfile); 36196b9709d9STom Rini $camelcase_file_seeded = 1; 36206b9709d9STom Rini } 36216b9709d9STom Rini } 36226b9709d9STom Rini if (!defined $camelcase{$word}) { 36236b9709d9STom Rini $camelcase{$word} = 1; 36246b9709d9STom Rini CHK("CAMELCASE", 36256b9709d9STom Rini "Avoid CamelCase: <$word>\n" . $herecurr); 36266b9709d9STom Rini } 36276b9709d9STom Rini } 3628dd88ab32SMasahiro Yamada } 3629dd88ab32SMasahiro Yamada } 3630dd88ab32SMasahiro Yamada 3631dd88ab32SMasahiro Yamada#no spaces allowed after \ in define 36326b9709d9STom Rini if ($line =~ /\#\s*define.*\\\s+$/) { 36336b9709d9STom Rini if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION", 36346b9709d9STom Rini "Whitespace after \\ makes next lines useless\n" . $herecurr) && 36356b9709d9STom Rini $fix) { 36366b9709d9STom Rini $fixed[$linenr - 1] =~ s/\s+$//; 36376b9709d9STom Rini } 3638dd88ab32SMasahiro Yamada } 3639dd88ab32SMasahiro Yamada 3640dd88ab32SMasahiro Yamada#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line) 3641dd88ab32SMasahiro Yamada if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) { 3642dd88ab32SMasahiro Yamada my $file = "$1.h"; 3643dd88ab32SMasahiro Yamada my $checkfile = "include/linux/$file"; 3644dd88ab32SMasahiro Yamada if (-f "$root/$checkfile" && 3645dd88ab32SMasahiro Yamada $realfile ne $checkfile && 3646dd88ab32SMasahiro Yamada $1 !~ /$allowed_asm_includes/) 3647dd88ab32SMasahiro Yamada { 3648dd88ab32SMasahiro Yamada if ($realfile =~ m{^arch/}) { 3649dd88ab32SMasahiro Yamada CHK("ARCH_INCLUDE_LINUX", 3650dd88ab32SMasahiro Yamada "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr); 3651dd88ab32SMasahiro Yamada } else { 3652dd88ab32SMasahiro Yamada WARN("INCLUDE_LINUX", 3653dd88ab32SMasahiro Yamada "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr); 3654dd88ab32SMasahiro Yamada } 3655dd88ab32SMasahiro Yamada } 3656dd88ab32SMasahiro Yamada } 3657dd88ab32SMasahiro Yamada 3658dd88ab32SMasahiro Yamada# multi-statement macros should be enclosed in a do while loop, grab the 3659dd88ab32SMasahiro Yamada# first statement and ensure its the whole macro if its not enclosed 3660dd88ab32SMasahiro Yamada# in a known good container 3661dd88ab32SMasahiro Yamada if ($realfile !~ m@/vmlinux.lds.h$@ && 3662dd88ab32SMasahiro Yamada $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) { 3663dd88ab32SMasahiro Yamada my $ln = $linenr; 3664dd88ab32SMasahiro Yamada my $cnt = $realcnt; 3665dd88ab32SMasahiro Yamada my ($off, $dstat, $dcond, $rest); 3666dd88ab32SMasahiro Yamada my $ctx = ''; 3667dd88ab32SMasahiro Yamada ($dstat, $dcond, $ln, $cnt, $off) = 3668dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0); 3669dd88ab32SMasahiro Yamada $ctx = $dstat; 3670dd88ab32SMasahiro Yamada #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n"; 3671dd88ab32SMasahiro Yamada #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n"; 3672dd88ab32SMasahiro Yamada 3673dd88ab32SMasahiro Yamada $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//; 3674dd88ab32SMasahiro Yamada $dstat =~ s/$;//g; 3675dd88ab32SMasahiro Yamada $dstat =~ s/\\\n.//g; 3676dd88ab32SMasahiro Yamada $dstat =~ s/^\s*//s; 3677dd88ab32SMasahiro Yamada $dstat =~ s/\s*$//s; 3678dd88ab32SMasahiro Yamada 3679dd88ab32SMasahiro Yamada # Flatten any parentheses and braces 3680dd88ab32SMasahiro Yamada while ($dstat =~ s/\([^\(\)]*\)/1/ || 3681dd88ab32SMasahiro Yamada $dstat =~ s/\{[^\{\}]*\}/1/ || 3682dd88ab32SMasahiro Yamada $dstat =~ s/\[[^\[\]]*\]/1/) 3683dd88ab32SMasahiro Yamada { 3684dd88ab32SMasahiro Yamada } 3685dd88ab32SMasahiro Yamada 3686dd88ab32SMasahiro Yamada # Flatten any obvious string concatentation. 3687dd88ab32SMasahiro Yamada while ($dstat =~ s/("X*")\s*$Ident/$1/ || 3688dd88ab32SMasahiro Yamada $dstat =~ s/$Ident\s*("X*")/$1/) 3689dd88ab32SMasahiro Yamada { 3690dd88ab32SMasahiro Yamada } 3691dd88ab32SMasahiro Yamada 3692dd88ab32SMasahiro Yamada my $exceptions = qr{ 3693dd88ab32SMasahiro Yamada $Declare| 3694dd88ab32SMasahiro Yamada module_param_named| 3695dd88ab32SMasahiro Yamada MODULE_PARM_DESC| 3696dd88ab32SMasahiro Yamada DECLARE_PER_CPU| 3697dd88ab32SMasahiro Yamada DEFINE_PER_CPU| 3698dd88ab32SMasahiro Yamada __typeof__\(| 3699dd88ab32SMasahiro Yamada union| 3700dd88ab32SMasahiro Yamada struct| 3701dd88ab32SMasahiro Yamada \.$Ident\s*=\s*| 3702dd88ab32SMasahiro Yamada ^\"|\"$ 3703dd88ab32SMasahiro Yamada }x; 3704dd88ab32SMasahiro Yamada #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n"; 3705dd88ab32SMasahiro Yamada if ($dstat ne '' && 3706dd88ab32SMasahiro Yamada $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(), 3707dd88ab32SMasahiro Yamada $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo(); 37086b9709d9STom Rini $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz 3709dd88ab32SMasahiro Yamada $dstat !~ /^'X'$/ && # character constants 3710dd88ab32SMasahiro Yamada $dstat !~ /$exceptions/ && 3711dd88ab32SMasahiro Yamada $dstat !~ /^\.$Ident\s*=/ && # .foo = 37126b9709d9STom Rini $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo 3713dd88ab32SMasahiro Yamada $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...) 3714dd88ab32SMasahiro Yamada $dstat !~ /^for\s*$Constant$/ && # for (...) 3715dd88ab32SMasahiro Yamada $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar() 3716dd88ab32SMasahiro Yamada $dstat !~ /^do\s*{/ && # do {... 3717d8a1a304SHeiko Schocher $dstat !~ /^\(\{/ && # ({... 37186b9709d9STom Rini $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/) 3719dd88ab32SMasahiro Yamada { 3720dd88ab32SMasahiro Yamada $ctx =~ s/\n*$//; 3721dd88ab32SMasahiro Yamada my $herectx = $here . "\n"; 3722dd88ab32SMasahiro Yamada my $cnt = statement_rawlines($ctx); 3723dd88ab32SMasahiro Yamada 3724dd88ab32SMasahiro Yamada for (my $n = 0; $n < $cnt; $n++) { 3725dd88ab32SMasahiro Yamada $herectx .= raw_line($linenr, $n) . "\n"; 3726dd88ab32SMasahiro Yamada } 3727dd88ab32SMasahiro Yamada 3728dd88ab32SMasahiro Yamada if ($dstat =~ /;/) { 3729dd88ab32SMasahiro Yamada ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE", 3730dd88ab32SMasahiro Yamada "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx"); 3731dd88ab32SMasahiro Yamada } else { 3732dd88ab32SMasahiro Yamada ERROR("COMPLEX_MACRO", 3733dd88ab32SMasahiro Yamada "Macros with complex values should be enclosed in parenthesis\n" . "$herectx"); 3734dd88ab32SMasahiro Yamada } 3735dd88ab32SMasahiro Yamada } 3736dd88ab32SMasahiro Yamada 3737dd88ab32SMasahiro Yamada# check for line continuations outside of #defines, preprocessor #, and asm 3738dd88ab32SMasahiro Yamada 3739dd88ab32SMasahiro Yamada } else { 3740dd88ab32SMasahiro Yamada if ($prevline !~ /^..*\\$/ && 3741dd88ab32SMasahiro Yamada $line !~ /^\+\s*\#.*\\$/ && # preprocessor 3742dd88ab32SMasahiro Yamada $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm 3743dd88ab32SMasahiro Yamada $line =~ /^\+.*\\$/) { 3744dd88ab32SMasahiro Yamada WARN("LINE_CONTINUATIONS", 3745dd88ab32SMasahiro Yamada "Avoid unnecessary line continuations\n" . $herecurr); 3746dd88ab32SMasahiro Yamada } 3747dd88ab32SMasahiro Yamada } 3748dd88ab32SMasahiro Yamada 3749dd88ab32SMasahiro Yamada# do {} while (0) macro tests: 3750dd88ab32SMasahiro Yamada# single-statement macros do not need to be enclosed in do while (0) loop, 3751dd88ab32SMasahiro Yamada# macro should not end with a semicolon 3752dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 3753dd88ab32SMasahiro Yamada $realfile !~ m@/vmlinux.lds.h$@ && 3754dd88ab32SMasahiro Yamada $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) { 3755dd88ab32SMasahiro Yamada my $ln = $linenr; 3756dd88ab32SMasahiro Yamada my $cnt = $realcnt; 3757dd88ab32SMasahiro Yamada my ($off, $dstat, $dcond, $rest); 3758dd88ab32SMasahiro Yamada my $ctx = ''; 3759dd88ab32SMasahiro Yamada ($dstat, $dcond, $ln, $cnt, $off) = 3760dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0); 3761dd88ab32SMasahiro Yamada $ctx = $dstat; 3762dd88ab32SMasahiro Yamada 3763dd88ab32SMasahiro Yamada $dstat =~ s/\\\n.//g; 3764dd88ab32SMasahiro Yamada 3765dd88ab32SMasahiro Yamada if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) { 3766dd88ab32SMasahiro Yamada my $stmts = $2; 3767dd88ab32SMasahiro Yamada my $semis = $3; 3768dd88ab32SMasahiro Yamada 3769dd88ab32SMasahiro Yamada $ctx =~ s/\n*$//; 3770dd88ab32SMasahiro Yamada my $cnt = statement_rawlines($ctx); 3771dd88ab32SMasahiro Yamada my $herectx = $here . "\n"; 3772dd88ab32SMasahiro Yamada 3773dd88ab32SMasahiro Yamada for (my $n = 0; $n < $cnt; $n++) { 3774dd88ab32SMasahiro Yamada $herectx .= raw_line($linenr, $n) . "\n"; 3775dd88ab32SMasahiro Yamada } 3776dd88ab32SMasahiro Yamada 3777dd88ab32SMasahiro Yamada if (($stmts =~ tr/;/;/) == 1 && 3778dd88ab32SMasahiro Yamada $stmts !~ /^\s*(if|while|for|switch)\b/) { 3779dd88ab32SMasahiro Yamada WARN("SINGLE_STATEMENT_DO_WHILE_MACRO", 3780dd88ab32SMasahiro Yamada "Single statement macros should not use a do {} while (0) loop\n" . "$herectx"); 3781dd88ab32SMasahiro Yamada } 3782dd88ab32SMasahiro Yamada if (defined $semis && $semis ne "") { 3783dd88ab32SMasahiro Yamada WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON", 3784dd88ab32SMasahiro Yamada "do {} while (0) macros should not be semicolon terminated\n" . "$herectx"); 3785dd88ab32SMasahiro Yamada } 3786dd88ab32SMasahiro Yamada } 3787dd88ab32SMasahiro Yamada } 3788dd88ab32SMasahiro Yamada 3789dd88ab32SMasahiro Yamada# make sure symbols are always wrapped with VMLINUX_SYMBOL() ... 3790dd88ab32SMasahiro Yamada# all assignments may have only one of the following with an assignment: 3791dd88ab32SMasahiro Yamada# . 3792dd88ab32SMasahiro Yamada# ALIGN(...) 3793dd88ab32SMasahiro Yamada# VMLINUX_SYMBOL(...) 3794dd88ab32SMasahiro Yamada if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) { 3795dd88ab32SMasahiro Yamada WARN("MISSING_VMLINUX_SYMBOL", 3796dd88ab32SMasahiro Yamada "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr); 3797dd88ab32SMasahiro Yamada } 3798dd88ab32SMasahiro Yamada 3799dd88ab32SMasahiro Yamada# check for redundant bracing round if etc 3800dd88ab32SMasahiro Yamada if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) { 3801dd88ab32SMasahiro Yamada my ($level, $endln, @chunks) = 3802dd88ab32SMasahiro Yamada ctx_statement_full($linenr, $realcnt, 1); 3803dd88ab32SMasahiro Yamada #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n"; 3804dd88ab32SMasahiro Yamada #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n"; 3805dd88ab32SMasahiro Yamada if ($#chunks > 0 && $level == 0) { 3806dd88ab32SMasahiro Yamada my @allowed = (); 3807dd88ab32SMasahiro Yamada my $allow = 0; 3808dd88ab32SMasahiro Yamada my $seen = 0; 3809dd88ab32SMasahiro Yamada my $herectx = $here . "\n"; 3810dd88ab32SMasahiro Yamada my $ln = $linenr - 1; 3811dd88ab32SMasahiro Yamada for my $chunk (@chunks) { 3812dd88ab32SMasahiro Yamada my ($cond, $block) = @{$chunk}; 3813dd88ab32SMasahiro Yamada 3814dd88ab32SMasahiro Yamada # If the condition carries leading newlines, then count those as offsets. 3815dd88ab32SMasahiro Yamada my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s); 3816dd88ab32SMasahiro Yamada my $offset = statement_rawlines($whitespace) - 1; 3817dd88ab32SMasahiro Yamada 3818dd88ab32SMasahiro Yamada $allowed[$allow] = 0; 3819dd88ab32SMasahiro Yamada #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n"; 3820dd88ab32SMasahiro Yamada 3821dd88ab32SMasahiro Yamada # We have looked at and allowed this specific line. 3822dd88ab32SMasahiro Yamada $suppress_ifbraces{$ln + $offset} = 1; 3823dd88ab32SMasahiro Yamada 3824dd88ab32SMasahiro Yamada $herectx .= "$rawlines[$ln + $offset]\n[...]\n"; 3825dd88ab32SMasahiro Yamada $ln += statement_rawlines($block) - 1; 3826dd88ab32SMasahiro Yamada 3827dd88ab32SMasahiro Yamada substr($block, 0, length($cond), ''); 3828dd88ab32SMasahiro Yamada 3829dd88ab32SMasahiro Yamada $seen++ if ($block =~ /^\s*{/); 3830dd88ab32SMasahiro Yamada 3831dd88ab32SMasahiro Yamada #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n"; 3832dd88ab32SMasahiro Yamada if (statement_lines($cond) > 1) { 3833dd88ab32SMasahiro Yamada #print "APW: ALLOWED: cond<$cond>\n"; 3834dd88ab32SMasahiro Yamada $allowed[$allow] = 1; 3835dd88ab32SMasahiro Yamada } 3836dd88ab32SMasahiro Yamada if ($block =~/\b(?:if|for|while)\b/) { 3837dd88ab32SMasahiro Yamada #print "APW: ALLOWED: block<$block>\n"; 3838dd88ab32SMasahiro Yamada $allowed[$allow] = 1; 3839dd88ab32SMasahiro Yamada } 3840dd88ab32SMasahiro Yamada if (statement_block_size($block) > 1) { 3841dd88ab32SMasahiro Yamada #print "APW: ALLOWED: lines block<$block>\n"; 3842dd88ab32SMasahiro Yamada $allowed[$allow] = 1; 3843dd88ab32SMasahiro Yamada } 3844dd88ab32SMasahiro Yamada $allow++; 3845dd88ab32SMasahiro Yamada } 3846dd88ab32SMasahiro Yamada if ($seen) { 3847dd88ab32SMasahiro Yamada my $sum_allowed = 0; 3848dd88ab32SMasahiro Yamada foreach (@allowed) { 3849dd88ab32SMasahiro Yamada $sum_allowed += $_; 3850dd88ab32SMasahiro Yamada } 3851dd88ab32SMasahiro Yamada if ($sum_allowed == 0) { 3852dd88ab32SMasahiro Yamada WARN("BRACES", 3853dd88ab32SMasahiro Yamada "braces {} are not necessary for any arm of this statement\n" . $herectx); 3854dd88ab32SMasahiro Yamada } elsif ($sum_allowed != $allow && 3855dd88ab32SMasahiro Yamada $seen != $allow) { 3856dd88ab32SMasahiro Yamada CHK("BRACES", 3857dd88ab32SMasahiro Yamada "braces {} should be used on all arms of this statement\n" . $herectx); 3858dd88ab32SMasahiro Yamada } 3859dd88ab32SMasahiro Yamada } 3860dd88ab32SMasahiro Yamada } 3861dd88ab32SMasahiro Yamada } 3862dd88ab32SMasahiro Yamada if (!defined $suppress_ifbraces{$linenr - 1} && 3863dd88ab32SMasahiro Yamada $line =~ /\b(if|while|for|else)\b/) { 3864dd88ab32SMasahiro Yamada my $allowed = 0; 3865dd88ab32SMasahiro Yamada 3866dd88ab32SMasahiro Yamada # Check the pre-context. 3867dd88ab32SMasahiro Yamada if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) { 3868dd88ab32SMasahiro Yamada #print "APW: ALLOWED: pre<$1>\n"; 3869dd88ab32SMasahiro Yamada $allowed = 1; 3870dd88ab32SMasahiro Yamada } 3871dd88ab32SMasahiro Yamada 3872dd88ab32SMasahiro Yamada my ($level, $endln, @chunks) = 3873dd88ab32SMasahiro Yamada ctx_statement_full($linenr, $realcnt, $-[0]); 3874dd88ab32SMasahiro Yamada 3875dd88ab32SMasahiro Yamada # Check the condition. 3876dd88ab32SMasahiro Yamada my ($cond, $block) = @{$chunks[0]}; 3877dd88ab32SMasahiro Yamada #print "CHECKING<$linenr> cond<$cond> block<$block>\n"; 3878dd88ab32SMasahiro Yamada if (defined $cond) { 3879dd88ab32SMasahiro Yamada substr($block, 0, length($cond), ''); 3880dd88ab32SMasahiro Yamada } 3881dd88ab32SMasahiro Yamada if (statement_lines($cond) > 1) { 3882dd88ab32SMasahiro Yamada #print "APW: ALLOWED: cond<$cond>\n"; 3883dd88ab32SMasahiro Yamada $allowed = 1; 3884dd88ab32SMasahiro Yamada } 3885dd88ab32SMasahiro Yamada if ($block =~/\b(?:if|for|while)\b/) { 3886dd88ab32SMasahiro Yamada #print "APW: ALLOWED: block<$block>\n"; 3887dd88ab32SMasahiro Yamada $allowed = 1; 3888dd88ab32SMasahiro Yamada } 3889dd88ab32SMasahiro Yamada if (statement_block_size($block) > 1) { 3890dd88ab32SMasahiro Yamada #print "APW: ALLOWED: lines block<$block>\n"; 3891dd88ab32SMasahiro Yamada $allowed = 1; 3892dd88ab32SMasahiro Yamada } 3893dd88ab32SMasahiro Yamada # Check the post-context. 3894dd88ab32SMasahiro Yamada if (defined $chunks[1]) { 3895dd88ab32SMasahiro Yamada my ($cond, $block) = @{$chunks[1]}; 3896dd88ab32SMasahiro Yamada if (defined $cond) { 3897dd88ab32SMasahiro Yamada substr($block, 0, length($cond), ''); 3898dd88ab32SMasahiro Yamada } 3899dd88ab32SMasahiro Yamada if ($block =~ /^\s*\{/) { 3900dd88ab32SMasahiro Yamada #print "APW: ALLOWED: chunk-1 block<$block>\n"; 3901dd88ab32SMasahiro Yamada $allowed = 1; 3902dd88ab32SMasahiro Yamada } 3903dd88ab32SMasahiro Yamada } 3904dd88ab32SMasahiro Yamada if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) { 3905dd88ab32SMasahiro Yamada my $herectx = $here . "\n"; 3906dd88ab32SMasahiro Yamada my $cnt = statement_rawlines($block); 3907dd88ab32SMasahiro Yamada 3908dd88ab32SMasahiro Yamada for (my $n = 0; $n < $cnt; $n++) { 3909dd88ab32SMasahiro Yamada $herectx .= raw_line($linenr, $n) . "\n"; 3910dd88ab32SMasahiro Yamada } 3911dd88ab32SMasahiro Yamada 3912dd88ab32SMasahiro Yamada WARN("BRACES", 3913dd88ab32SMasahiro Yamada "braces {} are not necessary for single statement blocks\n" . $herectx); 3914dd88ab32SMasahiro Yamada } 3915dd88ab32SMasahiro Yamada } 3916dd88ab32SMasahiro Yamada 3917dd88ab32SMasahiro Yamada# check for unnecessary blank lines around braces 39186b9709d9STom Rini if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) { 3919dd88ab32SMasahiro Yamada CHK("BRACES", 3920dd88ab32SMasahiro Yamada "Blank lines aren't necessary before a close brace '}'\n" . $hereprev); 3921dd88ab32SMasahiro Yamada } 39226b9709d9STom Rini if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) { 3923dd88ab32SMasahiro Yamada CHK("BRACES", 3924dd88ab32SMasahiro Yamada "Blank lines aren't necessary after an open brace '{'\n" . $hereprev); 3925dd88ab32SMasahiro Yamada } 3926dd88ab32SMasahiro Yamada 3927dd88ab32SMasahiro Yamada# no volatiles please 3928dd88ab32SMasahiro Yamada my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b}; 3929dd88ab32SMasahiro Yamada if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) { 3930dd88ab32SMasahiro Yamada WARN("VOLATILE", 3931dd88ab32SMasahiro Yamada "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr); 3932dd88ab32SMasahiro Yamada } 3933dd88ab32SMasahiro Yamada 3934dd88ab32SMasahiro Yamada# warn about #if 0 3935dd88ab32SMasahiro Yamada if ($line =~ /^.\s*\#\s*if\s+0\b/) { 3936dd88ab32SMasahiro Yamada CHK("REDUNDANT_CODE", 3937dd88ab32SMasahiro Yamada "if this code is redundant consider removing it\n" . 3938dd88ab32SMasahiro Yamada $herecurr); 3939dd88ab32SMasahiro Yamada } 3940dd88ab32SMasahiro Yamada 3941dd88ab32SMasahiro Yamada# check for needless "if (<foo>) fn(<foo>)" uses 3942dd88ab32SMasahiro Yamada if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) { 3943dd88ab32SMasahiro Yamada my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;'; 3944dd88ab32SMasahiro Yamada if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) { 3945dd88ab32SMasahiro Yamada WARN('NEEDLESS_IF', 3946dd88ab32SMasahiro Yamada "$1(NULL) is safe this check is probably not required\n" . $hereprev); 3947dd88ab32SMasahiro Yamada } 3948dd88ab32SMasahiro Yamada } 3949dd88ab32SMasahiro Yamada 39506b9709d9STom Rini# check for bad placement of section $InitAttribute (e.g.: __initdata) 39516b9709d9STom Rini if ($line =~ /(\b$InitAttribute\b)/) { 39526b9709d9STom Rini my $attr = $1; 39536b9709d9STom Rini if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) { 39546b9709d9STom Rini my $ptr = $1; 39556b9709d9STom Rini my $var = $2; 39566b9709d9STom Rini if ((($ptr =~ /\b(union|struct)\s+$attr\b/ && 39576b9709d9STom Rini ERROR("MISPLACED_INIT", 39586b9709d9STom Rini "$attr should be placed after $var\n" . $herecurr)) || 39596b9709d9STom Rini ($ptr !~ /\b(union|struct)\s+$attr\b/ && 39606b9709d9STom Rini WARN("MISPLACED_INIT", 39616b9709d9STom Rini "$attr should be placed after $var\n" . $herecurr))) && 39626b9709d9STom Rini $fix) { 39636b9709d9STom Rini $fixed[$linenr - 1] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e; 39646b9709d9STom Rini } 39656b9709d9STom Rini } 39666b9709d9STom Rini } 39676b9709d9STom Rini 39686b9709d9STom Rini# check for $InitAttributeData (ie: __initdata) with const 39696b9709d9STom Rini if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) { 39706b9709d9STom Rini my $attr = $1; 39716b9709d9STom Rini $attr =~ /($InitAttributePrefix)(.*)/; 39726b9709d9STom Rini my $attr_prefix = $1; 39736b9709d9STom Rini my $attr_type = $2; 39746b9709d9STom Rini if (ERROR("INIT_ATTRIBUTE", 39756b9709d9STom Rini "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) && 39766b9709d9STom Rini $fix) { 39776b9709d9STom Rini $fixed[$linenr - 1] =~ 39786b9709d9STom Rini s/$InitAttributeData/${attr_prefix}initconst/; 39796b9709d9STom Rini } 39806b9709d9STom Rini } 39816b9709d9STom Rini 39826b9709d9STom Rini# check for $InitAttributeConst (ie: __initconst) without const 39836b9709d9STom Rini if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) { 39846b9709d9STom Rini my $attr = $1; 39856b9709d9STom Rini if (ERROR("INIT_ATTRIBUTE", 39866b9709d9STom Rini "Use of $attr requires a separate use of const\n" . $herecurr) && 39876b9709d9STom Rini $fix) { 39886b9709d9STom Rini my $lead = $fixed[$linenr - 1] =~ 39896b9709d9STom Rini /(^\+\s*(?:static\s+))/; 39906b9709d9STom Rini $lead = rtrim($1); 39916b9709d9STom Rini $lead = "$lead " if ($lead !~ /^\+$/); 39926b9709d9STom Rini $lead = "${lead}const "; 39936b9709d9STom Rini $fixed[$linenr - 1] =~ s/(^\+\s*(?:static\s+))/$lead/; 39946b9709d9STom Rini } 39956b9709d9STom Rini } 39966b9709d9STom Rini 3997dd88ab32SMasahiro Yamada# prefer usleep_range over udelay 3998dd88ab32SMasahiro Yamada if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) { 3999dd88ab32SMasahiro Yamada # ignore udelay's < 10, however 4000dd88ab32SMasahiro Yamada if (! ($1 < 10) ) { 4001dd88ab32SMasahiro Yamada CHK("USLEEP_RANGE", 4002dd88ab32SMasahiro Yamada "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $line); 4003dd88ab32SMasahiro Yamada } 4004dd88ab32SMasahiro Yamada } 4005dd88ab32SMasahiro Yamada 4006dd88ab32SMasahiro Yamada# warn about unexpectedly long msleep's 4007dd88ab32SMasahiro Yamada if ($line =~ /\bmsleep\s*\((\d+)\);/) { 4008dd88ab32SMasahiro Yamada if ($1 < 20) { 4009dd88ab32SMasahiro Yamada WARN("MSLEEP", 4010dd88ab32SMasahiro Yamada "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $line); 4011dd88ab32SMasahiro Yamada } 4012dd88ab32SMasahiro Yamada } 4013dd88ab32SMasahiro Yamada 40146b9709d9STom Rini# check for comparisons of jiffies 40156b9709d9STom Rini if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) { 40166b9709d9STom Rini WARN("JIFFIES_COMPARISON", 40176b9709d9STom Rini "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr); 40186b9709d9STom Rini } 40196b9709d9STom Rini 40206b9709d9STom Rini# check for comparisons of get_jiffies_64() 40216b9709d9STom Rini if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) { 40226b9709d9STom Rini WARN("JIFFIES_COMPARISON", 40236b9709d9STom Rini "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr); 40246b9709d9STom Rini } 40256b9709d9STom Rini 4026dd88ab32SMasahiro Yamada# warn about #ifdefs in C files 4027dd88ab32SMasahiro Yamada# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) { 4028dd88ab32SMasahiro Yamada# print "#ifdef in C files should be avoided\n"; 4029dd88ab32SMasahiro Yamada# print "$herecurr"; 4030dd88ab32SMasahiro Yamada# $clean = 0; 4031dd88ab32SMasahiro Yamada# } 4032dd88ab32SMasahiro Yamada 4033dd88ab32SMasahiro Yamada# warn about spacing in #ifdefs 4034dd88ab32SMasahiro Yamada if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) { 40356b9709d9STom Rini if (ERROR("SPACING", 40366b9709d9STom Rini "exactly one space required after that #$1\n" . $herecurr) && 40376b9709d9STom Rini $fix) { 40386b9709d9STom Rini $fixed[$linenr - 1] =~ 40396b9709d9STom Rini s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /; 40406b9709d9STom Rini } 40416b9709d9STom Rini 4042dd88ab32SMasahiro Yamada } 4043dd88ab32SMasahiro Yamada 4044dd88ab32SMasahiro Yamada# check for spinlock_t definitions without a comment. 4045dd88ab32SMasahiro Yamada if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ || 4046dd88ab32SMasahiro Yamada $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) { 4047dd88ab32SMasahiro Yamada my $which = $1; 4048dd88ab32SMasahiro Yamada if (!ctx_has_comment($first_line, $linenr)) { 4049dd88ab32SMasahiro Yamada CHK("UNCOMMENTED_DEFINITION", 4050dd88ab32SMasahiro Yamada "$1 definition without comment\n" . $herecurr); 4051dd88ab32SMasahiro Yamada } 4052dd88ab32SMasahiro Yamada } 4053dd88ab32SMasahiro Yamada# check for memory barriers without a comment. 4054dd88ab32SMasahiro Yamada if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) { 4055dd88ab32SMasahiro Yamada if (!ctx_has_comment($first_line, $linenr)) { 40566b9709d9STom Rini WARN("MEMORY_BARRIER", 4057dd88ab32SMasahiro Yamada "memory barrier without comment\n" . $herecurr); 4058dd88ab32SMasahiro Yamada } 4059dd88ab32SMasahiro Yamada } 4060dd88ab32SMasahiro Yamada# check of hardware specific defines 4061dd88ab32SMasahiro Yamada if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) { 4062dd88ab32SMasahiro Yamada CHK("ARCH_DEFINES", 4063dd88ab32SMasahiro Yamada "architecture specific defines should be avoided\n" . $herecurr); 4064dd88ab32SMasahiro Yamada } 4065dd88ab32SMasahiro Yamada 4066dd88ab32SMasahiro Yamada# Check that the storage class is at the beginning of a declaration 4067dd88ab32SMasahiro Yamada if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) { 4068dd88ab32SMasahiro Yamada WARN("STORAGE_CLASS", 4069dd88ab32SMasahiro Yamada "storage class should be at the beginning of the declaration\n" . $herecurr) 4070dd88ab32SMasahiro Yamada } 4071dd88ab32SMasahiro Yamada 4072dd88ab32SMasahiro Yamada# check the location of the inline attribute, that it is between 4073dd88ab32SMasahiro Yamada# storage class and type. 4074dd88ab32SMasahiro Yamada if ($line =~ /\b$Type\s+$Inline\b/ || 4075dd88ab32SMasahiro Yamada $line =~ /\b$Inline\s+$Storage\b/) { 4076dd88ab32SMasahiro Yamada ERROR("INLINE_LOCATION", 4077dd88ab32SMasahiro Yamada "inline keyword should sit between storage class and type\n" . $herecurr); 4078dd88ab32SMasahiro Yamada } 4079dd88ab32SMasahiro Yamada 4080dd88ab32SMasahiro Yamada# Check for __inline__ and __inline, prefer inline 40816b9709d9STom Rini if ($realfile !~ m@\binclude/uapi/@ && 40826b9709d9STom Rini $line =~ /\b(__inline__|__inline)\b/) { 40836b9709d9STom Rini if (WARN("INLINE", 40846b9709d9STom Rini "plain inline is preferred over $1\n" . $herecurr) && 40856b9709d9STom Rini $fix) { 40866b9709d9STom Rini $fixed[$linenr - 1] =~ s/\b(__inline__|__inline)\b/inline/; 40876b9709d9STom Rini 40886b9709d9STom Rini } 4089dd88ab32SMasahiro Yamada } 4090dd88ab32SMasahiro Yamada 4091dd88ab32SMasahiro Yamada# Check for __attribute__ packed, prefer __packed 40926b9709d9STom Rini if ($realfile !~ m@\binclude/uapi/@ && 40936b9709d9STom Rini $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) { 4094dd88ab32SMasahiro Yamada WARN("PREFER_PACKED", 4095dd88ab32SMasahiro Yamada "__packed is preferred over __attribute__((packed))\n" . $herecurr); 4096dd88ab32SMasahiro Yamada } 4097f503cc49STom Rini# Check for new packed members, warn to use care 4098f503cc49STom Rini if ($line =~ /\b(__attribute__\s*\(\s*\(.*\bpacked|__packed)\b/) { 4099f503cc49STom Rini WARN("NEW_PACKED", 4100f503cc49STom Rini "Adding new packed members is to be done with care\n" . $herecurr); 4101f503cc49STom Rini } 4102dd88ab32SMasahiro Yamada 4103dd88ab32SMasahiro Yamada# Check for __attribute__ aligned, prefer __aligned 41046b9709d9STom Rini if ($realfile !~ m@\binclude/uapi/@ && 41056b9709d9STom Rini $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) { 4106dd88ab32SMasahiro Yamada WARN("PREFER_ALIGNED", 4107dd88ab32SMasahiro Yamada "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr); 4108dd88ab32SMasahiro Yamada } 4109dd88ab32SMasahiro Yamada 4110dd88ab32SMasahiro Yamada# Check for __attribute__ format(printf, prefer __printf 41116b9709d9STom Rini if ($realfile !~ m@\binclude/uapi/@ && 41126b9709d9STom Rini $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) { 41136b9709d9STom Rini if (WARN("PREFER_PRINTF", 41146b9709d9STom Rini "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) && 41156b9709d9STom Rini $fix) { 41166b9709d9STom Rini $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex; 41176b9709d9STom Rini 41186b9709d9STom Rini } 4119dd88ab32SMasahiro Yamada } 4120dd88ab32SMasahiro Yamada 4121dd88ab32SMasahiro Yamada# Check for __attribute__ format(scanf, prefer __scanf 41226b9709d9STom Rini if ($realfile !~ m@\binclude/uapi/@ && 41236b9709d9STom Rini $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) { 41246b9709d9STom Rini if (WARN("PREFER_SCANF", 41256b9709d9STom Rini "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) && 41266b9709d9STom Rini $fix) { 41276b9709d9STom Rini $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex; 41286b9709d9STom Rini } 4129dd88ab32SMasahiro Yamada } 4130dd88ab32SMasahiro Yamada 4131dd88ab32SMasahiro Yamada# check for sizeof(&) 4132dd88ab32SMasahiro Yamada if ($line =~ /\bsizeof\s*\(\s*\&/) { 4133dd88ab32SMasahiro Yamada WARN("SIZEOF_ADDRESS", 4134dd88ab32SMasahiro Yamada "sizeof(& should be avoided\n" . $herecurr); 4135dd88ab32SMasahiro Yamada } 4136dd88ab32SMasahiro Yamada 4137dd88ab32SMasahiro Yamada# check for sizeof without parenthesis 4138dd88ab32SMasahiro Yamada if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) { 41396b9709d9STom Rini if (WARN("SIZEOF_PARENTHESIS", 41406b9709d9STom Rini "sizeof $1 should be sizeof($1)\n" . $herecurr) && 41416b9709d9STom Rini $fix) { 41426b9709d9STom Rini $fixed[$linenr - 1] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex; 41436b9709d9STom Rini } 4144dd88ab32SMasahiro Yamada } 4145dd88ab32SMasahiro Yamada 4146dd88ab32SMasahiro Yamada# check for line continuations in quoted strings with odd counts of " 4147dd88ab32SMasahiro Yamada if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) { 4148dd88ab32SMasahiro Yamada WARN("LINE_CONTINUATIONS", 4149dd88ab32SMasahiro Yamada "Avoid line continuations in quoted strings\n" . $herecurr); 4150dd88ab32SMasahiro Yamada } 4151dd88ab32SMasahiro Yamada 4152dd88ab32SMasahiro Yamada# check for struct spinlock declarations 4153dd88ab32SMasahiro Yamada if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) { 4154dd88ab32SMasahiro Yamada WARN("USE_SPINLOCK_T", 4155dd88ab32SMasahiro Yamada "struct spinlock should be spinlock_t\n" . $herecurr); 4156dd88ab32SMasahiro Yamada } 4157dd88ab32SMasahiro Yamada 41586b9709d9STom Rini# check for seq_printf uses that could be seq_puts 41596b9709d9STom Rini if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) { 41606b9709d9STom Rini my $fmt = get_quoted_string($line, $rawline); 41616b9709d9STom Rini if ($fmt ne "" && $fmt !~ /[^\\]\%/) { 41626b9709d9STom Rini if (WARN("PREFER_SEQ_PUTS", 41636b9709d9STom Rini "Prefer seq_puts to seq_printf\n" . $herecurr) && 41646b9709d9STom Rini $fix) { 41656b9709d9STom Rini $fixed[$linenr - 1] =~ s/\bseq_printf\b/seq_puts/; 41666b9709d9STom Rini } 41676b9709d9STom Rini } 41686b9709d9STom Rini } 41696b9709d9STom Rini 4170dd88ab32SMasahiro Yamada# Check for misused memsets 4171dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 4172dd88ab32SMasahiro Yamada defined $stat && 4173dd88ab32SMasahiro Yamada $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) { 4174dd88ab32SMasahiro Yamada 4175dd88ab32SMasahiro Yamada my $ms_addr = $2; 4176dd88ab32SMasahiro Yamada my $ms_val = $7; 4177dd88ab32SMasahiro Yamada my $ms_size = $12; 4178dd88ab32SMasahiro Yamada 4179dd88ab32SMasahiro Yamada if ($ms_size =~ /^(0x|)0$/i) { 4180dd88ab32SMasahiro Yamada ERROR("MEMSET", 4181dd88ab32SMasahiro Yamada "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n"); 4182dd88ab32SMasahiro Yamada } elsif ($ms_size =~ /^(0x|)1$/i) { 4183dd88ab32SMasahiro Yamada WARN("MEMSET", 4184dd88ab32SMasahiro Yamada "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n"); 4185dd88ab32SMasahiro Yamada } 4186dd88ab32SMasahiro Yamada } 4187dd88ab32SMasahiro Yamada 41886b9709d9STom Rini# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar) 41896b9709d9STom Rini if ($^V && $^V ge 5.10.0 && 41906b9709d9STom Rini $line =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/s) { 41916b9709d9STom Rini if (WARN("PREFER_ETHER_ADDR_COPY", 41926b9709d9STom Rini "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . $herecurr) && 41936b9709d9STom Rini $fix) { 41946b9709d9STom Rini $fixed[$linenr - 1] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/; 41956b9709d9STom Rini } 41966b9709d9STom Rini } 41976b9709d9STom Rini 4198dd88ab32SMasahiro Yamada# typecasts on min/max could be min_t/max_t 4199dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 4200dd88ab32SMasahiro Yamada defined $stat && 4201dd88ab32SMasahiro Yamada $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) { 4202dd88ab32SMasahiro Yamada if (defined $2 || defined $7) { 4203dd88ab32SMasahiro Yamada my $call = $1; 4204dd88ab32SMasahiro Yamada my $cast1 = deparenthesize($2); 4205dd88ab32SMasahiro Yamada my $arg1 = $3; 4206dd88ab32SMasahiro Yamada my $cast2 = deparenthesize($7); 4207dd88ab32SMasahiro Yamada my $arg2 = $8; 4208dd88ab32SMasahiro Yamada my $cast; 4209dd88ab32SMasahiro Yamada 4210dd88ab32SMasahiro Yamada if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) { 4211dd88ab32SMasahiro Yamada $cast = "$cast1 or $cast2"; 4212dd88ab32SMasahiro Yamada } elsif ($cast1 ne "") { 4213dd88ab32SMasahiro Yamada $cast = $cast1; 4214dd88ab32SMasahiro Yamada } else { 4215dd88ab32SMasahiro Yamada $cast = $cast2; 4216dd88ab32SMasahiro Yamada } 4217dd88ab32SMasahiro Yamada WARN("MINMAX", 4218dd88ab32SMasahiro Yamada "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n"); 4219dd88ab32SMasahiro Yamada } 4220dd88ab32SMasahiro Yamada } 4221dd88ab32SMasahiro Yamada 4222dd88ab32SMasahiro Yamada# check usleep_range arguments 4223dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 4224dd88ab32SMasahiro Yamada defined $stat && 4225dd88ab32SMasahiro Yamada $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) { 4226dd88ab32SMasahiro Yamada my $min = $1; 4227dd88ab32SMasahiro Yamada my $max = $7; 4228dd88ab32SMasahiro Yamada if ($min eq $max) { 4229dd88ab32SMasahiro Yamada WARN("USLEEP_RANGE", 4230dd88ab32SMasahiro Yamada "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n"); 4231dd88ab32SMasahiro Yamada } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ && 4232dd88ab32SMasahiro Yamada $min > $max) { 4233dd88ab32SMasahiro Yamada WARN("USLEEP_RANGE", 4234dd88ab32SMasahiro Yamada "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n"); 4235dd88ab32SMasahiro Yamada } 4236dd88ab32SMasahiro Yamada } 4237dd88ab32SMasahiro Yamada 42386b9709d9STom Rini# check for naked sscanf 42396b9709d9STom Rini if ($^V && $^V ge 5.10.0 && 42406b9709d9STom Rini defined $stat && 42416b9709d9STom Rini $stat =~ /\bsscanf\b/ && 42426b9709d9STom Rini ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ && 42436b9709d9STom Rini $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ && 42446b9709d9STom Rini $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) { 42456b9709d9STom Rini my $lc = $stat =~ tr@\n@@; 42466b9709d9STom Rini $lc = $lc + $linenr; 42476b9709d9STom Rini my $stat_real = raw_line($linenr, 0); 42486b9709d9STom Rini for (my $count = $linenr + 1; $count <= $lc; $count++) { 42496b9709d9STom Rini $stat_real = $stat_real . "\n" . raw_line($count, 0); 42506b9709d9STom Rini } 42516b9709d9STom Rini WARN("NAKED_SSCANF", 42526b9709d9STom Rini "unchecked sscanf return value\n" . "$here\n$stat_real\n"); 42536b9709d9STom Rini } 42546b9709d9STom Rini 42556b9709d9STom Rini# check for new externs in .h files. 42566b9709d9STom Rini if ($realfile =~ /\.h$/ && 42576b9709d9STom Rini $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) { 42586b9709d9STom Rini if (CHK("AVOID_EXTERNS", 42596b9709d9STom Rini "extern prototypes should be avoided in .h files\n" . $herecurr) && 42606b9709d9STom Rini $fix) { 42616b9709d9STom Rini $fixed[$linenr - 1] =~ s/(.*)\bextern\b\s*(.*)/$1$2/; 42626b9709d9STom Rini } 42636b9709d9STom Rini } 42646b9709d9STom Rini 4265dd88ab32SMasahiro Yamada# check for new externs in .c files. 4266dd88ab32SMasahiro Yamada if ($realfile =~ /\.c$/ && defined $stat && 4267dd88ab32SMasahiro Yamada $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s) 4268dd88ab32SMasahiro Yamada { 4269dd88ab32SMasahiro Yamada my $function_name = $1; 4270dd88ab32SMasahiro Yamada my $paren_space = $2; 4271dd88ab32SMasahiro Yamada 4272dd88ab32SMasahiro Yamada my $s = $stat; 4273dd88ab32SMasahiro Yamada if (defined $cond) { 4274dd88ab32SMasahiro Yamada substr($s, 0, length($cond), ''); 4275dd88ab32SMasahiro Yamada } 4276dd88ab32SMasahiro Yamada if ($s =~ /^\s*;/ && 4277dd88ab32SMasahiro Yamada $function_name ne 'uninitialized_var') 4278dd88ab32SMasahiro Yamada { 4279dd88ab32SMasahiro Yamada WARN("AVOID_EXTERNS", 4280dd88ab32SMasahiro Yamada "externs should be avoided in .c files\n" . $herecurr); 4281dd88ab32SMasahiro Yamada } 4282dd88ab32SMasahiro Yamada 4283dd88ab32SMasahiro Yamada if ($paren_space =~ /\n/) { 4284dd88ab32SMasahiro Yamada WARN("FUNCTION_ARGUMENTS", 4285dd88ab32SMasahiro Yamada "arguments for function declarations should follow identifier\n" . $herecurr); 4286dd88ab32SMasahiro Yamada } 4287dd88ab32SMasahiro Yamada 4288dd88ab32SMasahiro Yamada } elsif ($realfile =~ /\.c$/ && defined $stat && 4289dd88ab32SMasahiro Yamada $stat =~ /^.\s*extern\s+/) 4290dd88ab32SMasahiro Yamada { 4291dd88ab32SMasahiro Yamada WARN("AVOID_EXTERNS", 4292dd88ab32SMasahiro Yamada "externs should be avoided in .c files\n" . $herecurr); 4293dd88ab32SMasahiro Yamada } 4294dd88ab32SMasahiro Yamada 4295dd88ab32SMasahiro Yamada# checks for new __setup's 4296dd88ab32SMasahiro Yamada if ($rawline =~ /\b__setup\("([^"]*)"/) { 4297dd88ab32SMasahiro Yamada my $name = $1; 4298dd88ab32SMasahiro Yamada 4299dd88ab32SMasahiro Yamada if (!grep(/$name/, @setup_docs)) { 4300dd88ab32SMasahiro Yamada CHK("UNDOCUMENTED_SETUP", 4301dd88ab32SMasahiro Yamada "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr); 4302dd88ab32SMasahiro Yamada } 4303dd88ab32SMasahiro Yamada } 4304dd88ab32SMasahiro Yamada 4305dd88ab32SMasahiro Yamada# check for pointless casting of kmalloc return 4306dd88ab32SMasahiro Yamada if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) { 4307dd88ab32SMasahiro Yamada WARN("UNNECESSARY_CASTS", 4308dd88ab32SMasahiro Yamada "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr); 4309dd88ab32SMasahiro Yamada } 4310dd88ab32SMasahiro Yamada 43116b9709d9STom Rini# alloc style 43126b9709d9STom Rini# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...) 43136b9709d9STom Rini if ($^V && $^V ge 5.10.0 && 43146b9709d9STom Rini $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) { 43156b9709d9STom Rini CHK("ALLOC_SIZEOF_STRUCT", 43166b9709d9STom Rini "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr); 43176b9709d9STom Rini } 43186b9709d9STom Rini 43196b9709d9STom Rini# check for krealloc arg reuse 43206b9709d9STom Rini if ($^V && $^V ge 5.10.0 && 43216b9709d9STom Rini $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) { 43226b9709d9STom Rini WARN("KREALLOC_ARG_REUSE", 43236b9709d9STom Rini "Reusing the krealloc arg is almost always a bug\n" . $herecurr); 43246b9709d9STom Rini } 43256b9709d9STom Rini 4326dd88ab32SMasahiro Yamada# check for alloc argument mismatch 4327dd88ab32SMasahiro Yamada if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) { 4328dd88ab32SMasahiro Yamada WARN("ALLOC_ARRAY_ARGS", 4329dd88ab32SMasahiro Yamada "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr); 4330dd88ab32SMasahiro Yamada } 4331dd88ab32SMasahiro Yamada 43326b9709d9STom Rini# check for GFP_NOWAIT use 43336b9709d9STom Rini if ($line =~ /\b__GFP_NOFAIL\b/) { 43346b9709d9STom Rini WARN("__GFP_NOFAIL", 43356b9709d9STom Rini "Use of __GFP_NOFAIL is deprecated, no new users should be added\n" . $herecurr); 43366b9709d9STom Rini } 43376b9709d9STom Rini 4338dd88ab32SMasahiro Yamada# check for multiple semicolons 4339dd88ab32SMasahiro Yamada if ($line =~ /;\s*;\s*$/) { 43406b9709d9STom Rini if (WARN("ONE_SEMICOLON", 43416b9709d9STom Rini "Statements terminations use 1 semicolon\n" . $herecurr) && 43426b9709d9STom Rini $fix) { 43436b9709d9STom Rini $fixed[$linenr - 1] =~ s/(\s*;\s*){2,}$/;/g; 43446b9709d9STom Rini } 43456b9709d9STom Rini } 43466b9709d9STom Rini 4347fc0b5948SRobert P. J. Day# check for case / default statements not preceded by break/fallthrough/switch 43486b9709d9STom Rini if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) { 43496b9709d9STom Rini my $has_break = 0; 43506b9709d9STom Rini my $has_statement = 0; 43516b9709d9STom Rini my $count = 0; 43526b9709d9STom Rini my $prevline = $linenr; 43536b9709d9STom Rini while ($prevline > 1 && $count < 3 && !$has_break) { 43546b9709d9STom Rini $prevline--; 43556b9709d9STom Rini my $rline = $rawlines[$prevline - 1]; 43566b9709d9STom Rini my $fline = $lines[$prevline - 1]; 43576b9709d9STom Rini last if ($fline =~ /^\@\@/); 43586b9709d9STom Rini next if ($fline =~ /^\-/); 43596b9709d9STom Rini next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/); 43606b9709d9STom Rini $has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i); 43616b9709d9STom Rini next if ($fline =~ /^.[\s$;]*$/); 43626b9709d9STom Rini $has_statement = 1; 43636b9709d9STom Rini $count++; 43646b9709d9STom Rini $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/); 43656b9709d9STom Rini } 43666b9709d9STom Rini if (!$has_break && $has_statement) { 43676b9709d9STom Rini WARN("MISSING_BREAK", 4368fc0b5948SRobert P. J. Day "Possible switch case/default not preceded by break or fallthrough comment\n" . $herecurr); 43696b9709d9STom Rini } 4370dd88ab32SMasahiro Yamada } 4371dd88ab32SMasahiro Yamada 4372dd88ab32SMasahiro Yamada# check for switch/default statements without a break; 4373dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 4374dd88ab32SMasahiro Yamada defined $stat && 4375dd88ab32SMasahiro Yamada $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) { 4376dd88ab32SMasahiro Yamada my $ctx = ''; 4377dd88ab32SMasahiro Yamada my $herectx = $here . "\n"; 4378dd88ab32SMasahiro Yamada my $cnt = statement_rawlines($stat); 4379dd88ab32SMasahiro Yamada for (my $n = 0; $n < $cnt; $n++) { 4380dd88ab32SMasahiro Yamada $herectx .= raw_line($linenr, $n) . "\n"; 4381dd88ab32SMasahiro Yamada } 4382dd88ab32SMasahiro Yamada WARN("DEFAULT_NO_BREAK", 4383dd88ab32SMasahiro Yamada "switch default: should use break\n" . $herectx); 4384dd88ab32SMasahiro Yamada } 4385dd88ab32SMasahiro Yamada 4386dd88ab32SMasahiro Yamada# check for gcc specific __FUNCTION__ 43876b9709d9STom Rini if ($line =~ /\b__FUNCTION__\b/) { 43886b9709d9STom Rini if (WARN("USE_FUNC", 43896b9709d9STom Rini "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) && 43906b9709d9STom Rini $fix) { 43916b9709d9STom Rini $fixed[$linenr - 1] =~ s/\b__FUNCTION__\b/__func__/g; 43926b9709d9STom Rini } 4393dd88ab32SMasahiro Yamada } 4394dd88ab32SMasahiro Yamada 4395dd88ab32SMasahiro Yamada# check for use of yield() 4396dd88ab32SMasahiro Yamada if ($line =~ /\byield\s*\(\s*\)/) { 4397dd88ab32SMasahiro Yamada WARN("YIELD", 4398dd88ab32SMasahiro Yamada "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr); 4399dd88ab32SMasahiro Yamada } 4400dd88ab32SMasahiro Yamada 44016b9709d9STom Rini# check for comparisons against true and false 44026b9709d9STom Rini if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) { 44036b9709d9STom Rini my $lead = $1; 44046b9709d9STom Rini my $arg = $2; 44056b9709d9STom Rini my $test = $3; 44066b9709d9STom Rini my $otype = $4; 44076b9709d9STom Rini my $trail = $5; 44086b9709d9STom Rini my $op = "!"; 44096b9709d9STom Rini 44106b9709d9STom Rini ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i); 44116b9709d9STom Rini 44126b9709d9STom Rini my $type = lc($otype); 44136b9709d9STom Rini if ($type =~ /^(?:true|false)$/) { 44146b9709d9STom Rini if (("$test" eq "==" && "$type" eq "true") || 44156b9709d9STom Rini ("$test" eq "!=" && "$type" eq "false")) { 44166b9709d9STom Rini $op = ""; 44176b9709d9STom Rini } 44186b9709d9STom Rini 44196b9709d9STom Rini CHK("BOOL_COMPARISON", 44206b9709d9STom Rini "Using comparison to $otype is error prone\n" . $herecurr); 44216b9709d9STom Rini 44226b9709d9STom Rini## maybe suggesting a correct construct would better 44236b9709d9STom Rini## "Using comparison to $otype is error prone. Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr); 44246b9709d9STom Rini 44256b9709d9STom Rini } 44266b9709d9STom Rini } 44276b9709d9STom Rini 4428dd88ab32SMasahiro Yamada# check for semaphores initialized locked 4429dd88ab32SMasahiro Yamada if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) { 4430dd88ab32SMasahiro Yamada WARN("CONSIDER_COMPLETION", 4431dd88ab32SMasahiro Yamada "consider using a completion\n" . $herecurr); 4432dd88ab32SMasahiro Yamada } 4433dd88ab32SMasahiro Yamada 4434dd88ab32SMasahiro Yamada# recommend kstrto* over simple_strto* and strict_strto* 4435dd88ab32SMasahiro Yamada if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) { 4436dd88ab32SMasahiro Yamada WARN("CONSIDER_KSTRTO", 4437dd88ab32SMasahiro Yamada "$1 is obsolete, use k$3 instead\n" . $herecurr); 4438dd88ab32SMasahiro Yamada } 4439dd88ab32SMasahiro Yamada 4440dd88ab32SMasahiro Yamada# check for __initcall(), use device_initcall() explicitly please 4441dd88ab32SMasahiro Yamada if ($line =~ /^.\s*__initcall\s*\(/) { 4442dd88ab32SMasahiro Yamada WARN("USE_DEVICE_INITCALL", 4443dd88ab32SMasahiro Yamada "please use device_initcall() instead of __initcall()\n" . $herecurr); 4444dd88ab32SMasahiro Yamada } 4445dd88ab32SMasahiro Yamada 4446dd88ab32SMasahiro Yamada# check for various ops structs, ensure they are const. 4447dd88ab32SMasahiro Yamada my $struct_ops = qr{acpi_dock_ops| 4448dd88ab32SMasahiro Yamada address_space_operations| 4449dd88ab32SMasahiro Yamada backlight_ops| 4450dd88ab32SMasahiro Yamada block_device_operations| 4451dd88ab32SMasahiro Yamada dentry_operations| 4452dd88ab32SMasahiro Yamada dev_pm_ops| 4453dd88ab32SMasahiro Yamada dma_map_ops| 4454dd88ab32SMasahiro Yamada extent_io_ops| 4455dd88ab32SMasahiro Yamada file_lock_operations| 4456dd88ab32SMasahiro Yamada file_operations| 4457dd88ab32SMasahiro Yamada hv_ops| 4458dd88ab32SMasahiro Yamada ide_dma_ops| 4459dd88ab32SMasahiro Yamada intel_dvo_dev_ops| 4460dd88ab32SMasahiro Yamada item_operations| 4461dd88ab32SMasahiro Yamada iwl_ops| 4462dd88ab32SMasahiro Yamada kgdb_arch| 4463dd88ab32SMasahiro Yamada kgdb_io| 4464dd88ab32SMasahiro Yamada kset_uevent_ops| 4465dd88ab32SMasahiro Yamada lock_manager_operations| 4466dd88ab32SMasahiro Yamada microcode_ops| 4467dd88ab32SMasahiro Yamada mtrr_ops| 4468dd88ab32SMasahiro Yamada neigh_ops| 4469dd88ab32SMasahiro Yamada nlmsvc_binding| 4470dd88ab32SMasahiro Yamada pci_raw_ops| 4471dd88ab32SMasahiro Yamada pipe_buf_operations| 4472dd88ab32SMasahiro Yamada platform_hibernation_ops| 4473dd88ab32SMasahiro Yamada platform_suspend_ops| 4474dd88ab32SMasahiro Yamada proto_ops| 4475dd88ab32SMasahiro Yamada rpc_pipe_ops| 4476dd88ab32SMasahiro Yamada seq_operations| 4477dd88ab32SMasahiro Yamada snd_ac97_build_ops| 4478dd88ab32SMasahiro Yamada soc_pcmcia_socket_ops| 4479dd88ab32SMasahiro Yamada stacktrace_ops| 4480dd88ab32SMasahiro Yamada sysfs_ops| 4481dd88ab32SMasahiro Yamada tty_operations| 4482dd88ab32SMasahiro Yamada usb_mon_operations| 4483dd88ab32SMasahiro Yamada wd_ops}x; 4484dd88ab32SMasahiro Yamada if ($line !~ /\bconst\b/ && 4485dd88ab32SMasahiro Yamada $line =~ /\bstruct\s+($struct_ops)\b/) { 4486dd88ab32SMasahiro Yamada WARN("CONST_STRUCT", 4487dd88ab32SMasahiro Yamada "struct $1 should normally be const\n" . 4488dd88ab32SMasahiro Yamada $herecurr); 4489dd88ab32SMasahiro Yamada } 4490dd88ab32SMasahiro Yamada 4491dd88ab32SMasahiro Yamada# use of NR_CPUS is usually wrong 4492dd88ab32SMasahiro Yamada# ignore definitions of NR_CPUS and usage to define arrays as likely right 4493dd88ab32SMasahiro Yamada if ($line =~ /\bNR_CPUS\b/ && 4494dd88ab32SMasahiro Yamada $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ && 4495dd88ab32SMasahiro Yamada $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ && 4496dd88ab32SMasahiro Yamada $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ && 4497dd88ab32SMasahiro Yamada $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ && 4498dd88ab32SMasahiro Yamada $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/) 4499dd88ab32SMasahiro Yamada { 4500dd88ab32SMasahiro Yamada WARN("NR_CPUS", 4501dd88ab32SMasahiro Yamada "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr); 4502dd88ab32SMasahiro Yamada } 4503dd88ab32SMasahiro Yamada 45046b9709d9STom Rini# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong. 45056b9709d9STom Rini if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) { 45066b9709d9STom Rini ERROR("DEFINE_ARCH_HAS", 45076b9709d9STom Rini "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr); 45086b9709d9STom Rini } 45096b9709d9STom Rini 4510dd88ab32SMasahiro Yamada# check for %L{u,d,i} in strings 4511dd88ab32SMasahiro Yamada my $string; 4512dd88ab32SMasahiro Yamada while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) { 4513dd88ab32SMasahiro Yamada $string = substr($rawline, $-[1], $+[1] - $-[1]); 4514dd88ab32SMasahiro Yamada $string =~ s/%%/__/g; 4515dd88ab32SMasahiro Yamada if ($string =~ /(?<!%)%L[udi]/) { 4516dd88ab32SMasahiro Yamada WARN("PRINTF_L", 4517dd88ab32SMasahiro Yamada "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr); 4518dd88ab32SMasahiro Yamada last; 4519dd88ab32SMasahiro Yamada } 4520dd88ab32SMasahiro Yamada } 4521dd88ab32SMasahiro Yamada 4522dd88ab32SMasahiro Yamada# whine mightly about in_atomic 4523dd88ab32SMasahiro Yamada if ($line =~ /\bin_atomic\s*\(/) { 4524dd88ab32SMasahiro Yamada if ($realfile =~ m@^drivers/@) { 4525dd88ab32SMasahiro Yamada ERROR("IN_ATOMIC", 4526dd88ab32SMasahiro Yamada "do not use in_atomic in drivers\n" . $herecurr); 4527dd88ab32SMasahiro Yamada } elsif ($realfile !~ m@^kernel/@) { 4528dd88ab32SMasahiro Yamada WARN("IN_ATOMIC", 4529dd88ab32SMasahiro Yamada "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr); 4530dd88ab32SMasahiro Yamada } 4531dd88ab32SMasahiro Yamada } 4532dd88ab32SMasahiro Yamada 4533dd88ab32SMasahiro Yamada# check for lockdep_set_novalidate_class 4534dd88ab32SMasahiro Yamada if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ || 4535dd88ab32SMasahiro Yamada $line =~ /__lockdep_no_validate__\s*\)/ ) { 4536dd88ab32SMasahiro Yamada if ($realfile !~ m@^kernel/lockdep@ && 4537dd88ab32SMasahiro Yamada $realfile !~ m@^include/linux/lockdep@ && 4538dd88ab32SMasahiro Yamada $realfile !~ m@^drivers/base/core@) { 4539dd88ab32SMasahiro Yamada ERROR("LOCKDEP", 4540dd88ab32SMasahiro Yamada "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr); 4541dd88ab32SMasahiro Yamada } 4542dd88ab32SMasahiro Yamada } 4543dd88ab32SMasahiro Yamada 4544dd88ab32SMasahiro Yamada if ($line =~ /debugfs_create_file.*S_IWUGO/ || 4545dd88ab32SMasahiro Yamada $line =~ /DEVICE_ATTR.*S_IWUGO/ ) { 4546dd88ab32SMasahiro Yamada WARN("EXPORTED_WORLD_WRITABLE", 4547dd88ab32SMasahiro Yamada "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr); 4548dd88ab32SMasahiro Yamada } 4549dd88ab32SMasahiro Yamada } 4550dd88ab32SMasahiro Yamada 4551dd88ab32SMasahiro Yamada # If we have no input at all, then there is nothing to report on 4552dd88ab32SMasahiro Yamada # so just keep quiet. 4553dd88ab32SMasahiro Yamada if ($#rawlines == -1) { 4554dd88ab32SMasahiro Yamada exit(0); 4555dd88ab32SMasahiro Yamada } 4556dd88ab32SMasahiro Yamada 4557dd88ab32SMasahiro Yamada # In mailback mode only produce a report in the negative, for 4558dd88ab32SMasahiro Yamada # things that appear to be patches. 4559dd88ab32SMasahiro Yamada if ($mailback && ($clean == 1 || !$is_patch)) { 4560dd88ab32SMasahiro Yamada exit(0); 4561dd88ab32SMasahiro Yamada } 4562dd88ab32SMasahiro Yamada 4563dd88ab32SMasahiro Yamada # This is not a patch, and we are are in 'no-patch' mode so 4564dd88ab32SMasahiro Yamada # just keep quiet. 4565dd88ab32SMasahiro Yamada if (!$chk_patch && !$is_patch) { 4566dd88ab32SMasahiro Yamada exit(0); 4567dd88ab32SMasahiro Yamada } 4568dd88ab32SMasahiro Yamada 4569dd88ab32SMasahiro Yamada if (!$is_patch) { 4570dd88ab32SMasahiro Yamada ERROR("NOT_UNIFIED_DIFF", 4571dd88ab32SMasahiro Yamada "Does not appear to be a unified-diff format patch\n"); 4572dd88ab32SMasahiro Yamada } 4573dd88ab32SMasahiro Yamada if ($is_patch && $chk_signoff && $signoff == 0) { 4574dd88ab32SMasahiro Yamada ERROR("MISSING_SIGN_OFF", 4575dd88ab32SMasahiro Yamada "Missing Signed-off-by: line(s)\n"); 4576dd88ab32SMasahiro Yamada } 4577dd88ab32SMasahiro Yamada 4578dd88ab32SMasahiro Yamada print report_dump(); 4579dd88ab32SMasahiro Yamada if ($summary && !($clean == 1 && $quiet == 1)) { 4580dd88ab32SMasahiro Yamada print "$filename " if ($summary_file); 4581dd88ab32SMasahiro Yamada print "total: $cnt_error errors, $cnt_warn warnings, " . 4582dd88ab32SMasahiro Yamada (($check)? "$cnt_chk checks, " : "") . 4583dd88ab32SMasahiro Yamada "$cnt_lines lines checked\n"; 4584dd88ab32SMasahiro Yamada print "\n" if ($quiet == 0); 4585dd88ab32SMasahiro Yamada } 4586dd88ab32SMasahiro Yamada 4587dd88ab32SMasahiro Yamada if ($quiet == 0) { 4588dd88ab32SMasahiro Yamada 4589dd88ab32SMasahiro Yamada if ($^V lt 5.10.0) { 4590dd88ab32SMasahiro Yamada print("NOTE: perl $^V is not modern enough to detect all possible issues.\n"); 4591dd88ab32SMasahiro Yamada print("An upgrade to at least perl v5.10.0 is suggested.\n\n"); 4592dd88ab32SMasahiro Yamada } 4593dd88ab32SMasahiro Yamada 4594dd88ab32SMasahiro Yamada # If there were whitespace errors which cleanpatch can fix 4595dd88ab32SMasahiro Yamada # then suggest that. 4596dd88ab32SMasahiro Yamada if ($rpt_cleaners) { 4597dd88ab32SMasahiro Yamada print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n"; 4598dd88ab32SMasahiro Yamada print " scripts/cleanfile\n\n"; 4599dd88ab32SMasahiro Yamada $rpt_cleaners = 0; 4600dd88ab32SMasahiro Yamada } 4601dd88ab32SMasahiro Yamada } 4602dd88ab32SMasahiro Yamada 46036b9709d9STom Rini hash_show_words(\%use_type, "Used"); 46046b9709d9STom Rini hash_show_words(\%ignore_type, "Ignored"); 46056b9709d9STom Rini 46066b9709d9STom Rini if ($clean == 0 && $fix && "@rawlines" ne "@fixed") { 46076b9709d9STom Rini my $newfile = $filename; 46086b9709d9STom Rini $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace); 46096b9709d9STom Rini my $linecount = 0; 46106b9709d9STom Rini my $f; 46116b9709d9STom Rini 46126b9709d9STom Rini open($f, '>', $newfile) 46136b9709d9STom Rini or die "$P: Can't open $newfile for write\n"; 46146b9709d9STom Rini foreach my $fixed_line (@fixed) { 46156b9709d9STom Rini $linecount++; 46166b9709d9STom Rini if ($file) { 46176b9709d9STom Rini if ($linecount > 3) { 46186b9709d9STom Rini $fixed_line =~ s/^\+//; 46196b9709d9STom Rini print $f $fixed_line. "\n"; 4620dd88ab32SMasahiro Yamada } 46216b9709d9STom Rini } else { 46226b9709d9STom Rini print $f $fixed_line . "\n"; 46236b9709d9STom Rini } 46246b9709d9STom Rini } 46256b9709d9STom Rini close($f); 46266b9709d9STom Rini 46276b9709d9STom Rini if (!$quiet) { 46286b9709d9STom Rini print << "EOM"; 46296b9709d9STom RiniWrote EXPERIMENTAL --fix correction(s) to '$newfile' 46306b9709d9STom Rini 46316b9709d9STom RiniDo _NOT_ trust the results written to this file. 46326b9709d9STom RiniDo _NOT_ submit these changes without inspecting them for correctness. 46336b9709d9STom Rini 46346b9709d9STom RiniThis EXPERIMENTAL file is simply a convenience to help rewrite patches. 46356b9709d9STom RiniNo warranties, expressed or implied... 46366b9709d9STom Rini 46376b9709d9STom RiniEOM 46386b9709d9STom Rini } 4639dd88ab32SMasahiro Yamada } 4640dd88ab32SMasahiro Yamada 4641dd88ab32SMasahiro Yamada if ($clean == 1 && $quiet == 0) { 4642dd88ab32SMasahiro Yamada print "$vname has no obvious style problems and is ready for submission.\n" 4643dd88ab32SMasahiro Yamada } 4644dd88ab32SMasahiro Yamada if ($clean == 0 && $quiet == 0) { 4645dd88ab32SMasahiro Yamada print << "EOM"; 4646dd88ab32SMasahiro Yamada$vname has style problems, please review. 4647dd88ab32SMasahiro Yamada 4648dd88ab32SMasahiro YamadaIf any of these errors are false positives, please report 46496b9709d9STom Rinithem to the maintainer, see CHECKPATCH in MAINTAINERS. 4650dd88ab32SMasahiro YamadaEOM 4651dd88ab32SMasahiro Yamada } 4652dd88ab32SMasahiro Yamada 4653dd88ab32SMasahiro Yamada return $clean; 4654dd88ab32SMasahiro Yamada} 4655