Blame view

scripts/checkpatch.pl 101 KB
0a920b5b6   Andy Whitcroft   add a trivial pat...
1
  #!/usr/bin/perl -w
dbf004d78   Dave Jones   remove my email a...
2
  # (c) 2001, Dave Jones. (the file handling bit)
00df344fd   Andy Whitcroft   update checkpatch...
3
  # (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
2a5a2c252   Andy Whitcroft   checkpatch: updat...
4
  # (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
015830be9   Andy Whitcroft   checkpatch: updat...
5
  # (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
0a920b5b6   Andy Whitcroft   add a trivial pat...
6
7
8
9
10
  # Licensed under the terms of the GNU GPL License version 2
  
  use strict;
  
  my $P = $0;
00df344fd   Andy Whitcroft   update checkpatch...
11
  $P =~ s@.*/@@g;
0a920b5b6   Andy Whitcroft   add a trivial pat...
12

000d1cc18   Joe Perches   checkpatch.pl: ad...
13
  my $V = '0.32';
0a920b5b6   Andy Whitcroft   add a trivial pat...
14
15
16
17
18
19
20
  
  use Getopt::Long qw(:config no_auto_abbrev);
  
  my $quiet = 0;
  my $tree = 1;
  my $chk_signoff = 1;
  my $chk_patch = 1;
773647a09   Andy Whitcroft   update checkpatch...
21
  my $tst_only;
6c72ffaab   Andy Whitcroft   update checkpatch...
22
  my $emacs = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
23
  my $terse = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
24
25
  my $file = 0;
  my $check = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
26
27
  my $summary = 1;
  my $mailback = 0;
13214adf7   Andy Whitcroft   update checkpatch...
28
  my $summary_file = 0;
000d1cc18   Joe Perches   checkpatch.pl: ad...
29
  my $show_types = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
30
  my $root;
c2fdda0df   Andy Whitcroft   update checkpatch...
31
  my %debug;
000d1cc18   Joe Perches   checkpatch.pl: ad...
32
33
  my %ignore_type = ();
  my @ignore = ();
77f5b10a8   Hannes Eder   checkpatch: make ...
34
  my $help = 0;
000d1cc18   Joe Perches   checkpatch.pl: ad...
35
  my $configuration_file = ".checkpatch.conf";
6cd7f3869   Joe Perches   checkpatch: allow...
36
  my $max_line_length = 80;
