1*dd88ab32SMasahiro Yamada#!/usr/bin/perl -w 2*dd88ab32SMasahiro Yamada# (c) 2001, Dave Jones. (the file handling bit) 3*dd88ab32SMasahiro Yamada# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit) 4*dd88ab32SMasahiro Yamada# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite) 5*dd88ab32SMasahiro Yamada# (c) 2008-2010 Andy Whitcroft <apw@canonical.com> 6*dd88ab32SMasahiro Yamada# Licensed under the terms of the GNU GPL License version 2 7*dd88ab32SMasahiro Yamada 8*dd88ab32SMasahiro Yamadause strict; 9*dd88ab32SMasahiro Yamada 10*dd88ab32SMasahiro Yamadamy $P = $0; 11*dd88ab32SMasahiro Yamada$P =~ s@.*/@@g; 12*dd88ab32SMasahiro Yamada 13*dd88ab32SMasahiro Yamadamy $V = '0.32'; 14*dd88ab32SMasahiro Yamada 15*dd88ab32SMasahiro Yamadause Getopt::Long qw(:config no_auto_abbrev); 16*dd88ab32SMasahiro Yamada 17*dd88ab32SMasahiro Yamadamy $quiet = 0; 18*dd88ab32SMasahiro Yamadamy $tree = 1; 19*dd88ab32SMasahiro Yamadamy $chk_signoff = 1; 20*dd88ab32SMasahiro Yamadamy $chk_patch = 1; 21*dd88ab32SMasahiro Yamadamy $tst_only; 22*dd88ab32SMasahiro Yamadamy $emacs = 0; 23*dd88ab32SMasahiro Yamadamy $terse = 0; 24*dd88ab32SMasahiro Yamadamy $file = 0; 25*dd88ab32SMasahiro Yamadamy $check = 0; 26*dd88ab32SMasahiro Yamadamy $summary = 1; 27*dd88ab32SMasahiro Yamadamy $mailback = 0; 28*dd88ab32SMasahiro Yamadamy $summary_file = 0; 29*dd88ab32SMasahiro Yamadamy $show_types = 0; 30*dd88ab32SMasahiro Yamadamy $root; 31*dd88ab32SMasahiro Yamadamy %debug; 32*dd88ab32SMasahiro Yamadamy %ignore_type = (); 33*dd88ab32SMasahiro Yamadamy @ignore = (); 34*dd88ab32SMasahiro Yamadamy $help = 0; 35*dd88ab32SMasahiro Yamadamy $configuration_file = ".checkpatch.conf"; 36*dd88ab32SMasahiro Yamadamy $max_line_length = 80; 37*dd88ab32SMasahiro Yamada 38*dd88ab32SMasahiro Yamadasub help { 39*dd88ab32SMasahiro Yamada my ($exitcode) = @_; 40*dd88ab32SMasahiro Yamada 41*dd88ab32SMasahiro Yamada print << "EOM"; 42*dd88ab32SMasahiro YamadaUsage: $P [OPTION]... [FILE]... 43*dd88ab32SMasahiro YamadaVersion: $V 44*dd88ab32SMasahiro Yamada 45*dd88ab32SMasahiro YamadaOptions: 46*dd88ab32SMasahiro Yamada -q, --quiet quiet 47*dd88ab32SMasahiro Yamada --no-tree run without a kernel tree 48*dd88ab32SMasahiro Yamada --no-signoff do not check for 'Signed-off-by' line 49*dd88ab32SMasahiro Yamada --patch treat FILE as patchfile (default) 50*dd88ab32SMasahiro Yamada --emacs emacs compile window format 51*dd88ab32SMasahiro Yamada --terse one line per report 52*dd88ab32SMasahiro Yamada -f, --file treat FILE as regular source file 53*dd88ab32SMasahiro Yamada --subjective, --strict enable more subjective tests 54*dd88ab32SMasahiro Yamada --ignore TYPE(,TYPE2...) ignore various comma separated message types 55*dd88ab32SMasahiro Yamada --max-line-length=n set the maximum line length, if exceeded, warn 56*dd88ab32SMasahiro Yamada --show-types show the message "types" in the output 57*dd88ab32SMasahiro Yamada --root=PATH PATH to the kernel tree root 58*dd88ab32SMasahiro Yamada --no-summary suppress the per-file summary 59*dd88ab32SMasahiro Yamada --mailback only produce a report in case of warnings/errors 60*dd88ab32SMasahiro Yamada --summary-file include the filename in summary 61*dd88ab32SMasahiro Yamada --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of 62*dd88ab32SMasahiro Yamada 'values', 'possible', 'type', and 'attr' (default 63*dd88ab32SMasahiro Yamada is all off) 64*dd88ab32SMasahiro Yamada --test-only=WORD report only warnings/errors containing WORD 65*dd88ab32SMasahiro Yamada literally 66*dd88ab32SMasahiro Yamada -h, --help, --version display this help and exit 67*dd88ab32SMasahiro Yamada 68*dd88ab32SMasahiro YamadaWhen FILE is - read standard input. 69*dd88ab32SMasahiro YamadaEOM 70*dd88ab32SMasahiro Yamada 71*dd88ab32SMasahiro Yamada exit($exitcode); 72*dd88ab32SMasahiro Yamada} 73*dd88ab32SMasahiro Yamada 74*dd88ab32SMasahiro Yamadamy $conf = which_conf($configuration_file); 75*dd88ab32SMasahiro Yamadaif (-f $conf) { 76*dd88ab32SMasahiro Yamada my @conf_args; 77*dd88ab32SMasahiro Yamada open(my $conffile, '<', "$conf") 78*dd88ab32SMasahiro Yamada or warn "$P: Can't find a readable $configuration_file file $!\n"; 79*dd88ab32SMasahiro Yamada 80*dd88ab32SMasahiro Yamada while (<$conffile>) { 81*dd88ab32SMasahiro Yamada my $line = $_; 82*dd88ab32SMasahiro Yamada 83*dd88ab32SMasahiro Yamada $line =~ s/\s*\n?$//g; 84*dd88ab32SMasahiro Yamada $line =~ s/^\s*//g; 85*dd88ab32SMasahiro Yamada $line =~ s/\s+/ /g; 86*dd88ab32SMasahiro Yamada 87*dd88ab32SMasahiro Yamada next if ($line =~ m/^\s*#/); 88*dd88ab32SMasahiro Yamada next if ($line =~ m/^\s*$/); 89*dd88ab32SMasahiro Yamada 90*dd88ab32SMasahiro Yamada my @words = split(" ", $line); 91*dd88ab32SMasahiro Yamada foreach my $word (@words) { 92*dd88ab32SMasahiro Yamada last if ($word =~ m/^#/); 93*dd88ab32SMasahiro Yamada push (@conf_args, $word); 94*dd88ab32SMasahiro Yamada } 95*dd88ab32SMasahiro Yamada } 96*dd88ab32SMasahiro Yamada close($conffile); 97*dd88ab32SMasahiro Yamada unshift(@ARGV, @conf_args) if @conf_args; 98*dd88ab32SMasahiro Yamada} 99*dd88ab32SMasahiro Yamada 100*dd88ab32SMasahiro YamadaGetOptions( 101*dd88ab32SMasahiro Yamada 'q|quiet+' => \$quiet, 102*dd88ab32SMasahiro Yamada 'tree!' => \$tree, 103*dd88ab32SMasahiro Yamada 'signoff!' => \$chk_signoff, 104*dd88ab32SMasahiro Yamada 'patch!' => \$chk_patch, 105*dd88ab32SMasahiro Yamada 'emacs!' => \$emacs, 106*dd88ab32SMasahiro Yamada 'terse!' => \$terse, 107*dd88ab32SMasahiro Yamada 'f|file!' => \$file, 108*dd88ab32SMasahiro Yamada 'subjective!' => \$check, 109*dd88ab32SMasahiro Yamada 'strict!' => \$check, 110*dd88ab32SMasahiro Yamada 'ignore=s' => \@ignore, 111*dd88ab32SMasahiro Yamada 'show-types!' => \$show_types, 112*dd88ab32SMasahiro Yamada 'max-line-length=i' => \$max_line_length, 113*dd88ab32SMasahiro Yamada 'root=s' => \$root, 114*dd88ab32SMasahiro Yamada 'summary!' => \$summary, 115*dd88ab32SMasahiro Yamada 'mailback!' => \$mailback, 116*dd88ab32SMasahiro Yamada 'summary-file!' => \$summary_file, 117*dd88ab32SMasahiro Yamada 118*dd88ab32SMasahiro Yamada 'debug=s' => \%debug, 119*dd88ab32SMasahiro Yamada 'test-only=s' => \$tst_only, 120*dd88ab32SMasahiro Yamada 'h|help' => \$help, 121*dd88ab32SMasahiro Yamada 'version' => \$help 122*dd88ab32SMasahiro Yamada) or help(1); 123*dd88ab32SMasahiro Yamada 124*dd88ab32SMasahiro Yamadahelp(0) if ($help); 125*dd88ab32SMasahiro Yamada 126*dd88ab32SMasahiro Yamadamy $exit = 0; 127*dd88ab32SMasahiro Yamada 128*dd88ab32SMasahiro Yamadaif ($#ARGV < 0) { 129*dd88ab32SMasahiro Yamada print "$P: no input files\n"; 130*dd88ab32SMasahiro Yamada exit(1); 131*dd88ab32SMasahiro Yamada} 132*dd88ab32SMasahiro Yamada 133*dd88ab32SMasahiro Yamada@ignore = split(/,/, join(',',@ignore)); 134*dd88ab32SMasahiro Yamadaforeach my $word (@ignore) { 135*dd88ab32SMasahiro Yamada $word =~ s/\s*\n?$//g; 136*dd88ab32SMasahiro Yamada $word =~ s/^\s*//g; 137*dd88ab32SMasahiro Yamada $word =~ s/\s+/ /g; 138*dd88ab32SMasahiro Yamada $word =~ tr/[a-z]/[A-Z]/; 139*dd88ab32SMasahiro Yamada 140*dd88ab32SMasahiro Yamada next if ($word =~ m/^\s*#/); 141*dd88ab32SMasahiro Yamada next if ($word =~ m/^\s*$/); 142*dd88ab32SMasahiro Yamada 143*dd88ab32SMasahiro Yamada $ignore_type{$word}++; 144*dd88ab32SMasahiro Yamada} 145*dd88ab32SMasahiro Yamada 146*dd88ab32SMasahiro Yamadamy $dbg_values = 0; 147*dd88ab32SMasahiro Yamadamy $dbg_possible = 0; 148*dd88ab32SMasahiro Yamadamy $dbg_type = 0; 149*dd88ab32SMasahiro Yamadamy $dbg_attr = 0; 150*dd88ab32SMasahiro Yamadafor my $key (keys %debug) { 151*dd88ab32SMasahiro Yamada ## no critic 152*dd88ab32SMasahiro Yamada eval "\${dbg_$key} = '$debug{$key}';"; 153*dd88ab32SMasahiro Yamada die "$@" if ($@); 154*dd88ab32SMasahiro Yamada} 155*dd88ab32SMasahiro Yamada 156*dd88ab32SMasahiro Yamadamy $rpt_cleaners = 0; 157*dd88ab32SMasahiro Yamada 158*dd88ab32SMasahiro Yamadaif ($terse) { 159*dd88ab32SMasahiro Yamada $emacs = 1; 160*dd88ab32SMasahiro Yamada $quiet++; 161*dd88ab32SMasahiro Yamada} 162*dd88ab32SMasahiro Yamada 163*dd88ab32SMasahiro Yamadaif ($tree) { 164*dd88ab32SMasahiro Yamada if (defined $root) { 165*dd88ab32SMasahiro Yamada if (!top_of_kernel_tree($root)) { 166*dd88ab32SMasahiro Yamada die "$P: $root: --root does not point at a valid tree\n"; 167*dd88ab32SMasahiro Yamada } 168*dd88ab32SMasahiro Yamada } else { 169*dd88ab32SMasahiro Yamada if (top_of_kernel_tree('.')) { 170*dd88ab32SMasahiro Yamada $root = '.'; 171*dd88ab32SMasahiro Yamada } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ && 172*dd88ab32SMasahiro Yamada top_of_kernel_tree($1)) { 173*dd88ab32SMasahiro Yamada $root = $1; 174*dd88ab32SMasahiro Yamada } 175*dd88ab32SMasahiro Yamada } 176*dd88ab32SMasahiro Yamada 177*dd88ab32SMasahiro Yamada if (!defined $root) { 178*dd88ab32SMasahiro Yamada print "Must be run from the top-level dir. of a kernel tree\n"; 179*dd88ab32SMasahiro Yamada exit(2); 180*dd88ab32SMasahiro Yamada } 181*dd88ab32SMasahiro Yamada} 182*dd88ab32SMasahiro Yamada 183*dd88ab32SMasahiro Yamadamy $emitted_corrupt = 0; 184*dd88ab32SMasahiro Yamada 185*dd88ab32SMasahiro Yamadaour $Ident = qr{ 186*dd88ab32SMasahiro Yamada [A-Za-z_][A-Za-z\d_]* 187*dd88ab32SMasahiro Yamada (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)* 188*dd88ab32SMasahiro Yamada }x; 189*dd88ab32SMasahiro Yamadaour $Storage = qr{extern|static|asmlinkage}; 190*dd88ab32SMasahiro Yamadaour $Sparse = qr{ 191*dd88ab32SMasahiro Yamada __user| 192*dd88ab32SMasahiro Yamada __kernel| 193*dd88ab32SMasahiro Yamada __force| 194*dd88ab32SMasahiro Yamada __iomem| 195*dd88ab32SMasahiro Yamada __must_check| 196*dd88ab32SMasahiro Yamada __init_refok| 197*dd88ab32SMasahiro Yamada __kprobes| 198*dd88ab32SMasahiro Yamada __ref| 199*dd88ab32SMasahiro Yamada __rcu 200*dd88ab32SMasahiro Yamada }x; 201*dd88ab32SMasahiro Yamada 202*dd88ab32SMasahiro Yamada# Notes to $Attribute: 203*dd88ab32SMasahiro Yamada# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check 204*dd88ab32SMasahiro Yamadaour $Attribute = qr{ 205*dd88ab32SMasahiro Yamada const| 206*dd88ab32SMasahiro Yamada __percpu| 207*dd88ab32SMasahiro Yamada __nocast| 208*dd88ab32SMasahiro Yamada __safe| 209*dd88ab32SMasahiro Yamada __bitwise__| 210*dd88ab32SMasahiro Yamada __packed__| 211*dd88ab32SMasahiro Yamada __packed2__| 212*dd88ab32SMasahiro Yamada __naked| 213*dd88ab32SMasahiro Yamada __maybe_unused| 214*dd88ab32SMasahiro Yamada __always_unused| 215*dd88ab32SMasahiro Yamada __noreturn| 216*dd88ab32SMasahiro Yamada __used| 217*dd88ab32SMasahiro Yamada __cold| 218*dd88ab32SMasahiro Yamada __noclone| 219*dd88ab32SMasahiro Yamada __deprecated| 220*dd88ab32SMasahiro Yamada __read_mostly| 221*dd88ab32SMasahiro Yamada __kprobes| 222*dd88ab32SMasahiro Yamada __(?:mem|cpu|dev|)(?:initdata|initconst|init\b)| 223*dd88ab32SMasahiro Yamada ____cacheline_aligned| 224*dd88ab32SMasahiro Yamada ____cacheline_aligned_in_smp| 225*dd88ab32SMasahiro Yamada ____cacheline_internodealigned_in_smp| 226*dd88ab32SMasahiro Yamada __weak 227*dd88ab32SMasahiro Yamada }x; 228*dd88ab32SMasahiro Yamadaour $Modifier; 229*dd88ab32SMasahiro Yamadaour $Inline = qr{inline|__always_inline|noinline}; 230*dd88ab32SMasahiro Yamadaour $Member = qr{->$Ident|\.$Ident|\[[^]]*\]}; 231*dd88ab32SMasahiro Yamadaour $Lval = qr{$Ident(?:$Member)*}; 232*dd88ab32SMasahiro Yamada 233*dd88ab32SMasahiro Yamadaour $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?}; 234*dd88ab32SMasahiro Yamadaour $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?}; 235*dd88ab32SMasahiro Yamadaour $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?}; 236*dd88ab32SMasahiro Yamadaour $Float = qr{$Float_hex|$Float_dec|$Float_int}; 237*dd88ab32SMasahiro Yamadaour $Constant = qr{$Float|(?i)(?:0x[0-9a-f]+|[0-9]+)[ul]*}; 238*dd88ab32SMasahiro Yamadaour $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=}; 239*dd88ab32SMasahiro Yamadaour $Compare = qr{<=|>=|==|!=|<|>}; 240*dd88ab32SMasahiro Yamadaour $Operators = qr{ 241*dd88ab32SMasahiro Yamada <=|>=|==|!=| 242*dd88ab32SMasahiro Yamada =>|->|<<|>>|<|>|!|~| 243*dd88ab32SMasahiro Yamada &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|% 244*dd88ab32SMasahiro Yamada }x; 245*dd88ab32SMasahiro Yamada 246*dd88ab32SMasahiro Yamadaour $NonptrType; 247*dd88ab32SMasahiro Yamadaour $Type; 248*dd88ab32SMasahiro Yamadaour $Declare; 249*dd88ab32SMasahiro Yamada 250*dd88ab32SMasahiro Yamadaour $NON_ASCII_UTF8 = qr{ 251*dd88ab32SMasahiro Yamada [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte 252*dd88ab32SMasahiro Yamada | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs 253*dd88ab32SMasahiro Yamada | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte 254*dd88ab32SMasahiro Yamada | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates 255*dd88ab32SMasahiro Yamada | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 256*dd88ab32SMasahiro Yamada | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 257*dd88ab32SMasahiro Yamada | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 258*dd88ab32SMasahiro Yamada}x; 259*dd88ab32SMasahiro Yamada 260*dd88ab32SMasahiro Yamadaour $UTF8 = qr{ 261*dd88ab32SMasahiro Yamada [\x09\x0A\x0D\x20-\x7E] # ASCII 262*dd88ab32SMasahiro Yamada | $NON_ASCII_UTF8 263*dd88ab32SMasahiro Yamada}x; 264*dd88ab32SMasahiro Yamada 265*dd88ab32SMasahiro Yamadaour $typeTypedefs = qr{(?x: 266*dd88ab32SMasahiro Yamada (?:__)?(?:u|s|be|le)(?:8|16|32|64)| 267*dd88ab32SMasahiro Yamada atomic_t 268*dd88ab32SMasahiro Yamada)}; 269*dd88ab32SMasahiro Yamada 270*dd88ab32SMasahiro Yamadaour $logFunctions = qr{(?x: 271*dd88ab32SMasahiro Yamada printk(?:_ratelimited|_once|)| 272*dd88ab32SMasahiro Yamada [a-z0-9]+_(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)| 273*dd88ab32SMasahiro Yamada WARN(?:_RATELIMIT|_ONCE|)| 274*dd88ab32SMasahiro Yamada panic| 275*dd88ab32SMasahiro Yamada debug| 276*dd88ab32SMasahiro Yamada printf| 277*dd88ab32SMasahiro Yamada MODULE_[A-Z_]+ 278*dd88ab32SMasahiro Yamada)}; 279*dd88ab32SMasahiro Yamada 280*dd88ab32SMasahiro Yamadaour $signature_tags = qr{(?xi: 281*dd88ab32SMasahiro Yamada Signed-off-by:| 282*dd88ab32SMasahiro Yamada Acked-by:| 283*dd88ab32SMasahiro Yamada Tested-by:| 284*dd88ab32SMasahiro Yamada Reviewed-by:| 285*dd88ab32SMasahiro Yamada Reported-by:| 286*dd88ab32SMasahiro Yamada To:| 287*dd88ab32SMasahiro Yamada Cc: 288*dd88ab32SMasahiro Yamada)}; 289*dd88ab32SMasahiro Yamada 290*dd88ab32SMasahiro Yamadaour @typeList = ( 291*dd88ab32SMasahiro Yamada qr{void}, 292*dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?char}, 293*dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?short}, 294*dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?int}, 295*dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?long}, 296*dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?long\s+int}, 297*dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?long\s+long}, 298*dd88ab32SMasahiro Yamada qr{(?:unsigned\s+)?long\s+long\s+int}, 299*dd88ab32SMasahiro Yamada qr{unsigned}, 300*dd88ab32SMasahiro Yamada qr{float}, 301*dd88ab32SMasahiro Yamada qr{double}, 302*dd88ab32SMasahiro Yamada qr{bool}, 303*dd88ab32SMasahiro Yamada qr{struct\s+$Ident}, 304*dd88ab32SMasahiro Yamada qr{union\s+$Ident}, 305*dd88ab32SMasahiro Yamada qr{enum\s+$Ident}, 306*dd88ab32SMasahiro Yamada qr{${Ident}_t}, 307*dd88ab32SMasahiro Yamada qr{${Ident}_handler}, 308*dd88ab32SMasahiro Yamada qr{${Ident}_handler_fn}, 309*dd88ab32SMasahiro Yamada); 310*dd88ab32SMasahiro Yamadaour @modifierList = ( 311*dd88ab32SMasahiro Yamada qr{fastcall}, 312*dd88ab32SMasahiro Yamada); 313*dd88ab32SMasahiro Yamada 314*dd88ab32SMasahiro Yamadaour $allowed_asm_includes = qr{(?x: 315*dd88ab32SMasahiro Yamada irq| 316*dd88ab32SMasahiro Yamada memory 317*dd88ab32SMasahiro Yamada)}; 318*dd88ab32SMasahiro Yamada# memory.h: ARM has a custom one 319*dd88ab32SMasahiro Yamada 320*dd88ab32SMasahiro Yamadasub build_types { 321*dd88ab32SMasahiro Yamada my $mods = "(?x: \n" . join("|\n ", @modifierList) . "\n)"; 322*dd88ab32SMasahiro Yamada my $all = "(?x: \n" . join("|\n ", @typeList) . "\n)"; 323*dd88ab32SMasahiro Yamada $Modifier = qr{(?:$Attribute|$Sparse|$mods)}; 324*dd88ab32SMasahiro Yamada $NonptrType = qr{ 325*dd88ab32SMasahiro Yamada (?:$Modifier\s+|const\s+)* 326*dd88ab32SMasahiro Yamada (?: 327*dd88ab32SMasahiro Yamada (?:typeof|__typeof__)\s*\([^\)]*\)| 328*dd88ab32SMasahiro Yamada (?:$typeTypedefs\b)| 329*dd88ab32SMasahiro Yamada (?:${all}\b) 330*dd88ab32SMasahiro Yamada ) 331*dd88ab32SMasahiro Yamada (?:\s+$Modifier|\s+const)* 332*dd88ab32SMasahiro Yamada }x; 333*dd88ab32SMasahiro Yamada $Type = qr{ 334*dd88ab32SMasahiro Yamada $NonptrType 335*dd88ab32SMasahiro Yamada (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*|\[\])+|(?:\s*\[\s*\])+)? 336*dd88ab32SMasahiro Yamada (?:\s+$Inline|\s+$Modifier)* 337*dd88ab32SMasahiro Yamada }x; 338*dd88ab32SMasahiro Yamada $Declare = qr{(?:$Storage\s+)?$Type}; 339*dd88ab32SMasahiro Yamada} 340*dd88ab32SMasahiro Yamadabuild_types(); 341*dd88ab32SMasahiro Yamada 342*dd88ab32SMasahiro Yamada 343*dd88ab32SMasahiro Yamadaour $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*}; 344*dd88ab32SMasahiro Yamada 345*dd88ab32SMasahiro Yamada# Using $balanced_parens, $LvalOrFunc, or $FuncArg 346*dd88ab32SMasahiro Yamada# requires at least perl version v5.10.0 347*dd88ab32SMasahiro Yamada# Any use must be runtime checked with $^V 348*dd88ab32SMasahiro Yamada 349*dd88ab32SMasahiro Yamadaour $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/; 350*dd88ab32SMasahiro Yamadaour $LvalOrFunc = qr{($Lval)\s*($balanced_parens{0,1})\s*}; 351*dd88ab32SMasahiro Yamadaour $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)}; 352*dd88ab32SMasahiro Yamada 353*dd88ab32SMasahiro Yamadasub deparenthesize { 354*dd88ab32SMasahiro Yamada my ($string) = @_; 355*dd88ab32SMasahiro Yamada return "" if (!defined($string)); 356*dd88ab32SMasahiro Yamada $string =~ s@^\s*\(\s*@@g; 357*dd88ab32SMasahiro Yamada $string =~ s@\s*\)\s*$@@g; 358*dd88ab32SMasahiro Yamada $string =~ s@\s+@ @g; 359*dd88ab32SMasahiro Yamada return $string; 360*dd88ab32SMasahiro Yamada} 361*dd88ab32SMasahiro Yamada 362*dd88ab32SMasahiro Yamada$chk_signoff = 0 if ($file); 363*dd88ab32SMasahiro Yamada 364*dd88ab32SMasahiro Yamadamy @rawlines = (); 365*dd88ab32SMasahiro Yamadamy @lines = (); 366*dd88ab32SMasahiro Yamadamy $vname; 367*dd88ab32SMasahiro Yamadafor my $filename (@ARGV) { 368*dd88ab32SMasahiro Yamada my $FILE; 369*dd88ab32SMasahiro Yamada if ($file) { 370*dd88ab32SMasahiro Yamada open($FILE, '-|', "diff -u /dev/null $filename") || 371*dd88ab32SMasahiro Yamada die "$P: $filename: diff failed - $!\n"; 372*dd88ab32SMasahiro Yamada } elsif ($filename eq '-') { 373*dd88ab32SMasahiro Yamada open($FILE, '<&STDIN'); 374*dd88ab32SMasahiro Yamada } else { 375*dd88ab32SMasahiro Yamada open($FILE, '<', "$filename") || 376*dd88ab32SMasahiro Yamada die "$P: $filename: open failed - $!\n"; 377*dd88ab32SMasahiro Yamada } 378*dd88ab32SMasahiro Yamada if ($filename eq '-') { 379*dd88ab32SMasahiro Yamada $vname = 'Your patch'; 380*dd88ab32SMasahiro Yamada } else { 381*dd88ab32SMasahiro Yamada $vname = $filename; 382*dd88ab32SMasahiro Yamada } 383*dd88ab32SMasahiro Yamada while (<$FILE>) { 384*dd88ab32SMasahiro Yamada chomp; 385*dd88ab32SMasahiro Yamada push(@rawlines, $_); 386*dd88ab32SMasahiro Yamada } 387*dd88ab32SMasahiro Yamada close($FILE); 388*dd88ab32SMasahiro Yamada if (!process($filename)) { 389*dd88ab32SMasahiro Yamada $exit = 1; 390*dd88ab32SMasahiro Yamada } 391*dd88ab32SMasahiro Yamada @rawlines = (); 392*dd88ab32SMasahiro Yamada @lines = (); 393*dd88ab32SMasahiro Yamada} 394*dd88ab32SMasahiro Yamada 395*dd88ab32SMasahiro Yamadaexit($exit); 396*dd88ab32SMasahiro Yamada 397*dd88ab32SMasahiro Yamadasub top_of_kernel_tree { 398*dd88ab32SMasahiro Yamada my ($root) = @_; 399*dd88ab32SMasahiro Yamada 400*dd88ab32SMasahiro Yamada my @tree_check = ( 401*dd88ab32SMasahiro Yamada "COPYING", "CREDITS", "Kbuild", "Makefile", 402*dd88ab32SMasahiro Yamada "README", "Documentation", "arch", "include", "drivers", 403*dd88ab32SMasahiro Yamada "fs", "init", "ipc", "kernel", "lib", "scripts", 404*dd88ab32SMasahiro Yamada ); 405*dd88ab32SMasahiro Yamada 406*dd88ab32SMasahiro Yamada foreach my $check (@tree_check) { 407*dd88ab32SMasahiro Yamada if (! -e $root . '/' . $check) { 408*dd88ab32SMasahiro Yamada return 0; 409*dd88ab32SMasahiro Yamada } 410*dd88ab32SMasahiro Yamada } 411*dd88ab32SMasahiro Yamada return 1; 412*dd88ab32SMasahiro Yamada} 413*dd88ab32SMasahiro Yamada 414*dd88ab32SMasahiro Yamadasub parse_email { 415*dd88ab32SMasahiro Yamada my ($formatted_email) = @_; 416*dd88ab32SMasahiro Yamada 417*dd88ab32SMasahiro Yamada my $name = ""; 418*dd88ab32SMasahiro Yamada my $address = ""; 419*dd88ab32SMasahiro Yamada my $comment = ""; 420*dd88ab32SMasahiro Yamada 421*dd88ab32SMasahiro Yamada if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) { 422*dd88ab32SMasahiro Yamada $name = $1; 423*dd88ab32SMasahiro Yamada $address = $2; 424*dd88ab32SMasahiro Yamada $comment = $3 if defined $3; 425*dd88ab32SMasahiro Yamada } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) { 426*dd88ab32SMasahiro Yamada $address = $1; 427*dd88ab32SMasahiro Yamada $comment = $2 if defined $2; 428*dd88ab32SMasahiro Yamada } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) { 429*dd88ab32SMasahiro Yamada $address = $1; 430*dd88ab32SMasahiro Yamada $comment = $2 if defined $2; 431*dd88ab32SMasahiro Yamada $formatted_email =~ s/$address.*$//; 432*dd88ab32SMasahiro Yamada $name = $formatted_email; 433*dd88ab32SMasahiro Yamada $name =~ s/^\s+|\s+$//g; 434*dd88ab32SMasahiro Yamada $name =~ s/^\"|\"$//g; 435*dd88ab32SMasahiro Yamada # If there's a name left after stripping spaces and 436*dd88ab32SMasahiro Yamada # leading quotes, and the address doesn't have both 437*dd88ab32SMasahiro Yamada # leading and trailing angle brackets, the address 438*dd88ab32SMasahiro Yamada # is invalid. ie: 439*dd88ab32SMasahiro Yamada # "joe smith joe@smith.com" bad 440*dd88ab32SMasahiro Yamada # "joe smith <joe@smith.com" bad 441*dd88ab32SMasahiro Yamada if ($name ne "" && $address !~ /^<[^>]+>$/) { 442*dd88ab32SMasahiro Yamada $name = ""; 443*dd88ab32SMasahiro Yamada $address = ""; 444*dd88ab32SMasahiro Yamada $comment = ""; 445*dd88ab32SMasahiro Yamada } 446*dd88ab32SMasahiro Yamada } 447*dd88ab32SMasahiro Yamada 448*dd88ab32SMasahiro Yamada $name =~ s/^\s+|\s+$//g; 449*dd88ab32SMasahiro Yamada $name =~ s/^\"|\"$//g; 450*dd88ab32SMasahiro Yamada $address =~ s/^\s+|\s+$//g; 451*dd88ab32SMasahiro Yamada $address =~ s/^\<|\>$//g; 452*dd88ab32SMasahiro Yamada 453*dd88ab32SMasahiro Yamada if ($name =~ /[^\w \-]/i) { ##has "must quote" chars 454*dd88ab32SMasahiro Yamada $name =~ s/(?<!\\)"/\\"/g; ##escape quotes 455*dd88ab32SMasahiro Yamada $name = "\"$name\""; 456*dd88ab32SMasahiro Yamada } 457*dd88ab32SMasahiro Yamada 458*dd88ab32SMasahiro Yamada return ($name, $address, $comment); 459*dd88ab32SMasahiro Yamada} 460*dd88ab32SMasahiro Yamada 461*dd88ab32SMasahiro Yamadasub format_email { 462*dd88ab32SMasahiro Yamada my ($name, $address) = @_; 463*dd88ab32SMasahiro Yamada 464*dd88ab32SMasahiro Yamada my $formatted_email; 465*dd88ab32SMasahiro Yamada 466*dd88ab32SMasahiro Yamada $name =~ s/^\s+|\s+$//g; 467*dd88ab32SMasahiro Yamada $name =~ s/^\"|\"$//g; 468*dd88ab32SMasahiro Yamada $address =~ s/^\s+|\s+$//g; 469*dd88ab32SMasahiro Yamada 470*dd88ab32SMasahiro Yamada if ($name =~ /[^\w \-]/i) { ##has "must quote" chars 471*dd88ab32SMasahiro Yamada $name =~ s/(?<!\\)"/\\"/g; ##escape quotes 472*dd88ab32SMasahiro Yamada $name = "\"$name\""; 473*dd88ab32SMasahiro Yamada } 474*dd88ab32SMasahiro Yamada 475*dd88ab32SMasahiro Yamada if ("$name" eq "") { 476*dd88ab32SMasahiro Yamada $formatted_email = "$address"; 477*dd88ab32SMasahiro Yamada } else { 478*dd88ab32SMasahiro Yamada $formatted_email = "$name <$address>"; 479*dd88ab32SMasahiro Yamada } 480*dd88ab32SMasahiro Yamada 481*dd88ab32SMasahiro Yamada return $formatted_email; 482*dd88ab32SMasahiro Yamada} 483*dd88ab32SMasahiro Yamada 484*dd88ab32SMasahiro Yamadasub which_conf { 485*dd88ab32SMasahiro Yamada my ($conf) = @_; 486*dd88ab32SMasahiro Yamada 487*dd88ab32SMasahiro Yamada foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) { 488*dd88ab32SMasahiro Yamada if (-e "$path/$conf") { 489*dd88ab32SMasahiro Yamada return "$path/$conf"; 490*dd88ab32SMasahiro Yamada } 491*dd88ab32SMasahiro Yamada } 492*dd88ab32SMasahiro Yamada 493*dd88ab32SMasahiro Yamada return ""; 494*dd88ab32SMasahiro Yamada} 495*dd88ab32SMasahiro Yamada 496*dd88ab32SMasahiro Yamadasub expand_tabs { 497*dd88ab32SMasahiro Yamada my ($str) = @_; 498*dd88ab32SMasahiro Yamada 499*dd88ab32SMasahiro Yamada my $res = ''; 500*dd88ab32SMasahiro Yamada my $n = 0; 501*dd88ab32SMasahiro Yamada for my $c (split(//, $str)) { 502*dd88ab32SMasahiro Yamada if ($c eq "\t") { 503*dd88ab32SMasahiro Yamada $res .= ' '; 504*dd88ab32SMasahiro Yamada $n++; 505*dd88ab32SMasahiro Yamada for (; ($n % 8) != 0; $n++) { 506*dd88ab32SMasahiro Yamada $res .= ' '; 507*dd88ab32SMasahiro Yamada } 508*dd88ab32SMasahiro Yamada next; 509*dd88ab32SMasahiro Yamada } 510*dd88ab32SMasahiro Yamada $res .= $c; 511*dd88ab32SMasahiro Yamada $n++; 512*dd88ab32SMasahiro Yamada } 513*dd88ab32SMasahiro Yamada 514*dd88ab32SMasahiro Yamada return $res; 515*dd88ab32SMasahiro Yamada} 516*dd88ab32SMasahiro Yamadasub copy_spacing { 517*dd88ab32SMasahiro Yamada (my $res = shift) =~ tr/\t/ /c; 518*dd88ab32SMasahiro Yamada return $res; 519*dd88ab32SMasahiro Yamada} 520*dd88ab32SMasahiro Yamada 521*dd88ab32SMasahiro Yamadasub line_stats { 522*dd88ab32SMasahiro Yamada my ($line) = @_; 523*dd88ab32SMasahiro Yamada 524*dd88ab32SMasahiro Yamada # Drop the diff line leader and expand tabs 525*dd88ab32SMasahiro Yamada $line =~ s/^.//; 526*dd88ab32SMasahiro Yamada $line = expand_tabs($line); 527*dd88ab32SMasahiro Yamada 528*dd88ab32SMasahiro Yamada # Pick the indent from the front of the line. 529*dd88ab32SMasahiro Yamada my ($white) = ($line =~ /^(\s*)/); 530*dd88ab32SMasahiro Yamada 531*dd88ab32SMasahiro Yamada return (length($line), length($white)); 532*dd88ab32SMasahiro Yamada} 533*dd88ab32SMasahiro Yamada 534*dd88ab32SMasahiro Yamadamy $sanitise_quote = ''; 535*dd88ab32SMasahiro Yamada 536*dd88ab32SMasahiro Yamadasub sanitise_line_reset { 537*dd88ab32SMasahiro Yamada my ($in_comment) = @_; 538*dd88ab32SMasahiro Yamada 539*dd88ab32SMasahiro Yamada if ($in_comment) { 540*dd88ab32SMasahiro Yamada $sanitise_quote = '*/'; 541*dd88ab32SMasahiro Yamada } else { 542*dd88ab32SMasahiro Yamada $sanitise_quote = ''; 543*dd88ab32SMasahiro Yamada } 544*dd88ab32SMasahiro Yamada} 545*dd88ab32SMasahiro Yamadasub sanitise_line { 546*dd88ab32SMasahiro Yamada my ($line) = @_; 547*dd88ab32SMasahiro Yamada 548*dd88ab32SMasahiro Yamada my $res = ''; 549*dd88ab32SMasahiro Yamada my $l = ''; 550*dd88ab32SMasahiro Yamada 551*dd88ab32SMasahiro Yamada my $qlen = 0; 552*dd88ab32SMasahiro Yamada my $off = 0; 553*dd88ab32SMasahiro Yamada my $c; 554*dd88ab32SMasahiro Yamada 555*dd88ab32SMasahiro Yamada # Always copy over the diff marker. 556*dd88ab32SMasahiro Yamada $res = substr($line, 0, 1); 557*dd88ab32SMasahiro Yamada 558*dd88ab32SMasahiro Yamada for ($off = 1; $off < length($line); $off++) { 559*dd88ab32SMasahiro Yamada $c = substr($line, $off, 1); 560*dd88ab32SMasahiro Yamada 561*dd88ab32SMasahiro Yamada # Comments we are wacking completly including the begin 562*dd88ab32SMasahiro Yamada # and end, all to $;. 563*dd88ab32SMasahiro Yamada if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') { 564*dd88ab32SMasahiro Yamada $sanitise_quote = '*/'; 565*dd88ab32SMasahiro Yamada 566*dd88ab32SMasahiro Yamada substr($res, $off, 2, "$;$;"); 567*dd88ab32SMasahiro Yamada $off++; 568*dd88ab32SMasahiro Yamada next; 569*dd88ab32SMasahiro Yamada } 570*dd88ab32SMasahiro Yamada if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') { 571*dd88ab32SMasahiro Yamada $sanitise_quote = ''; 572*dd88ab32SMasahiro Yamada substr($res, $off, 2, "$;$;"); 573*dd88ab32SMasahiro Yamada $off++; 574*dd88ab32SMasahiro Yamada next; 575*dd88ab32SMasahiro Yamada } 576*dd88ab32SMasahiro Yamada if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') { 577*dd88ab32SMasahiro Yamada $sanitise_quote = '//'; 578*dd88ab32SMasahiro Yamada 579*dd88ab32SMasahiro Yamada substr($res, $off, 2, $sanitise_quote); 580*dd88ab32SMasahiro Yamada $off++; 581*dd88ab32SMasahiro Yamada next; 582*dd88ab32SMasahiro Yamada } 583*dd88ab32SMasahiro Yamada 584*dd88ab32SMasahiro Yamada # A \ in a string means ignore the next character. 585*dd88ab32SMasahiro Yamada if (($sanitise_quote eq "'" || $sanitise_quote eq '"') && 586*dd88ab32SMasahiro Yamada $c eq "\\") { 587*dd88ab32SMasahiro Yamada substr($res, $off, 2, 'XX'); 588*dd88ab32SMasahiro Yamada $off++; 589*dd88ab32SMasahiro Yamada next; 590*dd88ab32SMasahiro Yamada } 591*dd88ab32SMasahiro Yamada # Regular quotes. 592*dd88ab32SMasahiro Yamada if ($c eq "'" || $c eq '"') { 593*dd88ab32SMasahiro Yamada if ($sanitise_quote eq '') { 594*dd88ab32SMasahiro Yamada $sanitise_quote = $c; 595*dd88ab32SMasahiro Yamada 596*dd88ab32SMasahiro Yamada substr($res, $off, 1, $c); 597*dd88ab32SMasahiro Yamada next; 598*dd88ab32SMasahiro Yamada } elsif ($sanitise_quote eq $c) { 599*dd88ab32SMasahiro Yamada $sanitise_quote = ''; 600*dd88ab32SMasahiro Yamada } 601*dd88ab32SMasahiro Yamada } 602*dd88ab32SMasahiro Yamada 603*dd88ab32SMasahiro Yamada #print "c<$c> SQ<$sanitise_quote>\n"; 604*dd88ab32SMasahiro Yamada if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") { 605*dd88ab32SMasahiro Yamada substr($res, $off, 1, $;); 606*dd88ab32SMasahiro Yamada } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") { 607*dd88ab32SMasahiro Yamada substr($res, $off, 1, $;); 608*dd88ab32SMasahiro Yamada } elsif ($off != 0 && $sanitise_quote && $c ne "\t") { 609*dd88ab32SMasahiro Yamada substr($res, $off, 1, 'X'); 610*dd88ab32SMasahiro Yamada } else { 611*dd88ab32SMasahiro Yamada substr($res, $off, 1, $c); 612*dd88ab32SMasahiro Yamada } 613*dd88ab32SMasahiro Yamada } 614*dd88ab32SMasahiro Yamada 615*dd88ab32SMasahiro Yamada if ($sanitise_quote eq '//') { 616*dd88ab32SMasahiro Yamada $sanitise_quote = ''; 617*dd88ab32SMasahiro Yamada } 618*dd88ab32SMasahiro Yamada 619*dd88ab32SMasahiro Yamada # The pathname on a #include may be surrounded by '<' and '>'. 620*dd88ab32SMasahiro Yamada if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) { 621*dd88ab32SMasahiro Yamada my $clean = 'X' x length($1); 622*dd88ab32SMasahiro Yamada $res =~ s@\<.*\>@<$clean>@; 623*dd88ab32SMasahiro Yamada 624*dd88ab32SMasahiro Yamada # The whole of a #error is a string. 625*dd88ab32SMasahiro Yamada } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) { 626*dd88ab32SMasahiro Yamada my $clean = 'X' x length($1); 627*dd88ab32SMasahiro Yamada $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@; 628*dd88ab32SMasahiro Yamada } 629*dd88ab32SMasahiro Yamada 630*dd88ab32SMasahiro Yamada return $res; 631*dd88ab32SMasahiro Yamada} 632*dd88ab32SMasahiro Yamada 633*dd88ab32SMasahiro Yamadasub ctx_statement_block { 634*dd88ab32SMasahiro Yamada my ($linenr, $remain, $off) = @_; 635*dd88ab32SMasahiro Yamada my $line = $linenr - 1; 636*dd88ab32SMasahiro Yamada my $blk = ''; 637*dd88ab32SMasahiro Yamada my $soff = $off; 638*dd88ab32SMasahiro Yamada my $coff = $off - 1; 639*dd88ab32SMasahiro Yamada my $coff_set = 0; 640*dd88ab32SMasahiro Yamada 641*dd88ab32SMasahiro Yamada my $loff = 0; 642*dd88ab32SMasahiro Yamada 643*dd88ab32SMasahiro Yamada my $type = ''; 644*dd88ab32SMasahiro Yamada my $level = 0; 645*dd88ab32SMasahiro Yamada my @stack = (); 646*dd88ab32SMasahiro Yamada my $p; 647*dd88ab32SMasahiro Yamada my $c; 648*dd88ab32SMasahiro Yamada my $len = 0; 649*dd88ab32SMasahiro Yamada 650*dd88ab32SMasahiro Yamada my $remainder; 651*dd88ab32SMasahiro Yamada while (1) { 652*dd88ab32SMasahiro Yamada @stack = (['', 0]) if ($#stack == -1); 653*dd88ab32SMasahiro Yamada 654*dd88ab32SMasahiro Yamada #warn "CSB: blk<$blk> remain<$remain>\n"; 655*dd88ab32SMasahiro Yamada # If we are about to drop off the end, pull in more 656*dd88ab32SMasahiro Yamada # context. 657*dd88ab32SMasahiro Yamada if ($off >= $len) { 658*dd88ab32SMasahiro Yamada for (; $remain > 0; $line++) { 659*dd88ab32SMasahiro Yamada last if (!defined $lines[$line]); 660*dd88ab32SMasahiro Yamada next if ($lines[$line] =~ /^-/); 661*dd88ab32SMasahiro Yamada $remain--; 662*dd88ab32SMasahiro Yamada $loff = $len; 663*dd88ab32SMasahiro Yamada $blk .= $lines[$line] . "\n"; 664*dd88ab32SMasahiro Yamada $len = length($blk); 665*dd88ab32SMasahiro Yamada $line++; 666*dd88ab32SMasahiro Yamada last; 667*dd88ab32SMasahiro Yamada } 668*dd88ab32SMasahiro Yamada # Bail if there is no further context. 669*dd88ab32SMasahiro Yamada #warn "CSB: blk<$blk> off<$off> len<$len>\n"; 670*dd88ab32SMasahiro Yamada if ($off >= $len) { 671*dd88ab32SMasahiro Yamada last; 672*dd88ab32SMasahiro Yamada } 673*dd88ab32SMasahiro Yamada if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) { 674*dd88ab32SMasahiro Yamada $level++; 675*dd88ab32SMasahiro Yamada $type = '#'; 676*dd88ab32SMasahiro Yamada } 677*dd88ab32SMasahiro Yamada } 678*dd88ab32SMasahiro Yamada $p = $c; 679*dd88ab32SMasahiro Yamada $c = substr($blk, $off, 1); 680*dd88ab32SMasahiro Yamada $remainder = substr($blk, $off); 681*dd88ab32SMasahiro Yamada 682*dd88ab32SMasahiro Yamada #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n"; 683*dd88ab32SMasahiro Yamada 684*dd88ab32SMasahiro Yamada # Handle nested #if/#else. 685*dd88ab32SMasahiro Yamada if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) { 686*dd88ab32SMasahiro Yamada push(@stack, [ $type, $level ]); 687*dd88ab32SMasahiro Yamada } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) { 688*dd88ab32SMasahiro Yamada ($type, $level) = @{$stack[$#stack - 1]}; 689*dd88ab32SMasahiro Yamada } elsif ($remainder =~ /^#\s*endif\b/) { 690*dd88ab32SMasahiro Yamada ($type, $level) = @{pop(@stack)}; 691*dd88ab32SMasahiro Yamada } 692*dd88ab32SMasahiro Yamada 693*dd88ab32SMasahiro Yamada # Statement ends at the ';' or a close '}' at the 694*dd88ab32SMasahiro Yamada # outermost level. 695*dd88ab32SMasahiro Yamada if ($level == 0 && $c eq ';') { 696*dd88ab32SMasahiro Yamada last; 697*dd88ab32SMasahiro Yamada } 698*dd88ab32SMasahiro Yamada 699*dd88ab32SMasahiro Yamada # An else is really a conditional as long as its not else if 700*dd88ab32SMasahiro Yamada if ($level == 0 && $coff_set == 0 && 701*dd88ab32SMasahiro Yamada (!defined($p) || $p =~ /(?:\s|\}|\+)/) && 702*dd88ab32SMasahiro Yamada $remainder =~ /^(else)(?:\s|{)/ && 703*dd88ab32SMasahiro Yamada $remainder !~ /^else\s+if\b/) { 704*dd88ab32SMasahiro Yamada $coff = $off + length($1) - 1; 705*dd88ab32SMasahiro Yamada $coff_set = 1; 706*dd88ab32SMasahiro Yamada #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n"; 707*dd88ab32SMasahiro Yamada #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n"; 708*dd88ab32SMasahiro Yamada } 709*dd88ab32SMasahiro Yamada 710*dd88ab32SMasahiro Yamada if (($type eq '' || $type eq '(') && $c eq '(') { 711*dd88ab32SMasahiro Yamada $level++; 712*dd88ab32SMasahiro Yamada $type = '('; 713*dd88ab32SMasahiro Yamada } 714*dd88ab32SMasahiro Yamada if ($type eq '(' && $c eq ')') { 715*dd88ab32SMasahiro Yamada $level--; 716*dd88ab32SMasahiro Yamada $type = ($level != 0)? '(' : ''; 717*dd88ab32SMasahiro Yamada 718*dd88ab32SMasahiro Yamada if ($level == 0 && $coff < $soff) { 719*dd88ab32SMasahiro Yamada $coff = $off; 720*dd88ab32SMasahiro Yamada $coff_set = 1; 721*dd88ab32SMasahiro Yamada #warn "CSB: mark coff<$coff>\n"; 722*dd88ab32SMasahiro Yamada } 723*dd88ab32SMasahiro Yamada } 724*dd88ab32SMasahiro Yamada if (($type eq '' || $type eq '{') && $c eq '{') { 725*dd88ab32SMasahiro Yamada $level++; 726*dd88ab32SMasahiro Yamada $type = '{'; 727*dd88ab32SMasahiro Yamada } 728*dd88ab32SMasahiro Yamada if ($type eq '{' && $c eq '}') { 729*dd88ab32SMasahiro Yamada $level--; 730*dd88ab32SMasahiro Yamada $type = ($level != 0)? '{' : ''; 731*dd88ab32SMasahiro Yamada 732*dd88ab32SMasahiro Yamada if ($level == 0) { 733*dd88ab32SMasahiro Yamada if (substr($blk, $off + 1, 1) eq ';') { 734*dd88ab32SMasahiro Yamada $off++; 735*dd88ab32SMasahiro Yamada } 736*dd88ab32SMasahiro Yamada last; 737*dd88ab32SMasahiro Yamada } 738*dd88ab32SMasahiro Yamada } 739*dd88ab32SMasahiro Yamada # Preprocessor commands end at the newline unless escaped. 740*dd88ab32SMasahiro Yamada if ($type eq '#' && $c eq "\n" && $p ne "\\") { 741*dd88ab32SMasahiro Yamada $level--; 742*dd88ab32SMasahiro Yamada $type = ''; 743*dd88ab32SMasahiro Yamada $off++; 744*dd88ab32SMasahiro Yamada last; 745*dd88ab32SMasahiro Yamada } 746*dd88ab32SMasahiro Yamada $off++; 747*dd88ab32SMasahiro Yamada } 748*dd88ab32SMasahiro Yamada # We are truly at the end, so shuffle to the next line. 749*dd88ab32SMasahiro Yamada if ($off == $len) { 750*dd88ab32SMasahiro Yamada $loff = $len + 1; 751*dd88ab32SMasahiro Yamada $line++; 752*dd88ab32SMasahiro Yamada $remain--; 753*dd88ab32SMasahiro Yamada } 754*dd88ab32SMasahiro Yamada 755*dd88ab32SMasahiro Yamada my $statement = substr($blk, $soff, $off - $soff + 1); 756*dd88ab32SMasahiro Yamada my $condition = substr($blk, $soff, $coff - $soff + 1); 757*dd88ab32SMasahiro Yamada 758*dd88ab32SMasahiro Yamada #warn "STATEMENT<$statement>\n"; 759*dd88ab32SMasahiro Yamada #warn "CONDITION<$condition>\n"; 760*dd88ab32SMasahiro Yamada 761*dd88ab32SMasahiro Yamada #print "coff<$coff> soff<$off> loff<$loff>\n"; 762*dd88ab32SMasahiro Yamada 763*dd88ab32SMasahiro Yamada return ($statement, $condition, 764*dd88ab32SMasahiro Yamada $line, $remain + 1, $off - $loff + 1, $level); 765*dd88ab32SMasahiro Yamada} 766*dd88ab32SMasahiro Yamada 767*dd88ab32SMasahiro Yamadasub statement_lines { 768*dd88ab32SMasahiro Yamada my ($stmt) = @_; 769*dd88ab32SMasahiro Yamada 770*dd88ab32SMasahiro Yamada # Strip the diff line prefixes and rip blank lines at start and end. 771*dd88ab32SMasahiro Yamada $stmt =~ s/(^|\n)./$1/g; 772*dd88ab32SMasahiro Yamada $stmt =~ s/^\s*//; 773*dd88ab32SMasahiro Yamada $stmt =~ s/\s*$//; 774*dd88ab32SMasahiro Yamada 775*dd88ab32SMasahiro Yamada my @stmt_lines = ($stmt =~ /\n/g); 776*dd88ab32SMasahiro Yamada 777*dd88ab32SMasahiro Yamada return $#stmt_lines + 2; 778*dd88ab32SMasahiro Yamada} 779*dd88ab32SMasahiro Yamada 780*dd88ab32SMasahiro Yamadasub statement_rawlines { 781*dd88ab32SMasahiro Yamada my ($stmt) = @_; 782*dd88ab32SMasahiro Yamada 783*dd88ab32SMasahiro Yamada my @stmt_lines = ($stmt =~ /\n/g); 784*dd88ab32SMasahiro Yamada 785*dd88ab32SMasahiro Yamada return $#stmt_lines + 2; 786*dd88ab32SMasahiro Yamada} 787*dd88ab32SMasahiro Yamada 788*dd88ab32SMasahiro Yamadasub statement_block_size { 789*dd88ab32SMasahiro Yamada my ($stmt) = @_; 790*dd88ab32SMasahiro Yamada 791*dd88ab32SMasahiro Yamada $stmt =~ s/(^|\n)./$1/g; 792*dd88ab32SMasahiro Yamada $stmt =~ s/^\s*{//; 793*dd88ab32SMasahiro Yamada $stmt =~ s/}\s*$//; 794*dd88ab32SMasahiro Yamada $stmt =~ s/^\s*//; 795*dd88ab32SMasahiro Yamada $stmt =~ s/\s*$//; 796*dd88ab32SMasahiro Yamada 797*dd88ab32SMasahiro Yamada my @stmt_lines = ($stmt =~ /\n/g); 798*dd88ab32SMasahiro Yamada my @stmt_statements = ($stmt =~ /;/g); 799*dd88ab32SMasahiro Yamada 800*dd88ab32SMasahiro Yamada my $stmt_lines = $#stmt_lines + 2; 801*dd88ab32SMasahiro Yamada my $stmt_statements = $#stmt_statements + 1; 802*dd88ab32SMasahiro Yamada 803*dd88ab32SMasahiro Yamada if ($stmt_lines > $stmt_statements) { 804*dd88ab32SMasahiro Yamada return $stmt_lines; 805*dd88ab32SMasahiro Yamada } else { 806*dd88ab32SMasahiro Yamada return $stmt_statements; 807*dd88ab32SMasahiro Yamada } 808*dd88ab32SMasahiro Yamada} 809*dd88ab32SMasahiro Yamada 810*dd88ab32SMasahiro Yamadasub ctx_statement_full { 811*dd88ab32SMasahiro Yamada my ($linenr, $remain, $off) = @_; 812*dd88ab32SMasahiro Yamada my ($statement, $condition, $level); 813*dd88ab32SMasahiro Yamada 814*dd88ab32SMasahiro Yamada my (@chunks); 815*dd88ab32SMasahiro Yamada 816*dd88ab32SMasahiro Yamada # Grab the first conditional/block pair. 817*dd88ab32SMasahiro Yamada ($statement, $condition, $linenr, $remain, $off, $level) = 818*dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $remain, $off); 819*dd88ab32SMasahiro Yamada #print "F: c<$condition> s<$statement> remain<$remain>\n"; 820*dd88ab32SMasahiro Yamada push(@chunks, [ $condition, $statement ]); 821*dd88ab32SMasahiro Yamada if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) { 822*dd88ab32SMasahiro Yamada return ($level, $linenr, @chunks); 823*dd88ab32SMasahiro Yamada } 824*dd88ab32SMasahiro Yamada 825*dd88ab32SMasahiro Yamada # Pull in the following conditional/block pairs and see if they 826*dd88ab32SMasahiro Yamada # could continue the statement. 827*dd88ab32SMasahiro Yamada for (;;) { 828*dd88ab32SMasahiro Yamada ($statement, $condition, $linenr, $remain, $off, $level) = 829*dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $remain, $off); 830*dd88ab32SMasahiro Yamada #print "C: c<$condition> s<$statement> remain<$remain>\n"; 831*dd88ab32SMasahiro Yamada last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s)); 832*dd88ab32SMasahiro Yamada #print "C: push\n"; 833*dd88ab32SMasahiro Yamada push(@chunks, [ $condition, $statement ]); 834*dd88ab32SMasahiro Yamada } 835*dd88ab32SMasahiro Yamada 836*dd88ab32SMasahiro Yamada return ($level, $linenr, @chunks); 837*dd88ab32SMasahiro Yamada} 838*dd88ab32SMasahiro Yamada 839*dd88ab32SMasahiro Yamadasub ctx_block_get { 840*dd88ab32SMasahiro Yamada my ($linenr, $remain, $outer, $open, $close, $off) = @_; 841*dd88ab32SMasahiro Yamada my $line; 842*dd88ab32SMasahiro Yamada my $start = $linenr - 1; 843*dd88ab32SMasahiro Yamada my $blk = ''; 844*dd88ab32SMasahiro Yamada my @o; 845*dd88ab32SMasahiro Yamada my @c; 846*dd88ab32SMasahiro Yamada my @res = (); 847*dd88ab32SMasahiro Yamada 848*dd88ab32SMasahiro Yamada my $level = 0; 849*dd88ab32SMasahiro Yamada my @stack = ($level); 850*dd88ab32SMasahiro Yamada for ($line = $start; $remain > 0; $line++) { 851*dd88ab32SMasahiro Yamada next if ($rawlines[$line] =~ /^-/); 852*dd88ab32SMasahiro Yamada $remain--; 853*dd88ab32SMasahiro Yamada 854*dd88ab32SMasahiro Yamada $blk .= $rawlines[$line]; 855*dd88ab32SMasahiro Yamada 856*dd88ab32SMasahiro Yamada # Handle nested #if/#else. 857*dd88ab32SMasahiro Yamada if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) { 858*dd88ab32SMasahiro Yamada push(@stack, $level); 859*dd88ab32SMasahiro Yamada } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) { 860*dd88ab32SMasahiro Yamada $level = $stack[$#stack - 1]; 861*dd88ab32SMasahiro Yamada } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) { 862*dd88ab32SMasahiro Yamada $level = pop(@stack); 863*dd88ab32SMasahiro Yamada } 864*dd88ab32SMasahiro Yamada 865*dd88ab32SMasahiro Yamada foreach my $c (split(//, $lines[$line])) { 866*dd88ab32SMasahiro Yamada ##print "C<$c>L<$level><$open$close>O<$off>\n"; 867*dd88ab32SMasahiro Yamada if ($off > 0) { 868*dd88ab32SMasahiro Yamada $off--; 869*dd88ab32SMasahiro Yamada next; 870*dd88ab32SMasahiro Yamada } 871*dd88ab32SMasahiro Yamada 872*dd88ab32SMasahiro Yamada if ($c eq $close && $level > 0) { 873*dd88ab32SMasahiro Yamada $level--; 874*dd88ab32SMasahiro Yamada last if ($level == 0); 875*dd88ab32SMasahiro Yamada } elsif ($c eq $open) { 876*dd88ab32SMasahiro Yamada $level++; 877*dd88ab32SMasahiro Yamada } 878*dd88ab32SMasahiro Yamada } 879*dd88ab32SMasahiro Yamada 880*dd88ab32SMasahiro Yamada if (!$outer || $level <= 1) { 881*dd88ab32SMasahiro Yamada push(@res, $rawlines[$line]); 882*dd88ab32SMasahiro Yamada } 883*dd88ab32SMasahiro Yamada 884*dd88ab32SMasahiro Yamada last if ($level == 0); 885*dd88ab32SMasahiro Yamada } 886*dd88ab32SMasahiro Yamada 887*dd88ab32SMasahiro Yamada return ($level, @res); 888*dd88ab32SMasahiro Yamada} 889*dd88ab32SMasahiro Yamadasub ctx_block_outer { 890*dd88ab32SMasahiro Yamada my ($linenr, $remain) = @_; 891*dd88ab32SMasahiro Yamada 892*dd88ab32SMasahiro Yamada my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0); 893*dd88ab32SMasahiro Yamada return @r; 894*dd88ab32SMasahiro Yamada} 895*dd88ab32SMasahiro Yamadasub ctx_block { 896*dd88ab32SMasahiro Yamada my ($linenr, $remain) = @_; 897*dd88ab32SMasahiro Yamada 898*dd88ab32SMasahiro Yamada my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0); 899*dd88ab32SMasahiro Yamada return @r; 900*dd88ab32SMasahiro Yamada} 901*dd88ab32SMasahiro Yamadasub ctx_statement { 902*dd88ab32SMasahiro Yamada my ($linenr, $remain, $off) = @_; 903*dd88ab32SMasahiro Yamada 904*dd88ab32SMasahiro Yamada my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off); 905*dd88ab32SMasahiro Yamada return @r; 906*dd88ab32SMasahiro Yamada} 907*dd88ab32SMasahiro Yamadasub ctx_block_level { 908*dd88ab32SMasahiro Yamada my ($linenr, $remain) = @_; 909*dd88ab32SMasahiro Yamada 910*dd88ab32SMasahiro Yamada return ctx_block_get($linenr, $remain, 0, '{', '}', 0); 911*dd88ab32SMasahiro Yamada} 912*dd88ab32SMasahiro Yamadasub ctx_statement_level { 913*dd88ab32SMasahiro Yamada my ($linenr, $remain, $off) = @_; 914*dd88ab32SMasahiro Yamada 915*dd88ab32SMasahiro Yamada return ctx_block_get($linenr, $remain, 0, '(', ')', $off); 916*dd88ab32SMasahiro Yamada} 917*dd88ab32SMasahiro Yamada 918*dd88ab32SMasahiro Yamadasub ctx_locate_comment { 919*dd88ab32SMasahiro Yamada my ($first_line, $end_line) = @_; 920*dd88ab32SMasahiro Yamada 921*dd88ab32SMasahiro Yamada # Catch a comment on the end of the line itself. 922*dd88ab32SMasahiro Yamada my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@); 923*dd88ab32SMasahiro Yamada return $current_comment if (defined $current_comment); 924*dd88ab32SMasahiro Yamada 925*dd88ab32SMasahiro Yamada # Look through the context and try and figure out if there is a 926*dd88ab32SMasahiro Yamada # comment. 927*dd88ab32SMasahiro Yamada my $in_comment = 0; 928*dd88ab32SMasahiro Yamada $current_comment = ''; 929*dd88ab32SMasahiro Yamada for (my $linenr = $first_line; $linenr < $end_line; $linenr++) { 930*dd88ab32SMasahiro Yamada my $line = $rawlines[$linenr - 1]; 931*dd88ab32SMasahiro Yamada #warn " $line\n"; 932*dd88ab32SMasahiro Yamada if ($linenr == $first_line and $line =~ m@^.\s*\*@) { 933*dd88ab32SMasahiro Yamada $in_comment = 1; 934*dd88ab32SMasahiro Yamada } 935*dd88ab32SMasahiro Yamada if ($line =~ m@/\*@) { 936*dd88ab32SMasahiro Yamada $in_comment = 1; 937*dd88ab32SMasahiro Yamada } 938*dd88ab32SMasahiro Yamada if (!$in_comment && $current_comment ne '') { 939*dd88ab32SMasahiro Yamada $current_comment = ''; 940*dd88ab32SMasahiro Yamada } 941*dd88ab32SMasahiro Yamada $current_comment .= $line . "\n" if ($in_comment); 942*dd88ab32SMasahiro Yamada if ($line =~ m@\*/@) { 943*dd88ab32SMasahiro Yamada $in_comment = 0; 944*dd88ab32SMasahiro Yamada } 945*dd88ab32SMasahiro Yamada } 946*dd88ab32SMasahiro Yamada 947*dd88ab32SMasahiro Yamada chomp($current_comment); 948*dd88ab32SMasahiro Yamada return($current_comment); 949*dd88ab32SMasahiro Yamada} 950*dd88ab32SMasahiro Yamadasub ctx_has_comment { 951*dd88ab32SMasahiro Yamada my ($first_line, $end_line) = @_; 952*dd88ab32SMasahiro Yamada my $cmt = ctx_locate_comment($first_line, $end_line); 953*dd88ab32SMasahiro Yamada 954*dd88ab32SMasahiro Yamada ##print "LINE: $rawlines[$end_line - 1 ]\n"; 955*dd88ab32SMasahiro Yamada ##print "CMMT: $cmt\n"; 956*dd88ab32SMasahiro Yamada 957*dd88ab32SMasahiro Yamada return ($cmt ne ''); 958*dd88ab32SMasahiro Yamada} 959*dd88ab32SMasahiro Yamada 960*dd88ab32SMasahiro Yamadasub raw_line { 961*dd88ab32SMasahiro Yamada my ($linenr, $cnt) = @_; 962*dd88ab32SMasahiro Yamada 963*dd88ab32SMasahiro Yamada my $offset = $linenr - 1; 964*dd88ab32SMasahiro Yamada $cnt++; 965*dd88ab32SMasahiro Yamada 966*dd88ab32SMasahiro Yamada my $line; 967*dd88ab32SMasahiro Yamada while ($cnt) { 968*dd88ab32SMasahiro Yamada $line = $rawlines[$offset++]; 969*dd88ab32SMasahiro Yamada next if (defined($line) && $line =~ /^-/); 970*dd88ab32SMasahiro Yamada $cnt--; 971*dd88ab32SMasahiro Yamada } 972*dd88ab32SMasahiro Yamada 973*dd88ab32SMasahiro Yamada return $line; 974*dd88ab32SMasahiro Yamada} 975*dd88ab32SMasahiro Yamada 976*dd88ab32SMasahiro Yamadasub cat_vet { 977*dd88ab32SMasahiro Yamada my ($vet) = @_; 978*dd88ab32SMasahiro Yamada my ($res, $coded); 979*dd88ab32SMasahiro Yamada 980*dd88ab32SMasahiro Yamada $res = ''; 981*dd88ab32SMasahiro Yamada while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) { 982*dd88ab32SMasahiro Yamada $res .= $1; 983*dd88ab32SMasahiro Yamada if ($2 ne '') { 984*dd88ab32SMasahiro Yamada $coded = sprintf("^%c", unpack('C', $2) + 64); 985*dd88ab32SMasahiro Yamada $res .= $coded; 986*dd88ab32SMasahiro Yamada } 987*dd88ab32SMasahiro Yamada } 988*dd88ab32SMasahiro Yamada $res =~ s/$/\$/; 989*dd88ab32SMasahiro Yamada 990*dd88ab32SMasahiro Yamada return $res; 991*dd88ab32SMasahiro Yamada} 992*dd88ab32SMasahiro Yamada 993*dd88ab32SMasahiro Yamadamy $av_preprocessor = 0; 994*dd88ab32SMasahiro Yamadamy $av_pending; 995*dd88ab32SMasahiro Yamadamy @av_paren_type; 996*dd88ab32SMasahiro Yamadamy $av_pend_colon; 997*dd88ab32SMasahiro Yamada 998*dd88ab32SMasahiro Yamadasub annotate_reset { 999*dd88ab32SMasahiro Yamada $av_preprocessor = 0; 1000*dd88ab32SMasahiro Yamada $av_pending = '_'; 1001*dd88ab32SMasahiro Yamada @av_paren_type = ('E'); 1002*dd88ab32SMasahiro Yamada $av_pend_colon = 'O'; 1003*dd88ab32SMasahiro Yamada} 1004*dd88ab32SMasahiro Yamada 1005*dd88ab32SMasahiro Yamadasub annotate_values { 1006*dd88ab32SMasahiro Yamada my ($stream, $type) = @_; 1007*dd88ab32SMasahiro Yamada 1008*dd88ab32SMasahiro Yamada my $res; 1009*dd88ab32SMasahiro Yamada my $var = '_' x length($stream); 1010*dd88ab32SMasahiro Yamada my $cur = $stream; 1011*dd88ab32SMasahiro Yamada 1012*dd88ab32SMasahiro Yamada print "$stream\n" if ($dbg_values > 1); 1013*dd88ab32SMasahiro Yamada 1014*dd88ab32SMasahiro Yamada while (length($cur)) { 1015*dd88ab32SMasahiro Yamada @av_paren_type = ('E') if ($#av_paren_type < 0); 1016*dd88ab32SMasahiro Yamada print " <" . join('', @av_paren_type) . 1017*dd88ab32SMasahiro Yamada "> <$type> <$av_pending>" if ($dbg_values > 1); 1018*dd88ab32SMasahiro Yamada if ($cur =~ /^(\s+)/o) { 1019*dd88ab32SMasahiro Yamada print "WS($1)\n" if ($dbg_values > 1); 1020*dd88ab32SMasahiro Yamada if ($1 =~ /\n/ && $av_preprocessor) { 1021*dd88ab32SMasahiro Yamada $type = pop(@av_paren_type); 1022*dd88ab32SMasahiro Yamada $av_preprocessor = 0; 1023*dd88ab32SMasahiro Yamada } 1024*dd88ab32SMasahiro Yamada 1025*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') { 1026*dd88ab32SMasahiro Yamada print "CAST($1)\n" if ($dbg_values > 1); 1027*dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1028*dd88ab32SMasahiro Yamada $type = 'c'; 1029*dd88ab32SMasahiro Yamada 1030*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) { 1031*dd88ab32SMasahiro Yamada print "DECLARE($1)\n" if ($dbg_values > 1); 1032*dd88ab32SMasahiro Yamada $type = 'T'; 1033*dd88ab32SMasahiro Yamada 1034*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Modifier)\s*/) { 1035*dd88ab32SMasahiro Yamada print "MODIFIER($1)\n" if ($dbg_values > 1); 1036*dd88ab32SMasahiro Yamada $type = 'T'; 1037*dd88ab32SMasahiro Yamada 1038*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) { 1039*dd88ab32SMasahiro Yamada print "DEFINE($1,$2)\n" if ($dbg_values > 1); 1040*dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1041*dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1042*dd88ab32SMasahiro Yamada if ($2 ne '') { 1043*dd88ab32SMasahiro Yamada $av_pending = 'N'; 1044*dd88ab32SMasahiro Yamada } 1045*dd88ab32SMasahiro Yamada $type = 'E'; 1046*dd88ab32SMasahiro Yamada 1047*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) { 1048*dd88ab32SMasahiro Yamada print "UNDEF($1)\n" if ($dbg_values > 1); 1049*dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1050*dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1051*dd88ab32SMasahiro Yamada 1052*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) { 1053*dd88ab32SMasahiro Yamada print "PRE_START($1)\n" if ($dbg_values > 1); 1054*dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1055*dd88ab32SMasahiro Yamada 1056*dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1057*dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1058*dd88ab32SMasahiro Yamada $type = 'E'; 1059*dd88ab32SMasahiro Yamada 1060*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) { 1061*dd88ab32SMasahiro Yamada print "PRE_RESTART($1)\n" if ($dbg_values > 1); 1062*dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1063*dd88ab32SMasahiro Yamada 1064*dd88ab32SMasahiro Yamada push(@av_paren_type, $av_paren_type[$#av_paren_type]); 1065*dd88ab32SMasahiro Yamada 1066*dd88ab32SMasahiro Yamada $type = 'E'; 1067*dd88ab32SMasahiro Yamada 1068*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*(?:endif))/o) { 1069*dd88ab32SMasahiro Yamada print "PRE_END($1)\n" if ($dbg_values > 1); 1070*dd88ab32SMasahiro Yamada 1071*dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1072*dd88ab32SMasahiro Yamada 1073*dd88ab32SMasahiro Yamada # Assume all arms of the conditional end as this 1074*dd88ab32SMasahiro Yamada # one does, and continue as if the #endif was not here. 1075*dd88ab32SMasahiro Yamada pop(@av_paren_type); 1076*dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1077*dd88ab32SMasahiro Yamada $type = 'E'; 1078*dd88ab32SMasahiro Yamada 1079*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\\\n)/o) { 1080*dd88ab32SMasahiro Yamada print "PRECONT($1)\n" if ($dbg_values > 1); 1081*dd88ab32SMasahiro Yamada 1082*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(__attribute__)\s*\(?/o) { 1083*dd88ab32SMasahiro Yamada print "ATTR($1)\n" if ($dbg_values > 1); 1084*dd88ab32SMasahiro Yamada $av_pending = $type; 1085*dd88ab32SMasahiro Yamada $type = 'N'; 1086*dd88ab32SMasahiro Yamada 1087*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(sizeof)\s*(\()?/o) { 1088*dd88ab32SMasahiro Yamada print "SIZEOF($1)\n" if ($dbg_values > 1); 1089*dd88ab32SMasahiro Yamada if (defined $2) { 1090*dd88ab32SMasahiro Yamada $av_pending = 'V'; 1091*dd88ab32SMasahiro Yamada } 1092*dd88ab32SMasahiro Yamada $type = 'N'; 1093*dd88ab32SMasahiro Yamada 1094*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(if|while|for)\b/o) { 1095*dd88ab32SMasahiro Yamada print "COND($1)\n" if ($dbg_values > 1); 1096*dd88ab32SMasahiro Yamada $av_pending = 'E'; 1097*dd88ab32SMasahiro Yamada $type = 'N'; 1098*dd88ab32SMasahiro Yamada 1099*dd88ab32SMasahiro Yamada } elsif ($cur =~/^(case)/o) { 1100*dd88ab32SMasahiro Yamada print "CASE($1)\n" if ($dbg_values > 1); 1101*dd88ab32SMasahiro Yamada $av_pend_colon = 'C'; 1102*dd88ab32SMasahiro Yamada $type = 'N'; 1103*dd88ab32SMasahiro Yamada 1104*dd88ab32SMasahiro Yamada } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) { 1105*dd88ab32SMasahiro Yamada print "KEYWORD($1)\n" if ($dbg_values > 1); 1106*dd88ab32SMasahiro Yamada $type = 'N'; 1107*dd88ab32SMasahiro Yamada 1108*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\()/o) { 1109*dd88ab32SMasahiro Yamada print "PAREN('$1')\n" if ($dbg_values > 1); 1110*dd88ab32SMasahiro Yamada push(@av_paren_type, $av_pending); 1111*dd88ab32SMasahiro Yamada $av_pending = '_'; 1112*dd88ab32SMasahiro Yamada $type = 'N'; 1113*dd88ab32SMasahiro Yamada 1114*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\))/o) { 1115*dd88ab32SMasahiro Yamada my $new_type = pop(@av_paren_type); 1116*dd88ab32SMasahiro Yamada if ($new_type ne '_') { 1117*dd88ab32SMasahiro Yamada $type = $new_type; 1118*dd88ab32SMasahiro Yamada print "PAREN('$1') -> $type\n" 1119*dd88ab32SMasahiro Yamada if ($dbg_values > 1); 1120*dd88ab32SMasahiro Yamada } else { 1121*dd88ab32SMasahiro Yamada print "PAREN('$1')\n" if ($dbg_values > 1); 1122*dd88ab32SMasahiro Yamada } 1123*dd88ab32SMasahiro Yamada 1124*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Ident)\s*\(/o) { 1125*dd88ab32SMasahiro Yamada print "FUNC($1)\n" if ($dbg_values > 1); 1126*dd88ab32SMasahiro Yamada $type = 'V'; 1127*dd88ab32SMasahiro Yamada $av_pending = 'V'; 1128*dd88ab32SMasahiro Yamada 1129*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) { 1130*dd88ab32SMasahiro Yamada if (defined $2 && $type eq 'C' || $type eq 'T') { 1131*dd88ab32SMasahiro Yamada $av_pend_colon = 'B'; 1132*dd88ab32SMasahiro Yamada } elsif ($type eq 'E') { 1133*dd88ab32SMasahiro Yamada $av_pend_colon = 'L'; 1134*dd88ab32SMasahiro Yamada } 1135*dd88ab32SMasahiro Yamada print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1); 1136*dd88ab32SMasahiro Yamada $type = 'V'; 1137*dd88ab32SMasahiro Yamada 1138*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Ident|$Constant)/o) { 1139*dd88ab32SMasahiro Yamada print "IDENT($1)\n" if ($dbg_values > 1); 1140*dd88ab32SMasahiro Yamada $type = 'V'; 1141*dd88ab32SMasahiro Yamada 1142*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Assignment)/o) { 1143*dd88ab32SMasahiro Yamada print "ASSIGN($1)\n" if ($dbg_values > 1); 1144*dd88ab32SMasahiro Yamada $type = 'N'; 1145*dd88ab32SMasahiro Yamada 1146*dd88ab32SMasahiro Yamada } elsif ($cur =~/^(;|{|})/) { 1147*dd88ab32SMasahiro Yamada print "END($1)\n" if ($dbg_values > 1); 1148*dd88ab32SMasahiro Yamada $type = 'E'; 1149*dd88ab32SMasahiro Yamada $av_pend_colon = 'O'; 1150*dd88ab32SMasahiro Yamada 1151*dd88ab32SMasahiro Yamada } elsif ($cur =~/^(,)/) { 1152*dd88ab32SMasahiro Yamada print "COMMA($1)\n" if ($dbg_values > 1); 1153*dd88ab32SMasahiro Yamada $type = 'C'; 1154*dd88ab32SMasahiro Yamada 1155*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\?)/o) { 1156*dd88ab32SMasahiro Yamada print "QUESTION($1)\n" if ($dbg_values > 1); 1157*dd88ab32SMasahiro Yamada $type = 'N'; 1158*dd88ab32SMasahiro Yamada 1159*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(:)/o) { 1160*dd88ab32SMasahiro Yamada print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1); 1161*dd88ab32SMasahiro Yamada 1162*dd88ab32SMasahiro Yamada substr($var, length($res), 1, $av_pend_colon); 1163*dd88ab32SMasahiro Yamada if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') { 1164*dd88ab32SMasahiro Yamada $type = 'E'; 1165*dd88ab32SMasahiro Yamada } else { 1166*dd88ab32SMasahiro Yamada $type = 'N'; 1167*dd88ab32SMasahiro Yamada } 1168*dd88ab32SMasahiro Yamada $av_pend_colon = 'O'; 1169*dd88ab32SMasahiro Yamada 1170*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\[)/o) { 1171*dd88ab32SMasahiro Yamada print "CLOSE($1)\n" if ($dbg_values > 1); 1172*dd88ab32SMasahiro Yamada $type = 'N'; 1173*dd88ab32SMasahiro Yamada 1174*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) { 1175*dd88ab32SMasahiro Yamada my $variant; 1176*dd88ab32SMasahiro Yamada 1177*dd88ab32SMasahiro Yamada print "OPV($1)\n" if ($dbg_values > 1); 1178*dd88ab32SMasahiro Yamada if ($type eq 'V') { 1179*dd88ab32SMasahiro Yamada $variant = 'B'; 1180*dd88ab32SMasahiro Yamada } else { 1181*dd88ab32SMasahiro Yamada $variant = 'U'; 1182*dd88ab32SMasahiro Yamada } 1183*dd88ab32SMasahiro Yamada 1184*dd88ab32SMasahiro Yamada substr($var, length($res), 1, $variant); 1185*dd88ab32SMasahiro Yamada $type = 'N'; 1186*dd88ab32SMasahiro Yamada 1187*dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Operators)/o) { 1188*dd88ab32SMasahiro Yamada print "OP($1)\n" if ($dbg_values > 1); 1189*dd88ab32SMasahiro Yamada if ($1 ne '++' && $1 ne '--') { 1190*dd88ab32SMasahiro Yamada $type = 'N'; 1191*dd88ab32SMasahiro Yamada } 1192*dd88ab32SMasahiro Yamada 1193*dd88ab32SMasahiro Yamada } elsif ($cur =~ /(^.)/o) { 1194*dd88ab32SMasahiro Yamada print "C($1)\n" if ($dbg_values > 1); 1195*dd88ab32SMasahiro Yamada } 1196*dd88ab32SMasahiro Yamada if (defined $1) { 1197*dd88ab32SMasahiro Yamada $cur = substr($cur, length($1)); 1198*dd88ab32SMasahiro Yamada $res .= $type x length($1); 1199*dd88ab32SMasahiro Yamada } 1200*dd88ab32SMasahiro Yamada } 1201*dd88ab32SMasahiro Yamada 1202*dd88ab32SMasahiro Yamada return ($res, $var); 1203*dd88ab32SMasahiro Yamada} 1204*dd88ab32SMasahiro Yamada 1205*dd88ab32SMasahiro Yamadasub possible { 1206*dd88ab32SMasahiro Yamada my ($possible, $line) = @_; 1207*dd88ab32SMasahiro Yamada my $notPermitted = qr{(?: 1208*dd88ab32SMasahiro Yamada ^(?: 1209*dd88ab32SMasahiro Yamada $Modifier| 1210*dd88ab32SMasahiro Yamada $Storage| 1211*dd88ab32SMasahiro Yamada $Type| 1212*dd88ab32SMasahiro Yamada DEFINE_\S+ 1213*dd88ab32SMasahiro Yamada )$| 1214*dd88ab32SMasahiro Yamada ^(?: 1215*dd88ab32SMasahiro Yamada goto| 1216*dd88ab32SMasahiro Yamada return| 1217*dd88ab32SMasahiro Yamada case| 1218*dd88ab32SMasahiro Yamada else| 1219*dd88ab32SMasahiro Yamada asm|__asm__| 1220*dd88ab32SMasahiro Yamada do| 1221*dd88ab32SMasahiro Yamada \#| 1222*dd88ab32SMasahiro Yamada \#\#| 1223*dd88ab32SMasahiro Yamada )(?:\s|$)| 1224*dd88ab32SMasahiro Yamada ^(?:typedef|struct|enum)\b 1225*dd88ab32SMasahiro Yamada )}x; 1226*dd88ab32SMasahiro Yamada warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2); 1227*dd88ab32SMasahiro Yamada if ($possible !~ $notPermitted) { 1228*dd88ab32SMasahiro Yamada # Check for modifiers. 1229*dd88ab32SMasahiro Yamada $possible =~ s/\s*$Storage\s*//g; 1230*dd88ab32SMasahiro Yamada $possible =~ s/\s*$Sparse\s*//g; 1231*dd88ab32SMasahiro Yamada if ($possible =~ /^\s*$/) { 1232*dd88ab32SMasahiro Yamada 1233*dd88ab32SMasahiro Yamada } elsif ($possible =~ /\s/) { 1234*dd88ab32SMasahiro Yamada $possible =~ s/\s*$Type\s*//g; 1235*dd88ab32SMasahiro Yamada for my $modifier (split(' ', $possible)) { 1236*dd88ab32SMasahiro Yamada if ($modifier !~ $notPermitted) { 1237*dd88ab32SMasahiro Yamada warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible); 1238*dd88ab32SMasahiro Yamada push(@modifierList, $modifier); 1239*dd88ab32SMasahiro Yamada } 1240*dd88ab32SMasahiro Yamada } 1241*dd88ab32SMasahiro Yamada 1242*dd88ab32SMasahiro Yamada } else { 1243*dd88ab32SMasahiro Yamada warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible); 1244*dd88ab32SMasahiro Yamada push(@typeList, $possible); 1245*dd88ab32SMasahiro Yamada } 1246*dd88ab32SMasahiro Yamada build_types(); 1247*dd88ab32SMasahiro Yamada } else { 1248*dd88ab32SMasahiro Yamada warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1); 1249*dd88ab32SMasahiro Yamada } 1250*dd88ab32SMasahiro Yamada} 1251*dd88ab32SMasahiro Yamada 1252*dd88ab32SMasahiro Yamadamy $prefix = ''; 1253*dd88ab32SMasahiro Yamada 1254*dd88ab32SMasahiro Yamadasub show_type { 1255*dd88ab32SMasahiro Yamada return !defined $ignore_type{$_[0]}; 1256*dd88ab32SMasahiro Yamada} 1257*dd88ab32SMasahiro Yamada 1258*dd88ab32SMasahiro Yamadasub report { 1259*dd88ab32SMasahiro Yamada if (!show_type($_[1]) || 1260*dd88ab32SMasahiro Yamada (defined $tst_only && $_[2] !~ /\Q$tst_only\E/)) { 1261*dd88ab32SMasahiro Yamada return 0; 1262*dd88ab32SMasahiro Yamada } 1263*dd88ab32SMasahiro Yamada my $line; 1264*dd88ab32SMasahiro Yamada if ($show_types) { 1265*dd88ab32SMasahiro Yamada $line = "$prefix$_[0]:$_[1]: $_[2]\n"; 1266*dd88ab32SMasahiro Yamada } else { 1267*dd88ab32SMasahiro Yamada $line = "$prefix$_[0]: $_[2]\n"; 1268*dd88ab32SMasahiro Yamada } 1269*dd88ab32SMasahiro Yamada $line = (split('\n', $line))[0] . "\n" if ($terse); 1270*dd88ab32SMasahiro Yamada 1271*dd88ab32SMasahiro Yamada push(our @report, $line); 1272*dd88ab32SMasahiro Yamada 1273*dd88ab32SMasahiro Yamada return 1; 1274*dd88ab32SMasahiro Yamada} 1275*dd88ab32SMasahiro Yamadasub report_dump { 1276*dd88ab32SMasahiro Yamada our @report; 1277*dd88ab32SMasahiro Yamada} 1278*dd88ab32SMasahiro Yamada 1279*dd88ab32SMasahiro Yamadasub ERROR { 1280*dd88ab32SMasahiro Yamada if (report("ERROR", $_[0], $_[1])) { 1281*dd88ab32SMasahiro Yamada our $clean = 0; 1282*dd88ab32SMasahiro Yamada our $cnt_error++; 1283*dd88ab32SMasahiro Yamada } 1284*dd88ab32SMasahiro Yamada} 1285*dd88ab32SMasahiro Yamadasub WARN { 1286*dd88ab32SMasahiro Yamada if (report("WARNING", $_[0], $_[1])) { 1287*dd88ab32SMasahiro Yamada our $clean = 0; 1288*dd88ab32SMasahiro Yamada our $cnt_warn++; 1289*dd88ab32SMasahiro Yamada } 1290*dd88ab32SMasahiro Yamada} 1291*dd88ab32SMasahiro Yamadasub CHK { 1292*dd88ab32SMasahiro Yamada if ($check && report("CHECK", $_[0], $_[1])) { 1293*dd88ab32SMasahiro Yamada our $clean = 0; 1294*dd88ab32SMasahiro Yamada our $cnt_chk++; 1295*dd88ab32SMasahiro Yamada } 1296*dd88ab32SMasahiro Yamada} 1297*dd88ab32SMasahiro Yamada 1298*dd88ab32SMasahiro Yamadasub check_absolute_file { 1299*dd88ab32SMasahiro Yamada my ($absolute, $herecurr) = @_; 1300*dd88ab32SMasahiro Yamada my $file = $absolute; 1301*dd88ab32SMasahiro Yamada 1302*dd88ab32SMasahiro Yamada ##print "absolute<$absolute>\n"; 1303*dd88ab32SMasahiro Yamada 1304*dd88ab32SMasahiro Yamada # See if any suffix of this path is a path within the tree. 1305*dd88ab32SMasahiro Yamada while ($file =~ s@^[^/]*/@@) { 1306*dd88ab32SMasahiro Yamada if (-f "$root/$file") { 1307*dd88ab32SMasahiro Yamada ##print "file<$file>\n"; 1308*dd88ab32SMasahiro Yamada last; 1309*dd88ab32SMasahiro Yamada } 1310*dd88ab32SMasahiro Yamada } 1311*dd88ab32SMasahiro Yamada if (! -f _) { 1312*dd88ab32SMasahiro Yamada return 0; 1313*dd88ab32SMasahiro Yamada } 1314*dd88ab32SMasahiro Yamada 1315*dd88ab32SMasahiro Yamada # It is, so see if the prefix is acceptable. 1316*dd88ab32SMasahiro Yamada my $prefix = $absolute; 1317*dd88ab32SMasahiro Yamada substr($prefix, -length($file)) = ''; 1318*dd88ab32SMasahiro Yamada 1319*dd88ab32SMasahiro Yamada ##print "prefix<$prefix>\n"; 1320*dd88ab32SMasahiro Yamada if ($prefix ne ".../") { 1321*dd88ab32SMasahiro Yamada WARN("USE_RELATIVE_PATH", 1322*dd88ab32SMasahiro Yamada "use relative pathname instead of absolute in changelog text\n" . $herecurr); 1323*dd88ab32SMasahiro Yamada } 1324*dd88ab32SMasahiro Yamada} 1325*dd88ab32SMasahiro Yamada 1326*dd88ab32SMasahiro Yamadasub pos_last_openparen { 1327*dd88ab32SMasahiro Yamada my ($line) = @_; 1328*dd88ab32SMasahiro Yamada 1329*dd88ab32SMasahiro Yamada my $pos = 0; 1330*dd88ab32SMasahiro Yamada 1331*dd88ab32SMasahiro Yamada my $opens = $line =~ tr/\(/\(/; 1332*dd88ab32SMasahiro Yamada my $closes = $line =~ tr/\)/\)/; 1333*dd88ab32SMasahiro Yamada 1334*dd88ab32SMasahiro Yamada my $last_openparen = 0; 1335*dd88ab32SMasahiro Yamada 1336*dd88ab32SMasahiro Yamada if (($opens == 0) || ($closes >= $opens)) { 1337*dd88ab32SMasahiro Yamada return -1; 1338*dd88ab32SMasahiro Yamada } 1339*dd88ab32SMasahiro Yamada 1340*dd88ab32SMasahiro Yamada my $len = length($line); 1341*dd88ab32SMasahiro Yamada 1342*dd88ab32SMasahiro Yamada for ($pos = 0; $pos < $len; $pos++) { 1343*dd88ab32SMasahiro Yamada my $string = substr($line, $pos); 1344*dd88ab32SMasahiro Yamada if ($string =~ /^($FuncArg|$balanced_parens)/) { 1345*dd88ab32SMasahiro Yamada $pos += length($1) - 1; 1346*dd88ab32SMasahiro Yamada } elsif (substr($line, $pos, 1) eq '(') { 1347*dd88ab32SMasahiro Yamada $last_openparen = $pos; 1348*dd88ab32SMasahiro Yamada } elsif (index($string, '(') == -1) { 1349*dd88ab32SMasahiro Yamada last; 1350*dd88ab32SMasahiro Yamada } 1351*dd88ab32SMasahiro Yamada } 1352*dd88ab32SMasahiro Yamada 1353*dd88ab32SMasahiro Yamada return $last_openparen + 1; 1354*dd88ab32SMasahiro Yamada} 1355*dd88ab32SMasahiro Yamada 1356*dd88ab32SMasahiro Yamadasub process { 1357*dd88ab32SMasahiro Yamada my $filename = shift; 1358*dd88ab32SMasahiro Yamada 1359*dd88ab32SMasahiro Yamada my $linenr=0; 1360*dd88ab32SMasahiro Yamada my $prevline=""; 1361*dd88ab32SMasahiro Yamada my $prevrawline=""; 1362*dd88ab32SMasahiro Yamada my $stashline=""; 1363*dd88ab32SMasahiro Yamada my $stashrawline=""; 1364*dd88ab32SMasahiro Yamada 1365*dd88ab32SMasahiro Yamada my $length; 1366*dd88ab32SMasahiro Yamada my $indent; 1367*dd88ab32SMasahiro Yamada my $previndent=0; 1368*dd88ab32SMasahiro Yamada my $stashindent=0; 1369*dd88ab32SMasahiro Yamada 1370*dd88ab32SMasahiro Yamada our $clean = 1; 1371*dd88ab32SMasahiro Yamada my $signoff = 0; 1372*dd88ab32SMasahiro Yamada my $is_patch = 0; 1373*dd88ab32SMasahiro Yamada 1374*dd88ab32SMasahiro Yamada my $in_header_lines = 1; 1375*dd88ab32SMasahiro Yamada my $in_commit_log = 0; #Scanning lines before patch 1376*dd88ab32SMasahiro Yamada 1377*dd88ab32SMasahiro Yamada my $non_utf8_charset = 0; 1378*dd88ab32SMasahiro Yamada 1379*dd88ab32SMasahiro Yamada our @report = (); 1380*dd88ab32SMasahiro Yamada our $cnt_lines = 0; 1381*dd88ab32SMasahiro Yamada our $cnt_error = 0; 1382*dd88ab32SMasahiro Yamada our $cnt_warn = 0; 1383*dd88ab32SMasahiro Yamada our $cnt_chk = 0; 1384*dd88ab32SMasahiro Yamada 1385*dd88ab32SMasahiro Yamada # Trace the real file/line as we go. 1386*dd88ab32SMasahiro Yamada my $realfile = ''; 1387*dd88ab32SMasahiro Yamada my $realline = 0; 1388*dd88ab32SMasahiro Yamada my $realcnt = 0; 1389*dd88ab32SMasahiro Yamada my $here = ''; 1390*dd88ab32SMasahiro Yamada my $in_comment = 0; 1391*dd88ab32SMasahiro Yamada my $comment_edge = 0; 1392*dd88ab32SMasahiro Yamada my $first_line = 0; 1393*dd88ab32SMasahiro Yamada my $p1_prefix = ''; 1394*dd88ab32SMasahiro Yamada 1395*dd88ab32SMasahiro Yamada my $prev_values = 'E'; 1396*dd88ab32SMasahiro Yamada 1397*dd88ab32SMasahiro Yamada # suppression flags 1398*dd88ab32SMasahiro Yamada my %suppress_ifbraces; 1399*dd88ab32SMasahiro Yamada my %suppress_whiletrailers; 1400*dd88ab32SMasahiro Yamada my %suppress_export; 1401*dd88ab32SMasahiro Yamada my $suppress_statement = 0; 1402*dd88ab32SMasahiro Yamada 1403*dd88ab32SMasahiro Yamada my %camelcase = (); 1404*dd88ab32SMasahiro Yamada 1405*dd88ab32SMasahiro Yamada # Pre-scan the patch sanitizing the lines. 1406*dd88ab32SMasahiro Yamada # Pre-scan the patch looking for any __setup documentation. 1407*dd88ab32SMasahiro Yamada # 1408*dd88ab32SMasahiro Yamada my @setup_docs = (); 1409*dd88ab32SMasahiro Yamada my $setup_docs = 0; 1410*dd88ab32SMasahiro Yamada 1411*dd88ab32SMasahiro Yamada sanitise_line_reset(); 1412*dd88ab32SMasahiro Yamada my $line; 1413*dd88ab32SMasahiro Yamada foreach my $rawline (@rawlines) { 1414*dd88ab32SMasahiro Yamada $linenr++; 1415*dd88ab32SMasahiro Yamada $line = $rawline; 1416*dd88ab32SMasahiro Yamada 1417*dd88ab32SMasahiro Yamada if ($rawline=~/^\+\+\+\s+(\S+)/) { 1418*dd88ab32SMasahiro Yamada $setup_docs = 0; 1419*dd88ab32SMasahiro Yamada if ($1 =~ m@Documentation/kernel-parameters.txt$@) { 1420*dd88ab32SMasahiro Yamada $setup_docs = 1; 1421*dd88ab32SMasahiro Yamada } 1422*dd88ab32SMasahiro Yamada #next; 1423*dd88ab32SMasahiro Yamada } 1424*dd88ab32SMasahiro Yamada if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { 1425*dd88ab32SMasahiro Yamada $realline=$1-1; 1426*dd88ab32SMasahiro Yamada if (defined $2) { 1427*dd88ab32SMasahiro Yamada $realcnt=$3+1; 1428*dd88ab32SMasahiro Yamada } else { 1429*dd88ab32SMasahiro Yamada $realcnt=1+1; 1430*dd88ab32SMasahiro Yamada } 1431*dd88ab32SMasahiro Yamada $in_comment = 0; 1432*dd88ab32SMasahiro Yamada 1433*dd88ab32SMasahiro Yamada # Guestimate if this is a continuing comment. Run 1434*dd88ab32SMasahiro Yamada # the context looking for a comment "edge". If this 1435*dd88ab32SMasahiro Yamada # edge is a close comment then we must be in a comment 1436*dd88ab32SMasahiro Yamada # at context start. 1437*dd88ab32SMasahiro Yamada my $edge; 1438*dd88ab32SMasahiro Yamada my $cnt = $realcnt; 1439*dd88ab32SMasahiro Yamada for (my $ln = $linenr + 1; $cnt > 0; $ln++) { 1440*dd88ab32SMasahiro Yamada next if (defined $rawlines[$ln - 1] && 1441*dd88ab32SMasahiro Yamada $rawlines[$ln - 1] =~ /^-/); 1442*dd88ab32SMasahiro Yamada $cnt--; 1443*dd88ab32SMasahiro Yamada #print "RAW<$rawlines[$ln - 1]>\n"; 1444*dd88ab32SMasahiro Yamada last if (!defined $rawlines[$ln - 1]); 1445*dd88ab32SMasahiro Yamada if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ && 1446*dd88ab32SMasahiro Yamada $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) { 1447*dd88ab32SMasahiro Yamada ($edge) = $1; 1448*dd88ab32SMasahiro Yamada last; 1449*dd88ab32SMasahiro Yamada } 1450*dd88ab32SMasahiro Yamada } 1451*dd88ab32SMasahiro Yamada if (defined $edge && $edge eq '*/') { 1452*dd88ab32SMasahiro Yamada $in_comment = 1; 1453*dd88ab32SMasahiro Yamada } 1454*dd88ab32SMasahiro Yamada 1455*dd88ab32SMasahiro Yamada # Guestimate if this is a continuing comment. If this 1456*dd88ab32SMasahiro Yamada # is the start of a diff block and this line starts 1457*dd88ab32SMasahiro Yamada # ' *' then it is very likely a comment. 1458*dd88ab32SMasahiro Yamada if (!defined $edge && 1459*dd88ab32SMasahiro Yamada $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@) 1460*dd88ab32SMasahiro Yamada { 1461*dd88ab32SMasahiro Yamada $in_comment = 1; 1462*dd88ab32SMasahiro Yamada } 1463*dd88ab32SMasahiro Yamada 1464*dd88ab32SMasahiro Yamada ##print "COMMENT:$in_comment edge<$edge> $rawline\n"; 1465*dd88ab32SMasahiro Yamada sanitise_line_reset($in_comment); 1466*dd88ab32SMasahiro Yamada 1467*dd88ab32SMasahiro Yamada } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) { 1468*dd88ab32SMasahiro Yamada # Standardise the strings and chars within the input to 1469*dd88ab32SMasahiro Yamada # simplify matching -- only bother with positive lines. 1470*dd88ab32SMasahiro Yamada $line = sanitise_line($rawline); 1471*dd88ab32SMasahiro Yamada } 1472*dd88ab32SMasahiro Yamada push(@lines, $line); 1473*dd88ab32SMasahiro Yamada 1474*dd88ab32SMasahiro Yamada if ($realcnt > 1) { 1475*dd88ab32SMasahiro Yamada $realcnt-- if ($line =~ /^(?:\+| |$)/); 1476*dd88ab32SMasahiro Yamada } else { 1477*dd88ab32SMasahiro Yamada $realcnt = 0; 1478*dd88ab32SMasahiro Yamada } 1479*dd88ab32SMasahiro Yamada 1480*dd88ab32SMasahiro Yamada #print "==>$rawline\n"; 1481*dd88ab32SMasahiro Yamada #print "-->$line\n"; 1482*dd88ab32SMasahiro Yamada 1483*dd88ab32SMasahiro Yamada if ($setup_docs && $line =~ /^\+/) { 1484*dd88ab32SMasahiro Yamada push(@setup_docs, $line); 1485*dd88ab32SMasahiro Yamada } 1486*dd88ab32SMasahiro Yamada } 1487*dd88ab32SMasahiro Yamada 1488*dd88ab32SMasahiro Yamada $prefix = ''; 1489*dd88ab32SMasahiro Yamada 1490*dd88ab32SMasahiro Yamada $realcnt = 0; 1491*dd88ab32SMasahiro Yamada $linenr = 0; 1492*dd88ab32SMasahiro Yamada foreach my $line (@lines) { 1493*dd88ab32SMasahiro Yamada $linenr++; 1494*dd88ab32SMasahiro Yamada 1495*dd88ab32SMasahiro Yamada my $rawline = $rawlines[$linenr - 1]; 1496*dd88ab32SMasahiro Yamada 1497*dd88ab32SMasahiro Yamada#extract the line range in the file after the patch is applied 1498*dd88ab32SMasahiro Yamada if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { 1499*dd88ab32SMasahiro Yamada $is_patch = 1; 1500*dd88ab32SMasahiro Yamada $first_line = $linenr + 1; 1501*dd88ab32SMasahiro Yamada $realline=$1-1; 1502*dd88ab32SMasahiro Yamada if (defined $2) { 1503*dd88ab32SMasahiro Yamada $realcnt=$3+1; 1504*dd88ab32SMasahiro Yamada } else { 1505*dd88ab32SMasahiro Yamada $realcnt=1+1; 1506*dd88ab32SMasahiro Yamada } 1507*dd88ab32SMasahiro Yamada annotate_reset(); 1508*dd88ab32SMasahiro Yamada $prev_values = 'E'; 1509*dd88ab32SMasahiro Yamada 1510*dd88ab32SMasahiro Yamada %suppress_ifbraces = (); 1511*dd88ab32SMasahiro Yamada %suppress_whiletrailers = (); 1512*dd88ab32SMasahiro Yamada %suppress_export = (); 1513*dd88ab32SMasahiro Yamada $suppress_statement = 0; 1514*dd88ab32SMasahiro Yamada next; 1515*dd88ab32SMasahiro Yamada 1516*dd88ab32SMasahiro Yamada# track the line number as we move through the hunk, note that 1517*dd88ab32SMasahiro Yamada# new versions of GNU diff omit the leading space on completely 1518*dd88ab32SMasahiro Yamada# blank context lines so we need to count that too. 1519*dd88ab32SMasahiro Yamada } elsif ($line =~ /^( |\+|$)/) { 1520*dd88ab32SMasahiro Yamada $realline++; 1521*dd88ab32SMasahiro Yamada $realcnt-- if ($realcnt != 0); 1522*dd88ab32SMasahiro Yamada 1523*dd88ab32SMasahiro Yamada # Measure the line length and indent. 1524*dd88ab32SMasahiro Yamada ($length, $indent) = line_stats($rawline); 1525*dd88ab32SMasahiro Yamada 1526*dd88ab32SMasahiro Yamada # Track the previous line. 1527*dd88ab32SMasahiro Yamada ($prevline, $stashline) = ($stashline, $line); 1528*dd88ab32SMasahiro Yamada ($previndent, $stashindent) = ($stashindent, $indent); 1529*dd88ab32SMasahiro Yamada ($prevrawline, $stashrawline) = ($stashrawline, $rawline); 1530*dd88ab32SMasahiro Yamada 1531*dd88ab32SMasahiro Yamada #warn "line<$line>\n"; 1532*dd88ab32SMasahiro Yamada 1533*dd88ab32SMasahiro Yamada } elsif ($realcnt == 1) { 1534*dd88ab32SMasahiro Yamada $realcnt--; 1535*dd88ab32SMasahiro Yamada } 1536*dd88ab32SMasahiro Yamada 1537*dd88ab32SMasahiro Yamada my $hunk_line = ($realcnt != 0); 1538*dd88ab32SMasahiro Yamada 1539*dd88ab32SMasahiro Yamada#make up the handle for any error we report on this line 1540*dd88ab32SMasahiro Yamada $prefix = "$filename:$realline: " if ($emacs && $file); 1541*dd88ab32SMasahiro Yamada $prefix = "$filename:$linenr: " if ($emacs && !$file); 1542*dd88ab32SMasahiro Yamada 1543*dd88ab32SMasahiro Yamada $here = "#$linenr: " if (!$file); 1544*dd88ab32SMasahiro Yamada $here = "#$realline: " if ($file); 1545*dd88ab32SMasahiro Yamada 1546*dd88ab32SMasahiro Yamada # extract the filename as it passes 1547*dd88ab32SMasahiro Yamada if ($line =~ /^diff --git.*?(\S+)$/) { 1548*dd88ab32SMasahiro Yamada $realfile = $1; 1549*dd88ab32SMasahiro Yamada $realfile =~ s@^([^/]*)/@@; 1550*dd88ab32SMasahiro Yamada $in_commit_log = 0; 1551*dd88ab32SMasahiro Yamada } elsif ($line =~ /^\+\+\+\s+(\S+)/) { 1552*dd88ab32SMasahiro Yamada $realfile = $1; 1553*dd88ab32SMasahiro Yamada $realfile =~ s@^([^/]*)/@@; 1554*dd88ab32SMasahiro Yamada $in_commit_log = 0; 1555*dd88ab32SMasahiro Yamada 1556*dd88ab32SMasahiro Yamada $p1_prefix = $1; 1557*dd88ab32SMasahiro Yamada if (!$file && $tree && $p1_prefix ne '' && 1558*dd88ab32SMasahiro Yamada -e "$root/$p1_prefix") { 1559*dd88ab32SMasahiro Yamada WARN("PATCH_PREFIX", 1560*dd88ab32SMasahiro Yamada "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n"); 1561*dd88ab32SMasahiro Yamada } 1562*dd88ab32SMasahiro Yamada 1563*dd88ab32SMasahiro Yamada if ($realfile =~ m@^include/asm/@) { 1564*dd88ab32SMasahiro Yamada ERROR("MODIFIED_INCLUDE_ASM", 1565*dd88ab32SMasahiro Yamada "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n"); 1566*dd88ab32SMasahiro Yamada } 1567*dd88ab32SMasahiro Yamada next; 1568*dd88ab32SMasahiro Yamada } 1569*dd88ab32SMasahiro Yamada 1570*dd88ab32SMasahiro Yamada $here .= "FILE: $realfile:$realline:" if ($realcnt != 0); 1571*dd88ab32SMasahiro Yamada 1572*dd88ab32SMasahiro Yamada my $hereline = "$here\n$rawline\n"; 1573*dd88ab32SMasahiro Yamada my $herecurr = "$here\n$rawline\n"; 1574*dd88ab32SMasahiro Yamada my $hereprev = "$here\n$prevrawline\n$rawline\n"; 1575*dd88ab32SMasahiro Yamada 1576*dd88ab32SMasahiro Yamada $cnt_lines++ if ($realcnt != 0); 1577*dd88ab32SMasahiro Yamada 1578*dd88ab32SMasahiro Yamada# Check for incorrect file permissions 1579*dd88ab32SMasahiro Yamada if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) { 1580*dd88ab32SMasahiro Yamada my $permhere = $here . "FILE: $realfile\n"; 1581*dd88ab32SMasahiro Yamada if ($realfile =~ /(Makefile|Kconfig|\.c|\.h|\.S|\.tmpl)$/) { 1582*dd88ab32SMasahiro Yamada ERROR("EXECUTE_PERMISSIONS", 1583*dd88ab32SMasahiro Yamada "do not set execute permissions for source files\n" . $permhere); 1584*dd88ab32SMasahiro Yamada } 1585*dd88ab32SMasahiro Yamada } 1586*dd88ab32SMasahiro Yamada 1587*dd88ab32SMasahiro Yamada# Check the patch for a signoff: 1588*dd88ab32SMasahiro Yamada if ($line =~ /^\s*signed-off-by:/i) { 1589*dd88ab32SMasahiro Yamada $signoff++; 1590*dd88ab32SMasahiro Yamada $in_commit_log = 0; 1591*dd88ab32SMasahiro Yamada } 1592*dd88ab32SMasahiro Yamada 1593*dd88ab32SMasahiro Yamada# Check signature styles 1594*dd88ab32SMasahiro Yamada if (!$in_header_lines && 1595*dd88ab32SMasahiro Yamada $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) { 1596*dd88ab32SMasahiro Yamada my $space_before = $1; 1597*dd88ab32SMasahiro Yamada my $sign_off = $2; 1598*dd88ab32SMasahiro Yamada my $space_after = $3; 1599*dd88ab32SMasahiro Yamada my $email = $4; 1600*dd88ab32SMasahiro Yamada my $ucfirst_sign_off = ucfirst(lc($sign_off)); 1601*dd88ab32SMasahiro Yamada 1602*dd88ab32SMasahiro Yamada if ($sign_off !~ /$signature_tags/) { 1603*dd88ab32SMasahiro Yamada WARN("BAD_SIGN_OFF", 1604*dd88ab32SMasahiro Yamada "Non-standard signature: $sign_off\n" . $herecurr); 1605*dd88ab32SMasahiro Yamada } 1606*dd88ab32SMasahiro Yamada if (defined $space_before && $space_before ne "") { 1607*dd88ab32SMasahiro Yamada WARN("BAD_SIGN_OFF", 1608*dd88ab32SMasahiro Yamada "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr); 1609*dd88ab32SMasahiro Yamada } 1610*dd88ab32SMasahiro Yamada if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) { 1611*dd88ab32SMasahiro Yamada WARN("BAD_SIGN_OFF", 1612*dd88ab32SMasahiro Yamada "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr); 1613*dd88ab32SMasahiro Yamada } 1614*dd88ab32SMasahiro Yamada if (!defined $space_after || $space_after ne " ") { 1615*dd88ab32SMasahiro Yamada WARN("BAD_SIGN_OFF", 1616*dd88ab32SMasahiro Yamada "Use a single space after $ucfirst_sign_off\n" . $herecurr); 1617*dd88ab32SMasahiro Yamada } 1618*dd88ab32SMasahiro Yamada 1619*dd88ab32SMasahiro Yamada my ($email_name, $email_address, $comment) = parse_email($email); 1620*dd88ab32SMasahiro Yamada my $suggested_email = format_email(($email_name, $email_address)); 1621*dd88ab32SMasahiro Yamada if ($suggested_email eq "") { 1622*dd88ab32SMasahiro Yamada ERROR("BAD_SIGN_OFF", 1623*dd88ab32SMasahiro Yamada "Unrecognized email address: '$email'\n" . $herecurr); 1624*dd88ab32SMasahiro Yamada } else { 1625*dd88ab32SMasahiro Yamada my $dequoted = $suggested_email; 1626*dd88ab32SMasahiro Yamada $dequoted =~ s/^"//; 1627*dd88ab32SMasahiro Yamada $dequoted =~ s/" </ </; 1628*dd88ab32SMasahiro Yamada # Don't force email to have quotes 1629*dd88ab32SMasahiro Yamada # Allow just an angle bracketed address 1630*dd88ab32SMasahiro Yamada if ("$dequoted$comment" ne $email && 1631*dd88ab32SMasahiro Yamada "<$email_address>$comment" ne $email && 1632*dd88ab32SMasahiro Yamada "$suggested_email$comment" ne $email) { 1633*dd88ab32SMasahiro Yamada WARN("BAD_SIGN_OFF", 1634*dd88ab32SMasahiro Yamada "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr); 1635*dd88ab32SMasahiro Yamada } 1636*dd88ab32SMasahiro Yamada } 1637*dd88ab32SMasahiro Yamada } 1638*dd88ab32SMasahiro Yamada 1639*dd88ab32SMasahiro Yamada# Check for wrappage within a valid hunk of the file 1640*dd88ab32SMasahiro Yamada if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) { 1641*dd88ab32SMasahiro Yamada ERROR("CORRUPTED_PATCH", 1642*dd88ab32SMasahiro Yamada "patch seems to be corrupt (line wrapped?)\n" . 1643*dd88ab32SMasahiro Yamada $herecurr) if (!$emitted_corrupt++); 1644*dd88ab32SMasahiro Yamada } 1645*dd88ab32SMasahiro Yamada 1646*dd88ab32SMasahiro Yamada# Check for absolute kernel paths. 1647*dd88ab32SMasahiro Yamada if ($tree) { 1648*dd88ab32SMasahiro Yamada while ($line =~ m{(?:^|\s)(/\S*)}g) { 1649*dd88ab32SMasahiro Yamada my $file = $1; 1650*dd88ab32SMasahiro Yamada 1651*dd88ab32SMasahiro Yamada if ($file =~ m{^(.*?)(?::\d+)+:?$} && 1652*dd88ab32SMasahiro Yamada check_absolute_file($1, $herecurr)) { 1653*dd88ab32SMasahiro Yamada # 1654*dd88ab32SMasahiro Yamada } else { 1655*dd88ab32SMasahiro Yamada check_absolute_file($file, $herecurr); 1656*dd88ab32SMasahiro Yamada } 1657*dd88ab32SMasahiro Yamada } 1658*dd88ab32SMasahiro Yamada } 1659*dd88ab32SMasahiro Yamada 1660*dd88ab32SMasahiro Yamada# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php 1661*dd88ab32SMasahiro Yamada if (($realfile =~ /^$/ || $line =~ /^\+/) && 1662*dd88ab32SMasahiro Yamada $rawline !~ m/^$UTF8*$/) { 1663*dd88ab32SMasahiro Yamada my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/); 1664*dd88ab32SMasahiro Yamada 1665*dd88ab32SMasahiro Yamada my $blank = copy_spacing($rawline); 1666*dd88ab32SMasahiro Yamada my $ptr = substr($blank, 0, length($utf8_prefix)) . "^"; 1667*dd88ab32SMasahiro Yamada my $hereptr = "$hereline$ptr\n"; 1668*dd88ab32SMasahiro Yamada 1669*dd88ab32SMasahiro Yamada CHK("INVALID_UTF8", 1670*dd88ab32SMasahiro Yamada "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr); 1671*dd88ab32SMasahiro Yamada } 1672*dd88ab32SMasahiro Yamada 1673*dd88ab32SMasahiro Yamada# Check if it's the start of a commit log 1674*dd88ab32SMasahiro Yamada# (not a header line and we haven't seen the patch filename) 1675*dd88ab32SMasahiro Yamada if ($in_header_lines && $realfile =~ /^$/ && 1676*dd88ab32SMasahiro Yamada $rawline !~ /^(commit\b|from\b|[\w-]+:).+$/i) { 1677*dd88ab32SMasahiro Yamada $in_header_lines = 0; 1678*dd88ab32SMasahiro Yamada $in_commit_log = 1; 1679*dd88ab32SMasahiro Yamada } 1680*dd88ab32SMasahiro Yamada 1681*dd88ab32SMasahiro Yamada# Check if there is UTF-8 in a commit log when a mail header has explicitly 1682*dd88ab32SMasahiro Yamada# declined it, i.e defined some charset where it is missing. 1683*dd88ab32SMasahiro Yamada if ($in_header_lines && 1684*dd88ab32SMasahiro Yamada $rawline =~ /^Content-Type:.+charset="(.+)".*$/ && 1685*dd88ab32SMasahiro Yamada $1 !~ /utf-8/i) { 1686*dd88ab32SMasahiro Yamada $non_utf8_charset = 1; 1687*dd88ab32SMasahiro Yamada } 1688*dd88ab32SMasahiro Yamada 1689*dd88ab32SMasahiro Yamada if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ && 1690*dd88ab32SMasahiro Yamada $rawline =~ /$NON_ASCII_UTF8/) { 1691*dd88ab32SMasahiro Yamada WARN("UTF8_BEFORE_PATCH", 1692*dd88ab32SMasahiro Yamada "8-bit UTF-8 used in possible commit log\n" . $herecurr); 1693*dd88ab32SMasahiro Yamada } 1694*dd88ab32SMasahiro Yamada 1695*dd88ab32SMasahiro Yamada# ignore non-hunk lines and lines being removed 1696*dd88ab32SMasahiro Yamada next if (!$hunk_line || $line =~ /^-/); 1697*dd88ab32SMasahiro Yamada 1698*dd88ab32SMasahiro Yamada#trailing whitespace 1699*dd88ab32SMasahiro Yamada if ($line =~ /^\+.*\015/) { 1700*dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 1701*dd88ab32SMasahiro Yamada ERROR("DOS_LINE_ENDINGS", 1702*dd88ab32SMasahiro Yamada "DOS line endings\n" . $herevet); 1703*dd88ab32SMasahiro Yamada 1704*dd88ab32SMasahiro Yamada } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) { 1705*dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 1706*dd88ab32SMasahiro Yamada ERROR("TRAILING_WHITESPACE", 1707*dd88ab32SMasahiro Yamada "trailing whitespace\n" . $herevet); 1708*dd88ab32SMasahiro Yamada $rpt_cleaners = 1; 1709*dd88ab32SMasahiro Yamada } 1710*dd88ab32SMasahiro Yamada 1711*dd88ab32SMasahiro Yamada# check for Kconfig help text having a real description 1712*dd88ab32SMasahiro Yamada# Only applies when adding the entry originally, after that we do not have 1713*dd88ab32SMasahiro Yamada# sufficient context to determine whether it is indeed long enough. 1714*dd88ab32SMasahiro Yamada if ($realfile =~ /Kconfig/ && 1715*dd88ab32SMasahiro Yamada $line =~ /.\s*config\s+/) { 1716*dd88ab32SMasahiro Yamada my $length = 0; 1717*dd88ab32SMasahiro Yamada my $cnt = $realcnt; 1718*dd88ab32SMasahiro Yamada my $ln = $linenr + 1; 1719*dd88ab32SMasahiro Yamada my $f; 1720*dd88ab32SMasahiro Yamada my $is_start = 0; 1721*dd88ab32SMasahiro Yamada my $is_end = 0; 1722*dd88ab32SMasahiro Yamada for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) { 1723*dd88ab32SMasahiro Yamada $f = $lines[$ln - 1]; 1724*dd88ab32SMasahiro Yamada $cnt-- if ($lines[$ln - 1] !~ /^-/); 1725*dd88ab32SMasahiro Yamada $is_end = $lines[$ln - 1] =~ /^\+/; 1726*dd88ab32SMasahiro Yamada 1727*dd88ab32SMasahiro Yamada next if ($f =~ /^-/); 1728*dd88ab32SMasahiro Yamada 1729*dd88ab32SMasahiro Yamada if ($lines[$ln - 1] =~ /.\s*(?:bool|tristate)\s*\"/) { 1730*dd88ab32SMasahiro Yamada $is_start = 1; 1731*dd88ab32SMasahiro Yamada } elsif ($lines[$ln - 1] =~ /.\s*(?:---)?help(?:---)?$/) { 1732*dd88ab32SMasahiro Yamada $length = -1; 1733*dd88ab32SMasahiro Yamada } 1734*dd88ab32SMasahiro Yamada 1735*dd88ab32SMasahiro Yamada $f =~ s/^.//; 1736*dd88ab32SMasahiro Yamada $f =~ s/#.*//; 1737*dd88ab32SMasahiro Yamada $f =~ s/^\s+//; 1738*dd88ab32SMasahiro Yamada next if ($f =~ /^$/); 1739*dd88ab32SMasahiro Yamada if ($f =~ /^\s*config\s/) { 1740*dd88ab32SMasahiro Yamada $is_end = 1; 1741*dd88ab32SMasahiro Yamada last; 1742*dd88ab32SMasahiro Yamada } 1743*dd88ab32SMasahiro Yamada $length++; 1744*dd88ab32SMasahiro Yamada } 1745*dd88ab32SMasahiro Yamada WARN("CONFIG_DESCRIPTION", 1746*dd88ab32SMasahiro Yamada "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_start && $is_end && $length < 4); 1747*dd88ab32SMasahiro Yamada #print "is_start<$is_start> is_end<$is_end> length<$length>\n"; 1748*dd88ab32SMasahiro Yamada } 1749*dd88ab32SMasahiro Yamada 1750*dd88ab32SMasahiro Yamada# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig. 1751*dd88ab32SMasahiro Yamada if ($realfile =~ /Kconfig/ && 1752*dd88ab32SMasahiro Yamada $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) { 1753*dd88ab32SMasahiro Yamada WARN("CONFIG_EXPERIMENTAL", 1754*dd88ab32SMasahiro Yamada "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n"); 1755*dd88ab32SMasahiro Yamada } 1756*dd88ab32SMasahiro Yamada 1757*dd88ab32SMasahiro Yamada if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) && 1758*dd88ab32SMasahiro Yamada ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) { 1759*dd88ab32SMasahiro Yamada my $flag = $1; 1760*dd88ab32SMasahiro Yamada my $replacement = { 1761*dd88ab32SMasahiro Yamada 'EXTRA_AFLAGS' => 'asflags-y', 1762*dd88ab32SMasahiro Yamada 'EXTRA_CFLAGS' => 'ccflags-y', 1763*dd88ab32SMasahiro Yamada 'EXTRA_CPPFLAGS' => 'cppflags-y', 1764*dd88ab32SMasahiro Yamada 'EXTRA_LDFLAGS' => 'ldflags-y', 1765*dd88ab32SMasahiro Yamada }; 1766*dd88ab32SMasahiro Yamada 1767*dd88ab32SMasahiro Yamada WARN("DEPRECATED_VARIABLE", 1768*dd88ab32SMasahiro Yamada "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag}); 1769*dd88ab32SMasahiro Yamada } 1770*dd88ab32SMasahiro Yamada 1771*dd88ab32SMasahiro Yamada# check we are in a valid source file if not then ignore this hunk 1772*dd88ab32SMasahiro Yamada next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/); 1773*dd88ab32SMasahiro Yamada 1774*dd88ab32SMasahiro Yamada#line length limit 1775*dd88ab32SMasahiro Yamada if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ && 1776*dd88ab32SMasahiro Yamada $rawline !~ /^.\s*\*\s*\@$Ident\s/ && 1777*dd88ab32SMasahiro Yamada !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ || 1778*dd88ab32SMasahiro Yamada $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) && 1779*dd88ab32SMasahiro Yamada $length > $max_line_length) 1780*dd88ab32SMasahiro Yamada { 1781*dd88ab32SMasahiro Yamada WARN("LONG_LINE", 1782*dd88ab32SMasahiro Yamada "line over $max_line_length characters\n" . $herecurr); 1783*dd88ab32SMasahiro Yamada } 1784*dd88ab32SMasahiro Yamada 1785*dd88ab32SMasahiro Yamada# Check for user-visible strings broken across lines, which breaks the ability 1786*dd88ab32SMasahiro Yamada# to grep for the string. Limited to strings used as parameters (those 1787*dd88ab32SMasahiro Yamada# following an open parenthesis), which almost completely eliminates false 1788*dd88ab32SMasahiro Yamada# positives, as well as warning only once per parameter rather than once per 1789*dd88ab32SMasahiro Yamada# line of the string. Make an exception when the previous string ends in a 1790*dd88ab32SMasahiro Yamada# newline (multiple lines in one string constant) or \n\t (common in inline 1791*dd88ab32SMasahiro Yamada# assembly to indent the instruction on the following line). 1792*dd88ab32SMasahiro Yamada if ($line =~ /^\+\s*"/ && 1793*dd88ab32SMasahiro Yamada $prevline =~ /"\s*$/ && 1794*dd88ab32SMasahiro Yamada $prevline =~ /\(/ && 1795*dd88ab32SMasahiro Yamada $prevrawline !~ /\\n(?:\\t)*"\s*$/) { 1796*dd88ab32SMasahiro Yamada WARN("SPLIT_STRING", 1797*dd88ab32SMasahiro Yamada "quoted string split across lines\n" . $hereprev); 1798*dd88ab32SMasahiro Yamada } 1799*dd88ab32SMasahiro Yamada 1800*dd88ab32SMasahiro Yamada# check for spaces before a quoted newline 1801*dd88ab32SMasahiro Yamada if ($rawline =~ /^.*\".*\s\\n/) { 1802*dd88ab32SMasahiro Yamada WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE", 1803*dd88ab32SMasahiro Yamada "unnecessary whitespace before a quoted newline\n" . $herecurr); 1804*dd88ab32SMasahiro Yamada } 1805*dd88ab32SMasahiro Yamada 1806*dd88ab32SMasahiro Yamada# check for adding lines without a newline. 1807*dd88ab32SMasahiro Yamada if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) { 1808*dd88ab32SMasahiro Yamada WARN("MISSING_EOF_NEWLINE", 1809*dd88ab32SMasahiro Yamada "adding a line without newline at end of file\n" . $herecurr); 1810*dd88ab32SMasahiro Yamada } 1811*dd88ab32SMasahiro Yamada 1812*dd88ab32SMasahiro Yamada# Blackfin: use hi/lo macros 1813*dd88ab32SMasahiro Yamada if ($realfile =~ m@arch/blackfin/.*\.S$@) { 1814*dd88ab32SMasahiro Yamada if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) { 1815*dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($line) . "\n"; 1816*dd88ab32SMasahiro Yamada ERROR("LO_MACRO", 1817*dd88ab32SMasahiro Yamada "use the LO() macro, not (... & 0xFFFF)\n" . $herevet); 1818*dd88ab32SMasahiro Yamada } 1819*dd88ab32SMasahiro Yamada if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) { 1820*dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($line) . "\n"; 1821*dd88ab32SMasahiro Yamada ERROR("HI_MACRO", 1822*dd88ab32SMasahiro Yamada "use the HI() macro, not (... >> 16)\n" . $herevet); 1823*dd88ab32SMasahiro Yamada } 1824*dd88ab32SMasahiro Yamada } 1825*dd88ab32SMasahiro Yamada 1826*dd88ab32SMasahiro Yamada# check we are in a valid source file C or perl if not then ignore this hunk 1827*dd88ab32SMasahiro Yamada next if ($realfile !~ /\.(h|c|pl)$/); 1828*dd88ab32SMasahiro Yamada 1829*dd88ab32SMasahiro Yamada# at the beginning of a line any tabs must come first and anything 1830*dd88ab32SMasahiro Yamada# more than 8 must use tabs. 1831*dd88ab32SMasahiro Yamada if ($rawline =~ /^\+\s* \t\s*\S/ || 1832*dd88ab32SMasahiro Yamada $rawline =~ /^\+\s* \s*/) { 1833*dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 1834*dd88ab32SMasahiro Yamada ERROR("CODE_INDENT", 1835*dd88ab32SMasahiro Yamada "code indent should use tabs where possible\n" . $herevet); 1836*dd88ab32SMasahiro Yamada $rpt_cleaners = 1; 1837*dd88ab32SMasahiro Yamada } 1838*dd88ab32SMasahiro Yamada 1839*dd88ab32SMasahiro Yamada# check for space before tabs. 1840*dd88ab32SMasahiro Yamada if ($rawline =~ /^\+/ && $rawline =~ / \t/) { 1841*dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 1842*dd88ab32SMasahiro Yamada WARN("SPACE_BEFORE_TAB", 1843*dd88ab32SMasahiro Yamada "please, no space before tabs\n" . $herevet); 1844*dd88ab32SMasahiro Yamada } 1845*dd88ab32SMasahiro Yamada 1846*dd88ab32SMasahiro Yamada# check for && or || at the start of a line 1847*dd88ab32SMasahiro Yamada if ($rawline =~ /^\+\s*(&&|\|\|)/) { 1848*dd88ab32SMasahiro Yamada CHK("LOGICAL_CONTINUATIONS", 1849*dd88ab32SMasahiro Yamada "Logical continuations should be on the previous line\n" . $hereprev); 1850*dd88ab32SMasahiro Yamada } 1851*dd88ab32SMasahiro Yamada 1852*dd88ab32SMasahiro Yamada# check multi-line statement indentation matches previous line 1853*dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 1854*dd88ab32SMasahiro Yamada $prevline =~ /^\+(\t*)(if \(|$Ident\().*(\&\&|\|\||,)\s*$/) { 1855*dd88ab32SMasahiro Yamada $prevline =~ /^\+(\t*)(.*)$/; 1856*dd88ab32SMasahiro Yamada my $oldindent = $1; 1857*dd88ab32SMasahiro Yamada my $rest = $2; 1858*dd88ab32SMasahiro Yamada 1859*dd88ab32SMasahiro Yamada my $pos = pos_last_openparen($rest); 1860*dd88ab32SMasahiro Yamada if ($pos >= 0) { 1861*dd88ab32SMasahiro Yamada $line =~ /^(\+| )([ \t]*)/; 1862*dd88ab32SMasahiro Yamada my $newindent = $2; 1863*dd88ab32SMasahiro Yamada 1864*dd88ab32SMasahiro Yamada my $goodtabindent = $oldindent . 1865*dd88ab32SMasahiro Yamada "\t" x ($pos / 8) . 1866*dd88ab32SMasahiro Yamada " " x ($pos % 8); 1867*dd88ab32SMasahiro Yamada my $goodspaceindent = $oldindent . " " x $pos; 1868*dd88ab32SMasahiro Yamada 1869*dd88ab32SMasahiro Yamada if ($newindent ne $goodtabindent && 1870*dd88ab32SMasahiro Yamada $newindent ne $goodspaceindent) { 1871*dd88ab32SMasahiro Yamada CHK("PARENTHESIS_ALIGNMENT", 1872*dd88ab32SMasahiro Yamada "Alignment should match open parenthesis\n" . $hereprev); 1873*dd88ab32SMasahiro Yamada } 1874*dd88ab32SMasahiro Yamada } 1875*dd88ab32SMasahiro Yamada } 1876*dd88ab32SMasahiro Yamada 1877*dd88ab32SMasahiro Yamada if ($line =~ /^\+.*\*[ \t]*\)[ \t]+/) { 1878*dd88ab32SMasahiro Yamada CHK("SPACING", 1879*dd88ab32SMasahiro Yamada "No space is necessary after a cast\n" . $hereprev); 1880*dd88ab32SMasahiro Yamada } 1881*dd88ab32SMasahiro Yamada 1882*dd88ab32SMasahiro Yamada if ($realfile =~ m@^(drivers/net/|net/)@ && 1883*dd88ab32SMasahiro Yamada $rawline =~ /^\+[ \t]*\/\*[ \t]*$/ && 1884*dd88ab32SMasahiro Yamada $prevrawline =~ /^\+[ \t]*$/) { 1885*dd88ab32SMasahiro Yamada WARN("NETWORKING_BLOCK_COMMENT_STYLE", 1886*dd88ab32SMasahiro Yamada "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev); 1887*dd88ab32SMasahiro Yamada } 1888*dd88ab32SMasahiro Yamada 1889*dd88ab32SMasahiro Yamada if ($realfile =~ m@^(drivers/net/|net/)@ && 1890*dd88ab32SMasahiro Yamada $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */ 1891*dd88ab32SMasahiro Yamada $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/ 1892*dd88ab32SMasahiro Yamada $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/ 1893*dd88ab32SMasahiro Yamada $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */ 1894*dd88ab32SMasahiro Yamada WARN("NETWORKING_BLOCK_COMMENT_STYLE", 1895*dd88ab32SMasahiro Yamada "networking block comments put the trailing */ on a separate line\n" . $herecurr); 1896*dd88ab32SMasahiro Yamada } 1897*dd88ab32SMasahiro Yamada 1898*dd88ab32SMasahiro Yamada# check for spaces at the beginning of a line. 1899*dd88ab32SMasahiro Yamada# Exceptions: 1900*dd88ab32SMasahiro Yamada# 1) within comments 1901*dd88ab32SMasahiro Yamada# 2) indented preprocessor commands 1902*dd88ab32SMasahiro Yamada# 3) hanging labels 1903*dd88ab32SMasahiro Yamada if ($rawline =~ /^\+ / && $line !~ /\+ *(?:$;|#|$Ident:)/) { 1904*dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 1905*dd88ab32SMasahiro Yamada WARN("LEADING_SPACE", 1906*dd88ab32SMasahiro Yamada "please, no spaces at the start of a line\n" . $herevet); 1907*dd88ab32SMasahiro Yamada } 1908*dd88ab32SMasahiro Yamada 1909*dd88ab32SMasahiro Yamada# check we are in a valid C source file if not then ignore this hunk 1910*dd88ab32SMasahiro Yamada next if ($realfile !~ /\.(h|c)$/); 1911*dd88ab32SMasahiro Yamada 1912*dd88ab32SMasahiro Yamada# discourage the addition of CONFIG_EXPERIMENTAL in #if(def). 1913*dd88ab32SMasahiro Yamada if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) { 1914*dd88ab32SMasahiro Yamada WARN("CONFIG_EXPERIMENTAL", 1915*dd88ab32SMasahiro Yamada "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n"); 1916*dd88ab32SMasahiro Yamada } 1917*dd88ab32SMasahiro Yamada 1918*dd88ab32SMasahiro Yamada# check for RCS/CVS revision markers 1919*dd88ab32SMasahiro Yamada if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) { 1920*dd88ab32SMasahiro Yamada WARN("CVS_KEYWORD", 1921*dd88ab32SMasahiro Yamada "CVS style keyword markers, these will _not_ be updated\n". $herecurr); 1922*dd88ab32SMasahiro Yamada } 1923*dd88ab32SMasahiro Yamada 1924*dd88ab32SMasahiro Yamada# Blackfin: don't use __builtin_bfin_[cs]sync 1925*dd88ab32SMasahiro Yamada if ($line =~ /__builtin_bfin_csync/) { 1926*dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($line) . "\n"; 1927*dd88ab32SMasahiro Yamada ERROR("CSYNC", 1928*dd88ab32SMasahiro Yamada "use the CSYNC() macro in asm/blackfin.h\n" . $herevet); 1929*dd88ab32SMasahiro Yamada } 1930*dd88ab32SMasahiro Yamada if ($line =~ /__builtin_bfin_ssync/) { 1931*dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($line) . "\n"; 1932*dd88ab32SMasahiro Yamada ERROR("SSYNC", 1933*dd88ab32SMasahiro Yamada "use the SSYNC() macro in asm/blackfin.h\n" . $herevet); 1934*dd88ab32SMasahiro Yamada } 1935*dd88ab32SMasahiro Yamada 1936*dd88ab32SMasahiro Yamada# check for old HOTPLUG __dev<foo> section markings 1937*dd88ab32SMasahiro Yamada if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) { 1938*dd88ab32SMasahiro Yamada WARN("HOTPLUG_SECTION", 1939*dd88ab32SMasahiro Yamada "Using $1 is unnecessary\n" . $herecurr); 1940*dd88ab32SMasahiro Yamada } 1941*dd88ab32SMasahiro Yamada 1942*dd88ab32SMasahiro Yamada# Check for potential 'bare' types 1943*dd88ab32SMasahiro Yamada my ($stat, $cond, $line_nr_next, $remain_next, $off_next, 1944*dd88ab32SMasahiro Yamada $realline_next); 1945*dd88ab32SMasahiro Yamada#print "LINE<$line>\n"; 1946*dd88ab32SMasahiro Yamada if ($linenr >= $suppress_statement && 1947*dd88ab32SMasahiro Yamada $realcnt && $line =~ /.\s*\S/) { 1948*dd88ab32SMasahiro Yamada ($stat, $cond, $line_nr_next, $remain_next, $off_next) = 1949*dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0); 1950*dd88ab32SMasahiro Yamada $stat =~ s/\n./\n /g; 1951*dd88ab32SMasahiro Yamada $cond =~ s/\n./\n /g; 1952*dd88ab32SMasahiro Yamada 1953*dd88ab32SMasahiro Yamada#print "linenr<$linenr> <$stat>\n"; 1954*dd88ab32SMasahiro Yamada # If this statement has no statement boundaries within 1955*dd88ab32SMasahiro Yamada # it there is no point in retrying a statement scan 1956*dd88ab32SMasahiro Yamada # until we hit end of it. 1957*dd88ab32SMasahiro Yamada my $frag = $stat; $frag =~ s/;+\s*$//; 1958*dd88ab32SMasahiro Yamada if ($frag !~ /(?:{|;)/) { 1959*dd88ab32SMasahiro Yamada#print "skip<$line_nr_next>\n"; 1960*dd88ab32SMasahiro Yamada $suppress_statement = $line_nr_next; 1961*dd88ab32SMasahiro Yamada } 1962*dd88ab32SMasahiro Yamada 1963*dd88ab32SMasahiro Yamada # Find the real next line. 1964*dd88ab32SMasahiro Yamada $realline_next = $line_nr_next; 1965*dd88ab32SMasahiro Yamada if (defined $realline_next && 1966*dd88ab32SMasahiro Yamada (!defined $lines[$realline_next - 1] || 1967*dd88ab32SMasahiro Yamada substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) { 1968*dd88ab32SMasahiro Yamada $realline_next++; 1969*dd88ab32SMasahiro Yamada } 1970*dd88ab32SMasahiro Yamada 1971*dd88ab32SMasahiro Yamada my $s = $stat; 1972*dd88ab32SMasahiro Yamada $s =~ s/{.*$//s; 1973*dd88ab32SMasahiro Yamada 1974*dd88ab32SMasahiro Yamada # Ignore goto labels. 1975*dd88ab32SMasahiro Yamada if ($s =~ /$Ident:\*$/s) { 1976*dd88ab32SMasahiro Yamada 1977*dd88ab32SMasahiro Yamada # Ignore functions being called 1978*dd88ab32SMasahiro Yamada } elsif ($s =~ /^.\s*$Ident\s*\(/s) { 1979*dd88ab32SMasahiro Yamada 1980*dd88ab32SMasahiro Yamada } elsif ($s =~ /^.\s*else\b/s) { 1981*dd88ab32SMasahiro Yamada 1982*dd88ab32SMasahiro Yamada # declarations always start with types 1983*dd88ab32SMasahiro 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) { 1984*dd88ab32SMasahiro Yamada my $type = $1; 1985*dd88ab32SMasahiro Yamada $type =~ s/\s+/ /g; 1986*dd88ab32SMasahiro Yamada possible($type, "A:" . $s); 1987*dd88ab32SMasahiro Yamada 1988*dd88ab32SMasahiro Yamada # definitions in global scope can only start with types 1989*dd88ab32SMasahiro Yamada } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) { 1990*dd88ab32SMasahiro Yamada possible($1, "B:" . $s); 1991*dd88ab32SMasahiro Yamada } 1992*dd88ab32SMasahiro Yamada 1993*dd88ab32SMasahiro Yamada # any (foo ... *) is a pointer cast, and foo is a type 1994*dd88ab32SMasahiro Yamada while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) { 1995*dd88ab32SMasahiro Yamada possible($1, "C:" . $s); 1996*dd88ab32SMasahiro Yamada } 1997*dd88ab32SMasahiro Yamada 1998*dd88ab32SMasahiro Yamada # Check for any sort of function declaration. 1999*dd88ab32SMasahiro Yamada # int foo(something bar, other baz); 2000*dd88ab32SMasahiro Yamada # void (*store_gdt)(x86_descr_ptr *); 2001*dd88ab32SMasahiro Yamada if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) { 2002*dd88ab32SMasahiro Yamada my ($name_len) = length($1); 2003*dd88ab32SMasahiro Yamada 2004*dd88ab32SMasahiro Yamada my $ctx = $s; 2005*dd88ab32SMasahiro Yamada substr($ctx, 0, $name_len + 1, ''); 2006*dd88ab32SMasahiro Yamada $ctx =~ s/\)[^\)]*$//; 2007*dd88ab32SMasahiro Yamada 2008*dd88ab32SMasahiro Yamada for my $arg (split(/\s*,\s*/, $ctx)) { 2009*dd88ab32SMasahiro Yamada if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) { 2010*dd88ab32SMasahiro Yamada 2011*dd88ab32SMasahiro Yamada possible($1, "D:" . $s); 2012*dd88ab32SMasahiro Yamada } 2013*dd88ab32SMasahiro Yamada } 2014*dd88ab32SMasahiro Yamada } 2015*dd88ab32SMasahiro Yamada 2016*dd88ab32SMasahiro Yamada } 2017*dd88ab32SMasahiro Yamada 2018*dd88ab32SMasahiro Yamada# 2019*dd88ab32SMasahiro Yamada# Checks which may be anchored in the context. 2020*dd88ab32SMasahiro Yamada# 2021*dd88ab32SMasahiro Yamada 2022*dd88ab32SMasahiro Yamada# Check for switch () and associated case and default 2023*dd88ab32SMasahiro Yamada# statements should be at the same indent. 2024*dd88ab32SMasahiro Yamada if ($line=~/\bswitch\s*\(.*\)/) { 2025*dd88ab32SMasahiro Yamada my $err = ''; 2026*dd88ab32SMasahiro Yamada my $sep = ''; 2027*dd88ab32SMasahiro Yamada my @ctx = ctx_block_outer($linenr, $realcnt); 2028*dd88ab32SMasahiro Yamada shift(@ctx); 2029*dd88ab32SMasahiro Yamada for my $ctx (@ctx) { 2030*dd88ab32SMasahiro Yamada my ($clen, $cindent) = line_stats($ctx); 2031*dd88ab32SMasahiro Yamada if ($ctx =~ /^\+\s*(case\s+|default:)/ && 2032*dd88ab32SMasahiro Yamada $indent != $cindent) { 2033*dd88ab32SMasahiro Yamada $err .= "$sep$ctx\n"; 2034*dd88ab32SMasahiro Yamada $sep = ''; 2035*dd88ab32SMasahiro Yamada } else { 2036*dd88ab32SMasahiro Yamada $sep = "[...]\n"; 2037*dd88ab32SMasahiro Yamada } 2038*dd88ab32SMasahiro Yamada } 2039*dd88ab32SMasahiro Yamada if ($err ne '') { 2040*dd88ab32SMasahiro Yamada ERROR("SWITCH_CASE_INDENT_LEVEL", 2041*dd88ab32SMasahiro Yamada "switch and case should be at the same indent\n$hereline$err"); 2042*dd88ab32SMasahiro Yamada } 2043*dd88ab32SMasahiro Yamada } 2044*dd88ab32SMasahiro Yamada 2045*dd88ab32SMasahiro Yamada# if/while/etc brace do not go on next line, unless defining a do while loop, 2046*dd88ab32SMasahiro Yamada# or if that brace on the next line is for something else 2047*dd88ab32SMasahiro Yamada if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) { 2048*dd88ab32SMasahiro Yamada my $pre_ctx = "$1$2"; 2049*dd88ab32SMasahiro Yamada 2050*dd88ab32SMasahiro Yamada my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); 2051*dd88ab32SMasahiro Yamada 2052*dd88ab32SMasahiro Yamada if ($line =~ /^\+\t{6,}/) { 2053*dd88ab32SMasahiro Yamada WARN("DEEP_INDENTATION", 2054*dd88ab32SMasahiro Yamada "Too many leading tabs - consider code refactoring\n" . $herecurr); 2055*dd88ab32SMasahiro Yamada } 2056*dd88ab32SMasahiro Yamada 2057*dd88ab32SMasahiro Yamada my $ctx_cnt = $realcnt - $#ctx - 1; 2058*dd88ab32SMasahiro Yamada my $ctx = join("\n", @ctx); 2059*dd88ab32SMasahiro Yamada 2060*dd88ab32SMasahiro Yamada my $ctx_ln = $linenr; 2061*dd88ab32SMasahiro Yamada my $ctx_skip = $realcnt; 2062*dd88ab32SMasahiro Yamada 2063*dd88ab32SMasahiro Yamada while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt && 2064*dd88ab32SMasahiro Yamada defined $lines[$ctx_ln - 1] && 2065*dd88ab32SMasahiro Yamada $lines[$ctx_ln - 1] =~ /^-/)) { 2066*dd88ab32SMasahiro Yamada ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n"; 2067*dd88ab32SMasahiro Yamada $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/); 2068*dd88ab32SMasahiro Yamada $ctx_ln++; 2069*dd88ab32SMasahiro Yamada } 2070*dd88ab32SMasahiro Yamada 2071*dd88ab32SMasahiro Yamada #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n"; 2072*dd88ab32SMasahiro Yamada #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n"; 2073*dd88ab32SMasahiro Yamada 2074*dd88ab32SMasahiro Yamada if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) { 2075*dd88ab32SMasahiro Yamada ERROR("OPEN_BRACE", 2076*dd88ab32SMasahiro Yamada "that open brace { should be on the previous line\n" . 2077*dd88ab32SMasahiro Yamada "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n"); 2078*dd88ab32SMasahiro Yamada } 2079*dd88ab32SMasahiro Yamada if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ && 2080*dd88ab32SMasahiro Yamada $ctx =~ /\)\s*\;\s*$/ && 2081*dd88ab32SMasahiro Yamada defined $lines[$ctx_ln - 1]) 2082*dd88ab32SMasahiro Yamada { 2083*dd88ab32SMasahiro Yamada my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]); 2084*dd88ab32SMasahiro Yamada if ($nindent > $indent) { 2085*dd88ab32SMasahiro Yamada WARN("TRAILING_SEMICOLON", 2086*dd88ab32SMasahiro Yamada "trailing semicolon indicates no statements, indent implies otherwise\n" . 2087*dd88ab32SMasahiro Yamada "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n"); 2088*dd88ab32SMasahiro Yamada } 2089*dd88ab32SMasahiro Yamada } 2090*dd88ab32SMasahiro Yamada } 2091*dd88ab32SMasahiro Yamada 2092*dd88ab32SMasahiro Yamada# Check relative indent for conditionals and blocks. 2093*dd88ab32SMasahiro Yamada if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) { 2094*dd88ab32SMasahiro Yamada ($stat, $cond, $line_nr_next, $remain_next, $off_next) = 2095*dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0) 2096*dd88ab32SMasahiro Yamada if (!defined $stat); 2097*dd88ab32SMasahiro Yamada my ($s, $c) = ($stat, $cond); 2098*dd88ab32SMasahiro Yamada 2099*dd88ab32SMasahiro Yamada substr($s, 0, length($c), ''); 2100*dd88ab32SMasahiro Yamada 2101*dd88ab32SMasahiro Yamada # Make sure we remove the line prefixes as we have 2102*dd88ab32SMasahiro Yamada # none on the first line, and are going to readd them 2103*dd88ab32SMasahiro Yamada # where necessary. 2104*dd88ab32SMasahiro Yamada $s =~ s/\n./\n/gs; 2105*dd88ab32SMasahiro Yamada 2106*dd88ab32SMasahiro Yamada # Find out how long the conditional actually is. 2107*dd88ab32SMasahiro Yamada my @newlines = ($c =~ /\n/gs); 2108*dd88ab32SMasahiro Yamada my $cond_lines = 1 + $#newlines; 2109*dd88ab32SMasahiro Yamada 2110*dd88ab32SMasahiro Yamada # We want to check the first line inside the block 2111*dd88ab32SMasahiro Yamada # starting at the end of the conditional, so remove: 2112*dd88ab32SMasahiro Yamada # 1) any blank line termination 2113*dd88ab32SMasahiro Yamada # 2) any opening brace { on end of the line 2114*dd88ab32SMasahiro Yamada # 3) any do (...) { 2115*dd88ab32SMasahiro Yamada my $continuation = 0; 2116*dd88ab32SMasahiro Yamada my $check = 0; 2117*dd88ab32SMasahiro Yamada $s =~ s/^.*\bdo\b//; 2118*dd88ab32SMasahiro Yamada $s =~ s/^\s*{//; 2119*dd88ab32SMasahiro Yamada if ($s =~ s/^\s*\\//) { 2120*dd88ab32SMasahiro Yamada $continuation = 1; 2121*dd88ab32SMasahiro Yamada } 2122*dd88ab32SMasahiro Yamada if ($s =~ s/^\s*?\n//) { 2123*dd88ab32SMasahiro Yamada $check = 1; 2124*dd88ab32SMasahiro Yamada $cond_lines++; 2125*dd88ab32SMasahiro Yamada } 2126*dd88ab32SMasahiro Yamada 2127*dd88ab32SMasahiro Yamada # Also ignore a loop construct at the end of a 2128*dd88ab32SMasahiro Yamada # preprocessor statement. 2129*dd88ab32SMasahiro Yamada if (($prevline =~ /^.\s*#\s*define\s/ || 2130*dd88ab32SMasahiro Yamada $prevline =~ /\\\s*$/) && $continuation == 0) { 2131*dd88ab32SMasahiro Yamada $check = 0; 2132*dd88ab32SMasahiro Yamada } 2133*dd88ab32SMasahiro Yamada 2134*dd88ab32SMasahiro Yamada my $cond_ptr = -1; 2135*dd88ab32SMasahiro Yamada $continuation = 0; 2136*dd88ab32SMasahiro Yamada while ($cond_ptr != $cond_lines) { 2137*dd88ab32SMasahiro Yamada $cond_ptr = $cond_lines; 2138*dd88ab32SMasahiro Yamada 2139*dd88ab32SMasahiro Yamada # If we see an #else/#elif then the code 2140*dd88ab32SMasahiro Yamada # is not linear. 2141*dd88ab32SMasahiro Yamada if ($s =~ /^\s*\#\s*(?:else|elif)/) { 2142*dd88ab32SMasahiro Yamada $check = 0; 2143*dd88ab32SMasahiro Yamada } 2144*dd88ab32SMasahiro Yamada 2145*dd88ab32SMasahiro Yamada # Ignore: 2146*dd88ab32SMasahiro Yamada # 1) blank lines, they should be at 0, 2147*dd88ab32SMasahiro Yamada # 2) preprocessor lines, and 2148*dd88ab32SMasahiro Yamada # 3) labels. 2149*dd88ab32SMasahiro Yamada if ($continuation || 2150*dd88ab32SMasahiro Yamada $s =~ /^\s*?\n/ || 2151*dd88ab32SMasahiro Yamada $s =~ /^\s*#\s*?/ || 2152*dd88ab32SMasahiro Yamada $s =~ /^\s*$Ident\s*:/) { 2153*dd88ab32SMasahiro Yamada $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0; 2154*dd88ab32SMasahiro Yamada if ($s =~ s/^.*?\n//) { 2155*dd88ab32SMasahiro Yamada $cond_lines++; 2156*dd88ab32SMasahiro Yamada } 2157*dd88ab32SMasahiro Yamada } 2158*dd88ab32SMasahiro Yamada } 2159*dd88ab32SMasahiro Yamada 2160*dd88ab32SMasahiro Yamada my (undef, $sindent) = line_stats("+" . $s); 2161*dd88ab32SMasahiro Yamada my $stat_real = raw_line($linenr, $cond_lines); 2162*dd88ab32SMasahiro Yamada 2163*dd88ab32SMasahiro Yamada # Check if either of these lines are modified, else 2164*dd88ab32SMasahiro Yamada # this is not this patch's fault. 2165*dd88ab32SMasahiro Yamada if (!defined($stat_real) || 2166*dd88ab32SMasahiro Yamada $stat !~ /^\+/ && $stat_real !~ /^\+/) { 2167*dd88ab32SMasahiro Yamada $check = 0; 2168*dd88ab32SMasahiro Yamada } 2169*dd88ab32SMasahiro Yamada if (defined($stat_real) && $cond_lines > 1) { 2170*dd88ab32SMasahiro Yamada $stat_real = "[...]\n$stat_real"; 2171*dd88ab32SMasahiro Yamada } 2172*dd88ab32SMasahiro Yamada 2173*dd88ab32SMasahiro 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"; 2174*dd88ab32SMasahiro Yamada 2175*dd88ab32SMasahiro Yamada if ($check && (($sindent % 8) != 0 || 2176*dd88ab32SMasahiro Yamada ($sindent <= $indent && $s ne ''))) { 2177*dd88ab32SMasahiro Yamada WARN("SUSPECT_CODE_INDENT", 2178*dd88ab32SMasahiro Yamada "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n"); 2179*dd88ab32SMasahiro Yamada } 2180*dd88ab32SMasahiro Yamada } 2181*dd88ab32SMasahiro Yamada 2182*dd88ab32SMasahiro Yamada # Track the 'values' across context and added lines. 2183*dd88ab32SMasahiro Yamada my $opline = $line; $opline =~ s/^./ /; 2184*dd88ab32SMasahiro Yamada my ($curr_values, $curr_vars) = 2185*dd88ab32SMasahiro Yamada annotate_values($opline . "\n", $prev_values); 2186*dd88ab32SMasahiro Yamada $curr_values = $prev_values . $curr_values; 2187*dd88ab32SMasahiro Yamada if ($dbg_values) { 2188*dd88ab32SMasahiro Yamada my $outline = $opline; $outline =~ s/\t/ /g; 2189*dd88ab32SMasahiro Yamada print "$linenr > .$outline\n"; 2190*dd88ab32SMasahiro Yamada print "$linenr > $curr_values\n"; 2191*dd88ab32SMasahiro Yamada print "$linenr > $curr_vars\n"; 2192*dd88ab32SMasahiro Yamada } 2193*dd88ab32SMasahiro Yamada $prev_values = substr($curr_values, -1); 2194*dd88ab32SMasahiro Yamada 2195*dd88ab32SMasahiro Yamada#ignore lines not being added 2196*dd88ab32SMasahiro Yamada if ($line=~/^[^\+]/) {next;} 2197*dd88ab32SMasahiro Yamada 2198*dd88ab32SMasahiro Yamada# TEST: allow direct testing of the type matcher. 2199*dd88ab32SMasahiro Yamada if ($dbg_type) { 2200*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*$Declare\s*$/) { 2201*dd88ab32SMasahiro Yamada ERROR("TEST_TYPE", 2202*dd88ab32SMasahiro Yamada "TEST: is type\n" . $herecurr); 2203*dd88ab32SMasahiro Yamada } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) { 2204*dd88ab32SMasahiro Yamada ERROR("TEST_NOT_TYPE", 2205*dd88ab32SMasahiro Yamada "TEST: is not type ($1 is)\n". $herecurr); 2206*dd88ab32SMasahiro Yamada } 2207*dd88ab32SMasahiro Yamada next; 2208*dd88ab32SMasahiro Yamada } 2209*dd88ab32SMasahiro Yamada# TEST: allow direct testing of the attribute matcher. 2210*dd88ab32SMasahiro Yamada if ($dbg_attr) { 2211*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*$Modifier\s*$/) { 2212*dd88ab32SMasahiro Yamada ERROR("TEST_ATTR", 2213*dd88ab32SMasahiro Yamada "TEST: is attr\n" . $herecurr); 2214*dd88ab32SMasahiro Yamada } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) { 2215*dd88ab32SMasahiro Yamada ERROR("TEST_NOT_ATTR", 2216*dd88ab32SMasahiro Yamada "TEST: is not attr ($1 is)\n". $herecurr); 2217*dd88ab32SMasahiro Yamada } 2218*dd88ab32SMasahiro Yamada next; 2219*dd88ab32SMasahiro Yamada } 2220*dd88ab32SMasahiro Yamada 2221*dd88ab32SMasahiro Yamada# check for initialisation to aggregates open brace on the next line 2222*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*{/ && 2223*dd88ab32SMasahiro Yamada $prevline =~ /(?:^|[^=])=\s*$/) { 2224*dd88ab32SMasahiro Yamada ERROR("OPEN_BRACE", 2225*dd88ab32SMasahiro Yamada "that open brace { should be on the previous line\n" . $hereprev); 2226*dd88ab32SMasahiro Yamada } 2227*dd88ab32SMasahiro Yamada 2228*dd88ab32SMasahiro Yamada# 2229*dd88ab32SMasahiro Yamada# Checks which are anchored on the added line. 2230*dd88ab32SMasahiro Yamada# 2231*dd88ab32SMasahiro Yamada 2232*dd88ab32SMasahiro Yamada# check for malformed paths in #include statements (uses RAW line) 2233*dd88ab32SMasahiro Yamada if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) { 2234*dd88ab32SMasahiro Yamada my $path = $1; 2235*dd88ab32SMasahiro Yamada if ($path =~ m{//}) { 2236*dd88ab32SMasahiro Yamada ERROR("MALFORMED_INCLUDE", 2237*dd88ab32SMasahiro Yamada "malformed #include filename\n" . $herecurr); 2238*dd88ab32SMasahiro Yamada } 2239*dd88ab32SMasahiro Yamada if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) { 2240*dd88ab32SMasahiro Yamada ERROR("UAPI_INCLUDE", 2241*dd88ab32SMasahiro Yamada "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr); 2242*dd88ab32SMasahiro Yamada } 2243*dd88ab32SMasahiro Yamada } 2244*dd88ab32SMasahiro Yamada 2245*dd88ab32SMasahiro Yamada# no C99 // comments 2246*dd88ab32SMasahiro Yamada if ($line =~ m{//}) { 2247*dd88ab32SMasahiro Yamada ERROR("C99_COMMENTS", 2248*dd88ab32SMasahiro Yamada "do not use C99 // comments\n" . $herecurr); 2249*dd88ab32SMasahiro Yamada } 2250*dd88ab32SMasahiro Yamada # Remove C99 comments. 2251*dd88ab32SMasahiro Yamada $line =~ s@//.*@@; 2252*dd88ab32SMasahiro Yamada $opline =~ s@//.*@@; 2253*dd88ab32SMasahiro Yamada 2254*dd88ab32SMasahiro Yamada# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider 2255*dd88ab32SMasahiro Yamada# the whole statement. 2256*dd88ab32SMasahiro Yamada#print "APW <$lines[$realline_next - 1]>\n"; 2257*dd88ab32SMasahiro Yamada if (defined $realline_next && 2258*dd88ab32SMasahiro Yamada exists $lines[$realline_next - 1] && 2259*dd88ab32SMasahiro Yamada !defined $suppress_export{$realline_next} && 2260*dd88ab32SMasahiro Yamada ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ || 2261*dd88ab32SMasahiro Yamada $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { 2262*dd88ab32SMasahiro Yamada # Handle definitions which produce identifiers with 2263*dd88ab32SMasahiro Yamada # a prefix: 2264*dd88ab32SMasahiro Yamada # XXX(foo); 2265*dd88ab32SMasahiro Yamada # EXPORT_SYMBOL(something_foo); 2266*dd88ab32SMasahiro Yamada my $name = $1; 2267*dd88ab32SMasahiro Yamada if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ && 2268*dd88ab32SMasahiro Yamada $name =~ /^${Ident}_$2/) { 2269*dd88ab32SMasahiro Yamada#print "FOO C name<$name>\n"; 2270*dd88ab32SMasahiro Yamada $suppress_export{$realline_next} = 1; 2271*dd88ab32SMasahiro Yamada 2272*dd88ab32SMasahiro Yamada } elsif ($stat !~ /(?: 2273*dd88ab32SMasahiro Yamada \n.}\s*$| 2274*dd88ab32SMasahiro Yamada ^.DEFINE_$Ident\(\Q$name\E\)| 2275*dd88ab32SMasahiro Yamada ^.DECLARE_$Ident\(\Q$name\E\)| 2276*dd88ab32SMasahiro Yamada ^.LIST_HEAD\(\Q$name\E\)| 2277*dd88ab32SMasahiro Yamada ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(| 2278*dd88ab32SMasahiro Yamada \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\() 2279*dd88ab32SMasahiro Yamada )/x) { 2280*dd88ab32SMasahiro Yamada#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n"; 2281*dd88ab32SMasahiro Yamada $suppress_export{$realline_next} = 2; 2282*dd88ab32SMasahiro Yamada } else { 2283*dd88ab32SMasahiro Yamada $suppress_export{$realline_next} = 1; 2284*dd88ab32SMasahiro Yamada } 2285*dd88ab32SMasahiro Yamada } 2286*dd88ab32SMasahiro Yamada if (!defined $suppress_export{$linenr} && 2287*dd88ab32SMasahiro Yamada $prevline =~ /^.\s*$/ && 2288*dd88ab32SMasahiro Yamada ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ || 2289*dd88ab32SMasahiro Yamada $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { 2290*dd88ab32SMasahiro Yamada#print "FOO B <$lines[$linenr - 1]>\n"; 2291*dd88ab32SMasahiro Yamada $suppress_export{$linenr} = 2; 2292*dd88ab32SMasahiro Yamada } 2293*dd88ab32SMasahiro Yamada if (defined $suppress_export{$linenr} && 2294*dd88ab32SMasahiro Yamada $suppress_export{$linenr} == 2) { 2295*dd88ab32SMasahiro Yamada WARN("EXPORT_SYMBOL", 2296*dd88ab32SMasahiro Yamada "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); 2297*dd88ab32SMasahiro Yamada } 2298*dd88ab32SMasahiro Yamada 2299*dd88ab32SMasahiro Yamada# check for global initialisers. 2300*dd88ab32SMasahiro Yamada if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) { 2301*dd88ab32SMasahiro Yamada ERROR("GLOBAL_INITIALISERS", 2302*dd88ab32SMasahiro Yamada "do not initialise globals to 0 or NULL\n" . 2303*dd88ab32SMasahiro Yamada $herecurr); 2304*dd88ab32SMasahiro Yamada } 2305*dd88ab32SMasahiro Yamada# check for static initialisers. 2306*dd88ab32SMasahiro Yamada if ($line =~ /\bstatic\s.*=\s*(0|NULL|false)\s*;/) { 2307*dd88ab32SMasahiro Yamada ERROR("INITIALISED_STATIC", 2308*dd88ab32SMasahiro Yamada "do not initialise statics to 0 or NULL\n" . 2309*dd88ab32SMasahiro Yamada $herecurr); 2310*dd88ab32SMasahiro Yamada } 2311*dd88ab32SMasahiro Yamada 2312*dd88ab32SMasahiro Yamada# check for static const char * arrays. 2313*dd88ab32SMasahiro Yamada if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) { 2314*dd88ab32SMasahiro Yamada WARN("STATIC_CONST_CHAR_ARRAY", 2315*dd88ab32SMasahiro Yamada "static const char * array should probably be static const char * const\n" . 2316*dd88ab32SMasahiro Yamada $herecurr); 2317*dd88ab32SMasahiro Yamada } 2318*dd88ab32SMasahiro Yamada 2319*dd88ab32SMasahiro Yamada# check for static char foo[] = "bar" declarations. 2320*dd88ab32SMasahiro Yamada if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) { 2321*dd88ab32SMasahiro Yamada WARN("STATIC_CONST_CHAR_ARRAY", 2322*dd88ab32SMasahiro Yamada "static char array declaration should probably be static const char\n" . 2323*dd88ab32SMasahiro Yamada $herecurr); 2324*dd88ab32SMasahiro Yamada } 2325*dd88ab32SMasahiro Yamada 2326*dd88ab32SMasahiro Yamada# check for declarations of struct pci_device_id 2327*dd88ab32SMasahiro Yamada if ($line =~ /\bstruct\s+pci_device_id\s+\w+\s*\[\s*\]\s*\=\s*\{/) { 2328*dd88ab32SMasahiro Yamada WARN("DEFINE_PCI_DEVICE_TABLE", 2329*dd88ab32SMasahiro Yamada "Use DEFINE_PCI_DEVICE_TABLE for struct pci_device_id\n" . $herecurr); 2330*dd88ab32SMasahiro Yamada } 2331*dd88ab32SMasahiro Yamada 2332*dd88ab32SMasahiro Yamada# check for new typedefs, only function parameters and sparse annotations 2333*dd88ab32SMasahiro Yamada# make sense. 2334*dd88ab32SMasahiro Yamada if ($line =~ /\btypedef\s/ && 2335*dd88ab32SMasahiro Yamada $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ && 2336*dd88ab32SMasahiro Yamada $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ && 2337*dd88ab32SMasahiro Yamada $line !~ /\b$typeTypedefs\b/ && 2338*dd88ab32SMasahiro Yamada $line !~ /\b__bitwise(?:__|)\b/) { 2339*dd88ab32SMasahiro Yamada WARN("NEW_TYPEDEFS", 2340*dd88ab32SMasahiro Yamada "do not add new typedefs\n" . $herecurr); 2341*dd88ab32SMasahiro Yamada } 2342*dd88ab32SMasahiro Yamada 2343*dd88ab32SMasahiro Yamada# * goes on variable not on type 2344*dd88ab32SMasahiro Yamada # (char*[ const]) 2345*dd88ab32SMasahiro Yamada while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) { 2346*dd88ab32SMasahiro Yamada #print "AA<$1>\n"; 2347*dd88ab32SMasahiro Yamada my ($from, $to) = ($2, $2); 2348*dd88ab32SMasahiro Yamada 2349*dd88ab32SMasahiro Yamada # Should start with a space. 2350*dd88ab32SMasahiro Yamada $to =~ s/^(\S)/ $1/; 2351*dd88ab32SMasahiro Yamada # Should not end with a space. 2352*dd88ab32SMasahiro Yamada $to =~ s/\s+$//; 2353*dd88ab32SMasahiro Yamada # '*'s should not have spaces between. 2354*dd88ab32SMasahiro Yamada while ($to =~ s/\*\s+\*/\*\*/) { 2355*dd88ab32SMasahiro Yamada } 2356*dd88ab32SMasahiro Yamada 2357*dd88ab32SMasahiro Yamada #print "from<$from> to<$to>\n"; 2358*dd88ab32SMasahiro Yamada if ($from ne $to) { 2359*dd88ab32SMasahiro Yamada ERROR("POINTER_LOCATION", 2360*dd88ab32SMasahiro Yamada "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr); 2361*dd88ab32SMasahiro Yamada } 2362*dd88ab32SMasahiro Yamada } 2363*dd88ab32SMasahiro Yamada while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) { 2364*dd88ab32SMasahiro Yamada #print "BB<$1>\n"; 2365*dd88ab32SMasahiro Yamada my ($from, $to, $ident) = ($2, $2, $3); 2366*dd88ab32SMasahiro Yamada 2367*dd88ab32SMasahiro Yamada # Should start with a space. 2368*dd88ab32SMasahiro Yamada $to =~ s/^(\S)/ $1/; 2369*dd88ab32SMasahiro Yamada # Should not end with a space. 2370*dd88ab32SMasahiro Yamada $to =~ s/\s+$//; 2371*dd88ab32SMasahiro Yamada # '*'s should not have spaces between. 2372*dd88ab32SMasahiro Yamada while ($to =~ s/\*\s+\*/\*\*/) { 2373*dd88ab32SMasahiro Yamada } 2374*dd88ab32SMasahiro Yamada # Modifiers should have spaces. 2375*dd88ab32SMasahiro Yamada $to =~ s/(\b$Modifier$)/$1 /; 2376*dd88ab32SMasahiro Yamada 2377*dd88ab32SMasahiro Yamada #print "from<$from> to<$to> ident<$ident>\n"; 2378*dd88ab32SMasahiro Yamada if ($from ne $to && $ident !~ /^$Modifier$/) { 2379*dd88ab32SMasahiro Yamada ERROR("POINTER_LOCATION", 2380*dd88ab32SMasahiro Yamada "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr); 2381*dd88ab32SMasahiro Yamada } 2382*dd88ab32SMasahiro Yamada } 2383*dd88ab32SMasahiro Yamada 2384*dd88ab32SMasahiro Yamada# # no BUG() or BUG_ON() 2385*dd88ab32SMasahiro Yamada# if ($line =~ /\b(BUG|BUG_ON)\b/) { 2386*dd88ab32SMasahiro Yamada# print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n"; 2387*dd88ab32SMasahiro Yamada# print "$herecurr"; 2388*dd88ab32SMasahiro Yamada# $clean = 0; 2389*dd88ab32SMasahiro Yamada# } 2390*dd88ab32SMasahiro Yamada 2391*dd88ab32SMasahiro Yamada if ($line =~ /\bLINUX_VERSION_CODE\b/) { 2392*dd88ab32SMasahiro Yamada WARN("LINUX_VERSION_CODE", 2393*dd88ab32SMasahiro Yamada "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr); 2394*dd88ab32SMasahiro Yamada } 2395*dd88ab32SMasahiro Yamada 2396*dd88ab32SMasahiro Yamada# check for uses of printk_ratelimit 2397*dd88ab32SMasahiro Yamada if ($line =~ /\bprintk_ratelimit\s*\(/) { 2398*dd88ab32SMasahiro Yamada WARN("PRINTK_RATELIMITED", 2399*dd88ab32SMasahiro Yamada"Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr); 2400*dd88ab32SMasahiro Yamada } 2401*dd88ab32SMasahiro Yamada 2402*dd88ab32SMasahiro Yamada# printk should use KERN_* levels. Note that follow on printk's on the 2403*dd88ab32SMasahiro Yamada# same line do not need a level, so we use the current block context 2404*dd88ab32SMasahiro Yamada# to try and find and validate the current printk. In summary the current 2405*dd88ab32SMasahiro Yamada# printk includes all preceding printk's which have no newline on the end. 2406*dd88ab32SMasahiro Yamada# we assume the first bad printk is the one to report. 2407*dd88ab32SMasahiro Yamada if ($line =~ /\bprintk\((?!KERN_)\s*"/) { 2408*dd88ab32SMasahiro Yamada my $ok = 0; 2409*dd88ab32SMasahiro Yamada for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) { 2410*dd88ab32SMasahiro Yamada #print "CHECK<$lines[$ln - 1]\n"; 2411*dd88ab32SMasahiro Yamada # we have a preceding printk if it ends 2412*dd88ab32SMasahiro Yamada # with "\n" ignore it, else it is to blame 2413*dd88ab32SMasahiro Yamada if ($lines[$ln - 1] =~ m{\bprintk\(}) { 2414*dd88ab32SMasahiro Yamada if ($rawlines[$ln - 1] !~ m{\\n"}) { 2415*dd88ab32SMasahiro Yamada $ok = 1; 2416*dd88ab32SMasahiro Yamada } 2417*dd88ab32SMasahiro Yamada last; 2418*dd88ab32SMasahiro Yamada } 2419*dd88ab32SMasahiro Yamada } 2420*dd88ab32SMasahiro Yamada if ($ok == 0) { 2421*dd88ab32SMasahiro Yamada WARN("PRINTK_WITHOUT_KERN_LEVEL", 2422*dd88ab32SMasahiro Yamada "printk() should include KERN_ facility level\n" . $herecurr); 2423*dd88ab32SMasahiro Yamada } 2424*dd88ab32SMasahiro Yamada } 2425*dd88ab32SMasahiro Yamada 2426*dd88ab32SMasahiro Yamada if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) { 2427*dd88ab32SMasahiro Yamada my $orig = $1; 2428*dd88ab32SMasahiro Yamada my $level = lc($orig); 2429*dd88ab32SMasahiro Yamada $level = "warn" if ($level eq "warning"); 2430*dd88ab32SMasahiro Yamada my $level2 = $level; 2431*dd88ab32SMasahiro Yamada $level2 = "dbg" if ($level eq "debug"); 2432*dd88ab32SMasahiro Yamada WARN("PREFER_PR_LEVEL", 2433*dd88ab32SMasahiro Yamada "Prefer netdev_$level2(netdev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr); 2434*dd88ab32SMasahiro Yamada } 2435*dd88ab32SMasahiro Yamada 2436*dd88ab32SMasahiro Yamada if ($line =~ /\bpr_warning\s*\(/) { 2437*dd88ab32SMasahiro Yamada WARN("PREFER_PR_LEVEL", 2438*dd88ab32SMasahiro Yamada "Prefer pr_warn(... to pr_warning(...\n" . $herecurr); 2439*dd88ab32SMasahiro Yamada } 2440*dd88ab32SMasahiro Yamada 2441*dd88ab32SMasahiro Yamada if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) { 2442*dd88ab32SMasahiro Yamada my $orig = $1; 2443*dd88ab32SMasahiro Yamada my $level = lc($orig); 2444*dd88ab32SMasahiro Yamada $level = "warn" if ($level eq "warning"); 2445*dd88ab32SMasahiro Yamada $level = "dbg" if ($level eq "debug"); 2446*dd88ab32SMasahiro Yamada WARN("PREFER_DEV_LEVEL", 2447*dd88ab32SMasahiro Yamada "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr); 2448*dd88ab32SMasahiro Yamada } 2449*dd88ab32SMasahiro Yamada 2450*dd88ab32SMasahiro Yamada# function brace can't be on same line, except for #defines of do while, 2451*dd88ab32SMasahiro Yamada# or if closed on same line 2452*dd88ab32SMasahiro Yamada if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and 2453*dd88ab32SMasahiro Yamada !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) { 2454*dd88ab32SMasahiro Yamada ERROR("OPEN_BRACE", 2455*dd88ab32SMasahiro Yamada "open brace '{' following function declarations go on the next line\n" . $herecurr); 2456*dd88ab32SMasahiro Yamada } 2457*dd88ab32SMasahiro Yamada 2458*dd88ab32SMasahiro Yamada# open braces for enum, union and struct go on the same line. 2459*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*{/ && 2460*dd88ab32SMasahiro Yamada $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) { 2461*dd88ab32SMasahiro Yamada ERROR("OPEN_BRACE", 2462*dd88ab32SMasahiro Yamada "open brace '{' following $1 go on the same line\n" . $hereprev); 2463*dd88ab32SMasahiro Yamada } 2464*dd88ab32SMasahiro Yamada 2465*dd88ab32SMasahiro Yamada# missing space after union, struct or enum definition 2466*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?(?:\s+$Ident)?[=\{]/) { 2467*dd88ab32SMasahiro Yamada WARN("SPACING", 2468*dd88ab32SMasahiro Yamada "missing space after $1 definition\n" . $herecurr); 2469*dd88ab32SMasahiro Yamada } 2470*dd88ab32SMasahiro Yamada 2471*dd88ab32SMasahiro Yamada# check for spacing round square brackets; allowed: 2472*dd88ab32SMasahiro Yamada# 1. with a type on the left -- int [] a; 2473*dd88ab32SMasahiro Yamada# 2. at the beginning of a line for slice initialisers -- [0...10] = 5, 2474*dd88ab32SMasahiro Yamada# 3. inside a curly brace -- = { [0...10] = 5 } 2475*dd88ab32SMasahiro Yamada while ($line =~ /(.*?\s)\[/g) { 2476*dd88ab32SMasahiro Yamada my ($where, $prefix) = ($-[1], $1); 2477*dd88ab32SMasahiro Yamada if ($prefix !~ /$Type\s+$/ && 2478*dd88ab32SMasahiro Yamada ($where != 0 || $prefix !~ /^.\s+$/) && 2479*dd88ab32SMasahiro Yamada $prefix !~ /[{,]\s+$/) { 2480*dd88ab32SMasahiro Yamada ERROR("BRACKET_SPACE", 2481*dd88ab32SMasahiro Yamada "space prohibited before open square bracket '['\n" . $herecurr); 2482*dd88ab32SMasahiro Yamada } 2483*dd88ab32SMasahiro Yamada } 2484*dd88ab32SMasahiro Yamada 2485*dd88ab32SMasahiro Yamada# check for spaces between functions and their parentheses. 2486*dd88ab32SMasahiro Yamada while ($line =~ /($Ident)\s+\(/g) { 2487*dd88ab32SMasahiro Yamada my $name = $1; 2488*dd88ab32SMasahiro Yamada my $ctx_before = substr($line, 0, $-[1]); 2489*dd88ab32SMasahiro Yamada my $ctx = "$ctx_before$name"; 2490*dd88ab32SMasahiro Yamada 2491*dd88ab32SMasahiro Yamada # Ignore those directives where spaces _are_ permitted. 2492*dd88ab32SMasahiro Yamada if ($name =~ /^(?: 2493*dd88ab32SMasahiro Yamada if|for|while|switch|return|case| 2494*dd88ab32SMasahiro Yamada volatile|__volatile__| 2495*dd88ab32SMasahiro Yamada __attribute__|format|__extension__| 2496*dd88ab32SMasahiro Yamada asm|__asm__)$/x) 2497*dd88ab32SMasahiro Yamada { 2498*dd88ab32SMasahiro Yamada 2499*dd88ab32SMasahiro Yamada # cpp #define statements have non-optional spaces, ie 2500*dd88ab32SMasahiro Yamada # if there is a space between the name and the open 2501*dd88ab32SMasahiro Yamada # parenthesis it is simply not a parameter group. 2502*dd88ab32SMasahiro Yamada } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) { 2503*dd88ab32SMasahiro Yamada 2504*dd88ab32SMasahiro Yamada # cpp #elif statement condition may start with a ( 2505*dd88ab32SMasahiro Yamada } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) { 2506*dd88ab32SMasahiro Yamada 2507*dd88ab32SMasahiro Yamada # If this whole things ends with a type its most 2508*dd88ab32SMasahiro Yamada # likely a typedef for a function. 2509*dd88ab32SMasahiro Yamada } elsif ($ctx =~ /$Type$/) { 2510*dd88ab32SMasahiro Yamada 2511*dd88ab32SMasahiro Yamada } else { 2512*dd88ab32SMasahiro Yamada WARN("SPACING", 2513*dd88ab32SMasahiro Yamada "space prohibited between function name and open parenthesis '('\n" . $herecurr); 2514*dd88ab32SMasahiro Yamada } 2515*dd88ab32SMasahiro Yamada } 2516*dd88ab32SMasahiro Yamada 2517*dd88ab32SMasahiro Yamada# check for whitespace before a non-naked semicolon 2518*dd88ab32SMasahiro Yamada if ($line =~ /^\+.*\S\s+;/) { 2519*dd88ab32SMasahiro Yamada CHK("SPACING", 2520*dd88ab32SMasahiro Yamada "space prohibited before semicolon\n" . $herecurr); 2521*dd88ab32SMasahiro Yamada } 2522*dd88ab32SMasahiro Yamada 2523*dd88ab32SMasahiro Yamada# Check operator spacing. 2524*dd88ab32SMasahiro Yamada if (!($line=~/\#\s*include/)) { 2525*dd88ab32SMasahiro Yamada my $ops = qr{ 2526*dd88ab32SMasahiro Yamada <<=|>>=|<=|>=|==|!=| 2527*dd88ab32SMasahiro Yamada \+=|-=|\*=|\/=|%=|\^=|\|=|&=| 2528*dd88ab32SMasahiro Yamada =>|->|<<|>>|<|>|=|!|~| 2529*dd88ab32SMasahiro Yamada &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%| 2530*dd88ab32SMasahiro Yamada \?|: 2531*dd88ab32SMasahiro Yamada }x; 2532*dd88ab32SMasahiro Yamada my @elements = split(/($ops|;)/, $opline); 2533*dd88ab32SMasahiro Yamada my $off = 0; 2534*dd88ab32SMasahiro Yamada 2535*dd88ab32SMasahiro Yamada my $blank = copy_spacing($opline); 2536*dd88ab32SMasahiro Yamada 2537*dd88ab32SMasahiro Yamada for (my $n = 0; $n < $#elements; $n += 2) { 2538*dd88ab32SMasahiro Yamada $off += length($elements[$n]); 2539*dd88ab32SMasahiro Yamada 2540*dd88ab32SMasahiro Yamada # Pick up the preceding and succeeding characters. 2541*dd88ab32SMasahiro Yamada my $ca = substr($opline, 0, $off); 2542*dd88ab32SMasahiro Yamada my $cc = ''; 2543*dd88ab32SMasahiro Yamada if (length($opline) >= ($off + length($elements[$n + 1]))) { 2544*dd88ab32SMasahiro Yamada $cc = substr($opline, $off + length($elements[$n + 1])); 2545*dd88ab32SMasahiro Yamada } 2546*dd88ab32SMasahiro Yamada my $cb = "$ca$;$cc"; 2547*dd88ab32SMasahiro Yamada 2548*dd88ab32SMasahiro Yamada my $a = ''; 2549*dd88ab32SMasahiro Yamada $a = 'V' if ($elements[$n] ne ''); 2550*dd88ab32SMasahiro Yamada $a = 'W' if ($elements[$n] =~ /\s$/); 2551*dd88ab32SMasahiro Yamada $a = 'C' if ($elements[$n] =~ /$;$/); 2552*dd88ab32SMasahiro Yamada $a = 'B' if ($elements[$n] =~ /(\[|\()$/); 2553*dd88ab32SMasahiro Yamada $a = 'O' if ($elements[$n] eq ''); 2554*dd88ab32SMasahiro Yamada $a = 'E' if ($ca =~ /^\s*$/); 2555*dd88ab32SMasahiro Yamada 2556*dd88ab32SMasahiro Yamada my $op = $elements[$n + 1]; 2557*dd88ab32SMasahiro Yamada 2558*dd88ab32SMasahiro Yamada my $c = ''; 2559*dd88ab32SMasahiro Yamada if (defined $elements[$n + 2]) { 2560*dd88ab32SMasahiro Yamada $c = 'V' if ($elements[$n + 2] ne ''); 2561*dd88ab32SMasahiro Yamada $c = 'W' if ($elements[$n + 2] =~ /^\s/); 2562*dd88ab32SMasahiro Yamada $c = 'C' if ($elements[$n + 2] =~ /^$;/); 2563*dd88ab32SMasahiro Yamada $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/); 2564*dd88ab32SMasahiro Yamada $c = 'O' if ($elements[$n + 2] eq ''); 2565*dd88ab32SMasahiro Yamada $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/); 2566*dd88ab32SMasahiro Yamada } else { 2567*dd88ab32SMasahiro Yamada $c = 'E'; 2568*dd88ab32SMasahiro Yamada } 2569*dd88ab32SMasahiro Yamada 2570*dd88ab32SMasahiro Yamada my $ctx = "${a}x${c}"; 2571*dd88ab32SMasahiro Yamada 2572*dd88ab32SMasahiro Yamada my $at = "(ctx:$ctx)"; 2573*dd88ab32SMasahiro Yamada 2574*dd88ab32SMasahiro Yamada my $ptr = substr($blank, 0, $off) . "^"; 2575*dd88ab32SMasahiro Yamada my $hereptr = "$hereline$ptr\n"; 2576*dd88ab32SMasahiro Yamada 2577*dd88ab32SMasahiro Yamada # Pull out the value of this operator. 2578*dd88ab32SMasahiro Yamada my $op_type = substr($curr_values, $off + 1, 1); 2579*dd88ab32SMasahiro Yamada 2580*dd88ab32SMasahiro Yamada # Get the full operator variant. 2581*dd88ab32SMasahiro Yamada my $opv = $op . substr($curr_vars, $off, 1); 2582*dd88ab32SMasahiro Yamada 2583*dd88ab32SMasahiro Yamada # Ignore operators passed as parameters. 2584*dd88ab32SMasahiro Yamada if ($op_type ne 'V' && 2585*dd88ab32SMasahiro Yamada $ca =~ /\s$/ && $cc =~ /^\s*,/) { 2586*dd88ab32SMasahiro Yamada 2587*dd88ab32SMasahiro Yamada# # Ignore comments 2588*dd88ab32SMasahiro Yamada# } elsif ($op =~ /^$;+$/) { 2589*dd88ab32SMasahiro Yamada 2590*dd88ab32SMasahiro Yamada # ; should have either the end of line or a space or \ after it 2591*dd88ab32SMasahiro Yamada } elsif ($op eq ';') { 2592*dd88ab32SMasahiro Yamada if ($ctx !~ /.x[WEBC]/ && 2593*dd88ab32SMasahiro Yamada $cc !~ /^\\/ && $cc !~ /^;/) { 2594*dd88ab32SMasahiro Yamada ERROR("SPACING", 2595*dd88ab32SMasahiro Yamada "space required after that '$op' $at\n" . $hereptr); 2596*dd88ab32SMasahiro Yamada } 2597*dd88ab32SMasahiro Yamada 2598*dd88ab32SMasahiro Yamada # // is a comment 2599*dd88ab32SMasahiro Yamada } elsif ($op eq '//') { 2600*dd88ab32SMasahiro Yamada 2601*dd88ab32SMasahiro Yamada # No spaces for: 2602*dd88ab32SMasahiro Yamada # -> 2603*dd88ab32SMasahiro Yamada # : when part of a bitfield 2604*dd88ab32SMasahiro Yamada } elsif ($op eq '->' || $opv eq ':B') { 2605*dd88ab32SMasahiro Yamada if ($ctx =~ /Wx.|.xW/) { 2606*dd88ab32SMasahiro Yamada ERROR("SPACING", 2607*dd88ab32SMasahiro Yamada "spaces prohibited around that '$op' $at\n" . $hereptr); 2608*dd88ab32SMasahiro Yamada } 2609*dd88ab32SMasahiro Yamada 2610*dd88ab32SMasahiro Yamada # , must have a space on the right. 2611*dd88ab32SMasahiro Yamada } elsif ($op eq ',') { 2612*dd88ab32SMasahiro Yamada if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) { 2613*dd88ab32SMasahiro Yamada ERROR("SPACING", 2614*dd88ab32SMasahiro Yamada "space required after that '$op' $at\n" . $hereptr); 2615*dd88ab32SMasahiro Yamada } 2616*dd88ab32SMasahiro Yamada 2617*dd88ab32SMasahiro Yamada # '*' as part of a type definition -- reported already. 2618*dd88ab32SMasahiro Yamada } elsif ($opv eq '*_') { 2619*dd88ab32SMasahiro Yamada #warn "'*' is part of type\n"; 2620*dd88ab32SMasahiro Yamada 2621*dd88ab32SMasahiro Yamada # unary operators should have a space before and 2622*dd88ab32SMasahiro Yamada # none after. May be left adjacent to another 2623*dd88ab32SMasahiro Yamada # unary operator, or a cast 2624*dd88ab32SMasahiro Yamada } elsif ($op eq '!' || $op eq '~' || 2625*dd88ab32SMasahiro Yamada $opv eq '*U' || $opv eq '-U' || 2626*dd88ab32SMasahiro Yamada $opv eq '&U' || $opv eq '&&U') { 2627*dd88ab32SMasahiro Yamada if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { 2628*dd88ab32SMasahiro Yamada ERROR("SPACING", 2629*dd88ab32SMasahiro Yamada "space required before that '$op' $at\n" . $hereptr); 2630*dd88ab32SMasahiro Yamada } 2631*dd88ab32SMasahiro Yamada if ($op eq '*' && $cc =~/\s*$Modifier\b/) { 2632*dd88ab32SMasahiro Yamada # A unary '*' may be const 2633*dd88ab32SMasahiro Yamada 2634*dd88ab32SMasahiro Yamada } elsif ($ctx =~ /.xW/) { 2635*dd88ab32SMasahiro Yamada ERROR("SPACING", 2636*dd88ab32SMasahiro Yamada "space prohibited after that '$op' $at\n" . $hereptr); 2637*dd88ab32SMasahiro Yamada } 2638*dd88ab32SMasahiro Yamada 2639*dd88ab32SMasahiro Yamada # unary ++ and unary -- are allowed no space on one side. 2640*dd88ab32SMasahiro Yamada } elsif ($op eq '++' or $op eq '--') { 2641*dd88ab32SMasahiro Yamada if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) { 2642*dd88ab32SMasahiro Yamada ERROR("SPACING", 2643*dd88ab32SMasahiro Yamada "space required one side of that '$op' $at\n" . $hereptr); 2644*dd88ab32SMasahiro Yamada } 2645*dd88ab32SMasahiro Yamada if ($ctx =~ /Wx[BE]/ || 2646*dd88ab32SMasahiro Yamada ($ctx =~ /Wx./ && $cc =~ /^;/)) { 2647*dd88ab32SMasahiro Yamada ERROR("SPACING", 2648*dd88ab32SMasahiro Yamada "space prohibited before that '$op' $at\n" . $hereptr); 2649*dd88ab32SMasahiro Yamada } 2650*dd88ab32SMasahiro Yamada if ($ctx =~ /ExW/) { 2651*dd88ab32SMasahiro Yamada ERROR("SPACING", 2652*dd88ab32SMasahiro Yamada "space prohibited after that '$op' $at\n" . $hereptr); 2653*dd88ab32SMasahiro Yamada } 2654*dd88ab32SMasahiro Yamada 2655*dd88ab32SMasahiro Yamada 2656*dd88ab32SMasahiro Yamada # << and >> may either have or not have spaces both sides 2657*dd88ab32SMasahiro Yamada } elsif ($op eq '<<' or $op eq '>>' or 2658*dd88ab32SMasahiro Yamada $op eq '&' or $op eq '^' or $op eq '|' or 2659*dd88ab32SMasahiro Yamada $op eq '+' or $op eq '-' or 2660*dd88ab32SMasahiro Yamada $op eq '*' or $op eq '/' or 2661*dd88ab32SMasahiro Yamada $op eq '%') 2662*dd88ab32SMasahiro Yamada { 2663*dd88ab32SMasahiro Yamada if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) { 2664*dd88ab32SMasahiro Yamada ERROR("SPACING", 2665*dd88ab32SMasahiro Yamada "need consistent spacing around '$op' $at\n" . 2666*dd88ab32SMasahiro Yamada $hereptr); 2667*dd88ab32SMasahiro Yamada } 2668*dd88ab32SMasahiro Yamada 2669*dd88ab32SMasahiro Yamada # A colon needs no spaces before when it is 2670*dd88ab32SMasahiro Yamada # terminating a case value or a label. 2671*dd88ab32SMasahiro Yamada } elsif ($opv eq ':C' || $opv eq ':L') { 2672*dd88ab32SMasahiro Yamada if ($ctx =~ /Wx./) { 2673*dd88ab32SMasahiro Yamada ERROR("SPACING", 2674*dd88ab32SMasahiro Yamada "space prohibited before that '$op' $at\n" . $hereptr); 2675*dd88ab32SMasahiro Yamada } 2676*dd88ab32SMasahiro Yamada 2677*dd88ab32SMasahiro Yamada # All the others need spaces both sides. 2678*dd88ab32SMasahiro Yamada } elsif ($ctx !~ /[EWC]x[CWE]/) { 2679*dd88ab32SMasahiro Yamada my $ok = 0; 2680*dd88ab32SMasahiro Yamada 2681*dd88ab32SMasahiro Yamada # Ignore email addresses <foo@bar> 2682*dd88ab32SMasahiro Yamada if (($op eq '<' && 2683*dd88ab32SMasahiro Yamada $cc =~ /^\S+\@\S+>/) || 2684*dd88ab32SMasahiro Yamada ($op eq '>' && 2685*dd88ab32SMasahiro Yamada $ca =~ /<\S+\@\S+$/)) 2686*dd88ab32SMasahiro Yamada { 2687*dd88ab32SMasahiro Yamada $ok = 1; 2688*dd88ab32SMasahiro Yamada } 2689*dd88ab32SMasahiro Yamada 2690*dd88ab32SMasahiro Yamada # Ignore ?: 2691*dd88ab32SMasahiro Yamada if (($opv eq ':O' && $ca =~ /\?$/) || 2692*dd88ab32SMasahiro Yamada ($op eq '?' && $cc =~ /^:/)) { 2693*dd88ab32SMasahiro Yamada $ok = 1; 2694*dd88ab32SMasahiro Yamada } 2695*dd88ab32SMasahiro Yamada 2696*dd88ab32SMasahiro Yamada if ($ok == 0) { 2697*dd88ab32SMasahiro Yamada ERROR("SPACING", 2698*dd88ab32SMasahiro Yamada "spaces required around that '$op' $at\n" . $hereptr); 2699*dd88ab32SMasahiro Yamada } 2700*dd88ab32SMasahiro Yamada } 2701*dd88ab32SMasahiro Yamada $off += length($elements[$n + 1]); 2702*dd88ab32SMasahiro Yamada } 2703*dd88ab32SMasahiro Yamada } 2704*dd88ab32SMasahiro Yamada 2705*dd88ab32SMasahiro Yamada# check for multiple assignments 2706*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) { 2707*dd88ab32SMasahiro Yamada CHK("MULTIPLE_ASSIGNMENTS", 2708*dd88ab32SMasahiro Yamada "multiple assignments should be avoided\n" . $herecurr); 2709*dd88ab32SMasahiro Yamada } 2710*dd88ab32SMasahiro Yamada 2711*dd88ab32SMasahiro Yamada## # check for multiple declarations, allowing for a function declaration 2712*dd88ab32SMasahiro Yamada## # continuation. 2713*dd88ab32SMasahiro Yamada## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ && 2714*dd88ab32SMasahiro Yamada## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) { 2715*dd88ab32SMasahiro Yamada## 2716*dd88ab32SMasahiro Yamada## # Remove any bracketed sections to ensure we do not 2717*dd88ab32SMasahiro Yamada## # falsly report the parameters of functions. 2718*dd88ab32SMasahiro Yamada## my $ln = $line; 2719*dd88ab32SMasahiro Yamada## while ($ln =~ s/\([^\(\)]*\)//g) { 2720*dd88ab32SMasahiro Yamada## } 2721*dd88ab32SMasahiro Yamada## if ($ln =~ /,/) { 2722*dd88ab32SMasahiro Yamada## WARN("MULTIPLE_DECLARATION", 2723*dd88ab32SMasahiro Yamada## "declaring multiple variables together should be avoided\n" . $herecurr); 2724*dd88ab32SMasahiro Yamada## } 2725*dd88ab32SMasahiro Yamada## } 2726*dd88ab32SMasahiro Yamada 2727*dd88ab32SMasahiro Yamada#need space before brace following if, while, etc 2728*dd88ab32SMasahiro Yamada if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) || 2729*dd88ab32SMasahiro Yamada $line =~ /do{/) { 2730*dd88ab32SMasahiro Yamada ERROR("SPACING", 2731*dd88ab32SMasahiro Yamada "space required before the open brace '{'\n" . $herecurr); 2732*dd88ab32SMasahiro Yamada } 2733*dd88ab32SMasahiro Yamada 2734*dd88ab32SMasahiro Yamada# closing brace should have a space following it when it has anything 2735*dd88ab32SMasahiro Yamada# on the line 2736*dd88ab32SMasahiro Yamada if ($line =~ /}(?!(?:,|;|\)))\S/) { 2737*dd88ab32SMasahiro Yamada ERROR("SPACING", 2738*dd88ab32SMasahiro Yamada "space required after that close brace '}'\n" . $herecurr); 2739*dd88ab32SMasahiro Yamada } 2740*dd88ab32SMasahiro Yamada 2741*dd88ab32SMasahiro Yamada# check spacing on square brackets 2742*dd88ab32SMasahiro Yamada if ($line =~ /\[\s/ && $line !~ /\[\s*$/) { 2743*dd88ab32SMasahiro Yamada ERROR("SPACING", 2744*dd88ab32SMasahiro Yamada "space prohibited after that open square bracket '['\n" . $herecurr); 2745*dd88ab32SMasahiro Yamada } 2746*dd88ab32SMasahiro Yamada if ($line =~ /\s\]/) { 2747*dd88ab32SMasahiro Yamada ERROR("SPACING", 2748*dd88ab32SMasahiro Yamada "space prohibited before that close square bracket ']'\n" . $herecurr); 2749*dd88ab32SMasahiro Yamada } 2750*dd88ab32SMasahiro Yamada 2751*dd88ab32SMasahiro Yamada# check spacing on parentheses 2752*dd88ab32SMasahiro Yamada if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ && 2753*dd88ab32SMasahiro Yamada $line !~ /for\s*\(\s+;/) { 2754*dd88ab32SMasahiro Yamada ERROR("SPACING", 2755*dd88ab32SMasahiro Yamada "space prohibited after that open parenthesis '('\n" . $herecurr); 2756*dd88ab32SMasahiro Yamada } 2757*dd88ab32SMasahiro Yamada if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ && 2758*dd88ab32SMasahiro Yamada $line !~ /for\s*\(.*;\s+\)/ && 2759*dd88ab32SMasahiro Yamada $line !~ /:\s+\)/) { 2760*dd88ab32SMasahiro Yamada ERROR("SPACING", 2761*dd88ab32SMasahiro Yamada "space prohibited before that close parenthesis ')'\n" . $herecurr); 2762*dd88ab32SMasahiro Yamada } 2763*dd88ab32SMasahiro Yamada 2764*dd88ab32SMasahiro Yamada#goto labels aren't indented, allow a single space however 2765*dd88ab32SMasahiro Yamada if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and 2766*dd88ab32SMasahiro Yamada !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) { 2767*dd88ab32SMasahiro Yamada WARN("INDENTED_LABEL", 2768*dd88ab32SMasahiro Yamada "labels should not be indented\n" . $herecurr); 2769*dd88ab32SMasahiro Yamada } 2770*dd88ab32SMasahiro Yamada 2771*dd88ab32SMasahiro Yamada# Return is not a function. 2772*dd88ab32SMasahiro Yamada if (defined($stat) && $stat =~ /^.\s*return(\s*)(\(.*);/s) { 2773*dd88ab32SMasahiro Yamada my $spacing = $1; 2774*dd88ab32SMasahiro Yamada my $value = $2; 2775*dd88ab32SMasahiro Yamada 2776*dd88ab32SMasahiro Yamada # Flatten any parentheses 2777*dd88ab32SMasahiro Yamada $value =~ s/\(/ \(/g; 2778*dd88ab32SMasahiro Yamada $value =~ s/\)/\) /g; 2779*dd88ab32SMasahiro Yamada while ($value =~ s/\[[^\[\]]*\]/1/ || 2780*dd88ab32SMasahiro Yamada $value !~ /(?:$Ident|-?$Constant)\s* 2781*dd88ab32SMasahiro Yamada $Compare\s* 2782*dd88ab32SMasahiro Yamada (?:$Ident|-?$Constant)/x && 2783*dd88ab32SMasahiro Yamada $value =~ s/\([^\(\)]*\)/1/) { 2784*dd88ab32SMasahiro Yamada } 2785*dd88ab32SMasahiro Yamada#print "value<$value>\n"; 2786*dd88ab32SMasahiro Yamada if ($value =~ /^\s*(?:$Ident|-?$Constant)\s*$/) { 2787*dd88ab32SMasahiro Yamada ERROR("RETURN_PARENTHESES", 2788*dd88ab32SMasahiro Yamada "return is not a function, parentheses are not required\n" . $herecurr); 2789*dd88ab32SMasahiro Yamada 2790*dd88ab32SMasahiro Yamada } elsif ($spacing !~ /\s+/) { 2791*dd88ab32SMasahiro Yamada ERROR("SPACING", 2792*dd88ab32SMasahiro Yamada "space required before the open parenthesis '('\n" . $herecurr); 2793*dd88ab32SMasahiro Yamada } 2794*dd88ab32SMasahiro Yamada } 2795*dd88ab32SMasahiro Yamada# Return of what appears to be an errno should normally be -'ve 2796*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) { 2797*dd88ab32SMasahiro Yamada my $name = $1; 2798*dd88ab32SMasahiro Yamada if ($name ne 'EOF' && $name ne 'ERROR') { 2799*dd88ab32SMasahiro Yamada WARN("USE_NEGATIVE_ERRNO", 2800*dd88ab32SMasahiro Yamada "return of an errno should typically be -ve (return -$1)\n" . $herecurr); 2801*dd88ab32SMasahiro Yamada } 2802*dd88ab32SMasahiro Yamada } 2803*dd88ab32SMasahiro Yamada 2804*dd88ab32SMasahiro Yamada# Need a space before open parenthesis after if, while etc 2805*dd88ab32SMasahiro Yamada if ($line=~/\b(if|while|for|switch)\(/) { 2806*dd88ab32SMasahiro Yamada ERROR("SPACING", "space required before the open parenthesis '('\n" . $herecurr); 2807*dd88ab32SMasahiro Yamada } 2808*dd88ab32SMasahiro Yamada 2809*dd88ab32SMasahiro Yamada# Check for illegal assignment in if conditional -- and check for trailing 2810*dd88ab32SMasahiro Yamada# statements after the conditional. 2811*dd88ab32SMasahiro Yamada if ($line =~ /do\s*(?!{)/) { 2812*dd88ab32SMasahiro Yamada ($stat, $cond, $line_nr_next, $remain_next, $off_next) = 2813*dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0) 2814*dd88ab32SMasahiro Yamada if (!defined $stat); 2815*dd88ab32SMasahiro Yamada my ($stat_next) = ctx_statement_block($line_nr_next, 2816*dd88ab32SMasahiro Yamada $remain_next, $off_next); 2817*dd88ab32SMasahiro Yamada $stat_next =~ s/\n./\n /g; 2818*dd88ab32SMasahiro Yamada ##print "stat<$stat> stat_next<$stat_next>\n"; 2819*dd88ab32SMasahiro Yamada 2820*dd88ab32SMasahiro Yamada if ($stat_next =~ /^\s*while\b/) { 2821*dd88ab32SMasahiro Yamada # If the statement carries leading newlines, 2822*dd88ab32SMasahiro Yamada # then count those as offsets. 2823*dd88ab32SMasahiro Yamada my ($whitespace) = 2824*dd88ab32SMasahiro Yamada ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s); 2825*dd88ab32SMasahiro Yamada my $offset = 2826*dd88ab32SMasahiro Yamada statement_rawlines($whitespace) - 1; 2827*dd88ab32SMasahiro Yamada 2828*dd88ab32SMasahiro Yamada $suppress_whiletrailers{$line_nr_next + 2829*dd88ab32SMasahiro Yamada $offset} = 1; 2830*dd88ab32SMasahiro Yamada } 2831*dd88ab32SMasahiro Yamada } 2832*dd88ab32SMasahiro Yamada if (!defined $suppress_whiletrailers{$linenr} && 2833*dd88ab32SMasahiro Yamada $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) { 2834*dd88ab32SMasahiro Yamada my ($s, $c) = ($stat, $cond); 2835*dd88ab32SMasahiro Yamada 2836*dd88ab32SMasahiro Yamada if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) { 2837*dd88ab32SMasahiro Yamada ERROR("ASSIGN_IN_IF", 2838*dd88ab32SMasahiro Yamada "do not use assignment in if condition\n" . $herecurr); 2839*dd88ab32SMasahiro Yamada } 2840*dd88ab32SMasahiro Yamada 2841*dd88ab32SMasahiro Yamada # Find out what is on the end of the line after the 2842*dd88ab32SMasahiro Yamada # conditional. 2843*dd88ab32SMasahiro Yamada substr($s, 0, length($c), ''); 2844*dd88ab32SMasahiro Yamada $s =~ s/\n.*//g; 2845*dd88ab32SMasahiro Yamada $s =~ s/$;//g; # Remove any comments 2846*dd88ab32SMasahiro Yamada if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ && 2847*dd88ab32SMasahiro Yamada $c !~ /}\s*while\s*/) 2848*dd88ab32SMasahiro Yamada { 2849*dd88ab32SMasahiro Yamada # Find out how long the conditional actually is. 2850*dd88ab32SMasahiro Yamada my @newlines = ($c =~ /\n/gs); 2851*dd88ab32SMasahiro Yamada my $cond_lines = 1 + $#newlines; 2852*dd88ab32SMasahiro Yamada my $stat_real = ''; 2853*dd88ab32SMasahiro Yamada 2854*dd88ab32SMasahiro Yamada $stat_real = raw_line($linenr, $cond_lines) 2855*dd88ab32SMasahiro Yamada . "\n" if ($cond_lines); 2856*dd88ab32SMasahiro Yamada if (defined($stat_real) && $cond_lines > 1) { 2857*dd88ab32SMasahiro Yamada $stat_real = "[...]\n$stat_real"; 2858*dd88ab32SMasahiro Yamada } 2859*dd88ab32SMasahiro Yamada 2860*dd88ab32SMasahiro Yamada ERROR("TRAILING_STATEMENTS", 2861*dd88ab32SMasahiro Yamada "trailing statements should be on next line\n" . $herecurr . $stat_real); 2862*dd88ab32SMasahiro Yamada } 2863*dd88ab32SMasahiro Yamada } 2864*dd88ab32SMasahiro Yamada 2865*dd88ab32SMasahiro Yamada# Check for bitwise tests written as boolean 2866*dd88ab32SMasahiro Yamada if ($line =~ / 2867*dd88ab32SMasahiro Yamada (?: 2868*dd88ab32SMasahiro Yamada (?:\[|\(|\&\&|\|\|) 2869*dd88ab32SMasahiro Yamada \s*0[xX][0-9]+\s* 2870*dd88ab32SMasahiro Yamada (?:\&\&|\|\|) 2871*dd88ab32SMasahiro Yamada | 2872*dd88ab32SMasahiro Yamada (?:\&\&|\|\|) 2873*dd88ab32SMasahiro Yamada \s*0[xX][0-9]+\s* 2874*dd88ab32SMasahiro Yamada (?:\&\&|\|\||\)|\]) 2875*dd88ab32SMasahiro Yamada )/x) 2876*dd88ab32SMasahiro Yamada { 2877*dd88ab32SMasahiro Yamada WARN("HEXADECIMAL_BOOLEAN_TEST", 2878*dd88ab32SMasahiro Yamada "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr); 2879*dd88ab32SMasahiro Yamada } 2880*dd88ab32SMasahiro Yamada 2881*dd88ab32SMasahiro Yamada# if and else should not have general statements after it 2882*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) { 2883*dd88ab32SMasahiro Yamada my $s = $1; 2884*dd88ab32SMasahiro Yamada $s =~ s/$;//g; # Remove any comments 2885*dd88ab32SMasahiro Yamada if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) { 2886*dd88ab32SMasahiro Yamada ERROR("TRAILING_STATEMENTS", 2887*dd88ab32SMasahiro Yamada "trailing statements should be on next line\n" . $herecurr); 2888*dd88ab32SMasahiro Yamada } 2889*dd88ab32SMasahiro Yamada } 2890*dd88ab32SMasahiro Yamada# if should not continue a brace 2891*dd88ab32SMasahiro Yamada if ($line =~ /}\s*if\b/) { 2892*dd88ab32SMasahiro Yamada ERROR("TRAILING_STATEMENTS", 2893*dd88ab32SMasahiro Yamada "trailing statements should be on next line\n" . 2894*dd88ab32SMasahiro Yamada $herecurr); 2895*dd88ab32SMasahiro Yamada } 2896*dd88ab32SMasahiro Yamada# case and default should not have general statements after them 2897*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g && 2898*dd88ab32SMasahiro Yamada $line !~ /\G(?: 2899*dd88ab32SMasahiro Yamada (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$| 2900*dd88ab32SMasahiro Yamada \s*return\s+ 2901*dd88ab32SMasahiro Yamada )/xg) 2902*dd88ab32SMasahiro Yamada { 2903*dd88ab32SMasahiro Yamada ERROR("TRAILING_STATEMENTS", 2904*dd88ab32SMasahiro Yamada "trailing statements should be on next line\n" . $herecurr); 2905*dd88ab32SMasahiro Yamada } 2906*dd88ab32SMasahiro Yamada 2907*dd88ab32SMasahiro Yamada # Check for }<nl>else {, these must be at the same 2908*dd88ab32SMasahiro Yamada # indent level to be relevant to each other. 2909*dd88ab32SMasahiro Yamada if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and 2910*dd88ab32SMasahiro Yamada $previndent == $indent) { 2911*dd88ab32SMasahiro Yamada ERROR("ELSE_AFTER_BRACE", 2912*dd88ab32SMasahiro Yamada "else should follow close brace '}'\n" . $hereprev); 2913*dd88ab32SMasahiro Yamada } 2914*dd88ab32SMasahiro Yamada 2915*dd88ab32SMasahiro Yamada if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and 2916*dd88ab32SMasahiro Yamada $previndent == $indent) { 2917*dd88ab32SMasahiro Yamada my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); 2918*dd88ab32SMasahiro Yamada 2919*dd88ab32SMasahiro Yamada # Find out what is on the end of the line after the 2920*dd88ab32SMasahiro Yamada # conditional. 2921*dd88ab32SMasahiro Yamada substr($s, 0, length($c), ''); 2922*dd88ab32SMasahiro Yamada $s =~ s/\n.*//g; 2923*dd88ab32SMasahiro Yamada 2924*dd88ab32SMasahiro Yamada if ($s =~ /^\s*;/) { 2925*dd88ab32SMasahiro Yamada ERROR("WHILE_AFTER_BRACE", 2926*dd88ab32SMasahiro Yamada "while should follow close brace '}'\n" . $hereprev); 2927*dd88ab32SMasahiro Yamada } 2928*dd88ab32SMasahiro Yamada } 2929*dd88ab32SMasahiro Yamada 2930*dd88ab32SMasahiro Yamada#CamelCase 2931*dd88ab32SMasahiro Yamada while ($line =~ m{($Constant|$Lval)}g) { 2932*dd88ab32SMasahiro Yamada my $var = $1; 2933*dd88ab32SMasahiro Yamada if ($var !~ /$Constant/ && 2934*dd88ab32SMasahiro Yamada $var =~ /[A-Z]\w*[a-z]|[a-z]\w*[A-Z]/ && 2935*dd88ab32SMasahiro Yamada $var !~ /"^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ && 2936*dd88ab32SMasahiro Yamada !defined $camelcase{$var}) { 2937*dd88ab32SMasahiro Yamada $camelcase{$var} = 1; 2938*dd88ab32SMasahiro Yamada WARN("CAMELCASE", 2939*dd88ab32SMasahiro Yamada "Avoid CamelCase: <$var>\n" . $herecurr); 2940*dd88ab32SMasahiro Yamada } 2941*dd88ab32SMasahiro Yamada } 2942*dd88ab32SMasahiro Yamada 2943*dd88ab32SMasahiro Yamada#no spaces allowed after \ in define 2944*dd88ab32SMasahiro Yamada if ($line=~/\#\s*define.*\\\s$/) { 2945*dd88ab32SMasahiro Yamada WARN("WHITESPACE_AFTER_LINE_CONTINUATION", 2946*dd88ab32SMasahiro Yamada "Whitepspace after \\ makes next lines useless\n" . $herecurr); 2947*dd88ab32SMasahiro Yamada } 2948*dd88ab32SMasahiro Yamada 2949*dd88ab32SMasahiro Yamada#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line) 2950*dd88ab32SMasahiro Yamada if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) { 2951*dd88ab32SMasahiro Yamada my $file = "$1.h"; 2952*dd88ab32SMasahiro Yamada my $checkfile = "include/linux/$file"; 2953*dd88ab32SMasahiro Yamada if (-f "$root/$checkfile" && 2954*dd88ab32SMasahiro Yamada $realfile ne $checkfile && 2955*dd88ab32SMasahiro Yamada $1 !~ /$allowed_asm_includes/) 2956*dd88ab32SMasahiro Yamada { 2957*dd88ab32SMasahiro Yamada if ($realfile =~ m{^arch/}) { 2958*dd88ab32SMasahiro Yamada CHK("ARCH_INCLUDE_LINUX", 2959*dd88ab32SMasahiro Yamada "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr); 2960*dd88ab32SMasahiro Yamada } else { 2961*dd88ab32SMasahiro Yamada WARN("INCLUDE_LINUX", 2962*dd88ab32SMasahiro Yamada "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr); 2963*dd88ab32SMasahiro Yamada } 2964*dd88ab32SMasahiro Yamada } 2965*dd88ab32SMasahiro Yamada } 2966*dd88ab32SMasahiro Yamada 2967*dd88ab32SMasahiro Yamada# multi-statement macros should be enclosed in a do while loop, grab the 2968*dd88ab32SMasahiro Yamada# first statement and ensure its the whole macro if its not enclosed 2969*dd88ab32SMasahiro Yamada# in a known good container 2970*dd88ab32SMasahiro Yamada if ($realfile !~ m@/vmlinux.lds.h$@ && 2971*dd88ab32SMasahiro Yamada $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) { 2972*dd88ab32SMasahiro Yamada my $ln = $linenr; 2973*dd88ab32SMasahiro Yamada my $cnt = $realcnt; 2974*dd88ab32SMasahiro Yamada my ($off, $dstat, $dcond, $rest); 2975*dd88ab32SMasahiro Yamada my $ctx = ''; 2976*dd88ab32SMasahiro Yamada ($dstat, $dcond, $ln, $cnt, $off) = 2977*dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0); 2978*dd88ab32SMasahiro Yamada $ctx = $dstat; 2979*dd88ab32SMasahiro Yamada #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n"; 2980*dd88ab32SMasahiro Yamada #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n"; 2981*dd88ab32SMasahiro Yamada 2982*dd88ab32SMasahiro Yamada $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//; 2983*dd88ab32SMasahiro Yamada $dstat =~ s/$;//g; 2984*dd88ab32SMasahiro Yamada $dstat =~ s/\\\n.//g; 2985*dd88ab32SMasahiro Yamada $dstat =~ s/^\s*//s; 2986*dd88ab32SMasahiro Yamada $dstat =~ s/\s*$//s; 2987*dd88ab32SMasahiro Yamada 2988*dd88ab32SMasahiro Yamada # Flatten any parentheses and braces 2989*dd88ab32SMasahiro Yamada while ($dstat =~ s/\([^\(\)]*\)/1/ || 2990*dd88ab32SMasahiro Yamada $dstat =~ s/\{[^\{\}]*\}/1/ || 2991*dd88ab32SMasahiro Yamada $dstat =~ s/\[[^\[\]]*\]/1/) 2992*dd88ab32SMasahiro Yamada { 2993*dd88ab32SMasahiro Yamada } 2994*dd88ab32SMasahiro Yamada 2995*dd88ab32SMasahiro Yamada # Flatten any obvious string concatentation. 2996*dd88ab32SMasahiro Yamada while ($dstat =~ s/("X*")\s*$Ident/$1/ || 2997*dd88ab32SMasahiro Yamada $dstat =~ s/$Ident\s*("X*")/$1/) 2998*dd88ab32SMasahiro Yamada { 2999*dd88ab32SMasahiro Yamada } 3000*dd88ab32SMasahiro Yamada 3001*dd88ab32SMasahiro Yamada my $exceptions = qr{ 3002*dd88ab32SMasahiro Yamada $Declare| 3003*dd88ab32SMasahiro Yamada module_param_named| 3004*dd88ab32SMasahiro Yamada MODULE_PARM_DESC| 3005*dd88ab32SMasahiro Yamada DECLARE_PER_CPU| 3006*dd88ab32SMasahiro Yamada DEFINE_PER_CPU| 3007*dd88ab32SMasahiro Yamada __typeof__\(| 3008*dd88ab32SMasahiro Yamada union| 3009*dd88ab32SMasahiro Yamada struct| 3010*dd88ab32SMasahiro Yamada \.$Ident\s*=\s*| 3011*dd88ab32SMasahiro Yamada ^\"|\"$ 3012*dd88ab32SMasahiro Yamada }x; 3013*dd88ab32SMasahiro Yamada #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n"; 3014*dd88ab32SMasahiro Yamada if ($dstat ne '' && 3015*dd88ab32SMasahiro Yamada $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(), 3016*dd88ab32SMasahiro Yamada $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo(); 3017*dd88ab32SMasahiro Yamada $dstat !~ /^[!~-]?(?:$Ident|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo 3018*dd88ab32SMasahiro Yamada $dstat !~ /^'X'$/ && # character constants 3019*dd88ab32SMasahiro Yamada $dstat !~ /$exceptions/ && 3020*dd88ab32SMasahiro Yamada $dstat !~ /^\.$Ident\s*=/ && # .foo = 3021*dd88ab32SMasahiro Yamada $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...) 3022*dd88ab32SMasahiro Yamada $dstat !~ /^for\s*$Constant$/ && # for (...) 3023*dd88ab32SMasahiro Yamada $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar() 3024*dd88ab32SMasahiro Yamada $dstat !~ /^do\s*{/ && # do {... 3025*dd88ab32SMasahiro Yamada $dstat !~ /^\({/) # ({... 3026*dd88ab32SMasahiro Yamada { 3027*dd88ab32SMasahiro Yamada $ctx =~ s/\n*$//; 3028*dd88ab32SMasahiro Yamada my $herectx = $here . "\n"; 3029*dd88ab32SMasahiro Yamada my $cnt = statement_rawlines($ctx); 3030*dd88ab32SMasahiro Yamada 3031*dd88ab32SMasahiro Yamada for (my $n = 0; $n < $cnt; $n++) { 3032*dd88ab32SMasahiro Yamada $herectx .= raw_line($linenr, $n) . "\n"; 3033*dd88ab32SMasahiro Yamada } 3034*dd88ab32SMasahiro Yamada 3035*dd88ab32SMasahiro Yamada if ($dstat =~ /;/) { 3036*dd88ab32SMasahiro Yamada ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE", 3037*dd88ab32SMasahiro Yamada "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx"); 3038*dd88ab32SMasahiro Yamada } else { 3039*dd88ab32SMasahiro Yamada ERROR("COMPLEX_MACRO", 3040*dd88ab32SMasahiro Yamada "Macros with complex values should be enclosed in parenthesis\n" . "$herectx"); 3041*dd88ab32SMasahiro Yamada } 3042*dd88ab32SMasahiro Yamada } 3043*dd88ab32SMasahiro Yamada 3044*dd88ab32SMasahiro Yamada# check for line continuations outside of #defines, preprocessor #, and asm 3045*dd88ab32SMasahiro Yamada 3046*dd88ab32SMasahiro Yamada } else { 3047*dd88ab32SMasahiro Yamada if ($prevline !~ /^..*\\$/ && 3048*dd88ab32SMasahiro Yamada $line !~ /^\+\s*\#.*\\$/ && # preprocessor 3049*dd88ab32SMasahiro Yamada $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm 3050*dd88ab32SMasahiro Yamada $line =~ /^\+.*\\$/) { 3051*dd88ab32SMasahiro Yamada WARN("LINE_CONTINUATIONS", 3052*dd88ab32SMasahiro Yamada "Avoid unnecessary line continuations\n" . $herecurr); 3053*dd88ab32SMasahiro Yamada } 3054*dd88ab32SMasahiro Yamada } 3055*dd88ab32SMasahiro Yamada 3056*dd88ab32SMasahiro Yamada# do {} while (0) macro tests: 3057*dd88ab32SMasahiro Yamada# single-statement macros do not need to be enclosed in do while (0) loop, 3058*dd88ab32SMasahiro Yamada# macro should not end with a semicolon 3059*dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 3060*dd88ab32SMasahiro Yamada $realfile !~ m@/vmlinux.lds.h$@ && 3061*dd88ab32SMasahiro Yamada $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) { 3062*dd88ab32SMasahiro Yamada my $ln = $linenr; 3063*dd88ab32SMasahiro Yamada my $cnt = $realcnt; 3064*dd88ab32SMasahiro Yamada my ($off, $dstat, $dcond, $rest); 3065*dd88ab32SMasahiro Yamada my $ctx = ''; 3066*dd88ab32SMasahiro Yamada ($dstat, $dcond, $ln, $cnt, $off) = 3067*dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0); 3068*dd88ab32SMasahiro Yamada $ctx = $dstat; 3069*dd88ab32SMasahiro Yamada 3070*dd88ab32SMasahiro Yamada $dstat =~ s/\\\n.//g; 3071*dd88ab32SMasahiro Yamada 3072*dd88ab32SMasahiro Yamada if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) { 3073*dd88ab32SMasahiro Yamada my $stmts = $2; 3074*dd88ab32SMasahiro Yamada my $semis = $3; 3075*dd88ab32SMasahiro Yamada 3076*dd88ab32SMasahiro Yamada $ctx =~ s/\n*$//; 3077*dd88ab32SMasahiro Yamada my $cnt = statement_rawlines($ctx); 3078*dd88ab32SMasahiro Yamada my $herectx = $here . "\n"; 3079*dd88ab32SMasahiro Yamada 3080*dd88ab32SMasahiro Yamada for (my $n = 0; $n < $cnt; $n++) { 3081*dd88ab32SMasahiro Yamada $herectx .= raw_line($linenr, $n) . "\n"; 3082*dd88ab32SMasahiro Yamada } 3083*dd88ab32SMasahiro Yamada 3084*dd88ab32SMasahiro Yamada if (($stmts =~ tr/;/;/) == 1 && 3085*dd88ab32SMasahiro Yamada $stmts !~ /^\s*(if|while|for|switch)\b/) { 3086*dd88ab32SMasahiro Yamada WARN("SINGLE_STATEMENT_DO_WHILE_MACRO", 3087*dd88ab32SMasahiro Yamada "Single statement macros should not use a do {} while (0) loop\n" . "$herectx"); 3088*dd88ab32SMasahiro Yamada } 3089*dd88ab32SMasahiro Yamada if (defined $semis && $semis ne "") { 3090*dd88ab32SMasahiro Yamada WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON", 3091*dd88ab32SMasahiro Yamada "do {} while (0) macros should not be semicolon terminated\n" . "$herectx"); 3092*dd88ab32SMasahiro Yamada } 3093*dd88ab32SMasahiro Yamada } 3094*dd88ab32SMasahiro Yamada } 3095*dd88ab32SMasahiro Yamada 3096*dd88ab32SMasahiro Yamada# make sure symbols are always wrapped with VMLINUX_SYMBOL() ... 3097*dd88ab32SMasahiro Yamada# all assignments may have only one of the following with an assignment: 3098*dd88ab32SMasahiro Yamada# . 3099*dd88ab32SMasahiro Yamada# ALIGN(...) 3100*dd88ab32SMasahiro Yamada# VMLINUX_SYMBOL(...) 3101*dd88ab32SMasahiro Yamada if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) { 3102*dd88ab32SMasahiro Yamada WARN("MISSING_VMLINUX_SYMBOL", 3103*dd88ab32SMasahiro Yamada "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr); 3104*dd88ab32SMasahiro Yamada } 3105*dd88ab32SMasahiro Yamada 3106*dd88ab32SMasahiro Yamada# check for redundant bracing round if etc 3107*dd88ab32SMasahiro Yamada if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) { 3108*dd88ab32SMasahiro Yamada my ($level, $endln, @chunks) = 3109*dd88ab32SMasahiro Yamada ctx_statement_full($linenr, $realcnt, 1); 3110*dd88ab32SMasahiro Yamada #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n"; 3111*dd88ab32SMasahiro Yamada #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n"; 3112*dd88ab32SMasahiro Yamada if ($#chunks > 0 && $level == 0) { 3113*dd88ab32SMasahiro Yamada my @allowed = (); 3114*dd88ab32SMasahiro Yamada my $allow = 0; 3115*dd88ab32SMasahiro Yamada my $seen = 0; 3116*dd88ab32SMasahiro Yamada my $herectx = $here . "\n"; 3117*dd88ab32SMasahiro Yamada my $ln = $linenr - 1; 3118*dd88ab32SMasahiro Yamada for my $chunk (@chunks) { 3119*dd88ab32SMasahiro Yamada my ($cond, $block) = @{$chunk}; 3120*dd88ab32SMasahiro Yamada 3121*dd88ab32SMasahiro Yamada # If the condition carries leading newlines, then count those as offsets. 3122*dd88ab32SMasahiro Yamada my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s); 3123*dd88ab32SMasahiro Yamada my $offset = statement_rawlines($whitespace) - 1; 3124*dd88ab32SMasahiro Yamada 3125*dd88ab32SMasahiro Yamada $allowed[$allow] = 0; 3126*dd88ab32SMasahiro Yamada #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n"; 3127*dd88ab32SMasahiro Yamada 3128*dd88ab32SMasahiro Yamada # We have looked at and allowed this specific line. 3129*dd88ab32SMasahiro Yamada $suppress_ifbraces{$ln + $offset} = 1; 3130*dd88ab32SMasahiro Yamada 3131*dd88ab32SMasahiro Yamada $herectx .= "$rawlines[$ln + $offset]\n[...]\n"; 3132*dd88ab32SMasahiro Yamada $ln += statement_rawlines($block) - 1; 3133*dd88ab32SMasahiro Yamada 3134*dd88ab32SMasahiro Yamada substr($block, 0, length($cond), ''); 3135*dd88ab32SMasahiro Yamada 3136*dd88ab32SMasahiro Yamada $seen++ if ($block =~ /^\s*{/); 3137*dd88ab32SMasahiro Yamada 3138*dd88ab32SMasahiro Yamada #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n"; 3139*dd88ab32SMasahiro Yamada if (statement_lines($cond) > 1) { 3140*dd88ab32SMasahiro Yamada #print "APW: ALLOWED: cond<$cond>\n"; 3141*dd88ab32SMasahiro Yamada $allowed[$allow] = 1; 3142*dd88ab32SMasahiro Yamada } 3143*dd88ab32SMasahiro Yamada if ($block =~/\b(?:if|for|while)\b/) { 3144*dd88ab32SMasahiro Yamada #print "APW: ALLOWED: block<$block>\n"; 3145*dd88ab32SMasahiro Yamada $allowed[$allow] = 1; 3146*dd88ab32SMasahiro Yamada } 3147*dd88ab32SMasahiro Yamada if (statement_block_size($block) > 1) { 3148*dd88ab32SMasahiro Yamada #print "APW: ALLOWED: lines block<$block>\n"; 3149*dd88ab32SMasahiro Yamada $allowed[$allow] = 1; 3150*dd88ab32SMasahiro Yamada } 3151*dd88ab32SMasahiro Yamada $allow++; 3152*dd88ab32SMasahiro Yamada } 3153*dd88ab32SMasahiro Yamada if ($seen) { 3154*dd88ab32SMasahiro Yamada my $sum_allowed = 0; 3155*dd88ab32SMasahiro Yamada foreach (@allowed) { 3156*dd88ab32SMasahiro Yamada $sum_allowed += $_; 3157*dd88ab32SMasahiro Yamada } 3158*dd88ab32SMasahiro Yamada if ($sum_allowed == 0) { 3159*dd88ab32SMasahiro Yamada WARN("BRACES", 3160*dd88ab32SMasahiro Yamada "braces {} are not necessary for any arm of this statement\n" . $herectx); 3161*dd88ab32SMasahiro Yamada } elsif ($sum_allowed != $allow && 3162*dd88ab32SMasahiro Yamada $seen != $allow) { 3163*dd88ab32SMasahiro Yamada CHK("BRACES", 3164*dd88ab32SMasahiro Yamada "braces {} should be used on all arms of this statement\n" . $herectx); 3165*dd88ab32SMasahiro Yamada } 3166*dd88ab32SMasahiro Yamada } 3167*dd88ab32SMasahiro Yamada } 3168*dd88ab32SMasahiro Yamada } 3169*dd88ab32SMasahiro Yamada if (!defined $suppress_ifbraces{$linenr - 1} && 3170*dd88ab32SMasahiro Yamada $line =~ /\b(if|while|for|else)\b/) { 3171*dd88ab32SMasahiro Yamada my $allowed = 0; 3172*dd88ab32SMasahiro Yamada 3173*dd88ab32SMasahiro Yamada # Check the pre-context. 3174*dd88ab32SMasahiro Yamada if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) { 3175*dd88ab32SMasahiro Yamada #print "APW: ALLOWED: pre<$1>\n"; 3176*dd88ab32SMasahiro Yamada $allowed = 1; 3177*dd88ab32SMasahiro Yamada } 3178*dd88ab32SMasahiro Yamada 3179*dd88ab32SMasahiro Yamada my ($level, $endln, @chunks) = 3180*dd88ab32SMasahiro Yamada ctx_statement_full($linenr, $realcnt, $-[0]); 3181*dd88ab32SMasahiro Yamada 3182*dd88ab32SMasahiro Yamada # Check the condition. 3183*dd88ab32SMasahiro Yamada my ($cond, $block) = @{$chunks[0]}; 3184*dd88ab32SMasahiro Yamada #print "CHECKING<$linenr> cond<$cond> block<$block>\n"; 3185*dd88ab32SMasahiro Yamada if (defined $cond) { 3186*dd88ab32SMasahiro Yamada substr($block, 0, length($cond), ''); 3187*dd88ab32SMasahiro Yamada } 3188*dd88ab32SMasahiro Yamada if (statement_lines($cond) > 1) { 3189*dd88ab32SMasahiro Yamada #print "APW: ALLOWED: cond<$cond>\n"; 3190*dd88ab32SMasahiro Yamada $allowed = 1; 3191*dd88ab32SMasahiro Yamada } 3192*dd88ab32SMasahiro Yamada if ($block =~/\b(?:if|for|while)\b/) { 3193*dd88ab32SMasahiro Yamada #print "APW: ALLOWED: block<$block>\n"; 3194*dd88ab32SMasahiro Yamada $allowed = 1; 3195*dd88ab32SMasahiro Yamada } 3196*dd88ab32SMasahiro Yamada if (statement_block_size($block) > 1) { 3197*dd88ab32SMasahiro Yamada #print "APW: ALLOWED: lines block<$block>\n"; 3198*dd88ab32SMasahiro Yamada $allowed = 1; 3199*dd88ab32SMasahiro Yamada } 3200*dd88ab32SMasahiro Yamada # Check the post-context. 3201*dd88ab32SMasahiro Yamada if (defined $chunks[1]) { 3202*dd88ab32SMasahiro Yamada my ($cond, $block) = @{$chunks[1]}; 3203*dd88ab32SMasahiro Yamada if (defined $cond) { 3204*dd88ab32SMasahiro Yamada substr($block, 0, length($cond), ''); 3205*dd88ab32SMasahiro Yamada } 3206*dd88ab32SMasahiro Yamada if ($block =~ /^\s*\{/) { 3207*dd88ab32SMasahiro Yamada #print "APW: ALLOWED: chunk-1 block<$block>\n"; 3208*dd88ab32SMasahiro Yamada $allowed = 1; 3209*dd88ab32SMasahiro Yamada } 3210*dd88ab32SMasahiro Yamada } 3211*dd88ab32SMasahiro Yamada if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) { 3212*dd88ab32SMasahiro Yamada my $herectx = $here . "\n"; 3213*dd88ab32SMasahiro Yamada my $cnt = statement_rawlines($block); 3214*dd88ab32SMasahiro Yamada 3215*dd88ab32SMasahiro Yamada for (my $n = 0; $n < $cnt; $n++) { 3216*dd88ab32SMasahiro Yamada $herectx .= raw_line($linenr, $n) . "\n"; 3217*dd88ab32SMasahiro Yamada } 3218*dd88ab32SMasahiro Yamada 3219*dd88ab32SMasahiro Yamada WARN("BRACES", 3220*dd88ab32SMasahiro Yamada "braces {} are not necessary for single statement blocks\n" . $herectx); 3221*dd88ab32SMasahiro Yamada } 3222*dd88ab32SMasahiro Yamada } 3223*dd88ab32SMasahiro Yamada 3224*dd88ab32SMasahiro Yamada# check for unnecessary blank lines around braces 3225*dd88ab32SMasahiro Yamada if (($line =~ /^..*}\s*$/ && $prevline =~ /^.\s*$/)) { 3226*dd88ab32SMasahiro Yamada CHK("BRACES", 3227*dd88ab32SMasahiro Yamada "Blank lines aren't necessary before a close brace '}'\n" . $hereprev); 3228*dd88ab32SMasahiro Yamada } 3229*dd88ab32SMasahiro Yamada if (($line =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) { 3230*dd88ab32SMasahiro Yamada CHK("BRACES", 3231*dd88ab32SMasahiro Yamada "Blank lines aren't necessary after an open brace '{'\n" . $hereprev); 3232*dd88ab32SMasahiro Yamada } 3233*dd88ab32SMasahiro Yamada 3234*dd88ab32SMasahiro Yamada# no volatiles please 3235*dd88ab32SMasahiro Yamada my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b}; 3236*dd88ab32SMasahiro Yamada if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) { 3237*dd88ab32SMasahiro Yamada WARN("VOLATILE", 3238*dd88ab32SMasahiro Yamada "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr); 3239*dd88ab32SMasahiro Yamada } 3240*dd88ab32SMasahiro Yamada 3241*dd88ab32SMasahiro Yamada# warn about #if 0 3242*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*\#\s*if\s+0\b/) { 3243*dd88ab32SMasahiro Yamada CHK("REDUNDANT_CODE", 3244*dd88ab32SMasahiro Yamada "if this code is redundant consider removing it\n" . 3245*dd88ab32SMasahiro Yamada $herecurr); 3246*dd88ab32SMasahiro Yamada } 3247*dd88ab32SMasahiro Yamada 3248*dd88ab32SMasahiro Yamada# check for needless "if (<foo>) fn(<foo>)" uses 3249*dd88ab32SMasahiro Yamada if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) { 3250*dd88ab32SMasahiro Yamada my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;'; 3251*dd88ab32SMasahiro Yamada if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) { 3252*dd88ab32SMasahiro Yamada WARN('NEEDLESS_IF', 3253*dd88ab32SMasahiro Yamada "$1(NULL) is safe this check is probably not required\n" . $hereprev); 3254*dd88ab32SMasahiro Yamada } 3255*dd88ab32SMasahiro Yamada } 3256*dd88ab32SMasahiro Yamada 3257*dd88ab32SMasahiro Yamada# prefer usleep_range over udelay 3258*dd88ab32SMasahiro Yamada if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) { 3259*dd88ab32SMasahiro Yamada # ignore udelay's < 10, however 3260*dd88ab32SMasahiro Yamada if (! ($1 < 10) ) { 3261*dd88ab32SMasahiro Yamada CHK("USLEEP_RANGE", 3262*dd88ab32SMasahiro Yamada "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $line); 3263*dd88ab32SMasahiro Yamada } 3264*dd88ab32SMasahiro Yamada } 3265*dd88ab32SMasahiro Yamada 3266*dd88ab32SMasahiro Yamada# warn about unexpectedly long msleep's 3267*dd88ab32SMasahiro Yamada if ($line =~ /\bmsleep\s*\((\d+)\);/) { 3268*dd88ab32SMasahiro Yamada if ($1 < 20) { 3269*dd88ab32SMasahiro Yamada WARN("MSLEEP", 3270*dd88ab32SMasahiro Yamada "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $line); 3271*dd88ab32SMasahiro Yamada } 3272*dd88ab32SMasahiro Yamada } 3273*dd88ab32SMasahiro Yamada 3274*dd88ab32SMasahiro Yamada# warn about #ifdefs in C files 3275*dd88ab32SMasahiro Yamada# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) { 3276*dd88ab32SMasahiro Yamada# print "#ifdef in C files should be avoided\n"; 3277*dd88ab32SMasahiro Yamada# print "$herecurr"; 3278*dd88ab32SMasahiro Yamada# $clean = 0; 3279*dd88ab32SMasahiro Yamada# } 3280*dd88ab32SMasahiro Yamada 3281*dd88ab32SMasahiro Yamada# warn about spacing in #ifdefs 3282*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) { 3283*dd88ab32SMasahiro Yamada ERROR("SPACING", 3284*dd88ab32SMasahiro Yamada "exactly one space required after that #$1\n" . $herecurr); 3285*dd88ab32SMasahiro Yamada } 3286*dd88ab32SMasahiro Yamada 3287*dd88ab32SMasahiro Yamada# check for spinlock_t definitions without a comment. 3288*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ || 3289*dd88ab32SMasahiro Yamada $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) { 3290*dd88ab32SMasahiro Yamada my $which = $1; 3291*dd88ab32SMasahiro Yamada if (!ctx_has_comment($first_line, $linenr)) { 3292*dd88ab32SMasahiro Yamada CHK("UNCOMMENTED_DEFINITION", 3293*dd88ab32SMasahiro Yamada "$1 definition without comment\n" . $herecurr); 3294*dd88ab32SMasahiro Yamada } 3295*dd88ab32SMasahiro Yamada } 3296*dd88ab32SMasahiro Yamada# check for memory barriers without a comment. 3297*dd88ab32SMasahiro Yamada if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) { 3298*dd88ab32SMasahiro Yamada if (!ctx_has_comment($first_line, $linenr)) { 3299*dd88ab32SMasahiro Yamada CHK("MEMORY_BARRIER", 3300*dd88ab32SMasahiro Yamada "memory barrier without comment\n" . $herecurr); 3301*dd88ab32SMasahiro Yamada } 3302*dd88ab32SMasahiro Yamada } 3303*dd88ab32SMasahiro Yamada# check of hardware specific defines 3304*dd88ab32SMasahiro Yamada if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) { 3305*dd88ab32SMasahiro Yamada CHK("ARCH_DEFINES", 3306*dd88ab32SMasahiro Yamada "architecture specific defines should be avoided\n" . $herecurr); 3307*dd88ab32SMasahiro Yamada } 3308*dd88ab32SMasahiro Yamada 3309*dd88ab32SMasahiro Yamada# Check that the storage class is at the beginning of a declaration 3310*dd88ab32SMasahiro Yamada if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) { 3311*dd88ab32SMasahiro Yamada WARN("STORAGE_CLASS", 3312*dd88ab32SMasahiro Yamada "storage class should be at the beginning of the declaration\n" . $herecurr) 3313*dd88ab32SMasahiro Yamada } 3314*dd88ab32SMasahiro Yamada 3315*dd88ab32SMasahiro Yamada# check the location of the inline attribute, that it is between 3316*dd88ab32SMasahiro Yamada# storage class and type. 3317*dd88ab32SMasahiro Yamada if ($line =~ /\b$Type\s+$Inline\b/ || 3318*dd88ab32SMasahiro Yamada $line =~ /\b$Inline\s+$Storage\b/) { 3319*dd88ab32SMasahiro Yamada ERROR("INLINE_LOCATION", 3320*dd88ab32SMasahiro Yamada "inline keyword should sit between storage class and type\n" . $herecurr); 3321*dd88ab32SMasahiro Yamada } 3322*dd88ab32SMasahiro Yamada 3323*dd88ab32SMasahiro Yamada# Check for __inline__ and __inline, prefer inline 3324*dd88ab32SMasahiro Yamada if ($line =~ /\b(__inline__|__inline)\b/) { 3325*dd88ab32SMasahiro Yamada WARN("INLINE", 3326*dd88ab32SMasahiro Yamada "plain inline is preferred over $1\n" . $herecurr); 3327*dd88ab32SMasahiro Yamada } 3328*dd88ab32SMasahiro Yamada 3329*dd88ab32SMasahiro Yamada# Check for __attribute__ packed, prefer __packed 3330*dd88ab32SMasahiro Yamada if ($line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) { 3331*dd88ab32SMasahiro Yamada WARN("PREFER_PACKED", 3332*dd88ab32SMasahiro Yamada "__packed is preferred over __attribute__((packed))\n" . $herecurr); 3333*dd88ab32SMasahiro Yamada } 3334*dd88ab32SMasahiro Yamada 3335*dd88ab32SMasahiro Yamada# Check for __attribute__ aligned, prefer __aligned 3336*dd88ab32SMasahiro Yamada if ($line =~ /\b__attribute__\s*\(\s*\(.*aligned/) { 3337*dd88ab32SMasahiro Yamada WARN("PREFER_ALIGNED", 3338*dd88ab32SMasahiro Yamada "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr); 3339*dd88ab32SMasahiro Yamada } 3340*dd88ab32SMasahiro Yamada 3341*dd88ab32SMasahiro Yamada# Check for __attribute__ format(printf, prefer __printf 3342*dd88ab32SMasahiro Yamada if ($line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) { 3343*dd88ab32SMasahiro Yamada WARN("PREFER_PRINTF", 3344*dd88ab32SMasahiro Yamada "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr); 3345*dd88ab32SMasahiro Yamada } 3346*dd88ab32SMasahiro Yamada 3347*dd88ab32SMasahiro Yamada# Check for __attribute__ format(scanf, prefer __scanf 3348*dd88ab32SMasahiro Yamada if ($line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) { 3349*dd88ab32SMasahiro Yamada WARN("PREFER_SCANF", 3350*dd88ab32SMasahiro Yamada "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr); 3351*dd88ab32SMasahiro Yamada } 3352*dd88ab32SMasahiro Yamada 3353*dd88ab32SMasahiro Yamada# check for sizeof(&) 3354*dd88ab32SMasahiro Yamada if ($line =~ /\bsizeof\s*\(\s*\&/) { 3355*dd88ab32SMasahiro Yamada WARN("SIZEOF_ADDRESS", 3356*dd88ab32SMasahiro Yamada "sizeof(& should be avoided\n" . $herecurr); 3357*dd88ab32SMasahiro Yamada } 3358*dd88ab32SMasahiro Yamada 3359*dd88ab32SMasahiro Yamada# check for sizeof without parenthesis 3360*dd88ab32SMasahiro Yamada if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) { 3361*dd88ab32SMasahiro Yamada WARN("SIZEOF_PARENTHESIS", 3362*dd88ab32SMasahiro Yamada "sizeof $1 should be sizeof($1)\n" . $herecurr); 3363*dd88ab32SMasahiro Yamada } 3364*dd88ab32SMasahiro Yamada 3365*dd88ab32SMasahiro Yamada# check for line continuations in quoted strings with odd counts of " 3366*dd88ab32SMasahiro Yamada if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) { 3367*dd88ab32SMasahiro Yamada WARN("LINE_CONTINUATIONS", 3368*dd88ab32SMasahiro Yamada "Avoid line continuations in quoted strings\n" . $herecurr); 3369*dd88ab32SMasahiro Yamada } 3370*dd88ab32SMasahiro Yamada 3371*dd88ab32SMasahiro Yamada# check for struct spinlock declarations 3372*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) { 3373*dd88ab32SMasahiro Yamada WARN("USE_SPINLOCK_T", 3374*dd88ab32SMasahiro Yamada "struct spinlock should be spinlock_t\n" . $herecurr); 3375*dd88ab32SMasahiro Yamada } 3376*dd88ab32SMasahiro Yamada 3377*dd88ab32SMasahiro Yamada# Check for misused memsets 3378*dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 3379*dd88ab32SMasahiro Yamada defined $stat && 3380*dd88ab32SMasahiro Yamada $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) { 3381*dd88ab32SMasahiro Yamada 3382*dd88ab32SMasahiro Yamada my $ms_addr = $2; 3383*dd88ab32SMasahiro Yamada my $ms_val = $7; 3384*dd88ab32SMasahiro Yamada my $ms_size = $12; 3385*dd88ab32SMasahiro Yamada 3386*dd88ab32SMasahiro Yamada if ($ms_size =~ /^(0x|)0$/i) { 3387*dd88ab32SMasahiro Yamada ERROR("MEMSET", 3388*dd88ab32SMasahiro Yamada "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n"); 3389*dd88ab32SMasahiro Yamada } elsif ($ms_size =~ /^(0x|)1$/i) { 3390*dd88ab32SMasahiro Yamada WARN("MEMSET", 3391*dd88ab32SMasahiro Yamada "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n"); 3392*dd88ab32SMasahiro Yamada } 3393*dd88ab32SMasahiro Yamada } 3394*dd88ab32SMasahiro Yamada 3395*dd88ab32SMasahiro Yamada# typecasts on min/max could be min_t/max_t 3396*dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 3397*dd88ab32SMasahiro Yamada defined $stat && 3398*dd88ab32SMasahiro Yamada $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) { 3399*dd88ab32SMasahiro Yamada if (defined $2 || defined $7) { 3400*dd88ab32SMasahiro Yamada my $call = $1; 3401*dd88ab32SMasahiro Yamada my $cast1 = deparenthesize($2); 3402*dd88ab32SMasahiro Yamada my $arg1 = $3; 3403*dd88ab32SMasahiro Yamada my $cast2 = deparenthesize($7); 3404*dd88ab32SMasahiro Yamada my $arg2 = $8; 3405*dd88ab32SMasahiro Yamada my $cast; 3406*dd88ab32SMasahiro Yamada 3407*dd88ab32SMasahiro Yamada if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) { 3408*dd88ab32SMasahiro Yamada $cast = "$cast1 or $cast2"; 3409*dd88ab32SMasahiro Yamada } elsif ($cast1 ne "") { 3410*dd88ab32SMasahiro Yamada $cast = $cast1; 3411*dd88ab32SMasahiro Yamada } else { 3412*dd88ab32SMasahiro Yamada $cast = $cast2; 3413*dd88ab32SMasahiro Yamada } 3414*dd88ab32SMasahiro Yamada WARN("MINMAX", 3415*dd88ab32SMasahiro Yamada "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n"); 3416*dd88ab32SMasahiro Yamada } 3417*dd88ab32SMasahiro Yamada } 3418*dd88ab32SMasahiro Yamada 3419*dd88ab32SMasahiro Yamada# check usleep_range arguments 3420*dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 3421*dd88ab32SMasahiro Yamada defined $stat && 3422*dd88ab32SMasahiro Yamada $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) { 3423*dd88ab32SMasahiro Yamada my $min = $1; 3424*dd88ab32SMasahiro Yamada my $max = $7; 3425*dd88ab32SMasahiro Yamada if ($min eq $max) { 3426*dd88ab32SMasahiro Yamada WARN("USLEEP_RANGE", 3427*dd88ab32SMasahiro Yamada "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n"); 3428*dd88ab32SMasahiro Yamada } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ && 3429*dd88ab32SMasahiro Yamada $min > $max) { 3430*dd88ab32SMasahiro Yamada WARN("USLEEP_RANGE", 3431*dd88ab32SMasahiro Yamada "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n"); 3432*dd88ab32SMasahiro Yamada } 3433*dd88ab32SMasahiro Yamada } 3434*dd88ab32SMasahiro Yamada 3435*dd88ab32SMasahiro Yamada# check for new externs in .c files. 3436*dd88ab32SMasahiro Yamada if ($realfile =~ /\.c$/ && defined $stat && 3437*dd88ab32SMasahiro Yamada $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s) 3438*dd88ab32SMasahiro Yamada { 3439*dd88ab32SMasahiro Yamada my $function_name = $1; 3440*dd88ab32SMasahiro Yamada my $paren_space = $2; 3441*dd88ab32SMasahiro Yamada 3442*dd88ab32SMasahiro Yamada my $s = $stat; 3443*dd88ab32SMasahiro Yamada if (defined $cond) { 3444*dd88ab32SMasahiro Yamada substr($s, 0, length($cond), ''); 3445*dd88ab32SMasahiro Yamada } 3446*dd88ab32SMasahiro Yamada if ($s =~ /^\s*;/ && 3447*dd88ab32SMasahiro Yamada $function_name ne 'uninitialized_var') 3448*dd88ab32SMasahiro Yamada { 3449*dd88ab32SMasahiro Yamada WARN("AVOID_EXTERNS", 3450*dd88ab32SMasahiro Yamada "externs should be avoided in .c files\n" . $herecurr); 3451*dd88ab32SMasahiro Yamada } 3452*dd88ab32SMasahiro Yamada 3453*dd88ab32SMasahiro Yamada if ($paren_space =~ /\n/) { 3454*dd88ab32SMasahiro Yamada WARN("FUNCTION_ARGUMENTS", 3455*dd88ab32SMasahiro Yamada "arguments for function declarations should follow identifier\n" . $herecurr); 3456*dd88ab32SMasahiro Yamada } 3457*dd88ab32SMasahiro Yamada 3458*dd88ab32SMasahiro Yamada } elsif ($realfile =~ /\.c$/ && defined $stat && 3459*dd88ab32SMasahiro Yamada $stat =~ /^.\s*extern\s+/) 3460*dd88ab32SMasahiro Yamada { 3461*dd88ab32SMasahiro Yamada WARN("AVOID_EXTERNS", 3462*dd88ab32SMasahiro Yamada "externs should be avoided in .c files\n" . $herecurr); 3463*dd88ab32SMasahiro Yamada } 3464*dd88ab32SMasahiro Yamada 3465*dd88ab32SMasahiro Yamada# checks for new __setup's 3466*dd88ab32SMasahiro Yamada if ($rawline =~ /\b__setup\("([^"]*)"/) { 3467*dd88ab32SMasahiro Yamada my $name = $1; 3468*dd88ab32SMasahiro Yamada 3469*dd88ab32SMasahiro Yamada if (!grep(/$name/, @setup_docs)) { 3470*dd88ab32SMasahiro Yamada CHK("UNDOCUMENTED_SETUP", 3471*dd88ab32SMasahiro Yamada "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr); 3472*dd88ab32SMasahiro Yamada } 3473*dd88ab32SMasahiro Yamada } 3474*dd88ab32SMasahiro Yamada 3475*dd88ab32SMasahiro Yamada# check for pointless casting of kmalloc return 3476*dd88ab32SMasahiro Yamada if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) { 3477*dd88ab32SMasahiro Yamada WARN("UNNECESSARY_CASTS", 3478*dd88ab32SMasahiro Yamada "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr); 3479*dd88ab32SMasahiro Yamada } 3480*dd88ab32SMasahiro Yamada 3481*dd88ab32SMasahiro Yamada# check for alloc argument mismatch 3482*dd88ab32SMasahiro Yamada if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) { 3483*dd88ab32SMasahiro Yamada WARN("ALLOC_ARRAY_ARGS", 3484*dd88ab32SMasahiro Yamada "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr); 3485*dd88ab32SMasahiro Yamada } 3486*dd88ab32SMasahiro Yamada 3487*dd88ab32SMasahiro Yamada# check for multiple semicolons 3488*dd88ab32SMasahiro Yamada if ($line =~ /;\s*;\s*$/) { 3489*dd88ab32SMasahiro Yamada WARN("ONE_SEMICOLON", 3490*dd88ab32SMasahiro Yamada "Statements terminations use 1 semicolon\n" . $herecurr); 3491*dd88ab32SMasahiro Yamada } 3492*dd88ab32SMasahiro Yamada 3493*dd88ab32SMasahiro Yamada# check for switch/default statements without a break; 3494*dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 3495*dd88ab32SMasahiro Yamada defined $stat && 3496*dd88ab32SMasahiro Yamada $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) { 3497*dd88ab32SMasahiro Yamada my $ctx = ''; 3498*dd88ab32SMasahiro Yamada my $herectx = $here . "\n"; 3499*dd88ab32SMasahiro Yamada my $cnt = statement_rawlines($stat); 3500*dd88ab32SMasahiro Yamada for (my $n = 0; $n < $cnt; $n++) { 3501*dd88ab32SMasahiro Yamada $herectx .= raw_line($linenr, $n) . "\n"; 3502*dd88ab32SMasahiro Yamada } 3503*dd88ab32SMasahiro Yamada WARN("DEFAULT_NO_BREAK", 3504*dd88ab32SMasahiro Yamada "switch default: should use break\n" . $herectx); 3505*dd88ab32SMasahiro Yamada } 3506*dd88ab32SMasahiro Yamada 3507*dd88ab32SMasahiro Yamada# check for gcc specific __FUNCTION__ 3508*dd88ab32SMasahiro Yamada if ($line =~ /__FUNCTION__/) { 3509*dd88ab32SMasahiro Yamada WARN("USE_FUNC", 3510*dd88ab32SMasahiro Yamada "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr); 3511*dd88ab32SMasahiro Yamada } 3512*dd88ab32SMasahiro Yamada 3513*dd88ab32SMasahiro Yamada# check for use of yield() 3514*dd88ab32SMasahiro Yamada if ($line =~ /\byield\s*\(\s*\)/) { 3515*dd88ab32SMasahiro Yamada WARN("YIELD", 3516*dd88ab32SMasahiro Yamada "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr); 3517*dd88ab32SMasahiro Yamada } 3518*dd88ab32SMasahiro Yamada 3519*dd88ab32SMasahiro Yamada# check for semaphores initialized locked 3520*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) { 3521*dd88ab32SMasahiro Yamada WARN("CONSIDER_COMPLETION", 3522*dd88ab32SMasahiro Yamada "consider using a completion\n" . $herecurr); 3523*dd88ab32SMasahiro Yamada } 3524*dd88ab32SMasahiro Yamada 3525*dd88ab32SMasahiro Yamada# recommend kstrto* over simple_strto* and strict_strto* 3526*dd88ab32SMasahiro Yamada if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) { 3527*dd88ab32SMasahiro Yamada WARN("CONSIDER_KSTRTO", 3528*dd88ab32SMasahiro Yamada "$1 is obsolete, use k$3 instead\n" . $herecurr); 3529*dd88ab32SMasahiro Yamada } 3530*dd88ab32SMasahiro Yamada 3531*dd88ab32SMasahiro Yamada# check for __initcall(), use device_initcall() explicitly please 3532*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*__initcall\s*\(/) { 3533*dd88ab32SMasahiro Yamada WARN("USE_DEVICE_INITCALL", 3534*dd88ab32SMasahiro Yamada "please use device_initcall() instead of __initcall()\n" . $herecurr); 3535*dd88ab32SMasahiro Yamada } 3536*dd88ab32SMasahiro Yamada 3537*dd88ab32SMasahiro Yamada# check for various ops structs, ensure they are const. 3538*dd88ab32SMasahiro Yamada my $struct_ops = qr{acpi_dock_ops| 3539*dd88ab32SMasahiro Yamada address_space_operations| 3540*dd88ab32SMasahiro Yamada backlight_ops| 3541*dd88ab32SMasahiro Yamada block_device_operations| 3542*dd88ab32SMasahiro Yamada dentry_operations| 3543*dd88ab32SMasahiro Yamada dev_pm_ops| 3544*dd88ab32SMasahiro Yamada dma_map_ops| 3545*dd88ab32SMasahiro Yamada extent_io_ops| 3546*dd88ab32SMasahiro Yamada file_lock_operations| 3547*dd88ab32SMasahiro Yamada file_operations| 3548*dd88ab32SMasahiro Yamada hv_ops| 3549*dd88ab32SMasahiro Yamada ide_dma_ops| 3550*dd88ab32SMasahiro Yamada intel_dvo_dev_ops| 3551*dd88ab32SMasahiro Yamada item_operations| 3552*dd88ab32SMasahiro Yamada iwl_ops| 3553*dd88ab32SMasahiro Yamada kgdb_arch| 3554*dd88ab32SMasahiro Yamada kgdb_io| 3555*dd88ab32SMasahiro Yamada kset_uevent_ops| 3556*dd88ab32SMasahiro Yamada lock_manager_operations| 3557*dd88ab32SMasahiro Yamada microcode_ops| 3558*dd88ab32SMasahiro Yamada mtrr_ops| 3559*dd88ab32SMasahiro Yamada neigh_ops| 3560*dd88ab32SMasahiro Yamada nlmsvc_binding| 3561*dd88ab32SMasahiro Yamada pci_raw_ops| 3562*dd88ab32SMasahiro Yamada pipe_buf_operations| 3563*dd88ab32SMasahiro Yamada platform_hibernation_ops| 3564*dd88ab32SMasahiro Yamada platform_suspend_ops| 3565*dd88ab32SMasahiro Yamada proto_ops| 3566*dd88ab32SMasahiro Yamada rpc_pipe_ops| 3567*dd88ab32SMasahiro Yamada seq_operations| 3568*dd88ab32SMasahiro Yamada snd_ac97_build_ops| 3569*dd88ab32SMasahiro Yamada soc_pcmcia_socket_ops| 3570*dd88ab32SMasahiro Yamada stacktrace_ops| 3571*dd88ab32SMasahiro Yamada sysfs_ops| 3572*dd88ab32SMasahiro Yamada tty_operations| 3573*dd88ab32SMasahiro Yamada usb_mon_operations| 3574*dd88ab32SMasahiro Yamada wd_ops}x; 3575*dd88ab32SMasahiro Yamada if ($line !~ /\bconst\b/ && 3576*dd88ab32SMasahiro Yamada $line =~ /\bstruct\s+($struct_ops)\b/) { 3577*dd88ab32SMasahiro Yamada WARN("CONST_STRUCT", 3578*dd88ab32SMasahiro Yamada "struct $1 should normally be const\n" . 3579*dd88ab32SMasahiro Yamada $herecurr); 3580*dd88ab32SMasahiro Yamada } 3581*dd88ab32SMasahiro Yamada 3582*dd88ab32SMasahiro Yamada# use of NR_CPUS is usually wrong 3583*dd88ab32SMasahiro Yamada# ignore definitions of NR_CPUS and usage to define arrays as likely right 3584*dd88ab32SMasahiro Yamada if ($line =~ /\bNR_CPUS\b/ && 3585*dd88ab32SMasahiro Yamada $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ && 3586*dd88ab32SMasahiro Yamada $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ && 3587*dd88ab32SMasahiro Yamada $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ && 3588*dd88ab32SMasahiro Yamada $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ && 3589*dd88ab32SMasahiro Yamada $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/) 3590*dd88ab32SMasahiro Yamada { 3591*dd88ab32SMasahiro Yamada WARN("NR_CPUS", 3592*dd88ab32SMasahiro Yamada "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr); 3593*dd88ab32SMasahiro Yamada } 3594*dd88ab32SMasahiro Yamada 3595*dd88ab32SMasahiro Yamada# check for %L{u,d,i} in strings 3596*dd88ab32SMasahiro Yamada my $string; 3597*dd88ab32SMasahiro Yamada while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) { 3598*dd88ab32SMasahiro Yamada $string = substr($rawline, $-[1], $+[1] - $-[1]); 3599*dd88ab32SMasahiro Yamada $string =~ s/%%/__/g; 3600*dd88ab32SMasahiro Yamada if ($string =~ /(?<!%)%L[udi]/) { 3601*dd88ab32SMasahiro Yamada WARN("PRINTF_L", 3602*dd88ab32SMasahiro Yamada "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr); 3603*dd88ab32SMasahiro Yamada last; 3604*dd88ab32SMasahiro Yamada } 3605*dd88ab32SMasahiro Yamada } 3606*dd88ab32SMasahiro Yamada 3607*dd88ab32SMasahiro Yamada# whine mightly about in_atomic 3608*dd88ab32SMasahiro Yamada if ($line =~ /\bin_atomic\s*\(/) { 3609*dd88ab32SMasahiro Yamada if ($realfile =~ m@^drivers/@) { 3610*dd88ab32SMasahiro Yamada ERROR("IN_ATOMIC", 3611*dd88ab32SMasahiro Yamada "do not use in_atomic in drivers\n" . $herecurr); 3612*dd88ab32SMasahiro Yamada } elsif ($realfile !~ m@^kernel/@) { 3613*dd88ab32SMasahiro Yamada WARN("IN_ATOMIC", 3614*dd88ab32SMasahiro Yamada "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr); 3615*dd88ab32SMasahiro Yamada } 3616*dd88ab32SMasahiro Yamada } 3617*dd88ab32SMasahiro Yamada 3618*dd88ab32SMasahiro Yamada# check for lockdep_set_novalidate_class 3619*dd88ab32SMasahiro Yamada if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ || 3620*dd88ab32SMasahiro Yamada $line =~ /__lockdep_no_validate__\s*\)/ ) { 3621*dd88ab32SMasahiro Yamada if ($realfile !~ m@^kernel/lockdep@ && 3622*dd88ab32SMasahiro Yamada $realfile !~ m@^include/linux/lockdep@ && 3623*dd88ab32SMasahiro Yamada $realfile !~ m@^drivers/base/core@) { 3624*dd88ab32SMasahiro Yamada ERROR("LOCKDEP", 3625*dd88ab32SMasahiro Yamada "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr); 3626*dd88ab32SMasahiro Yamada } 3627*dd88ab32SMasahiro Yamada } 3628*dd88ab32SMasahiro Yamada 3629*dd88ab32SMasahiro Yamada if ($line =~ /debugfs_create_file.*S_IWUGO/ || 3630*dd88ab32SMasahiro Yamada $line =~ /DEVICE_ATTR.*S_IWUGO/ ) { 3631*dd88ab32SMasahiro Yamada WARN("EXPORTED_WORLD_WRITABLE", 3632*dd88ab32SMasahiro Yamada "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr); 3633*dd88ab32SMasahiro Yamada } 3634*dd88ab32SMasahiro Yamada } 3635*dd88ab32SMasahiro Yamada 3636*dd88ab32SMasahiro Yamada # If we have no input at all, then there is nothing to report on 3637*dd88ab32SMasahiro Yamada # so just keep quiet. 3638*dd88ab32SMasahiro Yamada if ($#rawlines == -1) { 3639*dd88ab32SMasahiro Yamada exit(0); 3640*dd88ab32SMasahiro Yamada } 3641*dd88ab32SMasahiro Yamada 3642*dd88ab32SMasahiro Yamada # In mailback mode only produce a report in the negative, for 3643*dd88ab32SMasahiro Yamada # things that appear to be patches. 3644*dd88ab32SMasahiro Yamada if ($mailback && ($clean == 1 || !$is_patch)) { 3645*dd88ab32SMasahiro Yamada exit(0); 3646*dd88ab32SMasahiro Yamada } 3647*dd88ab32SMasahiro Yamada 3648*dd88ab32SMasahiro Yamada # This is not a patch, and we are are in 'no-patch' mode so 3649*dd88ab32SMasahiro Yamada # just keep quiet. 3650*dd88ab32SMasahiro Yamada if (!$chk_patch && !$is_patch) { 3651*dd88ab32SMasahiro Yamada exit(0); 3652*dd88ab32SMasahiro Yamada } 3653*dd88ab32SMasahiro Yamada 3654*dd88ab32SMasahiro Yamada if (!$is_patch) { 3655*dd88ab32SMasahiro Yamada ERROR("NOT_UNIFIED_DIFF", 3656*dd88ab32SMasahiro Yamada "Does not appear to be a unified-diff format patch\n"); 3657*dd88ab32SMasahiro Yamada } 3658*dd88ab32SMasahiro Yamada if ($is_patch && $chk_signoff && $signoff == 0) { 3659*dd88ab32SMasahiro Yamada ERROR("MISSING_SIGN_OFF", 3660*dd88ab32SMasahiro Yamada "Missing Signed-off-by: line(s)\n"); 3661*dd88ab32SMasahiro Yamada } 3662*dd88ab32SMasahiro Yamada 3663*dd88ab32SMasahiro Yamada print report_dump(); 3664*dd88ab32SMasahiro Yamada if ($summary && !($clean == 1 && $quiet == 1)) { 3665*dd88ab32SMasahiro Yamada print "$filename " if ($summary_file); 3666*dd88ab32SMasahiro Yamada print "total: $cnt_error errors, $cnt_warn warnings, " . 3667*dd88ab32SMasahiro Yamada (($check)? "$cnt_chk checks, " : "") . 3668*dd88ab32SMasahiro Yamada "$cnt_lines lines checked\n"; 3669*dd88ab32SMasahiro Yamada print "\n" if ($quiet == 0); 3670*dd88ab32SMasahiro Yamada } 3671*dd88ab32SMasahiro Yamada 3672*dd88ab32SMasahiro Yamada if ($quiet == 0) { 3673*dd88ab32SMasahiro Yamada 3674*dd88ab32SMasahiro Yamada if ($^V lt 5.10.0) { 3675*dd88ab32SMasahiro Yamada print("NOTE: perl $^V is not modern enough to detect all possible issues.\n"); 3676*dd88ab32SMasahiro Yamada print("An upgrade to at least perl v5.10.0 is suggested.\n\n"); 3677*dd88ab32SMasahiro Yamada } 3678*dd88ab32SMasahiro Yamada 3679*dd88ab32SMasahiro Yamada # If there were whitespace errors which cleanpatch can fix 3680*dd88ab32SMasahiro Yamada # then suggest that. 3681*dd88ab32SMasahiro Yamada if ($rpt_cleaners) { 3682*dd88ab32SMasahiro Yamada print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n"; 3683*dd88ab32SMasahiro Yamada print " scripts/cleanfile\n\n"; 3684*dd88ab32SMasahiro Yamada $rpt_cleaners = 0; 3685*dd88ab32SMasahiro Yamada } 3686*dd88ab32SMasahiro Yamada } 3687*dd88ab32SMasahiro Yamada 3688*dd88ab32SMasahiro Yamada if ($quiet == 0 && keys %ignore_type) { 3689*dd88ab32SMasahiro Yamada print "NOTE: Ignored message types:"; 3690*dd88ab32SMasahiro Yamada foreach my $ignore (sort keys %ignore_type) { 3691*dd88ab32SMasahiro Yamada print " $ignore"; 3692*dd88ab32SMasahiro Yamada } 3693*dd88ab32SMasahiro Yamada print "\n\n"; 3694*dd88ab32SMasahiro Yamada } 3695*dd88ab32SMasahiro Yamada 3696*dd88ab32SMasahiro Yamada if ($clean == 1 && $quiet == 0) { 3697*dd88ab32SMasahiro Yamada print "$vname has no obvious style problems and is ready for submission.\n" 3698*dd88ab32SMasahiro Yamada } 3699*dd88ab32SMasahiro Yamada if ($clean == 0 && $quiet == 0) { 3700*dd88ab32SMasahiro Yamada print << "EOM"; 3701*dd88ab32SMasahiro Yamada$vname has style problems, please review. 3702*dd88ab32SMasahiro Yamada 3703*dd88ab32SMasahiro YamadaIf any of these errors are false positives, please report 3704*dd88ab32SMasahiro Yamadathem to the maintainer, see boards.cfg. 3705*dd88ab32SMasahiro YamadaEOM 3706*dd88ab32SMasahiro Yamada } 3707*dd88ab32SMasahiro Yamada 3708*dd88ab32SMasahiro Yamada return $clean; 3709*dd88ab32SMasahiro Yamada} 3710