Blame view

scripts/checkpatch.pl 72 KB
0a920b5b6   Andy Whitcroft   add a trivial pat...
1
  #!/usr/bin/perl -w
f4432c5ca   Dave Jones   Update email addr...
2
  # (c) 2001, Dave Jones. <davej@redhat.com> (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
144
145
146
147
  		}x;
  our $Attribute	= qr{
  			const|
  			__read_mostly|
  			__kprobes|
24e1d81ac   Andy Whitcroft   checkpatch: ____c...
148
149
150
  			__(?:mem|cpu|dev|)(?:initdata|init)|
  			____cacheline_aligned|
  			____cacheline_aligned_in_smp|
5fe3af119   Andy Whitcroft   checkpatch: __wea...
151
152
  			____cacheline_internodealigned_in_smp|
  			__weak
6c72ffaab   Andy Whitcroft   update checkpatch...
153
  		  }x;
c45dcabd2   Andy Whitcroft   update checkpatch...
154
  our $Modifier;
6c72ffaab   Andy Whitcroft   update checkpatch...
155
  our $Inline	= qr{inline|__always_inline|noinline};
6c72ffaab   Andy Whitcroft   update checkpatch...
156
157
158
159
160
  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...
161
  our $Compare    = qr{<=|>=|==|!=|<|>};
6c72ffaab   Andy Whitcroft   update checkpatch...
162
163
164
  our $Operators	= qr{
  			<=|>=|==|!=|
  			=>|->|<<|>>|<|>|!|~|
c2fdda0df   Andy Whitcroft   update checkpatch...
165
  			&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%
6c72ffaab   Andy Whitcroft   update checkpatch...
166
  		  }x;
8905a67c6   Andy Whitcroft   update checkpatch...
167
168
169
  our $NonptrType;
  our $Type;
  our $Declare;
171ae1a49   Andy Whitcroft   update checkpatch...
170
171
172
173
174
175
176
177
178
179
  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 ...
180
  our $typeTypedefs = qr{(?x:
fb9e9096b   Andy Whitcroft   checkpatch: limit...
181
  	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
182
183
  	atomic_t
  )};
8905a67c6   Andy Whitcroft   update checkpatch...
184
185
  our @typeList = (
  	qr{void},
c45dcabd2   Andy Whitcroft   update checkpatch...
186
187
188
189
190
191
192
  	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...
193
194
195
196
  	qr{unsigned},
  	qr{float},
  	qr{double},
  	qr{bool},
8905a67c6   Andy Whitcroft   update checkpatch...
197
198
199
200
201
202
203
  	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...
204
205
206
  our @modifierList = (
  	qr{fastcall},
  );
8905a67c6   Andy Whitcroft   update checkpatch...
207
208
  
  sub build_types {
d2172eb5b   Andy Whitcroft   checkpatch: possi...
209
210
211
212
213
214
215
216
  	my $mods = "(?x:  
  " . join("|
    ", @modifierList) . "
  )";
  	my $all = "(?x:  
  " . join("|
    ", @typeList) . "
  )";
c8cb2ca37   Andy Whitcroft   checkpatch: types...
217
  	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
8905a67c6   Andy Whitcroft   update checkpatch...
218
  	$NonptrType	= qr{
d2172eb5b   Andy Whitcroft   checkpatch: possi...
219
  			(?:$Modifier\s+|const\s+)*
cf655043d   Andy Whitcroft   update checkpatch...
220
  			(?:
c45dcabd2   Andy Whitcroft   update checkpatch...
221
  				(?:typeof|__typeof__)\s*\(\s*\**\s*$Ident\s*\)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
222
  				(?:$typeTypedefs\b)|
c45dcabd2   Andy Whitcroft   update checkpatch...
223
  				(?:${all}\b)
cf655043d   Andy Whitcroft   update checkpatch...
224
  			)
c8cb2ca37   Andy Whitcroft   checkpatch: types...
225
  			(?:\s+$Modifier|\s+const)*
8905a67c6   Andy Whitcroft   update checkpatch...
226
227
  		  }x;
  	$Type	= qr{
c45dcabd2   Andy Whitcroft   update checkpatch...
228
  			$NonptrType
65863862b   Andy Whitcroft   checkpatch: dissa...
229
  			(?:[\s\*]+\s*const|[\s\*]+|(?:\s*\[\s*\])+)?
c8cb2ca37   Andy Whitcroft   checkpatch: types...
230
  			(?:\s+$Inline|\s+$Modifier)*
8905a67c6   Andy Whitcroft   update checkpatch...
231
232
233
234
  		  }x;
  	$Declare	= qr{(?:$Storage\s+)?$Type};
  }
  build_types();
6c72ffaab   Andy Whitcroft   update checkpatch...
235
236
  
  $chk_signoff = 0 if ($file);
4a0df2ef4   Andy Whitcroft   update checkpatch...
237
238
  my @dep_includes = ();
  my @dep_functions = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