77f5b10a8   Hannes Eder   checkpatch: make ...
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  
  sub help {
  	my ($exitcode) = @_;
  
  	print << "EOM";
  Usage: $P [OPTION]... [FILE]...
  Version: $V
  
  Options:
    -q, --quiet                quiet
    --no-tree                  run without a kernel tree
    --no-signoff               do not check for 'Signed-off-by' line
    --patch                    treat FILE as patchfile (default)
    --emacs                    emacs compile window format
    --terse                    one line per report
    -f, --file                 treat FILE as regular source file
    --subjective, --strict     enable more subjective tests
000d1cc18   Joe Perches   checkpatch.pl: ad...
54
    --ignore TYPE(,TYPE2...)   ignore various comma separated message types
6cd7f3869   Joe Perches   checkpatch: allow...
55
    --max-line-length=n        set the maximum line length, if exceeded, warn
000d1cc18   Joe Perches   checkpatch.pl: ad...
56
    --show-types               show the message "types" in the output
77f5b10a8   Hannes Eder   checkpatch: make ...
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
    --root=PATH                PATH to the kernel tree root
    --no-summary               suppress the per-file summary
    --mailback                 only produce a report in case of warnings/errors
    --summary-file             include the filename in summary
    --debug KEY=[0|1]          turn on/off debugging of KEY, where KEY is one of
                               'values', 'possible', 'type', and 'attr' (default
                               is all off)
    --test-only=WORD           report only warnings/errors containing WORD
                               literally
    -h, --help, --version      display this help and exit
  
  When FILE is - read standard input.
  EOM
  
  	exit($exitcode);
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  my $conf = which_conf($configuration_file);
  if (-f $conf) {
  	my @conf_args;
  	open(my $conffile, '<', "$conf")
  	    or warn "$P: Can't find a readable $configuration_file file $!
  ";
  
  	while (<$conffile>) {
  		my $line = $_;
  
  		$line =~ s/\s*
  ?$//g;
  		$line =~ s/^\s*//g;
  		$line =~ s/\s+/ /g;
  
  		next if ($line =~ m/^\s*#/);
  		next if ($line =~ m/^\s*$/);
  
  		my @words = split(" ", $line);
  		foreach my $word (@words) {
  			last if ($word =~ m/^#/);
  			push (@conf_args, $word);
  		}
  	}
  	close($conffile);
  	unshift(@ARGV, @conf_args) if @conf_args;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
100
  GetOptions(
6c72ffaab   Andy Whitcroft   update checkpatch...
101
  	'q|quiet+'	=> \$quiet,
0a920b5b6   Andy Whitcroft   add a trivial pat...
102
103
104
  	'tree!'		=> \$tree,
  	'signoff!'	=> \$chk_signoff,
  	'patch!'	=> \$chk_patch,
6c72ffaab   Andy Whitcroft   update checkpatch...
105
  	'emacs!'	=> \$emacs,
8905a67c6   Andy Whitcroft   update checkpatch...
106
  	'terse!'	=> \$terse,
77f5b10a8   Hannes Eder   checkpatch: make ...
107
  	'f|file!'	=> \$file,
6c72ffaab   Andy Whitcroft   update checkpatch...
108
109
  	'subjective!'	=> \$check,
  	'strict!'	=> \$check,
000d1cc18   Joe Perches   checkpatch.pl: ad...
110
111
  	'ignore=s'	=> \@ignore,
  	'show-types!'	=> \$show_types,
6cd7f3869   Joe Perches   checkpatch: allow...
112
  	'max-line-length=i' => \$max_line_length,
6c72ffaab   Andy Whitcroft   update checkpatch...
113
  	'root=s'	=> \$root,
8905a67c6   Andy Whitcroft   update checkpatch...
114
115
  	'summary!'	=> \$summary,
  	'mailback!'	=> \$mailback,
13214adf7   Andy Whitcroft   update checkpatch...
116
  	'summary-file!'	=> \$summary_file,
c2fdda0df   Andy Whitcroft   update checkpatch...
117
  	'debug=s'	=> \%debug,
773647a09   Andy Whitcroft   update checkpatch...
118
  	'test-only=s'	=> \$tst_only,
77f5b10a8   Hannes Eder   checkpatch: make ...
119
120
121
122
123
  	'h|help'	=> \$help,
  	'version'	=> \$help
  ) or help(1);
  
  help(0) if ($help);
0a920b5b6   Andy Whitcroft   add a trivial pat...
124
125
126
127
  
  my $exit = 0;
  
  if ($#ARGV < 0) {
77f5b10a8   Hannes Eder   checkpatch: make ...
128
129
  	print "$P: no input files
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
130
131
  	exit(1);
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
132
133
134
135
136
137
138
139
140
141
142
143
144
  @ignore = split(/,/, join(',',@ignore));
  foreach my $word (@ignore) {
  	$word =~ s/\s*
  ?$//g;
  	$word =~ s/^\s*//g;
  	$word =~ s/\s+/ /g;
  	$word =~ tr/[a-z]/[A-Z]/;
  
  	next if ($word =~ m/^\s*#/);
  	next if ($word =~ m/^\s*$/);
  
  	$ignore_type{$word}++;
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
145
146
  my $dbg_values = 0;
  my $dbg_possible = 0;
7429c6903   Andy Whitcroft   checkpatch: impro...
147
  my $dbg_type = 0;
a1ef277e2   Andy Whitcroft   checkpatch: add t...
148
  my $dbg_attr = 0;
c2fdda0df   Andy Whitcroft   update checkpatch...
149
  for my $key (keys %debug) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
150
151
152
  	## no critic
  	eval "\${dbg_$key} = '$debug{$key}';";
  	die "$@" if ($@);
c2fdda0df   Andy Whitcroft   update checkpatch...
153
  }
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
154
  my $rpt_cleaners = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
155
156
157
158
  if ($terse) {
  	$emacs = 1;
  	$quiet++;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
  if ($tree) {
  	if (defined $root) {
  		if (!top_of_kernel_tree($root)) {
  			die "$P: $root: --root does not point at a valid tree
  ";
  		}
  	} else {
  		if (top_of_kernel_tree('.')) {
  			$root = '.';
  		} elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
  						top_of_kernel_tree($1)) {
  			$root = $1;
  		}
  	}
  
  	if (!defined $root) {
  		print "Must be run from the top-level dir. of a kernel tree
  ";
  		exit(2);
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
179
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
180
  my $emitted_corrupt = 0;
2ceb532b0   Andy Whitcroft   checkpatch: fix f...
181
182
183
184
  our $Ident	= qr{
  			[A-Za-z_][A-Za-z\d_]*
  			(?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
  		}x;
6c72ffaab   Andy Whitcroft   update checkpatch...
185
186
187
188
189
190
191
192
  our $Storage	= qr{extern|static|asmlinkage};
  our $Sparse	= qr{
  			__user|
  			__kernel|
  			__force|
  			__iomem|
  			__must_check|
  			__init_refok|
417495eda   Andy Whitcroft   checkpatch: add _...
193
  			__kprobes|
165e72a6c   Sven Eckelmann   checkpatch: add _...
194
195
  			__ref|
  			__rcu
6c72ffaab   Andy Whitcroft   update checkpatch...
196
  		}x;
52131292c   Wolfram Sang   checkpatch: fix f...
197
198
199
  
  # Notes to $Attribute:
  # We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
6c72ffaab   Andy Whitcroft   update checkpatch...
200
201
  our $Attribute	= qr{
  			const|
03f1df7da   Joe Perches   checkpatch: Add a...
202
203
204
205
206
207
208
209
210
211
212
213
214
215
  			__percpu|
  			__nocast|
  			__safe|
  			__bitwise__|
  			__packed__|
  			__packed2__|
  			__naked|
  			__maybe_unused|
  			__always_unused|
  			__noreturn|
  			__used|
  			__cold|
  			__noclone|
  			__deprecated|
6c72ffaab   Andy Whitcroft   update checkpatch...
216
217
  			__read_mostly|
  			__kprobes|
52131292c   Wolfram Sang   checkpatch: fix f...
218
  			__(?:mem|cpu|dev|)(?:initdata|initconst|init\b)|
24e1d81ac   Andy Whitcroft   checkpatch: ____c...
219
220
  			____cacheline_aligned|
  			____cacheline_aligned_in_smp|
5fe3af119   Andy Whitcroft   checkpatch: __wea...
221
222
  			____cacheline_internodealigned_in_smp|
  			__weak
6c72ffaab   Andy Whitcroft   update checkpatch...
223
  		  }x;
c45dcabd2   Andy Whitcroft   update checkpatch...
224
  our $Modifier;
6c72ffaab   Andy Whitcroft   update checkpatch...
225
  our $Inline	= qr{inline|__always_inline|noinline};
6c72ffaab   Andy Whitcroft   update checkpatch...
226
227
  our $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
  our $Lval	= qr{$Ident(?:$Member)*};
326b1ffc1   Joe Perches   checkpatch: fix $...
228
229
230
  our $Float_hex	= qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
  our $Float_dec	= qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
  our $Float_int	= qr{(?i)[0-9]+e-?[0-9]+[fl]?};
74349bcce   Joe Perches   checkpatch: add s...
231
  our $Float	= qr{$Float_hex|$Float_dec|$Float_int};
326b1ffc1   Joe Perches   checkpatch: fix $...
232
233
  our $Constant	= qr{$Float|(?i)(?:0x[0-9a-f]+|[0-9]+)[ul]*};
  our $Assignment	= qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
86f9d059c   Andy Whitcroft   checkpatch: allow...
234
  our $Compare    = qr{<=|>=|==|!=|<|>};
6c72ffaab   Andy Whitcroft   update checkpatch...
235
236
237
  our $Operators	= qr{
  			<=|>=|==|!=|
  			=>|->|<<|>>|<|>|!|~|
c2fdda0df   Andy Whitcroft   update checkpatch...
238
  			&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%
6c72ffaab   Andy Whitcroft   update checkpatch...
239
  		  }x;
8905a67c6   Andy Whitcroft   update checkpatch...
240
241
242
  our $NonptrType;
  our $Type;
  our $Declare;
15662b3e8   Joe Perches   checkpatch: add a...
243
244
  our $NON_ASCII_UTF8	= qr{
  	[\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
171ae1a49   Andy Whitcroft   update checkpatch...
245
246
247
248
249
250
251
  	|  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
  	| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
  	|  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
  	|  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
  	| [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
  	|  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  }x;
15662b3e8   Joe Perches   checkpatch: add a...
252
253
254
255
  our $UTF8	= qr{
  	[\x09\x0A\x0D\x20-\x7E]              # ASCII
  	| $NON_ASCII_UTF8
  }x;
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
256
  our $typeTypedefs = qr{(?x:
fb9e9096b   Andy Whitcroft   checkpatch: limit...
257
  	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
258
259
  	atomic_t
  )};
691e669ba   Joe Perches   checkpatch.pl: al...
260
  our $logFunctions = qr{(?x:
6e60c02e9   Joe Perches   checkpatch.pl: up...
261
262
263
  	printk(?:_ratelimited|_once|)|
  	[a-z0-9]+_(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
  	WARN(?:_RATELIMIT|_ONCE|)|
b05317221   Joe Perches   checkpatch: add <...
264
265
  	panic|
  	MODULE_[A-Z_]+
691e669ba   Joe Perches   checkpatch.pl: al...
266
  )};
201124755   Joe Perches   checkpatch: valid...
267
268
269
270
271
272
273
274
275
  our $signature_tags = qr{(?xi:
  	Signed-off-by:|
  	Acked-by:|
  	Tested-by:|
  	Reviewed-by:|
  	Reported-by:|
  	To:|
  	Cc:
  )};
8905a67c6   Andy Whitcroft   update checkpatch...
276
277
  our @typeList = (
  	qr{void},
c45dcabd2   Andy Whitcroft   update checkpatch...
278
279
280
281
282
283
284
  	qr{(?:unsigned\s+)?char},
  	qr{(?:unsigned\s+)?short},
  	qr{(?:unsigned\s+)?int},
  	qr{(?:unsigned\s+)?long},
  	qr{(?:unsigned\s+)?long\s+int},
  	qr{(?:unsigned\s+)?long\s+long},
  	qr{(?:unsigned\s+)?long\s+long\s+int},
8905a67c6   Andy Whitcroft   update checkpatch...
285
286
287
288
  	qr{unsigned},
  	qr{float},
  	qr{double},
  	qr{bool},
8905a67c6   Andy Whitcroft   update checkpatch...
289
290
291
292
293
294
295
  	qr{struct\s+$Ident},
  	qr{union\s+$Ident},
  	qr{enum\s+$Ident},
  	qr{${Ident}_t},
  	qr{${Ident}_handler},
  	qr{${Ident}_handler_fn},
  );
c45dcabd2   Andy Whitcroft   update checkpatch...
296
297
298
  our @modifierList = (
  	qr{fastcall},
  );
8905a67c6   Andy Whitcroft   update checkpatch...
299

7840a94cd   Wolfram Sang   checkpatch: refac...
300
301
302
303
304
  our $allowed_asm_includes = qr{(?x:
  	irq|
  	memory
  )};
  # memory.h: ARM has a custom one
8905a67c6   Andy Whitcroft   update checkpatch...
305
  sub build_types {
d2172eb5b   Andy Whitcroft   checkpatch: possi...
306
307
308
309
310
311
312
313
  	my $mods = "(?x:  
  " . join("|
    ", @modifierList) . "
  )";
  	my $all = "(?x:  
  " . join("|
    ", @typeList) . "
  )";
c8cb2ca37   Andy Whitcroft   checkpatch: types...
314
  	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
8905a67c6   Andy Whitcroft   update checkpatch...
315
  	$NonptrType	= qr{
d2172eb5b   Andy Whitcroft   checkpatch: possi...
316
  			(?:$Modifier\s+|const\s+)*
cf655043d   Andy Whitcroft   update checkpatch...
317
  			(?:
6b48db24e   Andy Whitcroft   checkpatch: typeo...
318
  				(?:typeof|__typeof__)\s*\([^\)]*\)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
319
  				(?:$typeTypedefs\b)|
c45dcabd2   Andy Whitcroft   update checkpatch...
320
  				(?:${all}\b)
cf655043d   Andy Whitcroft   update checkpatch...
321
  			)
c8cb2ca37   Andy Whitcroft   checkpatch: types...
322
  			(?:\s+$Modifier|\s+const)*
8905a67c6   Andy Whitcroft   update checkpatch...
323
324
  		  }x;
  	$Type	= qr{
c45dcabd2   Andy Whitcroft   update checkpatch...
325
  			$NonptrType
b337d8b82   Andy Whitcroft   checkpatch: add [...
326
  			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*|\[\])+|(?:\s*\[\s*\])+)?
c8cb2ca37   Andy Whitcroft   checkpatch: types...
327
  			(?:\s+$Inline|\s+$Modifier)*
8905a67c6   Andy Whitcroft   update checkpatch...
328
329
330
331
  		  }x;
  	$Declare	= qr{(?:$Storage\s+)?$Type};
  }
  build_types();
6c72ffaab   Andy Whitcroft   update checkpatch...
332

7d2367af0   Joe Perches   checkpatch: sugge...
333
334
  
  our $Typecast	= qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
d1fe9c099   Joe Perches   checkpatch: add s...
335
336
337
338
339
340
341
  
  # Using $balanced_parens, $LvalOrFunc, or $FuncArg
  # requires at least perl version v5.10.0
  # Any use must be runtime checked with $^V
  
  our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
  our $LvalOrFunc	= qr{($Lval)\s*($balanced_parens{0,1})\s*};
d7c76ba7e   Joe Perches   checkpatch: impro...
342
  our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};
7d2367af0   Joe Perches   checkpatch: sugge...
343
344
345
346
347
348
349
350
351
  
  sub deparenthesize {
  	my ($string) = @_;
  	return "" if (!defined($string));
  	$string =~ s@^\s*\(\s*@@g;
  	$string =~ s@\s*\)\s*$@@g;
  	$string =~ s@\s+@ @g;
  	return $string;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
352
  $chk_signoff = 0 if ($file);
00df344fd   Andy Whitcroft   update checkpatch...
353
  my @rawlines = ();
c2fdda0df   Andy Whitcroft   update checkpatch...
354
355
  my @lines = ();
  my $vname;
6c72ffaab   Andy Whitcroft   update checkpatch...
356
  for my $filename (@ARGV) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
357
  	my $FILE;
6c72ffaab   Andy Whitcroft   update checkpatch...
358
  	if ($file) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
359
  		open($FILE, '-|', "diff -u /dev/null $filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
360
361
  			die "$P: $filename: diff failed - $!
  ";
21caa13c0   Andy Whitcroft   checkpatch: fix t...
362
363
  	} elsif ($filename eq '-') {
  		open($FILE, '<&STDIN');
6c72ffaab   Andy Whitcroft   update checkpatch...
364
  	} else {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
365
  		open($FILE, '<', "$filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
366
367
  			die "$P: $filename: open failed - $!
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
368
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
369
370
371
372
373
  	if ($filename eq '-') {
  		$vname = 'Your patch';
  	} else {
  		$vname = $filename;
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
374
  	while (<$FILE>) {
6c72ffaab   Andy Whitcroft   update checkpatch...
375
376
377
  		chomp;
  		push(@rawlines, $_);
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
378
  	close($FILE);
c2fdda0df   Andy Whitcroft   update checkpatch...
379
  	if (!process($filename)) {
6c72ffaab   Andy Whitcroft   update checkpatch...
380
381
382
  		$exit = 1;
  	}
  	@rawlines = ();
13214adf7   Andy Whitcroft   update checkpatch...
383
  	@lines = ();
0a920b5b6   Andy Whitcroft   add a trivial pat...
384
385
386
387
388
  }
  
  exit($exit);
  
  sub top_of_kernel_tree {
6c72ffaab   Andy Whitcroft   update checkpatch...
389
390
391
392
393
394
395
396
397
398
399
400
  	my ($root) = @_;
  
  	my @tree_check = (
  		"COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
  		"README", "Documentation", "arch", "include", "drivers",
  		"fs", "init", "ipc", "kernel", "lib", "scripts",
  	);
  
  	foreach my $check (@tree_check) {
  		if (! -e $root . '/' . $check) {
  			return 0;
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
401
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
402
  	return 1;
8f26b8376   Joe Perches   checkpatch: updat...
403
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
404

201124755   Joe Perches   checkpatch: valid...
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
  sub parse_email {
  	my ($formatted_email) = @_;
  
  	my $name = "";
  	my $address = "";
  	my $comment = "";
  
  	if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
  		$name = $1;
  		$address = $2;
  		$comment = $3 if defined $3;
  	} elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
  		$address = $1;
  		$comment = $2 if defined $2;
  	} elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
  		$address = $1;
  		$comment = $2 if defined $2;
  		$formatted_email =~ s/$address.*$//;
  		$name = $formatted_email;
  		$name =~ s/^\s+|\s+$//g;
  		$name =~ s/^\"|\"$//g;
  		# If there's a name left after stripping spaces and
  		# leading quotes, and the address doesn't have both
  		# leading and trailing angle brackets, the address
  		# is invalid. ie:
  		#   "joe smith joe@smith.com" bad
  		#   "joe smith <joe@smith.com" bad
  		if ($name ne "" && $address !~ /^<[^>]+>$/) {
  			$name = "";
  			$address = "";
  			$comment = "";
  		}
  	}
  
  	$name =~ s/^\s+|\s+$//g;
  	$name =~ s/^\"|\"$//g;
  	$address =~ s/^\s+|\s+$//g;
  	$address =~ s/^\<|\>$//g;
  
  	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
  		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
  		$name = "\"$name\"";
  	}
  
  	return ($name, $address, $comment);
  }
  
  sub format_email {
  	my ($name, $address) = @_;
  
  	my $formatted_email;
  
  	$name =~ s/^\s+|\s+$//g;
  	$name =~ s/^\"|\"$//g;
  	$address =~ s/^\s+|\s+$//g;
  
  	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
  		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
  		$name = "\"$name\"";
  	}
  
  	if ("$name" eq "") {
  		$formatted_email = "$address";
  	} else {
  		$formatted_email = "$name <$address>";
  	}
  
  	return $formatted_email;
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
474
475
476
477
478
479
480
481
482
483
484
  sub which_conf {
  	my ($conf) = @_;
  
  	foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
  		if (-e "$path/$conf") {
  			return "$path/$conf";
  		}
  	}
  
  	return "";
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
  sub expand_tabs {
  	my ($str) = @_;
  
  	my $res = '';
  	my $n = 0;
  	for my $c (split(//, $str)) {
  		if ($c eq "\t") {
  			$res .= ' ';
  			$n++;
  			for (; ($n % 8) != 0; $n++) {
  				$res .= ' ';
  			}
  			next;
  		}
  		$res .= $c;
  		$n++;
  	}
  
  	return $res;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
505
  sub copy_spacing {
773647a09   Andy Whitcroft   update checkpatch...
506
  	(my $res = shift) =~ tr/\t/ /c;
6c72ffaab   Andy Whitcroft   update checkpatch...
507
508
  	return $res;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
509

4a0df2ef4   Andy Whitcroft   update checkpatch...
510
511
512
513
514
515
516
517
518
519
520
521
  sub line_stats {
  	my ($line) = @_;
  
  	# Drop the diff line leader and expand tabs
  	$line =~ s/^.//;
  	$line = expand_tabs($line);
  
  	# Pick the indent from the front of the line.
  	my ($white) = ($line =~ /^(\s*)/);
  
  	return (length($line), length($white));
  }
773647a09   Andy Whitcroft   update checkpatch...
522
523
524
525
526
527
528
529
530
531
532
  my $sanitise_quote = '';
  
  sub sanitise_line_reset {
  	my ($in_comment) = @_;
  
  	if ($in_comment) {
  		$sanitise_quote = '*/';
  	} else {
  		$sanitise_quote = '';
  	}
  }
00df344fd   Andy Whitcroft   update checkpatch...
533
534
535
536
537
  sub sanitise_line {
  	my ($line) = @_;
  
  	my $res = '';
  	my $l = '';
c2fdda0df   Andy Whitcroft   update checkpatch...
538
  	my $qlen = 0;
773647a09   Andy Whitcroft   update checkpatch...
539
540
  	my $off = 0;
  	my $c;
00df344fd   Andy Whitcroft   update checkpatch...
541

773647a09   Andy Whitcroft   update checkpatch...
542
543
544
545
546
547
548
549
550
551
552
553
554
555
  	# Always copy over the diff marker.
  	$res = substr($line, 0, 1);
  
  	for ($off = 1; $off < length($line); $off++) {
  		$c = substr($line, $off, 1);
  
  		# Comments we are wacking completly including the begin
  		# and end, all to $;.
  		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
  			$sanitise_quote = '*/';
  
  			substr($res, $off, 2, "$;$;");
  			$off++;
  			next;
00df344fd   Andy Whitcroft   update checkpatch...
556
  		}
81bc0e020   Andy Whitcroft   checkpatch: handl...
557
  		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
773647a09   Andy Whitcroft   update checkpatch...
558
559
560
561
  			$sanitise_quote = '';
  			substr($res, $off, 2, "$;$;");
  			$off++;
  			next;
c2fdda0df   Andy Whitcroft   update checkpatch...
562
  		}
113f04a83   Daniel Walker   checkpatch: handl...
563
564
565
566
567
568
569
  		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
  			$sanitise_quote = '//';
  
  			substr($res, $off, 2, $sanitise_quote);
  			$off++;
  			next;
  		}
773647a09   Andy Whitcroft   update checkpatch...
570
571
572
573
574
575
576
  
  		# A \ in a string means ignore the next character.
  		if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
  		    $c eq "\\") {
  			substr($res, $off, 2, 'XX');
  			$off++;
  			next;
00df344fd   Andy Whitcroft   update checkpatch...
577
  		}
773647a09   Andy Whitcroft   update checkpatch...
578
579
580
581
  		# Regular quotes.
  		if ($c eq "'" || $c eq '"') {
  			if ($sanitise_quote eq '') {
  				$sanitise_quote = $c;
00df344fd   Andy Whitcroft   update checkpatch...
582

773647a09   Andy Whitcroft   update checkpatch...
583
584
585
586
587
588
  				substr($res, $off, 1, $c);
  				next;
  			} elsif ($sanitise_quote eq $c) {
  				$sanitise_quote = '';
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
589

fae17daed   Andy Whitcroft   checkpatch: comme...
590
591
  		#print "c<$c> SQ<$sanitise_quote>
  ";
773647a09   Andy Whitcroft   update checkpatch...
592
593
  		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
  			substr($res, $off, 1, $;);
113f04a83   Daniel Walker   checkpatch: handl...
594
595
  		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
  			substr($res, $off, 1, $;);
773647a09   Andy Whitcroft   update checkpatch...
596
597
598
599
600
  		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
  			substr($res, $off, 1, 'X');
  		} else {
  			substr($res, $off, 1, $c);
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
601
  	}
113f04a83   Daniel Walker   checkpatch: handl...
602
603
604
  	if ($sanitise_quote eq '//') {
  		$sanitise_quote = '';
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
605
  	# The pathname on a #include may be surrounded by '<' and '>'.
c45dcabd2   Andy Whitcroft   update checkpatch...
606
  	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
607
608
609
610
  		my $clean = 'X' x length($1);
  		$res =~ s@\<.*\>@<$clean>@;
  
  	# The whole of a #error is a string.
c45dcabd2   Andy Whitcroft   update checkpatch...
611
  	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
612
  		my $clean = 'X' x length($1);
c45dcabd2   Andy Whitcroft   update checkpatch...
613
  		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
c2fdda0df   Andy Whitcroft   update checkpatch...
614
  	}
00df344fd   Andy Whitcroft   update checkpatch...
615
616
  	return $res;
  }
8905a67c6   Andy Whitcroft   update checkpatch...
617
618
619
620
621
622
  sub ctx_statement_block {
  	my ($linenr, $remain, $off) = @_;
  	my $line = $linenr - 1;
  	my $blk = '';
  	my $soff = $off;
  	my $coff = $off - 1;
773647a09   Andy Whitcroft   update checkpatch...
623
  	my $coff_set = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
624

13214adf7   Andy Whitcroft   update checkpatch...
625
  	my $loff = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
626
627
  	my $type = '';
  	my $level = 0;
a27506459   Andy Whitcroft   checkpatch: handl...
628
  	my @stack = ();
cf655043d   Andy Whitcroft   update checkpatch...
629
  	my $p;
8905a67c6   Andy Whitcroft   update checkpatch...
630
631
  	my $c;
  	my $len = 0;
13214adf7   Andy Whitcroft   update checkpatch...
632
633
  
  	my $remainder;
8905a67c6   Andy Whitcroft   update checkpatch...
634
  	while (1) {
a27506459   Andy Whitcroft   checkpatch: handl...
635
  		@stack = (['', 0]) if ($#stack == -1);
773647a09   Andy Whitcroft   update checkpatch...
636
637
  		#warn "CSB: blk<$blk> remain<$remain>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
638
639
640
641
  		# If we are about to drop off the end, pull in more
  		# context.
  		if ($off >= $len) {
  			for (; $remain > 0; $line++) {
dea33496d   Andy Whitcroft   checkpatch: suppr...
642
  				last if (!defined $lines[$line]);
c2fdda0df   Andy Whitcroft   update checkpatch...
643
  				next if ($lines[$line] =~ /^-/);
8905a67c6   Andy Whitcroft   update checkpatch...
644
  				$remain--;
13214adf7   Andy Whitcroft   update checkpatch...
645
  				$loff = $len;
c2fdda0df   Andy Whitcroft   update checkpatch...
646
647
  				$blk .= $lines[$line] . "
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
648
649
650
651
652
653
654
  				$len = length($blk);
  				$line++;
  				last;
  			}
  			# Bail if there is no further context.
  			#warn "CSB: blk<$blk> off<$off> len<$len>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
655
  			if ($off >= $len) {
8905a67c6   Andy Whitcroft   update checkpatch...
656
657
  				last;
  			}
f74bd1942   Andy Whitcroft   checkpatch: corre...
658
659
660
661
  			if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
  				$level++;
  				$type = '#';
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
662
  		}
cf655043d   Andy Whitcroft   update checkpatch...
663
  		$p = $c;
8905a67c6   Andy Whitcroft   update checkpatch...
664
  		$c = substr($blk, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
665
  		$remainder = substr($blk, $off);
8905a67c6   Andy Whitcroft   update checkpatch...
666

773647a09   Andy Whitcroft   update checkpatch...
667
668
  		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>
  ";
4635f4fba   Andy Whitcroft   checkpatch: track...
669
670
671
672
673
674
675
676
677
  
  		# Handle nested #if/#else.
  		if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
  			push(@stack, [ $type, $level ]);
  		} elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
  			($type, $level) = @{$stack[$#stack - 1]};
  		} elsif ($remainder =~ /^#\s*endif\b/) {
  			($type, $level) = @{pop(@stack)};
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
678
679
680
681
682
  		# Statement ends at the ';' or a close '}' at the
  		# outermost level.
  		if ($level == 0 && $c eq ';') {
  			last;
  		}
13214adf7   Andy Whitcroft   update checkpatch...
683
  		# An else is really a conditional as long as its not else if
773647a09   Andy Whitcroft   update checkpatch...
684
685
686
687
688
689
690
691
692
693
  		if ($level == 0 && $coff_set == 0 &&
  				(!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
  				$remainder =~ /^(else)(?:\s|{)/ &&
  				$remainder !~ /^else\s+if\b/) {
  			$coff = $off + length($1) - 1;
  			$coff_set = 1;
  			#warn "CSB: mark coff<$coff> soff<$soff> 1<$1>
  ";
  			#warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]
  ";
13214adf7   Andy Whitcroft   update checkpatch...
694
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
695
696
697
698
699
700
701
702
703
704
  		if (($type eq '' || $type eq '(') && $c eq '(') {
  			$level++;
  			$type = '(';
  		}
  		if ($type eq '(' && $c eq ')') {
  			$level--;
  			$type = ($level != 0)? '(' : '';
  
  			if ($level == 0 && $coff < $soff) {
  				$coff = $off;
773647a09   Andy Whitcroft   update checkpatch...
705
706
707
  				$coff_set = 1;
  				#warn "CSB: mark coff<$coff>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
708
709
710
711
712
713
714
715
716
717
718
  			}
  		}
  		if (($type eq '' || $type eq '{') && $c eq '{') {
  			$level++;
  			$type = '{';
  		}
  		if ($type eq '{' && $c eq '}') {
  			$level--;
  			$type = ($level != 0)? '{' : '';
  
  			if ($level == 0) {
b998e001e   Patrick Pannuto   checkpatch: fix e...
719
720
721
  				if (substr($blk, $off + 1, 1) eq ';') {
  					$off++;
  				}
8905a67c6   Andy Whitcroft   update checkpatch...
722
723
724
  				last;
  			}
  		}
f74bd1942   Andy Whitcroft   checkpatch: corre...
725
726
727
728
729
730
731
732
  		# Preprocessor commands end at the newline unless escaped.
  		if ($type eq '#' && $c eq "
  " && $p ne "\\") {
  			$level--;
  			$type = '';
  			$off++;
  			last;
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
733
734
  		$off++;
  	}
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
735
  	# We are truly at the end, so shuffle to the next line.
13214adf7   Andy Whitcroft   update checkpatch...
736
  	if ($off == $len) {
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
737
  		$loff = $len + 1;
13214adf7   Andy Whitcroft   update checkpatch...
738
739
740
  		$line++;
  		$remain--;
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
741
742
743
744
745
746
747
748
  
  	my $statement = substr($blk, $soff, $off - $soff + 1);
  	my $condition = substr($blk, $soff, $coff - $soff + 1);
  
  	#warn "STATEMENT<$statement>
  ";
  	#warn "CONDITION<$condition>
  ";
773647a09   Andy Whitcroft   update checkpatch...
749
750
  	#print "coff<$coff> soff<$off> loff<$loff>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
751
752
753
754
  
  	return ($statement, $condition,
  			$line, $remain + 1, $off - $loff + 1, $level);
  }
cf655043d   Andy Whitcroft   update checkpatch...
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
  sub statement_lines {
  	my ($stmt) = @_;
  
  	# Strip the diff line prefixes and rip blank lines at start and end.
  	$stmt =~ s/(^|
  )./$1/g;
  	$stmt =~ s/^\s*//;
  	$stmt =~ s/\s*$//;
  
  	my @stmt_lines = ($stmt =~ /
  /g);
  
  	return $#stmt_lines + 2;
  }
  
  sub statement_rawlines {
  	my ($stmt) = @_;
  
  	my @stmt_lines = ($stmt =~ /
  /g);
  
  	return $#stmt_lines + 2;
  }
  
  sub statement_block_size {
  	my ($stmt) = @_;
  
  	$stmt =~ s/(^|
  )./$1/g;
  	$stmt =~ s/^\s*{//;
  	$stmt =~ s/}\s*$//;
  	$stmt =~ s/^\s*//;
  	$stmt =~ s/\s*$//;
  
  	my @stmt_lines = ($stmt =~ /
  /g);
  	my @stmt_statements = ($stmt =~ /;/g);
  
  	my $stmt_lines = $#stmt_lines + 2;
  	my $stmt_statements = $#stmt_statements + 1;
  
  	if ($stmt_lines > $stmt_statements) {
  		return $stmt_lines;
  	} else {
  		return $stmt_statements;
  	}
  }
13214adf7   Andy Whitcroft   update checkpatch...
802
803
804
805
806
  sub ctx_statement_full {
  	my ($linenr, $remain, $off) = @_;
  	my ($statement, $condition, $level);
  
  	my (@chunks);
cf655043d   Andy Whitcroft   update checkpatch...
807
  	# Grab the first conditional/block pair.
13214adf7   Andy Whitcroft   update checkpatch...
808
809
  	($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
773647a09   Andy Whitcroft   update checkpatch...
810
811
  	#print "F: c<$condition> s<$statement> remain<$remain>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
812
813
814
815
816
817
818
819
  	push(@chunks, [ $condition, $statement ]);
  	if (!($remain > 0 && $condition =~ /^\s*(?:
  [+-])?\s*(?:if|else|do)\b/s)) {
  		return ($level, $linenr, @chunks);
  	}
  
  	# Pull in the following conditional/block pairs and see if they
  	# could continue the statement.
13214adf7   Andy Whitcroft   update checkpatch...
820
  	for (;;) {
13214adf7   Andy Whitcroft   update checkpatch...
821
822
  		($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
cf655043d   Andy Whitcroft   update checkpatch...
823
824
  		#print "C: c<$condition> s<$statement> remain<$remain>
  ";
773647a09   Andy Whitcroft   update checkpatch...
825
826
  		last if (!($remain > 0 && $condition =~ /^(?:\s*
  [+-])*\s*(?:else|do)\b/s));
cf655043d   Andy Whitcroft   update checkpatch...
827
828
829
  		#print "C: push
  ";
  		push(@chunks, [ $condition, $statement ]);
13214adf7   Andy Whitcroft   update checkpatch...
830
831
832
  	}
  
  	return ($level, $linenr, @chunks);
8905a67c6   Andy Whitcroft   update checkpatch...
833
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
834
  sub ctx_block_get {
f0a594c1c   Andy Whitcroft   update checkpatch...
835
  	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
4a0df2ef4   Andy Whitcroft   update checkpatch...
836
837
  	my $line;
  	my $start = $linenr - 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
838
839
840
841
  	my $blk = '';
  	my @o;
  	my @c;
  	my @res = ();
f0a594c1c   Andy Whitcroft   update checkpatch...
842
  	my $level = 0;
4635f4fba   Andy Whitcroft   checkpatch: track...
843
  	my @stack = ($level);
00df344fd   Andy Whitcroft   update checkpatch...
844
845
846
847
848
  	for ($line = $start; $remain > 0; $line++) {
  		next if ($rawlines[$line] =~ /^-/);
  		$remain--;
  
  		$blk .= $rawlines[$line];
4635f4fba   Andy Whitcroft   checkpatch: track...
849
850
  
  		# Handle nested #if/#else.
01464f30a   Andy Whitcroft   checkpatch: state...
851
  		if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
852
  			push(@stack, $level);
01464f30a   Andy Whitcroft   checkpatch: state...
853
  		} elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
854
  			$level = $stack[$#stack - 1];
01464f30a   Andy Whitcroft   checkpatch: state...
855
  		} elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
856
857
  			$level = pop(@stack);
  		}
01464f30a   Andy Whitcroft   checkpatch: state...
858
  		foreach my $c (split(//, $lines[$line])) {
f0a594c1c   Andy Whitcroft   update checkpatch...
859
860
861
862
863
864
  			##print "C<$c>L<$level><$open$close>O<$off>
  ";
  			if ($off > 0) {
  				$off--;
  				next;
  			}
4a0df2ef4   Andy Whitcroft   update checkpatch...
865

f0a594c1c   Andy Whitcroft   update checkpatch...
866
867
868
869
870
871
872
  			if ($c eq $close && $level > 0) {
  				$level--;
  				last if ($level == 0);
  			} elsif ($c eq $open) {
  				$level++;
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
873

f0a594c1c   Andy Whitcroft   update checkpatch...
874
  		if (!$outer || $level <= 1) {
00df344fd   Andy Whitcroft   update checkpatch...
875
  			push(@res, $rawlines[$line]);
4a0df2ef4   Andy Whitcroft   update checkpatch...
876
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
877
  		last if ($level == 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
878
  	}
f0a594c1c   Andy Whitcroft   update checkpatch...
879
  	return ($level, @res);
4a0df2ef4   Andy Whitcroft   update checkpatch...
880
881
882
  }
  sub ctx_block_outer {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
883
884
  	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
  	return @r;
4a0df2ef4   Andy Whitcroft   update checkpatch...
885
886
887
  }
  sub ctx_block {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
888
889
  	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
  	return @r;
653d4876b   Andy Whitcroft   update checkpatch...
890
891
  }
  sub ctx_statement {
f0a594c1c   Andy Whitcroft   update checkpatch...
892
893
894
895
896
897
  	my ($linenr, $remain, $off) = @_;
  
  	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
  	return @r;
  }
  sub ctx_block_level {
653d4876b   Andy Whitcroft   update checkpatch...
898
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
899
  	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
900
  }
9c0ca6f9a   Andy Whitcroft   update checkpatch...
901
902
903
904
905
  sub ctx_statement_level {
  	my ($linenr, $remain, $off) = @_;
  
  	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
906
907
908
909
910
  
  sub ctx_locate_comment {
  	my ($first_line, $end_line) = @_;
  
  	# Catch a comment on the end of the line itself.
beae63324   Andy Whitcroft   checkpatch: comme...
911
  	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
4a0df2ef4   Andy Whitcroft   update checkpatch...
912
913
914
915
916
917
918
  	return $current_comment if (defined $current_comment);
  
  	# Look through the context and try and figure out if there is a
  	# comment.
  	my $in_comment = 0;
  	$current_comment = '';
  	for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
00df344fd   Andy Whitcroft   update checkpatch...
919
920
921
  		my $line = $rawlines[$linenr - 1];
  		#warn "           $line
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
  		if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
  			$in_comment = 1;
  		}
  		if ($line =~ m@/\*@) {
  			$in_comment = 1;
  		}
  		if (!$in_comment && $current_comment ne '') {
  			$current_comment = '';
  		}
  		$current_comment .= $line . "
  " if ($in_comment);
  		if ($line =~ m@\*/@) {
  			$in_comment = 0;
  		}
  	}
  
  	chomp($current_comment);
  	return($current_comment);
  }
  sub ctx_has_comment {
  	my ($first_line, $end_line) = @_;
  	my $cmt = ctx_locate_comment($first_line, $end_line);
00df344fd   Andy Whitcroft   update checkpatch...
944
945
  	##print "LINE: $rawlines[$end_line - 1 ]
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
946
947
948
949
950
  	##print "CMMT: $cmt
  ";
  
  	return ($cmt ne '');
  }
4d001e4d8   Andy Whitcroft   checkpatch: repor...
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
  sub raw_line {
  	my ($linenr, $cnt) = @_;
  
  	my $offset = $linenr - 1;
  	$cnt++;
  
  	my $line;
  	while ($cnt) {
  		$line = $rawlines[$offset++];
  		next if (defined($line) && $line =~ /^-/);
  		$cnt--;
  	}
  
  	return $line;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
966
967
968
  sub cat_vet {
  	my ($vet) = @_;
  	my ($res, $coded);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
969

6c72ffaab   Andy Whitcroft   update checkpatch...
970
971
972
973
974
975
  	$res = '';
  	while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
  		$res .= $1;
  		if ($2 ne '') {
  			$coded = sprintf("^%c", unpack('C', $2) + 64);
  			$res .= $coded;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
976
977
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
978
  	$res =~ s/$/\$/;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
979

6c72ffaab   Andy Whitcroft   update checkpatch...
980
  	return $res;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
981
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
982
  my $av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
983
  my $av_pending;
c2fdda0df   Andy Whitcroft   update checkpatch...
984
  my @av_paren_type;
1f65f947a   Andy Whitcroft   checkpatch: add c...
985
  my $av_pend_colon;
c2fdda0df   Andy Whitcroft   update checkpatch...
986
987
988
  
  sub annotate_reset {
  	$av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
989
990
  	$av_pending = '_';
  	@av_paren_type = ('E');
1f65f947a   Andy Whitcroft   checkpatch: add c...
991
  	$av_pend_colon = 'O';
c2fdda0df   Andy Whitcroft   update checkpatch...
992
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
993
994
  sub annotate_values {
  	my ($stream, $type) = @_;
0a920b5b6   Andy Whitcroft   add a trivial pat...
995

6c72ffaab   Andy Whitcroft   update checkpatch...
996
  	my $res;
1f65f947a   Andy Whitcroft   checkpatch: add c...
997
  	my $var = '_' x length($stream);
6c72ffaab   Andy Whitcroft   update checkpatch...
998
  	my $cur = $stream;
c2fdda0df   Andy Whitcroft   update checkpatch...
999
1000
  	print "$stream
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1001

6c72ffaab   Andy Whitcroft   update checkpatch...
1002
  	while (length($cur)) {
773647a09   Andy Whitcroft   update checkpatch...
1003
  		@av_paren_type = ('E') if ($#av_paren_type < 0);
cf655043d   Andy Whitcroft   update checkpatch...
1004
  		print " <" . join('', @av_paren_type) .
171ae1a49   Andy Whitcroft   update checkpatch...
1005
  				"> <$type> <$av_pending>" if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1006
  		if ($cur =~ /^(\s+)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1007
1008
1009
1010
  			print "WS($1)
  " if ($dbg_values > 1);
  			if ($1 =~ /
  / && $av_preprocessor) {
cf655043d   Andy Whitcroft   update checkpatch...
1011
  				$type = pop(@av_paren_type);
c2fdda0df   Andy Whitcroft   update checkpatch...
1012
  				$av_preprocessor = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
1013
  			}
c023e4734   Florian Mickler   checkpatch.pl: fi...
1014
  		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
9446ef569   Andy Whitcroft   checkpatch: handl...
1015
1016
1017
  			print "CAST($1)
  " if ($dbg_values > 1);
  			push(@av_paren_type, $type);
addcdcea9   Andy Whitcroft   checkpatch: ensur...
1018
  			$type = 'c';
9446ef569   Andy Whitcroft   checkpatch: handl...
1019

e91b6e263   Andy Whitcroft   checkpatch: types...
1020
  		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1021
1022
  			print "DECLARE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1023
  			$type = 'T';
389a2fe57   Andy Whitcroft   checkpatch: allow...
1024
1025
1026
1027
  		} elsif ($cur =~ /^($Modifier)\s*/) {
  			print "MODIFIER($1)
  " if ($dbg_values > 1);
  			$type = 'T';
c45dcabd2   Andy Whitcroft   update checkpatch...
1028
  		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1029
1030
  			print "DEFINE($1,$2)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1031
  			$av_preprocessor = 1;
171ae1a49   Andy Whitcroft   update checkpatch...
1032
1033
1034
1035
1036
  			push(@av_paren_type, $type);
  			if ($2 ne '') {
  				$av_pending = 'N';
  			}
  			$type = 'E';
c45dcabd2   Andy Whitcroft   update checkpatch...
1037
  		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1038
1039
1040
1041
  			print "UNDEF($1)
  " if ($dbg_values > 1);
  			$av_preprocessor = 1;
  			push(@av_paren_type, $type);
6c72ffaab   Andy Whitcroft   update checkpatch...
1042

c45dcabd2   Andy Whitcroft   update checkpatch...
1043
  		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1044
1045
  			print "PRE_START($1)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1046
  			$av_preprocessor = 1;
cf655043d   Andy Whitcroft   update checkpatch...
1047
1048
1049
  
  			push(@av_paren_type, $type);
  			push(@av_paren_type, $type);
171ae1a49   Andy Whitcroft   update checkpatch...
1050
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1051

c45dcabd2   Andy Whitcroft   update checkpatch...
1052
  		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1053
1054
1055
1056
1057
  			print "PRE_RESTART($1)
  " if ($dbg_values > 1);
  			$av_preprocessor = 1;
  
  			push(@av_paren_type, $av_paren_type[$#av_paren_type]);
171ae1a49   Andy Whitcroft   update checkpatch...
1058
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1059

c45dcabd2   Andy Whitcroft   update checkpatch...
1060
  		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1061
1062
1063
1064
1065
1066
1067
1068
1069
  			print "PRE_END($1)
  " if ($dbg_values > 1);
  
  			$av_preprocessor = 1;
  
  			# Assume all arms of the conditional end as this
  			# one does, and continue as if the #endif was not here.
  			pop(@av_paren_type);
  			push(@av_paren_type, $type);
171ae1a49   Andy Whitcroft   update checkpatch...
1070
  			$type = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1071
1072
1073
  
  		} elsif ($cur =~ /^(\\
  )/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1074
1075
  			print "PRECONT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1076

171ae1a49   Andy Whitcroft   update checkpatch...
1077
1078
1079
1080
1081
  		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
  			print "ATTR($1)
  " if ($dbg_values > 1);
  			$av_pending = $type;
  			$type = 'N';
6c72ffaab   Andy Whitcroft   update checkpatch...
1082
  		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1083
1084
  			print "SIZEOF($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1085
  			if (defined $2) {
cf655043d   Andy Whitcroft   update checkpatch...
1086
  				$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1087
1088
  			}
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1089
  		} elsif ($cur =~ /^(if|while|for)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1090
1091
  			print "COND($1)
  " if ($dbg_values > 1);
14b111c15   Andy Whitcroft   checkpatch: condi...
1092
  			$av_pending = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1093
  			$type = 'N';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1094
1095
1096
1097
1098
  		} elsif ($cur =~/^(case)/o) {
  			print "CASE($1)
  " if ($dbg_values > 1);
  			$av_pend_colon = 'C';
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1099
  		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1100
1101
  			print "KEYWORD($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1102
1103
1104
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\()/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1105
1106
  			print "PAREN('$1')
  " if ($dbg_values > 1);
cf655043d   Andy Whitcroft   update checkpatch...
1107
1108
  			push(@av_paren_type, $av_pending);
  			$av_pending = '_';
6c72ffaab   Andy Whitcroft   update checkpatch...
1109
1110
1111
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1112
1113
1114
  			my $new_type = pop(@av_paren_type);
  			if ($new_type ne '_') {
  				$type = $new_type;
c2fdda0df   Andy Whitcroft   update checkpatch...
1115
1116
1117
  				print "PAREN('$1') -> $type
  "
  							if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1118
  			} else {
c2fdda0df   Andy Whitcroft   update checkpatch...
1119
1120
  				print "PAREN('$1')
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1121
  			}
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1122
  		} elsif ($cur =~ /^($Ident)\s*\(/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1123
1124
  			print "FUNC($1)
  " if ($dbg_values > 1);
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1125
  			$type = 'V';
cf655043d   Andy Whitcroft   update checkpatch...
1126
  			$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1127

8e761b04a   Andy Whitcroft   checkpatch: detec...
1128
1129
  		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
  			if (defined $2 && $type eq 'C' || $type eq 'T') {
1f65f947a   Andy Whitcroft   checkpatch: add c...
1130
  				$av_pend_colon = 'B';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1131
1132
  			} elsif ($type eq 'E') {
  				$av_pend_colon = 'L';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1133
1134
1135
1136
  			}
  			print "IDENT_COLON($1,$type>$av_pend_colon)
  " if ($dbg_values > 1);
  			$type = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1137
  		} elsif ($cur =~ /^($Ident|$Constant)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1138
1139
  			print "IDENT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1140
1141
1142
  			$type = 'V';
  
  		} elsif ($cur =~ /^($Assignment)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1143
1144
  			print "ASSIGN($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1145
  			$type = 'N';
cf655043d   Andy Whitcroft   update checkpatch...
1146
  		} elsif ($cur =~/^(;|{|})/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1147
1148
  			print "END($1)
  " if ($dbg_values > 1);
13214adf7   Andy Whitcroft   update checkpatch...
1149
  			$type = 'E';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1150
  			$av_pend_colon = 'O';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1151
1152
1153
1154
  		} elsif ($cur =~/^(,)/) {
  			print "COMMA($1)
  " if ($dbg_values > 1);
  			$type = 'C';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
  		} elsif ($cur =~ /^(\?)/o) {
  			print "QUESTION($1)
  " if ($dbg_values > 1);
  			$type = 'N';
  
  		} elsif ($cur =~ /^(:)/o) {
  			print "COLON($1,$av_pend_colon)
  " if ($dbg_values > 1);
  
  			substr($var, length($res), 1, $av_pend_colon);
  			if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
  				$type = 'E';
  			} else {
  				$type = 'N';
  			}
  			$av_pend_colon = 'O';
13214adf7   Andy Whitcroft   update checkpatch...
1171

8e761b04a   Andy Whitcroft   checkpatch: detec...
1172
  		} elsif ($cur =~ /^(\[)/o) {
13214adf7   Andy Whitcroft   update checkpatch...
1173
1174
  			print "CLOSE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1175
  			$type = 'N';
0d413866c   Andy Whitcroft   checkpatch: value...
1176
  		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
74048ed81   Andy Whitcroft   checkpatch: varia...
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
  			my $variant;
  
  			print "OPV($1)
  " if ($dbg_values > 1);
  			if ($type eq 'V') {
  				$variant = 'B';
  			} else {
  				$variant = 'U';
  			}
  
  			substr($var, length($res), 1, $variant);
  			$type = 'N';
6c72ffaab   Andy Whitcroft   update checkpatch...
1189
  		} elsif ($cur =~ /^($Operators)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1190
1191
  			print "OP($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1192
1193
1194
1195
1196
  			if ($1 ne '++' && $1 ne '--') {
  				$type = 'N';
  			}
  
  		} elsif ($cur =~ /(^.)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1197
1198
  			print "C($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1199
1200
1201
1202
1203
  		}
  		if (defined $1) {
  			$cur = substr($cur, length($1));
  			$res .= $type x length($1);
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1204
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1205

1f65f947a   Andy Whitcroft   checkpatch: add c...
1206
  	return ($res, $var);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1207
  }
8905a67c6   Andy Whitcroft   update checkpatch...
1208
  sub possible {
13214adf7   Andy Whitcroft   update checkpatch...
1209
  	my ($possible, $line) = @_;
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1210
  	my $notPermitted = qr{(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1211
1212
1213
1214
  		^(?:
  			$Modifier|
  			$Storage|
  			$Type|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1215
1216
1217
  			DEFINE_\S+
  		)$|
  		^(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1218
1219
1220
1221
1222
  			goto|
  			return|
  			case|
  			else|
  			asm|__asm__|
89a883530   Andy Whitcroft   checkpatch: ## is...
1223
1224
1225
  			do|
  			\#|
  			\#\#|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1226
  		)(?:\s|$)|
0776e5946   Andy Whitcroft   checkpatch: do is...
1227
  		^(?:typedef|struct|enum)\b
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1228
1229
1230
1231
  	    )}x;
  	warn "CHECK<$possible> ($line)
  " if ($dbg_possible > 2);
  	if ($possible !~ $notPermitted) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1232
1233
1234
1235
1236
1237
1238
  		# Check for modifiers.
  		$possible =~ s/\s*$Storage\s*//g;
  		$possible =~ s/\s*$Sparse\s*//g;
  		if ($possible =~ /^\s*$/) {
  
  		} elsif ($possible =~ /\s/) {
  			$possible =~ s/\s*$Type\s*//g;
d25065865   Andy Whitcroft   checkpatch: possi...
1239
  			for my $modifier (split(' ', $possible)) {
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1240
1241
1242
1243
1244
  				if ($modifier !~ $notPermitted) {
  					warn "MODIFIER: $modifier ($possible) ($line)
  " if ($dbg_possible);
  					push(@modifierList, $modifier);
  				}
d25065865   Andy Whitcroft   checkpatch: possi...
1245
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
1246
1247
1248
1249
1250
1251
  
  		} else {
  			warn "POSSIBLE: $possible ($line)
  " if ($dbg_possible);
  			push(@typeList, $possible);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1252
  		build_types();
0776e5946   Andy Whitcroft   checkpatch: do is...
1253
1254
1255
  	} else {
  		warn "NOTPOSS: $possible ($line)
  " if ($dbg_possible > 1);
8905a67c6   Andy Whitcroft   update checkpatch...
1256
1257
  	}
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1258
  my $prefix = '';
000d1cc18   Joe Perches   checkpatch.pl: ad...
1259
1260
1261
  sub show_type {
         return !defined $ignore_type{$_[0]};
  }
f0a594c1c   Andy Whitcroft   update checkpatch...
1262
  sub report {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1263
1264
  	if (!show_type($_[1]) ||
  	    (defined $tst_only && $_[2] !~ /\Q$tst_only\E/)) {
773647a09   Andy Whitcroft   update checkpatch...
1265
1266
  		return 0;
  	}
000d1cc18   Joe Perches   checkpatch.pl: ad...
1267
1268
1269
1270
1271
1272
1273
1274
  	my $line;
  	if ($show_types) {
  		$line = "$prefix$_[0]:$_[1]: $_[2]
  ";
  	} else {
  		$line = "$prefix$_[0]: $_[2]
  ";
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
1275
1276
1277
  	$line = (split('
  ', $line))[0] . "
  " if ($terse);
13214adf7   Andy Whitcroft   update checkpatch...
1278
  	push(our @report, $line);
773647a09   Andy Whitcroft   update checkpatch...
1279
1280
  
  	return 1;
f0a594c1c   Andy Whitcroft   update checkpatch...
1281
1282
  }
  sub report_dump {
13214adf7   Andy Whitcroft   update checkpatch...
1283
  	our @report;
f0a594c1c   Andy Whitcroft   update checkpatch...
1284
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
1285

de7d4f0e1   Andy Whitcroft   update checkpatch...
1286
  sub ERROR {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1287
  	if (report("ERROR", $_[0], $_[1])) {
773647a09   Andy Whitcroft   update checkpatch...
1288
1289
1290
  		our $clean = 0;
  		our $cnt_error++;
  	}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1291
1292
  }
  sub WARN {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1293
  	if (report("WARNING", $_[0], $_[1])) {
773647a09   Andy Whitcroft   update checkpatch...
1294
1295
1296
  		our $clean = 0;
  		our $cnt_warn++;
  	}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1297
1298
  }
  sub CHK {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1299
  	if ($check && report("CHECK", $_[0], $_[1])) {
6c72ffaab   Andy Whitcroft   update checkpatch...
1300
1301
1302
  		our $clean = 0;
  		our $cnt_chk++;
  	}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1303
  }
6ecd96744   Andy Whitcroft   checkpatch: repor...
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
  sub check_absolute_file {
  	my ($absolute, $herecurr) = @_;
  	my $file = $absolute;
  
  	##print "absolute<$absolute>
  ";
  
  	# See if any suffix of this path is a path within the tree.
  	while ($file =~ s@^[^/]*/@@) {
  		if (-f "$root/$file") {
  			##print "file<$file>
  ";
  			last;
  		}
  	}
  	if (! -f _)  {
  		return 0;
  	}
  
  	# It is, so see if the prefix is acceptable.
  	my $prefix = $absolute;
  	substr($prefix, -length($file)) = '';
  
  	##print "prefix<$prefix>
  ";
  	if ($prefix ne ".../") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1330
1331
1332
  		WARN("USE_RELATIVE_PATH",
  		     "use relative pathname instead of absolute in changelog text
  " . $herecurr);
6ecd96744   Andy Whitcroft   checkpatch: repor...
1333
1334
  	}
  }
d1fe9c099   Joe Perches   checkpatch: add s...
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
  sub pos_last_openparen {
  	my ($line) = @_;
  
  	my $pos = 0;
  
  	my $opens = $line =~ tr/\(/\(/;
  	my $closes = $line =~ tr/\)/\)/;
  
  	my $last_openparen = 0;
  
  	if (($opens == 0) || ($closes >= $opens)) {
  		return -1;
  	}
  
  	my $len = length($line);
  
  	for ($pos = 0; $pos < $len; $pos++) {
  		my $string = substr($line, $pos);
  		if ($string =~ /^($FuncArg|$balanced_parens)/) {
  			$pos += length($1) - 1;
  		} elsif (substr($line, $pos, 1) eq '(') {
  			$last_openparen = $pos;
  		} elsif (index($string, '(') == -1) {
  			last;
  		}
  	}
  
  	return $last_openparen + 1;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
1364
1365
  sub process {
  	my $filename = shift;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1366
1367
1368
  
  	my $linenr=0;
  	my $prevline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
1369
  	my $prevrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1370
  	my $stashline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
1371
  	my $stashrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1372

4a0df2ef4   Andy Whitcroft   update checkpatch...
1373
  	my $length;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1374
1375
1376
  	my $indent;
  	my $previndent=0;
  	my $stashindent=0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1377
  	our $clean = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1378
1379
  	my $signoff = 0;
  	my $is_patch = 0;
15662b3e8   Joe Perches   checkpatch: add a...
1380
1381
  	my $in_header_lines = 1;
  	my $in_commit_log = 0;		#Scanning lines before patch
fa64205df   Pasi Savanainen   checkpatch: check...
1382
  	my $non_utf8_charset = 0;
13214adf7   Andy Whitcroft   update checkpatch...
1383
  	our @report = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
1384
1385
1386
1387
  	our $cnt_lines = 0;
  	our $cnt_error = 0;
  	our $cnt_warn = 0;
  	our $cnt_chk = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1388
1389
1390
1391
1392
1393
  	# Trace the real file/line as we go.
  	my $realfile = '';
  	my $realline = 0;
  	my $realcnt = 0;
  	my $here = '';
  	my $in_comment = 0;
c2fdda0df   Andy Whitcroft   update checkpatch...
1394
  	my $comment_edge = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1395
  	my $first_line = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
1396
  	my $p1_prefix = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
1397

13214adf7   Andy Whitcroft   update checkpatch...
1398
1399
1400
  	my $prev_values = 'E';
  
  	# suppression flags
773647a09   Andy Whitcroft   update checkpatch...
1401
  	my %suppress_ifbraces;
170d3a226   Andy Whitcroft   checkpatch: handl...
1402
  	my %suppress_whiletrailers;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1403
  	my %suppress_export;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
1404
  	my $suppress_statement = 0;
653d4876b   Andy Whitcroft   update checkpatch...
1405

323c1260b   Joe Perches   checkpatch: warn ...
1406
  	my %camelcase = ();
c2fdda0df   Andy Whitcroft   update checkpatch...
1407
  	# Pre-scan the patch sanitizing the lines.
de7d4f0e1   Andy Whitcroft   update checkpatch...
1408
  	# Pre-scan the patch looking for any __setup documentation.
c2fdda0df   Andy Whitcroft   update checkpatch...
1409
  	#
de7d4f0e1   Andy Whitcroft   update checkpatch...
1410
1411
  	my @setup_docs = ();
  	my $setup_docs = 0;
773647a09   Andy Whitcroft   update checkpatch...
1412
1413
  
  	sanitise_line_reset();
c2fdda0df   Andy Whitcroft   update checkpatch...
1414
1415
  	my $line;
  	foreach my $rawline (@rawlines) {
773647a09   Andy Whitcroft   update checkpatch...
1416
1417
  		$linenr++;
  		$line = $rawline;
c2fdda0df   Andy Whitcroft   update checkpatch...
1418

773647a09   Andy Whitcroft   update checkpatch...
1419
  		if ($rawline=~/^\+\+\+\s+(\S+)/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1420
1421
1422
1423
  			$setup_docs = 0;
  			if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
  				$setup_docs = 1;
  			}
773647a09   Andy Whitcroft   update checkpatch...
1424
1425
1426
1427
1428
1429
1430
1431
1432
  			#next;
  		}
  		if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
1433
  			$in_comment = 0;
773647a09   Andy Whitcroft   update checkpatch...
1434
1435
1436
1437
1438
1439
  
  			# Guestimate if this is a continuing comment.  Run
  			# the context looking for a comment "edge".  If this
  			# edge is a close comment then we must be in a comment
  			# at context start.
  			my $edge;
01fa91471   Andy Whitcroft   checkpatch: fix u...
1440
1441
1442
1443
1444
1445
1446
  			my $cnt = $realcnt;
  			for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
  				next if (defined $rawlines[$ln - 1] &&
  					 $rawlines[$ln - 1] =~ /^-/);
  				$cnt--;
  				#print "RAW<$rawlines[$ln - 1]>
  ";
721c1cb60   Andy Whitcroft   checkpatch: comme...
1447
  				last if (!defined $rawlines[$ln - 1]);
fae17daed   Andy Whitcroft   checkpatch: comme...
1448
1449
1450
1451
1452
  				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
  				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
  					($edge) = $1;
  					last;
  				}
773647a09   Andy Whitcroft   update checkpatch...
1453
1454
1455
1456
1457
1458
1459
1460
1461
  			}
  			if (defined $edge && $edge eq '*/') {
  				$in_comment = 1;
  			}
  
  			# Guestimate if this is a continuing comment.  If this
  			# is the start of a diff block and this line starts
  			# ' *' then it is very likely a comment.
  			if (!defined $edge &&
83242e0c2   Andy Whitcroft   checkpatch: widen...
1462
  			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
773647a09   Andy Whitcroft   update checkpatch...
1463
1464
1465
1466
1467
1468
1469
  			{
  				$in_comment = 1;
  			}
  
  			##print "COMMENT:$in_comment edge<$edge> $rawline
  ";
  			sanitise_line_reset($in_comment);
171ae1a49   Andy Whitcroft   update checkpatch...
1470
  		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
773647a09   Andy Whitcroft   update checkpatch...
1471
  			# Standardise the strings and chars within the input to
171ae1a49   Andy Whitcroft   update checkpatch...
1472
  			# simplify matching -- only bother with positive lines.
773647a09   Andy Whitcroft   update checkpatch...
1473
  			$line = sanitise_line($rawline);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1474
  		}
773647a09   Andy Whitcroft   update checkpatch...
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
  		push(@lines, $line);
  
  		if ($realcnt > 1) {
  			$realcnt-- if ($line =~ /^(?:\+| |$)/);
  		} else {
  			$realcnt = 0;
  		}
  
  		#print "==>$rawline
  ";
  		#print "-->$line
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
1487
1488
1489
1490
1491
  
  		if ($setup_docs && $line =~ /^\+/) {
  			push(@setup_docs, $line);
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
1492
  	$prefix = '';
773647a09   Andy Whitcroft   update checkpatch...
1493
1494
  	$realcnt = 0;
  	$linenr = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1495
1496
  	foreach my $line (@lines) {
  		$linenr++;
c2fdda0df   Andy Whitcroft   update checkpatch...
1497
  		my $rawline = $rawlines[$linenr - 1];
6c72ffaab   Andy Whitcroft   update checkpatch...
1498

0a920b5b6   Andy Whitcroft   add a trivial pat...
1499
  #extract the line range in the file after the patch is applied
6c72ffaab   Andy Whitcroft   update checkpatch...
1500
  		if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
1501
  			$is_patch = 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1502
  			$first_line = $linenr + 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1503
1504
1505
1506
1507
1508
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
1509
  			annotate_reset();
13214adf7   Andy Whitcroft   update checkpatch...
1510
  			$prev_values = 'E';
773647a09   Andy Whitcroft   update checkpatch...
1511
  			%suppress_ifbraces = ();
170d3a226   Andy Whitcroft   checkpatch: handl...
1512
  			%suppress_whiletrailers = ();
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1513
  			%suppress_export = ();
3e469cdc0   Andy Whitcroft   checkpatch: optim...
1514
  			$suppress_statement = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1515
  			next;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1516

4a0df2ef4   Andy Whitcroft   update checkpatch...
1517
1518
1519
  # track the line number as we move through the hunk, note that
  # new versions of GNU diff omit the leading space on completely
  # blank context lines so we need to count that too.
773647a09   Andy Whitcroft   update checkpatch...
1520
  		} elsif ($line =~ /^( |\+|$)/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
1521
  			$realline++;
d8aaf1214   Andy Whitcroft   update checkpatch...
1522
  			$realcnt-- if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1523

4a0df2ef4   Andy Whitcroft   update checkpatch...
1524
  			# Measure the line length and indent.
c2fdda0df   Andy Whitcroft   update checkpatch...
1525
  			($length, $indent) = line_stats($rawline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1526
1527
1528
1529
  
  			# Track the previous line.
  			($prevline, $stashline) = ($stashline, $line);
  			($previndent, $stashindent) = ($stashindent, $indent);
c2fdda0df   Andy Whitcroft   update checkpatch...
1530
  			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
773647a09   Andy Whitcroft   update checkpatch...
1531
1532
  			#warn "line<$line>
  ";
6c72ffaab   Andy Whitcroft   update checkpatch...
1533

d8aaf1214   Andy Whitcroft   update checkpatch...
1534
1535
  		} elsif ($realcnt == 1) {
  			$realcnt--;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1536
  		}
cc77cdca5   Andy Whitcroft   checkpatch: corre...
1537
  		my $hunk_line = ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1538
  #make up the handle for any error we report on this line
773647a09   Andy Whitcroft   update checkpatch...
1539
1540
  		$prefix = "$filename:$realline: " if ($emacs && $file);
  		$prefix = "$filename:$linenr: " if ($emacs && !$file);
6c72ffaab   Andy Whitcroft   update checkpatch...
1541
1542
  		$here = "#$linenr: " if (!$file);
  		$here = "#$realline: " if ($file);
773647a09   Andy Whitcroft   update checkpatch...
1543
1544
  
  		# extract the filename as it passes
3bf9a009f   Rabin Vincent   checkpatch: check...
1545
1546
1547
  		if ($line =~ /^diff --git.*?(\S+)$/) {
  			$realfile = $1;
  			$realfile =~ s@^([^/]*)/@@;
270c49a08   Joe Perches   checkpatch: updat...
1548
  			$in_commit_log = 0;
3bf9a009f   Rabin Vincent   checkpatch: check...
1549
  		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
773647a09   Andy Whitcroft   update checkpatch...
1550
  			$realfile = $1;
1e8557269   Wolfram Sang   checkpatch: Add w...
1551
  			$realfile =~ s@^([^/]*)/@@;
270c49a08   Joe Perches   checkpatch: updat...
1552
  			$in_commit_log = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
1553
1554
  
  			$p1_prefix = $1;
e2f7aa4b8   Andy Whitcroft   checkpatch: do no...
1555
1556
  			if (!$file && $tree && $p1_prefix ne '' &&
  			    -e "$root/$p1_prefix") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1557
1558
1559
  				WARN("PATCH_PREFIX",
  				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch
  ");
1e8557269   Wolfram Sang   checkpatch: Add w...
1560
  			}
773647a09   Andy Whitcroft   update checkpatch...
1561

c1ab33269   Andy Whitcroft   checkpatch: inclu...
1562
  			if ($realfile =~ m@^include/asm/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1563
1564
1565
1566
  				ERROR("MODIFIED_INCLUDE_ASM",
  				      "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>
  " . "$here$rawline
  ");
773647a09   Andy Whitcroft   update checkpatch...
1567
1568
1569
  			}
  			next;
  		}
389834b68   Randy Dunlap   checkpatch: produ...
1570
  		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1571

c2fdda0df   Andy Whitcroft   update checkpatch...
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
  		my $hereline = "$here
  $rawline
  ";
  		my $herecurr = "$here
  $rawline
  ";
  		my $hereprev = "$here
  $prevrawline
  $rawline
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1582

6c72ffaab   Andy Whitcroft   update checkpatch...
1583
  		$cnt_lines++ if ($realcnt != 0);
3bf9a009f   Rabin Vincent   checkpatch: check...
1584
1585
1586
1587
1588
  # Check for incorrect file permissions
  		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
  			my $permhere = $here . "FILE: $realfile
  ";
  			if ($realfile =~ /(Makefile|Kconfig|\.c|\.h|\.S|\.tmpl)$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1589
1590
1591
  				ERROR("EXECUTE_PERMISSIONS",
  				      "do not set execute permissions for source files
  " . $permhere);
3bf9a009f   Rabin Vincent   checkpatch: check...
1592
1593
  			}
  		}
201124755   Joe Perches   checkpatch: valid...
1594
  # Check the patch for a signoff:
d8aaf1214   Andy Whitcroft   update checkpatch...
1595
  		if ($line =~ /^\s*signed-off-by:/i) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
1596
  			$signoff++;
15662b3e8   Joe Perches   checkpatch: add a...
1597
  			$in_commit_log = 0;
201124755   Joe Perches   checkpatch: valid...
1598
1599
1600
  		}
  
  # Check signature styles
270c49a08   Joe Perches   checkpatch: updat...
1601
  		if (!$in_header_lines &&
ce0338df3   Joe Perches   checkpatch: test ...
1602
  		    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
201124755   Joe Perches   checkpatch: valid...
1603
1604
1605
1606
1607
  			my $space_before = $1;
  			my $sign_off = $2;
  			my $space_after = $3;
  			my $email = $4;
  			my $ucfirst_sign_off = ucfirst(lc($sign_off));
ce0338df3   Joe Perches   checkpatch: test ...
1608
1609
1610
1611
1612
  			if ($sign_off !~ /$signature_tags/) {
  				WARN("BAD_SIGN_OFF",
  				     "Non-standard signature: $sign_off
  " . $herecurr);
  			}
201124755   Joe Perches   checkpatch: valid...
1613
  			if (defined $space_before && $space_before ne "") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1614
1615
1616
  				WARN("BAD_SIGN_OFF",
  				     "Do not use whitespace before $ucfirst_sign_off
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
1617
1618
  			}
  			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1619
1620
1621
  				WARN("BAD_SIGN_OFF",
  				     "'$ucfirst_sign_off' is the preferred signature form
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
1622
1623
  			}
  			if (!defined $space_after || $space_after ne " ") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1624
1625
1626
  				WARN("BAD_SIGN_OFF",
  				     "Use a single space after $ucfirst_sign_off
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1627
  			}
201124755   Joe Perches   checkpatch: valid...
1628
1629
1630
1631
  
  			my ($email_name, $email_address, $comment) = parse_email($email);
  			my $suggested_email = format_email(($email_name, $email_address));
  			if ($suggested_email eq "") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1632
1633
1634
  				ERROR("BAD_SIGN_OFF",
  				      "Unrecognized email address: '$email'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
1635
1636
1637
1638
1639
1640
1641
1642
1643
  			} else {
  				my $dequoted = $suggested_email;
  				$dequoted =~ s/^"//;
  				$dequoted =~ s/" </ </;
  				# Don't force email to have quotes
  				# Allow just an angle bracketed address
  				if ("$dequoted$comment" ne $email &&
  				    "<$email_address>$comment" ne $email &&
  				    "$suggested_email$comment" ne $email) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1644
1645
1646
  					WARN("BAD_SIGN_OFF",
  					     "email address '$email' might be better as '$suggested_email$comment'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
1647
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1648
1649
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1650
  # Check for wrappage within a valid hunk of the file
8905a67c6   Andy Whitcroft   update checkpatch...
1651
  		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1652
1653
1654
  			ERROR("CORRUPTED_PATCH",
  			      "patch seems to be corrupt (line wrapped?)
  " .
6c72ffaab   Andy Whitcroft   update checkpatch...
1655
  				$herecurr) if (!$emitted_corrupt++);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1656
  		}
6ecd96744   Andy Whitcroft   checkpatch: repor...
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
  # Check for absolute kernel paths.
  		if ($tree) {
  			while ($line =~ m{(?:^|\s)(/\S*)}g) {
  				my $file = $1;
  
  				if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
  				    check_absolute_file($1, $herecurr)) {
  					#
  				} else {
  					check_absolute_file($file, $herecurr);
  				}
  			}
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1670
1671
  # UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
  		if (($realfile =~ /^$/ || $line =~ /^\+/) &&
171ae1a49   Andy Whitcroft   update checkpatch...
1672
1673
1674
1675
1676
1677
1678
  		    $rawline !~ m/^$UTF8*$/) {
  			my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
  
  			my $blank = copy_spacing($rawline);
  			my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
  			my $hereptr = "$hereline$ptr
  ";
34d992197   Joe Perches   checkpatch: make ...
1679
1680
1681
  			CHK("INVALID_UTF8",
  			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8
  " . $hereptr);
00df344fd   Andy Whitcroft   update checkpatch...
1682
  		}
15662b3e8   Joe Perches   checkpatch: add a...
1683
1684
1685
  # Check if it's the start of a commit log
  # (not a header line and we haven't seen the patch filename)
  		if ($in_header_lines && $realfile =~ /^$/ &&
270c49a08   Joe Perches   checkpatch: updat...
1686
  		    $rawline !~ /^(commit\b|from\b|[\w-]+:).+$/i) {
15662b3e8   Joe Perches   checkpatch: add a...
1687
1688
1689
  			$in_header_lines = 0;
  			$in_commit_log = 1;
  		}
fa64205df   Pasi Savanainen   checkpatch: check...
1690
1691
1692
1693
1694
1695
1696
1697
1698
  # Check if there is UTF-8 in a commit log when a mail header has explicitly
  # declined it, i.e defined some charset where it is missing.
  		if ($in_header_lines &&
  		    $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
  		    $1 !~ /utf-8/i) {
  			$non_utf8_charset = 1;
  		}
  
  		if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
15662b3e8   Joe Perches   checkpatch: add a...
1699
  		    $rawline =~ /$NON_ASCII_UTF8/) {
fa64205df   Pasi Savanainen   checkpatch: check...
1700
  			WARN("UTF8_BEFORE_PATCH",
15662b3e8   Joe Perches   checkpatch: add a...
1701
1702
1703
  			    "8-bit UTF-8 used in possible commit log
  " . $herecurr);
  		}
306708547   Andy Whitcroft   checkpatch: ensur...
1704
1705
  # ignore non-hunk lines and lines being removed
  		next if (!$hunk_line || $line =~ /^-/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1706

0a920b5b6   Andy Whitcroft   add a trivial pat...
1707
  #trailing whitespace
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1708
  		if ($line =~ /^\+.*\015/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1709
1710
1711
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1712
1713
1714
  			ERROR("DOS_LINE_ENDINGS",
  			      "DOS line endings
  " . $herevet);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1715

c2fdda0df   Andy Whitcroft   update checkpatch...
1716
1717
1718
1719
  		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1720
1721
1722
  			ERROR("TRAILING_WHITESPACE",
  			      "trailing whitespace
  " . $herevet);
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
1723
  			$rpt_cleaners = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1724
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
1725

3354957a4   Andi Kleen   checkpatch: add c...
1726
  # check for Kconfig help text having a real description
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1727
1728
  # Only applies when adding the entry originally, after that we do not have
  # sufficient context to determine whether it is indeed long enough.
3354957a4   Andi Kleen   checkpatch: add c...
1729
  		if ($realfile =~ /Kconfig/ &&
a13858033   Andy Whitcroft   checkpatch: only ...
1730
  		    $line =~ /.\s*config\s+/) {
3354957a4   Andi Kleen   checkpatch: add c...
1731
  			my $length = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1732
1733
1734
  			my $cnt = $realcnt;
  			my $ln = $linenr + 1;
  			my $f;
a13858033   Andy Whitcroft   checkpatch: only ...
1735
  			my $is_start = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1736
  			my $is_end = 0;
a13858033   Andy Whitcroft   checkpatch: only ...
1737
  			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1738
1739
1740
  				$f = $lines[$ln - 1];
  				$cnt-- if ($lines[$ln - 1] !~ /^-/);
  				$is_end = $lines[$ln - 1] =~ /^\+/;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1741
1742
  
  				next if ($f =~ /^-/);
a13858033   Andy Whitcroft   checkpatch: only ...
1743
1744
1745
1746
1747
1748
  
  				if ($lines[$ln - 1] =~ /.\s*(?:bool|tristate)\s*\"/) {
  					$is_start = 1;
  				} elsif ($lines[$ln - 1] =~ /.\s*(?:---)?help(?:---)?$/) {
  					$length = -1;
  				}
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1749
  				$f =~ s/^.//;
3354957a4   Andi Kleen   checkpatch: add c...
1750
1751
1752
  				$f =~ s/#.*//;
  				$f =~ s/^\s+//;
  				next if ($f =~ /^$/);
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1753
1754
1755
1756
  				if ($f =~ /^\s*config\s/) {
  					$is_end = 1;
  					last;
  				}
3354957a4   Andi Kleen   checkpatch: add c...
1757
1758
  				$length++;
  			}
000d1cc18   Joe Perches   checkpatch.pl: ad...
1759
  			WARN("CONFIG_DESCRIPTION",
a13858033   Andy Whitcroft   checkpatch: only ...
1760
1761
1762
1763
  			     "please write a paragraph that describes the config symbol fully
  " . $herecurr) if ($is_start && $is_end && $length < 4);
  			#print "is_start<$is_start> is_end<$is_end> length<$length>
  ";
3354957a4   Andi Kleen   checkpatch: add c...
1764
  		}
1ba8dfd17   Kees Cook   checkpatch: warn ...
1765
1766
1767
1768
1769
1770
1771
  # discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
  		if ($realfile =~ /Kconfig/ &&
  		    $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
  			WARN("CONFIG_EXPERIMENTAL",
  			     "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580
  ");
  		}
c68e58783   Arnaud Lacombe   script/checkpatch...
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
  		if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
  		    ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
  			my $flag = $1;
  			my $replacement = {
  				'EXTRA_AFLAGS' =>   'asflags-y',
  				'EXTRA_CFLAGS' =>   'ccflags-y',
  				'EXTRA_CPPFLAGS' => 'cppflags-y',
  				'EXTRA_LDFLAGS' =>  'ldflags-y',
  			};
  
  			WARN("DEPRECATED_VARIABLE",
  			     "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.
  " . $herecurr) if ($replacement->{$flag});
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
1786
1787
  # check we are in a valid source file if not then ignore this hunk
  		next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
6cd7f3869   Joe Perches   checkpatch: allow...
1788
  #line length limit
c45dcabd2   Andy Whitcroft   update checkpatch...
1789
  		if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
f4c014c0d   Andy Whitcroft   checkpatch: allow...
1790
  		    $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
0fccc6221   Joe Perches   checkpatch: fix d...
1791
  		    !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
8bbea968f   Joe Perches   checkpatch: add m...
1792
  		    $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
6cd7f3869   Joe Perches   checkpatch: allow...
1793
  		    $length > $max_line_length)
c45dcabd2   Andy Whitcroft   update checkpatch...
1794
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
1795
  			WARN("LONG_LINE",
6cd7f3869   Joe Perches   checkpatch: allow...
1796
1797
  			     "line over $max_line_length characters
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1798
  		}
ca56dc098   Josh Triplett   checkpatch: check...
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
  # Check for user-visible strings broken across lines, which breaks the ability
  # to grep for the string.  Limited to strings used as parameters (those
  # following an open parenthesis), which almost completely eliminates false
  # positives, as well as warning only once per parameter rather than once per
  # line of the string.  Make an exception when the previous string ends in a
  # newline (multiple lines in one string constant) or 
  \t (common in inline
  # assembly to indent the instruction on the following line).
  		if ($line =~ /^\+\s*"/ &&
  		    $prevline =~ /"\s*$/ &&
  		    $prevline =~ /\(/ &&
  		    $prevrawline !~ /\
  (?:\\t)*"\s*$/) {
  			WARN("SPLIT_STRING",
  			     "quoted string split across lines
  " . $hereprev);
  		}
5e79d96ee   Joe Perches   checkpatch: warn ...
1816
1817
1818
  # check for spaces before a quoted newline
  		if ($rawline =~ /^.*\".*\s\
  /) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1819
1820
1821
  			WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
  			     "unnecessary whitespace before a quoted newline
  " . $herecurr);
5e79d96ee   Joe Perches   checkpatch: warn ...
1822
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1823
1824
  # check for adding lines without a newline.
  		if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1825
1826
1827
  			WARN("MISSING_EOF_NEWLINE",
  			     "adding a line without newline at end of file
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
1828
  		}
42e41c54d   Mike Frysinger   checkpatch: add s...
1829
1830
1831
1832
1833
1834
  # Blackfin: use hi/lo macros
  		if ($realfile =~ m@arch/blackfin/.*\.S$@) {
  			if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
  				my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1835
1836
1837
  				ERROR("LO_MACRO",
  				      "use the LO() macro, not (... & 0xFFFF)
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
1838
1839
1840
1841
1842
  			}
  			if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
  				my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1843
1844
1845
  				ERROR("HI_MACRO",
  				      "use the HI() macro, not (... >> 16)
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
1846
1847
  			}
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
1848
1849
  # check we are in a valid source file C or perl if not then ignore this hunk
  		next if ($realfile !~ /\.(h|c|pl)$/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1850
1851
1852
  
  # at the beginning of a line any tabs must come first and anything
  # more than 8 must use tabs.
c2fdda0df   Andy Whitcroft   update checkpatch...
1853
1854
1855
1856
1857
  		if ($rawline =~ /^\+\s* \t\s*\S/ ||
  		    $rawline =~ /^\+\s*        \s*/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1858
1859
1860
  			ERROR("CODE_INDENT",
  			      "code indent should use tabs where possible
  " . $herevet);
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
1861
  			$rpt_cleaners = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1862
  		}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
1863
1864
1865
1866
1867
  # check for space before tabs.
  		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1868
1869
1870
  			WARN("SPACE_BEFORE_TAB",
  			     "please, no space before tabs
  " . $herevet);
08e443656   Alberto Panizzo   checkpatch.pl: wa...
1871
  		}
d1fe9c099   Joe Perches   checkpatch: add s...
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
  # check for && or || at the start of a line
  		if ($rawline =~ /^\+\s*(&&|\|\|)/) {
  			CHK("LOGICAL_CONTINUATIONS",
  			    "Logical continuations should be on the previous line
  " . $hereprev);
  		}
  
  # check multi-line statement indentation matches previous line
  		if ($^V && $^V ge 5.10.0 &&
  		    $prevline =~ /^\+(\t*)(if \(|$Ident\().*(\&\&|\|\||,)\s*$/) {
  			$prevline =~ /^\+(\t*)(.*)$/;
  			my $oldindent = $1;
  			my $rest = $2;
  
  			my $pos = pos_last_openparen($rest);
  			if ($pos >= 0) {
b34a26f31   Joe Perches   checkpatch: Updat...
1888
1889
  				$line =~ /^(\+| )([ \t]*)/;
  				my $newindent = $2;
d1fe9c099   Joe Perches   checkpatch: add s...
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
  
  				my $goodtabindent = $oldindent .
  					"\t" x ($pos / 8) .
  					" "  x ($pos % 8);
  				my $goodspaceindent = $oldindent . " "  x $pos;
  
  				if ($newindent ne $goodtabindent &&
  				    $newindent ne $goodspaceindent) {
  					CHK("PARENTHESIS_ALIGNMENT",
  					    "Alignment should match open parenthesis
  " . $hereprev);
  				}
  			}
  		}
aad4f6149   Joe Perches   checkpatch: add -...
1904
1905
1906
1907
1908
  		if ($line =~ /^\+.*\*[ \t]*\)[ \t]+/) {
  			CHK("SPACING",
  			    "No space is necessary after a cast
  " . $hereprev);
  		}
058806007   Joe Perches   checkpatch: check...
1909
1910
1911
1912
1913
1914
1915
1916
1917
  		if ($realfile =~ m@^(drivers/net/|net/)@ &&
  		    $rawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
  		    $prevrawline =~ /^\+[ \t]*$/) {
  			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
  			     "networking block comments don't use an empty /* line, use /* Comment...
  " . $hereprev);
  		}
  
  		if ($realfile =~ m@^(drivers/net/|net/)@ &&
c24f9f195   Joe Perches   checkpatch: impro...
1918
1919
1920
1921
  		    $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */
  		    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
  		    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/
  		    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */
058806007   Joe Perches   checkpatch: check...
1922
1923
1924
1925
  			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
  			     "networking block comments put the trailing */ on a separate line
  " . $herecurr);
  		}
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
1926
  # check for spaces at the beginning of a line.
6b4c5bebc   Andy Whitcroft   checkpatch: fix r...
1927
1928
1929
1930
1931
  # Exceptions:
  #  1) within comments
  #  2) indented preprocessor commands
  #  3) hanging labels
  		if ($rawline =~ /^\+ / && $line !~ /\+ *(?:$;|#|$Ident:)/)  {
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
1932
1933
1934
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1935
1936
1937
  			WARN("LEADING_SPACE",
  			     "please, no spaces at the start of a line
  " . $herevet);
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
1938
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
1939
1940
  # check we are in a valid C source file if not then ignore this hunk
  		next if ($realfile !~ /\.(h|c)$/);
1ba8dfd17   Kees Cook   checkpatch: warn ...
1941
1942
1943
1944
1945
1946
  # discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
  		if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
  			WARN("CONFIG_EXPERIMENTAL",
  			     "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580
  ");
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
1947
  # check for RCS/CVS revision markers
cf655043d   Andy Whitcroft   update checkpatch...
1948
  		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1949
1950
1951
  			WARN("CVS_KEYWORD",
  			     "CVS style keyword markers, these will _not_ be updated
  ". $herecurr);
c2fdda0df   Andy Whitcroft   update checkpatch...
1952
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
1953

42e41c54d   Mike Frysinger   checkpatch: add s...
1954
1955
1956
1957
1958
  # Blackfin: don't use __builtin_bfin_[cs]sync
  		if ($line =~ /__builtin_bfin_csync/) {
  			my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1959
1960
1961
  			ERROR("CSYNC",
  			      "use the CSYNC() macro in asm/blackfin.h
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
1962
1963
1964
1965
1966
  		}
  		if ($line =~ /__builtin_bfin_ssync/) {
  			my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1967
1968
1969
  			ERROR("SSYNC",
  			      "use the SSYNC() macro in asm/blackfin.h
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
1970
  		}
56e77d709   Joe Perches   checkpatch: warn ...
1971
1972
1973
1974
1975
1976
  # check for old HOTPLUG __dev<foo> section markings
  		if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
  			WARN("HOTPLUG_SECTION",
  			     "Using $1 is unnecessary
  " . $herecurr);
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1977
  # Check for potential 'bare' types
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1978
1979
  		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
  		    $realline_next);
3e469cdc0   Andy Whitcroft   checkpatch: optim...
1980
1981
1982
1983
  #print "LINE<$line>
  ";
  		if ($linenr >= $suppress_statement &&
  		    $realcnt && $line =~ /.\s*\S/) {
170d3a226   Andy Whitcroft   checkpatch: handl...
1984
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
1985
  				ctx_statement_block($linenr, $realcnt, 0);
171ae1a49   Andy Whitcroft   update checkpatch...
1986
1987
1988
1989
1990
1991
  			$stat =~ s/
  ./
   /g;
  			$cond =~ s/
  ./
   /g;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
  #print "linenr<$linenr> <$stat>
  ";
  			# If this statement has no statement boundaries within
  			# it there is no point in retrying a statement scan
  			# until we hit end of it.
  			my $frag = $stat; $frag =~ s/;+\s*$//;
  			if ($frag !~ /(?:{|;)/) {
  #print "skip<$line_nr_next>
  ";
  				$suppress_statement = $line_nr_next;
  			}
f74bd1942   Andy Whitcroft   checkpatch: corre...
2003

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2004
2005
2006
2007
2008
2009
2010
  			# Find the real next line.
  			$realline_next = $line_nr_next;
  			if (defined $realline_next &&
  			    (!defined $lines[$realline_next - 1] ||
  			     substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
  				$realline_next++;
  			}
171ae1a49   Andy Whitcroft   update checkpatch...
2011
2012
  			my $s = $stat;
  			$s =~ s/{.*$//s;
cf655043d   Andy Whitcroft   update checkpatch...
2013

c2fdda0df   Andy Whitcroft   update checkpatch...
2014
  			# Ignore goto labels.
171ae1a49   Andy Whitcroft   update checkpatch...
2015
  			if ($s =~ /$Ident:\*$/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2016
2017
  
  			# Ignore functions being called
171ae1a49   Andy Whitcroft   update checkpatch...
2018
  			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2019

463f28648   Andy Whitcroft   checkpatch: possi...
2020
  			} elsif ($s =~ /^.\s*else\b/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2021
  			# declarations always start with types
d25065865   Andy Whitcroft   checkpatch: possi...
2022
  			} 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) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2023
2024
2025
  				my $type = $1;
  				$type =~ s/\s+/ /g;
  				possible($type, "A:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
2026
  			# definitions in global scope can only start with types
a6a840628   Andy Whitcroft   checkpatch: label...
2027
  			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2028
  				possible($1, "B:" . $s);
c2fdda0df   Andy Whitcroft   update checkpatch...
2029
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
2030
2031
  
  			# any (foo ... *) is a pointer cast, and foo is a type
65863862b   Andy Whitcroft   checkpatch: dissa...
2032
  			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2033
  				possible($1, "C:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
2034
2035
2036
2037
2038
  			}
  
  			# Check for any sort of function declaration.
  			# int foo(something bar, other baz);
  			# void (*store_gdt)(x86_descr_ptr *);
171ae1a49   Andy Whitcroft   update checkpatch...
2039
  			if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
8905a67c6   Andy Whitcroft   update checkpatch...
2040
  				my ($name_len) = length($1);
8905a67c6   Andy Whitcroft   update checkpatch...
2041

cf655043d   Andy Whitcroft   update checkpatch...
2042
  				my $ctx = $s;
773647a09   Andy Whitcroft   update checkpatch...
2043
  				substr($ctx, 0, $name_len + 1, '');
8905a67c6   Andy Whitcroft   update checkpatch...
2044
  				$ctx =~ s/\)[^\)]*$//;
cf655043d   Andy Whitcroft   update checkpatch...
2045

8905a67c6   Andy Whitcroft   update checkpatch...
2046
  				for my $arg (split(/\s*,\s*/, $ctx)) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2047
  					if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
8905a67c6   Andy Whitcroft   update checkpatch...
2048

c45dcabd2   Andy Whitcroft   update checkpatch...
2049
  						possible($1, "D:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
2050
2051
  					}
  				}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2052
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
2053

9c0ca6f9a   Andy Whitcroft   update checkpatch...
2054
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2055
2056
2057
  #
  # Checks which may be anchored in the context.
  #
00df344fd   Andy Whitcroft   update checkpatch...
2058

653d4876b   Andy Whitcroft   update checkpatch...
2059
2060
  # Check for switch () and associated case and default
  # statements should be at the same indent.
00df344fd   Andy Whitcroft   update checkpatch...
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
  		if ($line=~/\bswitch\s*\(.*\)/) {
  			my $err = '';
  			my $sep = '';
  			my @ctx = ctx_block_outer($linenr, $realcnt);
  			shift(@ctx);
  			for my $ctx (@ctx) {
  				my ($clen, $cindent) = line_stats($ctx);
  				if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
  							$indent != $cindent) {
  					$err .= "$sep$ctx
  ";
  					$sep = '';
  				} else {
  					$sep = "[...]
  ";
  				}
  			}
  			if ($err ne '') {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2079
2080
2081
  				ERROR("SWITCH_CASE_INDENT_LEVEL",
  				      "switch and case should be at the same indent
  $hereline$err");
de7d4f0e1   Andy Whitcroft   update checkpatch...
2082
2083
2084
2085
2086
  			}
  		}
  
  # if/while/etc brace do not go on next line, unless defining a do while loop,
  # or if that brace on the next line is for something else
c45dcabd2   Andy Whitcroft   update checkpatch...
2087
  		if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
773647a09   Andy Whitcroft   update checkpatch...
2088
  			my $pre_ctx = "$1$2";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2089
  			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
8eef05dd3   Joe Perches   checkpatch: Warn ...
2090
2091
2092
2093
2094
2095
  
  			if ($line =~ /^\+\t{6,}/) {
  				WARN("DEEP_INDENTATION",
  				     "Too many leading tabs - consider code refactoring
  " . $herecurr);
  			}
de7d4f0e1   Andy Whitcroft   update checkpatch...
2096
2097
2098
  			my $ctx_cnt = $realcnt - $#ctx - 1;
  			my $ctx = join("
  ", @ctx);
548596d52   Andy Whitcroft   checkpatch: trail...
2099
2100
  			my $ctx_ln = $linenr;
  			my $ctx_skip = $realcnt;
773647a09   Andy Whitcroft   update checkpatch...
2101

548596d52   Andy Whitcroft   checkpatch: trail...
2102
2103
2104
2105
2106
2107
  			while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
  					defined $lines[$ctx_ln - 1] &&
  					$lines[$ctx_ln - 1] =~ /^-/)) {
  				##print "SKIP<$ctx_skip> CNT<$ctx_cnt>
  ";
  				$ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2108
  				$ctx_ln++;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2109
  			}
548596d52   Andy Whitcroft   checkpatch: trail...
2110

53210168f   Andy Whitcroft   checkpatch: tough...
2111
2112
2113
2114
2115
2116
2117
  			#print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>
  ";
  			#print "pre<$pre_ctx>
  line<$line>
  ctx<$ctx>
  next<$lines[$ctx_ln - 1]>
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
2118

773647a09   Andy Whitcroft   update checkpatch...
2119
  			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2120
2121
2122
  				ERROR("OPEN_BRACE",
  				      "that open brace { should be on the previous line
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
2123
2124
2125
2126
  					"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
00df344fd   Andy Whitcroft   update checkpatch...
2127
  			}
773647a09   Andy Whitcroft   update checkpatch...
2128
2129
2130
2131
  			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
  			    $ctx =~ /\)\s*\;\s*$/ &&
  			    defined $lines[$ctx_ln - 1])
  			{
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2132
2133
  				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
  				if ($nindent > $indent) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2134
2135
2136
  					WARN("TRAILING_SEMICOLON",
  					     "trailing semicolon indicates no statements, indent implies otherwise
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
2137
2138
2139
2140
  						"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2141
2142
  				}
  			}
00df344fd   Andy Whitcroft   update checkpatch...
2143
  		}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2144
2145
  # Check relative indent for conditionals and blocks.
  		if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2146
2147
2148
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
  			my ($s, $c) = ($stat, $cond);
  
  			substr($s, 0, length($c), '');
  
  			# Make sure we remove the line prefixes as we have
  			# none on the first line, and are going to readd them
  			# where necessary.
  			$s =~ s/
  ./
  /gs;
  
  			# Find out how long the conditional actually is.
6f779c18c   Andy Whitcroft   checkpatch: suspe...
2161
2162
2163
  			my @newlines = ($c =~ /
  /gs);
  			my $cond_lines = 1 + $#newlines;
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
  
  			# We want to check the first line inside the block
  			# starting at the end of the conditional, so remove:
  			#  1) any blank line termination
  			#  2) any opening brace { on end of the line
  			#  3) any do (...) {
  			my $continuation = 0;
  			my $check = 0;
  			$s =~ s/^.*\bdo\b//;
  			$s =~ s/^\s*{//;
  			if ($s =~ s/^\s*\\//) {
  				$continuation = 1;
  			}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2177
2178
  			if ($s =~ s/^\s*?
  //) {
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
  				$check = 1;
  				$cond_lines++;
  			}
  
  			# Also ignore a loop construct at the end of a
  			# preprocessor statement.
  			if (($prevline =~ /^.\s*#\s*define\s/ ||
  			    $prevline =~ /\\\s*$/) && $continuation == 0) {
  				$check = 0;
  			}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2189
  			my $cond_ptr = -1;
740504c61   Andy Whitcroft   checkpatch: suspe...
2190
  			$continuation = 0;
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2191
2192
  			while ($cond_ptr != $cond_lines) {
  				$cond_ptr = $cond_lines;
f16fa28f7   Andy Whitcroft   checkpatch: suspe...
2193
2194
2195
2196
2197
  				# If we see an #else/#elif then the code
  				# is not linear.
  				if ($s =~ /^\s*\#\s*(?:else|elif)/) {
  					$check = 0;
  				}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2198
2199
2200
2201
  				# Ignore:
  				#  1) blank lines, they should be at 0,
  				#  2) preprocessor lines, and
  				#  3) labels.
740504c61   Andy Whitcroft   checkpatch: suspe...
2202
2203
2204
  				if ($continuation ||
  				    $s =~ /^\s*?
  / ||
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2205
2206
  				    $s =~ /^\s*#\s*?/ ||
  				    $s =~ /^\s*$Ident\s*:/) {
740504c61   Andy Whitcroft   checkpatch: suspe...
2207
2208
  					$continuation = ($s =~ /^.*?\\
  /) ? 1 : 0;
30dad6ebe   Andy Whitcroft   checkpatch: inden...
2209
2210
2211
2212
  					if ($s =~ s/^.*?
  //) {
  						$cond_lines++;
  					}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2213
  				}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
  			}
  
  			my (undef, $sindent) = line_stats("+" . $s);
  			my $stat_real = raw_line($linenr, $cond_lines);
  
  			# Check if either of these lines are modified, else
  			# this is not this patch's fault.
  			if (!defined($stat_real) ||
  			    $stat !~ /^\+/ && $stat_real !~ /^\+/) {
  				$check = 0;
  			}
  			if (defined($stat_real) && $cond_lines > 1) {
  				$stat_real = "[...]
  $stat_real";
  			}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2229
2230
  			#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>
  ";
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2231
2232
2233
  
  			if ($check && (($sindent % 8) != 0 ||
  			    ($sindent <= $indent && $s ne ''))) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2234
2235
2236
2237
  				WARN("SUSPECT_CODE_INDENT",
  				     "suspect code indent for conditional statements ($indent, $sindent)
  " . $herecurr . "$stat_real
  ");
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2238
2239
  			}
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
2240
2241
  		# Track the 'values' across context and added lines.
  		my $opline = $line; $opline =~ s/^./ /;
1f65f947a   Andy Whitcroft   checkpatch: add c...
2242
2243
2244
  		my ($curr_values, $curr_vars) =
  				annotate_values($opline . "
  ", $prev_values);
6c72ffaab   Andy Whitcroft   update checkpatch...
2245
  		$curr_values = $prev_values . $curr_values;
c2fdda0df   Andy Whitcroft   update checkpatch...
2246
2247
  		if ($dbg_values) {
  			my $outline = $opline; $outline =~ s/\t/ /g;
cf655043d   Andy Whitcroft   update checkpatch...
2248
2249
2250
2251
  			print "$linenr > .$outline
  ";
  			print "$linenr > $curr_values
  ";
1f65f947a   Andy Whitcroft   checkpatch: add c...
2252
2253
  			print "$linenr >  $curr_vars
  ";
c2fdda0df   Andy Whitcroft   update checkpatch...
2254
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
2255
  		$prev_values = substr($curr_values, -1);
00df344fd   Andy Whitcroft   update checkpatch...
2256
2257
  #ignore lines not being added
  		if ($line=~/^[^\+]/) {next;}
653d4876b   Andy Whitcroft   update checkpatch...
2258
  # TEST: allow direct testing of the type matcher.
7429c6903   Andy Whitcroft   checkpatch: impro...
2259
2260
  		if ($dbg_type) {
  			if ($line =~ /^.\s*$Declare\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2261
2262
2263
  				ERROR("TEST_TYPE",
  				      "TEST: is type
  " . $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
2264
  			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2265
2266
2267
  				ERROR("TEST_NOT_TYPE",
  				      "TEST: is not type ($1 is)
  ". $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
2268
  			}
653d4876b   Andy Whitcroft   update checkpatch...
2269
2270
  			next;
  		}
a1ef277e2   Andy Whitcroft   checkpatch: add t...
2271
2272
  # TEST: allow direct testing of the attribute matcher.
  		if ($dbg_attr) {
9360b0e50   Andy Whitcroft   checkpatch: exten...
2273
  			if ($line =~ /^.\s*$Modifier\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2274
2275
2276
  				ERROR("TEST_ATTR",
  				      "TEST: is attr
  " . $herecurr);
9360b0e50   Andy Whitcroft   checkpatch: exten...
2277
  			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2278
2279
2280
  				ERROR("TEST_NOT_ATTR",
  				      "TEST: is not attr ($1 is)
  ". $herecurr);
a1ef277e2   Andy Whitcroft   checkpatch: add t...
2281
2282
2283
  			}
  			next;
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2284

f0a594c1c   Andy Whitcroft   update checkpatch...
2285
  # check for initialisation to aggregates open brace on the next line
99423c206   Andy Whitcroft   checkpatch: fix _...
2286
2287
  		if ($line =~ /^.\s*{/ &&
  		    $prevline =~ /(?:^|[^=])=\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2288
2289
2290
  			ERROR("OPEN_BRACE",
  			      "that open brace { should be on the previous line
  " . $hereprev);
f0a594c1c   Andy Whitcroft   update checkpatch...
2291
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2292
2293
2294
2295
2296
  #
  # Checks which are anchored on the added line.
  #
  
  # check for malformed paths in #include statements (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
2297
  		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876b   Andy Whitcroft   update checkpatch...
2298
2299
  			my $path = $1;
  			if ($path =~ m{//}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2300
  				ERROR("MALFORMED_INCLUDE",
495e9d846   Joe Perches   checkpatch: warn ...
2301
2302
2303
2304
2305
2306
2307
  				      "malformed #include filename
  " . $herecurr);
  			}
  			if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
  				ERROR("UAPI_INCLUDE",
  				      "No #include in ...include/uapi/... should use a uapi/ path prefix
  " . $herecurr);
653d4876b   Andy Whitcroft   update checkpatch...
2308
  			}
653d4876b   Andy Whitcroft   update checkpatch...
2309
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2310

0a920b5b6   Andy Whitcroft   add a trivial pat...
2311
  # no C99 // comments
00df344fd   Andy Whitcroft   update checkpatch...
2312
  		if ($line =~ m{//}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2313
2314
2315
  			ERROR("C99_COMMENTS",
  			      "do not use C99 // comments
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2316
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2317
  		# Remove C99 comments.
0a920b5b6   Andy Whitcroft   add a trivial pat...
2318
  		$line =~ s@//.*@@;
6c72ffaab   Andy Whitcroft   update checkpatch...
2319
  		$opline =~ s@//.*@@;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2320

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2321
2322
2323
2324
2325
2326
2327
2328
2329
  # EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
  # the whole statement.
  #print "APW <$lines[$realline_next - 1]>
  ";
  		if (defined $realline_next &&
  		    exists $lines[$realline_next - 1] &&
  		    !defined $suppress_export{$realline_next} &&
  		    ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
  		     $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3cbf62df3   Andy Whitcroft   checkpatch: handl...
2330
2331
2332
2333
  			# Handle definitions which produce identifiers with
  			# a prefix:
  			#   XXX(foo);
  			#   EXPORT_SYMBOL(something_foo);
653d4876b   Andy Whitcroft   update checkpatch...
2334
  			my $name = $1;
87a538771   Andy Whitcroft   checkpatch: fix E...
2335
2336
  			if ($stat =~ /^(?:.\s*}\s*
  )?.([A-Z_]+)\s*\(\s*($Ident)/ &&
3cbf62df3   Andy Whitcroft   checkpatch: handl...
2337
2338
2339
2340
2341
2342
  			    $name =~ /^${Ident}_$2/) {
  #print "FOO C name<$name>
  ";
  				$suppress_export{$realline_next} = 1;
  
  			} elsif ($stat !~ /(?:
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2343
2344
  				
  .}\s*$|
480120586   Andy Whitcroft   checkpatch: DEFIN...
2345
2346
2347
  				^.DEFINE_$Ident\(\Q$name\E\)|
  				^.DECLARE_$Ident\(\Q$name\E\)|
  				^.LIST_HEAD\(\Q$name\E\)|
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2348
2349
  				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
  				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
480120586   Andy Whitcroft   checkpatch: DEFIN...
2350
  			    )/x) {
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2351
2352
2353
2354
2355
  #print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>
  ";
  				$suppress_export{$realline_next} = 2;
  			} else {
  				$suppress_export{$realline_next} = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2356
2357
  			}
  		}
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
  		if (!defined $suppress_export{$linenr} &&
  		    $prevline =~ /^.\s*$/ &&
  		    ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
  		     $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
  #print "FOO B <$lines[$linenr - 1]>
  ";
  			$suppress_export{$linenr} = 2;
  		}
  		if (defined $suppress_export{$linenr} &&
  		    $suppress_export{$linenr} == 2) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2368
2369
2370
  			WARN("EXPORT_SYMBOL",
  			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable
  " . $herecurr);
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2371
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2372

5150bda43   Joe Eloff   checkpatch: chang...
2373
  # check for global initialisers.
c45dcabd2   Andy Whitcroft   update checkpatch...
2374
  		if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2375
2376
2377
  			ERROR("GLOBAL_INITIALISERS",
  			      "do not initialise globals to 0 or NULL
  " .
f0a594c1c   Andy Whitcroft   update checkpatch...
2378
2379
  				$herecurr);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2380
  # check for static initialisers.
2d1bafd79   Andy Whitcroft   checkpatch: do no...
2381
  		if ($line =~ /\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2382
2383
2384
  			ERROR("INITIALISED_STATIC",
  			      "do not initialise statics to 0 or NULL
  " .
de7d4f0e1   Andy Whitcroft   update checkpatch...
2385
  				$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2386
  		}
cb710eca6   Joe Perches   scripts/checkpatc...
2387
2388
  # check for static const char * arrays.
  		if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2389
2390
2391
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static const char * array should probably be static const char * const
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
2392
2393
2394
2395
2396
  				$herecurr);
                 }
  
  # check for static char foo[] = "bar" declarations.
  		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2397
2398
2399
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static char array declaration should probably be static const char
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
2400
2401
  				$herecurr);
                 }
93ed0e2d0   Joe Perches   scripts/checkpatc...
2402
2403
  # check for declarations of struct pci_device_id
  		if ($line =~ /\bstruct\s+pci_device_id\s+\w+\s*\[\s*\]\s*\=\s*\{/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2404
2405
2406
  			WARN("DEFINE_PCI_DEVICE_TABLE",
  			     "Use DEFINE_PCI_DEVICE_TABLE for struct pci_device_id
  " . $herecurr);
93ed0e2d0   Joe Perches   scripts/checkpatc...
2407
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2408
2409
2410
  # check for new typedefs, only function parameters and sparse annotations
  # make sense.
  		if ($line =~ /\btypedef\s/ &&
8054576dc   Andy Whitcroft   checkpatch: loose...
2411
  		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2412
  		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
2413
  		    $line !~ /\b$typeTypedefs\b/ &&
653d4876b   Andy Whitcroft   update checkpatch...
2414
  		    $line !~ /\b__bitwise(?:__|)\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2415
2416
2417
  			WARN("NEW_TYPEDEFS",
  			     "do not add new typedefs
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2418
2419
2420
  		}
  
  # * goes on variable not on type
65863862b   Andy Whitcroft   checkpatch: dissa...
2421
  		# (char*[ const])
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
2422
2423
2424
2425
  		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
  			#print "AA<$1>
  ";
  			my ($from, $to) = ($2, $2);
65863862b   Andy Whitcroft   checkpatch: dissa...
2426
2427
2428
2429
2430
2431
  
  			# Should start with a space.
  			$to =~ s/^(\S)/ $1/;
  			# Should not end with a space.
  			$to =~ s/\s+$//;
  			# '*'s should not have spaces between.
f9a0b3d17   Andy Whitcroft   checkpatch: type/...
2432
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
2433
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
2434

65863862b   Andy Whitcroft   checkpatch: dissa...
2435
2436
2437
  			#print "from<$from> to<$to>
  ";
  			if ($from ne $to) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2438
2439
2440
  				ERROR("POINTER_LOCATION",
  				      "\"(foo$from)\" should be \"(foo$to)\"
  " .  $herecurr);
65863862b   Andy Whitcroft   checkpatch: dissa...
2441
  			}
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
2442
2443
2444
2445
2446
  		}
  		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
  			#print "BB<$1>
  ";
  			my ($from, $to, $ident) = ($2, $2, $3);
65863862b   Andy Whitcroft   checkpatch: dissa...
2447
2448
2449
2450
2451
2452
  
  			# Should start with a space.
  			$to =~ s/^(\S)/ $1/;
  			# Should not end with a space.
  			$to =~ s/\s+$//;
  			# '*'s should not have spaces between.
f9a0b3d17   Andy Whitcroft   checkpatch: type/...
2453
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
2454
2455
2456
  			}
  			# Modifiers should have spaces.
  			$to =~ s/(\b$Modifier$)/$1 /;
d8aaf1214   Andy Whitcroft   update checkpatch...
2457

667026e7b   Andy Whitcroft   checkpatch: a mod...
2458
2459
2460
  			#print "from<$from> to<$to> ident<$ident>
  ";
  			if ($from ne $to && $ident !~ /^$Modifier$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2461
2462
2463
  				ERROR("POINTER_LOCATION",
  				      "\"foo${from}bar\" should be \"foo${to}bar\"
  " .  $herecurr);
65863862b   Andy Whitcroft   checkpatch: dissa...
2464
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2465
2466
2467
2468
2469
2470
2471
2472
2473
  		}
  
  # # no BUG() or BUG_ON()
  # 		if ($line =~ /\b(BUG|BUG_ON)\b/) {
  # 			print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()
  ";
  # 			print "$herecurr";
  # 			$clean = 0;
  # 		}
8905a67c6   Andy Whitcroft   update checkpatch...
2474
  		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2475
2476
2477
  			WARN("LINUX_VERSION_CODE",
  			     "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
2478
  		}
17441227f   Joe Perches   checkpatch: add w...
2479
2480
  # check for uses of printk_ratelimit
  		if ($line =~ /\bprintk_ratelimit\s*\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2481
2482
2483
  			WARN("PRINTK_RATELIMITED",
  "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit
  " . $herecurr);
17441227f   Joe Perches   checkpatch: add w...
2484
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2485
2486
2487
  # printk should use KERN_* levels.  Note that follow on printk's on the
  # same line do not need a level, so we use the current block context
  # to try and find and validate the current printk.  In summary the current
25985edce   Lucas De Marchi   Fix common misspe...
2488
  # printk includes all preceding printk's which have no newline on the end.
00df344fd   Andy Whitcroft   update checkpatch...
2489
  # we assume the first bad printk is the one to report.
f0a594c1c   Andy Whitcroft   update checkpatch...
2490
  		if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
00df344fd   Andy Whitcroft   update checkpatch...
2491
2492
2493
2494
  			my $ok = 0;
  			for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
  				#print "CHECK<$lines[$ln - 1]
  ";
25985edce   Lucas De Marchi   Fix common misspe...
2495
  				# we have a preceding printk if it ends
00df344fd   Andy Whitcroft   update checkpatch...
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
  				# with "
  " ignore it, else it is to blame
  				if ($lines[$ln - 1] =~ m{\bprintk\(}) {
  					if ($rawlines[$ln - 1] !~ m{\
  "}) {
  						$ok = 1;
  					}
  					last;
  				}
  			}
  			if ($ok == 0) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2507
2508
2509
  				WARN("PRINTK_WITHOUT_KERN_LEVEL",
  				     "printk() should include KERN_ facility level
  " . $herecurr);
00df344fd   Andy Whitcroft   update checkpatch...
2510
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2511
  		}
243f3803c   Joe Perches   checkpatch: sugge...
2512
2513
2514
2515
  		if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
  			my $orig = $1;
  			my $level = lc($orig);
  			$level = "warn" if ($level eq "warning");
8f26b8376   Joe Perches   checkpatch: updat...
2516
2517
  			my $level2 = $level;
  			$level2 = "dbg" if ($level eq "debug");
243f3803c   Joe Perches   checkpatch: sugge...
2518
  			WARN("PREFER_PR_LEVEL",
8f26b8376   Joe Perches   checkpatch: updat...
2519
2520
  			     "Prefer netdev_$level2(netdev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...
  " . $herecurr);
243f3803c   Joe Perches   checkpatch: sugge...
2521
2522
2523
2524
2525
2526
2527
  		}
  
  		if ($line =~ /\bpr_warning\s*\(/) {
  			WARN("PREFER_PR_LEVEL",
  			     "Prefer pr_warn(... to pr_warning(...
  " . $herecurr);
  		}
dc1393130   Joe Perches   checkpatch: prefe...
2528
2529
2530
2531
2532
2533
2534
2535
2536
  		if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
  			my $orig = $1;
  			my $level = lc($orig);
  			$level = "warn" if ($level eq "warning");
  			$level = "dbg" if ($level eq "debug");
  			WARN("PREFER_DEV_LEVEL",
  			     "Prefer dev_$level(... to dev_printk(KERN_$orig, ...
  " . $herecurr);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2537
2538
  # function brace can't be on same line, except for #defines of do while,
  # or if closed on same line
c45dcabd2   Andy Whitcroft   update checkpatch...
2539
2540
  		if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and
  		    !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2541
2542
2543
  			ERROR("OPEN_BRACE",
  			      "open brace '{' following function declarations go on the next line
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2544
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2545

8905a67c6   Andy Whitcroft   update checkpatch...
2546
2547
2548
  # open braces for enum, union and struct go on the same line.
  		if ($line =~ /^.\s*{/ &&
  		    $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2549
2550
2551
  			ERROR("OPEN_BRACE",
  			      "open brace '{' following $1 go on the same line
  " . $hereprev);
8905a67c6   Andy Whitcroft   update checkpatch...
2552
  		}
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
2553
2554
  # missing space after union, struct or enum definition
  		if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?(?:\s+$Ident)?[=\{]/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2555
2556
2557
  		    WARN("SPACING",
  			 "missing space after $1 definition
  " . $herecurr);
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
2558
  		}
8d31cfcec   Andy Whitcroft   checkpatch: check...
2559
2560
  # check for spacing round square brackets; allowed:
  #  1. with a type on the left -- int [] a;
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
2561
2562
  #  2. at the beginning of a line for slice initialisers -- [0...10] = 5,
  #  3. inside a curly brace -- = { [0...10] = 5 }
8d31cfcec   Andy Whitcroft   checkpatch: check...
2563
2564
2565
  		while ($line =~ /(.*?\s)\[/g) {
  			my ($where, $prefix) = ($-[1], $1);
  			if ($prefix !~ /$Type\s+$/ &&
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
2566
  			    ($where != 0 || $prefix !~ /^.\s+$/) &&
daebc534a   Andy Whitcroft   checkpatch: catch...
2567
  			    $prefix !~ /[{,]\s+$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2568
2569
2570
  				ERROR("BRACKET_SPACE",
  				      "space prohibited before open square bracket '['
  " . $herecurr);
8d31cfcec   Andy Whitcroft   checkpatch: check...
2571
2572
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2573
  # check for spaces between functions and their parentheses.
6c72ffaab   Andy Whitcroft   update checkpatch...
2574
  		while ($line =~ /($Ident)\s+\(/g) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2575
  			my $name = $1;
773647a09   Andy Whitcroft   update checkpatch...
2576
2577
  			my $ctx_before = substr($line, 0, $-[1]);
  			my $ctx = "$ctx_before$name";
c2fdda0df   Andy Whitcroft   update checkpatch...
2578
2579
  
  			# Ignore those directives where spaces _are_ permitted.
773647a09   Andy Whitcroft   update checkpatch...
2580
2581
2582
2583
2584
2585
  			if ($name =~ /^(?:
  				if|for|while|switch|return|case|
  				volatile|__volatile__|
  				__attribute__|format|__extension__|
  				asm|__asm__)$/x)
  			{
c2fdda0df   Andy Whitcroft   update checkpatch...
2586
2587
2588
2589
  
  			# cpp #define statements have non-optional spaces, ie
  			# if there is a space between the name and the open
  			# parenthesis it is simply not a parameter group.
c45dcabd2   Andy Whitcroft   update checkpatch...
2590
  			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
2591
2592
  
  			# cpp #elif statement condition may start with a (
c45dcabd2   Andy Whitcroft   update checkpatch...
2593
  			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2594
2595
2596
  
  			# If this whole things ends with a type its most
  			# likely a typedef for a function.
773647a09   Andy Whitcroft   update checkpatch...
2597
  			} elsif ($ctx =~ /$Type$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2598
2599
  
  			} else {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2600
2601
2602
  				WARN("SPACING",
  				     "space prohibited between function name and open parenthesis '('
  " . $herecurr);
6c72ffaab   Andy Whitcroft   update checkpatch...
2603
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
2604
  		}
9a4cad4e2   Eric Nelson   checkpatch: check...
2605
2606
2607
2608
2609
2610
2611
  
  # check for whitespace before a non-naked semicolon
  		if ($line =~ /^\+.*\S\s+;/) {
  			CHK("SPACING",
  			    "space prohibited before semicolon
  " . $herecurr);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2612
  # Check operator spacing.
0a920b5b6   Andy Whitcroft   add a trivial pat...
2613
  		if (!($line=~/\#\s*include/)) {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2614
2615
2616
2617
  			my $ops = qr{
  				<<=|>>=|<=|>=|==|!=|
  				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
  				=>|->|<<|>>|<|>|=|!|~|
1f65f947a   Andy Whitcroft   checkpatch: add c...
2618
2619
  				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
  				\?|:
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2620
  			}x;
cf655043d   Andy Whitcroft   update checkpatch...
2621
  			my @elements = split(/($ops|;)/, $opline);
00df344fd   Andy Whitcroft   update checkpatch...
2622
  			my $off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
2623
2624
  
  			my $blank = copy_spacing($opline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2625
  			for (my $n = 0; $n < $#elements; $n += 2) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2626
  				$off += length($elements[$n]);
25985edce   Lucas De Marchi   Fix common misspe...
2627
  				# Pick up the preceding and succeeding characters.
773647a09   Andy Whitcroft   update checkpatch...
2628
2629
2630
2631
2632
2633
  				my $ca = substr($opline, 0, $off);
  				my $cc = '';
  				if (length($opline) >= ($off + length($elements[$n + 1]))) {
  					$cc = substr($opline, $off + length($elements[$n + 1]));
  				}
  				my $cb = "$ca$;$cc";
4a0df2ef4   Andy Whitcroft   update checkpatch...
2634
2635
2636
  				my $a = '';
  				$a = 'V' if ($elements[$n] ne '');
  				$a = 'W' if ($elements[$n] =~ /\s$/);
cf655043d   Andy Whitcroft   update checkpatch...
2637
  				$a = 'C' if ($elements[$n] =~ /$;$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2638
2639
  				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
  				$a = 'O' if ($elements[$n] eq '');
773647a09   Andy Whitcroft   update checkpatch...
2640
  				$a = 'E' if ($ca =~ /^\s*$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2641

0a920b5b6   Andy Whitcroft   add a trivial pat...
2642
  				my $op = $elements[$n + 1];
4a0df2ef4   Andy Whitcroft   update checkpatch...
2643
2644
  
  				my $c = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2645
  				if (defined $elements[$n + 2]) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2646
2647
  					$c = 'V' if ($elements[$n + 2] ne '');
  					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043d   Andy Whitcroft   update checkpatch...
2648
  					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2649
2650
  					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
  					$c = 'O' if ($elements[$n + 2] eq '');
8b1b33786   Andy Whitcroft   checkpatch: fix c...
2651
  					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2652
2653
  				} else {
  					$c = 'E';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2654
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2655
2656
2657
  				my $ctx = "${a}x${c}";
  
  				my $at = "(ctx:$ctx)";
6c72ffaab   Andy Whitcroft   update checkpatch...
2658
  				my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e1   Andy Whitcroft   update checkpatch...
2659
2660
  				my $hereptr = "$hereline$ptr
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2661

74048ed81   Andy Whitcroft   checkpatch: varia...
2662
  				# Pull out the value of this operator.
6c72ffaab   Andy Whitcroft   update checkpatch...
2663
  				my $op_type = substr($curr_values, $off + 1, 1);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2664

1f65f947a   Andy Whitcroft   checkpatch: add c...
2665
2666
  				# Get the full operator variant.
  				my $opv = $op . substr($curr_vars, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
2667
2668
2669
  				# Ignore operators passed as parameters.
  				if ($op_type ne 'V' &&
  				    $ca =~ /\s$/ && $cc =~ /^\s*,/) {
cf655043d   Andy Whitcroft   update checkpatch...
2670
2671
  #				# Ignore comments
  #				} elsif ($op =~ /^$;+$/) {
13214adf7   Andy Whitcroft   update checkpatch...
2672

d8aaf1214   Andy Whitcroft   update checkpatch...
2673
  				# ; should have either the end of line or a space or \ after it
13214adf7   Andy Whitcroft   update checkpatch...
2674
  				} elsif ($op eq ';') {
cf655043d   Andy Whitcroft   update checkpatch...
2675
2676
  					if ($ctx !~ /.x[WEBC]/ &&
  					    $cc !~ /^\\/ && $cc !~ /^;/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2677
2678
2679
  						ERROR("SPACING",
  						      "space required after that '$op' $at
  " . $hereptr);
d8aaf1214   Andy Whitcroft   update checkpatch...
2680
2681
2682
2683
  					}
  
  				# // is a comment
  				} elsif ($op eq '//') {
0a920b5b6   Andy Whitcroft   add a trivial pat...
2684

1f65f947a   Andy Whitcroft   checkpatch: add c...
2685
2686
2687
2688
  				# No spaces for:
  				#   ->
  				#   :   when part of a bitfield
  				} elsif ($op eq '->' || $opv eq ':B') {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2689
  					if ($ctx =~ /Wx.|.xW/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2690
2691
2692
  						ERROR("SPACING",
  						      "spaces prohibited around that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2693
2694
2695
2696
  					}
  
  				# , must have a space on the right.
  				} elsif ($op eq ',') {
cf655043d   Andy Whitcroft   update checkpatch...
2697
  					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2698
2699
2700
  						ERROR("SPACING",
  						      "space required after that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2701
  					}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2702
  				# '*' as part of a type definition -- reported already.
74048ed81   Andy Whitcroft   checkpatch: varia...
2703
  				} elsif ($opv eq '*_') {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2704
2705
2706
2707
2708
2709
2710
  					#warn "'*' is part of type
  ";
  
  				# unary operators should have a space before and
  				# none after.  May be left adjacent to another
  				# unary operator, or a cast
  				} elsif ($op eq '!' || $op eq '~' ||
74048ed81   Andy Whitcroft   checkpatch: varia...
2711
  					 $opv eq '*U' || $opv eq '-U' ||
0d413866c   Andy Whitcroft   checkpatch: value...
2712
  					 $opv eq '&U' || $opv eq '&&U') {
cf655043d   Andy Whitcroft   update checkpatch...
2713
  					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2714
2715
2716
  						ERROR("SPACING",
  						      "space required before that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2717
  					}
a3340b357   Andy Whitcroft   checkpatch: point...
2718
  					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
171ae1a49   Andy Whitcroft   update checkpatch...
2719
2720
2721
  						# A unary '*' may be const
  
  					} elsif ($ctx =~ /.xW/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2722
2723
2724
  						ERROR("SPACING",
  						      "space prohibited after that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2725
2726
2727
2728
  					}
  
  				# unary ++ and unary -- are allowed no space on one side.
  				} elsif ($op eq '++' or $op eq '--') {
773647a09   Andy Whitcroft   update checkpatch...
2729
  					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2730
2731
2732
  						ERROR("SPACING",
  						      "space required one side of that '$op' $at
  " . $hereptr);
773647a09   Andy Whitcroft   update checkpatch...
2733
2734
2735
  					}
  					if ($ctx =~ /Wx[BE]/ ||
  					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2736
2737
2738
  						ERROR("SPACING",
  						      "space prohibited before that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2739
  					}
773647a09   Andy Whitcroft   update checkpatch...
2740
  					if ($ctx =~ /ExW/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2741
2742
2743
  						ERROR("SPACING",
  						      "space prohibited after that '$op' $at
  " . $hereptr);
653d4876b   Andy Whitcroft   update checkpatch...
2744
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2745

773647a09   Andy Whitcroft   update checkpatch...
2746

0a920b5b6   Andy Whitcroft   add a trivial pat...
2747
  				# << and >> may either have or not have spaces both sides
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2748
2749
2750
  				} elsif ($op eq '<<' or $op eq '>>' or
  					 $op eq '&' or $op eq '^' or $op eq '|' or
  					 $op eq '+' or $op eq '-' or
c2fdda0df   Andy Whitcroft   update checkpatch...
2751
2752
  					 $op eq '*' or $op eq '/' or
  					 $op eq '%')
0a920b5b6   Andy Whitcroft   add a trivial pat...
2753
  				{
773647a09   Andy Whitcroft   update checkpatch...
2754
  					if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2755
2756
2757
  						ERROR("SPACING",
  						      "need consistent spacing around '$op' $at
  " .
de7d4f0e1   Andy Whitcroft   update checkpatch...
2758
  							$hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2759
  					}
1f65f947a   Andy Whitcroft   checkpatch: add c...
2760
2761
2762
2763
  				# A colon needs no spaces before when it is
  				# terminating a case value or a label.
  				} elsif ($opv eq ':C' || $opv eq ':L') {
  					if ($ctx =~ /Wx./) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2764
2765
2766
  						ERROR("SPACING",
  						      "space prohibited before that '$op' $at
  " . $hereptr);
1f65f947a   Andy Whitcroft   checkpatch: add c...
2767
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2768
  				# All the others need spaces both sides.
cf655043d   Andy Whitcroft   update checkpatch...
2769
  				} elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947a   Andy Whitcroft   checkpatch: add c...
2770
  					my $ok = 0;
22f2a2ef9   Andy Whitcroft   update checkpatch...
2771
  					# Ignore email addresses <foo@bar>
1f65f947a   Andy Whitcroft   checkpatch: add c...
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
  					if (($op eq '<' &&
  					     $cc =~ /^\S+\@\S+>/) ||
  					    ($op eq '>' &&
  					     $ca =~ /<\S+\@\S+$/))
  					{
  					    	$ok = 1;
  					}
  
  					# Ignore ?:
  					if (($opv eq ':O' && $ca =~ /\?$/) ||
  					    ($op eq '?' && $cc =~ /^:/)) {
  					    	$ok = 1;
  					}
  
  					if ($ok == 0) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2787
2788
2789
  						ERROR("SPACING",
  						      "spaces required around that '$op' $at
  " . $hereptr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2790
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2791
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2792
  				$off += length($elements[$n + 1]);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2793
2794
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2795
2796
  # check for multiple assignments
  		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2797
2798
2799
  			CHK("MULTIPLE_ASSIGNMENTS",
  			    "multiple assignments should be avoided
  " . $herecurr);
f0a594c1c   Andy Whitcroft   update checkpatch...
2800
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
  ## # check for multiple declarations, allowing for a function declaration
  ## # continuation.
  ## 		if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
  ## 		    $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
  ##
  ## 			# Remove any bracketed sections to ensure we do not
  ## 			# falsly report the parameters of functions.
  ## 			my $ln = $line;
  ## 			while ($ln =~ s/\([^\(\)]*\)//g) {
  ## 			}
  ## 			if ($ln =~ /,/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2812
2813
2814
  ## 				WARN("MULTIPLE_DECLARATION",
  ##				     "declaring multiple variables together should be avoided
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2815
2816
  ## 			}
  ## 		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2817

0a920b5b6   Andy Whitcroft   add a trivial pat...
2818
  #need space before brace following if, while, etc
22f2a2ef9   Andy Whitcroft   update checkpatch...
2819
2820
  		if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
  		    $line =~ /do{/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2821
2822
2823
  			ERROR("SPACING",
  			      "space required before the open brace '{'
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2824
2825
2826
2827
2828
  		}
  
  # closing brace should have a space following it when it has anything
  # on the line
  		if ($line =~ /}(?!(?:,|;|\)))\S/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2829
2830
2831
  			ERROR("SPACING",
  			      "space required after that close brace '}'
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2832
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2833
2834
  # check spacing on square brackets
  		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2835
2836
2837
  			ERROR("SPACING",
  			      "space prohibited after that open square bracket '['
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2838
2839
  		}
  		if ($line =~ /\s\]/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2840
2841
2842
  			ERROR("SPACING",
  			      "space prohibited before that close square bracket ']'
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2843
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
2844
  # check spacing on parentheses
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2845
2846
  		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
  		    $line !~ /for\s*\(\s+;/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2847
2848
2849
  			ERROR("SPACING",
  			      "space prohibited after that open parenthesis '('
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2850
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2851
  		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2852
2853
  		    $line !~ /for\s*\(.*;\s+\)/ &&
  		    $line !~ /:\s+\)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2854
2855
2856
  			ERROR("SPACING",
  			      "space prohibited before that close parenthesis ')'
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2857
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2858
  #goto labels aren't indented, allow a single space however
4a0df2ef4   Andy Whitcroft   update checkpatch...
2859
  		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b6   Andy Whitcroft   add a trivial pat...
2860
  		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2861
2862
2863
  			WARN("INDENTED_LABEL",
  			     "labels should not be indented
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2864
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
2865
2866
2867
2868
  # Return is not a function.
  		if (defined($stat) && $stat =~ /^.\s*return(\s*)(\(.*);/s) {
  			my $spacing = $1;
  			my $value = $2;
86f9d059c   Andy Whitcroft   checkpatch: allow...
2869
  			# Flatten any parentheses
fb2d2c1b5   Andy Whitcroft   checkpatch: ensur...
2870
2871
  			$value =~ s/\(/ \(/g;
  			$value =~ s/\)/\) /g;
e01886ada   Andy Whitcroft   checkpatch: fix '...
2872
  			while ($value =~ s/\[[^\[\]]*\]/1/ ||
63f17f897   Andy Whitcroft   checkpatch: allow...
2873
2874
2875
2876
  			       $value !~ /(?:$Ident|-?$Constant)\s*
  					     $Compare\s*
  					     (?:$Ident|-?$Constant)/x &&
  			       $value =~ s/\([^\(\)]*\)/1/) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2877
  			}
fb2d2c1b5   Andy Whitcroft   checkpatch: ensur...
2878
2879
2880
  #print "value<$value>
  ";
  			if ($value =~ /^\s*(?:$Ident|-?$Constant)\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2881
2882
2883
  				ERROR("RETURN_PARENTHESES",
  				      "return is not a function, parentheses are not required
  " . $herecurr);
c45dcabd2   Andy Whitcroft   update checkpatch...
2884
2885
  
  			} elsif ($spacing !~ /\s+/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2886
2887
2888
  				ERROR("SPACING",
  				      "space required before the open parenthesis '('
  " . $herecurr);
c45dcabd2   Andy Whitcroft   update checkpatch...
2889
2890
  			}
  		}
53a3c4487   Andy Whitcroft   checkpatch: retur...
2891
2892
2893
2894
  # Return of what appears to be an errno should normally be -'ve
  		if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
  			my $name = $1;
  			if ($name ne 'EOF' && $name ne 'ERROR') {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2895
2896
2897
  				WARN("USE_NEGATIVE_ERRNO",
  				     "return of an errno should typically be -ve (return -$1)
  " . $herecurr);
53a3c4487   Andy Whitcroft   checkpatch: retur...
2898
2899
  			}
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
2900

0a920b5b6   Andy Whitcroft   add a trivial pat...
2901
  # Need a space before open parenthesis after if, while etc
4a0df2ef4   Andy Whitcroft   update checkpatch...
2902
  		if ($line=~/\b(if|while|for|switch)\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2903
2904
  			ERROR("SPACING", "space required before the open parenthesis '('
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2905
  		}
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
2906
2907
  # Check for illegal assignment in if conditional -- and check for trailing
  # statements after the conditional.
170d3a226   Andy Whitcroft   checkpatch: handl...
2908
  		if ($line =~ /do\s*(?!{)/) {
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2909
2910
2911
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
170d3a226   Andy Whitcroft   checkpatch: handl...
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
  			my ($stat_next) = ctx_statement_block($line_nr_next,
  						$remain_next, $off_next);
  			$stat_next =~ s/
  ./
   /g;
  			##print "stat<$stat> stat_next<$stat_next>
  ";
  
  			if ($stat_next =~ /^\s*while\b/) {
  				# If the statement carries leading newlines,
  				# then count those as offsets.
  				my ($whitespace) =
  					($stat_next =~ /^((?:\s*
  [+-])*\s*)/s);
  				my $offset =
  					statement_rawlines($whitespace) - 1;
  
  				$suppress_whiletrailers{$line_nr_next +
  								$offset} = 1;
  			}
  		}
  		if (!defined $suppress_whiletrailers{$linenr} &&
  		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
171ae1a49   Andy Whitcroft   update checkpatch...
2935
  			my ($s, $c) = ($stat, $cond);
8905a67c6   Andy Whitcroft   update checkpatch...
2936

b53c8e104   Andy Whitcroft   checkpatch: ensur...
2937
  			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2938
2939
2940
  				ERROR("ASSIGN_IN_IF",
  				      "do not use assignment in if condition
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
2941
2942
2943
2944
  			}
  
  			# Find out what is on the end of the line after the
  			# conditional.
773647a09   Andy Whitcroft   update checkpatch...
2945
  			substr($s, 0, length($c), '');
8905a67c6   Andy Whitcroft   update checkpatch...
2946
2947
  			$s =~ s/
  .*//g;
13214adf7   Andy Whitcroft   update checkpatch...
2948
  			$s =~ s/$;//g; 	# Remove any comments
53210168f   Andy Whitcroft   checkpatch: tough...
2949
2950
  			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
  			    $c !~ /}\s*while\s*/)
773647a09   Andy Whitcroft   update checkpatch...
2951
  			{
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2952
2953
2954
2955
  				# Find out how long the conditional actually is.
  				my @newlines = ($c =~ /
  /gs);
  				my $cond_lines = 1 + $#newlines;
42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
2956
  				my $stat_real = '';
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2957

42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
2958
2959
2960
  				$stat_real = raw_line($linenr, $cond_lines)
  							. "
  " if ($cond_lines);
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2961
2962
2963
2964
  				if (defined($stat_real) && $cond_lines > 1) {
  					$stat_real = "[...]
  $stat_real";
  				}
000d1cc18   Joe Perches   checkpatch.pl: ad...
2965
2966
2967
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr . $stat_real);
8905a67c6   Andy Whitcroft   update checkpatch...
2968
2969
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
  # Check for bitwise tests written as boolean
  		if ($line =~ /
  			(?:
  				(?:\[|\(|\&\&|\|\|)
  				\s*0[xX][0-9]+\s*
  				(?:\&\&|\|\|)
  			|
  				(?:\&\&|\|\|)
  				\s*0[xX][0-9]+\s*
  				(?:\&\&|\|\||\)|\])
  			)/x)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
2982
2983
2984
  			WARN("HEXADECIMAL_BOOLEAN_TEST",
  			     "boolean test with hexadecimal, perhaps just 1 \& or \|?
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
2985
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
2986
  # if and else should not have general statements after it
13214adf7   Andy Whitcroft   update checkpatch...
2987
2988
2989
2990
  		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
  			my $s = $1;
  			$s =~ s/$;//g; 	# Remove any comments
  			if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2991
2992
2993
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
2994
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2995
  		}
396677823   Andy Whitcroft   checkpatch: if sh...
2996
2997
  # if should not continue a brace
  		if ($line =~ /}\s*if\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2998
2999
3000
  			ERROR("TRAILING_STATEMENTS",
  			      "trailing statements should be on next line
  " .
396677823   Andy Whitcroft   checkpatch: if sh...
3001
3002
  				$herecurr);
  		}
a1080bf80   Andy Whitcroft   checkpatch: case/...
3003
3004
3005
  # case and default should not have general statements after them
  		if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
  		    $line !~ /\G(?:
3fef12d6c   Andy Whitcroft   checkpatch: allow...
3006
  			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf80   Andy Whitcroft   checkpatch: case/...
3007
3008
3009
  			\s*return\s+
  		    )/xg)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
3010
3011
3012
  			ERROR("TRAILING_STATEMENTS",
  			      "trailing statements should be on next line
  " . $herecurr);
a1080bf80   Andy Whitcroft   checkpatch: case/...
3013
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3014
3015
3016
3017
3018
  
  		# Check for }<nl>else {, these must be at the same
  		# indent level to be relevant to each other.
  		if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
  						$previndent == $indent) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3019
3020
3021
  			ERROR("ELSE_AFTER_BRACE",
  			      "else should follow close brace '}'
  " . $hereprev);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3022
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
3023
3024
3025
3026
3027
3028
  		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and
  						$previndent == $indent) {
  			my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
  
  			# Find out what is on the end of the line after the
  			# conditional.
773647a09   Andy Whitcroft   update checkpatch...
3029
  			substr($s, 0, length($c), '');
c2fdda0df   Andy Whitcroft   update checkpatch...
3030
3031
3032
3033
  			$s =~ s/
  .*//g;
  
  			if ($s =~ /^\s*;/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3034
3035
3036
  				ERROR("WHILE_AFTER_BRACE",
  				      "while should follow close brace '}'
  " . $hereprev);
c2fdda0df   Andy Whitcroft   update checkpatch...
3037
3038
  			}
  		}
323c1260b   Joe Perches   checkpatch: warn ...
3039
3040
3041
3042
3043
  #CamelCase
  		while ($line =~ m{($Constant|$Lval)}g) {
  			my $var = $1;
  			if ($var !~ /$Constant/ &&
  			    $var =~ /[A-Z]\w*[a-z]|[a-z]\w*[A-Z]/ &&
be987d9f8   Joe Perches   checkpatch: impro...
3044
  			    $var !~ /"^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
323c1260b   Joe Perches   checkpatch: warn ...
3045
3046
3047
3048
3049
3050
3051
  			    !defined $camelcase{$var}) {
  				$camelcase{$var} = 1;
  				WARN("CAMELCASE",
  				     "Avoid CamelCase: <$var>
  " . $herecurr);
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3052
3053
  
  #no spaces allowed after \ in define
c45dcabd2   Andy Whitcroft   update checkpatch...
3054
  		if ($line=~/\#\s*define.*\\\s$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3055
3056
3057
  			WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
  			     "Whitepspace after \\ makes next lines useless
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3058
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3059
  #warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
3060
  		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec483   Andy Whitcroft   checkpatch: reduc...
3061
3062
3063
3064
  			my $file = "$1.h";
  			my $checkfile = "include/linux/$file";
  			if (-f "$root/$checkfile" &&
  			    $realfile ne $checkfile &&
7840a94cd   Wolfram Sang   checkpatch: refac...
3065
  			    $1 !~ /$allowed_asm_includes/)
c45dcabd2   Andy Whitcroft   update checkpatch...
3066
  			{
e09dec483   Andy Whitcroft   checkpatch: reduc...
3067
  				if ($realfile =~ m{^arch/}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3068
3069
3070
  					CHK("ARCH_INCLUDE_LINUX",
  					    "Consider using #include <linux/$file> instead of <asm/$file>
  " . $herecurr);
e09dec483   Andy Whitcroft   checkpatch: reduc...
3071
  				} else {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3072
3073
3074
  					WARN("INCLUDE_LINUX",
  					     "Use #include <linux/$file> instead of <asm/$file>
  " . $herecurr);
e09dec483   Andy Whitcroft   checkpatch: reduc...
3075
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3076
3077
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3078
3079
  # multi-statement macros should be enclosed in a do while loop, grab the
  # first statement and ensure its the whole macro if its not enclosed
cf655043d   Andy Whitcroft   update checkpatch...
3080
  # in a known good container
b8f96a31f   Andy Whitcroft   checkpatch: macro...
3081
3082
  		if ($realfile !~ m@/vmlinux.lds.h$@ &&
  		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf1214   Andy Whitcroft   update checkpatch...
3083
3084
  			my $ln = $linenr;
  			my $cnt = $realcnt;
c45dcabd2   Andy Whitcroft   update checkpatch...
3085
3086
  			my ($off, $dstat, $dcond, $rest);
  			my $ctx = '';
c45dcabd2   Andy Whitcroft   update checkpatch...
3087
  			($dstat, $dcond, $ln, $cnt, $off) =
f74bd1942   Andy Whitcroft   checkpatch: corre...
3088
3089
  				ctx_statement_block($linenr, $realcnt, 0);
  			$ctx = $dstat;
c45dcabd2   Andy Whitcroft   update checkpatch...
3090
3091
  			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>
  ";
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
3092
3093
  			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
3094

f74bd1942   Andy Whitcroft   checkpatch: corre...
3095
  			$dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
292f1a9b3   Andy Whitcroft   checkpatch: compl...
3096
  			$dstat =~ s/$;//g;
c45dcabd2   Andy Whitcroft   update checkpatch...
3097
3098
3099
3100
  			$dstat =~ s/\\
  .//g;
  			$dstat =~ s/^\s*//s;
  			$dstat =~ s/\s*$//s;
de7d4f0e1   Andy Whitcroft   update checkpatch...
3101

c45dcabd2   Andy Whitcroft   update checkpatch...
3102
  			# Flatten any parentheses and braces
bf30d6ede   Andy Whitcroft   checkpatch: compl...
3103
3104
  			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
  			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
c81769fdc   Andy Whitcroft   checkpatch: fix c...
3105
  			       $dstat =~ s/\[[^\[\]]*\]/1/)
bf30d6ede   Andy Whitcroft   checkpatch: compl...
3106
  			{
de7d4f0e1   Andy Whitcroft   update checkpatch...
3107
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
3108

e45bab8eb   Andy Whitcroft   checkpatch: handl...
3109
3110
3111
3112
3113
  			# Flatten any obvious string concatentation.
  			while ($dstat =~ s/("X*")\s*$Ident/$1/ ||
  			       $dstat =~ s/$Ident\s*("X*")/$1/)
  			{
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
3114
3115
3116
  			my $exceptions = qr{
  				$Declare|
  				module_param_named|
a0a0a7a94   Kees Cook   checkpatch: fix n...
3117
  				MODULE_PARM_DESC|
c45dcabd2   Andy Whitcroft   update checkpatch...
3118
3119
  				DECLARE_PER_CPU|
  				DEFINE_PER_CPU|
383099fd6   Andy Whitcroft   checkpatch: struc...
3120
  				__typeof__\(|
22fd2d3e4   Stefani Seibold   checkpatch.pl: ad...
3121
3122
  				union|
  				struct|
ea71a0a01   Andy Whitcroft   checkpatch: forma...
3123
3124
  				\.$Ident\s*=\s*|
  				^\"|\"$
c45dcabd2   Andy Whitcroft   update checkpatch...
3125
  			}x;
5eaa20b98   Andy Whitcroft   checkpatch: clean...
3126
3127
  			#print "REST<$rest> dstat<$dstat> ctx<$ctx>
  ";
f74bd1942   Andy Whitcroft   checkpatch: corre...
3128
3129
3130
  			if ($dstat ne '' &&
  			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
  			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
fd1b57ac7   Andy Whitcroft   checkpatch: high ...
3131
  			    $dstat !~ /^[!~-]?(?:$Ident|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo
b9df76ac7   Andy Whitcroft   checkpatch: allow...
3132
  			    $dstat !~ /^'X'$/ &&					# character constants
f74bd1942   Andy Whitcroft   checkpatch: corre...
3133
3134
  			    $dstat !~ /$exceptions/ &&
  			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
72f115f94   Andy Whitcroft   checkpatch: compl...
3135
  			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
f74bd1942   Andy Whitcroft   checkpatch: corre...
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
  			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
  			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
  			    $dstat !~ /^do\s*{/ &&					# do {...
  			    $dstat !~ /^\({/)						# ({...
  			{
  				$ctx =~ s/
  *$//;
  				my $herectx = $here . "
  ";
  				my $cnt = statement_rawlines($ctx);
  
  				for (my $n = 0; $n < $cnt; $n++) {
  					$herectx .= raw_line($linenr, $n) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
3150
  				}
f74bd1942   Andy Whitcroft   checkpatch: corre...
3151
3152
3153
3154
3155
  				if ($dstat =~ /;/) {
  					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
  					      "Macros with multiple statements should be enclosed in a do - while loop
  " . "$herectx");
  				} else {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3156
  					ERROR("COMPLEX_MACRO",
f74bd1942   Andy Whitcroft   checkpatch: corre...
3157
3158
  					      "Macros with complex values should be enclosed in parenthesis
  " . "$herectx");
d8aaf1214   Andy Whitcroft   update checkpatch...
3159
  				}
653d4876b   Andy Whitcroft   update checkpatch...
3160
  			}
5023d3472   Joe Perches   checkpatch: warn ...
3161

481eb486a   Joe Perches   checkpatch: exten...
3162
  # check for line continuations outside of #defines, preprocessor #, and asm
5023d3472   Joe Perches   checkpatch: warn ...
3163
3164
3165
  
  		} else {
  			if ($prevline !~ /^..*\\$/ &&
481eb486a   Joe Perches   checkpatch: exten...
3166
3167
  			    $line !~ /^\+\s*\#.*\\$/ &&		# preprocessor
  			    $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&	# asm
5023d3472   Joe Perches   checkpatch: warn ...
3168
3169
3170
3171
3172
  			    $line =~ /^\+.*\\$/) {
  				WARN("LINE_CONTINUATIONS",
  				     "Avoid unnecessary line continuations
  " . $herecurr);
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3173
  		}
b13edf7ff   Joe Perches   checkpatch: add c...
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
  # do {} while (0) macro tests:
  # single-statement macros do not need to be enclosed in do while (0) loop,
  # macro should not end with a semicolon
  		if ($^V && $^V ge 5.10.0 &&
  		    $realfile !~ m@/vmlinux.lds.h$@ &&
  		    $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
  			my $ln = $linenr;
  			my $cnt = $realcnt;
  			my ($off, $dstat, $dcond, $rest);
  			my $ctx = '';
  			($dstat, $dcond, $ln, $cnt, $off) =
  				ctx_statement_block($linenr, $realcnt, 0);
  			$ctx = $dstat;
  
  			$dstat =~ s/\\
  .//g;
  
  			if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
  				my $stmts = $2;
  				my $semis = $3;
  
  				$ctx =~ s/
  *$//;
  				my $cnt = statement_rawlines($ctx);
  				my $herectx = $here . "
  ";
  
  				for (my $n = 0; $n < $cnt; $n++) {
  					$herectx .= raw_line($linenr, $n) . "
  ";
  				}
ac8e97f8a   Joe Perches   checkpatch: add c...
3205
3206
  				if (($stmts =~ tr/;/;/) == 1 &&
  				    $stmts !~ /^\s*(if|while|for|switch)\b/) {
b13edf7ff   Joe Perches   checkpatch: add c...
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
  					WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
  					     "Single statement macros should not use a do {} while (0) loop
  " . "$herectx");
  				}
  				if (defined $semis && $semis ne "") {
  					WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
  					     "do {} while (0) macros should not be semicolon terminated
  " . "$herectx");
  				}
  			}
  		}
080ba9296   Mike Frysinger   checkpatch: try t...
3218
3219
3220
3221
3222
3223
  # make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
  # all assignments may have only one of the following with an assignment:
  #	.
  #	ALIGN(...)
  #	VMLINUX_SYMBOL(...)
  		if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3224
3225
3226
  			WARN("MISSING_VMLINUX_SYMBOL",
  			     "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols
  " . $herecurr);
080ba9296   Mike Frysinger   checkpatch: try t...
3227
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
3228
  # check for redundant bracing round if etc
13214adf7   Andy Whitcroft   update checkpatch...
3229
3230
  		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
  			my ($level, $endln, @chunks) =
cf655043d   Andy Whitcroft   update checkpatch...
3231
  				ctx_statement_full($linenr, $realcnt, 1);
13214adf7   Andy Whitcroft   update checkpatch...
3232
3233
  			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
3234
3235
3236
  			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>
  ";
  			if ($#chunks > 0 && $level == 0) {
aad4f6149   Joe Perches   checkpatch: add -...
3237
3238
  				my @allowed = ();
  				my $allow = 0;
13214adf7   Andy Whitcroft   update checkpatch...
3239
  				my $seen = 0;
773647a09   Andy Whitcroft   update checkpatch...
3240
3241
  				my $herectx = $here . "
  ";
cf655043d   Andy Whitcroft   update checkpatch...
3242
  				my $ln = $linenr - 1;
13214adf7   Andy Whitcroft   update checkpatch...
3243
3244
  				for my $chunk (@chunks) {
  					my ($cond, $block) = @{$chunk};
773647a09   Andy Whitcroft   update checkpatch...
3245
3246
3247
3248
  					# If the condition carries leading newlines, then count those as offsets.
  					my ($whitespace) = ($cond =~ /^((?:\s*
  [+-])*\s*)/s);
  					my $offset = statement_rawlines($whitespace) - 1;
aad4f6149   Joe Perches   checkpatch: add -...
3249
  					$allowed[$allow] = 0;
773647a09   Andy Whitcroft   update checkpatch...
3250
3251
3252
3253
3254
3255
3256
3257
3258
  					#print "COND<$cond> whitespace<$whitespace> offset<$offset>
  ";
  
  					# We have looked at and allowed this specific line.
  					$suppress_ifbraces{$ln + $offset} = 1;
  
  					$herectx .= "$rawlines[$ln + $offset]
  [...]
  ";
cf655043d   Andy Whitcroft   update checkpatch...
3259
  					$ln += statement_rawlines($block) - 1;
773647a09   Andy Whitcroft   update checkpatch...
3260
  					substr($block, 0, length($cond), '');
13214adf7   Andy Whitcroft   update checkpatch...
3261
3262
  
  					$seen++ if ($block =~ /^\s*{/);
aad4f6149   Joe Perches   checkpatch: add -...
3263
3264
  					#print "cond<$cond> block<$block> allowed<$allowed[$allow]>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
3265
3266
3267
  					if (statement_lines($cond) > 1) {
  						#print "APW: ALLOWED: cond<$cond>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
3268
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
3269
3270
  					}
  					if ($block =~/\b(?:if|for|while)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
3271
3272
  						#print "APW: ALLOWED: block<$block>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
3273
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
3274
  					}
cf655043d   Andy Whitcroft   update checkpatch...
3275
3276
3277
  					if (statement_block_size($block) > 1) {
  						#print "APW: ALLOWED: lines block<$block>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
3278
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
3279
  					}
aad4f6149   Joe Perches   checkpatch: add -...
3280
  					$allow++;
13214adf7   Andy Whitcroft   update checkpatch...
3281
  				}
aad4f6149   Joe Perches   checkpatch: add -...
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
  				if ($seen) {
  					my $sum_allowed = 0;
  					foreach (@allowed) {
  						$sum_allowed += $_;
  					}
  					if ($sum_allowed == 0) {
  						WARN("BRACES",
  						     "braces {} are not necessary for any arm of this statement
  " . $herectx);
  					} elsif ($sum_allowed != $allow &&
  						 $seen != $allow) {
  						CHK("BRACES",
  						    "braces {} should be used on all arms of this statement
  " . $herectx);
  					}
13214adf7   Andy Whitcroft   update checkpatch...
3297
3298
3299
  				}
  			}
  		}
773647a09   Andy Whitcroft   update checkpatch...
3300
  		if (!defined $suppress_ifbraces{$linenr - 1} &&
13214adf7   Andy Whitcroft   update checkpatch...
3301
  					$line =~ /\b(if|while|for|else)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
3302
3303
3304
3305
3306
3307
3308
3309
  			my $allowed = 0;
  
  			# Check the pre-context.
  			if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
  				#print "APW: ALLOWED: pre<$1>
  ";
  				$allowed = 1;
  			}
773647a09   Andy Whitcroft   update checkpatch...
3310
3311
3312
  
  			my ($level, $endln, @chunks) =
  				ctx_statement_full($linenr, $realcnt, $-[0]);
cf655043d   Andy Whitcroft   update checkpatch...
3313
3314
  			# Check the condition.
  			my ($cond, $block) = @{$chunks[0]};
773647a09   Andy Whitcroft   update checkpatch...
3315
3316
  			#print "CHECKING<$linenr> cond<$cond> block<$block>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
3317
  			if (defined $cond) {
773647a09   Andy Whitcroft   update checkpatch...
3318
  				substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
  			}
  			if (statement_lines($cond) > 1) {
  				#print "APW: ALLOWED: cond<$cond>
  ";
  				$allowed = 1;
  			}
  			if ($block =~/\b(?:if|for|while)\b/) {
  				#print "APW: ALLOWED: block<$block>
  ";
  				$allowed = 1;
  			}
  			if (statement_block_size($block) > 1) {
  				#print "APW: ALLOWED: lines block<$block>
  ";
  				$allowed = 1;
  			}
  			# Check the post-context.
  			if (defined $chunks[1]) {
  				my ($cond, $block) = @{$chunks[1]};
  				if (defined $cond) {
773647a09   Andy Whitcroft   update checkpatch...
3339
  					substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
3340
3341
3342
3343
3344
3345
3346
3347
  				}
  				if ($block =~ /^\s*\{/) {
  					#print "APW: ALLOWED: chunk-1 block<$block>
  ";
  					$allowed = 1;
  				}
  			}
  			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
699324871   Justin P. Mattock   treewide: remove ...
3348
3349
  				my $herectx = $here . "
  ";
f055663c5   Andy Whitcroft   checkpatch: repor...
3350
  				my $cnt = statement_rawlines($block);
cf655043d   Andy Whitcroft   update checkpatch...
3351

f055663c5   Andy Whitcroft   checkpatch: repor...
3352
  				for (my $n = 0; $n < $cnt; $n++) {
699324871   Justin P. Mattock   treewide: remove ...
3353
3354
  					$herectx .= raw_line($linenr, $n) . "
  ";
f0a594c1c   Andy Whitcroft   update checkpatch...
3355
  				}
cf655043d   Andy Whitcroft   update checkpatch...
3356

000d1cc18   Joe Perches   checkpatch.pl: ad...
3357
3358
3359
  				WARN("BRACES",
  				     "braces {} are not necessary for single statement blocks
  " . $herectx);
f0a594c1c   Andy Whitcroft   update checkpatch...
3360
3361
  			}
  		}
0979ae664   Joe Perches   checkpatch: Add -...
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
  # check for unnecessary blank lines around braces
  		if (($line =~ /^..*}\s*$/ && $prevline =~ /^.\s*$/)) {
  			CHK("BRACES",
  			    "Blank lines aren't necessary before a close brace '}'
  " . $hereprev);
  		}
  		if (($line =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
  			CHK("BRACES",
  			    "Blank lines aren't necessary after an open brace '{'
  " . $hereprev);
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
3373
  # no volatiles please
6c72ffaab   Andy Whitcroft   update checkpatch...
3374
3375
  		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
  		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3376
3377
3378
  			WARN("VOLATILE",
  			     "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3379
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3380
  # warn about #if 0
c45dcabd2   Andy Whitcroft   update checkpatch...
3381
  		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3382
3383
3384
  			CHK("REDUNDANT_CODE",
  			    "if this code is redundant consider removing it
  " .
de7d4f0e1   Andy Whitcroft   update checkpatch...
3385
  				$herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3386
  		}
03df4b51f   Andy Whitcroft   checkpatch: conso...
3387
3388
3389
3390
3391
3392
3393
  # check for needless "if (<foo>) fn(<foo>)" uses
  		if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
  			my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';
  			if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
  				WARN('NEEDLESS_IF',
  				     "$1(NULL) is safe this check is probably not required
  " . $hereprev);
4c432a8f0   Greg Kroah-Hartman   checkpatch: usb_f...
3394
3395
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
3396

1a15a2508   Patrick Pannuto   checkpatch: prefe...
3397
  # prefer usleep_range over udelay
37581c28e   Bruce Allan   checkpatch: fix U...
3398
  		if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
1a15a2508   Patrick Pannuto   checkpatch: prefe...
3399
  			# ignore udelay's < 10, however
37581c28e   Bruce Allan   checkpatch: fix U...
3400
  			if (! ($1 < 10) ) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3401
3402
3403
  				CHK("USLEEP_RANGE",
  				    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt
  " . $line);
1a15a2508   Patrick Pannuto   checkpatch: prefe...
3404
3405
  			}
  		}
09ef87255   Patrick Pannuto   checkpatch: warn ...
3406
3407
3408
  # warn about unexpectedly long msleep's
  		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
  			if ($1 < 20) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3409
3410
3411
  				WARN("MSLEEP",
  				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt
  " . $line);
09ef87255   Patrick Pannuto   checkpatch: warn ...
3412
3413
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3414
  # warn about #ifdefs in C files
c45dcabd2   Andy Whitcroft   update checkpatch...
3415
  #		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344fd   Andy Whitcroft   update checkpatch...
3416
3417
3418
3419
3420
  #			print "#ifdef in C files should be avoided
  ";
  #			print "$herecurr";
  #			$clean = 0;
  #		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3421
  # warn about spacing in #ifdefs
c45dcabd2   Andy Whitcroft   update checkpatch...
3422
  		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3423
3424
3425
  			ERROR("SPACING",
  			      "exactly one space required after that #$1
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
3426
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
3427
  # check for spinlock_t definitions without a comment.
171ae1a49   Andy Whitcroft   update checkpatch...
3428
3429
  		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
  		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
3430
3431
  			my $which = $1;
  			if (!ctx_has_comment($first_line, $linenr)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3432
3433
3434
  				CHK("UNCOMMENTED_DEFINITION",
  				    "$1 definition without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3435
3436
3437
3438
3439
  			}
  		}
  # check for memory barriers without a comment.
  		if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
  			if (!ctx_has_comment($first_line, $linenr)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3440
3441
3442
  				CHK("MEMORY_BARRIER",
  				    "memory barrier without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3443
3444
3445
  			}
  		}
  # check of hardware specific defines
c45dcabd2   Andy Whitcroft   update checkpatch...
3446
  		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3447
3448
3449
  			CHK("ARCH_DEFINES",
  			    "architecture specific defines should be avoided
  " .  $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3450
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3451

d4977c78e   Tobias Klauser   checkpatch: warn ...
3452
3453
  # Check that the storage class is at the beginning of a declaration
  		if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3454
3455
3456
  			WARN("STORAGE_CLASS",
  			     "storage class should be at the beginning of the declaration
  " . $herecurr)
d4977c78e   Tobias Klauser   checkpatch: warn ...
3457
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
3458
3459
  # check the location of the inline attribute, that it is between
  # storage class and type.
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3460
3461
  		if ($line =~ /\b$Type\s+$Inline\b/ ||
  		    $line =~ /\b$Inline\s+$Storage\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3462
3463
3464
  			ERROR("INLINE_LOCATION",
  			      "inline keyword should sit between storage class and type
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
3465
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
3466
3467
  # Check for __inline__ and __inline, prefer inline
  		if ($line =~ /\b(__inline__|__inline)\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3468
3469
3470
  			WARN("INLINE",
  			     "plain inline is preferred over $1
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
3471
  		}
3d130fd03   Joe Perches   checkpatch.pl: ad...
3472
3473
  # Check for __attribute__ packed, prefer __packed
  		if ($line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3474
3475
3476
  			WARN("PREFER_PACKED",
  			     "__packed is preferred over __attribute__((packed))
  " . $herecurr);
3d130fd03   Joe Perches   checkpatch.pl: ad...
3477
  		}
39b7e2878   Joe Perches   checkpatch: add a...
3478
3479
  # Check for __attribute__ aligned, prefer __aligned
  		if ($line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3480
3481
3482
  			WARN("PREFER_ALIGNED",
  			     "__aligned(size) is preferred over __attribute__((aligned(size)))
  " . $herecurr);
39b7e2878   Joe Perches   checkpatch: add a...
3483
  		}
5f14d3bd8   Joe Perches   checkpatch: prefe...
3484
3485
3486
3487
3488
3489
  # Check for __attribute__ format(printf, prefer __printf
  		if ($line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
  			WARN("PREFER_PRINTF",
  			     "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))
  " . $herecurr);
  		}
6061d949d   Joe Perches   include/ and chec...
3490
3491
3492
3493
3494
3495
  # Check for __attribute__ format(scanf, prefer __scanf
  		if ($line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
  			WARN("PREFER_SCANF",
  			     "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))
  " . $herecurr);
  		}
8f53a9b80   Joe Perches   scripts/checkpatc...
3496
3497
  # check for sizeof(&)
  		if ($line =~ /\bsizeof\s*\(\s*\&/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3498
3499
3500
  			WARN("SIZEOF_ADDRESS",
  			     "sizeof(& should be avoided
  " . $herecurr);
8f53a9b80   Joe Perches   scripts/checkpatc...
3501
  		}
66c80b607   Joe Perches   checkpatch: Add a...
3502
3503
3504
3505
3506
3507
  # check for sizeof without parenthesis
  		if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
  			WARN("SIZEOF_PARENTHESIS",
  			     "sizeof $1 should be sizeof($1)
  " . $herecurr);
  		}
428e2fdc4   Joe Perches   checkpatch: add c...
3508
3509
  # check for line continuations in quoted strings with odd counts of "
  		if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3510
3511
3512
  			WARN("LINE_CONTINUATIONS",
  			     "Avoid line continuations in quoted strings
  " . $herecurr);
428e2fdc4   Joe Perches   checkpatch: add c...
3513
  		}
88982fea5   Joe Perches   checkpatch: warn ...
3514
3515
3516
3517
3518
3519
  # check for struct spinlock declarations
  		if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
  			WARN("USE_SPINLOCK_T",
  			     "struct spinlock should be spinlock_t
  " . $herecurr);
  		}
554e165cf   Andy Whitcroft   checkpatch: check...
3520
  # Check for misused memsets
d1fe9c099   Joe Perches   checkpatch: add s...
3521
3522
  		if ($^V && $^V ge 5.10.0 &&
  		    defined $stat &&
d7c76ba7e   Joe Perches   checkpatch: impro...
3523
3524
3525
  		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
  
  			my $ms_addr = $2;
d1fe9c099   Joe Perches   checkpatch: add s...
3526
3527
  			my $ms_val = $7;
  			my $ms_size = $12;
554e165cf   Andy Whitcroft   checkpatch: check...
3528

554e165cf   Andy Whitcroft   checkpatch: check...
3529
3530
  			if ($ms_size =~ /^(0x|)0$/i) {
  				ERROR("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
3531
3532
3533
3534
  				      "memset to 0's uses 0 as the 2nd argument, not the 3rd
  " . "$here
  $stat
  ");
554e165cf   Andy Whitcroft   checkpatch: check...
3535
3536
  			} elsif ($ms_size =~ /^(0x|)1$/i) {
  				WARN("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
3537
3538
3539
3540
3541
3542
3543
3544
  				     "single byte memset is suspicious. Swapped 2nd/3rd argument?
  " . "$here
  $stat
  ");
  			}
  		}
  
  # typecasts on min/max could be min_t/max_t
d1fe9c099   Joe Perches   checkpatch: add s...
3545
3546
  		if ($^V && $^V ge 5.10.0 &&
  		    defined $stat &&
d7c76ba7e   Joe Perches   checkpatch: impro...
3547
  		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
d1fe9c099   Joe Perches   checkpatch: add s...
3548
  			if (defined $2 || defined $7) {
d7c76ba7e   Joe Perches   checkpatch: impro...
3549
3550
3551
  				my $call = $1;
  				my $cast1 = deparenthesize($2);
  				my $arg1 = $3;
d1fe9c099   Joe Perches   checkpatch: add s...
3552
3553
  				my $cast2 = deparenthesize($7);
  				my $arg2 = $8;
d7c76ba7e   Joe Perches   checkpatch: impro...
3554
  				my $cast;
d1fe9c099   Joe Perches   checkpatch: add s...
3555
  				if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
d7c76ba7e   Joe Perches   checkpatch: impro...
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
  					$cast = "$cast1 or $cast2";
  				} elsif ($cast1 ne "") {
  					$cast = $cast1;
  				} else {
  					$cast = $cast2;
  				}
  				WARN("MINMAX",
  				     "$call() should probably be ${call}_t($cast, $arg1, $arg2)
  " . "$here
  $stat
  ");
554e165cf   Andy Whitcroft   checkpatch: check...
3567
3568
  			}
  		}
4a273195a   Joe Perches   checkpatch: check...
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
  # check usleep_range arguments
  		if ($^V && $^V ge 5.10.0 &&
  		    defined $stat &&
  		    $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
  			my $min = $1;
  			my $max = $7;
  			if ($min eq $max) {
  				WARN("USLEEP_RANGE",
  				     "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt
  " . "$here
  $stat
  ");
  			} elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
  				 $min > $max) {
  				WARN("USLEEP_RANGE",
  				     "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt
  " . "$here
  $stat
  ");
  			}
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
3590
  # check for new externs in .c files.
171ae1a49   Andy Whitcroft   update checkpatch...
3591
  		if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd2   Andy Whitcroft   update checkpatch...
3592
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a49   Andy Whitcroft   update checkpatch...
3593
  		{
c45dcabd2   Andy Whitcroft   update checkpatch...
3594
3595
  			my $function_name = $1;
  			my $paren_space = $2;
171ae1a49   Andy Whitcroft   update checkpatch...
3596
3597
3598
3599
3600
  
  			my $s = $stat;
  			if (defined $cond) {
  				substr($s, 0, length($cond), '');
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
3601
3602
3603
  			if ($s =~ /^\s*;/ &&
  			    $function_name ne 'uninitialized_var')
  			{
000d1cc18   Joe Perches   checkpatch.pl: ad...
3604
3605
3606
  				WARN("AVOID_EXTERNS",
  				     "externs should be avoided in .c files
  " .  $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
3607
3608
3609
3610
  			}
  
  			if ($paren_space =~ /
  /) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3611
3612
3613
  				WARN("FUNCTION_ARGUMENTS",
  				     "arguments for function declarations should follow identifier
  " . $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
3614
  			}
9c9ba34ee   Andy Whitcroft   update checkpatch...
3615
3616
3617
3618
  
  		} elsif ($realfile =~ /\.c$/ && defined $stat &&
  		    $stat =~ /^.\s*extern\s+/)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
3619
3620
3621
  			WARN("AVOID_EXTERNS",
  			     "externs should be avoided in .c files
  " .  $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
3622
3623
3624
3625
3626
3627
3628
  		}
  
  # checks for new __setup's
  		if ($rawline =~ /\b__setup\("([^"]*)"/) {
  			my $name = $1;
  
  			if (!grep(/$name/, @setup_docs)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3629
3630
3631
  				CHK("UNDOCUMENTED_SETUP",
  				    "__setup appears un-documented -- check Documentation/kernel-parameters.txt
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
3632
  			}
653d4876b   Andy Whitcroft   update checkpatch...
3633
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3634
3635
  
  # check for pointless casting of kmalloc return
caf2a54f1   Joe Perches   scripts/checkpatc...
3636
  		if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3637
3638
3639
  			WARN("UNNECESSARY_CASTS",
  			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html
  " . $herecurr);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3640
  		}
13214adf7   Andy Whitcroft   update checkpatch...
3641

5ce59ae0b   Joe Perches   checkpatch: Add c...
3642
3643
3644
3645
3646
3647
  # check for alloc argument mismatch
  		if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
  			WARN("ALLOC_ARRAY_ARGS",
  			     "$1 uses number as first arg, sizeof is generally wrong
  " . $herecurr);
  		}
caf2a54f1   Joe Perches   scripts/checkpatc...
3648
3649
  # check for multiple semicolons
  		if ($line =~ /;\s*;\s*$/) {
d1e2ad07e   Joe Perches   checkpatch: add -...
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
  			WARN("ONE_SEMICOLON",
  			     "Statements terminations use 1 semicolon
  " . $herecurr);
  		}
  
  # check for switch/default statements without a break;
  		if ($^V && $^V ge 5.10.0 &&
  		    defined $stat &&
  		    $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
  			my $ctx = '';
  			my $herectx = $here . "
  ";
  			my $cnt = statement_rawlines($stat);
  			for (my $n = 0; $n < $cnt; $n++) {
  				$herectx .= raw_line($linenr, $n) . "
  ";
  			}
  			WARN("DEFAULT_NO_BREAK",
  			     "switch default: should use break
  " . $herectx);
caf2a54f1   Joe Perches   scripts/checkpatc...
3670
  		}
13214adf7   Andy Whitcroft   update checkpatch...
3671
3672
  # check for gcc specific __FUNCTION__
  		if ($line =~ /__FUNCTION__/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3673
3674
3675
  			WARN("USE_FUNC",
  			     "__func__ should be used instead of gcc specific __FUNCTION__
  "  . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
3676
  		}
773647a09   Andy Whitcroft   update checkpatch...
3677

2c92488ab   Joe Perches   checkpatch: warn ...
3678
3679
3680
3681
3682
3683
  # check for use of yield()
  		if ($line =~ /\byield\s*\(\s*\)/) {
  			WARN("YIELD",
  			     "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)
  "  . $herecurr);
  		}
4882720b2   Thomas Gleixner   semaphore: Remove...
3684
3685
  # check for semaphores initialized locked
  		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3686
3687
3688
  			WARN("CONSIDER_COMPLETION",
  			     "consider using a completion
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
3689
  		}
6712d8585   Joe Perches   checkpatch: white...
3690

67d0a0754   Joe Perches   kernel.h/checkpat...
3691
3692
  # recommend kstrto* over simple_strto* and strict_strto*
  		if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3693
  			WARN("CONSIDER_KSTRTO",
67d0a0754   Joe Perches   kernel.h/checkpat...
3694
3695
  			     "$1 is obsolete, use k$3 instead
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
3696
  		}
6712d8585   Joe Perches   checkpatch: white...
3697

f3db6639f   Michael Ellerman   checkpatch: add a...
3698
3699
  # check for __initcall(), use device_initcall() explicitly please
  		if ($line =~ /^.\s*__initcall\s*\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3700
3701
3702
  			WARN("USE_DEVICE_INITCALL",
  			     "please use device_initcall() instead of __initcall()
  " . $herecurr);
f3db6639f   Michael Ellerman   checkpatch: add a...
3703
  		}
6712d8585   Joe Perches   checkpatch: white...
3704

79404849e   Emese Revfy   checkpatch.pl: ex...
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
  # check for various ops structs, ensure they are const.
  		my $struct_ops = qr{acpi_dock_ops|
  				address_space_operations|
  				backlight_ops|
  				block_device_operations|
  				dentry_operations|
  				dev_pm_ops|
  				dma_map_ops|
  				extent_io_ops|
  				file_lock_operations|
  				file_operations|
  				hv_ops|
  				ide_dma_ops|
  				intel_dvo_dev_ops|
  				item_operations|
  				iwl_ops|
  				kgdb_arch|
  				kgdb_io|
  				kset_uevent_ops|
  				lock_manager_operations|
  				microcode_ops|
  				mtrr_ops|
  				neigh_ops|
  				nlmsvc_binding|
  				pci_raw_ops|
  				pipe_buf_operations|
  				platform_hibernation_ops|
  				platform_suspend_ops|
  				proto_ops|
  				rpc_pipe_ops|
  				seq_operations|
  				snd_ac97_build_ops|
  				soc_pcmcia_socket_ops|
  				stacktrace_ops|
  				sysfs_ops|
  				tty_operations|
  				usb_mon_operations|
  				wd_ops}x;
6903ffb22   Andy Whitcroft   checkpatch: struc...
3743
  		if ($line !~ /\bconst\b/ &&
79404849e   Emese Revfy   checkpatch.pl: ex...
3744
  		    $line =~ /\bstruct\s+($struct_ops)\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3745
3746
3747
  			WARN("CONST_STRUCT",
  			     "struct $1 should normally be const
  " .
6903ffb22   Andy Whitcroft   checkpatch: struc...
3748
  				$herecurr);
2b6db5cb6   Andy Whitcroft   checkpatch: struc...
3749
  		}
773647a09   Andy Whitcroft   update checkpatch...
3750
3751
3752
3753
  
  # use of NR_CPUS is usually wrong
  # ignore definitions of NR_CPUS and usage to define arrays as likely right
  		if ($line =~ /\bNR_CPUS\b/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
3754
3755
  		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
  		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a49   Andy Whitcroft   update checkpatch...
3756
3757
3758
  		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a09   Andy Whitcroft   update checkpatch...
3759
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
3760
3761
3762
  			WARN("NR_CPUS",
  			     "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
3763
  		}
9c9ba34ee   Andy Whitcroft   update checkpatch...
3764
3765
3766
3767
3768
  
  # check for %L{u,d,i} in strings
  		my $string;
  		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
  			$string = substr($rawline, $-[1], $+[1] - $-[1]);
2a1bc5d5c   Andy Whitcroft   checkpatch: %Lx t...
3769
  			$string =~ s/%%/__/g;
9c9ba34ee   Andy Whitcroft   update checkpatch...
3770
  			if ($string =~ /(?<!%)%L[udi]/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3771
3772
3773
  				WARN("PRINTF_L",
  				     "\%Ld/%Lu are not-standard C, use %lld/%llu
  " . $herecurr);
9c9ba34ee   Andy Whitcroft   update checkpatch...
3774
3775
3776
  				last;
  			}
  		}
691d77b6b   Andy Whitcroft   checkpatch: add c...
3777
3778
3779
3780
  
  # whine mightly about in_atomic
  		if ($line =~ /\bin_atomic\s*\(/) {
  			if ($realfile =~ m@^drivers/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3781
3782
3783
  				ERROR("IN_ATOMIC",
  				      "do not use in_atomic in drivers
  " . $herecurr);
f4a877367   Andy Whitcroft   checkpatch: make ...
3784
  			} elsif ($realfile !~ m@^kernel/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3785
3786
3787
  				WARN("IN_ATOMIC",
  				     "use of in_atomic() is incorrect outside core kernel code
  " . $herecurr);
691d77b6b   Andy Whitcroft   checkpatch: add c...
3788
3789
  			}
  		}
1704f47b5   Peter Zijlstra   lockdep: Add nova...
3790
3791
3792
3793
3794
3795
3796
  
  # check for lockdep_set_novalidate_class
  		if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
  		    $line =~ /__lockdep_no_validate__\s*\)/ ) {
  			if ($realfile !~ m@^kernel/lockdep@ &&
  			    $realfile !~ m@^include/linux/lockdep@ &&
  			    $realfile !~ m@^drivers/base/core@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3797
3798
3799
  				ERROR("LOCKDEP",
  				      "lockdep_no_validate class is reserved for device->mutex.
  " . $herecurr);
1704f47b5   Peter Zijlstra   lockdep: Add nova...
3800
3801
  			}
  		}
88f8831c0   Dave Jones   checkpatch: check...
3802
3803
3804
  
  		if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
  		    $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3805
3806
3807
  			WARN("EXPORTED_WORLD_WRITABLE",
  			     "Exporting world writable files is usually an error. Consider more restrictive permissions.
  " . $herecurr);
88f8831c0   Dave Jones   checkpatch: check...
3808
  		}
13214adf7   Andy Whitcroft   update checkpatch...
3809
3810
3811
3812
3813
3814
  	}
  
  	# If we have no input at all, then there is nothing to report on
  	# so just keep quiet.
  	if ($#rawlines == -1) {
  		exit(0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3815
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
  	# In mailback mode only produce a report in the negative, for
  	# things that appear to be patches.
  	if ($mailback && ($clean == 1 || !$is_patch)) {
  		exit(0);
  	}
  
  	# This is not a patch, and we are are in 'no-patch' mode so
  	# just keep quiet.
  	if (!$chk_patch && !$is_patch) {
  		exit(0);
  	}
  
  	if (!$is_patch) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3829
3830
3831
  		ERROR("NOT_UNIFIED_DIFF",
  		      "Does not appear to be a unified-diff format patch
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
3832
3833
  	}
  	if ($is_patch && $chk_signoff && $signoff == 0) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3834
3835
3836
  		ERROR("MISSING_SIGN_OFF",
  		      "Missing Signed-off-by: line(s)
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
3837
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
3838
  	print report_dump();
13214adf7   Andy Whitcroft   update checkpatch...
3839
3840
  	if ($summary && !($clean == 1 && $quiet == 1)) {
  		print "$filename " if ($summary_file);
8905a67c6   Andy Whitcroft   update checkpatch...
3841
3842
3843
3844
3845
3846
  		print "total: $cnt_error errors, $cnt_warn warnings, " .
  			(($check)? "$cnt_chk checks, " : "") .
  			"$cnt_lines lines checked
  ";
  		print "
  " if ($quiet == 0);
f0a594c1c   Andy Whitcroft   update checkpatch...
3847
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
3848

d2c0a2351   Andy Whitcroft   checkpatch: sugge...
3849
  	if ($quiet == 0) {
d1fe9c099   Joe Perches   checkpatch: add s...
3850
3851
3852
3853
3854
3855
3856
3857
  
  		if ($^V lt 5.10.0) {
  			print("NOTE: perl $^V is not modern enough to detect all possible issues.
  ");
  			print("An upgrade to at least perl v5.10.0 is suggested.
  
  ");
  		}
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
3858
3859
3860
3861
3862
3863
3864
3865
  		# If there were whitespace errors which cleanpatch can fix
  		# then suggest that.
  		if ($rpt_cleaners) {
  			print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or
  ";
  			print "      scripts/cleanfile
  
  ";
b0781216e   Mike Frysinger   scripts/checkpatc...
3866
  			$rpt_cleaners = 0;
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
3867
3868
  		}
  	}
11232688e   Artem Bityutskiy   checkpatch.pl: be...
3869
  	if ($quiet == 0 && keys %ignore_type) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3870
3871
3872
3873
  	    print "NOTE: Ignored message types:";
  	    foreach my $ignore (sort keys %ignore_type) {
  		print " $ignore";
  	    }
11232688e   Artem Bityutskiy   checkpatch.pl: be...
3874
3875
3876
  	    print "
  
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
3877
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3878
  	if ($clean == 1 && $quiet == 0) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3879
3880
  		print "$vname has no obvious style problems and is ready for submission.
  "
0a920b5b6   Andy Whitcroft   add a trivial pat...
3881
3882
  	}
  	if ($clean == 0 && $quiet == 0) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3883
3884
3885
3886
3887
3888
  		print << "EOM";
  $vname has style problems, please review.
  
  If any of these errors are false positives, please report
  them to the maintainer, see CHECKPATCH in MAINTAINERS.
  EOM
0a920b5b6   Andy Whitcroft   add a trivial pat...
3889
  	}
13214adf7   Andy Whitcroft   update checkpatch...
3890

0a920b5b6   Andy Whitcroft   add a trivial pat...
3891
3892
  	return $clean;
  }