Blame view

scripts/checkpatch.pl 74.6 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)
131edb341   Andy Whitcroft   checkpatch: updat...
5
  # (c) 2008,2009, 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

5e8d8f6f2   Andy Whitcroft   checkpatch: versi...
13
  my $V = '0.30';
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;
6c72ffaab   Andy Whitcroft   update checkpatch...
29
  my $root;
c2fdda0df   Andy Whitcroft   update checkpatch...
30
  my %debug;
77f5b10a8   Hannes Eder   checkpatch: make ...
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  my $help = 0;
  
  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
    --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);
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
65
  GetOptions(
6c72ffaab   Andy Whitcroft   update checkpatch...
66
  	'q|quiet+'	=> \$quiet,
0a920b5b6   Andy Whitcroft   add a trivial pat...
67
68
69
  	'tree!'		=> \$tree,
  	'signoff!'	=> \$chk_signoff,
  	'patch!'	=> \$chk_patch,
6c72ffaab   Andy Whitcroft   update checkpatch...
70
  	'emacs!'	=> \$emacs,
8905a67c6   Andy Whitcroft   update checkpatch...
71
  	'terse!'	=> \$terse,
77f5b10a8   Hannes Eder   checkpatch: make ...
72
  	'f|file!'	=> \$file,
6c72ffaab   Andy Whitcroft   update checkpatch...
73
74
75
  	'subjective!'	=> \$check,
  	'strict!'	=> \$check,
  	'root=s'	=> \$root,
8905a67c6   Andy Whitcroft   update checkpatch...
76
77
  	'summary!'	=> \$summary,
  	'mailback!'	=> \$mailback,
13214adf7   Andy Whitcroft   update checkpatch...
78
  	'summary-file!'	=> \$summary_file,
c2fdda0df   Andy Whitcroft   update checkpatch...
79
  	'debug=s'	=> \%debug,
773647a09   Andy Whitcroft   update checkpatch...
80
  	'test-only=s'	=> \$tst_only,
77f5b10a8   Hannes Eder   checkpatch: make ...
81
82
83
84
85
  	'h|help'	=> \$help,
  	'version'	=> \$help
  ) or help(1);
  
  help(0) if ($help);
0a920b5b6   Andy Whitcroft   add a trivial pat...
86
87
88
89
  
  my $exit = 0;
  
  if ($#ARGV < 0) {
77f5b10a8   Hannes Eder   checkpatch: make ...
90
91
  	print "$P: no input files
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
92
93
  	exit(1);
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
94
95
  my $dbg_values = 0;
  my $dbg_possible = 0;
7429c6903   Andy Whitcroft   checkpatch: impro...
96
  my $dbg_type = 0;
a1ef277e2   Andy Whitcroft   checkpatch: add t...
97
  my $dbg_attr = 0;
c2fdda0df   Andy Whitcroft   update checkpatch...
98
  for my $key (keys %debug) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
99
100
101
  	## no critic
  	eval "\${dbg_$key} = '$debug{$key}';";
  	die "$@" if ($@);
c2fdda0df   Andy Whitcroft   update checkpatch...
102
  }