239
240
  my $removal = "Documentation/feature-removal-schedule.txt";
  if ($tree && -f "$root/$removal") {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
241
  	open(my $REMOVE, '<', "$root/$removal") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
242
243
  				die "$P: $removal: open failed - $!
  ";
21caa13c0   Andy Whitcroft   checkpatch: fix t...
244
  	while (<$REMOVE>) {
f0a594c1c   Andy Whitcroft   update checkpatch...
245
246
247
  		if (/^Check:\s+(.*\S)/) {
  			for my $entry (split(/[, ]+/, $1)) {
  				if ($entry =~ m@include/(.*)@) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
248
  					push(@dep_includes, $1);
4a0df2ef4   Andy Whitcroft   update checkpatch...
249

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

4a0df2ef4   Andy Whitcroft   update checkpatch...
335
336
337
338
339
340
341
342
343
344
345
346
  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...
347
348
349
350
351
352
353
354
355
356
357
  my $sanitise_quote = '';
  
  sub sanitise_line_reset {
  	my ($in_comment) = @_;
  
  	if ($in_comment) {
  		$sanitise_quote = '*/';
  	} else {
  		$sanitise_quote = '';
  	}
  }
00df344fd   Andy Whitcroft   update checkpatch...
358
359
360
361
362
  sub sanitise_line {
  	my ($line) = @_;
  
  	my $res = '';
  	my $l = '';
c2fdda0df   Andy Whitcroft   update checkpatch...
363
  	my $qlen = 0;
773647a09   Andy Whitcroft   update checkpatch...
364
365
  	my $off = 0;
  	my $c;
00df344fd   Andy Whitcroft   update checkpatch...
366

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

773647a09   Andy Whitcroft   update checkpatch...
408
409
410
411
412
413
  				substr($res, $off, 1, $c);
  				next;
  			} elsif ($sanitise_quote eq $c) {
  				$sanitise_quote = '';
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
414

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

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

773647a09   Andy Whitcroft   update checkpatch...
488
489
  		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>
  ";
4635f4fba   Andy Whitcroft   checkpatch: track...
490
491
492
493
494
495
496
497
498
  
  		# 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...
499
500
501
502
503
  		# Statement ends at the ';' or a close '}' at the
  		# outermost level.
  		if ($level == 0 && $c eq ';') {
  			last;
  		}
13214adf7   Andy Whitcroft   update checkpatch...
504
  		# An else is really a conditional as long as its not else if
773647a09   Andy Whitcroft   update checkpatch...
505
506
507
508
509
510
511
512
513
514
  		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...
515
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
516
517
518
519
520
521
522
523
524
525
  		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...
526
527
528
  				$coff_set = 1;
  				#warn "CSB: mark coff<$coff>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
  			}
  		}
  		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...
545
  	# We are truly at the end, so shuffle to the next line.
13214adf7   Andy Whitcroft   update checkpatch...
546
  	if ($off == $len) {
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
547
  		$loff = $len + 1;
13214adf7   Andy Whitcroft   update checkpatch...
548
549
550
  		$line++;
  		$remain--;
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
551
552
553
554
555
556
557
558
  
  	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...
559
560
  	#print "coff<$coff> soff<$off> loff<$loff>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
561
562
563
564
  
  	return ($statement, $condition,
  			$line, $remain + 1, $off - $loff + 1, $level);
  }
cf655043d   Andy Whitcroft   update checkpatch...
565
566
567
568
569
570
571
572
573
574
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
  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...
612
613
614
615
616
  sub ctx_statement_full {
  	my ($linenr, $remain, $off) = @_;
  	my ($statement, $condition, $level);
  
  	my (@chunks);
cf655043d   Andy Whitcroft   update checkpatch...
617
  	# Grab the first conditional/block pair.
13214adf7   Andy Whitcroft   update checkpatch...
618
619
  	($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
773647a09   Andy Whitcroft   update checkpatch...
620
621
  	#print "F: c<$condition> s<$statement> remain<$remain>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
622
623
624
625
626
627
628
629
  	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...
630
  	for (;;) {
13214adf7   Andy Whitcroft   update checkpatch...
631
632
  		($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
cf655043d   Andy Whitcroft   update checkpatch...
633
634
  		#print "C: c<$condition> s<$statement> remain<$remain>
  ";
773647a09   Andy Whitcroft   update checkpatch...
635
636
  		last if (!($remain > 0 && $condition =~ /^(?:\s*
  [+-])*\s*(?:else|do)\b/s));
cf655043d   Andy Whitcroft   update checkpatch...
637
638
639
  		#print "C: push
  ";
  		push(@chunks, [ $condition, $statement ]);
13214adf7   Andy Whitcroft   update checkpatch...
640
641
642
  	}
  
  	return ($level, $linenr, @chunks);
8905a67c6   Andy Whitcroft   update checkpatch...
643
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
644
  sub ctx_block_get {
f0a594c1c   Andy Whitcroft   update checkpatch...
645
  	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
4a0df2ef4   Andy Whitcroft   update checkpatch...
646
647
  	my $line;
  	my $start = $linenr - 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
648
649
650
651
  	my $blk = '';
  	my @o;
  	my @c;
  	my @res = ();
f0a594c1c   Andy Whitcroft   update checkpatch...
652
  	my $level = 0;
4635f4fba   Andy Whitcroft   checkpatch: track...
653
  	my @stack = ($level);
00df344fd   Andy Whitcroft   update checkpatch...
654
655
656
657
658
  	for ($line = $start; $remain > 0; $line++) {
  		next if ($rawlines[$line] =~ /^-/);
  		$remain--;
  
  		$blk .= $rawlines[$line];
4635f4fba   Andy Whitcroft   checkpatch: track...
659
660
661
662
663
664
665
666
667
  
  		# 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...
668
669
670
671
672
673
674
  		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...
675

f0a594c1c   Andy Whitcroft   update checkpatch...
676
677
678
679
680
681
682
  			if ($c eq $close && $level > 0) {
  				$level--;
  				last if ($level == 0);
  			} elsif ($c eq $open) {
  				$level++;
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
683

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

6c72ffaab   Andy Whitcroft   update checkpatch...
780
781
782
783
784
785
  	$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...
786
787
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
788
  	$res =~ s/$/\$/;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
789

6c72ffaab   Andy Whitcroft   update checkpatch...
790
  	return $res;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
791
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
792
  my $av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
793
  my $av_pending;
c2fdda0df   Andy Whitcroft   update checkpatch...
794
  my @av_paren_type;
1f65f947a   Andy Whitcroft   checkpatch: add c...
795
  my $av_pend_colon;
c2fdda0df   Andy Whitcroft   update checkpatch...
796
797
798
  
  sub annotate_reset {
  	$av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
799
800
  	$av_pending = '_';
  	@av_paren_type = ('E');
1f65f947a   Andy Whitcroft   checkpatch: add c...
801
  	$av_pend_colon = 'O';
c2fdda0df   Andy Whitcroft   update checkpatch...
802
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
803
804
  sub annotate_values {
  	my ($stream, $type) = @_;
0a920b5b6   Andy Whitcroft   add a trivial pat...
805

6c72ffaab   Andy Whitcroft   update checkpatch...
806
  	my $res;
1f65f947a   Andy Whitcroft   checkpatch: add c...
807
  	my $var = '_' x length($stream);
6c72ffaab   Andy Whitcroft   update checkpatch...
808
  	my $cur = $stream;
c2fdda0df   Andy Whitcroft   update checkpatch...
809
810
  	print "$stream
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
811

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

c45dcabd2   Andy Whitcroft   update checkpatch...
847
  		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
848
849
  			print "PRE_START($1)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
850
  			$av_preprocessor = 1;
cf655043d   Andy Whitcroft   update checkpatch...
851
852
853
  
  			push(@av_paren_type, $type);
  			push(@av_paren_type, $type);
171ae1a49   Andy Whitcroft   update checkpatch...
854
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
855

c45dcabd2   Andy Whitcroft   update checkpatch...
856
  		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
857
858
859
860
861
  			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...
862
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
863

c45dcabd2   Andy Whitcroft   update checkpatch...
864
  		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
865
866
867
868
869
870
871
872
873
  			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...
874
  			$type = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
875
876
877
  
  		} elsif ($cur =~ /^(\\
  )/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
878
879
  			print "PRECONT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
880

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

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

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

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

4a0df2ef4   Andy Whitcroft   update checkpatch...
1137
  	my $length;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1138
1139
1140
  	my $indent;
  	my $previndent=0;
  	my $stashindent=0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1141
  	our $clean = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1142
1143
  	my $signoff = 0;
  	my $is_patch = 0;
13214adf7   Andy Whitcroft   update checkpatch...
1144
  	our @report = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
1145
1146
1147
1148
  	our $cnt_lines = 0;
  	our $cnt_error = 0;
  	our $cnt_warn = 0;
  	our $cnt_chk = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1149
1150
1151
1152
1153
1154
  	# 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...
1155
  	my $comment_edge = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1156
  	my $first_line = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
1157
  	my $p1_prefix = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
1158

13214adf7   Andy Whitcroft   update checkpatch...
1159
1160
1161
  	my $prev_values = 'E';
  
  	# suppression flags
773647a09   Andy Whitcroft   update checkpatch...
1162
  	my %suppress_ifbraces;
170d3a226   Andy Whitcroft   checkpatch: handl...
1163
  	my %suppress_whiletrailers;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1164
  	my %suppress_export;
653d4876b   Andy Whitcroft   update checkpatch...
1165

c2fdda0df   Andy Whitcroft   update checkpatch...
1166
  	# Pre-scan the patch sanitizing the lines.
de7d4f0e1   Andy Whitcroft   update checkpatch...
1167
  	# Pre-scan the patch looking for any __setup documentation.
c2fdda0df   Andy Whitcroft   update checkpatch...
1168
  	#
de7d4f0e1   Andy Whitcroft   update checkpatch...
1169
1170
  	my @setup_docs = ();
  	my $setup_docs = 0;
773647a09   Andy Whitcroft   update checkpatch...
1171
1172
  
  	sanitise_line_reset();
c2fdda0df   Andy Whitcroft   update checkpatch...
1173
1174
  	my $line;
  	foreach my $rawline (@rawlines) {
773647a09   Andy Whitcroft   update checkpatch...
1175
1176
  		$linenr++;
  		$line = $rawline;
c2fdda0df   Andy Whitcroft   update checkpatch...
1177

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

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

4a0df2ef4   Andy Whitcroft   update checkpatch...
1275
1276
1277
  # 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...
1278
  		} elsif ($line =~ /^( |\+|$)/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
1279
  			$realline++;
d8aaf1214   Andy Whitcroft   update checkpatch...
1280
  			$realcnt-- if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1281

4a0df2ef4   Andy Whitcroft   update checkpatch...
1282
  			# Measure the line length and indent.
c2fdda0df   Andy Whitcroft   update checkpatch...
1283
  			($length, $indent) = line_stats($rawline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1284
1285
1286
1287
  
  			# Track the previous line.
  			($prevline, $stashline) = ($stashline, $line);
  			($previndent, $stashindent) = ($stashindent, $indent);
c2fdda0df   Andy Whitcroft   update checkpatch...
1288
  			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
773647a09   Andy Whitcroft   update checkpatch...
1289
1290
  			#warn "line<$line>
  ";
6c72ffaab   Andy Whitcroft   update checkpatch...
1291

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

c1ab33269   Andy Whitcroft   checkpatch: inclu...
1314
  			if ($realfile =~ m@^include/asm/@) {
773647a09   Andy Whitcroft   update checkpatch...
1315
1316
1317
1318
1319
1320
  				ERROR("do not modify files in include/asm, change architecture specific files in include/asm-<architecture>
  " . "$here$rawline
  ");
  			}
  			next;
  		}
389834b68   Randy Dunlap   checkpatch: produ...
1321
  		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1322

c2fdda0df   Andy Whitcroft   update checkpatch...
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
  		my $hereline = "$here
  $rawline
  ";
  		my $herecurr = "$here
  $rawline
  ";
  		my $hereprev = "$here
  $prevrawline
  $rawline
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1333

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

0a920b5b6   Andy Whitcroft   add a trivial pat...
1385
  #trailing whitespace
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1386
  		if ($line =~ /^\+.*\015/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1387
1388
1389
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1390
1391
  			ERROR("DOS line endings
  " . $herevet);
c2fdda0df   Andy Whitcroft   update checkpatch...
1392
1393
1394
1395
  		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
1396
1397
  			ERROR("trailing whitespace
  " . $herevet);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1398
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
1399
1400
1401
  
  # 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...
1402
  #80 column limit
c45dcabd2   Andy Whitcroft   update checkpatch...
1403
  		if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
f4c014c0d   Andy Whitcroft   checkpatch: allow...
1404
1405
1406
  		    $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
  		    $line !~ /^\+\s*printk\s*\(\s*(?:KERN_\S+\s*)?"[X\t]*"\s*(?:,|\)\s*;)\s*$/ &&
  		    $length > 80)
c45dcabd2   Andy Whitcroft   update checkpatch...
1407
  		{
de7d4f0e1   Andy Whitcroft   update checkpatch...
1408
1409
  			WARN("line over 80 characters
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1410
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1411
1412
1413
1414
1415
  # 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...
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
  # 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...
1433
1434
  # 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...
1435
1436
1437
  
  # at the beginning of a line any tabs must come first and anything
  # more than 8 must use tabs.
c2fdda0df   Andy Whitcroft   update checkpatch...
1438
1439
1440
1441
1442
  		if ($rawline =~ /^\+\s* \t\s*\S/ ||
  		    $rawline =~ /^\+\s*        \s*/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
171ae1a49   Andy Whitcroft   update checkpatch...
1443
1444
  			ERROR("code indent should use tabs where possible
  " . $herevet);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1445
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
1446
1447
  # 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...
1448
  # check for RCS/CVS revision markers
cf655043d   Andy Whitcroft   update checkpatch...
1449
  		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1450
1451
1452
  			WARN("CVS style keyword markers, these will _not_ be updated
  ". $herecurr);
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
1453

42e41c54d   Mike Frysinger   checkpatch: add s...
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
  # 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...
1469
  # Check for potential 'bare' types
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1470
1471
  		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
  		    $realline_next);
9c9ba34ee   Andy Whitcroft   update checkpatch...
1472
  		if ($realcnt && $line =~ /.\s*\S/) {
170d3a226   Andy Whitcroft   checkpatch: handl...
1473
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
1474
  				ctx_statement_block($linenr, $realcnt, 0);
171ae1a49   Andy Whitcroft   update checkpatch...
1475
1476
1477
1478
1479
1480
  			$stat =~ s/
  ./
   /g;
  			$cond =~ s/
  ./
   /g;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1481
1482
1483
1484
1485
1486
1487
  			# 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...
1488
1489
  			my $s = $stat;
  			$s =~ s/{.*$//s;
cf655043d   Andy Whitcroft   update checkpatch...
1490

c2fdda0df   Andy Whitcroft   update checkpatch...
1491
  			# Ignore goto labels.
171ae1a49   Andy Whitcroft   update checkpatch...
1492
  			if ($s =~ /$Ident:\*$/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1493
1494
  
  			# Ignore functions being called
171ae1a49   Andy Whitcroft   update checkpatch...
1495
  			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1496

463f28648   Andy Whitcroft   checkpatch: possi...
1497
  			} elsif ($s =~ /^.\s*else\b/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1498
  			# declarations always start with types
d25065865   Andy Whitcroft   checkpatch: possi...
1499
  			} 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...
1500
1501
1502
  				my $type = $1;
  				$type =~ s/\s+/ /g;
  				possible($type, "A:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1503
  			# definitions in global scope can only start with types
a6a840628   Andy Whitcroft   checkpatch: label...
1504
  			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1505
  				possible($1, "B:" . $s);
c2fdda0df   Andy Whitcroft   update checkpatch...
1506
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1507
1508
  
  			# any (foo ... *) is a pointer cast, and foo is a type
65863862b   Andy Whitcroft   checkpatch: dissa...
1509
  			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1510
  				possible($1, "C:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1511
1512
1513
1514
1515
  			}
  
  			# Check for any sort of function declaration.
  			# int foo(something bar, other baz);
  			# void (*store_gdt)(x86_descr_ptr *);
171ae1a49   Andy Whitcroft   update checkpatch...
1516
  			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...
1517
  				my ($name_len) = length($1);
8905a67c6   Andy Whitcroft   update checkpatch...
1518

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

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

c45dcabd2   Andy Whitcroft   update checkpatch...
1526
  						possible($1, "D:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1527
1528
  					}
  				}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1529
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1530

9c0ca6f9a   Andy Whitcroft   update checkpatch...
1531
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1532
1533
1534
  #
  # Checks which may be anchored in the context.
  #
00df344fd   Andy Whitcroft   update checkpatch...
1535

653d4876b   Andy Whitcroft   update checkpatch...
1536
1537
  # Check for switch () and associated case and default
  # statements should be at the same indent.
00df344fd   Andy Whitcroft   update checkpatch...
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
  		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...
1556
1557
  				ERROR("switch and case should be at the same indent
  $hereline$err");
de7d4f0e1   Andy Whitcroft   update checkpatch...
1558
1559
1560
1561
1562
  			}
  		}
  
  # 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...
1563
  		if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
773647a09   Andy Whitcroft   update checkpatch...
1564
  			my $pre_ctx = "$1$2";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1565
  			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1566
1567
1568
  			my $ctx_cnt = $realcnt - $#ctx - 1;
  			my $ctx = join("
  ", @ctx);
548596d52   Andy Whitcroft   checkpatch: trail...
1569
1570
  			my $ctx_ln = $linenr;
  			my $ctx_skip = $realcnt;
773647a09   Andy Whitcroft   update checkpatch...
1571

548596d52   Andy Whitcroft   checkpatch: trail...
1572
1573
1574
1575
1576
1577
  			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...
1578
  				$ctx_ln++;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1579
  			}
548596d52   Andy Whitcroft   checkpatch: trail...
1580

53210168f   Andy Whitcroft   checkpatch: tough...
1581
1582
1583
1584
1585
1586
1587
  			#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...
1588

773647a09   Andy Whitcroft   update checkpatch...
1589
1590
1591
  			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...
1592
1593
1594
1595
  					"$here
  $ctx
  $lines[$ctx_ln - 1]
  ");
00df344fd   Andy Whitcroft   update checkpatch...
1596
  			}
773647a09   Andy Whitcroft   update checkpatch...
1597
1598
1599
1600
  			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
  			    $ctx =~ /\)\s*\;\s*$/ &&
  			    defined $lines[$ctx_ln - 1])
  			{
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1601
1602
  				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
  				if ($nindent > $indent) {
773647a09   Andy Whitcroft   update checkpatch...
1603
1604
  					WARN("trailing semicolon indicates no statements, indent implies otherwise
  " .
c45dcabd2   Andy Whitcroft   update checkpatch...
1605
1606
1607
1608
  						"$here
  $ctx
  $lines[$ctx_ln - 1]
  ");
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1609
1610
  				}
  			}
00df344fd   Andy Whitcroft   update checkpatch...
1611
  		}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
  # 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...
1626
1627
1628
  			my @newlines = ($c =~ /
  /gs);
  			my $cond_lines = 1 + $#newlines;
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
  
  			# 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...
1642
1643
  			if ($s =~ s/^\s*?
  //) {
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
  				$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...
1654
  			my $cond_ptr = -1;
740504c61   Andy Whitcroft   checkpatch: suspe...
1655
  			$continuation = 0;
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
1656
1657
  			while ($cond_ptr != $cond_lines) {
  				$cond_ptr = $cond_lines;
f16fa28f7   Andy Whitcroft   checkpatch: suspe...
1658
1659
1660
1661
1662
  				# 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...
1663
1664
1665
1666
  				# Ignore:
  				#  1) blank lines, they should be at 0,
  				#  2) preprocessor lines, and
  				#  3) labels.
740504c61   Andy Whitcroft   checkpatch: suspe...
1667
1668
1669
  				if ($continuation ||
  				    $s =~ /^\s*?
  / ||
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
1670
1671
  				    $s =~ /^\s*#\s*?/ ||
  				    $s =~ /^\s*$Ident\s*:/) {
740504c61   Andy Whitcroft   checkpatch: suspe...
1672
1673
  					$continuation = ($s =~ /^.*?\\
  /) ? 1 : 0;
30dad6ebe   Andy Whitcroft   checkpatch: inden...
1674
1675
1676
1677
  					if ($s =~ s/^.*?
  //) {
  						$cond_lines++;
  					}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
1678
  				}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
  			}
  
  			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...
1694
1695
  			#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...
1696
1697
1698
1699
1700
1701
1702
1703
  
  			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...
1704
1705
  		# Track the 'values' across context and added lines.
  		my $opline = $line; $opline =~ s/^./ /;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1706
1707
1708
  		my ($curr_values, $curr_vars) =
  				annotate_values($opline . "
  ", $prev_values);
6c72ffaab   Andy Whitcroft   update checkpatch...
1709
  		$curr_values = $prev_values . $curr_values;
c2fdda0df   Andy Whitcroft   update checkpatch...
1710
1711
  		if ($dbg_values) {
  			my $outline = $opline; $outline =~ s/\t/ /g;
cf655043d   Andy Whitcroft   update checkpatch...
1712
1713
1714
1715
  			print "$linenr > .$outline
  ";
  			print "$linenr > $curr_values
  ";
1f65f947a   Andy Whitcroft   checkpatch: add c...
1716
1717
  			print "$linenr >  $curr_vars
  ";
c2fdda0df   Andy Whitcroft   update checkpatch...
1718
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
1719
  		$prev_values = substr($curr_values, -1);
00df344fd   Andy Whitcroft   update checkpatch...
1720
1721
  #ignore lines not being added
  		if ($line=~/^[^\+]/) {next;}
653d4876b   Andy Whitcroft   update checkpatch...
1722
  # TEST: allow direct testing of the type matcher.
7429c6903   Andy Whitcroft   checkpatch: impro...
1723
1724
1725
1726
1727
1728
1729
1730
  		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...
1731
1732
  			next;
  		}
a1ef277e2   Andy Whitcroft   checkpatch: add t...
1733
1734
  # TEST: allow direct testing of the attribute matcher.
  		if ($dbg_attr) {
9360b0e50   Andy Whitcroft   checkpatch: exten...
1735
  			if ($line =~ /^.\s*$Modifier\s*$/) {
a1ef277e2   Andy Whitcroft   checkpatch: add t...
1736
1737
  				ERROR("TEST: is attr
  " . $herecurr);
9360b0e50   Andy Whitcroft   checkpatch: exten...
1738
  			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
a1ef277e2   Andy Whitcroft   checkpatch: add t...
1739
1740
1741
1742
1743
  				ERROR("TEST: is not attr ($1 is)
  ". $herecurr);
  			}
  			next;
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1744

f0a594c1c   Andy Whitcroft   update checkpatch...
1745
  # check for initialisation to aggregates open brace on the next line
99423c206   Andy Whitcroft   checkpatch: fix _...
1746
1747
  		if ($line =~ /^.\s*{/ &&
  		    $prevline =~ /(?:^|[^=])=\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
1748
1749
  			ERROR("that open brace { should be on the previous line
  " . $hereprev);
f0a594c1c   Andy Whitcroft   update checkpatch...
1750
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1751
1752
1753
1754
1755
  #
  # Checks which are anchored on the added line.
  #
  
  # check for malformed paths in #include statements (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
1756
  		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876b   Andy Whitcroft   update checkpatch...
1757
1758
  			my $path = $1;
  			if ($path =~ m{//}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1759
1760
1761
  				ERROR("malformed #include filename
  " .
  					$herecurr);
653d4876b   Andy Whitcroft   update checkpatch...
1762
  			}
653d4876b   Andy Whitcroft   update checkpatch...
1763
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1764

0a920b5b6   Andy Whitcroft   add a trivial pat...
1765
  # no C99 // comments
00df344fd   Andy Whitcroft   update checkpatch...
1766
  		if ($line =~ m{//}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1767
1768
  			ERROR("do not use C99 // comments
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1769
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1770
  		# Remove C99 comments.
0a920b5b6   Andy Whitcroft   add a trivial pat...
1771
  		$line =~ s@//.*@@;
6c72ffaab   Andy Whitcroft   update checkpatch...
1772
  		$opline =~ s@//.*@@;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1773

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1774
1775
1776
1777
1778
1779
1780
1781
1782
  # 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...
1783
  			my $name = $1;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1784
1785
1786
  			if ($stat !~ /(?:
  				
  .}\s*$|
480120586   Andy Whitcroft   checkpatch: DEFIN...
1787
1788
1789
  				^.DEFINE_$Ident\(\Q$name\E\)|
  				^.DECLARE_$Ident\(\Q$name\E\)|
  				^.LIST_HEAD\(\Q$name\E\)|
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1790
1791
  				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
  				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
480120586   Andy Whitcroft   checkpatch: DEFIN...
1792
  			    )/x) {
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1793
1794
1795
1796
1797
  #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...
1798
1799
  			}
  		}
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
  		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...
1813

f0a594c1c   Andy Whitcroft   update checkpatch...
1814
  # check for external initialisers.
c45dcabd2   Andy Whitcroft   update checkpatch...
1815
  		if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) {
f0a594c1c   Andy Whitcroft   update checkpatch...
1816
1817
1818
1819
  			ERROR("do not initialise externals to 0 or NULL
  " .
  				$herecurr);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1820
  # check for static initialisers.
2d1bafd79   Andy Whitcroft   checkpatch: do no...
1821
  		if ($line =~ /\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1822
1823
1824
  			ERROR("do not initialise statics to 0 or NULL
  " .
  				$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1825
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1826
1827
1828
  # check for new typedefs, only function parameters and sparse annotations
  # make sense.
  		if ($line =~ /\btypedef\s/ &&
8054576dc   Andy Whitcroft   checkpatch: loose...
1829
  		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
1830
  		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
1831
  		    $line !~ /\b$typeTypedefs\b/ &&
653d4876b   Andy Whitcroft   update checkpatch...
1832
  		    $line !~ /\b__bitwise(?:__|)\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1833
1834
  			WARN("do not add new typedefs
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1835
1836
1837
  		}
  
  # * goes on variable not on type
65863862b   Andy Whitcroft   checkpatch: dissa...
1838
  		# (char*[ const])
00ef4ece0   Andy Whitcroft   checkpatch: corre...
1839
  		if ($line =~ m{\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\)}) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1840
1841
1842
1843
1844
1845
1846
  			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/...
1847
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1848
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
1849

65863862b   Andy Whitcroft   checkpatch: dissa...
1850
1851
1852
1853
1854
1855
  			#print "from<$from> to<$to>
  ";
  			if ($from ne $to) {
  				ERROR("\"(foo$from)\" should be \"(foo$to)\"
  " .  $herecurr);
  			}
00ef4ece0   Andy Whitcroft   checkpatch: corre...
1856
  		} elsif ($line =~ m{\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident)}) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1857
1858
1859
1860
1861
1862
1863
  			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/...
1864
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1865
1866
1867
  			}
  			# Modifiers should have spaces.
  			$to =~ s/(\b$Modifier$)/$1 /;
d8aaf1214   Andy Whitcroft   update checkpatch...
1868

667026e7b   Andy Whitcroft   checkpatch: a mod...
1869
1870
1871
  			#print "from<$from> to<$to> ident<$ident>
  ";
  			if ($from ne $to && $ident !~ /^$Modifier$/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1872
1873
1874
  				ERROR("\"foo${from}bar\" should be \"foo${to}bar\"
  " .  $herecurr);
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1875
1876
1877
1878
1879
1880
1881
1882
1883
  		}
  
  # # 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...
1884
  		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1885
1886
  			WARN("LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
1887
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1888
1889
1890
1891
1892
  # 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...
1893
  		if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
00df344fd   Andy Whitcroft   update checkpatch...
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
  			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...
1910
1911
  				WARN("printk() should include KERN_ facility level
  " . $herecurr);
00df344fd   Andy Whitcroft   update checkpatch...
1912
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1913
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1914
1915
  # 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...
1916
1917
  		if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and
  		    !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1918
1919
  			ERROR("open brace '{' following function declarations go on the next line
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1920
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1921

8905a67c6   Andy Whitcroft   update checkpatch...
1922
1923
1924
1925
1926
1927
  # 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...
1928
1929
  # check for spacing round square brackets; allowed:
  #  1. with a type on the left -- int [] a;
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
1930
1931
  #  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...
1932
1933
1934
  		while ($line =~ /(.*?\s)\[/g) {
  			my ($where, $prefix) = ($-[1], $1);
  			if ($prefix !~ /$Type\s+$/ &&
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
1935
1936
  			    ($where != 0 || $prefix !~ /^.\s+$/) &&
  			    $prefix !~ /{\s+$/) {
8d31cfcec   Andy Whitcroft   checkpatch: check...
1937
1938
1939
1940
  				ERROR("space prohibited before open square bracket '['
  " . $herecurr);
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
1941
  # check for spaces between functions and their parentheses.
6c72ffaab   Andy Whitcroft   update checkpatch...
1942
  		while ($line =~ /($Ident)\s+\(/g) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1943
  			my $name = $1;
773647a09   Andy Whitcroft   update checkpatch...
1944
1945
  			my $ctx_before = substr($line, 0, $-[1]);
  			my $ctx = "$ctx_before$name";
c2fdda0df   Andy Whitcroft   update checkpatch...
1946
1947
  
  			# Ignore those directives where spaces _are_ permitted.
773647a09   Andy Whitcroft   update checkpatch...
1948
1949
1950
1951
1952
1953
  			if ($name =~ /^(?:
  				if|for|while|switch|return|case|
  				volatile|__volatile__|
  				__attribute__|format|__extension__|
  				asm|__asm__)$/x)
  			{
c2fdda0df   Andy Whitcroft   update checkpatch...
1954
1955
1956
1957
  
  			# 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...
1958
  			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
1959
1960
  
  			# cpp #elif statement condition may start with a (
c45dcabd2   Andy Whitcroft   update checkpatch...
1961
  			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1962
1963
1964
  
  			# If this whole things ends with a type its most
  			# likely a typedef for a function.
773647a09   Andy Whitcroft   update checkpatch...
1965
  			} elsif ($ctx =~ /$Type$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1966
1967
  
  			} else {
773647a09   Andy Whitcroft   update checkpatch...
1968
1969
  				WARN("space prohibited between function name and open parenthesis '('
  " . $herecurr);
6c72ffaab   Andy Whitcroft   update checkpatch...
1970
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
1971
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1972
  # Check operator spacing.
0a920b5b6   Andy Whitcroft   add a trivial pat...
1973
  		if (!($line=~/\#\s*include/)) {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1974
1975
1976
1977
  			my $ops = qr{
  				<<=|>>=|<=|>=|==|!=|
  				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
  				=>|->|<<|>>|<|>|=|!|~|
1f65f947a   Andy Whitcroft   checkpatch: add c...
1978
1979
  				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
  				\?|:
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1980
  			}x;
cf655043d   Andy Whitcroft   update checkpatch...
1981
  			my @elements = split(/($ops|;)/, $opline);
00df344fd   Andy Whitcroft   update checkpatch...
1982
  			my $off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
1983
1984
  
  			my $blank = copy_spacing($opline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1985
  			for (my $n = 0; $n < $#elements; $n += 2) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
1986
  				$off += length($elements[$n]);
773647a09   Andy Whitcroft   update checkpatch...
1987
1988
1989
1990
1991
1992
1993
  				# 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...
1994
1995
1996
  				my $a = '';
  				$a = 'V' if ($elements[$n] ne '');
  				$a = 'W' if ($elements[$n] =~ /\s$/);
cf655043d   Andy Whitcroft   update checkpatch...
1997
  				$a = 'C' if ($elements[$n] =~ /$;$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1998
1999
  				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
  				$a = 'O' if ($elements[$n] eq '');
773647a09   Andy Whitcroft   update checkpatch...
2000
  				$a = 'E' if ($ca =~ /^\s*$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2001

0a920b5b6   Andy Whitcroft   add a trivial pat...
2002
  				my $op = $elements[$n + 1];
4a0df2ef4   Andy Whitcroft   update checkpatch...
2003
2004
  
  				my $c = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2005
  				if (defined $elements[$n + 2]) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2006
2007
  					$c = 'V' if ($elements[$n + 2] ne '');
  					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043d   Andy Whitcroft   update checkpatch...
2008
  					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2009
2010
  					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
  					$c = 'O' if ($elements[$n + 2] eq '');
8b1b33786   Andy Whitcroft   checkpatch: fix c...
2011
  					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2012
2013
  				} else {
  					$c = 'E';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2014
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2015
2016
2017
  				my $ctx = "${a}x${c}";
  
  				my $at = "(ctx:$ctx)";
6c72ffaab   Andy Whitcroft   update checkpatch...
2018
  				my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e1   Andy Whitcroft   update checkpatch...
2019
2020
  				my $hereptr = "$hereline$ptr
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2021

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

1f65f947a   Andy Whitcroft   checkpatch: add c...
2025
2026
  				# Get the full operator variant.
  				my $opv = $op . substr($curr_vars, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
2027
2028
2029
  				# Ignore operators passed as parameters.
  				if ($op_type ne 'V' &&
  				    $ca =~ /\s$/ && $cc =~ /^\s*,/) {
cf655043d   Andy Whitcroft   update checkpatch...
2030
2031
  #				# Ignore comments
  #				} elsif ($op =~ /^$;+$/) {
13214adf7   Andy Whitcroft   update checkpatch...
2032

d8aaf1214   Andy Whitcroft   update checkpatch...
2033
  				# ; should have either the end of line or a space or \ after it
13214adf7   Andy Whitcroft   update checkpatch...
2034
  				} elsif ($op eq ';') {
cf655043d   Andy Whitcroft   update checkpatch...
2035
2036
  					if ($ctx !~ /.x[WEBC]/ &&
  					    $cc !~ /^\\/ && $cc !~ /^;/) {
773647a09   Andy Whitcroft   update checkpatch...
2037
2038
  						ERROR("space required after that '$op' $at
  " . $hereptr);
d8aaf1214   Andy Whitcroft   update checkpatch...
2039
2040
2041
2042
  					}
  
  				# // is a comment
  				} elsif ($op eq '//') {
0a920b5b6   Andy Whitcroft   add a trivial pat...
2043

1f65f947a   Andy Whitcroft   checkpatch: add c...
2044
2045
2046
2047
  				# No spaces for:
  				#   ->
  				#   :   when part of a bitfield
  				} elsif ($op eq '->' || $opv eq ':B') {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2048
  					if ($ctx =~ /Wx.|.xW/) {
773647a09   Andy Whitcroft   update checkpatch...
2049
2050
  						ERROR("spaces prohibited around that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2051
2052
2053
2054
  					}
  
  				# , must have a space on the right.
  				} elsif ($op eq ',') {
cf655043d   Andy Whitcroft   update checkpatch...
2055
  					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
773647a09   Andy Whitcroft   update checkpatch...
2056
2057
  						ERROR("space required after that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2058
  					}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2059
  				# '*' as part of a type definition -- reported already.
74048ed81   Andy Whitcroft   checkpatch: varia...
2060
  				} elsif ($opv eq '*_') {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2061
2062
2063
2064
2065
2066
2067
  					#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...
2068
  					 $opv eq '*U' || $opv eq '-U' ||
0d413866c   Andy Whitcroft   checkpatch: value...
2069
  					 $opv eq '&U' || $opv eq '&&U') {
cf655043d   Andy Whitcroft   update checkpatch...
2070
  					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
773647a09   Andy Whitcroft   update checkpatch...
2071
2072
  						ERROR("space required before that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2073
  					}
a3340b357   Andy Whitcroft   checkpatch: point...
2074
  					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
171ae1a49   Andy Whitcroft   update checkpatch...
2075
2076
2077
  						# A unary '*' may be const
  
  					} elsif ($ctx =~ /.xW/) {
fb9e9096b   Andy Whitcroft   checkpatch: limit...
2078
2079
  						ERROR("space prohibited after that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2080
2081
2082
2083
  					}
  
  				# unary ++ and unary -- are allowed no space on one side.
  				} elsif ($op eq '++' or $op eq '--') {
773647a09   Andy Whitcroft   update checkpatch...
2084
2085
2086
2087
2088
2089
2090
2091
  					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...
2092
  					}
773647a09   Andy Whitcroft   update checkpatch...
2093
2094
2095
  					if ($ctx =~ /ExW/) {
  						ERROR("space prohibited after that '$op' $at
  " . $hereptr);
653d4876b   Andy Whitcroft   update checkpatch...
2096
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2097

773647a09   Andy Whitcroft   update checkpatch...
2098

0a920b5b6   Andy Whitcroft   add a trivial pat...
2099
  				# << and >> may either have or not have spaces both sides
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2100
2101
2102
  				} 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...
2103
2104
  					 $op eq '*' or $op eq '/' or
  					 $op eq '%')
0a920b5b6   Andy Whitcroft   add a trivial pat...
2105
  				{
773647a09   Andy Whitcroft   update checkpatch...
2106
  					if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2107
2108
2109
  						ERROR("need consistent spacing around '$op' $at
  " .
  							$hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2110
  					}
1f65f947a   Andy Whitcroft   checkpatch: add c...
2111
2112
2113
2114
2115
2116
2117
  				# 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...
2118
  				# All the others need spaces both sides.
cf655043d   Andy Whitcroft   update checkpatch...
2119
  				} elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947a   Andy Whitcroft   checkpatch: add c...
2120
  					my $ok = 0;
22f2a2ef9   Andy Whitcroft   update checkpatch...
2121
  					# Ignore email addresses <foo@bar>
1f65f947a   Andy Whitcroft   checkpatch: add c...
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
  					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...
2137
2138
  						ERROR("spaces required around that '$op' $at
  " . $hereptr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2139
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2140
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2141
  				$off += length($elements[$n + 1]);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2142
2143
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2144
2145
  # check for multiple assignments
  		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
6c72ffaab   Andy Whitcroft   update checkpatch...
2146
2147
  			CHK("multiple assignments should be avoided
  " . $herecurr);
f0a594c1c   Andy Whitcroft   update checkpatch...
2148
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
  ## # 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...
2164

0a920b5b6   Andy Whitcroft   add a trivial pat...
2165
  #need space before brace following if, while, etc
22f2a2ef9   Andy Whitcroft   update checkpatch...
2166
2167
  		if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
  		    $line =~ /do{/) {
773647a09   Andy Whitcroft   update checkpatch...
2168
2169
  			ERROR("space required before the open brace '{'
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2170
2171
2172
2173
2174
  		}
  
  # closing brace should have a space following it when it has anything
  # on the line
  		if ($line =~ /}(?!(?:,|;|\)))\S/) {
773647a09   Andy Whitcroft   update checkpatch...
2175
2176
  			ERROR("space required after that close brace '}'
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2177
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2178
2179
  # check spacing on square brackets
  		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
2180
2181
  			ERROR("space prohibited after that open square bracket '['
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2182
2183
  		}
  		if ($line =~ /\s\]/) {
773647a09   Andy Whitcroft   update checkpatch...
2184
2185
  			ERROR("space prohibited before that close square bracket ']'
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2186
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
2187
  # check spacing on parentheses
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2188
2189
  		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
  		    $line !~ /for\s*\(\s+;/) {
773647a09   Andy Whitcroft   update checkpatch...
2190
2191
  			ERROR("space prohibited after that open parenthesis '('
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2192
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2193
  		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2194
2195
  		    $line !~ /for\s*\(.*;\s+\)/ &&
  		    $line !~ /:\s+\)/) {
773647a09   Andy Whitcroft   update checkpatch...
2196
2197
  			ERROR("space prohibited before that close parenthesis ')'
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2198
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2199
  #goto labels aren't indented, allow a single space however
4a0df2ef4   Andy Whitcroft   update checkpatch...
2200
  		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b6   Andy Whitcroft   add a trivial pat...
2201
  		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2202
2203
  			WARN("labels should not be indented
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2204
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
2205
2206
2207
2208
  # Return is not a function.
  		if (defined($stat) && $stat =~ /^.\s*return(\s*)(\(.*);/s) {
  			my $spacing = $1;
  			my $value = $2;
86f9d059c   Andy Whitcroft   checkpatch: allow...
2209
  			# Flatten any parentheses
fee61c47d   Andy Whitcroft   checkpatch: retur...
2210
  			$value =~ s/\)\(/\) \(/g;
63f17f897   Andy Whitcroft   checkpatch: allow...
2211
2212
2213
2214
2215
  			while ($value =~ s/\[[^\{\}]*\]/1/ ||
  			       $value !~ /(?:$Ident|-?$Constant)\s*
  					     $Compare\s*
  					     (?:$Ident|-?$Constant)/x &&
  			       $value =~ s/\([^\(\)]*\)/1/) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
  			}
  
  			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...
2227
  # Need a space before open parenthesis after if, while etc
4a0df2ef4   Andy Whitcroft   update checkpatch...
2228
  		if ($line=~/\b(if|while|for|switch)\(/) {
773647a09   Andy Whitcroft   update checkpatch...
2229
2230
  			ERROR("space required before the open parenthesis '('
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2231
  		}
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
2232
2233
  # Check for illegal assignment in if conditional -- and check for trailing
  # statements after the conditional.
170d3a226   Andy Whitcroft   checkpatch: handl...
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
  		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...
2258
  			my ($s, $c) = ($stat, $cond);
8905a67c6   Andy Whitcroft   update checkpatch...
2259

b53c8e104   Andy Whitcroft   checkpatch: ensur...
2260
  			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2261
2262
  				ERROR("do not use assignment in if condition
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
2263
2264
2265
2266
  			}
  
  			# Find out what is on the end of the line after the
  			# conditional.
773647a09   Andy Whitcroft   update checkpatch...
2267
  			substr($s, 0, length($c), '');
8905a67c6   Andy Whitcroft   update checkpatch...
2268
2269
  			$s =~ s/
  .*//g;
13214adf7   Andy Whitcroft   update checkpatch...
2270
  			$s =~ s/$;//g; 	# Remove any comments
53210168f   Andy Whitcroft   checkpatch: tough...
2271
2272
  			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
  			    $c !~ /}\s*while\s*/)
773647a09   Andy Whitcroft   update checkpatch...
2273
  			{
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
  				# Find out how long the conditional actually is.
  				my @newlines = ($c =~ /
  /gs);
  				my $cond_lines = 1 + $#newlines;
  
  				my $stat_real = raw_line($linenr, $cond_lines);
  				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...
2287
2288
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
  # 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...
2304
  # if and else should not have general statements after it
13214adf7   Andy Whitcroft   update checkpatch...
2305
2306
2307
2308
2309
2310
2311
  		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...
2312
  		}
396677823   Andy Whitcroft   checkpatch: if sh...
2313
2314
2315
2316
2317
2318
  # 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/...
2319
2320
2321
  # 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...
2322
  			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf80   Andy Whitcroft   checkpatch: case/...
2323
2324
2325
2326
2327
2328
  			\s*return\s+
  		    )/xg)
  		{
  			ERROR("trailing statements should be on next line
  " . $herecurr);
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2329
2330
2331
2332
2333
  
  		# 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...
2334
2335
  			ERROR("else should follow close brace '}'
  " . $hereprev);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2336
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
2337
2338
2339
2340
2341
2342
  		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...
2343
  			substr($s, 0, length($c), '');
c2fdda0df   Andy Whitcroft   update checkpatch...
2344
2345
2346
2347
2348
2349
2350
2351
  			$s =~ s/
  .*//g;
  
  			if ($s =~ /^\s*;/) {
  				ERROR("while should follow close brace '}'
  " . $hereprev);
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2352
2353
2354
2355
2356
2357
2358
2359
2360
  #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...
2361
  		if ($line=~/\#\s*define.*\\\s$/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2362
2363
  			WARN("Whitepspace after \\ makes next lines useless
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2364
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2365
  #warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
2366
  		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec483   Andy Whitcroft   checkpatch: reduc...
2367
2368
2369
2370
  			my $file = "$1.h";
  			my $checkfile = "include/linux/$file";
  			if (-f "$root/$checkfile" &&
  			    $realfile ne $checkfile &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2371
2372
  			    $1 ne 'irq')
  			{
e09dec483   Andy Whitcroft   checkpatch: reduc...
2373
2374
2375
2376
2377
2378
2379
  				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...
2380
2381
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2382
2383
  # 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...
2384
  # in a known good container
b8f96a31f   Andy Whitcroft   checkpatch: macro...
2385
2386
  		if ($realfile !~ m@/vmlinux.lds.h$@ &&
  		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf1214   Andy Whitcroft   update checkpatch...
2387
2388
  			my $ln = $linenr;
  			my $cnt = $realcnt;
c45dcabd2   Andy Whitcroft   update checkpatch...
2389
2390
  			my ($off, $dstat, $dcond, $rest);
  			my $ctx = '';
653d4876b   Andy Whitcroft   update checkpatch...
2391

c45dcabd2   Andy Whitcroft   update checkpatch...
2392
2393
2394
2395
2396
2397
2398
2399
2400
  			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...
2401
  				$cnt-- if ($lines[$ln - 1] !~ /^-/);
c45dcabd2   Andy Whitcroft   update checkpatch...
2402
  				$ln++;
c45dcabd2   Andy Whitcroft   update checkpatch...
2403
2404
2405
2406
2407
2408
2409
  			}
  			$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...
2410
2411
  			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
2412
2413
2414
2415
  
  			# Extract the remainder of the define (if any) and
  			# rip off surrounding spaces, and trailing \'s.
  			$rest = '';
636d140a8   Andy Whitcroft   checkpatch: compl...
2416
2417
2418
  			while ($off != 0 || ($cnt > 0 && $rest =~ /\\\s*$/)) {
  				#print "ADDING cnt<$cnt> $off <" . substr($lines[$ln - 1], $off) . "> rest<$rest>
  ";
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
2419
2420
2421
2422
2423
  				if ($off != 0 || $lines[$ln - 1] !~ /^-/) {
  					$rest .= substr($lines[$ln - 1], $off) . "
  ";
  					$cnt--;
  				}
c45dcabd2   Andy Whitcroft   update checkpatch...
2424
  				$ln++;
c45dcabd2   Andy Whitcroft   update checkpatch...
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
  				$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...
2437
  			}
292f1a9b3   Andy Whitcroft   checkpatch: compl...
2438
  			$dstat =~ s/$;//g;
c45dcabd2   Andy Whitcroft   update checkpatch...
2439
2440
2441
2442
  			$dstat =~ s/\\
  .//g;
  			$dstat =~ s/^\s*//s;
  			$dstat =~ s/\s*$//s;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2443

c45dcabd2   Andy Whitcroft   update checkpatch...
2444
  			# Flatten any parentheses and braces
bf30d6ede   Andy Whitcroft   checkpatch: compl...
2445
2446
2447
2448
  			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
  			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
  			       $dstat =~ s/\[[^\{\}]*\]/1/)
  			{
de7d4f0e1   Andy Whitcroft   update checkpatch...
2449
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
2450

c45dcabd2   Andy Whitcroft   update checkpatch...
2451
2452
2453
2454
2455
2456
  			my $exceptions = qr{
  				$Declare|
  				module_param_named|
  				MODULE_PARAM_DESC|
  				DECLARE_PER_CPU|
  				DEFINE_PER_CPU|
383099fd6   Andy Whitcroft   checkpatch: struc...
2457
  				__typeof__\(|
ea71a0a01   Andy Whitcroft   checkpatch: forma...
2458
2459
  				\.$Ident\s*=\s*|
  				^\"|\"$
c45dcabd2   Andy Whitcroft   update checkpatch...
2460
  			}x;
383099fd6   Andy Whitcroft   checkpatch: struc...
2461
2462
  			#print "REST<$rest> dstat<$dstat>
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
2463
2464
2465
2466
  			if ($rest ne '') {
  				if ($rest !~ /while\s*\(/ &&
  				    $dstat !~ /$exceptions/)
  				{
de7d4f0e1   Andy Whitcroft   update checkpatch...
2467
2468
2469
2470
  					ERROR("Macros with multiple statements should be enclosed in a do - while loop
  " . "$here
  $ctx
  ");
c45dcabd2   Andy Whitcroft   update checkpatch...
2471
2472
2473
2474
2475
2476
  				}
  
  			} elsif ($ctx !~ /;/) {
  				if ($dstat ne '' &&
  				    $dstat !~ /^(?:$Ident|-?$Constant)$/ &&
  				    $dstat !~ /$exceptions/ &&
b132e5d58   Andy Whitcroft   checkpatch: macro...
2477
  				    $dstat !~ /^\.$Ident\s*=/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2478
2479
  				    $dstat =~ /$Operators/)
  				{
de7d4f0e1   Andy Whitcroft   update checkpatch...
2480
2481
2482
2483
  					ERROR("Macros with complex values should be enclosed in parenthesis
  " . "$here
  $ctx
  ");
d8aaf1214   Andy Whitcroft   update checkpatch...
2484
  				}
653d4876b   Andy Whitcroft   update checkpatch...
2485
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2486
  		}
080ba9296   Mike Frysinger   checkpatch: try t...
2487
2488
2489
2490
2491
2492
2493
2494
2495
  # 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...
2496
  # check for redundant bracing round if etc
13214adf7   Andy Whitcroft   update checkpatch...
2497
2498
  		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
  			my ($level, $endln, @chunks) =
cf655043d   Andy Whitcroft   update checkpatch...
2499
  				ctx_statement_full($linenr, $realcnt, 1);
13214adf7   Andy Whitcroft   update checkpatch...
2500
2501
  			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
2502
2503
2504
  			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>
  ";
  			if ($#chunks > 0 && $level == 0) {
13214adf7   Andy Whitcroft   update checkpatch...
2505
2506
  				my $allowed = 0;
  				my $seen = 0;
773647a09   Andy Whitcroft   update checkpatch...
2507
2508
  				my $herectx = $here . "
  ";
cf655043d   Andy Whitcroft   update checkpatch...
2509
  				my $ln = $linenr - 1;
13214adf7   Andy Whitcroft   update checkpatch...
2510
2511
  				for my $chunk (@chunks) {
  					my ($cond, $block) = @{$chunk};
773647a09   Andy Whitcroft   update checkpatch...
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
  					# 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...
2526
  					$ln += statement_rawlines($block) - 1;
773647a09   Andy Whitcroft   update checkpatch...
2527
  					substr($block, 0, length($cond), '');
13214adf7   Andy Whitcroft   update checkpatch...
2528
2529
  
  					$seen++ if ($block =~ /^\s*{/);
cf655043d   Andy Whitcroft   update checkpatch...
2530
2531
2532
2533
2534
  					#print "cond<$cond> block<$block> allowed<$allowed>
  ";
  					if (statement_lines($cond) > 1) {
  						#print "APW: ALLOWED: cond<$cond>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
2535
2536
2537
  						$allowed = 1;
  					}
  					if ($block =~/\b(?:if|for|while)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
2538
2539
  						#print "APW: ALLOWED: block<$block>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
2540
2541
  						$allowed = 1;
  					}
cf655043d   Andy Whitcroft   update checkpatch...
2542
2543
2544
  					if (statement_block_size($block) > 1) {
  						#print "APW: ALLOWED: lines block<$block>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
2545
2546
2547
2548
  						$allowed = 1;
  					}
  				}
  				if ($seen && !$allowed) {
cf655043d   Andy Whitcroft   update checkpatch...
2549
2550
  					WARN("braces {} are not necessary for any arm of this statement
  " . $herectx);
13214adf7   Andy Whitcroft   update checkpatch...
2551
2552
2553
  				}
  			}
  		}
773647a09   Andy Whitcroft   update checkpatch...
2554
  		if (!defined $suppress_ifbraces{$linenr - 1} &&
13214adf7   Andy Whitcroft   update checkpatch...
2555
  					$line =~ /\b(if|while|for|else)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
2556
2557
2558
2559
2560
2561
2562
2563
  			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...
2564
2565
2566
  
  			my ($level, $endln, @chunks) =
  				ctx_statement_full($linenr, $realcnt, $-[0]);
cf655043d   Andy Whitcroft   update checkpatch...
2567
2568
  			# Check the condition.
  			my ($cond, $block) = @{$chunks[0]};
773647a09   Andy Whitcroft   update checkpatch...
2569
2570
  			#print "CHECKING<$linenr> cond<$cond> block<$block>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
2571
  			if (defined $cond) {
773647a09   Andy Whitcroft   update checkpatch...
2572
  				substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
  			}
  			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...
2593
  					substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
  				}
  				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...
2604
  				my $cnt = statement_rawlines($block);
cf655043d   Andy Whitcroft   update checkpatch...
2605

f055663c5   Andy Whitcroft   checkpatch: repor...
2606
2607
2608
  				for (my $n = 0; $n < $cnt; $n++) {
  					$herectx .= raw_line($linenr, $n) . "
  ";;
f0a594c1c   Andy Whitcroft   update checkpatch...
2609
  				}
cf655043d   Andy Whitcroft   update checkpatch...
2610
2611
2612
  
  				WARN("braces {} are not necessary for single statement blocks
  " . $herectx);
f0a594c1c   Andy Whitcroft   update checkpatch...
2613
2614
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2615
  # don't include deprecated include files (uses RAW line)
4a0df2ef4   Andy Whitcroft   update checkpatch...
2616
  		for my $inc (@dep_includes) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2617
  			if ($rawline =~ m@^.\s*\#\s*include\s*\<$inc>@) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2618
2619
  				ERROR("Don't use <$inc>: see Documentation/feature-removal-schedule.txt
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2620
2621
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2622
2623
  # don't use deprecated functions
  		for my $func (@dep_functions) {
00df344fd   Andy Whitcroft   update checkpatch...
2624
  			if ($line =~ /\b$func\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2625
2626
  				ERROR("Don't use $func(): see Documentation/feature-removal-schedule.txt
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2627
2628
2629
2630
  			}
  		}
  
  # no volatiles please
6c72ffaab   Andy Whitcroft   update checkpatch...
2631
2632
  		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
  		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2633
2634
  			WARN("Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2635
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2636
2637
2638
2639
2640
  # 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...
2641
  # warn about #if 0
c45dcabd2   Andy Whitcroft   update checkpatch...
2642
  		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2643
2644
2645
  			CHK("if this code is redundant consider removing it
  " .
  				$herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2646
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2647
2648
2649
2650
  # check for needless kfree() checks
  		if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
  			my $expr = $1;
  			if ($line =~ /\bkfree\(\Q$expr\E\);/) {
3c232147a   Wolfram Sang   checkpatch: corre...
2651
2652
  				WARN("kfree(NULL) is safe this check is probably not required
  " . $hereprev);
f0a594c1c   Andy Whitcroft   update checkpatch...
2653
2654
  			}
  		}
4c432a8f0   Greg Kroah-Hartman   checkpatch: usb_f...
2655
2656
2657
2658
2659
2660
2661
2662
  # 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...
2663

00df344fd   Andy Whitcroft   update checkpatch...
2664
  # warn about #ifdefs in C files
c45dcabd2   Andy Whitcroft   update checkpatch...
2665
  #		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344fd   Andy Whitcroft   update checkpatch...
2666
2667
2668
2669
2670
  #			print "#ifdef in C files should be avoided
  ";
  #			print "$herecurr";
  #			$clean = 0;
  #		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2671
  # warn about spacing in #ifdefs
c45dcabd2   Andy Whitcroft   update checkpatch...
2672
  		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
22f2a2ef9   Andy Whitcroft   update checkpatch...
2673
2674
2675
  			ERROR("exactly one space required after that #$1
  " . $herecurr);
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2676
  # check for spinlock_t definitions without a comment.
171ae1a49   Andy Whitcroft   update checkpatch...
2677
2678
  		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
  		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2679
2680
  			my $which = $1;
  			if (!ctx_has_comment($first_line, $linenr)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2681
2682
  				CHK("$1 definition without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2683
2684
2685
2686
2687
  			}
  		}
  # 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...
2688
2689
  				CHK("memory barrier without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2690
2691
2692
  			}
  		}
  # check of hardware specific defines
c45dcabd2   Andy Whitcroft   update checkpatch...
2693
  		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2694
2695
  			CHK("architecture specific defines should be avoided
  " .  $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2696
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2697

de7d4f0e1   Andy Whitcroft   update checkpatch...
2698
2699
  # check the location of the inline attribute, that it is between
  # storage class and type.
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2700
2701
  		if ($line =~ /\b$Type\s+$Inline\b/ ||
  		    $line =~ /\b$Inline\s+$Storage\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2702
2703
2704
  			ERROR("inline keyword should sit between storage class and type
  " . $herecurr);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
2705
2706
2707
2708
2709
  # Check for __inline__ and __inline, prefer inline
  		if ($line =~ /\b(__inline__|__inline)\b/) {
  			WARN("plain inline is preferred over $1
  " . $herecurr);
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
2710
  # check for new externs in .c files.
171ae1a49   Andy Whitcroft   update checkpatch...
2711
  		if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2712
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a49   Andy Whitcroft   update checkpatch...
2713
  		{
c45dcabd2   Andy Whitcroft   update checkpatch...
2714
2715
  			my $function_name = $1;
  			my $paren_space = $2;
171ae1a49   Andy Whitcroft   update checkpatch...
2716
2717
2718
2719
2720
  
  			my $s = $stat;
  			if (defined $cond) {
  				substr($s, 0, length($cond), '');
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
2721
2722
2723
  			if ($s =~ /^\s*;/ &&
  			    $function_name ne 'uninitialized_var')
  			{
171ae1a49   Andy Whitcroft   update checkpatch...
2724
2725
2726
2727
2728
2729
2730
2731
2732
  				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...
2733
2734
2735
2736
2737
2738
  
  		} elsif ($realfile =~ /\.c$/ && defined $stat &&
  		    $stat =~ /^.\s*extern\s+/)
  		{
  			WARN("externs should be avoided in .c files
  " .  $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
  		}
  
  # 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...
2749
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2750
2751
2752
2753
2754
2755
  
  # 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...
2756
2757
2758
2759
2760
2761
  
  # check for gcc specific __FUNCTION__
  		if ($line =~ /__FUNCTION__/) {
  			WARN("__func__ should be used instead of gcc specific __FUNCTION__
  "  . $herecurr);
  		}
773647a09   Andy Whitcroft   update checkpatch...
2762
2763
  
  # check for semaphores used as mutexes
171ae1a49   Andy Whitcroft   update checkpatch...
2764
  		if ($line =~ /^.\s*(DECLARE_MUTEX|init_MUTEX)\s*\(/) {
773647a09   Andy Whitcroft   update checkpatch...
2765
2766
2767
2768
  			WARN("mutexes are preferred for single holder semaphores
  " . $herecurr);
  		}
  # check for semaphores used as mutexes
171ae1a49   Andy Whitcroft   update checkpatch...
2769
  		if ($line =~ /^.\s*init_MUTEX_LOCKED\s*\(/) {
773647a09   Andy Whitcroft   update checkpatch...
2770
2771
2772
2773
2774
2775
2776
2777
  			WARN("consider using a completion
  " . $herecurr);
  		}
  # 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...
2778
2779
2780
2781
2782
  # check for __initcall(), use device_initcall() explicitly please
  		if ($line =~ /^.\s*__initcall\s*\(/) {
  			WARN("please use device_initcall() instead of __initcall()
  " . $herecurr);
  		}
2b6db5cb6   Andy Whitcroft   checkpatch: struc...
2783
  # check for struct file_operations, ensure they are const.
6903ffb22   Andy Whitcroft   checkpatch: struc...
2784
2785
2786
2787
2788
  		if ($line !~ /\bconst\b/ &&
  		    $line =~ /\bstruct\s+(file_operations|seq_operations)\b/) {
  			WARN("struct $1 should normally be const
  " .
  				$herecurr);
2b6db5cb6   Andy Whitcroft   checkpatch: struc...
2789
  		}
773647a09   Andy Whitcroft   update checkpatch...
2790
2791
2792
2793
  
  # 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...
2794
2795
  		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
  		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a49   Andy Whitcroft   update checkpatch...
2796
2797
2798
  		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a09   Andy Whitcroft   update checkpatch...
2799
2800
2801
2802
  		{
  			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...
2803
2804
2805
2806
2807
  
  # 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...
2808
  			$string =~ s/%%/__/g;
9c9ba34ee   Andy Whitcroft   update checkpatch...
2809
2810
2811
2812
2813
2814
  			if ($string =~ /(?<!%)%L[udi]/) {
  				WARN("\%Ld/%Lu are not-standard C, use %lld/%llu
  " . $herecurr);
  				last;
  			}
  		}
691d77b6b   Andy Whitcroft   checkpatch: add c...
2815
2816
2817
2818
2819
2820
  
  # 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 ...
2821
  			} elsif ($realfile !~ m@^kernel/@) {
691d77b6b   Andy Whitcroft   checkpatch: add c...
2822
2823
2824
2825
  				WARN("use of in_atomic() is incorrect outside core kernel code
  " . $herecurr);
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2826
2827
2828
2829
2830
2831
  	}
  
  	# 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...
2832
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
  	# 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...
2846
2847
  		ERROR("Does not appear to be a unified-diff format patch
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
2848
2849
  	}
  	if ($is_patch && $chk_signoff && $signoff == 0) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2850
2851
  		ERROR("Missing Signed-off-by: line(s)
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
2852
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
2853
  	print report_dump();
13214adf7   Andy Whitcroft   update checkpatch...
2854
2855
  	if ($summary && !($clean == 1 && $quiet == 1)) {
  		print "$filename " if ($summary_file);
8905a67c6   Andy Whitcroft   update checkpatch...
2856
2857
2858
2859
2860
2861
  		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...
2862
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
2863

0a920b5b6   Andy Whitcroft   add a trivial pat...
2864
  	if ($clean == 1 && $quiet == 0) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2865
2866
  		print "$vname has no obvious style problems and is ready for submission.
  "
0a920b5b6   Andy Whitcroft   add a trivial pat...
2867
2868
  	}
  	if ($clean == 0 && $quiet == 0) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2869
2870
  		print "$vname has style problems, please review.  If any of these errors
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2871
2872
2873
2874
2875
  		print "are false positives report them to the maintainer, see
  ";
  		print "CHECKPATCH in MAINTAINERS.
  ";
  	}
13214adf7   Andy Whitcroft   update checkpatch...
2876

0a920b5b6   Andy Whitcroft   add a trivial pat...
2877
2878
  	return $clean;
  }