8905a67c6   Andy Whitcroft   update checkpatch...
103
104
105
106
  if ($terse) {
  	$emacs = 1;
  	$quiet++;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
  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...
127
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
128
  my $emitted_corrupt = 0;
2ceb532b0   Andy Whitcroft   checkpatch: fix f...
129
130
131
132
  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...
133
134
135
136
137
138
139
140
  our $Storage	= qr{extern|static|asmlinkage};
  our $Sparse	= qr{
  			__user|
  			__kernel|
  			__force|
  			__iomem|
  			__must_check|
  			__init_refok|
417495eda   Andy Whitcroft   checkpatch: add _...
141
142
  			__kprobes|
  			__ref
6c72ffaab   Andy Whitcroft   update checkpatch...
143
  		}x;
52131292c   Wolfram Sang   checkpatch: fix f...
144
145
146
  
  # Notes to $Attribute:
  # We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
6c72ffaab   Andy Whitcroft   update checkpatch...
147
148
149
150
  our $Attribute	= qr{
  			const|
  			__read_mostly|
  			__kprobes|
52131292c   Wolfram Sang   checkpatch: fix f...
151
  			__(?:mem|cpu|dev|)(?:initdata|initconst|init\b)|
24e1d81ac   Andy Whitcroft   checkpatch: ____c...
152
153
  			____cacheline_aligned|
  			____cacheline_aligned_in_smp|
5fe3af119   Andy Whitcroft   checkpatch: __wea...
154
155
  			____cacheline_internodealigned_in_smp|
  			__weak
6c72ffaab   Andy Whitcroft   update checkpatch...
156
  		  }x;
c45dcabd2   Andy Whitcroft   update checkpatch...
157
  our $Modifier;
6c72ffaab   Andy Whitcroft   update checkpatch...
158
  our $Inline	= qr{inline|__always_inline|noinline};
6c72ffaab   Andy Whitcroft   update checkpatch...
159
160
161
162
163
  our $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
  our $Lval	= qr{$Ident(?:$Member)*};
  
  our $Constant	= qr{(?:[0-9]+|0x[0-9a-fA-F]+)[UL]*};
  our $Assignment	= qr{(?:\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=)};
86f9d059c   Andy Whitcroft   checkpatch: allow...
164
  our $Compare    = qr{<=|>=|==|!=|<|>};
6c72ffaab   Andy Whitcroft   update checkpatch...
165
166
167
  our $Operators	= qr{
  			<=|>=|==|!=|
  			=>|->|<<|>>|<|>|!|~|
c2fdda0df   Andy Whitcroft   update checkpatch...
168
  			&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%
6c72ffaab   Andy Whitcroft   update checkpatch...
169
  		  }x;
8905a67c6   Andy Whitcroft   update checkpatch...
170
171
172
  our $NonptrType;
  our $Type;
  our $Declare;
171ae1a49   Andy Whitcroft   update checkpatch...
173
174
175
176
177
178
179
180
181
182
  our $UTF8	= qr {
  	[\x09\x0A\x0D\x20-\x7E]              # ASCII
  	| [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
  	|  \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;
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
183
  our $typeTypedefs = qr{(?x:
fb9e9096b   Andy Whitcroft   checkpatch: limit...
184
  	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
185
186
  	atomic_t
  )};
691e669ba   Joe Perches   checkpatch.pl: al...
187
188
189
190
191
192
193
  our $logFunctions = qr{(?x:
  	printk|
  	pr_(debug|dbg|vdbg|devel|info|warning|err|notice|alert|crit|emerg|cont)|
  	dev_(printk|dbg|vdbg|info|warn|err|notice|alert|crit|emerg|WARN)|
  	WARN|
  	panic
  )};
8905a67c6   Andy Whitcroft   update checkpatch...
194
195
  our @typeList = (
  	qr{void},
c45dcabd2   Andy Whitcroft   update checkpatch...
196
197
198
199
200
201
202
  	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...
203
204
205
206
  	qr{unsigned},
  	qr{float},
  	qr{double},
  	qr{bool},
8905a67c6   Andy Whitcroft   update checkpatch...
207
208
209
210
211
212
213
  	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...
214
215
216
  our @modifierList = (
  	qr{fastcall},
  );
8905a67c6   Andy Whitcroft   update checkpatch...
217
218
  
  sub build_types {
d2172eb5b   Andy Whitcroft   checkpatch: possi...
219
220
221
222
223
224
225
226
  	my $mods = "(?x:  
  " . join("|
    ", @modifierList) . "
  )";
  	my $all = "(?x:  
  " . join("|
    ", @typeList) . "
  )";
c8cb2ca37   Andy Whitcroft   checkpatch: types...
227
  	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
8905a67c6   Andy Whitcroft   update checkpatch...
228
  	$NonptrType	= qr{
d2172eb5b   Andy Whitcroft   checkpatch: possi...
229
  			(?:$Modifier\s+|const\s+)*
cf655043d   Andy Whitcroft   update checkpatch...
230
  			(?:
c45dcabd2   Andy Whitcroft   update checkpatch...
231
  				(?:typeof|__typeof__)\s*\(\s*\**\s*$Ident\s*\)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
232
  				(?:$typeTypedefs\b)|
c45dcabd2   Andy Whitcroft   update checkpatch...
233
  				(?:${all}\b)
cf655043d   Andy Whitcroft   update checkpatch...
234
  			)
c8cb2ca37   Andy Whitcroft   checkpatch: types...
235
  			(?:\s+$Modifier|\s+const)*
8905a67c6   Andy Whitcroft   update checkpatch...
236
237
  		  }x;
  	$Type	= qr{
c45dcabd2   Andy Whitcroft   update checkpatch...
238
  			$NonptrType
65863862b   Andy Whitcroft   checkpatch: dissa...
239
  			(?:[\s\*]+\s*const|[\s\*]+|(?:\s*\[\s*\])+)?
c8cb2ca37   Andy Whitcroft   checkpatch: types...
240
  			(?:\s+$Inline|\s+$Modifier)*
8905a67c6   Andy Whitcroft   update checkpatch...
241
242
243
244
  		  }x;
  	$Declare	= qr{(?:$Storage\s+)?$Type};
  }
  build_types();
6c72ffaab   Andy Whitcroft   update checkpatch...
245
246
  
  $chk_signoff = 0 if ($file);
4a0df2ef4   Andy Whitcroft   update checkpatch...
247
248
  my @dep_includes = ();
  my @dep_functions = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
249
250
  my $removal = "Documentation/feature-removal-schedule.txt";
  if ($tree && -f "$root/$removal") {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
251
  	open(my $REMOVE, '<', "$root/$removal") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
252
253
  				die "$P: $removal: open failed - $!
  ";
21caa13c0   Andy Whitcroft   checkpatch: fix t...
254
  	while (<$REMOVE>) {
f0a594c1c   Andy Whitcroft   update checkpatch...
255
256
257
  		if (/^Check:\s+(.*\S)/) {
  			for my $entry (split(/[, ]+/, $1)) {
  				if ($entry =~ m@include/(.*)@) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
258
  					push(@dep_includes, $1);
4a0df2ef4   Andy Whitcroft   update checkpatch...
259

f0a594c1c   Andy Whitcroft   update checkpatch...
260
261
262
  				} elsif ($entry !~ m@/@) {
  					push(@dep_functions, $entry);
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
263
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
264
265
  		}
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
266
  	close($REMOVE);
0a920b5b6   Andy Whitcroft   add a trivial pat...
267
  }
00df344fd   Andy Whitcroft   update checkpatch...
268
  my @rawlines = ();
c2fdda0df   Andy Whitcroft   update checkpatch...
269
270
  my @lines = ();
  my $vname;
6c72ffaab   Andy Whitcroft   update checkpatch...
271
  for my $filename (@ARGV) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
272
  	my $FILE;
6c72ffaab   Andy Whitcroft   update checkpatch...
273
  	if ($file) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
274
  		open($FILE, '-|', "diff -u /dev/null $filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
275
276
  			die "$P: $filename: diff failed - $!
  ";
21caa13c0   Andy Whitcroft   checkpatch: fix t...
277
278
  	} elsif ($filename eq '-') {
  		open($FILE, '<&STDIN');
6c72ffaab   Andy Whitcroft   update checkpatch...
279
  	} else {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
280
  		open($FILE, '<', "$filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
281
282
  			die "$P: $filename: open failed - $!
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
283
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
284
285
286
287
288
  	if ($filename eq '-') {
  		$vname = 'Your patch';
  	} else {
  		$vname = $filename;
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
289
  	while (<$FILE>) {
6c72ffaab   Andy Whitcroft   update checkpatch...
290
291
292
  		chomp;
  		push(@rawlines, $_);
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
293
  	close($FILE);
c2fdda0df   Andy Whitcroft   update checkpatch...
294
  	if (!process($filename)) {
6c72ffaab   Andy Whitcroft   update checkpatch...
295
296
297
  		$exit = 1;
  	}
  	@rawlines = ();
13214adf7   Andy Whitcroft   update checkpatch...
298
  	@lines = ();
0a920b5b6   Andy Whitcroft   add a trivial pat...
299
300
301
302
303
  }
  
  exit($exit);
  
  sub top_of_kernel_tree {
6c72ffaab   Andy Whitcroft   update checkpatch...
304
305
306
307
308
309
310
311
312
313
314
315
  	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...
316
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
317
  	return 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
  }
  
  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...
340
  sub copy_spacing {
773647a09   Andy Whitcroft   update checkpatch...
341
  	(my $res = shift) =~ tr/\t/ /c;
6c72ffaab   Andy Whitcroft   update checkpatch...
342
343
  	return $res;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
344

4a0df2ef4   Andy Whitcroft   update checkpatch...
345
346
347
348
349
350
351
352
353
354
355
356
  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...
357
358
359
360
361
362
363
364
365
366
367
  my $sanitise_quote = '';
  
  sub sanitise_line_reset {
  	my ($in_comment) = @_;
  
  	if ($in_comment) {
  		$sanitise_quote = '*/';
  	} else {
  		$sanitise_quote = '';
  	}
  }
00df344fd   Andy Whitcroft   update checkpatch...
368
369
370
371
372
  sub sanitise_line {
  	my ($line) = @_;
  
  	my $res = '';
  	my $l = '';
c2fdda0df   Andy Whitcroft   update checkpatch...
373
  	my $qlen = 0;
773647a09   Andy Whitcroft   update checkpatch...
374
375
  	my $off = 0;
  	my $c;
00df344fd   Andy Whitcroft   update checkpatch...
376

773647a09   Andy Whitcroft   update checkpatch...
377
378
379
380
381
382
383
384
385
386
387
388
389
390
  	# 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...
391
  		}
81bc0e020   Andy Whitcroft   checkpatch: handl...
392
  		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
773647a09   Andy Whitcroft   update checkpatch...
393
394
395
396
  			$sanitise_quote = '';
  			substr($res, $off, 2, "$;$;");
  			$off++;
  			next;
c2fdda0df   Andy Whitcroft   update checkpatch...
397
  		}
113f04a83   Daniel Walker   checkpatch: handl...
398
399
400
401
402
403
404
  		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
  			$sanitise_quote = '//';
  
  			substr($res, $off, 2, $sanitise_quote);
  			$off++;
  			next;
  		}
773647a09   Andy Whitcroft   update checkpatch...
405
406
407
408
409
410
411
  
  		# 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...
412
  		}
773647a09   Andy Whitcroft   update checkpatch...
413
414
415
416
  		# Regular quotes.
  		if ($c eq "'" || $c eq '"') {
  			if ($sanitise_quote eq '') {
  				$sanitise_quote = $c;
00df344fd   Andy Whitcroft   update checkpatch...
417

773647a09   Andy Whitcroft   update checkpatch...
418
419
420
421
422
423
  				substr($res, $off, 1, $c);
  				next;
  			} elsif ($sanitise_quote eq $c) {
  				$sanitise_quote = '';
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
424

fae17daed   Andy Whitcroft   checkpatch: comme...
425
426
  		#print "c<$c> SQ<$sanitise_quote>
  ";
773647a09   Andy Whitcroft   update checkpatch...
427
428
  		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
  			substr($res, $off, 1, $;);
113f04a83   Daniel Walker   checkpatch: handl...
429
430
  		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
  			substr($res, $off, 1, $;);
773647a09   Andy Whitcroft   update checkpatch...
431
432
433
434
435
  		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
  			substr($res, $off, 1, 'X');
  		} else {
  			substr($res, $off, 1, $c);
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
436
  	}
113f04a83   Daniel Walker   checkpatch: handl...
437
438
439
  	if ($sanitise_quote eq '//') {
  		$sanitise_quote = '';
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
440
  	# The pathname on a #include may be surrounded by '<' and '>'.
c45dcabd2   Andy Whitcroft   update checkpatch...
441
  	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
442
443
444
445
  		my $clean = 'X' x length($1);
  		$res =~ s@\<.*\>@<$clean>@;
  
  	# The whole of a #error is a string.
c45dcabd2   Andy Whitcroft   update checkpatch...
446
  	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
447
  		my $clean = 'X' x length($1);
c45dcabd2   Andy Whitcroft   update checkpatch...
448
  		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
c2fdda0df   Andy Whitcroft   update checkpatch...
449
  	}
00df344fd   Andy Whitcroft   update checkpatch...
450
451
  	return $res;
  }
8905a67c6   Andy Whitcroft   update checkpatch...
452
453
454
455
456
457
  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...
458
  	my $coff_set = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
459

13214adf7   Andy Whitcroft   update checkpatch...
460
  	my $loff = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
461
462
  	my $type = '';
  	my $level = 0;
a27506459   Andy Whitcroft   checkpatch: handl...
463
  	my @stack = ();
cf655043d   Andy Whitcroft   update checkpatch...
464
  	my $p;
8905a67c6   Andy Whitcroft   update checkpatch...
465
466
  	my $c;
  	my $len = 0;
13214adf7   Andy Whitcroft   update checkpatch...
467
468
  
  	my $remainder;
8905a67c6   Andy Whitcroft   update checkpatch...
469
  	while (1) {
a27506459   Andy Whitcroft   checkpatch: handl...
470
  		@stack = (['', 0]) if ($#stack == -1);
773647a09   Andy Whitcroft   update checkpatch...
471
472
  		#warn "CSB: blk<$blk> remain<$remain>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
473
474
475
476
  		# 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...
477
  				last if (!defined $lines[$line]);
c2fdda0df   Andy Whitcroft   update checkpatch...
478
  				next if ($lines[$line] =~ /^-/);
8905a67c6   Andy Whitcroft   update checkpatch...
479
  				$remain--;
13214adf7   Andy Whitcroft   update checkpatch...
480
  				$loff = $len;
c2fdda0df   Andy Whitcroft   update checkpatch...
481
482
  				$blk .= $lines[$line] . "
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
483
484
485
486
487
488
489
  				$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...
490
  			if ($off >= $len) {
8905a67c6   Andy Whitcroft   update checkpatch...
491
492
493
  				last;
  			}
  		}
cf655043d   Andy Whitcroft   update checkpatch...
494
  		$p = $c;
8905a67c6   Andy Whitcroft   update checkpatch...
495
  		$c = substr($blk, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
496
  		$remainder = substr($blk, $off);
8905a67c6   Andy Whitcroft   update checkpatch...
497

773647a09   Andy Whitcroft   update checkpatch...
498
499
  		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>
  ";
4635f4fba   Andy Whitcroft   checkpatch: track...
500
501
502
503
504
505
506
507
508
  
  		# 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...
509
510
511
512
513
  		# Statement ends at the ';' or a close '}' at the
  		# outermost level.
  		if ($level == 0 && $c eq ';') {
  			last;
  		}
13214adf7   Andy Whitcroft   update checkpatch...
514
  		# An else is really a conditional as long as its not else if
773647a09   Andy Whitcroft   update checkpatch...
515
516
517
518
519
520
521
522
523
524
  		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...
525
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
526
527
528
529
530
531
532
533
534
535
  		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...
536
537
538
  				$coff_set = 1;
  				#warn "CSB: mark coff<$coff>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
  			}
  		}
  		if (($type eq '' || $type eq '{') && $c eq '{') {
  			$level++;
  			$type = '{';
  		}
  		if ($type eq '{' && $c eq '}') {
  			$level--;
  			$type = ($level != 0)? '{' : '';
  
  			if ($level == 0) {
  				last;
  			}
  		}
  		$off++;
  	}
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
555
  	# We are truly at the end, so shuffle to the next line.
13214adf7   Andy Whitcroft   update checkpatch...
556
  	if ($off == $len) {
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
557
  		$loff = $len + 1;
13214adf7   Andy Whitcroft   update checkpatch...
558
559
560
  		$line++;
  		$remain--;
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
561
562
563
564
565
566
567
568
  
  	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...
569
570
  	#print "coff<$coff> soff<$off> loff<$loff>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
571
572
573
574
  
  	return ($statement, $condition,
  			$line, $remain + 1, $off - $loff + 1, $level);
  }
cf655043d   Andy Whitcroft   update checkpatch...
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
  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...
622
623
624
625
626
  sub ctx_statement_full {
  	my ($linenr, $remain, $off) = @_;
  	my ($statement, $condition, $level);
  
  	my (@chunks);
cf655043d   Andy Whitcroft   update checkpatch...
627
  	# Grab the first conditional/block pair.
13214adf7   Andy Whitcroft   update checkpatch...
628
629
  	($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
773647a09   Andy Whitcroft   update checkpatch...
630
631
  	#print "F: c<$condition> s<$statement> remain<$remain>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
632
633
634
635
636
637
638
639
  	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...
640
  	for (;;) {
13214adf7   Andy Whitcroft   update checkpatch...
641
642
  		($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
cf655043d   Andy Whitcroft   update checkpatch...
643
644
  		#print "C: c<$condition> s<$statement> remain<$remain>
  ";
773647a09   Andy Whitcroft   update checkpatch...
645
646
  		last if (!($remain > 0 && $condition =~ /^(?:\s*
  [+-])*\s*(?:else|do)\b/s));
cf655043d   Andy Whitcroft   update checkpatch...
647
648
649
  		#print "C: push
  ";
  		push(@chunks, [ $condition, $statement ]);
13214adf7   Andy Whitcroft   update checkpatch...
650
651
652
  	}
  
  	return ($level, $linenr, @chunks);
8905a67c6   Andy Whitcroft   update checkpatch...
653
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
654
  sub ctx_block_get {
f0a594c1c   Andy Whitcroft   update checkpatch...
655
  	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
4a0df2ef4   Andy Whitcroft   update checkpatch...
656
657
  	my $line;
  	my $start = $linenr - 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
658
659
660
661
  	my $blk = '';
  	my @o;
  	my @c;
  	my @res = ();
f0a594c1c   Andy Whitcroft   update checkpatch...
662
  	my $level = 0;
4635f4fba   Andy Whitcroft   checkpatch: track...
663
  	my @stack = ($level);
00df344fd   Andy Whitcroft   update checkpatch...
664
665
666
667
668
  	for ($line = $start; $remain > 0; $line++) {
  		next if ($rawlines[$line] =~ /^-/);
  		$remain--;
  
  		$blk .= $rawlines[$line];
4635f4fba   Andy Whitcroft   checkpatch: track...
669
670
671
672
673
674
675
676
677
  
  		# Handle nested #if/#else.
  		if ($rawlines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
  			push(@stack, $level);
  		} elsif ($rawlines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
  			$level = $stack[$#stack - 1];
  		} elsif ($rawlines[$line] =~ /^.\s*#\s*endif\b/) {
  			$level = pop(@stack);
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
678
679
680
681
682
683
684
  		foreach my $c (split(//, $rawlines[$line])) {
  			##print "C<$c>L<$level><$open$close>O<$off>
  ";
  			if ($off > 0) {
  				$off--;
  				next;
  			}
4a0df2ef4   Andy Whitcroft   update checkpatch...
685

f0a594c1c   Andy Whitcroft   update checkpatch...
686
687
688
689
690
691
692
  			if ($c eq $close && $level > 0) {
  				$level--;
  				last if ($level == 0);
  			} elsif ($c eq $open) {
  				$level++;
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
693

f0a594c1c   Andy Whitcroft   update checkpatch...
694
  		if (!$outer || $level <= 1) {
00df344fd   Andy Whitcroft   update checkpatch...
695
  			push(@res, $rawlines[$line]);
4a0df2ef4   Andy Whitcroft   update checkpatch...
696
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
697
  		last if ($level == 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
698
  	}
f0a594c1c   Andy Whitcroft   update checkpatch...
699
  	return ($level, @res);
4a0df2ef4   Andy Whitcroft   update checkpatch...
700
701
702
  }
  sub ctx_block_outer {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
703
704
  	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
  	return @r;
4a0df2ef4   Andy Whitcroft   update checkpatch...
705
706
707
  }
  sub ctx_block {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
708
709
  	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
  	return @r;
653d4876b   Andy Whitcroft   update checkpatch...
710
711
  }
  sub ctx_statement {
f0a594c1c   Andy Whitcroft   update checkpatch...
712
713
714
715
716
717
  	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...
718
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
719
  	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
720
  }
9c0ca6f9a   Andy Whitcroft   update checkpatch...
721
722
723
724
725
  sub ctx_statement_level {
  	my ($linenr, $remain, $off) = @_;
  
  	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
726
727
728
729
730
  
  sub ctx_locate_comment {
  	my ($first_line, $end_line) = @_;
  
  	# Catch a comment on the end of the line itself.
beae63324   Andy Whitcroft   checkpatch: comme...
731
  	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
4a0df2ef4   Andy Whitcroft   update checkpatch...
732
733
734
735
736
737
738
  	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...
739
740
741
  		my $line = $rawlines[$linenr - 1];
  		#warn "           $line
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
  		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...
764
765
  	##print "LINE: $rawlines[$end_line - 1 ]
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
766
767
768
769
770
  	##print "CMMT: $cmt
  ";
  
  	return ($cmt ne '');
  }
4d001e4d8   Andy Whitcroft   checkpatch: repor...
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
  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...
786
787
788
  sub cat_vet {
  	my ($vet) = @_;
  	my ($res, $coded);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
789

6c72ffaab   Andy Whitcroft   update checkpatch...
790
791
792
793
794
795
  	$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...
796
797
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
798
  	$res =~ s/$/\$/;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
799

6c72ffaab   Andy Whitcroft   update checkpatch...
800
  	return $res;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
801
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
802
  my $av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
803
  my $av_pending;
c2fdda0df   Andy Whitcroft   update checkpatch...
804
  my @av_paren_type;
1f65f947a   Andy Whitcroft   checkpatch: add c...
805
  my $av_pend_colon;
c2fdda0df   Andy Whitcroft   update checkpatch...
806
807
808
  
  sub annotate_reset {
  	$av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
809
810
  	$av_pending = '_';
  	@av_paren_type = ('E');
1f65f947a   Andy Whitcroft   checkpatch: add c...
811
  	$av_pend_colon = 'O';
c2fdda0df   Andy Whitcroft   update checkpatch...
812
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
813
814
  sub annotate_values {
  	my ($stream, $type) = @_;
0a920b5b6   Andy Whitcroft   add a trivial pat...
815

6c72ffaab   Andy Whitcroft   update checkpatch...
816
  	my $res;
1f65f947a   Andy Whitcroft   checkpatch: add c...
817
  	my $var = '_' x length($stream);
6c72ffaab   Andy Whitcroft   update checkpatch...
818
  	my $cur = $stream;
c2fdda0df   Andy Whitcroft   update checkpatch...
819
820
  	print "$stream
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
821

6c72ffaab   Andy Whitcroft   update checkpatch...
822
  	while (length($cur)) {
773647a09   Andy Whitcroft   update checkpatch...
823
  		@av_paren_type = ('E') if ($#av_paren_type < 0);
cf655043d   Andy Whitcroft   update checkpatch...
824
  		print " <" . join('', @av_paren_type) .
171ae1a49   Andy Whitcroft   update checkpatch...
825
  				"> <$type> <$av_pending>" if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
826
  		if ($cur =~ /^(\s+)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
827
828
829
830
  			print "WS($1)
  " if ($dbg_values > 1);
  			if ($1 =~ /
  / && $av_preprocessor) {
cf655043d   Andy Whitcroft   update checkpatch...
831
  				$type = pop(@av_paren_type);
c2fdda0df   Andy Whitcroft   update checkpatch...
832
  				$av_preprocessor = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
833
  			}
8ea3eb9a2   Andy Whitcroft   checkpatch: handl...
834
  		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\()/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
835
836
  			print "DECLARE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
837
  			$type = 'T';
389a2fe57   Andy Whitcroft   checkpatch: allow...
838
839
840
841
  		} elsif ($cur =~ /^($Modifier)\s*/) {
  			print "MODIFIER($1)
  " if ($dbg_values > 1);
  			$type = 'T';
c45dcabd2   Andy Whitcroft   update checkpatch...
842
  		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
843
844
  			print "DEFINE($1,$2)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
845
  			$av_preprocessor = 1;
171ae1a49   Andy Whitcroft   update checkpatch...
846
847
848
849
850
  			push(@av_paren_type, $type);
  			if ($2 ne '') {
  				$av_pending = 'N';
  			}
  			$type = 'E';
c45dcabd2   Andy Whitcroft   update checkpatch...
851
  		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
852
853
854
855
  			print "UNDEF($1)
  " if ($dbg_values > 1);
  			$av_preprocessor = 1;
  			push(@av_paren_type, $type);
6c72ffaab   Andy Whitcroft   update checkpatch...
856

c45dcabd2   Andy Whitcroft   update checkpatch...
857
  		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
858
859
  			print "PRE_START($1)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
860
  			$av_preprocessor = 1;
cf655043d   Andy Whitcroft   update checkpatch...
861
862
863
  
  			push(@av_paren_type, $type);
  			push(@av_paren_type, $type);
171ae1a49   Andy Whitcroft   update checkpatch...
864
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
865

c45dcabd2   Andy Whitcroft   update checkpatch...
866
  		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
867
868
869
870
871
  			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...
872
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
873

c45dcabd2   Andy Whitcroft   update checkpatch...
874
  		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
875
876
877
878
879
880
881
882
883
  			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...
884
  			$type = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
885
886
887
  
  		} elsif ($cur =~ /^(\\
  )/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
888
889
  			print "PRECONT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
890

171ae1a49   Andy Whitcroft   update checkpatch...
891
892
893
894
895
  		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
  			print "ATTR($1)
  " if ($dbg_values > 1);
  			$av_pending = $type;
  			$type = 'N';
6c72ffaab   Andy Whitcroft   update checkpatch...
896
  		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
897
898
  			print "SIZEOF($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
899
  			if (defined $2) {
cf655043d   Andy Whitcroft   update checkpatch...
900
  				$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
901
902
  			}
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
903
  		} elsif ($cur =~ /^(if|while|for)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
904
905
  			print "COND($1)
  " if ($dbg_values > 1);
14b111c15   Andy Whitcroft   checkpatch: condi...
906
  			$av_pending = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
907
  			$type = 'N';
1f65f947a   Andy Whitcroft   checkpatch: add c...
908
909
910
911
912
  		} elsif ($cur =~/^(case)/o) {
  			print "CASE($1)
  " if ($dbg_values > 1);
  			$av_pend_colon = 'C';
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
913
  		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
914
915
  			print "KEYWORD($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
916
917
918
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\()/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
919
920
  			print "PAREN('$1')
  " if ($dbg_values > 1);
cf655043d   Andy Whitcroft   update checkpatch...
921
922
  			push(@av_paren_type, $av_pending);
  			$av_pending = '_';
6c72ffaab   Andy Whitcroft   update checkpatch...
923
924
925
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
926
927
928
  			my $new_type = pop(@av_paren_type);
  			if ($new_type ne '_') {
  				$type = $new_type;
c2fdda0df   Andy Whitcroft   update checkpatch...
929
930
931
  				print "PAREN('$1') -> $type
  "
  							if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
932
  			} else {
c2fdda0df   Andy Whitcroft   update checkpatch...
933
934
  				print "PAREN('$1')
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
935
  			}
c8cb2ca37   Andy Whitcroft   checkpatch: types...
936
  		} elsif ($cur =~ /^($Ident)\s*\(/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
937
938
  			print "FUNC($1)
  " if ($dbg_values > 1);
c8cb2ca37   Andy Whitcroft   checkpatch: types...
939
  			$type = 'V';
cf655043d   Andy Whitcroft   update checkpatch...
940
  			$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
941

8e761b04a   Andy Whitcroft   checkpatch: detec...
942
943
  		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
  			if (defined $2 && $type eq 'C' || $type eq 'T') {
1f65f947a   Andy Whitcroft   checkpatch: add c...
944
  				$av_pend_colon = 'B';
8e761b04a   Andy Whitcroft   checkpatch: detec...
945
946
  			} elsif ($type eq 'E') {
  				$av_pend_colon = 'L';
1f65f947a   Andy Whitcroft   checkpatch: add c...
947
948
949
950
  			}
  			print "IDENT_COLON($1,$type>$av_pend_colon)
  " if ($dbg_values > 1);
  			$type = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
951
  		} elsif ($cur =~ /^($Ident|$Constant)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
952
953
  			print "IDENT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
954
955
956
  			$type = 'V';
  
  		} elsif ($cur =~ /^($Assignment)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
957
958
  			print "ASSIGN($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
959
  			$type = 'N';
cf655043d   Andy Whitcroft   update checkpatch...
960
  		} elsif ($cur =~/^(;|{|})/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
961
962
  			print "END($1)
  " if ($dbg_values > 1);
13214adf7   Andy Whitcroft   update checkpatch...
963
  			$type = 'E';
1f65f947a   Andy Whitcroft   checkpatch: add c...
964
  			$av_pend_colon = 'O';
8e761b04a   Andy Whitcroft   checkpatch: detec...
965
966
967
968
  		} elsif ($cur =~/^(,)/) {
  			print "COMMA($1)
  " if ($dbg_values > 1);
  			$type = 'C';
1f65f947a   Andy Whitcroft   checkpatch: add c...
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
  		} 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...
985

8e761b04a   Andy Whitcroft   checkpatch: detec...
986
  		} elsif ($cur =~ /^(\[)/o) {
13214adf7   Andy Whitcroft   update checkpatch...
987
988
  			print "CLOSE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
989
  			$type = 'N';
0d413866c   Andy Whitcroft   checkpatch: value...
990
  		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
74048ed81   Andy Whitcroft   checkpatch: varia...
991
992
993
994
995
996
997
998
999
1000
1001
1002
  			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...
1003
  		} elsif ($cur =~ /^($Operators)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1004
1005
  			print "OP($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1006
1007
1008
1009
1010
  			if ($1 ne '++' && $1 ne '--') {
  				$type = 'N';
  			}
  
  		} elsif ($cur =~ /(^.)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1011
1012
  			print "C($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1013
1014
1015
1016
1017
  		}
  		if (defined $1) {
  			$cur = substr($cur, length($1));
  			$res .= $type x length($1);
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1018
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1019

1f65f947a   Andy Whitcroft   checkpatch: add c...
1020
  	return ($res, $var);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1021
  }
8905a67c6   Andy Whitcroft   update checkpatch...
1022
  sub possible {
13214adf7   Andy Whitcroft   update checkpatch...
1023
  	my ($possible, $line) = @_;
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1024
  	my $notPermitted = qr{(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1025
1026
1027
1028
  		^(?:
  			$Modifier|
  			$Storage|
  			$Type|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1029
1030
1031
  			DEFINE_\S+
  		)$|
  		^(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1032
1033
1034
1035
1036
1037
  			goto|
  			return|
  			case|
  			else|
  			asm|__asm__|
  			do
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1038
  		)(?:\s|$)|
0776e5946   Andy Whitcroft   checkpatch: do is...
1039
  		^(?:typedef|struct|enum)\b
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1040
1041
1042
1043
  	    )}x;
  	warn "CHECK<$possible> ($line)
  " if ($dbg_possible > 2);
  	if ($possible !~ $notPermitted) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1044
1045
1046
1047
1048
1049
1050
  		# 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...
1051
  			for my $modifier (split(' ', $possible)) {
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1052
1053
1054
1055
1056
  				if ($modifier !~ $notPermitted) {
  					warn "MODIFIER: $modifier ($possible) ($line)
  " if ($dbg_possible);
  					push(@modifierList, $modifier);
  				}
d25065865   Andy Whitcroft   checkpatch: possi...
1057
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
1058
1059
1060
1061
1062
1063
  
  		} else {
  			warn "POSSIBLE: $possible ($line)
  " if ($dbg_possible);
  			push(@typeList, $possible);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1064
  		build_types();
0776e5946   Andy Whitcroft   checkpatch: do is...
1065
1066
1067
  	} else {
  		warn "NOTPOSS: $possible ($line)
  " if ($dbg_possible > 1);
8905a67c6   Andy Whitcroft   update checkpatch...
1068
1069
  	}
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1070
  my $prefix = '';
f0a594c1c   Andy Whitcroft   update checkpatch...
1071
  sub report {
773647a09   Andy Whitcroft   update checkpatch...
1072
1073
1074
  	if (defined $tst_only && $_[0] !~ /\Q$tst_only\E/) {
  		return 0;
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
1075
1076
1077
1078
1079
  	my $line = $prefix . $_[0];
  
  	$line = (split('
  ', $line))[0] . "
  " if ($terse);
13214adf7   Andy Whitcroft   update checkpatch...
1080
  	push(our @report, $line);
773647a09   Andy Whitcroft   update checkpatch...
1081
1082
  
  	return 1;
f0a594c1c   Andy Whitcroft   update checkpatch...
1083
1084
  }
  sub report_dump {
13214adf7   Andy Whitcroft   update checkpatch...
1085
  	our @report;
f0a594c1c   Andy Whitcroft   update checkpatch...
1086
  }
de7d4f0e1   Andy Whitcroft   update checkpatch...
1087
  sub ERROR {
773647a09   Andy Whitcroft   update checkpatch...
1088
1089
1090
1091
1092
  	if (report("ERROR: $_[0]
  ")) {
  		our $clean = 0;
  		our $cnt_error++;
  	}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1093
1094
  }
  sub WARN {
773647a09   Andy Whitcroft   update checkpatch...
1095
1096
1097
1098
1099
  	if (report("WARNING: $_[0]
  ")) {
  		our $clean = 0;
  		our $cnt_warn++;
  	}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1100
1101
  }
  sub CHK {
773647a09   Andy Whitcroft   update checkpatch...
1102
1103
  	if ($check && report("CHECK: $_[0]
  ")) {
6c72ffaab   Andy Whitcroft   update checkpatch...
1104
1105
1106
  		our $clean = 0;
  		our $cnt_chk++;
  	}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1107
  }
6ecd96744   Andy Whitcroft   checkpatch: repor...
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
  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 ".../") {
  		WARN("use relative pathname instead of absolute in changelog text
  " . $herecurr);
  	}
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
1138
1139
  sub process {
  	my $filename = shift;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1140
1141
1142
  
  	my $linenr=0;
  	my $prevline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
1143
  	my $prevrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1144
  	my $stashline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
1145
  	my $stashrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1146

4a0df2ef4   Andy Whitcroft   update checkpatch...
1147
  	my $length;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1148
1149
1150
  	my $indent;
  	my $previndent=0;
  	my $stashindent=0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1151
  	our $clean = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1152
1153
  	my $signoff = 0;
  	my $is_patch = 0;
13214adf7   Andy Whitcroft   update checkpatch...
1154
  	our @report = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
1155
1156
1157
1158
  	our $cnt_lines = 0;
  	our $cnt_error = 0;
  	our $cnt_warn = 0;
  	our $cnt_chk = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1159
1160
1161
1162
1163
1164
  	# 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...
1165
  	my $comment_edge = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1166
  	my $first_line = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
1167
  	my $p1_prefix = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
1168

13214adf7   Andy Whitcroft   update checkpatch...
1169
1170
1171
  	my $prev_values = 'E';
  
  	# suppression flags
773647a09   Andy Whitcroft   update checkpatch...
1172
  	my %suppress_ifbraces;
170d3a226   Andy Whitcroft   checkpatch: handl...
1173
  	my %suppress_whiletrailers;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1174
  	my %suppress_export;
653d4876b   Andy Whitcroft   update checkpatch...
1175

c2fdda0df   Andy Whitcroft   update checkpatch...
1176
  	# Pre-scan the patch sanitizing the lines.
de7d4f0e1   Andy Whitcroft   update checkpatch...
1177
  	# Pre-scan the patch looking for any __setup documentation.
c2fdda0df   Andy Whitcroft   update checkpatch...
1178
  	#
de7d4f0e1   Andy Whitcroft   update checkpatch...
1179
1180
  	my @setup_docs = ();
  	my $setup_docs = 0;
773647a09   Andy Whitcroft   update checkpatch...
1181
1182
  
  	sanitise_line_reset();
c2fdda0df   Andy Whitcroft   update checkpatch...
1183
1184
  	my $line;
  	foreach my $rawline (@rawlines) {
773647a09   Andy Whitcroft   update checkpatch...
1185
1186
  		$linenr++;
  		$line = $rawline;
c2fdda0df   Andy Whitcroft   update checkpatch...
1187

773647a09   Andy Whitcroft   update checkpatch...
1188
  		if ($rawline=~/^\+\+\+\s+(\S+)/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1189
1190
1191
1192
  			$setup_docs = 0;
  			if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
  				$setup_docs = 1;
  			}
773647a09   Andy Whitcroft   update checkpatch...
1193
1194
1195
1196
1197
1198
1199
1200
1201
  			#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...
1202
  			$in_comment = 0;
773647a09   Andy Whitcroft   update checkpatch...
1203
1204
1205
1206
1207
1208
  
  			# 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...
1209
1210
1211
1212
1213
1214
1215
  			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...
1216
  				last if (!defined $rawlines[$ln - 1]);
fae17daed   Andy Whitcroft   checkpatch: comme...
1217
1218
1219
1220
1221
  				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
  				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
  					($edge) = $1;
  					last;
  				}
773647a09   Andy Whitcroft   update checkpatch...
1222
1223
1224
1225
1226
1227
1228
1229
1230
  			}
  			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...
1231
  			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
773647a09   Andy Whitcroft   update checkpatch...
1232
1233
1234
1235
1236
1237
1238
  			{
  				$in_comment = 1;
  			}
  
  			##print "COMMENT:$in_comment edge<$edge> $rawline
  ";
  			sanitise_line_reset($in_comment);
171ae1a49   Andy Whitcroft   update checkpatch...
1239
  		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
773647a09   Andy Whitcroft   update checkpatch...
1240
  			# Standardise the strings and chars within the input to
171ae1a49   Andy Whitcroft   update checkpatch...
1241
  			# simplify matching -- only bother with positive lines.
773647a09   Andy Whitcroft   update checkpatch...
1242
  			$line = sanitise_line($rawline);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1243
  		}
773647a09   Andy Whitcroft   update checkpatch...
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
  		push(@lines, $line);
  
  		if ($realcnt > 1) {
  			$realcnt-- if ($line =~ /^(?:\+| |$)/);
  		} else {
  			$realcnt = 0;
  		}
  
  		#print "==>$rawline
  ";
  		#print "-->$line
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
1256
1257
1258
1259
1260
  
  		if ($setup_docs && $line =~ /^\+/) {
  			push(@setup_docs, $line);
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
1261
  	$prefix = '';
773647a09   Andy Whitcroft   update checkpatch...
1262
1263
  	$realcnt = 0;
  	$linenr = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1264
1265
  	foreach my $line (@lines) {
  		$linenr++;
c2fdda0df   Andy Whitcroft   update checkpatch...
1266
  		my $rawline = $rawlines[$linenr - 1];
6c72ffaab   Andy Whitcroft   update checkpatch...
1267

0a920b5b6   Andy Whitcroft   add a trivial pat...
1268
  #extract the line range in the file after the patch is applied
6c72ffaab   Andy Whitcroft   update checkpatch...
1269
  		if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
1270
  			$is_patch = 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1271
  			$first_line = $linenr + 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1272
1273
1274
1275
1276
1277
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
1278
  			annotate_reset();
13214adf7   Andy Whitcroft   update checkpatch...
1279
  			$prev_values = 'E';
773647a09   Andy Whitcroft   update checkpatch...
1280
  			%suppress_ifbraces = ();
170d3a226   Andy Whitcroft   checkpatch: handl...
1281
  			%suppress_whiletrailers = ();
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1282
  			%suppress_export = ();
0a920b5b6   Andy Whitcroft   add a trivial pat...
1283
  			next;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1284

4a0df2ef4   Andy Whitcroft   update checkpatch...
1285
1286
1287
  # 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...
1288
  		} elsif ($line =~ /^( |\+|$)/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
1289
  			$realline++;
d8aaf1214   Andy Whitcroft   update checkpatch...
1290
  			$realcnt-- if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1291

4a0df2ef4   Andy Whitcroft   update checkpatch...
1292
  			# Measure the line length and indent.
c2fdda0df   Andy Whitcroft   update checkpatch...
1293
  			($length, $indent) = line_stats($rawline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1294
1295
1296
1297
  
  			# Track the previous line.
  			($prevline, $stashline) = ($stashline, $line);
  			($previndent, $stashindent) = ($stashindent, $indent);
c2fdda0df   Andy Whitcroft   update checkpatch...
1298
  			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
773647a09   Andy Whitcroft   update checkpatch...
1299
1300
  			#warn "line<$line>
  ";
6c72ffaab   Andy Whitcroft   update checkpatch...
1301

d8aaf1214   Andy Whitcroft   update checkpatch...
1302
1303
  		} elsif ($realcnt == 1) {
  			$realcnt--;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1304
  		}
cc77cdca5   Andy Whitcroft   checkpatch: corre...
1305
  		my $hunk_line = ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1306
  #make up the handle for any error we report on this line
773647a09   Andy Whitcroft   update checkpatch...
1307
1308
  		$prefix = "$filename:$realline: " if ($emacs && $file);
  		$prefix = "$filename:$linenr: " if ($emacs && !$file);
6c72ffaab   Andy Whitcroft   update checkpatch...
1309
1310
  		$here = "#$linenr: " if (!$file);
  		$here = "#$realline: " if ($file);
773647a09   Andy Whitcroft   update checkpatch...
1311
1312
1313
1314
  
  		# extract the filename as it passes
  		if ($line=~/^\+\+\+\s+(\S+)/) {
  			$realfile = $1;
1e8557269   Wolfram Sang   checkpatch: Add w...
1315
1316
1317
  			$realfile =~ s@^([^/]*)/@@;
  
  			$p1_prefix = $1;
e2f7aa4b8   Andy Whitcroft   checkpatch: do no...
1318
1319
  			if (!$file && $tree && $p1_prefix ne '' &&
  			    -e "$root/$p1_prefix") {
1e8557269   Wolfram Sang   checkpatch: Add w...
1320
1321
1322
  				WARN("patch prefix '$p1_prefix' exists, appears to be a -p0 patch
  ");
  			}
773647a09   Andy Whitcroft   update checkpatch...
1323

c1ab33269   Andy Whitcroft   checkpatch: inclu...
1324
  			if ($realfile =~ m@^include/asm/@) {
773647a09   Andy Whitcroft   update checkpatch...
1325
1326
1327
1328
1329
1330
  				ERROR("do not modify files in include/asm, change architecture specific files in include/asm-<architecture>
  " . "$here$rawline
  ");
  			}
  			next;
  		}
389834b68   Randy Dunlap   checkpatch: produ...
1331
  		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1332

c2fdda0df   Andy Whitcroft   update checkpatch...
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
  		my $hereline = "$here
  $rawline
  ";
  		my $herecurr = "$here
  $rawline
  ";
  		my $hereprev = "$here
  $prevrawline
  $rawline
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1343

6c72ffaab   Andy Whitcroft   update checkpatch...
1344
  		$cnt_lines++ if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1345
  #check the patch for a signoff:
d8aaf1214   Andy Whitcroft   update checkpatch...
1346
  		if ($line =~ /^\s*signed-off-by:/i) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
1347
1348
  			# This is a signoff, if ugly, so do not double report.
  			$signoff++;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1349
  			if (!($line =~ /^\s*Signed-off-by:/)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1350
1351
1352
  				WARN("Signed-off-by: is the preferred form
  " .
  					$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1353
1354
  			}
  			if ($line =~ /^\s*signed-off-by:\S/i) {
773647a09   Andy Whitcroft   update checkpatch...
1355
1356
  				WARN("space required after Signed-off-by:
  " .
de7d4f0e1   Andy Whitcroft   update checkpatch...
1357
  					$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1358
1359
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1360
  # Check for wrappage within a valid hunk of the file
8905a67c6   Andy Whitcroft   update checkpatch...
1361
  		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1362
1363
  			ERROR("patch seems to be corrupt (line wrapped?)
  " .
6c72ffaab   Andy Whitcroft   update checkpatch...
1364
  				$herecurr) if (!$emitted_corrupt++);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1365
  		}
6ecd96744   Andy Whitcroft   checkpatch: repor...
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
  # 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...
1379
1380
  # 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...
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
  		    $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
  ";
  
  			ERROR("Invalid UTF-8, patch and commit message should be encoded in UTF-8
  " . $hereptr);
00df344fd   Andy Whitcroft   update checkpatch...
1391
  		}
306708547   Andy Whitcroft   checkpatch: ensur...
1392
1393
  # ignore non-hunk lines and lines being removed
  		next if (!$hunk_line || $line =~ /^-/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1394

0a920b5b6   Andy Whitcroft   add a trivial pat...
1395
  #trailing whitespace
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1396
  		if ($line =~ /^\+.*\015/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1397
1398
1399
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1400
1401
  			ERROR("DOS line endings
  " . $herevet);
c2fdda0df   Andy Whitcroft   update checkpatch...
1402
1403
1404
1405
  		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
1406
1407
  			ERROR("trailing whitespace
  " . $herevet);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1408
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
1409

3354957a4   Andi Kleen   checkpatch: add c...
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
  # check for Kconfig help text having a real description
  		if ($realfile =~ /Kconfig/ &&
  		    $line =~ /\+?\s*(---)?help(---)?$/) {
  			my $length = 0;
  			for (my $l = $linenr; defined($lines[$l]); $l++) {
  				my $f = $lines[$l];
  				$f =~ s/#.*//;
  				$f =~ s/^\s+//;
  				next if ($f =~ /^$/);
  				last if ($f =~ /^\s*config\s/);
  				$length++;
  			}
  			WARN("please write a paragraph that describes the config symbol fully
  " . $herecurr) if ($length < 4);
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
1425
1426
  # check we are in a valid source file if not then ignore this hunk
  		next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1427
  #80 column limit
c45dcabd2   Andy Whitcroft   update checkpatch...
1428
  		if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
f4c014c0d   Andy Whitcroft   checkpatch: allow...
1429
  		    $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
691e669ba   Joe Perches   checkpatch.pl: al...
1430
  		    $line !~ /^\+\s*$logFunctions\s*\(\s*(?:KERN_\S+\s*)?"[X\t]*"\s*(?:,|\)\s*;)\s*$/ &&
f4c014c0d   Andy Whitcroft   checkpatch: allow...
1431
  		    $length > 80)
c45dcabd2   Andy Whitcroft   update checkpatch...
1432
  		{
de7d4f0e1   Andy Whitcroft   update checkpatch...
1433
1434
  			WARN("line over 80 characters
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1435
  		}
5e79d96ee   Joe Perches   checkpatch: warn ...
1436
1437
1438
1439
1440
1441
  # check for spaces before a quoted newline
  		if ($rawline =~ /^.*\".*\s\
  /) {
  			WARN("unnecessary whitespace before a quoted newline
  " . $herecurr);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1442
1443
1444
1445
1446
  # check for adding lines without a newline.
  		if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
  			WARN("adding a line without newline at end of file
  " . $herecurr);
  		}
42e41c54d   Mike Frysinger   checkpatch: add s...
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
  # 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) . "
  ";
  				ERROR("use the LO() macro, not (... & 0xFFFF)
  " . $herevet);
  			}
  			if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
  				my $herevet = "$here
  " . cat_vet($line) . "
  ";
  				ERROR("use the HI() macro, not (... >> 16)
  " . $herevet);
  			}
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
1464
1465
  # 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...
1466
1467
1468
  
  # at the beginning of a line any tabs must come first and anything
  # more than 8 must use tabs.
c2fdda0df   Andy Whitcroft   update checkpatch...
1469
1470
1471
1472
1473
  		if ($rawline =~ /^\+\s* \t\s*\S/ ||
  		    $rawline =~ /^\+\s*        \s*/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
171ae1a49   Andy Whitcroft   update checkpatch...
1474
1475
  			ERROR("code indent should use tabs where possible
  " . $herevet);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1476
  		}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
1477
1478
1479
1480
1481
1482
1483
1484
  # check for space before tabs.
  		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
  			WARN("please, no space before tabs
  " . $herevet);
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
1485
1486
  # check we are in a valid C source file if not then ignore this hunk
  		next if ($realfile !~ /\.(h|c)$/);
c2fdda0df   Andy Whitcroft   update checkpatch...
1487
  # check for RCS/CVS revision markers
cf655043d   Andy Whitcroft   update checkpatch...
1488
  		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1489
1490
1491
  			WARN("CVS style keyword markers, these will _not_ be updated
  ". $herecurr);
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
1492

42e41c54d   Mike Frysinger   checkpatch: add s...
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
  # Blackfin: don't use __builtin_bfin_[cs]sync
  		if ($line =~ /__builtin_bfin_csync/) {
  			my $herevet = "$here
  " . cat_vet($line) . "
  ";
  			ERROR("use the CSYNC() macro in asm/blackfin.h
  " . $herevet);
  		}
  		if ($line =~ /__builtin_bfin_ssync/) {
  			my $herevet = "$here
  " . cat_vet($line) . "
  ";
  			ERROR("use the SSYNC() macro in asm/blackfin.h
  " . $herevet);
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1508
  # Check for potential 'bare' types
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1509
1510
  		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
  		    $realline_next);
9c9ba34ee   Andy Whitcroft   update checkpatch...
1511
  		if ($realcnt && $line =~ /.\s*\S/) {
170d3a226   Andy Whitcroft   checkpatch: handl...
1512
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
1513
  				ctx_statement_block($linenr, $realcnt, 0);
171ae1a49   Andy Whitcroft   update checkpatch...
1514
1515
1516
1517
1518
1519
  			$stat =~ s/
  ./
   /g;
  			$cond =~ s/
  ./
   /g;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1520
1521
1522
1523
1524
1525
1526
  			# 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...
1527
1528
  			my $s = $stat;
  			$s =~ s/{.*$//s;
cf655043d   Andy Whitcroft   update checkpatch...
1529

c2fdda0df   Andy Whitcroft   update checkpatch...
1530
  			# Ignore goto labels.
171ae1a49   Andy Whitcroft   update checkpatch...
1531
  			if ($s =~ /$Ident:\*$/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1532
1533
  
  			# Ignore functions being called
171ae1a49   Andy Whitcroft   update checkpatch...
1534
  			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1535

463f28648   Andy Whitcroft   checkpatch: possi...
1536
  			} elsif ($s =~ /^.\s*else\b/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1537
  			# declarations always start with types
d25065865   Andy Whitcroft   checkpatch: possi...
1538
  			} 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...
1539
1540
1541
  				my $type = $1;
  				$type =~ s/\s+/ /g;
  				possible($type, "A:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1542
  			# definitions in global scope can only start with types
a6a840628   Andy Whitcroft   checkpatch: label...
1543
  			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1544
  				possible($1, "B:" . $s);
c2fdda0df   Andy Whitcroft   update checkpatch...
1545
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1546
1547
  
  			# any (foo ... *) is a pointer cast, and foo is a type
65863862b   Andy Whitcroft   checkpatch: dissa...
1548
  			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1549
  				possible($1, "C:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1550
1551
1552
1553
1554
  			}
  
  			# Check for any sort of function declaration.
  			# int foo(something bar, other baz);
  			# void (*store_gdt)(x86_descr_ptr *);
171ae1a49   Andy Whitcroft   update checkpatch...
1555
  			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...
1556
  				my ($name_len) = length($1);
8905a67c6   Andy Whitcroft   update checkpatch...
1557

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

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

c45dcabd2   Andy Whitcroft   update checkpatch...
1565
  						possible($1, "D:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1566
1567
  					}
  				}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1568
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1569

9c0ca6f9a   Andy Whitcroft   update checkpatch...
1570
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1571
1572
1573
  #
  # Checks which may be anchored in the context.
  #
00df344fd   Andy Whitcroft   update checkpatch...
1574

653d4876b   Andy Whitcroft   update checkpatch...
1575
1576
  # Check for switch () and associated case and default
  # statements should be at the same indent.
00df344fd   Andy Whitcroft   update checkpatch...
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
  		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 '') {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1595
1596
  				ERROR("switch and case should be at the same indent
  $hereline$err");
de7d4f0e1   Andy Whitcroft   update checkpatch...
1597
1598
1599
1600
1601
  			}
  		}
  
  # 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...
1602
  		if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
773647a09   Andy Whitcroft   update checkpatch...
1603
  			my $pre_ctx = "$1$2";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1604
  			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1605
1606
1607
  			my $ctx_cnt = $realcnt - $#ctx - 1;
  			my $ctx = join("
  ", @ctx);
548596d52   Andy Whitcroft   checkpatch: trail...
1608
1609
  			my $ctx_ln = $linenr;
  			my $ctx_skip = $realcnt;
773647a09   Andy Whitcroft   update checkpatch...
1610

548596d52   Andy Whitcroft   checkpatch: trail...
1611
1612
1613
1614
1615
1616
  			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...
1617
  				$ctx_ln++;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1618
  			}
548596d52   Andy Whitcroft   checkpatch: trail...
1619

53210168f   Andy Whitcroft   checkpatch: tough...
1620
1621
1622
1623
1624
1625
1626
  			#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...
1627

773647a09   Andy Whitcroft   update checkpatch...
1628
1629
1630
  			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
  				ERROR("that open brace { should be on the previous line
  " .
c45dcabd2   Andy Whitcroft   update checkpatch...
1631
1632
1633
1634
  					"$here
  $ctx
  $lines[$ctx_ln - 1]
  ");
00df344fd   Andy Whitcroft   update checkpatch...
1635
  			}
773647a09   Andy Whitcroft   update checkpatch...
1636
1637
1638
1639
  			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
  			    $ctx =~ /\)\s*\;\s*$/ &&
  			    defined $lines[$ctx_ln - 1])
  			{
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1640
1641
  				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
  				if ($nindent > $indent) {
773647a09   Andy Whitcroft   update checkpatch...
1642
1643
  					WARN("trailing semicolon indicates no statements, indent implies otherwise
  " .
c45dcabd2   Andy Whitcroft   update checkpatch...
1644
1645
1646
1647
  						"$here
  $ctx
  $lines[$ctx_ln - 1]
  ");
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1648
1649
  				}
  			}
00df344fd   Andy Whitcroft   update checkpatch...
1650
  		}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
  # Check relative indent for conditionals and blocks.
  		if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
  			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...
1665
1666
1667
  			my @newlines = ($c =~ /
  /gs);
  			my $cond_lines = 1 + $#newlines;
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
  
  			# 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...
1681
1682
  			if ($s =~ s/^\s*?
  //) {
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
  				$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...
1693
  			my $cond_ptr = -1;
740504c61   Andy Whitcroft   checkpatch: suspe...
1694
  			$continuation = 0;
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
1695
1696
  			while ($cond_ptr != $cond_lines) {
  				$cond_ptr = $cond_lines;
f16fa28f7   Andy Whitcroft   checkpatch: suspe...
1697
1698
1699
1700
1701
  				# 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...
1702
1703
1704
1705
  				# Ignore:
  				#  1) blank lines, they should be at 0,
  				#  2) preprocessor lines, and
  				#  3) labels.
740504c61   Andy Whitcroft   checkpatch: suspe...
1706
1707
1708
  				if ($continuation ||
  				    $s =~ /^\s*?
  / ||
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
1709
1710
  				    $s =~ /^\s*#\s*?/ ||
  				    $s =~ /^\s*$Ident\s*:/) {
740504c61   Andy Whitcroft   checkpatch: suspe...
1711
1712
  					$continuation = ($s =~ /^.*?\\
  /) ? 1 : 0;
30dad6ebe   Andy Whitcroft   checkpatch: inden...
1713
1714
1715
1716
  					if ($s =~ s/^.*?
  //) {
  						$cond_lines++;
  					}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
1717
  				}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
  			}
  
  			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...
1733
1734
  			#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...
1735
1736
1737
1738
1739
1740
1741
1742
  
  			if ($check && (($sindent % 8) != 0 ||
  			    ($sindent <= $indent && $s ne ''))) {
  				WARN("suspect code indent for conditional statements ($indent, $sindent)
  " . $herecurr . "$stat_real
  ");
  			}
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
1743
1744
  		# Track the 'values' across context and added lines.
  		my $opline = $line; $opline =~ s/^./ /;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1745
1746
1747
  		my ($curr_values, $curr_vars) =
  				annotate_values($opline . "
  ", $prev_values);
6c72ffaab   Andy Whitcroft   update checkpatch...
1748
  		$curr_values = $prev_values . $curr_values;
c2fdda0df   Andy Whitcroft   update checkpatch...
1749
1750
  		if ($dbg_values) {
  			my $outline = $opline; $outline =~ s/\t/ /g;
cf655043d   Andy Whitcroft   update checkpatch...
1751
1752
1753
1754
  			print "$linenr > .$outline
  ";
  			print "$linenr > $curr_values
  ";
1f65f947a   Andy Whitcroft   checkpatch: add c...
1755
1756
  			print "$linenr >  $curr_vars
  ";
c2fdda0df   Andy Whitcroft   update checkpatch...
1757
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
1758
  		$prev_values = substr($curr_values, -1);
00df344fd   Andy Whitcroft   update checkpatch...
1759
1760
  #ignore lines not being added
  		if ($line=~/^[^\+]/) {next;}
653d4876b   Andy Whitcroft   update checkpatch...
1761
  # TEST: allow direct testing of the type matcher.
7429c6903   Andy Whitcroft   checkpatch: impro...
1762
1763
1764
1765
1766
1767
1768
1769
  		if ($dbg_type) {
  			if ($line =~ /^.\s*$Declare\s*$/) {
  				ERROR("TEST: is type
  " . $herecurr);
  			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
  				ERROR("TEST: is not type ($1 is)
  ". $herecurr);
  			}
653d4876b   Andy Whitcroft   update checkpatch...
1770
1771
  			next;
  		}
a1ef277e2   Andy Whitcroft   checkpatch: add t...
1772
1773
  # TEST: allow direct testing of the attribute matcher.
  		if ($dbg_attr) {
9360b0e50   Andy Whitcroft   checkpatch: exten...
1774
  			if ($line =~ /^.\s*$Modifier\s*$/) {
a1ef277e2   Andy Whitcroft   checkpatch: add t...
1775
1776
  				ERROR("TEST: is attr
  " . $herecurr);
9360b0e50   Andy Whitcroft   checkpatch: exten...
1777
  			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
a1ef277e2   Andy Whitcroft   checkpatch: add t...
1778
1779
1780
1781
1782
  				ERROR("TEST: is not attr ($1 is)
  ". $herecurr);
  			}
  			next;
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1783

f0a594c1c   Andy Whitcroft   update checkpatch...
1784
  # check for initialisation to aggregates open brace on the next line
99423c206   Andy Whitcroft   checkpatch: fix _...
1785
1786
  		if ($line =~ /^.\s*{/ &&
  		    $prevline =~ /(?:^|[^=])=\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
1787
1788
  			ERROR("that open brace { should be on the previous line
  " . $hereprev);
f0a594c1c   Andy Whitcroft   update checkpatch...
1789
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1790
1791
1792
1793
1794
  #
  # Checks which are anchored on the added line.
  #
  
  # check for malformed paths in #include statements (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
1795
  		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876b   Andy Whitcroft   update checkpatch...
1796
1797
  			my $path = $1;
  			if ($path =~ m{//}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1798
1799
1800
  				ERROR("malformed #include filename
  " .
  					$herecurr);
653d4876b   Andy Whitcroft   update checkpatch...
1801
  			}
653d4876b   Andy Whitcroft   update checkpatch...
1802
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1803

0a920b5b6   Andy Whitcroft   add a trivial pat...
1804
  # no C99 // comments
00df344fd   Andy Whitcroft   update checkpatch...
1805
  		if ($line =~ m{//}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1806
1807
  			ERROR("do not use C99 // comments
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1808
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1809
  		# Remove C99 comments.
0a920b5b6   Andy Whitcroft   add a trivial pat...
1810
  		$line =~ s@//.*@@;
6c72ffaab   Andy Whitcroft   update checkpatch...
1811
  		$opline =~ s@//.*@@;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1812

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1813
1814
1815
1816
1817
1818
1819
1820
1821
  # 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.*\((.*)\)/)) {
653d4876b   Andy Whitcroft   update checkpatch...
1822
  			my $name = $1;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1823
1824
1825
  			if ($stat !~ /(?:
  				
  .}\s*$|
480120586   Andy Whitcroft   checkpatch: DEFIN...
1826
1827
1828
  				^.DEFINE_$Ident\(\Q$name\E\)|
  				^.DECLARE_$Ident\(\Q$name\E\)|
  				^.LIST_HEAD\(\Q$name\E\)|
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1829
1830
  				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
  				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
480120586   Andy Whitcroft   checkpatch: DEFIN...
1831
  			    )/x) {
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1832
1833
1834
1835
1836
  #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...
1837
1838
  			}
  		}
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
  		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) {
  			WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable
  " . $herecurr);
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1852

f0a594c1c   Andy Whitcroft   update checkpatch...
1853
  # check for external initialisers.
c45dcabd2   Andy Whitcroft   update checkpatch...
1854
  		if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) {
f0a594c1c   Andy Whitcroft   update checkpatch...
1855
1856
1857
1858
  			ERROR("do not initialise externals to 0 or NULL
  " .
  				$herecurr);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1859
  # check for static initialisers.
2d1bafd79   Andy Whitcroft   checkpatch: do no...
1860
  		if ($line =~ /\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1861
1862
1863
  			ERROR("do not initialise statics to 0 or NULL
  " .
  				$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1864
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1865
1866
1867
  # check for new typedefs, only function parameters and sparse annotations
  # make sense.
  		if ($line =~ /\btypedef\s/ &&
8054576dc   Andy Whitcroft   checkpatch: loose...
1868
  		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
1869
  		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
1870
  		    $line !~ /\b$typeTypedefs\b/ &&
653d4876b   Andy Whitcroft   update checkpatch...
1871
  		    $line !~ /\b__bitwise(?:__|)\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1872
1873
  			WARN("do not add new typedefs
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1874
1875
1876
  		}
  
  # * goes on variable not on type
65863862b   Andy Whitcroft   checkpatch: dissa...
1877
  		# (char*[ const])
00ef4ece0   Andy Whitcroft   checkpatch: corre...
1878
  		if ($line =~ m{\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\)}) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1879
1880
1881
1882
1883
1884
1885
  			my ($from, $to) = ($1, $1);
  
  			# 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/...
1886
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1887
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
1888

65863862b   Andy Whitcroft   checkpatch: dissa...
1889
1890
1891
1892
1893
1894
  			#print "from<$from> to<$to>
  ";
  			if ($from ne $to) {
  				ERROR("\"(foo$from)\" should be \"(foo$to)\"
  " .  $herecurr);
  			}
00ef4ece0   Andy Whitcroft   checkpatch: corre...
1895
  		} elsif ($line =~ m{\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident)}) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1896
1897
1898
1899
1900
1901
1902
  			my ($from, $to, $ident) = ($1, $1, $2);
  
  			# 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/...
1903
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1904
1905
1906
  			}
  			# Modifiers should have spaces.
  			$to =~ s/(\b$Modifier$)/$1 /;
d8aaf1214   Andy Whitcroft   update checkpatch...
1907

667026e7b   Andy Whitcroft   checkpatch: a mod...
1908
1909
1910
  			#print "from<$from> to<$to> ident<$ident>
  ";
  			if ($from ne $to && $ident !~ /^$Modifier$/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1911
1912
1913
  				ERROR("\"foo${from}bar\" should be \"foo${to}bar\"
  " .  $herecurr);
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1914
1915
1916
1917
1918
1919
1920
1921
1922
  		}
  
  # # 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...
1923
  		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1924
1925
  			WARN("LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
1926
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1927
1928
1929
1930
1931
  # 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
  # printk includes all preceeding printk's which have no newline on the end.
  # we assume the first bad printk is the one to report.
f0a594c1c   Andy Whitcroft   update checkpatch...
1932
  		if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
00df344fd   Andy Whitcroft   update checkpatch...
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
  			my $ok = 0;
  			for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
  				#print "CHECK<$lines[$ln - 1]
  ";
  				# we have a preceeding printk if it ends
  				# 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) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1949
1950
  				WARN("printk() should include KERN_ facility level
  " . $herecurr);
00df344fd   Andy Whitcroft   update checkpatch...
1951
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1952
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1953
1954
  # 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...
1955
1956
  		if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and
  		    !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1957
1958
  			ERROR("open brace '{' following function declarations go on the next line
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1959
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1960

8905a67c6   Andy Whitcroft   update checkpatch...
1961
1962
1963
1964
1965
1966
  # 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*$/) {
  			ERROR("open brace '{' following $1 go on the same line
  " . $hereprev);
  		}
8d31cfcec   Andy Whitcroft   checkpatch: check...
1967
1968
  # check for spacing round square brackets; allowed:
  #  1. with a type on the left -- int [] a;
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
1969
1970
  #  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...
1971
1972
1973
  		while ($line =~ /(.*?\s)\[/g) {
  			my ($where, $prefix) = ($-[1], $1);
  			if ($prefix !~ /$Type\s+$/ &&
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
1974
1975
  			    ($where != 0 || $prefix !~ /^.\s+$/) &&
  			    $prefix !~ /{\s+$/) {
8d31cfcec   Andy Whitcroft   checkpatch: check...
1976
1977
1978
1979
  				ERROR("space prohibited before open square bracket '['
  " . $herecurr);
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
1980
  # check for spaces between functions and their parentheses.
6c72ffaab   Andy Whitcroft   update checkpatch...
1981
  		while ($line =~ /($Ident)\s+\(/g) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1982
  			my $name = $1;
773647a09   Andy Whitcroft   update checkpatch...
1983
1984
  			my $ctx_before = substr($line, 0, $-[1]);
  			my $ctx = "$ctx_before$name";
c2fdda0df   Andy Whitcroft   update checkpatch...
1985
1986
  
  			# Ignore those directives where spaces _are_ permitted.
773647a09   Andy Whitcroft   update checkpatch...
1987
1988
1989
1990
1991
1992
  			if ($name =~ /^(?:
  				if|for|while|switch|return|case|
  				volatile|__volatile__|
  				__attribute__|format|__extension__|
  				asm|__asm__)$/x)
  			{
c2fdda0df   Andy Whitcroft   update checkpatch...
1993
1994
1995
1996
  
  			# 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...
1997
  			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
1998
1999
  
  			# cpp #elif statement condition may start with a (
c45dcabd2   Andy Whitcroft   update checkpatch...
2000
  			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2001
2002
2003
  
  			# If this whole things ends with a type its most
  			# likely a typedef for a function.
773647a09   Andy Whitcroft   update checkpatch...
2004
  			} elsif ($ctx =~ /$Type$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2005
2006
  
  			} else {
773647a09   Andy Whitcroft   update checkpatch...
2007
2008
  				WARN("space prohibited between function name and open parenthesis '('
  " . $herecurr);
6c72ffaab   Andy Whitcroft   update checkpatch...
2009
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
2010
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2011
  # Check operator spacing.
0a920b5b6   Andy Whitcroft   add a trivial pat...
2012
  		if (!($line=~/\#\s*include/)) {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2013
2014
2015
2016
  			my $ops = qr{
  				<<=|>>=|<=|>=|==|!=|
  				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
  				=>|->|<<|>>|<|>|=|!|~|
1f65f947a   Andy Whitcroft   checkpatch: add c...
2017
2018
  				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
  				\?|:
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2019
  			}x;
cf655043d   Andy Whitcroft   update checkpatch...
2020
  			my @elements = split(/($ops|;)/, $opline);
00df344fd   Andy Whitcroft   update checkpatch...
2021
  			my $off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
2022
2023
  
  			my $blank = copy_spacing($opline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2024
  			for (my $n = 0; $n < $#elements; $n += 2) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2025
  				$off += length($elements[$n]);
773647a09   Andy Whitcroft   update checkpatch...
2026
2027
2028
2029
2030
2031
2032
  				# Pick up the preceeding and succeeding characters.
  				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...
2033
2034
2035
  				my $a = '';
  				$a = 'V' if ($elements[$n] ne '');
  				$a = 'W' if ($elements[$n] =~ /\s$/);
cf655043d   Andy Whitcroft   update checkpatch...
2036
  				$a = 'C' if ($elements[$n] =~ /$;$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2037
2038
  				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
  				$a = 'O' if ($elements[$n] eq '');
773647a09   Andy Whitcroft   update checkpatch...
2039
  				$a = 'E' if ($ca =~ /^\s*$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2040

0a920b5b6   Andy Whitcroft   add a trivial pat...
2041
  				my $op = $elements[$n + 1];
4a0df2ef4   Andy Whitcroft   update checkpatch...
2042
2043
  
  				my $c = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2044
  				if (defined $elements[$n + 2]) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2045
2046
  					$c = 'V' if ($elements[$n + 2] ne '');
  					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043d   Andy Whitcroft   update checkpatch...
2047
  					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2048
2049
  					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
  					$c = 'O' if ($elements[$n + 2] eq '');
8b1b33786   Andy Whitcroft   checkpatch: fix c...
2050
  					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2051
2052
  				} else {
  					$c = 'E';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2053
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2054
2055
2056
  				my $ctx = "${a}x${c}";
  
  				my $at = "(ctx:$ctx)";
6c72ffaab   Andy Whitcroft   update checkpatch...
2057
  				my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e1   Andy Whitcroft   update checkpatch...
2058
2059
  				my $hereptr = "$hereline$ptr
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2060

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

1f65f947a   Andy Whitcroft   checkpatch: add c...
2064
2065
  				# Get the full operator variant.
  				my $opv = $op . substr($curr_vars, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
2066
2067
2068
  				# Ignore operators passed as parameters.
  				if ($op_type ne 'V' &&
  				    $ca =~ /\s$/ && $cc =~ /^\s*,/) {
cf655043d   Andy Whitcroft   update checkpatch...
2069
2070
  #				# Ignore comments
  #				} elsif ($op =~ /^$;+$/) {
13214adf7   Andy Whitcroft   update checkpatch...
2071

d8aaf1214   Andy Whitcroft   update checkpatch...
2072
  				# ; should have either the end of line or a space or \ after it
13214adf7   Andy Whitcroft   update checkpatch...
2073
  				} elsif ($op eq ';') {
cf655043d   Andy Whitcroft   update checkpatch...
2074
2075
  					if ($ctx !~ /.x[WEBC]/ &&
  					    $cc !~ /^\\/ && $cc !~ /^;/) {
773647a09   Andy Whitcroft   update checkpatch...
2076
2077
  						ERROR("space required after that '$op' $at
  " . $hereptr);
d8aaf1214   Andy Whitcroft   update checkpatch...
2078
2079
2080
2081
  					}
  
  				# // is a comment
  				} elsif ($op eq '//') {
0a920b5b6   Andy Whitcroft   add a trivial pat...
2082

1f65f947a   Andy Whitcroft   checkpatch: add c...
2083
2084
2085
2086
  				# No spaces for:
  				#   ->
  				#   :   when part of a bitfield
  				} elsif ($op eq '->' || $opv eq ':B') {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2087
  					if ($ctx =~ /Wx.|.xW/) {
773647a09   Andy Whitcroft   update checkpatch...
2088
2089
  						ERROR("spaces prohibited around that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2090
2091
2092
2093
  					}
  
  				# , must have a space on the right.
  				} elsif ($op eq ',') {
cf655043d   Andy Whitcroft   update checkpatch...
2094
  					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
773647a09   Andy Whitcroft   update checkpatch...
2095
2096
  						ERROR("space required after that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2097
  					}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2098
  				# '*' as part of a type definition -- reported already.
74048ed81   Andy Whitcroft   checkpatch: varia...
2099
  				} elsif ($opv eq '*_') {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2100
2101
2102
2103
2104
2105
2106
  					#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...
2107
  					 $opv eq '*U' || $opv eq '-U' ||
0d413866c   Andy Whitcroft   checkpatch: value...
2108
  					 $opv eq '&U' || $opv eq '&&U') {
cf655043d   Andy Whitcroft   update checkpatch...
2109
  					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
773647a09   Andy Whitcroft   update checkpatch...
2110
2111
  						ERROR("space required before that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2112
  					}
a3340b357   Andy Whitcroft   checkpatch: point...
2113
  					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
171ae1a49   Andy Whitcroft   update checkpatch...
2114
2115
2116
  						# A unary '*' may be const
  
  					} elsif ($ctx =~ /.xW/) {
fb9e9096b   Andy Whitcroft   checkpatch: limit...
2117
2118
  						ERROR("space prohibited after that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2119
2120
2121
2122
  					}
  
  				# unary ++ and unary -- are allowed no space on one side.
  				} elsif ($op eq '++' or $op eq '--') {
773647a09   Andy Whitcroft   update checkpatch...
2123
2124
2125
2126
2127
2128
2129
2130
  					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
  						ERROR("space required one side of that '$op' $at
  " . $hereptr);
  					}
  					if ($ctx =~ /Wx[BE]/ ||
  					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
  						ERROR("space prohibited before that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2131
  					}
773647a09   Andy Whitcroft   update checkpatch...
2132
2133
2134
  					if ($ctx =~ /ExW/) {
  						ERROR("space prohibited after that '$op' $at
  " . $hereptr);
653d4876b   Andy Whitcroft   update checkpatch...
2135
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2136

773647a09   Andy Whitcroft   update checkpatch...
2137

0a920b5b6   Andy Whitcroft   add a trivial pat...
2138
  				# << and >> may either have or not have spaces both sides
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2139
2140
2141
  				} 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...
2142
2143
  					 $op eq '*' or $op eq '/' or
  					 $op eq '%')
0a920b5b6   Andy Whitcroft   add a trivial pat...
2144
  				{
773647a09   Andy Whitcroft   update checkpatch...
2145
  					if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2146
2147
2148
  						ERROR("need consistent spacing around '$op' $at
  " .
  							$hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2149
  					}
1f65f947a   Andy Whitcroft   checkpatch: add c...
2150
2151
2152
2153
2154
2155
2156
  				# 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./) {
  						ERROR("space prohibited before that '$op' $at
  " . $hereptr);
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2157
  				# All the others need spaces both sides.
cf655043d   Andy Whitcroft   update checkpatch...
2158
  				} elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947a   Andy Whitcroft   checkpatch: add c...
2159
  					my $ok = 0;
22f2a2ef9   Andy Whitcroft   update checkpatch...
2160
  					# Ignore email addresses <foo@bar>
1f65f947a   Andy Whitcroft   checkpatch: add c...
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
  					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) {
773647a09   Andy Whitcroft   update checkpatch...
2176
2177
  						ERROR("spaces required around that '$op' $at
  " . $hereptr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2178
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2179
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2180
  				$off += length($elements[$n + 1]);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2181
2182
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2183
2184
  # check for multiple assignments
  		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
6c72ffaab   Andy Whitcroft   update checkpatch...
2185
2186
  			CHK("multiple assignments should be avoided
  " . $herecurr);
f0a594c1c   Andy Whitcroft   update checkpatch...
2187
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
  ## # 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 =~ /,/) {
  ## 				WARN("declaring multiple variables together should be avoided
  " . $herecurr);
  ## 			}
  ## 		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2203

0a920b5b6   Andy Whitcroft   add a trivial pat...
2204
  #need space before brace following if, while, etc
22f2a2ef9   Andy Whitcroft   update checkpatch...
2205
2206
  		if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
  		    $line =~ /do{/) {
773647a09   Andy Whitcroft   update checkpatch...
2207
2208
  			ERROR("space required before the open brace '{'
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2209
2210
2211
2212
2213
  		}
  
  # closing brace should have a space following it when it has anything
  # on the line
  		if ($line =~ /}(?!(?:,|;|\)))\S/) {
773647a09   Andy Whitcroft   update checkpatch...
2214
2215
  			ERROR("space required after that close brace '}'
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2216
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2217
2218
  # check spacing on square brackets
  		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
2219
2220
  			ERROR("space prohibited after that open square bracket '['
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2221
2222
  		}
  		if ($line =~ /\s\]/) {
773647a09   Andy Whitcroft   update checkpatch...
2223
2224
  			ERROR("space prohibited before that close square bracket ']'
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2225
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
2226
  # check spacing on parentheses
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2227
2228
  		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
  		    $line !~ /for\s*\(\s+;/) {
773647a09   Andy Whitcroft   update checkpatch...
2229
2230
  			ERROR("space prohibited after that open parenthesis '('
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2231
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2232
  		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2233
2234
  		    $line !~ /for\s*\(.*;\s+\)/ &&
  		    $line !~ /:\s+\)/) {
773647a09   Andy Whitcroft   update checkpatch...
2235
2236
  			ERROR("space prohibited before that close parenthesis ')'
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2237
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2238
  #goto labels aren't indented, allow a single space however
4a0df2ef4   Andy Whitcroft   update checkpatch...
2239
  		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b6   Andy Whitcroft   add a trivial pat...
2240
  		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2241
2242
  			WARN("labels should not be indented
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2243
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
2244
2245
2246
2247
  # Return is not a function.
  		if (defined($stat) && $stat =~ /^.\s*return(\s*)(\(.*);/s) {
  			my $spacing = $1;
  			my $value = $2;
86f9d059c   Andy Whitcroft   checkpatch: allow...
2248
  			# Flatten any parentheses
fee61c47d   Andy Whitcroft   checkpatch: retur...
2249
  			$value =~ s/\)\(/\) \(/g;
63f17f897   Andy Whitcroft   checkpatch: allow...
2250
2251
2252
2253
2254
  			while ($value =~ s/\[[^\{\}]*\]/1/ ||
  			       $value !~ /(?:$Ident|-?$Constant)\s*
  					     $Compare\s*
  					     (?:$Ident|-?$Constant)/x &&
  			       $value =~ s/\([^\(\)]*\)/1/) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
  			}
  
  			if ($value =~ /^(?:$Ident|-?$Constant)$/) {
  				ERROR("return is not a function, parentheses are not required
  " . $herecurr);
  
  			} elsif ($spacing !~ /\s+/) {
  				ERROR("space required before the open parenthesis '('
  " . $herecurr);
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2266
  # Need a space before open parenthesis after if, while etc
4a0df2ef4   Andy Whitcroft   update checkpatch...
2267
  		if ($line=~/\b(if|while|for|switch)\(/) {
773647a09   Andy Whitcroft   update checkpatch...
2268
2269
  			ERROR("space required before the open parenthesis '('
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2270
  		}
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
2271
2272
  # Check for illegal assignment in if conditional -- and check for trailing
  # statements after the conditional.
170d3a226   Andy Whitcroft   checkpatch: handl...
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
  		if ($line =~ /do\s*(?!{)/) {
  			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...
2297
  			my ($s, $c) = ($stat, $cond);
8905a67c6   Andy Whitcroft   update checkpatch...
2298

b53c8e104   Andy Whitcroft   checkpatch: ensur...
2299
  			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2300
2301
  				ERROR("do not use assignment in if condition
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
2302
2303
2304
2305
  			}
  
  			# Find out what is on the end of the line after the
  			# conditional.
773647a09   Andy Whitcroft   update checkpatch...
2306
  			substr($s, 0, length($c), '');
8905a67c6   Andy Whitcroft   update checkpatch...
2307
2308
  			$s =~ s/
  .*//g;
13214adf7   Andy Whitcroft   update checkpatch...
2309
  			$s =~ s/$;//g; 	# Remove any comments
53210168f   Andy Whitcroft   checkpatch: tough...
2310
2311
  			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
  			    $c !~ /}\s*while\s*/)
773647a09   Andy Whitcroft   update checkpatch...
2312
  			{
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2313
2314
2315
2316
  				# Find out how long the conditional actually is.
  				my @newlines = ($c =~ /
  /gs);
  				my $cond_lines = 1 + $#newlines;
42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
2317
  				my $stat_real = '';
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2318

42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
2319
2320
2321
  				$stat_real = raw_line($linenr, $cond_lines)
  							. "
  " if ($cond_lines);
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2322
2323
2324
2325
2326
2327
2328
  				if (defined($stat_real) && $cond_lines > 1) {
  					$stat_real = "[...]
  $stat_real";
  				}
  
  				ERROR("trailing statements should be on next line
  " . $herecurr . $stat_real);
8905a67c6   Andy Whitcroft   update checkpatch...
2329
2330
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
  # Check for bitwise tests written as boolean
  		if ($line =~ /
  			(?:
  				(?:\[|\(|\&\&|\|\|)
  				\s*0[xX][0-9]+\s*
  				(?:\&\&|\|\|)
  			|
  				(?:\&\&|\|\|)
  				\s*0[xX][0-9]+\s*
  				(?:\&\&|\|\||\)|\])
  			)/x)
  		{
  			WARN("boolean test with hexadecimal, perhaps just 1 \& or \|?
  " . $herecurr);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
2346
  # if and else should not have general statements after it
13214adf7   Andy Whitcroft   update checkpatch...
2347
2348
2349
2350
2351
2352
2353
  		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
  			my $s = $1;
  			$s =~ s/$;//g; 	# Remove any comments
  			if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
  				ERROR("trailing statements should be on next line
  " . $herecurr);
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2354
  		}
396677823   Andy Whitcroft   checkpatch: if sh...
2355
2356
2357
2358
2359
2360
  # if should not continue a brace
  		if ($line =~ /}\s*if\b/) {
  			ERROR("trailing statements should be on next line
  " .
  				$herecurr);
  		}
a1080bf80   Andy Whitcroft   checkpatch: case/...
2361
2362
2363
  # 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...
2364
  			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf80   Andy Whitcroft   checkpatch: case/...
2365
2366
2367
2368
2369
2370
  			\s*return\s+
  		    )/xg)
  		{
  			ERROR("trailing statements should be on next line
  " . $herecurr);
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2371
2372
2373
2374
2375
  
  		# 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) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2376
2377
  			ERROR("else should follow close brace '}'
  " . $hereprev);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2378
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
2379
2380
2381
2382
2383
2384
  		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...
2385
  			substr($s, 0, length($c), '');
c2fdda0df   Andy Whitcroft   update checkpatch...
2386
2387
2388
2389
2390
2391
2392
2393
  			$s =~ s/
  .*//g;
  
  			if ($s =~ /^\s*;/) {
  				ERROR("while should follow close brace '}'
  " . $hereprev);
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2394
2395
2396
2397
2398
2399
2400
2401
2402
  #studly caps, commented out until figure out how to distinguish between use of existing and adding new
  #		if (($line=~/[\w_][a-z\d]+[A-Z]/) and !($line=~/print/)) {
  #		    print "No studly caps, use _
  ";
  #		    print "$herecurr";
  #		    $clean = 0;
  #		}
  
  #no spaces allowed after \ in define
c45dcabd2   Andy Whitcroft   update checkpatch...
2403
  		if ($line=~/\#\s*define.*\\\s$/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2404
2405
  			WARN("Whitepspace after \\ makes next lines useless
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2406
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2407
  #warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
2408
  		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec483   Andy Whitcroft   checkpatch: reduc...
2409
2410
2411
2412
  			my $file = "$1.h";
  			my $checkfile = "include/linux/$file";
  			if (-f "$root/$checkfile" &&
  			    $realfile ne $checkfile &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2413
2414
  			    $1 ne 'irq')
  			{
e09dec483   Andy Whitcroft   checkpatch: reduc...
2415
2416
2417
2418
2419
2420
2421
  				if ($realfile =~ m{^arch/}) {
  					CHK("Consider using #include <linux/$file> instead of <asm/$file>
  " . $herecurr);
  				} else {
  					WARN("Use #include <linux/$file> instead of <asm/$file>
  " . $herecurr);
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2422
2423
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2424
2425
  # 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...
2426
  # in a known good container
b8f96a31f   Andy Whitcroft   checkpatch: macro...
2427
2428
  		if ($realfile !~ m@/vmlinux.lds.h$@ &&
  		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf1214   Andy Whitcroft   update checkpatch...
2429
2430
  			my $ln = $linenr;
  			my $cnt = $realcnt;
c45dcabd2   Andy Whitcroft   update checkpatch...
2431
2432
  			my ($off, $dstat, $dcond, $rest);
  			my $ctx = '';
653d4876b   Andy Whitcroft   update checkpatch...
2433

c45dcabd2   Andy Whitcroft   update checkpatch...
2434
2435
2436
2437
2438
2439
2440
2441
2442
  			my $args = defined($1);
  
  			# Find the end of the macro and limit our statement
  			# search to that.
  			while ($cnt > 0 && defined $lines[$ln - 1] &&
  				$lines[$ln - 1] =~ /^(?:-|..*\\$)/)
  			{
  				$ctx .= $rawlines[$ln - 1] . "
  ";
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
2443
  				$cnt-- if ($lines[$ln - 1] !~ /^-/);
c45dcabd2   Andy Whitcroft   update checkpatch...
2444
  				$ln++;
c45dcabd2   Andy Whitcroft   update checkpatch...
2445
2446
2447
2448
2449
2450
2451
  			}
  			$ctx .= $rawlines[$ln - 1];
  
  			($dstat, $dcond, $ln, $cnt, $off) =
  				ctx_statement_block($linenr, $ln - $linenr + 1, 0);
  			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>
  ";
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
2452
2453
  			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
2454
2455
2456
2457
  
  			# Extract the remainder of the define (if any) and
  			# rip off surrounding spaces, and trailing \'s.
  			$rest = '';
636d140a8   Andy Whitcroft   checkpatch: compl...
2458
2459
2460
  			while ($off != 0 || ($cnt > 0 && $rest =~ /\\\s*$/)) {
  				#print "ADDING cnt<$cnt> $off <" . substr($lines[$ln - 1], $off) . "> rest<$rest>
  ";
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
2461
2462
2463
2464
2465
  				if ($off != 0 || $lines[$ln - 1] !~ /^-/) {
  					$rest .= substr($lines[$ln - 1], $off) . "
  ";
  					$cnt--;
  				}
c45dcabd2   Andy Whitcroft   update checkpatch...
2466
  				$ln++;
c45dcabd2   Andy Whitcroft   update checkpatch...
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
  				$off = 0;
  			}
  			$rest =~ s/\\
  .//g;
  			$rest =~ s/^\s*//s;
  			$rest =~ s/\s*$//s;
  
  			# Clean up the original statement.
  			if ($args) {
  				substr($dstat, 0, length($dcond), '');
  			} else {
  				$dstat =~ s/^.\s*\#\s*define\s+$Ident\s*//;
d8aaf1214   Andy Whitcroft   update checkpatch...
2479
  			}
292f1a9b3   Andy Whitcroft   checkpatch: compl...
2480
  			$dstat =~ s/$;//g;
c45dcabd2   Andy Whitcroft   update checkpatch...
2481
2482
2483
2484
  			$dstat =~ s/\\
  .//g;
  			$dstat =~ s/^\s*//s;
  			$dstat =~ s/\s*$//s;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2485

c45dcabd2   Andy Whitcroft   update checkpatch...
2486
  			# Flatten any parentheses and braces
bf30d6ede   Andy Whitcroft   checkpatch: compl...
2487
2488
2489
2490
  			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
  			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
  			       $dstat =~ s/\[[^\{\}]*\]/1/)
  			{
de7d4f0e1   Andy Whitcroft   update checkpatch...
2491
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
2492

c45dcabd2   Andy Whitcroft   update checkpatch...
2493
2494
2495
2496
2497
2498
  			my $exceptions = qr{
  				$Declare|
  				module_param_named|
  				MODULE_PARAM_DESC|
  				DECLARE_PER_CPU|
  				DEFINE_PER_CPU|
383099fd6   Andy Whitcroft   checkpatch: struc...
2499
  				__typeof__\(|
22fd2d3e4   Stefani Seibold   checkpatch.pl: ad...
2500
2501
  				union|
  				struct|
ea71a0a01   Andy Whitcroft   checkpatch: forma...
2502
2503
  				\.$Ident\s*=\s*|
  				^\"|\"$
c45dcabd2   Andy Whitcroft   update checkpatch...
2504
  			}x;
383099fd6   Andy Whitcroft   checkpatch: struc...
2505
2506
  			#print "REST<$rest> dstat<$dstat>
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
2507
2508
2509
2510
  			if ($rest ne '') {
  				if ($rest !~ /while\s*\(/ &&
  				    $dstat !~ /$exceptions/)
  				{
de7d4f0e1   Andy Whitcroft   update checkpatch...
2511
2512
2513
2514
  					ERROR("Macros with multiple statements should be enclosed in a do - while loop
  " . "$here
  $ctx
  ");
c45dcabd2   Andy Whitcroft   update checkpatch...
2515
2516
2517
2518
2519
2520
  				}
  
  			} elsif ($ctx !~ /;/) {
  				if ($dstat ne '' &&
  				    $dstat !~ /^(?:$Ident|-?$Constant)$/ &&
  				    $dstat !~ /$exceptions/ &&
b132e5d58   Andy Whitcroft   checkpatch: macro...
2521
  				    $dstat !~ /^\.$Ident\s*=/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2522
2523
  				    $dstat =~ /$Operators/)
  				{
de7d4f0e1   Andy Whitcroft   update checkpatch...
2524
2525
2526
2527
  					ERROR("Macros with complex values should be enclosed in parenthesis
  " . "$here
  $ctx
  ");
d8aaf1214   Andy Whitcroft   update checkpatch...
2528
  				}
653d4876b   Andy Whitcroft   update checkpatch...
2529
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2530
  		}
080ba9296   Mike Frysinger   checkpatch: try t...
2531
2532
2533
2534
2535
2536
2537
2538
2539
  # 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|$))/) {
  			WARN("vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols
  " . $herecurr);
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2540
  # check for redundant bracing round if etc
13214adf7   Andy Whitcroft   update checkpatch...
2541
2542
  		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
  			my ($level, $endln, @chunks) =
cf655043d   Andy Whitcroft   update checkpatch...
2543
  				ctx_statement_full($linenr, $realcnt, 1);
13214adf7   Andy Whitcroft   update checkpatch...
2544
2545
  			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
2546
2547
2548
  			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>
  ";
  			if ($#chunks > 0 && $level == 0) {
13214adf7   Andy Whitcroft   update checkpatch...
2549
2550
  				my $allowed = 0;
  				my $seen = 0;
773647a09   Andy Whitcroft   update checkpatch...
2551
2552
  				my $herectx = $here . "
  ";
cf655043d   Andy Whitcroft   update checkpatch...
2553
  				my $ln = $linenr - 1;
13214adf7   Andy Whitcroft   update checkpatch...
2554
2555
  				for my $chunk (@chunks) {
  					my ($cond, $block) = @{$chunk};
773647a09   Andy Whitcroft   update checkpatch...
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
  					# If the condition carries leading newlines, then count those as offsets.
  					my ($whitespace) = ($cond =~ /^((?:\s*
  [+-])*\s*)/s);
  					my $offset = statement_rawlines($whitespace) - 1;
  
  					#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...
2570
  					$ln += statement_rawlines($block) - 1;
773647a09   Andy Whitcroft   update checkpatch...
2571
  					substr($block, 0, length($cond), '');
13214adf7   Andy Whitcroft   update checkpatch...
2572
2573
  
  					$seen++ if ($block =~ /^\s*{/);
cf655043d   Andy Whitcroft   update checkpatch...
2574
2575
2576
2577
2578
  					#print "cond<$cond> block<$block> allowed<$allowed>
  ";
  					if (statement_lines($cond) > 1) {
  						#print "APW: ALLOWED: cond<$cond>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
2579
2580
2581
  						$allowed = 1;
  					}
  					if ($block =~/\b(?:if|for|while)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
2582
2583
  						#print "APW: ALLOWED: block<$block>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
2584
2585
  						$allowed = 1;
  					}
cf655043d   Andy Whitcroft   update checkpatch...
2586
2587
2588
  					if (statement_block_size($block) > 1) {
  						#print "APW: ALLOWED: lines block<$block>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
2589
2590
2591
2592
  						$allowed = 1;
  					}
  				}
  				if ($seen && !$allowed) {
cf655043d   Andy Whitcroft   update checkpatch...
2593
2594
  					WARN("braces {} are not necessary for any arm of this statement
  " . $herectx);
13214adf7   Andy Whitcroft   update checkpatch...
2595
2596
2597
  				}
  			}
  		}
773647a09   Andy Whitcroft   update checkpatch...
2598
  		if (!defined $suppress_ifbraces{$linenr - 1} &&
13214adf7   Andy Whitcroft   update checkpatch...
2599
  					$line =~ /\b(if|while|for|else)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
2600
2601
2602
2603
2604
2605
2606
2607
  			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...
2608
2609
2610
  
  			my ($level, $endln, @chunks) =
  				ctx_statement_full($linenr, $realcnt, $-[0]);
cf655043d   Andy Whitcroft   update checkpatch...
2611
2612
  			# Check the condition.
  			my ($cond, $block) = @{$chunks[0]};
773647a09   Andy Whitcroft   update checkpatch...
2613
2614
  			#print "CHECKING<$linenr> cond<$cond> block<$block>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
2615
  			if (defined $cond) {
773647a09   Andy Whitcroft   update checkpatch...
2616
  				substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
  			}
  			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...
2637
  					substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
  				}
  				if ($block =~ /^\s*\{/) {
  					#print "APW: ALLOWED: chunk-1 block<$block>
  ";
  					$allowed = 1;
  				}
  			}
  			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
  				my $herectx = $here . "
  ";;
f055663c5   Andy Whitcroft   checkpatch: repor...
2648
  				my $cnt = statement_rawlines($block);
cf655043d   Andy Whitcroft   update checkpatch...
2649

f055663c5   Andy Whitcroft   checkpatch: repor...
2650
2651
2652
  				for (my $n = 0; $n < $cnt; $n++) {
  					$herectx .= raw_line($linenr, $n) . "
  ";;
f0a594c1c   Andy Whitcroft   update checkpatch...
2653
  				}
cf655043d   Andy Whitcroft   update checkpatch...
2654
2655
2656
  
  				WARN("braces {} are not necessary for single statement blocks
  " . $herectx);
f0a594c1c   Andy Whitcroft   update checkpatch...
2657
2658
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2659
  # don't include deprecated include files (uses RAW line)
4a0df2ef4   Andy Whitcroft   update checkpatch...
2660
  		for my $inc (@dep_includes) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2661
  			if ($rawline =~ m@^.\s*\#\s*include\s*\<$inc>@) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2662
2663
  				ERROR("Don't use <$inc>: see Documentation/feature-removal-schedule.txt
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2664
2665
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2666
2667
  # don't use deprecated functions
  		for my $func (@dep_functions) {
00df344fd   Andy Whitcroft   update checkpatch...
2668
  			if ($line =~ /\b$func\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2669
2670
  				ERROR("Don't use $func(): see Documentation/feature-removal-schedule.txt
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2671
2672
2673
2674
  			}
  		}
  
  # no volatiles please
6c72ffaab   Andy Whitcroft   update checkpatch...
2675
2676
  		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
  		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2677
2678
  			WARN("Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2679
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2680
2681
2682
2683
2684
  # SPIN_LOCK_UNLOCKED & RW_LOCK_UNLOCKED are deprecated
  		if ($line =~ /\b(SPIN_LOCK_UNLOCKED|RW_LOCK_UNLOCKED)/) {
  			ERROR("Use of $1 is deprecated: see Documentation/spinlocks.txt
  " . $herecurr);
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2685
  # warn about #if 0
c45dcabd2   Andy Whitcroft   update checkpatch...
2686
  		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2687
2688
2689
  			CHK("if this code is redundant consider removing it
  " .
  				$herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2690
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2691
2692
2693
2694
  # check for needless kfree() checks
  		if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
  			my $expr = $1;
  			if ($line =~ /\bkfree\(\Q$expr\E\);/) {
3c232147a   Wolfram Sang   checkpatch: corre...
2695
2696
  				WARN("kfree(NULL) is safe this check is probably not required
  " . $hereprev);
f0a594c1c   Andy Whitcroft   update checkpatch...
2697
2698
  			}
  		}
4c432a8f0   Greg Kroah-Hartman   checkpatch: usb_f...
2699
2700
2701
2702
2703
2704
2705
2706
  # check for needless usb_free_urb() checks
  		if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
  			my $expr = $1;
  			if ($line =~ /\busb_free_urb\(\Q$expr\E\);/) {
  				WARN("usb_free_urb(NULL) is safe this check is probably not required
  " . $hereprev);
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2707

00df344fd   Andy Whitcroft   update checkpatch...
2708
  # warn about #ifdefs in C files
c45dcabd2   Andy Whitcroft   update checkpatch...
2709
  #		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344fd   Andy Whitcroft   update checkpatch...
2710
2711
2712
2713
2714
  #			print "#ifdef in C files should be avoided
  ";
  #			print "$herecurr";
  #			$clean = 0;
  #		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2715
  # warn about spacing in #ifdefs
c45dcabd2   Andy Whitcroft   update checkpatch...
2716
  		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
22f2a2ef9   Andy Whitcroft   update checkpatch...
2717
2718
2719
  			ERROR("exactly one space required after that #$1
  " . $herecurr);
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2720
  # check for spinlock_t definitions without a comment.
171ae1a49   Andy Whitcroft   update checkpatch...
2721
2722
  		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
  		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2723
2724
  			my $which = $1;
  			if (!ctx_has_comment($first_line, $linenr)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2725
2726
  				CHK("$1 definition without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2727
2728
2729
2730
2731
  			}
  		}
  # 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)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2732
2733
  				CHK("memory barrier without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2734
2735
2736
  			}
  		}
  # check of hardware specific defines
c45dcabd2   Andy Whitcroft   update checkpatch...
2737
  		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2738
2739
  			CHK("architecture specific defines should be avoided
  " .  $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2740
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2741

d4977c78e   Tobias Klauser   checkpatch: warn ...
2742
2743
2744
2745
2746
  # Check that the storage class is at the beginning of a declaration
  		if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
  			WARN("storage class should be at the beginning of the declaration
  " . $herecurr)
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
2747
2748
  # check the location of the inline attribute, that it is between
  # storage class and type.
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2749
2750
  		if ($line =~ /\b$Type\s+$Inline\b/ ||
  		    $line =~ /\b$Inline\s+$Storage\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2751
2752
2753
  			ERROR("inline keyword should sit between storage class and type
  " . $herecurr);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
2754
2755
2756
2757
2758
  # Check for __inline__ and __inline, prefer inline
  		if ($line =~ /\b(__inline__|__inline)\b/) {
  			WARN("plain inline is preferred over $1
  " . $herecurr);
  		}
8f53a9b80   Joe Perches   scripts/checkpatc...
2759
2760
2761
2762
2763
  # check for sizeof(&)
  		if ($line =~ /\bsizeof\s*\(\s*\&/) {
  			WARN("sizeof(& should be avoided
  " . $herecurr);
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
2764
  # check for new externs in .c files.
171ae1a49   Andy Whitcroft   update checkpatch...
2765
  		if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2766
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a49   Andy Whitcroft   update checkpatch...
2767
  		{
c45dcabd2   Andy Whitcroft   update checkpatch...
2768
2769
  			my $function_name = $1;
  			my $paren_space = $2;
171ae1a49   Andy Whitcroft   update checkpatch...
2770
2771
2772
2773
2774
  
  			my $s = $stat;
  			if (defined $cond) {
  				substr($s, 0, length($cond), '');
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
2775
2776
2777
  			if ($s =~ /^\s*;/ &&
  			    $function_name ne 'uninitialized_var')
  			{
171ae1a49   Andy Whitcroft   update checkpatch...
2778
2779
2780
2781
2782
2783
2784
2785
2786
  				WARN("externs should be avoided in .c files
  " .  $herecurr);
  			}
  
  			if ($paren_space =~ /
  /) {
  				WARN("arguments for function declarations should follow identifier
  " . $herecurr);
  			}
9c9ba34ee   Andy Whitcroft   update checkpatch...
2787
2788
2789
2790
2791
2792
  
  		} elsif ($realfile =~ /\.c$/ && defined $stat &&
  		    $stat =~ /^.\s*extern\s+/)
  		{
  			WARN("externs should be avoided in .c files
  " .  $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
  		}
  
  # checks for new __setup's
  		if ($rawline =~ /\b__setup\("([^"]*)"/) {
  			my $name = $1;
  
  			if (!grep(/$name/, @setup_docs)) {
  				CHK("__setup appears un-documented -- check Documentation/kernel-parameters.txt
  " . $herecurr);
  			}
653d4876b   Andy Whitcroft   update checkpatch...
2803
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2804
2805
2806
2807
2808
2809
  
  # check for pointless casting of kmalloc return
  		if ($line =~ /\*\s*\)\s*k[czm]alloc\b/) {
  			WARN("unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html
  " . $herecurr);
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2810
2811
2812
2813
2814
2815
  
  # check for gcc specific __FUNCTION__
  		if ($line =~ /__FUNCTION__/) {
  			WARN("__func__ should be used instead of gcc specific __FUNCTION__
  "  . $herecurr);
  		}
773647a09   Andy Whitcroft   update checkpatch...
2816
2817
  
  # check for semaphores used as mutexes
171ae1a49   Andy Whitcroft   update checkpatch...
2818
  		if ($line =~ /^.\s*(DECLARE_MUTEX|init_MUTEX)\s*\(/) {
773647a09   Andy Whitcroft   update checkpatch...
2819
2820
2821
2822
  			WARN("mutexes are preferred for single holder semaphores
  " . $herecurr);
  		}
  # check for semaphores used as mutexes
171ae1a49   Andy Whitcroft   update checkpatch...
2823
  		if ($line =~ /^.\s*init_MUTEX_LOCKED\s*\(/) {
773647a09   Andy Whitcroft   update checkpatch...
2824
2825
  			WARN("consider using a completion
  " . $herecurr);
1704f47b5   Peter Zijlstra   lockdep: Add nova...
2826

773647a09   Andy Whitcroft   update checkpatch...
2827
2828
2829
2830
2831
2832
  		}
  # recommend strict_strto* over simple_strto*
  		if ($line =~ /\bsimple_(strto.*?)\s*\(/) {
  			WARN("consider using strict_$1 in preference to simple_$1
  " . $herecurr);
  		}
f3db6639f   Michael Ellerman   checkpatch: add a...
2833
2834
2835
2836
2837
  # check for __initcall(), use device_initcall() explicitly please
  		if ($line =~ /^.\s*__initcall\s*\(/) {
  			WARN("please use device_initcall() instead of __initcall()
  " . $herecurr);
  		}
79404849e   Emese Revfy   checkpatch.pl: ex...
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
  # 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...
2876
  		if ($line !~ /\bconst\b/ &&
79404849e   Emese Revfy   checkpatch.pl: ex...
2877
  		    $line =~ /\bstruct\s+($struct_ops)\b/) {
6903ffb22   Andy Whitcroft   checkpatch: struc...
2878
2879
2880
  			WARN("struct $1 should normally be const
  " .
  				$herecurr);
2b6db5cb6   Andy Whitcroft   checkpatch: struc...
2881
  		}
773647a09   Andy Whitcroft   update checkpatch...
2882
2883
2884
2885
  
  # 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...
2886
2887
  		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
  		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a49   Andy Whitcroft   update checkpatch...
2888
2889
2890
  		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a09   Andy Whitcroft   update checkpatch...
2891
2892
2893
2894
  		{
  			WARN("usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc
  " . $herecurr);
  		}
9c9ba34ee   Andy Whitcroft   update checkpatch...
2895
2896
2897
2898
2899
  
  # 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...
2900
  			$string =~ s/%%/__/g;
9c9ba34ee   Andy Whitcroft   update checkpatch...
2901
2902
2903
2904
2905
2906
  			if ($string =~ /(?<!%)%L[udi]/) {
  				WARN("\%Ld/%Lu are not-standard C, use %lld/%llu
  " . $herecurr);
  				last;
  			}
  		}
691d77b6b   Andy Whitcroft   checkpatch: add c...
2907
2908
2909
2910
2911
2912
  
  # whine mightly about in_atomic
  		if ($line =~ /\bin_atomic\s*\(/) {
  			if ($realfile =~ m@^drivers/@) {
  				ERROR("do not use in_atomic in drivers
  " . $herecurr);
f4a877367   Andy Whitcroft   checkpatch: make ...
2913
  			} elsif ($realfile !~ m@^kernel/@) {
691d77b6b   Andy Whitcroft   checkpatch: add c...
2914
2915
2916
2917
  				WARN("use of in_atomic() is incorrect outside core kernel code
  " . $herecurr);
  			}
  		}
1704f47b5   Peter Zijlstra   lockdep: Add nova...
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
  
  # 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@) {
  				ERROR("lockdep_no_validate class is reserved for device->mutex.
  " . $herecurr);
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2929
2930
2931
2932
2933
2934
  	}
  
  	# 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...
2935
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
  	# 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) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2949
2950
  		ERROR("Does not appear to be a unified-diff format patch
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
2951
2952
  	}
  	if ($is_patch && $chk_signoff && $signoff == 0) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2953
2954
  		ERROR("Missing Signed-off-by: line(s)
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
2955
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
2956
  	print report_dump();
13214adf7   Andy Whitcroft   update checkpatch...
2957
2958
  	if ($summary && !($clean == 1 && $quiet == 1)) {
  		print "$filename " if ($summary_file);
8905a67c6   Andy Whitcroft   update checkpatch...
2959
2960
2961
2962
2963
2964
  		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...
2965
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
2966

0a920b5b6   Andy Whitcroft   add a trivial pat...
2967
  	if ($clean == 1 && $quiet == 0) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2968
2969
  		print "$vname has no obvious style problems and is ready for submission.
  "
0a920b5b6   Andy Whitcroft   add a trivial pat...
2970
2971
  	}
  	if ($clean == 0 && $quiet == 0) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2972
2973
  		print "$vname has style problems, please review.  If any of these errors
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2974
2975
2976
2977
2978
  		print "are false positives report them to the maintainer, see
  ";
  		print "CHECKPATCH in MAINTAINERS.
  ";
  	}
13214adf7   Andy Whitcroft   update checkpatch...
2979

0a920b5b6   Andy Whitcroft   add a trivial pat...
2980
2981
  	return $clean;
  }