Blame view

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

267ad8f42   Andy Whitcroft   checkpatch: versi...
13
  my $V = '0.31';
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
  }
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
103
  my $rpt_cleaners = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
104
105
106
107
  if ($terse) {
  	$emacs = 1;
  	$quiet++;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  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...
128
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
129
  my $emitted_corrupt = 0;
2ceb532b0   Andy Whitcroft   checkpatch: fix f...
130
131
132
133
  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...
134
135
136
137
138
139
140
141
  our $Storage	= qr{extern|static|asmlinkage};
  our $Sparse	= qr{
  			__user|
  			__kernel|
  			__force|
  			__iomem|
  			__must_check|
  			__init_refok|
417495eda   Andy Whitcroft   checkpatch: add _...
142
143
  			__kprobes|
  			__ref
6c72ffaab   Andy Whitcroft   update checkpatch...
144
  		}x;
52131292c   Wolfram Sang   checkpatch: fix f...
145
146
147
  
  # Notes to $Attribute:
  # We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
6c72ffaab   Andy Whitcroft   update checkpatch...
148
149
  our $Attribute	= qr{
  			const|
03f1df7da   Joe Perches   checkpatch: Add a...
150
151
152
153
154
155
156
157
158
159
160
161
162
163
  			__percpu|
  			__nocast|
  			__safe|
  			__bitwise__|
  			__packed__|
  			__packed2__|
  			__naked|
  			__maybe_unused|
  			__always_unused|
  			__noreturn|
  			__used|
  			__cold|
  			__noclone|
  			__deprecated|
6c72ffaab   Andy Whitcroft   update checkpatch...
164
165
  			__read_mostly|
  			__kprobes|
52131292c   Wolfram Sang   checkpatch: fix f...
166
  			__(?:mem|cpu|dev|)(?:initdata|initconst|init\b)|
24e1d81ac   Andy Whitcroft   checkpatch: ____c...
167
168
  			____cacheline_aligned|
  			____cacheline_aligned_in_smp|
5fe3af119   Andy Whitcroft   checkpatch: __wea...
169
170
  			____cacheline_internodealigned_in_smp|
  			__weak
6c72ffaab   Andy Whitcroft   update checkpatch...
171
  		  }x;
c45dcabd2   Andy Whitcroft   update checkpatch...
172
  our $Modifier;
6c72ffaab   Andy Whitcroft   update checkpatch...
173
  our $Inline	= qr{inline|__always_inline|noinline};
6c72ffaab   Andy Whitcroft   update checkpatch...
174
175
176
177
178
  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...
179
  our $Compare    = qr{<=|>=|==|!=|<|>};
6c72ffaab   Andy Whitcroft   update checkpatch...
180
181
182
  our $Operators	= qr{
  			<=|>=|==|!=|
  			=>|->|<<|>>|<|>|!|~|
c2fdda0df   Andy Whitcroft   update checkpatch...
183
  			&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%
6c72ffaab   Andy Whitcroft   update checkpatch...
184
  		  }x;
8905a67c6   Andy Whitcroft   update checkpatch...
185
186
187
  our $NonptrType;
  our $Type;
  our $Declare;
171ae1a49   Andy Whitcroft   update checkpatch...
188
189
190
191
192
193
194
195
196
197
  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 ...
198
  our $typeTypedefs = qr{(?x:
fb9e9096b   Andy Whitcroft   checkpatch: limit...
199
  	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
200
201
  	atomic_t
  )};
691e669ba   Joe Perches   checkpatch.pl: al...
202
203
204
  our $logFunctions = qr{(?x:
  	printk|
  	pr_(debug|dbg|vdbg|devel|info|warning|err|notice|alert|crit|emerg|cont)|
8bbea968f   Joe Perches   checkpatch: add m...
205
  	(dev|netdev|netif)_(printk|dbg|vdbg|info|warn|err|notice|alert|crit|emerg|WARN)|
691e669ba   Joe Perches   checkpatch.pl: al...
206
207
208
  	WARN|
  	panic
  )};
8905a67c6   Andy Whitcroft   update checkpatch...
209
210
  our @typeList = (
  	qr{void},
c45dcabd2   Andy Whitcroft   update checkpatch...
211
212
213
214
215
216
217
  	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...
218
219
220
221
  	qr{unsigned},
  	qr{float},
  	qr{double},
  	qr{bool},
8905a67c6   Andy Whitcroft   update checkpatch...
222
223
224
225
226
227
228
  	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...
229
230
231
  our @modifierList = (
  	qr{fastcall},
  );
8905a67c6   Andy Whitcroft   update checkpatch...
232

7840a94cd   Wolfram Sang   checkpatch: refac...
233
234
235
236
237
  our $allowed_asm_includes = qr{(?x:
  	irq|
  	memory
  )};
  # memory.h: ARM has a custom one
8905a67c6   Andy Whitcroft   update checkpatch...
238
  sub build_types {
d2172eb5b   Andy Whitcroft   checkpatch: possi...
239
240
241
242
243
244
245
246
  	my $mods = "(?x:  
  " . join("|
    ", @modifierList) . "
  )";
  	my $all = "(?x:  
  " . join("|
    ", @typeList) . "
  )";
c8cb2ca37   Andy Whitcroft   checkpatch: types...
247
  	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
8905a67c6   Andy Whitcroft   update checkpatch...
248
  	$NonptrType	= qr{
d2172eb5b   Andy Whitcroft   checkpatch: possi...
249
  			(?:$Modifier\s+|const\s+)*
cf655043d   Andy Whitcroft   update checkpatch...
250
  			(?:
c45dcabd2   Andy Whitcroft   update checkpatch...
251
  				(?:typeof|__typeof__)\s*\(\s*\**\s*$Ident\s*\)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
252
  				(?:$typeTypedefs\b)|
c45dcabd2   Andy Whitcroft   update checkpatch...
253
  				(?:${all}\b)
cf655043d   Andy Whitcroft   update checkpatch...
254
  			)
c8cb2ca37   Andy Whitcroft   checkpatch: types...
255
  			(?:\s+$Modifier|\s+const)*
8905a67c6   Andy Whitcroft   update checkpatch...
256
257
  		  }x;
  	$Type	= qr{
c45dcabd2   Andy Whitcroft   update checkpatch...
258
  			$NonptrType
65863862b   Andy Whitcroft   checkpatch: dissa...
259
  			(?:[\s\*]+\s*const|[\s\*]+|(?:\s*\[\s*\])+)?
c8cb2ca37   Andy Whitcroft   checkpatch: types...
260
  			(?:\s+$Inline|\s+$Modifier)*
8905a67c6   Andy Whitcroft   update checkpatch...
261
262
263
264
  		  }x;
  	$Declare	= qr{(?:$Storage\s+)?$Type};
  }
  build_types();
6c72ffaab   Andy Whitcroft   update checkpatch...
265
266
  
  $chk_signoff = 0 if ($file);
4a0df2ef4   Andy Whitcroft   update checkpatch...
267
268
  my @dep_includes = ();
  my @dep_functions = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
269
270
  my $removal = "Documentation/feature-removal-schedule.txt";
  if ($tree && -f "$root/$removal") {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
271
  	open(my $REMOVE, '<', "$root/$removal") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
272
273
  				die "$P: $removal: open failed - $!
  ";
21caa13c0   Andy Whitcroft   checkpatch: fix t...
274
  	while (<$REMOVE>) {
f0a594c1c   Andy Whitcroft   update checkpatch...
275
276
277
  		if (/^Check:\s+(.*\S)/) {
  			for my $entry (split(/[, ]+/, $1)) {
  				if ($entry =~ m@include/(.*)@) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
278
  					push(@dep_includes, $1);
4a0df2ef4   Andy Whitcroft   update checkpatch...
279

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

4a0df2ef4   Andy Whitcroft   update checkpatch...
365
366
367
368
369
370
371
372
373
374
375
376
  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...
377
378
379
380
381
382
383
384
385
386
387
  my $sanitise_quote = '';
  
  sub sanitise_line_reset {
  	my ($in_comment) = @_;
  
  	if ($in_comment) {
  		$sanitise_quote = '*/';
  	} else {
  		$sanitise_quote = '';
  	}
  }
00df344fd   Andy Whitcroft   update checkpatch...
388
389
390
391
392
  sub sanitise_line {
  	my ($line) = @_;
  
  	my $res = '';
  	my $l = '';
c2fdda0df   Andy Whitcroft   update checkpatch...
393
  	my $qlen = 0;
773647a09   Andy Whitcroft   update checkpatch...
394
395
  	my $off = 0;
  	my $c;
00df344fd   Andy Whitcroft   update checkpatch...
396

773647a09   Andy Whitcroft   update checkpatch...
397
398
399
400
401
402
403
404
405
406
407
408
409
410
  	# 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...
411
  		}
81bc0e020   Andy Whitcroft   checkpatch: handl...
412
  		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
773647a09   Andy Whitcroft   update checkpatch...
413
414
415
416
  			$sanitise_quote = '';
  			substr($res, $off, 2, "$;$;");
  			$off++;
  			next;
c2fdda0df   Andy Whitcroft   update checkpatch...
417
  		}
113f04a83   Daniel Walker   checkpatch: handl...
418
419
420
421
422
423
424
  		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
  			$sanitise_quote = '//';
  
  			substr($res, $off, 2, $sanitise_quote);
  			$off++;
  			next;
  		}
773647a09   Andy Whitcroft   update checkpatch...
425
426
427
428
429
430
431
  
  		# 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...
432
  		}
773647a09   Andy Whitcroft   update checkpatch...
433
434
435
436
  		# Regular quotes.
  		if ($c eq "'" || $c eq '"') {
  			if ($sanitise_quote eq '') {
  				$sanitise_quote = $c;
00df344fd   Andy Whitcroft   update checkpatch...
437

773647a09   Andy Whitcroft   update checkpatch...
438
439
440
441
442
443
  				substr($res, $off, 1, $c);
  				next;
  			} elsif ($sanitise_quote eq $c) {
  				$sanitise_quote = '';
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
444

fae17daed   Andy Whitcroft   checkpatch: comme...
445
446
  		#print "c<$c> SQ<$sanitise_quote>
  ";
773647a09   Andy Whitcroft   update checkpatch...
447
448
  		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
  			substr($res, $off, 1, $;);
113f04a83   Daniel Walker   checkpatch: handl...
449
450
  		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
  			substr($res, $off, 1, $;);
773647a09   Andy Whitcroft   update checkpatch...
451
452
453
454
455
  		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
  			substr($res, $off, 1, 'X');
  		} else {
  			substr($res, $off, 1, $c);
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
456
  	}
113f04a83   Daniel Walker   checkpatch: handl...
457
458
459
  	if ($sanitise_quote eq '//') {
  		$sanitise_quote = '';
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
460
  	# The pathname on a #include may be surrounded by '<' and '>'.
c45dcabd2   Andy Whitcroft   update checkpatch...
461
  	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
462
463
464
465
  		my $clean = 'X' x length($1);
  		$res =~ s@\<.*\>@<$clean>@;
  
  	# The whole of a #error is a string.
c45dcabd2   Andy Whitcroft   update checkpatch...
466
  	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
467
  		my $clean = 'X' x length($1);
c45dcabd2   Andy Whitcroft   update checkpatch...
468
  		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
c2fdda0df   Andy Whitcroft   update checkpatch...
469
  	}
00df344fd   Andy Whitcroft   update checkpatch...
470
471
  	return $res;
  }
8905a67c6   Andy Whitcroft   update checkpatch...
472
473
474
475
476
477
  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...
478
  	my $coff_set = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
479

13214adf7   Andy Whitcroft   update checkpatch...
480
  	my $loff = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
481
482
  	my $type = '';
  	my $level = 0;
a27506459   Andy Whitcroft   checkpatch: handl...
483
  	my @stack = ();
cf655043d   Andy Whitcroft   update checkpatch...
484
  	my $p;
8905a67c6   Andy Whitcroft   update checkpatch...
485
486
  	my $c;
  	my $len = 0;
13214adf7   Andy Whitcroft   update checkpatch...
487
488
  
  	my $remainder;
8905a67c6   Andy Whitcroft   update checkpatch...
489
  	while (1) {
a27506459   Andy Whitcroft   checkpatch: handl...
490
  		@stack = (['', 0]) if ($#stack == -1);
773647a09   Andy Whitcroft   update checkpatch...
491
492
  		#warn "CSB: blk<$blk> remain<$remain>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
493
494
495
496
  		# 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...
497
  				last if (!defined $lines[$line]);
c2fdda0df   Andy Whitcroft   update checkpatch...
498
  				next if ($lines[$line] =~ /^-/);
8905a67c6   Andy Whitcroft   update checkpatch...
499
  				$remain--;
13214adf7   Andy Whitcroft   update checkpatch...
500
  				$loff = $len;
c2fdda0df   Andy Whitcroft   update checkpatch...
501
502
  				$blk .= $lines[$line] . "
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
503
504
505
506
507
508
509
  				$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...
510
  			if ($off >= $len) {
8905a67c6   Andy Whitcroft   update checkpatch...
511
512
513
  				last;
  			}
  		}
cf655043d   Andy Whitcroft   update checkpatch...
514
  		$p = $c;
8905a67c6   Andy Whitcroft   update checkpatch...
515
  		$c = substr($blk, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
516
  		$remainder = substr($blk, $off);
8905a67c6   Andy Whitcroft   update checkpatch...
517

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

f0a594c1c   Andy Whitcroft   update checkpatch...
709
710
711
712
713
714
715
  			if ($c eq $close && $level > 0) {
  				$level--;
  				last if ($level == 0);
  			} elsif ($c eq $open) {
  				$level++;
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
716

f0a594c1c   Andy Whitcroft   update checkpatch...
717
  		if (!$outer || $level <= 1) {
00df344fd   Andy Whitcroft   update checkpatch...
718
  			push(@res, $rawlines[$line]);
4a0df2ef4   Andy Whitcroft   update checkpatch...
719
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
720
  		last if ($level == 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
721
  	}
f0a594c1c   Andy Whitcroft   update checkpatch...
722
  	return ($level, @res);
4a0df2ef4   Andy Whitcroft   update checkpatch...
723
724
725
  }
  sub ctx_block_outer {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
726
727
  	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
  	return @r;
4a0df2ef4   Andy Whitcroft   update checkpatch...
728
729
730
  }
  sub ctx_block {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
731
732
  	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
  	return @r;
653d4876b   Andy Whitcroft   update checkpatch...
733
734
  }
  sub ctx_statement {
f0a594c1c   Andy Whitcroft   update checkpatch...
735
736
737
738
739
740
  	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...
741
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
742
  	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
743
  }
9c0ca6f9a   Andy Whitcroft   update checkpatch...
744
745
746
747
748
  sub ctx_statement_level {
  	my ($linenr, $remain, $off) = @_;
  
  	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
749
750
751
752
753
  
  sub ctx_locate_comment {
  	my ($first_line, $end_line) = @_;
  
  	# Catch a comment on the end of the line itself.
beae63324   Andy Whitcroft   checkpatch: comme...
754
  	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
4a0df2ef4   Andy Whitcroft   update checkpatch...
755
756
757
758
759
760
761
  	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...
762
763
764
  		my $line = $rawlines[$linenr - 1];
  		#warn "           $line
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
  		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...
787
788
  	##print "LINE: $rawlines[$end_line - 1 ]
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
789
790
791
792
793
  	##print "CMMT: $cmt
  ";
  
  	return ($cmt ne '');
  }
4d001e4d8   Andy Whitcroft   checkpatch: repor...
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
  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...
809
810
811
  sub cat_vet {
  	my ($vet) = @_;
  	my ($res, $coded);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
812

6c72ffaab   Andy Whitcroft   update checkpatch...
813
814
815
816
817
818
  	$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...
819
820
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
821
  	$res =~ s/$/\$/;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
822

6c72ffaab   Andy Whitcroft   update checkpatch...
823
  	return $res;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
824
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
825
  my $av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
826
  my $av_pending;
c2fdda0df   Andy Whitcroft   update checkpatch...
827
  my @av_paren_type;
1f65f947a   Andy Whitcroft   checkpatch: add c...
828
  my $av_pend_colon;
c2fdda0df   Andy Whitcroft   update checkpatch...
829
830
831
  
  sub annotate_reset {
  	$av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
832
833
  	$av_pending = '_';
  	@av_paren_type = ('E');
1f65f947a   Andy Whitcroft   checkpatch: add c...
834
  	$av_pend_colon = 'O';
c2fdda0df   Andy Whitcroft   update checkpatch...
835
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
836
837
  sub annotate_values {
  	my ($stream, $type) = @_;
0a920b5b6   Andy Whitcroft   add a trivial pat...
838

6c72ffaab   Andy Whitcroft   update checkpatch...
839
  	my $res;
1f65f947a   Andy Whitcroft   checkpatch: add c...
840
  	my $var = '_' x length($stream);
6c72ffaab   Andy Whitcroft   update checkpatch...
841
  	my $cur = $stream;
c2fdda0df   Andy Whitcroft   update checkpatch...
842
843
  	print "$stream
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
844

6c72ffaab   Andy Whitcroft   update checkpatch...
845
  	while (length($cur)) {
773647a09   Andy Whitcroft   update checkpatch...
846
  		@av_paren_type = ('E') if ($#av_paren_type < 0);
cf655043d   Andy Whitcroft   update checkpatch...
847
  		print " <" . join('', @av_paren_type) .
171ae1a49   Andy Whitcroft   update checkpatch...
848
  				"> <$type> <$av_pending>" if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
849
  		if ($cur =~ /^(\s+)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
850
851
852
853
  			print "WS($1)
  " if ($dbg_values > 1);
  			if ($1 =~ /
  / && $av_preprocessor) {
cf655043d   Andy Whitcroft   update checkpatch...
854
  				$type = pop(@av_paren_type);
c2fdda0df   Andy Whitcroft   update checkpatch...
855
  				$av_preprocessor = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
856
  			}
c023e4734   Florian Mickler   checkpatch.pl: fi...
857
  		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
9446ef569   Andy Whitcroft   checkpatch: handl...
858
859
860
861
  			print "CAST($1)
  " if ($dbg_values > 1);
  			push(@av_paren_type, $type);
  			$type = 'C';
e91b6e263   Andy Whitcroft   checkpatch: types...
862
  		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
863
864
  			print "DECLARE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
865
  			$type = 'T';
389a2fe57   Andy Whitcroft   checkpatch: allow...
866
867
868
869
  		} elsif ($cur =~ /^($Modifier)\s*/) {
  			print "MODIFIER($1)
  " if ($dbg_values > 1);
  			$type = 'T';
c45dcabd2   Andy Whitcroft   update checkpatch...
870
  		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
871
872
  			print "DEFINE($1,$2)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
873
  			$av_preprocessor = 1;
171ae1a49   Andy Whitcroft   update checkpatch...
874
875
876
877
878
  			push(@av_paren_type, $type);
  			if ($2 ne '') {
  				$av_pending = 'N';
  			}
  			$type = 'E';
c45dcabd2   Andy Whitcroft   update checkpatch...
879
  		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
880
881
882
883
  			print "UNDEF($1)
  " if ($dbg_values > 1);
  			$av_preprocessor = 1;
  			push(@av_paren_type, $type);
6c72ffaab   Andy Whitcroft   update checkpatch...
884

c45dcabd2   Andy Whitcroft   update checkpatch...
885
  		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
886
887
  			print "PRE_START($1)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
888
  			$av_preprocessor = 1;
cf655043d   Andy Whitcroft   update checkpatch...
889
890
891
  
  			push(@av_paren_type, $type);
  			push(@av_paren_type, $type);
171ae1a49   Andy Whitcroft   update checkpatch...
892
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
893

c45dcabd2   Andy Whitcroft   update checkpatch...
894
  		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
895
896
897
898
899
  			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...
900
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
901

c45dcabd2   Andy Whitcroft   update checkpatch...
902
  		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
903
904
905
906
907
908
909
910
911
  			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...
912
  			$type = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
913
914
915
  
  		} elsif ($cur =~ /^(\\
  )/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
916
917
  			print "PRECONT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
918

171ae1a49   Andy Whitcroft   update checkpatch...
919
920
921
922
923
  		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
  			print "ATTR($1)
  " if ($dbg_values > 1);
  			$av_pending = $type;
  			$type = 'N';
6c72ffaab   Andy Whitcroft   update checkpatch...
924
  		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
925
926
  			print "SIZEOF($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
927
  			if (defined $2) {
cf655043d   Andy Whitcroft   update checkpatch...
928
  				$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
929
930
  			}
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
931
  		} elsif ($cur =~ /^(if|while|for)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
932
933
  			print "COND($1)
  " if ($dbg_values > 1);
14b111c15   Andy Whitcroft   checkpatch: condi...
934
  			$av_pending = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
935
  			$type = 'N';
1f65f947a   Andy Whitcroft   checkpatch: add c...
936
937
938
939
940
  		} elsif ($cur =~/^(case)/o) {
  			print "CASE($1)
  " if ($dbg_values > 1);
  			$av_pend_colon = 'C';
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
941
  		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
942
943
  			print "KEYWORD($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
944
945
946
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\()/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
947
948
  			print "PAREN('$1')
  " if ($dbg_values > 1);
cf655043d   Andy Whitcroft   update checkpatch...
949
950
  			push(@av_paren_type, $av_pending);
  			$av_pending = '_';
6c72ffaab   Andy Whitcroft   update checkpatch...
951
952
953
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
954
955
956
  			my $new_type = pop(@av_paren_type);
  			if ($new_type ne '_') {
  				$type = $new_type;
c2fdda0df   Andy Whitcroft   update checkpatch...
957
958
959
  				print "PAREN('$1') -> $type
  "
  							if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
960
  			} else {
c2fdda0df   Andy Whitcroft   update checkpatch...
961
962
  				print "PAREN('$1')
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
963
  			}
c8cb2ca37   Andy Whitcroft   checkpatch: types...
964
  		} elsif ($cur =~ /^($Ident)\s*\(/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
965
966
  			print "FUNC($1)
  " if ($dbg_values > 1);
c8cb2ca37   Andy Whitcroft   checkpatch: types...
967
  			$type = 'V';
cf655043d   Andy Whitcroft   update checkpatch...
968
  			$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
969

8e761b04a   Andy Whitcroft   checkpatch: detec...
970
971
  		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
  			if (defined $2 && $type eq 'C' || $type eq 'T') {
1f65f947a   Andy Whitcroft   checkpatch: add c...
972
  				$av_pend_colon = 'B';
8e761b04a   Andy Whitcroft   checkpatch: detec...
973
974
  			} elsif ($type eq 'E') {
  				$av_pend_colon = 'L';
1f65f947a   Andy Whitcroft   checkpatch: add c...
975
976
977
978
  			}
  			print "IDENT_COLON($1,$type>$av_pend_colon)
  " if ($dbg_values > 1);
  			$type = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
979
  		} elsif ($cur =~ /^($Ident|$Constant)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
980
981
  			print "IDENT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
982
983
984
  			$type = 'V';
  
  		} elsif ($cur =~ /^($Assignment)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
985
986
  			print "ASSIGN($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
987
  			$type = 'N';
cf655043d   Andy Whitcroft   update checkpatch...
988
  		} elsif ($cur =~/^(;|{|})/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
989
990
  			print "END($1)
  " if ($dbg_values > 1);
13214adf7   Andy Whitcroft   update checkpatch...
991
  			$type = 'E';
1f65f947a   Andy Whitcroft   checkpatch: add c...
992
  			$av_pend_colon = 'O';
8e761b04a   Andy Whitcroft   checkpatch: detec...
993
994
995
996
  		} elsif ($cur =~/^(,)/) {
  			print "COMMA($1)
  " if ($dbg_values > 1);
  			$type = 'C';
1f65f947a   Andy Whitcroft   checkpatch: add c...
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
  		} 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...
1013

8e761b04a   Andy Whitcroft   checkpatch: detec...
1014
  		} elsif ($cur =~ /^(\[)/o) {
13214adf7   Andy Whitcroft   update checkpatch...
1015
1016
  			print "CLOSE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1017
  			$type = 'N';
0d413866c   Andy Whitcroft   checkpatch: value...
1018
  		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
74048ed81   Andy Whitcroft   checkpatch: varia...
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
  			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...
1031
  		} elsif ($cur =~ /^($Operators)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1032
1033
  			print "OP($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1034
1035
1036
1037
1038
  			if ($1 ne '++' && $1 ne '--') {
  				$type = 'N';
  			}
  
  		} elsif ($cur =~ /(^.)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1039
1040
  			print "C($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1041
1042
1043
1044
1045
  		}
  		if (defined $1) {
  			$cur = substr($cur, length($1));
  			$res .= $type x length($1);
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1046
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1047

1f65f947a   Andy Whitcroft   checkpatch: add c...
1048
  	return ($res, $var);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1049
  }
8905a67c6   Andy Whitcroft   update checkpatch...
1050
  sub possible {
13214adf7   Andy Whitcroft   update checkpatch...
1051
  	my ($possible, $line) = @_;
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1052
  	my $notPermitted = qr{(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1053
1054
1055
1056
  		^(?:
  			$Modifier|
  			$Storage|
  			$Type|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1057
1058
1059
  			DEFINE_\S+
  		)$|
  		^(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1060
1061
1062
1063
1064
1065
  			goto|
  			return|
  			case|
  			else|
  			asm|__asm__|
  			do
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1066
  		)(?:\s|$)|
0776e5946   Andy Whitcroft   checkpatch: do is...
1067
  		^(?:typedef|struct|enum)\b
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1068
1069
1070
1071
  	    )}x;
  	warn "CHECK<$possible> ($line)
  " if ($dbg_possible > 2);
  	if ($possible !~ $notPermitted) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1072
1073
1074
1075
1076
1077
1078
  		# 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...
1079
  			for my $modifier (split(' ', $possible)) {
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1080
1081
1082
1083
1084
  				if ($modifier !~ $notPermitted) {
  					warn "MODIFIER: $modifier ($possible) ($line)
  " if ($dbg_possible);
  					push(@modifierList, $modifier);
  				}
d25065865   Andy Whitcroft   checkpatch: possi...
1085
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
1086
1087
1088
1089
1090
1091
  
  		} else {
  			warn "POSSIBLE: $possible ($line)
  " if ($dbg_possible);
  			push(@typeList, $possible);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1092
  		build_types();
0776e5946   Andy Whitcroft   checkpatch: do is...
1093
1094
1095
  	} else {
  		warn "NOTPOSS: $possible ($line)
  " if ($dbg_possible > 1);
8905a67c6   Andy Whitcroft   update checkpatch...
1096
1097
  	}
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1098
  my $prefix = '';
f0a594c1c   Andy Whitcroft   update checkpatch...
1099
  sub report {
773647a09   Andy Whitcroft   update checkpatch...
1100
1101
1102
  	if (defined $tst_only && $_[0] !~ /\Q$tst_only\E/) {
  		return 0;
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
1103
1104
1105
1106
1107
  	my $line = $prefix . $_[0];
  
  	$line = (split('
  ', $line))[0] . "
  " if ($terse);
13214adf7   Andy Whitcroft   update checkpatch...
1108
  	push(our @report, $line);
773647a09   Andy Whitcroft   update checkpatch...
1109
1110
  
  	return 1;
f0a594c1c   Andy Whitcroft   update checkpatch...
1111
1112
  }
  sub report_dump {
13214adf7   Andy Whitcroft   update checkpatch...
1113
  	our @report;
f0a594c1c   Andy Whitcroft   update checkpatch...
1114
  }
de7d4f0e1   Andy Whitcroft   update checkpatch...
1115
  sub ERROR {
773647a09   Andy Whitcroft   update checkpatch...
1116
1117
1118
1119
1120
  	if (report("ERROR: $_[0]
  ")) {
  		our $clean = 0;
  		our $cnt_error++;
  	}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1121
1122
  }
  sub WARN {
773647a09   Andy Whitcroft   update checkpatch...
1123
1124
1125
1126
1127
  	if (report("WARNING: $_[0]
  ")) {
  		our $clean = 0;
  		our $cnt_warn++;
  	}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1128
1129
  }
  sub CHK {
773647a09   Andy Whitcroft   update checkpatch...
1130
1131
  	if ($check && report("CHECK: $_[0]
  ")) {
6c72ffaab   Andy Whitcroft   update checkpatch...
1132
1133
1134
  		our $clean = 0;
  		our $cnt_chk++;
  	}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1135
  }
6ecd96744   Andy Whitcroft   checkpatch: repor...
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
  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...
1166
1167
  sub process {
  	my $filename = shift;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1168
1169
1170
  
  	my $linenr=0;
  	my $prevline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
1171
  	my $prevrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1172
  	my $stashline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
1173
  	my $stashrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1174

4a0df2ef4   Andy Whitcroft   update checkpatch...
1175
  	my $length;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1176
1177
1178
  	my $indent;
  	my $previndent=0;
  	my $stashindent=0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1179
  	our $clean = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1180
1181
  	my $signoff = 0;
  	my $is_patch = 0;
13214adf7   Andy Whitcroft   update checkpatch...
1182
  	our @report = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
1183
1184
1185
1186
  	our $cnt_lines = 0;
  	our $cnt_error = 0;
  	our $cnt_warn = 0;
  	our $cnt_chk = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1187
1188
1189
1190
1191
1192
  	# 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...
1193
  	my $comment_edge = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1194
  	my $first_line = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
1195
  	my $p1_prefix = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
1196

13214adf7   Andy Whitcroft   update checkpatch...
1197
1198
1199
  	my $prev_values = 'E';
  
  	# suppression flags
773647a09   Andy Whitcroft   update checkpatch...
1200
  	my %suppress_ifbraces;
170d3a226   Andy Whitcroft   checkpatch: handl...
1201
  	my %suppress_whiletrailers;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1202
  	my %suppress_export;
653d4876b   Andy Whitcroft   update checkpatch...
1203

c2fdda0df   Andy Whitcroft   update checkpatch...
1204
  	# Pre-scan the patch sanitizing the lines.
de7d4f0e1   Andy Whitcroft   update checkpatch...
1205
  	# Pre-scan the patch looking for any __setup documentation.
c2fdda0df   Andy Whitcroft   update checkpatch...
1206
  	#
de7d4f0e1   Andy Whitcroft   update checkpatch...
1207
1208
  	my @setup_docs = ();
  	my $setup_docs = 0;
773647a09   Andy Whitcroft   update checkpatch...
1209
1210
  
  	sanitise_line_reset();
c2fdda0df   Andy Whitcroft   update checkpatch...
1211
1212
  	my $line;
  	foreach my $rawline (@rawlines) {
773647a09   Andy Whitcroft   update checkpatch...
1213
1214
  		$linenr++;
  		$line = $rawline;
c2fdda0df   Andy Whitcroft   update checkpatch...
1215

773647a09   Andy Whitcroft   update checkpatch...
1216
  		if ($rawline=~/^\+\+\+\s+(\S+)/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1217
1218
1219
1220
  			$setup_docs = 0;
  			if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
  				$setup_docs = 1;
  			}
773647a09   Andy Whitcroft   update checkpatch...
1221
1222
1223
1224
1225
1226
1227
1228
1229
  			#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...
1230
  			$in_comment = 0;
773647a09   Andy Whitcroft   update checkpatch...
1231
1232
1233
1234
1235
1236
  
  			# 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...
1237
1238
1239
1240
1241
1242
1243
  			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...
1244
  				last if (!defined $rawlines[$ln - 1]);
fae17daed   Andy Whitcroft   checkpatch: comme...
1245
1246
1247
1248
1249
  				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
  				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
  					($edge) = $1;
  					last;
  				}
773647a09   Andy Whitcroft   update checkpatch...
1250
1251
1252
1253
1254
1255
1256
1257
1258
  			}
  			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...
1259
  			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
773647a09   Andy Whitcroft   update checkpatch...
1260
1261
1262
1263
1264
1265
1266
  			{
  				$in_comment = 1;
  			}
  
  			##print "COMMENT:$in_comment edge<$edge> $rawline
  ";
  			sanitise_line_reset($in_comment);
171ae1a49   Andy Whitcroft   update checkpatch...
1267
  		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
773647a09   Andy Whitcroft   update checkpatch...
1268
  			# Standardise the strings and chars within the input to
171ae1a49   Andy Whitcroft   update checkpatch...
1269
  			# simplify matching -- only bother with positive lines.
773647a09   Andy Whitcroft   update checkpatch...
1270
  			$line = sanitise_line($rawline);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1271
  		}
773647a09   Andy Whitcroft   update checkpatch...
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
  		push(@lines, $line);
  
  		if ($realcnt > 1) {
  			$realcnt-- if ($line =~ /^(?:\+| |$)/);
  		} else {
  			$realcnt = 0;
  		}
  
  		#print "==>$rawline
  ";
  		#print "-->$line
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
1284
1285
1286
1287
1288
  
  		if ($setup_docs && $line =~ /^\+/) {
  			push(@setup_docs, $line);
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
1289
  	$prefix = '';
773647a09   Andy Whitcroft   update checkpatch...
1290
1291
  	$realcnt = 0;
  	$linenr = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1292
1293
  	foreach my $line (@lines) {
  		$linenr++;
c2fdda0df   Andy Whitcroft   update checkpatch...
1294
  		my $rawline = $rawlines[$linenr - 1];
6c72ffaab   Andy Whitcroft   update checkpatch...
1295

0a920b5b6   Andy Whitcroft   add a trivial pat...
1296
  #extract the line range in the file after the patch is applied
6c72ffaab   Andy Whitcroft   update checkpatch...
1297
  		if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
1298
  			$is_patch = 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1299
  			$first_line = $linenr + 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1300
1301
1302
1303
1304
1305
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
1306
  			annotate_reset();
13214adf7   Andy Whitcroft   update checkpatch...
1307
  			$prev_values = 'E';
773647a09   Andy Whitcroft   update checkpatch...
1308
  			%suppress_ifbraces = ();
170d3a226   Andy Whitcroft   checkpatch: handl...
1309
  			%suppress_whiletrailers = ();
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1310
  			%suppress_export = ();
0a920b5b6   Andy Whitcroft   add a trivial pat...
1311
  			next;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1312

4a0df2ef4   Andy Whitcroft   update checkpatch...
1313
1314
1315
  # 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...
1316
  		} elsif ($line =~ /^( |\+|$)/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
1317
  			$realline++;
d8aaf1214   Andy Whitcroft   update checkpatch...
1318
  			$realcnt-- if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1319

4a0df2ef4   Andy Whitcroft   update checkpatch...
1320
  			# Measure the line length and indent.
c2fdda0df   Andy Whitcroft   update checkpatch...
1321
  			($length, $indent) = line_stats($rawline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1322
1323
1324
1325
  
  			# Track the previous line.
  			($prevline, $stashline) = ($stashline, $line);
  			($previndent, $stashindent) = ($stashindent, $indent);
c2fdda0df   Andy Whitcroft   update checkpatch...
1326
  			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
773647a09   Andy Whitcroft   update checkpatch...
1327
1328
  			#warn "line<$line>
  ";
6c72ffaab   Andy Whitcroft   update checkpatch...
1329

d8aaf1214   Andy Whitcroft   update checkpatch...
1330
1331
  		} elsif ($realcnt == 1) {
  			$realcnt--;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1332
  		}
cc77cdca5   Andy Whitcroft   checkpatch: corre...
1333
  		my $hunk_line = ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1334
  #make up the handle for any error we report on this line
773647a09   Andy Whitcroft   update checkpatch...
1335
1336
  		$prefix = "$filename:$realline: " if ($emacs && $file);
  		$prefix = "$filename:$linenr: " if ($emacs && !$file);
6c72ffaab   Andy Whitcroft   update checkpatch...
1337
1338
  		$here = "#$linenr: " if (!$file);
  		$here = "#$realline: " if ($file);
773647a09   Andy Whitcroft   update checkpatch...
1339
1340
  
  		# extract the filename as it passes
3bf9a009f   Rabin Vincent   checkpatch: check...
1341
1342
1343
1344
1345
  		if ($line =~ /^diff --git.*?(\S+)$/) {
  			$realfile = $1;
  			$realfile =~ s@^([^/]*)/@@;
  
  		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
773647a09   Andy Whitcroft   update checkpatch...
1346
  			$realfile = $1;
1e8557269   Wolfram Sang   checkpatch: Add w...
1347
1348
1349
  			$realfile =~ s@^([^/]*)/@@;
  
  			$p1_prefix = $1;
e2f7aa4b8   Andy Whitcroft   checkpatch: do no...
1350
1351
  			if (!$file && $tree && $p1_prefix ne '' &&
  			    -e "$root/$p1_prefix") {
1e8557269   Wolfram Sang   checkpatch: Add w...
1352
1353
1354
  				WARN("patch prefix '$p1_prefix' exists, appears to be a -p0 patch
  ");
  			}
773647a09   Andy Whitcroft   update checkpatch...
1355

c1ab33269   Andy Whitcroft   checkpatch: inclu...
1356
  			if ($realfile =~ m@^include/asm/@) {
773647a09   Andy Whitcroft   update checkpatch...
1357
1358
1359
1360
1361
1362
  				ERROR("do not modify files in include/asm, change architecture specific files in include/asm-<architecture>
  " . "$here$rawline
  ");
  			}
  			next;
  		}
389834b68   Randy Dunlap   checkpatch: produ...
1363
  		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1364

c2fdda0df   Andy Whitcroft   update checkpatch...
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
  		my $hereline = "$here
  $rawline
  ";
  		my $herecurr = "$here
  $rawline
  ";
  		my $hereprev = "$here
  $prevrawline
  $rawline
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1375

6c72ffaab   Andy Whitcroft   update checkpatch...
1376
  		$cnt_lines++ if ($realcnt != 0);
3bf9a009f   Rabin Vincent   checkpatch: check...
1377
1378
1379
1380
1381
1382
1383
1384
1385
  # Check for incorrect file permissions
  		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
  			my $permhere = $here . "FILE: $realfile
  ";
  			if ($realfile =~ /(Makefile|Kconfig|\.c|\.h|\.S|\.tmpl)$/) {
  				ERROR("do not set execute permissions for source files
  " . $permhere);
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1386
  #check the patch for a signoff:
d8aaf1214   Andy Whitcroft   update checkpatch...
1387
  		if ($line =~ /^\s*signed-off-by:/i) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
1388
1389
  			# This is a signoff, if ugly, so do not double report.
  			$signoff++;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1390
  			if (!($line =~ /^\s*Signed-off-by:/)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1391
1392
1393
  				WARN("Signed-off-by: is the preferred form
  " .
  					$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1394
1395
  			}
  			if ($line =~ /^\s*signed-off-by:\S/i) {
773647a09   Andy Whitcroft   update checkpatch...
1396
1397
  				WARN("space required after Signed-off-by:
  " .
de7d4f0e1   Andy Whitcroft   update checkpatch...
1398
  					$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1399
1400
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1401
  # Check for wrappage within a valid hunk of the file
8905a67c6   Andy Whitcroft   update checkpatch...
1402
  		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1403
1404
  			ERROR("patch seems to be corrupt (line wrapped?)
  " .
6c72ffaab   Andy Whitcroft   update checkpatch...
1405
  				$herecurr) if (!$emitted_corrupt++);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1406
  		}
6ecd96744   Andy Whitcroft   checkpatch: repor...
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
  # 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...
1420
1421
  # 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...
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
  		    $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...
1432
  		}
306708547   Andy Whitcroft   checkpatch: ensur...
1433
1434
  # ignore non-hunk lines and lines being removed
  		next if (!$hunk_line || $line =~ /^-/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1435

0a920b5b6   Andy Whitcroft   add a trivial pat...
1436
  #trailing whitespace
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1437
  		if ($line =~ /^\+.*\015/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1438
1439
1440
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1441
1442
  			ERROR("DOS line endings
  " . $herevet);
c2fdda0df   Andy Whitcroft   update checkpatch...
1443
1444
1445
1446
  		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
1447
1448
  			ERROR("trailing whitespace
  " . $herevet);
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
1449
  			$rpt_cleaners = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1450
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
1451

3354957a4   Andi Kleen   checkpatch: add c...
1452
  # check for Kconfig help text having a real description
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1453
1454
  # Only applies when adding the entry originally, after that we do not have
  # sufficient context to determine whether it is indeed long enough.
3354957a4   Andi Kleen   checkpatch: add c...
1455
  		if ($realfile =~ /Kconfig/ &&
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1456
  		    $line =~ /\+\s*(?:---)?help(?:---)?$/) {
3354957a4   Andi Kleen   checkpatch: add c...
1457
  			my $length = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
  			my $cnt = $realcnt;
  			my $ln = $linenr + 1;
  			my $f;
  			my $is_end = 0;
  			while ($cnt > 0 && defined $lines[$ln - 1]) {
  				$f = $lines[$ln - 1];
  				$cnt-- if ($lines[$ln - 1] !~ /^-/);
  				$is_end = $lines[$ln - 1] =~ /^\+/;
  				$ln++;
  
  				next if ($f =~ /^-/);
  				$f =~ s/^.//;
3354957a4   Andi Kleen   checkpatch: add c...
1470
1471
1472
  				$f =~ s/#.*//;
  				$f =~ s/^\s+//;
  				next if ($f =~ /^$/);
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1473
1474
1475
1476
  				if ($f =~ /^\s*config\s/) {
  					$is_end = 1;
  					last;
  				}
3354957a4   Andi Kleen   checkpatch: add c...
1477
1478
  				$length++;
  			}
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1479
1480
1481
1482
  			WARN("please write a paragraph that describes the config symbol fully
  " . $herecurr) if ($is_end && $length < 4);
  			#print "is_end<$is_end> length<$length>
  ";
3354957a4   Andi Kleen   checkpatch: add c...
1483
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
1484
1485
  # 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...
1486
  #80 column limit
c45dcabd2   Andy Whitcroft   update checkpatch...
1487
  		if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
f4c014c0d   Andy Whitcroft   checkpatch: allow...
1488
  		    $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
8bbea968f   Joe Perches   checkpatch: add m...
1489
1490
  		    !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:,|\)\s*;)\s*$/ ||
  		    $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
f4c014c0d   Andy Whitcroft   checkpatch: allow...
1491
  		    $length > 80)
c45dcabd2   Andy Whitcroft   update checkpatch...
1492
  		{
de7d4f0e1   Andy Whitcroft   update checkpatch...
1493
1494
  			WARN("line over 80 characters
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1495
  		}
5e79d96ee   Joe Perches   checkpatch: warn ...
1496
1497
1498
1499
1500
1501
  # check for spaces before a quoted newline
  		if ($rawline =~ /^.*\".*\s\
  /) {
  			WARN("unnecessary whitespace before a quoted newline
  " . $herecurr);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1502
1503
1504
1505
1506
  # 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...
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
  # 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...
1524
1525
  # 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...
1526
1527
1528
  
  # at the beginning of a line any tabs must come first and anything
  # more than 8 must use tabs.
c2fdda0df   Andy Whitcroft   update checkpatch...
1529
1530
1531
1532
1533
  		if ($rawline =~ /^\+\s* \t\s*\S/ ||
  		    $rawline =~ /^\+\s*        \s*/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
171ae1a49   Andy Whitcroft   update checkpatch...
1534
1535
  			ERROR("code indent should use tabs where possible
  " . $herevet);
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
1536
  			$rpt_cleaners = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1537
  		}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
1538
1539
1540
1541
1542
1543
1544
1545
  # check for space before tabs.
  		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
  			WARN("please, no space before tabs
  " . $herevet);
  		}
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
1546
  # check for spaces at the beginning of a line.
6b4c5bebc   Andy Whitcroft   checkpatch: fix r...
1547
1548
1549
1550
1551
  # Exceptions:
  #  1) within comments
  #  2) indented preprocessor commands
  #  3) hanging labels
  		if ($rawline =~ /^\+ / && $line !~ /\+ *(?:$;|#|$Ident:)/)  {
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
1552
1553
1554
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
6b4c5bebc   Andy Whitcroft   checkpatch: fix r...
1555
1556
  			WARN("please, no spaces at the start of a line
  " . $herevet);
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
1557
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
1558
1559
  # 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...
1560
  # check for RCS/CVS revision markers
cf655043d   Andy Whitcroft   update checkpatch...
1561
  		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1562
1563
1564
  			WARN("CVS style keyword markers, these will _not_ be updated
  ". $herecurr);
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
1565

42e41c54d   Mike Frysinger   checkpatch: add s...
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
  # 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...
1581
  # Check for potential 'bare' types
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1582
1583
  		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
  		    $realline_next);
9c9ba34ee   Andy Whitcroft   update checkpatch...
1584
  		if ($realcnt && $line =~ /.\s*\S/) {
170d3a226   Andy Whitcroft   checkpatch: handl...
1585
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
1586
  				ctx_statement_block($linenr, $realcnt, 0);
171ae1a49   Andy Whitcroft   update checkpatch...
1587
1588
1589
1590
1591
1592
  			$stat =~ s/
  ./
   /g;
  			$cond =~ s/
  ./
   /g;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1593
1594
1595
1596
1597
1598
1599
  			# 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...
1600
1601
  			my $s = $stat;
  			$s =~ s/{.*$//s;
cf655043d   Andy Whitcroft   update checkpatch...
1602

c2fdda0df   Andy Whitcroft   update checkpatch...
1603
  			# Ignore goto labels.
171ae1a49   Andy Whitcroft   update checkpatch...
1604
  			if ($s =~ /$Ident:\*$/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1605
1606
  
  			# Ignore functions being called
171ae1a49   Andy Whitcroft   update checkpatch...
1607
  			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1608

463f28648   Andy Whitcroft   checkpatch: possi...
1609
  			} elsif ($s =~ /^.\s*else\b/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1610
  			# declarations always start with types
d25065865   Andy Whitcroft   checkpatch: possi...
1611
  			} 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...
1612
1613
1614
  				my $type = $1;
  				$type =~ s/\s+/ /g;
  				possible($type, "A:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1615
  			# definitions in global scope can only start with types
a6a840628   Andy Whitcroft   checkpatch: label...
1616
  			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1617
  				possible($1, "B:" . $s);
c2fdda0df   Andy Whitcroft   update checkpatch...
1618
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1619
1620
  
  			# any (foo ... *) is a pointer cast, and foo is a type
65863862b   Andy Whitcroft   checkpatch: dissa...
1621
  			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1622
  				possible($1, "C:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1623
1624
1625
1626
1627
  			}
  
  			# Check for any sort of function declaration.
  			# int foo(something bar, other baz);
  			# void (*store_gdt)(x86_descr_ptr *);
171ae1a49   Andy Whitcroft   update checkpatch...
1628
  			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...
1629
  				my ($name_len) = length($1);
8905a67c6   Andy Whitcroft   update checkpatch...
1630

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

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

c45dcabd2   Andy Whitcroft   update checkpatch...
1638
  						possible($1, "D:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1639
1640
  					}
  				}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1641
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1642

9c0ca6f9a   Andy Whitcroft   update checkpatch...
1643
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1644
1645
1646
  #
  # Checks which may be anchored in the context.
  #
00df344fd   Andy Whitcroft   update checkpatch...
1647

653d4876b   Andy Whitcroft   update checkpatch...
1648
1649
  # Check for switch () and associated case and default
  # statements should be at the same indent.
00df344fd   Andy Whitcroft   update checkpatch...
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
  		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...
1668
1669
  				ERROR("switch and case should be at the same indent
  $hereline$err");
de7d4f0e1   Andy Whitcroft   update checkpatch...
1670
1671
1672
1673
1674
  			}
  		}
  
  # 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...
1675
  		if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
773647a09   Andy Whitcroft   update checkpatch...
1676
  			my $pre_ctx = "$1$2";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1677
  			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1678
1679
1680
  			my $ctx_cnt = $realcnt - $#ctx - 1;
  			my $ctx = join("
  ", @ctx);
548596d52   Andy Whitcroft   checkpatch: trail...
1681
1682
  			my $ctx_ln = $linenr;
  			my $ctx_skip = $realcnt;
773647a09   Andy Whitcroft   update checkpatch...
1683

548596d52   Andy Whitcroft   checkpatch: trail...
1684
1685
1686
1687
1688
1689
  			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...
1690
  				$ctx_ln++;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1691
  			}
548596d52   Andy Whitcroft   checkpatch: trail...
1692

53210168f   Andy Whitcroft   checkpatch: tough...
1693
1694
1695
1696
1697
1698
1699
  			#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...
1700

773647a09   Andy Whitcroft   update checkpatch...
1701
1702
1703
  			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
  				ERROR("that open brace { should be on the previous line
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
1704
1705
1706
1707
  					"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
00df344fd   Andy Whitcroft   update checkpatch...
1708
  			}
773647a09   Andy Whitcroft   update checkpatch...
1709
1710
1711
1712
  			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
  			    $ctx =~ /\)\s*\;\s*$/ &&
  			    defined $lines[$ctx_ln - 1])
  			{
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1713
1714
  				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
  				if ($nindent > $indent) {
773647a09   Andy Whitcroft   update checkpatch...
1715
1716
  					WARN("trailing semicolon indicates no statements, indent implies otherwise
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
1717
1718
1719
1720
  						"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1721
1722
  				}
  			}
00df344fd   Andy Whitcroft   update checkpatch...
1723
  		}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
  # 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...
1738
1739
1740
  			my @newlines = ($c =~ /
  /gs);
  			my $cond_lines = 1 + $#newlines;
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
  
  			# 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...
1754
1755
  			if ($s =~ s/^\s*?
  //) {
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
  				$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...
1766
  			my $cond_ptr = -1;
740504c61   Andy Whitcroft   checkpatch: suspe...
1767
  			$continuation = 0;
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
1768
1769
  			while ($cond_ptr != $cond_lines) {
  				$cond_ptr = $cond_lines;
f16fa28f7   Andy Whitcroft   checkpatch: suspe...
1770
1771
1772
1773
1774
  				# 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...
1775
1776
1777
1778
  				# Ignore:
  				#  1) blank lines, they should be at 0,
  				#  2) preprocessor lines, and
  				#  3) labels.
740504c61   Andy Whitcroft   checkpatch: suspe...
1779
1780
1781
  				if ($continuation ||
  				    $s =~ /^\s*?
  / ||
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
1782
1783
  				    $s =~ /^\s*#\s*?/ ||
  				    $s =~ /^\s*$Ident\s*:/) {
740504c61   Andy Whitcroft   checkpatch: suspe...
1784
1785
  					$continuation = ($s =~ /^.*?\\
  /) ? 1 : 0;
30dad6ebe   Andy Whitcroft   checkpatch: inden...
1786
1787
1788
1789
  					if ($s =~ s/^.*?
  //) {
  						$cond_lines++;
  					}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
1790
  				}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
  			}
  
  			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...
1806
1807
  			#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...
1808
1809
1810
1811
1812
1813
1814
1815
  
  			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...
1816
1817
  		# Track the 'values' across context and added lines.
  		my $opline = $line; $opline =~ s/^./ /;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1818
1819
1820
  		my ($curr_values, $curr_vars) =
  				annotate_values($opline . "
  ", $prev_values);
6c72ffaab   Andy Whitcroft   update checkpatch...
1821
  		$curr_values = $prev_values . $curr_values;
c2fdda0df   Andy Whitcroft   update checkpatch...
1822
1823
  		if ($dbg_values) {
  			my $outline = $opline; $outline =~ s/\t/ /g;
cf655043d   Andy Whitcroft   update checkpatch...
1824
1825
1826
1827
  			print "$linenr > .$outline
  ";
  			print "$linenr > $curr_values
  ";
1f65f947a   Andy Whitcroft   checkpatch: add c...
1828
1829
  			print "$linenr >  $curr_vars
  ";
c2fdda0df   Andy Whitcroft   update checkpatch...
1830
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
1831
  		$prev_values = substr($curr_values, -1);
00df344fd   Andy Whitcroft   update checkpatch...
1832
1833
  #ignore lines not being added
  		if ($line=~/^[^\+]/) {next;}
653d4876b   Andy Whitcroft   update checkpatch...
1834
  # TEST: allow direct testing of the type matcher.
7429c6903   Andy Whitcroft   checkpatch: impro...
1835
1836
1837
1838
1839
1840
1841
1842
  		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...
1843
1844
  			next;
  		}
a1ef277e2   Andy Whitcroft   checkpatch: add t...
1845
1846
  # TEST: allow direct testing of the attribute matcher.
  		if ($dbg_attr) {
9360b0e50   Andy Whitcroft   checkpatch: exten...
1847
  			if ($line =~ /^.\s*$Modifier\s*$/) {
a1ef277e2   Andy Whitcroft   checkpatch: add t...
1848
1849
  				ERROR("TEST: is attr
  " . $herecurr);
9360b0e50   Andy Whitcroft   checkpatch: exten...
1850
  			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
a1ef277e2   Andy Whitcroft   checkpatch: add t...
1851
1852
1853
1854
1855
  				ERROR("TEST: is not attr ($1 is)
  ". $herecurr);
  			}
  			next;
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1856

f0a594c1c   Andy Whitcroft   update checkpatch...
1857
  # check for initialisation to aggregates open brace on the next line
99423c206   Andy Whitcroft   checkpatch: fix _...
1858
1859
  		if ($line =~ /^.\s*{/ &&
  		    $prevline =~ /(?:^|[^=])=\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
1860
1861
  			ERROR("that open brace { should be on the previous line
  " . $hereprev);
f0a594c1c   Andy Whitcroft   update checkpatch...
1862
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1863
1864
1865
1866
1867
  #
  # Checks which are anchored on the added line.
  #
  
  # check for malformed paths in #include statements (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
1868
  		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876b   Andy Whitcroft   update checkpatch...
1869
1870
  			my $path = $1;
  			if ($path =~ m{//}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1871
1872
1873
  				ERROR("malformed #include filename
  " .
  					$herecurr);
653d4876b   Andy Whitcroft   update checkpatch...
1874
  			}
653d4876b   Andy Whitcroft   update checkpatch...
1875
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1876

0a920b5b6   Andy Whitcroft   add a trivial pat...
1877
  # no C99 // comments
00df344fd   Andy Whitcroft   update checkpatch...
1878
  		if ($line =~ m{//}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1879
1880
  			ERROR("do not use C99 // comments
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1881
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1882
  		# Remove C99 comments.
0a920b5b6   Andy Whitcroft   add a trivial pat...
1883
  		$line =~ s@//.*@@;
6c72ffaab   Andy Whitcroft   update checkpatch...
1884
  		$opline =~ s@//.*@@;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1885

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1886
1887
1888
1889
1890
1891
1892
1893
1894
  # EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
  # the whole statement.
  #print "APW <$lines[$realline_next - 1]>
  ";
  		if (defined $realline_next &&
  		    exists $lines[$realline_next - 1] &&
  		    !defined $suppress_export{$realline_next} &&
  		    ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
  		     $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3cbf62df3   Andy Whitcroft   checkpatch: handl...
1895
1896
1897
1898
  			# Handle definitions which produce identifiers with
  			# a prefix:
  			#   XXX(foo);
  			#   EXPORT_SYMBOL(something_foo);
653d4876b   Andy Whitcroft   update checkpatch...
1899
  			my $name = $1;
3cbf62df3   Andy Whitcroft   checkpatch: handl...
1900
1901
1902
1903
1904
1905
1906
  			if ($stat =~ /^.([A-Z_]+)\s*\(\s*($Ident)/ &&
  			    $name =~ /^${Ident}_$2/) {
  #print "FOO C name<$name>
  ";
  				$suppress_export{$realline_next} = 1;
  
  			} elsif ($stat !~ /(?:
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1907
1908
  				
  .}\s*$|
480120586   Andy Whitcroft   checkpatch: DEFIN...
1909
1910
1911
  				^.DEFINE_$Ident\(\Q$name\E\)|
  				^.DECLARE_$Ident\(\Q$name\E\)|
  				^.LIST_HEAD\(\Q$name\E\)|
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1912
1913
  				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
  				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
480120586   Andy Whitcroft   checkpatch: DEFIN...
1914
  			    )/x) {
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1915
1916
1917
1918
1919
  #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...
1920
1921
  			}
  		}
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
  		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...
1935

5150bda43   Joe Eloff   checkpatch: chang...
1936
  # check for global initialisers.
c45dcabd2   Andy Whitcroft   update checkpatch...
1937
  		if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) {
5150bda43   Joe Eloff   checkpatch: chang...
1938
1939
  			ERROR("do not initialise globals to 0 or NULL
  " .
f0a594c1c   Andy Whitcroft   update checkpatch...
1940
1941
  				$herecurr);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1942
  # check for static initialisers.
2d1bafd79   Andy Whitcroft   checkpatch: do no...
1943
  		if ($line =~ /\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1944
1945
1946
  			ERROR("do not initialise statics to 0 or NULL
  " .
  				$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1947
  		}
cb710eca6   Joe Perches   scripts/checkpatc...
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
  # check for static const char * arrays.
  		if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
  			WARN("static const char * array should probably be static const char * const
  " .
  				$herecurr);
                 }
  
  # check for static char foo[] = "bar" declarations.
  		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
  			WARN("static char array declaration should probably be static const char
  " .
  				$herecurr);
                 }
93ed0e2d0   Joe Perches   scripts/checkpatc...
1961
1962
1963
1964
1965
  # check for declarations of struct pci_device_id
  		if ($line =~ /\bstruct\s+pci_device_id\s+\w+\s*\[\s*\]\s*\=\s*\{/) {
  			WARN("Use DEFINE_PCI_DEVICE_TABLE for struct pci_device_id
  " . $herecurr);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1966
1967
1968
  # check for new typedefs, only function parameters and sparse annotations
  # make sense.
  		if ($line =~ /\btypedef\s/ &&
8054576dc   Andy Whitcroft   checkpatch: loose...
1969
  		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
1970
  		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
1971
  		    $line !~ /\b$typeTypedefs\b/ &&
653d4876b   Andy Whitcroft   update checkpatch...
1972
  		    $line !~ /\b__bitwise(?:__|)\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1973
1974
  			WARN("do not add new typedefs
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1975
1976
1977
  		}
  
  # * goes on variable not on type
65863862b   Andy Whitcroft   checkpatch: dissa...
1978
  		# (char*[ const])
00ef4ece0   Andy Whitcroft   checkpatch: corre...
1979
  		if ($line =~ m{\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\)}) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1980
1981
1982
1983
1984
1985
1986
  			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/...
1987
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1988
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
1989

65863862b   Andy Whitcroft   checkpatch: dissa...
1990
1991
1992
1993
1994
1995
  			#print "from<$from> to<$to>
  ";
  			if ($from ne $to) {
  				ERROR("\"(foo$from)\" should be \"(foo$to)\"
  " .  $herecurr);
  			}
00ef4ece0   Andy Whitcroft   checkpatch: corre...
1996
  		} elsif ($line =~ m{\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident)}) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1997
1998
1999
2000
2001
2002
2003
  			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/...
2004
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
2005
2006
2007
  			}
  			# Modifiers should have spaces.
  			$to =~ s/(\b$Modifier$)/$1 /;
d8aaf1214   Andy Whitcroft   update checkpatch...
2008

667026e7b   Andy Whitcroft   checkpatch: a mod...
2009
2010
2011
  			#print "from<$from> to<$to> ident<$ident>
  ";
  			if ($from ne $to && $ident !~ /^$Modifier$/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
2012
2013
2014
  				ERROR("\"foo${from}bar\" should be \"foo${to}bar\"
  " .  $herecurr);
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2015
2016
2017
2018
2019
2020
2021
2022
2023
  		}
  
  # # 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...
2024
  		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2025
2026
  			WARN("LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
2027
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2028
2029
2030
  # printk should use KERN_* levels.  Note that follow on printk's on the
  # same line do not need a level, so we use the current block context
  # to try and find and validate the current printk.  In summary the current
25985edce   Lucas De Marchi   Fix common misspe...
2031
  # printk includes all preceding printk's which have no newline on the end.
00df344fd   Andy Whitcroft   update checkpatch...
2032
  # we assume the first bad printk is the one to report.
f0a594c1c   Andy Whitcroft   update checkpatch...
2033
  		if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
00df344fd   Andy Whitcroft   update checkpatch...
2034
2035
2036
2037
  			my $ok = 0;
  			for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
  				#print "CHECK<$lines[$ln - 1]
  ";
25985edce   Lucas De Marchi   Fix common misspe...
2038
  				# we have a preceding printk if it ends
00df344fd   Andy Whitcroft   update checkpatch...
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
  				# 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...
2050
2051
  				WARN("printk() should include KERN_ facility level
  " . $herecurr);
00df344fd   Andy Whitcroft   update checkpatch...
2052
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2053
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2054
2055
  # 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...
2056
2057
  		if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and
  		    !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2058
2059
  			ERROR("open brace '{' following function declarations go on the next line
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2060
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2061

8905a67c6   Andy Whitcroft   update checkpatch...
2062
2063
2064
2065
2066
2067
  # 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);
  		}
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
2068
2069
2070
2071
2072
  # missing space after union, struct or enum definition
  		if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?(?:\s+$Ident)?[=\{]/) {
  		    WARN("missing space after $1 definition
  " . $herecurr);
  		}
8d31cfcec   Andy Whitcroft   checkpatch: check...
2073
2074
  # check for spacing round square brackets; allowed:
  #  1. with a type on the left -- int [] a;
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
2075
2076
  #  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...
2077
2078
2079
  		while ($line =~ /(.*?\s)\[/g) {
  			my ($where, $prefix) = ($-[1], $1);
  			if ($prefix !~ /$Type\s+$/ &&
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
2080
2081
  			    ($where != 0 || $prefix !~ /^.\s+$/) &&
  			    $prefix !~ /{\s+$/) {
8d31cfcec   Andy Whitcroft   checkpatch: check...
2082
2083
2084
2085
  				ERROR("space prohibited before open square bracket '['
  " . $herecurr);
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2086
  # check for spaces between functions and their parentheses.
6c72ffaab   Andy Whitcroft   update checkpatch...
2087
  		while ($line =~ /($Ident)\s+\(/g) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2088
  			my $name = $1;
773647a09   Andy Whitcroft   update checkpatch...
2089
2090
  			my $ctx_before = substr($line, 0, $-[1]);
  			my $ctx = "$ctx_before$name";
c2fdda0df   Andy Whitcroft   update checkpatch...
2091
2092
  
  			# Ignore those directives where spaces _are_ permitted.
773647a09   Andy Whitcroft   update checkpatch...
2093
2094
2095
2096
2097
2098
  			if ($name =~ /^(?:
  				if|for|while|switch|return|case|
  				volatile|__volatile__|
  				__attribute__|format|__extension__|
  				asm|__asm__)$/x)
  			{
c2fdda0df   Andy Whitcroft   update checkpatch...
2099
2100
2101
2102
  
  			# 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...
2103
  			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
2104
2105
  
  			# cpp #elif statement condition may start with a (
c45dcabd2   Andy Whitcroft   update checkpatch...
2106
  			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2107
2108
2109
  
  			# If this whole things ends with a type its most
  			# likely a typedef for a function.
773647a09   Andy Whitcroft   update checkpatch...
2110
  			} elsif ($ctx =~ /$Type$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2111
2112
  
  			} else {
773647a09   Andy Whitcroft   update checkpatch...
2113
2114
  				WARN("space prohibited between function name and open parenthesis '('
  " . $herecurr);
6c72ffaab   Andy Whitcroft   update checkpatch...
2115
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
2116
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2117
  # Check operator spacing.
0a920b5b6   Andy Whitcroft   add a trivial pat...
2118
  		if (!($line=~/\#\s*include/)) {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2119
2120
2121
2122
  			my $ops = qr{
  				<<=|>>=|<=|>=|==|!=|
  				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
  				=>|->|<<|>>|<|>|=|!|~|
1f65f947a   Andy Whitcroft   checkpatch: add c...
2123
2124
  				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
  				\?|:
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2125
  			}x;
cf655043d   Andy Whitcroft   update checkpatch...
2126
  			my @elements = split(/($ops|;)/, $opline);
00df344fd   Andy Whitcroft   update checkpatch...
2127
  			my $off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
2128
2129
  
  			my $blank = copy_spacing($opline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2130
  			for (my $n = 0; $n < $#elements; $n += 2) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2131
  				$off += length($elements[$n]);
25985edce   Lucas De Marchi   Fix common misspe...
2132
  				# Pick up the preceding and succeeding characters.
773647a09   Andy Whitcroft   update checkpatch...
2133
2134
2135
2136
2137
2138
  				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...
2139
2140
2141
  				my $a = '';
  				$a = 'V' if ($elements[$n] ne '');
  				$a = 'W' if ($elements[$n] =~ /\s$/);
cf655043d   Andy Whitcroft   update checkpatch...
2142
  				$a = 'C' if ($elements[$n] =~ /$;$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2143
2144
  				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
  				$a = 'O' if ($elements[$n] eq '');
773647a09   Andy Whitcroft   update checkpatch...
2145
  				$a = 'E' if ($ca =~ /^\s*$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2146

0a920b5b6   Andy Whitcroft   add a trivial pat...
2147
  				my $op = $elements[$n + 1];
4a0df2ef4   Andy Whitcroft   update checkpatch...
2148
2149
  
  				my $c = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2150
  				if (defined $elements[$n + 2]) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2151
2152
  					$c = 'V' if ($elements[$n + 2] ne '');
  					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043d   Andy Whitcroft   update checkpatch...
2153
  					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2154
2155
  					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
  					$c = 'O' if ($elements[$n + 2] eq '');
8b1b33786   Andy Whitcroft   checkpatch: fix c...
2156
  					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2157
2158
  				} else {
  					$c = 'E';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2159
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2160
2161
2162
  				my $ctx = "${a}x${c}";
  
  				my $at = "(ctx:$ctx)";
6c72ffaab   Andy Whitcroft   update checkpatch...
2163
  				my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e1   Andy Whitcroft   update checkpatch...
2164
2165
  				my $hereptr = "$hereline$ptr
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2166

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

1f65f947a   Andy Whitcroft   checkpatch: add c...
2170
2171
  				# Get the full operator variant.
  				my $opv = $op . substr($curr_vars, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
2172
2173
2174
  				# Ignore operators passed as parameters.
  				if ($op_type ne 'V' &&
  				    $ca =~ /\s$/ && $cc =~ /^\s*,/) {
cf655043d   Andy Whitcroft   update checkpatch...
2175
2176
  #				# Ignore comments
  #				} elsif ($op =~ /^$;+$/) {
13214adf7   Andy Whitcroft   update checkpatch...
2177

d8aaf1214   Andy Whitcroft   update checkpatch...
2178
  				# ; should have either the end of line or a space or \ after it
13214adf7   Andy Whitcroft   update checkpatch...
2179
  				} elsif ($op eq ';') {
cf655043d   Andy Whitcroft   update checkpatch...
2180
2181
  					if ($ctx !~ /.x[WEBC]/ &&
  					    $cc !~ /^\\/ && $cc !~ /^;/) {
773647a09   Andy Whitcroft   update checkpatch...
2182
2183
  						ERROR("space required after that '$op' $at
  " . $hereptr);
d8aaf1214   Andy Whitcroft   update checkpatch...
2184
2185
2186
2187
  					}
  
  				# // is a comment
  				} elsif ($op eq '//') {
0a920b5b6   Andy Whitcroft   add a trivial pat...
2188

1f65f947a   Andy Whitcroft   checkpatch: add c...
2189
2190
2191
2192
  				# No spaces for:
  				#   ->
  				#   :   when part of a bitfield
  				} elsif ($op eq '->' || $opv eq ':B') {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2193
  					if ($ctx =~ /Wx.|.xW/) {
773647a09   Andy Whitcroft   update checkpatch...
2194
2195
  						ERROR("spaces prohibited around that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2196
2197
2198
2199
  					}
  
  				# , must have a space on the right.
  				} elsif ($op eq ',') {
cf655043d   Andy Whitcroft   update checkpatch...
2200
  					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
773647a09   Andy Whitcroft   update checkpatch...
2201
2202
  						ERROR("space required after that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2203
  					}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2204
  				# '*' as part of a type definition -- reported already.
74048ed81   Andy Whitcroft   checkpatch: varia...
2205
  				} elsif ($opv eq '*_') {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2206
2207
2208
2209
2210
2211
2212
  					#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...
2213
  					 $opv eq '*U' || $opv eq '-U' ||
0d413866c   Andy Whitcroft   checkpatch: value...
2214
  					 $opv eq '&U' || $opv eq '&&U') {
cf655043d   Andy Whitcroft   update checkpatch...
2215
  					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
773647a09   Andy Whitcroft   update checkpatch...
2216
2217
  						ERROR("space required before that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2218
  					}
a3340b357   Andy Whitcroft   checkpatch: point...
2219
  					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
171ae1a49   Andy Whitcroft   update checkpatch...
2220
2221
2222
  						# A unary '*' may be const
  
  					} elsif ($ctx =~ /.xW/) {
fb9e9096b   Andy Whitcroft   checkpatch: limit...
2223
2224
  						ERROR("space prohibited after that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2225
2226
2227
2228
  					}
  
  				# unary ++ and unary -- are allowed no space on one side.
  				} elsif ($op eq '++' or $op eq '--') {
773647a09   Andy Whitcroft   update checkpatch...
2229
2230
2231
2232
2233
2234
2235
2236
  					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...
2237
  					}
773647a09   Andy Whitcroft   update checkpatch...
2238
2239
2240
  					if ($ctx =~ /ExW/) {
  						ERROR("space prohibited after that '$op' $at
  " . $hereptr);
653d4876b   Andy Whitcroft   update checkpatch...
2241
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2242

773647a09   Andy Whitcroft   update checkpatch...
2243

0a920b5b6   Andy Whitcroft   add a trivial pat...
2244
  				# << and >> may either have or not have spaces both sides
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2245
2246
2247
  				} 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...
2248
2249
  					 $op eq '*' or $op eq '/' or
  					 $op eq '%')
0a920b5b6   Andy Whitcroft   add a trivial pat...
2250
  				{
773647a09   Andy Whitcroft   update checkpatch...
2251
  					if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2252
2253
2254
  						ERROR("need consistent spacing around '$op' $at
  " .
  							$hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2255
  					}
1f65f947a   Andy Whitcroft   checkpatch: add c...
2256
2257
2258
2259
2260
2261
2262
  				# 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...
2263
  				# All the others need spaces both sides.
cf655043d   Andy Whitcroft   update checkpatch...
2264
  				} elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947a   Andy Whitcroft   checkpatch: add c...
2265
  					my $ok = 0;
22f2a2ef9   Andy Whitcroft   update checkpatch...
2266
  					# Ignore email addresses <foo@bar>
1f65f947a   Andy Whitcroft   checkpatch: add c...
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
  					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...
2282
2283
  						ERROR("spaces required around that '$op' $at
  " . $hereptr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2284
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2285
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2286
  				$off += length($elements[$n + 1]);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2287
2288
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2289
2290
  # check for multiple assignments
  		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
6c72ffaab   Andy Whitcroft   update checkpatch...
2291
2292
  			CHK("multiple assignments should be avoided
  " . $herecurr);
f0a594c1c   Andy Whitcroft   update checkpatch...
2293
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
  ## # 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...
2309

0a920b5b6   Andy Whitcroft   add a trivial pat...
2310
  #need space before brace following if, while, etc
22f2a2ef9   Andy Whitcroft   update checkpatch...
2311
2312
  		if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
  		    $line =~ /do{/) {
773647a09   Andy Whitcroft   update checkpatch...
2313
2314
  			ERROR("space required before the open brace '{'
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2315
2316
2317
2318
2319
  		}
  
  # closing brace should have a space following it when it has anything
  # on the line
  		if ($line =~ /}(?!(?:,|;|\)))\S/) {
773647a09   Andy Whitcroft   update checkpatch...
2320
2321
  			ERROR("space required after that close brace '}'
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2322
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2323
2324
  # check spacing on square brackets
  		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
2325
2326
  			ERROR("space prohibited after that open square bracket '['
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2327
2328
  		}
  		if ($line =~ /\s\]/) {
773647a09   Andy Whitcroft   update checkpatch...
2329
2330
  			ERROR("space prohibited before that close square bracket ']'
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2331
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
2332
  # check spacing on parentheses
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2333
2334
  		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
  		    $line !~ /for\s*\(\s+;/) {
773647a09   Andy Whitcroft   update checkpatch...
2335
2336
  			ERROR("space prohibited after that open parenthesis '('
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2337
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2338
  		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2339
2340
  		    $line !~ /for\s*\(.*;\s+\)/ &&
  		    $line !~ /:\s+\)/) {
773647a09   Andy Whitcroft   update checkpatch...
2341
2342
  			ERROR("space prohibited before that close parenthesis ')'
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2343
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2344
  #goto labels aren't indented, allow a single space however
4a0df2ef4   Andy Whitcroft   update checkpatch...
2345
  		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b6   Andy Whitcroft   add a trivial pat...
2346
  		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2347
2348
  			WARN("labels should not be indented
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2349
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
2350
2351
2352
2353
  # Return is not a function.
  		if (defined($stat) && $stat =~ /^.\s*return(\s*)(\(.*);/s) {
  			my $spacing = $1;
  			my $value = $2;
86f9d059c   Andy Whitcroft   checkpatch: allow...
2354
  			# Flatten any parentheses
fb2d2c1b5   Andy Whitcroft   checkpatch: ensur...
2355
2356
  			$value =~ s/\(/ \(/g;
  			$value =~ s/\)/\) /g;
63f17f897   Andy Whitcroft   checkpatch: allow...
2357
2358
2359
2360
2361
  			while ($value =~ s/\[[^\{\}]*\]/1/ ||
  			       $value !~ /(?:$Ident|-?$Constant)\s*
  					     $Compare\s*
  					     (?:$Ident|-?$Constant)/x &&
  			       $value =~ s/\([^\(\)]*\)/1/) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2362
  			}
fb2d2c1b5   Andy Whitcroft   checkpatch: ensur...
2363
2364
2365
  #print "value<$value>
  ";
  			if ($value =~ /^\s*(?:$Ident|-?$Constant)\s*$/) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2366
2367
2368
2369
2370
2371
2372
2373
  				ERROR("return is not a function, parentheses are not required
  " . $herecurr);
  
  			} elsif ($spacing !~ /\s+/) {
  				ERROR("space required before the open parenthesis '('
  " . $herecurr);
  			}
  		}
53a3c4487   Andy Whitcroft   checkpatch: retur...
2374
2375
2376
2377
2378
2379
2380
2381
  # Return of what appears to be an errno should normally be -'ve
  		if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
  			my $name = $1;
  			if ($name ne 'EOF' && $name ne 'ERROR') {
  				WARN("return of an errno should typically be -ve (return -$1)
  " . $herecurr);
  			}
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
2382

0a920b5b6   Andy Whitcroft   add a trivial pat...
2383
  # Need a space before open parenthesis after if, while etc
4a0df2ef4   Andy Whitcroft   update checkpatch...
2384
  		if ($line=~/\b(if|while|for|switch)\(/) {
773647a09   Andy Whitcroft   update checkpatch...
2385
2386
  			ERROR("space required before the open parenthesis '('
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2387
  		}
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
2388
2389
  # Check for illegal assignment in if conditional -- and check for trailing
  # statements after the conditional.
170d3a226   Andy Whitcroft   checkpatch: handl...
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
  		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...
2414
  			my ($s, $c) = ($stat, $cond);
8905a67c6   Andy Whitcroft   update checkpatch...
2415

b53c8e104   Andy Whitcroft   checkpatch: ensur...
2416
  			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2417
2418
  				ERROR("do not use assignment in if condition
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
2419
2420
2421
2422
  			}
  
  			# Find out what is on the end of the line after the
  			# conditional.
773647a09   Andy Whitcroft   update checkpatch...
2423
  			substr($s, 0, length($c), '');
8905a67c6   Andy Whitcroft   update checkpatch...
2424
2425
  			$s =~ s/
  .*//g;
13214adf7   Andy Whitcroft   update checkpatch...
2426
  			$s =~ s/$;//g; 	# Remove any comments
53210168f   Andy Whitcroft   checkpatch: tough...
2427
2428
  			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
  			    $c !~ /}\s*while\s*/)
773647a09   Andy Whitcroft   update checkpatch...
2429
  			{
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2430
2431
2432
2433
  				# Find out how long the conditional actually is.
  				my @newlines = ($c =~ /
  /gs);
  				my $cond_lines = 1 + $#newlines;
42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
2434
  				my $stat_real = '';
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2435

42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
2436
2437
2438
  				$stat_real = raw_line($linenr, $cond_lines)
  							. "
  " if ($cond_lines);
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2439
2440
2441
2442
2443
2444
2445
  				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...
2446
2447
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
  # 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...
2463
  # if and else should not have general statements after it
13214adf7   Andy Whitcroft   update checkpatch...
2464
2465
2466
2467
2468
2469
2470
  		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...
2471
  		}
396677823   Andy Whitcroft   checkpatch: if sh...
2472
2473
2474
2475
2476
2477
  # 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/...
2478
2479
2480
  # 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...
2481
  			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf80   Andy Whitcroft   checkpatch: case/...
2482
2483
2484
2485
2486
2487
  			\s*return\s+
  		    )/xg)
  		{
  			ERROR("trailing statements should be on next line
  " . $herecurr);
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2488
2489
2490
2491
2492
  
  		# 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...
2493
2494
  			ERROR("else should follow close brace '}'
  " . $hereprev);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2495
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
2496
2497
2498
2499
2500
2501
  		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...
2502
  			substr($s, 0, length($c), '');
c2fdda0df   Andy Whitcroft   update checkpatch...
2503
2504
2505
2506
2507
2508
2509
2510
  			$s =~ s/
  .*//g;
  
  			if ($s =~ /^\s*;/) {
  				ERROR("while should follow close brace '}'
  " . $hereprev);
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2511
2512
2513
2514
2515
2516
2517
2518
2519
  #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...
2520
  		if ($line=~/\#\s*define.*\\\s$/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2521
2522
  			WARN("Whitepspace after \\ makes next lines useless
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2523
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2524
  #warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
2525
  		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec483   Andy Whitcroft   checkpatch: reduc...
2526
2527
2528
2529
  			my $file = "$1.h";
  			my $checkfile = "include/linux/$file";
  			if (-f "$root/$checkfile" &&
  			    $realfile ne $checkfile &&
7840a94cd   Wolfram Sang   checkpatch: refac...
2530
  			    $1 !~ /$allowed_asm_includes/)
c45dcabd2   Andy Whitcroft   update checkpatch...
2531
  			{
e09dec483   Andy Whitcroft   checkpatch: reduc...
2532
2533
2534
2535
2536
2537
2538
  				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...
2539
2540
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2541
2542
  # 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...
2543
  # in a known good container
b8f96a31f   Andy Whitcroft   checkpatch: macro...
2544
2545
  		if ($realfile !~ m@/vmlinux.lds.h$@ &&
  		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf1214   Andy Whitcroft   update checkpatch...
2546
2547
  			my $ln = $linenr;
  			my $cnt = $realcnt;
c45dcabd2   Andy Whitcroft   update checkpatch...
2548
2549
  			my ($off, $dstat, $dcond, $rest);
  			my $ctx = '';
653d4876b   Andy Whitcroft   update checkpatch...
2550

c45dcabd2   Andy Whitcroft   update checkpatch...
2551
2552
2553
2554
2555
2556
2557
2558
2559
  			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...
2560
  				$cnt-- if ($lines[$ln - 1] !~ /^-/);
c45dcabd2   Andy Whitcroft   update checkpatch...
2561
  				$ln++;
c45dcabd2   Andy Whitcroft   update checkpatch...
2562
2563
2564
2565
2566
2567
2568
  			}
  			$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...
2569
2570
  			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
2571
2572
2573
2574
  
  			# Extract the remainder of the define (if any) and
  			# rip off surrounding spaces, and trailing \'s.
  			$rest = '';
636d140a8   Andy Whitcroft   checkpatch: compl...
2575
2576
2577
  			while ($off != 0 || ($cnt > 0 && $rest =~ /\\\s*$/)) {
  				#print "ADDING cnt<$cnt> $off <" . substr($lines[$ln - 1], $off) . "> rest<$rest>
  ";
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
2578
2579
2580
2581
2582
  				if ($off != 0 || $lines[$ln - 1] !~ /^-/) {
  					$rest .= substr($lines[$ln - 1], $off) . "
  ";
  					$cnt--;
  				}
c45dcabd2   Andy Whitcroft   update checkpatch...
2583
  				$ln++;
c45dcabd2   Andy Whitcroft   update checkpatch...
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
  				$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...
2596
  			}
292f1a9b3   Andy Whitcroft   checkpatch: compl...
2597
  			$dstat =~ s/$;//g;
c45dcabd2   Andy Whitcroft   update checkpatch...
2598
2599
2600
2601
  			$dstat =~ s/\\
  .//g;
  			$dstat =~ s/^\s*//s;
  			$dstat =~ s/\s*$//s;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2602

c45dcabd2   Andy Whitcroft   update checkpatch...
2603
  			# Flatten any parentheses and braces
bf30d6ede   Andy Whitcroft   checkpatch: compl...
2604
2605
2606
2607
  			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
  			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
  			       $dstat =~ s/\[[^\{\}]*\]/1/)
  			{
de7d4f0e1   Andy Whitcroft   update checkpatch...
2608
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
2609

c45dcabd2   Andy Whitcroft   update checkpatch...
2610
2611
2612
2613
2614
2615
  			my $exceptions = qr{
  				$Declare|
  				module_param_named|
  				MODULE_PARAM_DESC|
  				DECLARE_PER_CPU|
  				DEFINE_PER_CPU|
383099fd6   Andy Whitcroft   checkpatch: struc...
2616
  				__typeof__\(|
22fd2d3e4   Stefani Seibold   checkpatch.pl: ad...
2617
2618
  				union|
  				struct|
ea71a0a01   Andy Whitcroft   checkpatch: forma...
2619
2620
  				\.$Ident\s*=\s*|
  				^\"|\"$
c45dcabd2   Andy Whitcroft   update checkpatch...
2621
  			}x;
5eaa20b98   Andy Whitcroft   checkpatch: clean...
2622
2623
2624
  			#print "REST<$rest> dstat<$dstat> ctx<$ctx>
  ";
  			if ($rest ne '' && $rest ne ',') {
c45dcabd2   Andy Whitcroft   update checkpatch...
2625
2626
2627
  				if ($rest !~ /while\s*\(/ &&
  				    $dstat !~ /$exceptions/)
  				{
de7d4f0e1   Andy Whitcroft   update checkpatch...
2628
2629
2630
2631
  					ERROR("Macros with multiple statements should be enclosed in a do - while loop
  " . "$here
  $ctx
  ");
c45dcabd2   Andy Whitcroft   update checkpatch...
2632
2633
2634
2635
2636
2637
  				}
  
  			} elsif ($ctx !~ /;/) {
  				if ($dstat ne '' &&
  				    $dstat !~ /^(?:$Ident|-?$Constant)$/ &&
  				    $dstat !~ /$exceptions/ &&
b132e5d58   Andy Whitcroft   checkpatch: macro...
2638
  				    $dstat !~ /^\.$Ident\s*=/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2639
2640
  				    $dstat =~ /$Operators/)
  				{
de7d4f0e1   Andy Whitcroft   update checkpatch...
2641
2642
2643
2644
  					ERROR("Macros with complex values should be enclosed in parenthesis
  " . "$here
  $ctx
  ");
d8aaf1214   Andy Whitcroft   update checkpatch...
2645
  				}
653d4876b   Andy Whitcroft   update checkpatch...
2646
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2647
  		}
080ba9296   Mike Frysinger   checkpatch: try t...
2648
2649
2650
2651
2652
2653
2654
2655
2656
  # 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...
2657
  # check for redundant bracing round if etc
13214adf7   Andy Whitcroft   update checkpatch...
2658
2659
  		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
  			my ($level, $endln, @chunks) =
cf655043d   Andy Whitcroft   update checkpatch...
2660
  				ctx_statement_full($linenr, $realcnt, 1);
13214adf7   Andy Whitcroft   update checkpatch...
2661
2662
  			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
2663
2664
2665
  			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>
  ";
  			if ($#chunks > 0 && $level == 0) {
13214adf7   Andy Whitcroft   update checkpatch...
2666
2667
  				my $allowed = 0;
  				my $seen = 0;
773647a09   Andy Whitcroft   update checkpatch...
2668
2669
  				my $herectx = $here . "
  ";
cf655043d   Andy Whitcroft   update checkpatch...
2670
  				my $ln = $linenr - 1;
13214adf7   Andy Whitcroft   update checkpatch...
2671
2672
  				for my $chunk (@chunks) {
  					my ($cond, $block) = @{$chunk};
773647a09   Andy Whitcroft   update checkpatch...
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
  					# 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...
2687
  					$ln += statement_rawlines($block) - 1;
773647a09   Andy Whitcroft   update checkpatch...
2688
  					substr($block, 0, length($cond), '');
13214adf7   Andy Whitcroft   update checkpatch...
2689
2690
  
  					$seen++ if ($block =~ /^\s*{/);
cf655043d   Andy Whitcroft   update checkpatch...
2691
2692
2693
2694
2695
  					#print "cond<$cond> block<$block> allowed<$allowed>
  ";
  					if (statement_lines($cond) > 1) {
  						#print "APW: ALLOWED: cond<$cond>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
2696
2697
2698
  						$allowed = 1;
  					}
  					if ($block =~/\b(?:if|for|while)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
2699
2700
  						#print "APW: ALLOWED: block<$block>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
2701
2702
  						$allowed = 1;
  					}
cf655043d   Andy Whitcroft   update checkpatch...
2703
2704
2705
  					if (statement_block_size($block) > 1) {
  						#print "APW: ALLOWED: lines block<$block>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
2706
2707
2708
2709
  						$allowed = 1;
  					}
  				}
  				if ($seen && !$allowed) {
cf655043d   Andy Whitcroft   update checkpatch...
2710
2711
  					WARN("braces {} are not necessary for any arm of this statement
  " . $herectx);
13214adf7   Andy Whitcroft   update checkpatch...
2712
2713
2714
  				}
  			}
  		}
773647a09   Andy Whitcroft   update checkpatch...
2715
  		if (!defined $suppress_ifbraces{$linenr - 1} &&
13214adf7   Andy Whitcroft   update checkpatch...
2716
  					$line =~ /\b(if|while|for|else)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
2717
2718
2719
2720
2721
2722
2723
2724
  			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...
2725
2726
2727
  
  			my ($level, $endln, @chunks) =
  				ctx_statement_full($linenr, $realcnt, $-[0]);
cf655043d   Andy Whitcroft   update checkpatch...
2728
2729
  			# Check the condition.
  			my ($cond, $block) = @{$chunks[0]};
773647a09   Andy Whitcroft   update checkpatch...
2730
2731
  			#print "CHECKING<$linenr> cond<$cond> block<$block>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
2732
  			if (defined $cond) {
773647a09   Andy Whitcroft   update checkpatch...
2733
  				substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
  			}
  			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...
2754
  					substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
  				}
  				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...
2765
  				my $cnt = statement_rawlines($block);
cf655043d   Andy Whitcroft   update checkpatch...
2766

f055663c5   Andy Whitcroft   checkpatch: repor...
2767
2768
2769
  				for (my $n = 0; $n < $cnt; $n++) {
  					$herectx .= raw_line($linenr, $n) . "
  ";;
f0a594c1c   Andy Whitcroft   update checkpatch...
2770
  				}
cf655043d   Andy Whitcroft   update checkpatch...
2771
2772
2773
  
  				WARN("braces {} are not necessary for single statement blocks
  " . $herectx);
f0a594c1c   Andy Whitcroft   update checkpatch...
2774
2775
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2776
  # don't include deprecated include files (uses RAW line)
4a0df2ef4   Andy Whitcroft   update checkpatch...
2777
  		for my $inc (@dep_includes) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2778
  			if ($rawline =~ m@^.\s*\#\s*include\s*\<$inc>@) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2779
2780
  				ERROR("Don't use <$inc>: see Documentation/feature-removal-schedule.txt
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2781
2782
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2783
2784
  # don't use deprecated functions
  		for my $func (@dep_functions) {
00df344fd   Andy Whitcroft   update checkpatch...
2785
  			if ($line =~ /\b$func\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2786
2787
  				ERROR("Don't use $func(): see Documentation/feature-removal-schedule.txt
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2788
2789
2790
2791
  			}
  		}
  
  # no volatiles please
6c72ffaab   Andy Whitcroft   update checkpatch...
2792
2793
  		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
  		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2794
2795
  			WARN("Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2796
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2797
  # warn about #if 0
c45dcabd2   Andy Whitcroft   update checkpatch...
2798
  		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2799
2800
2801
  			CHK("if this code is redundant consider removing it
  " .
  				$herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2802
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2803
2804
2805
2806
  # check for needless kfree() checks
  		if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
  			my $expr = $1;
  			if ($line =~ /\bkfree\(\Q$expr\E\);/) {
3c232147a   Wolfram Sang   checkpatch: corre...
2807
2808
  				WARN("kfree(NULL) is safe this check is probably not required
  " . $hereprev);
f0a594c1c   Andy Whitcroft   update checkpatch...
2809
2810
  			}
  		}
4c432a8f0   Greg Kroah-Hartman   checkpatch: usb_f...
2811
2812
2813
2814
2815
2816
2817
2818
  # 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...
2819

1a15a2508   Patrick Pannuto   checkpatch: prefe...
2820
2821
2822
2823
2824
2825
2826
2827
  # prefer usleep_range over udelay
  		if ($line =~ /\budelay\s*\(\s*(\w+)\s*\)/) {
  			# ignore udelay's < 10, however
  			if (! (($1 =~ /(\d+)/) && ($1 < 10)) ) {
  				CHK("usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt
  " . $line);
  			}
  		}
09ef87255   Patrick Pannuto   checkpatch: warn ...
2828
2829
2830
2831
2832
2833
2834
  # warn about unexpectedly long msleep's
  		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
  			if ($1 < 20) {
  				WARN("msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt
  " . $line);
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2835
  # warn about #ifdefs in C files
c45dcabd2   Andy Whitcroft   update checkpatch...
2836
  #		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344fd   Andy Whitcroft   update checkpatch...
2837
2838
2839
2840
2841
  #			print "#ifdef in C files should be avoided
  ";
  #			print "$herecurr";
  #			$clean = 0;
  #		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2842
  # warn about spacing in #ifdefs
c45dcabd2   Andy Whitcroft   update checkpatch...
2843
  		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
22f2a2ef9   Andy Whitcroft   update checkpatch...
2844
2845
2846
  			ERROR("exactly one space required after that #$1
  " . $herecurr);
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2847
  # check for spinlock_t definitions without a comment.
171ae1a49   Andy Whitcroft   update checkpatch...
2848
2849
  		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
  		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2850
2851
  			my $which = $1;
  			if (!ctx_has_comment($first_line, $linenr)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2852
2853
  				CHK("$1 definition without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2854
2855
2856
2857
2858
  			}
  		}
  # 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...
2859
2860
  				CHK("memory barrier without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2861
2862
2863
  			}
  		}
  # check of hardware specific defines
c45dcabd2   Andy Whitcroft   update checkpatch...
2864
  		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2865
2866
  			CHK("architecture specific defines should be avoided
  " .  $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2867
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2868

d4977c78e   Tobias Klauser   checkpatch: warn ...
2869
2870
2871
2872
2873
  # Check that the storage class is at the beginning of a declaration
  		if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
  			WARN("storage class should be at the beginning of the declaration
  " . $herecurr)
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
2874
2875
  # check the location of the inline attribute, that it is between
  # storage class and type.
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2876
2877
  		if ($line =~ /\b$Type\s+$Inline\b/ ||
  		    $line =~ /\b$Inline\s+$Storage\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2878
2879
2880
  			ERROR("inline keyword should sit between storage class and type
  " . $herecurr);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
2881
2882
2883
2884
2885
  # Check for __inline__ and __inline, prefer inline
  		if ($line =~ /\b(__inline__|__inline)\b/) {
  			WARN("plain inline is preferred over $1
  " . $herecurr);
  		}
3d130fd03   Joe Perches   checkpatch.pl: ad...
2886
2887
2888
2889
2890
  # Check for __attribute__ packed, prefer __packed
  		if ($line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
  			WARN("__packed is preferred over __attribute__((packed))
  " . $herecurr);
  		}
8f53a9b80   Joe Perches   scripts/checkpatc...
2891
2892
2893
2894
2895
  # check for sizeof(&)
  		if ($line =~ /\bsizeof\s*\(\s*\&/) {
  			WARN("sizeof(& should be avoided
  " . $herecurr);
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
2896
  # check for new externs in .c files.
171ae1a49   Andy Whitcroft   update checkpatch...
2897
  		if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2898
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a49   Andy Whitcroft   update checkpatch...
2899
  		{
c45dcabd2   Andy Whitcroft   update checkpatch...
2900
2901
  			my $function_name = $1;
  			my $paren_space = $2;
171ae1a49   Andy Whitcroft   update checkpatch...
2902
2903
2904
2905
2906
  
  			my $s = $stat;
  			if (defined $cond) {
  				substr($s, 0, length($cond), '');
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
2907
2908
2909
  			if ($s =~ /^\s*;/ &&
  			    $function_name ne 'uninitialized_var')
  			{
171ae1a49   Andy Whitcroft   update checkpatch...
2910
2911
2912
2913
2914
2915
2916
2917
2918
  				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...
2919
2920
2921
2922
2923
2924
  
  		} elsif ($realfile =~ /\.c$/ && defined $stat &&
  		    $stat =~ /^.\s*extern\s+/)
  		{
  			WARN("externs should be avoided in .c files
  " .  $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
  		}
  
  # 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...
2935
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2936
2937
  
  # check for pointless casting of kmalloc return
caf2a54f1   Joe Perches   scripts/checkpatc...
2938
  		if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2939
2940
2941
  			WARN("unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html
  " . $herecurr);
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2942

caf2a54f1   Joe Perches   scripts/checkpatc...
2943
2944
2945
2946
2947
  # check for multiple semicolons
  		if ($line =~ /;\s*;\s*$/) {
  		    WARN("Statements terminations use 1 semicolon
  " . $herecurr);
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2948
2949
2950
2951
2952
  # check for gcc specific __FUNCTION__
  		if ($line =~ /__FUNCTION__/) {
  			WARN("__func__ should be used instead of gcc specific __FUNCTION__
  "  . $herecurr);
  		}
773647a09   Andy Whitcroft   update checkpatch...
2953

4882720b2   Thomas Gleixner   semaphore: Remove...
2954
2955
  # check for semaphores initialized locked
  		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
773647a09   Andy Whitcroft   update checkpatch...
2956
2957
  			WARN("consider using a completion
  " . $herecurr);
1704f47b5   Peter Zijlstra   lockdep: Add nova...
2958

773647a09   Andy Whitcroft   update checkpatch...
2959
  		}
33ee3b2e2   Alexey Dobriyan   kstrto*: converti...
2960
  # recommend kstrto* over simple_strto*
773647a09   Andy Whitcroft   update checkpatch...
2961
  		if ($line =~ /\bsimple_(strto.*?)\s*\(/) {
33ee3b2e2   Alexey Dobriyan   kstrto*: converti...
2962
2963
  			WARN("consider using kstrto* in preference to simple_$1
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
2964
  		}
f3db6639f   Michael Ellerman   checkpatch: add a...
2965
2966
2967
2968
2969
  # check for __initcall(), use device_initcall() explicitly please
  		if ($line =~ /^.\s*__initcall\s*\(/) {
  			WARN("please use device_initcall() instead of __initcall()
  " . $herecurr);
  		}
79404849e   Emese Revfy   checkpatch.pl: ex...
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
  # check for various ops structs, ensure they are const.
  		my $struct_ops = qr{acpi_dock_ops|
  				address_space_operations|
  				backlight_ops|
  				block_device_operations|
  				dentry_operations|
  				dev_pm_ops|
  				dma_map_ops|
  				extent_io_ops|
  				file_lock_operations|
  				file_operations|
  				hv_ops|
  				ide_dma_ops|
  				intel_dvo_dev_ops|
  				item_operations|
  				iwl_ops|
  				kgdb_arch|
  				kgdb_io|
  				kset_uevent_ops|
  				lock_manager_operations|
  				microcode_ops|
  				mtrr_ops|
  				neigh_ops|
  				nlmsvc_binding|
  				pci_raw_ops|
  				pipe_buf_operations|
  				platform_hibernation_ops|
  				platform_suspend_ops|
  				proto_ops|
  				rpc_pipe_ops|
  				seq_operations|
  				snd_ac97_build_ops|
  				soc_pcmcia_socket_ops|
  				stacktrace_ops|
  				sysfs_ops|
  				tty_operations|
  				usb_mon_operations|
  				wd_ops}x;
6903ffb22   Andy Whitcroft   checkpatch: struc...
3008
  		if ($line !~ /\bconst\b/ &&
79404849e   Emese Revfy   checkpatch.pl: ex...
3009
  		    $line =~ /\bstruct\s+($struct_ops)\b/) {
6903ffb22   Andy Whitcroft   checkpatch: struc...
3010
3011
3012
  			WARN("struct $1 should normally be const
  " .
  				$herecurr);
2b6db5cb6   Andy Whitcroft   checkpatch: struc...
3013
  		}
773647a09   Andy Whitcroft   update checkpatch...
3014
3015
3016
3017
  
  # 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...
3018
3019
  		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
  		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a49   Andy Whitcroft   update checkpatch...
3020
3021
3022
  		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a09   Andy Whitcroft   update checkpatch...
3023
3024
3025
3026
  		{
  			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...
3027
3028
3029
3030
3031
  
  # 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...
3032
  			$string =~ s/%%/__/g;
9c9ba34ee   Andy Whitcroft   update checkpatch...
3033
3034
3035
3036
3037
3038
  			if ($string =~ /(?<!%)%L[udi]/) {
  				WARN("\%Ld/%Lu are not-standard C, use %lld/%llu
  " . $herecurr);
  				last;
  			}
  		}
691d77b6b   Andy Whitcroft   checkpatch: add c...
3039
3040
3041
3042
3043
3044
  
  # 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 ...
3045
  			} elsif ($realfile !~ m@^kernel/@) {
691d77b6b   Andy Whitcroft   checkpatch: add c...
3046
3047
3048
3049
  				WARN("use of in_atomic() is incorrect outside core kernel code
  " . $herecurr);
  			}
  		}
1704f47b5   Peter Zijlstra   lockdep: Add nova...
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
  
  # check for lockdep_set_novalidate_class
  		if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
  		    $line =~ /__lockdep_no_validate__\s*\)/ ) {
  			if ($realfile !~ m@^kernel/lockdep@ &&
  			    $realfile !~ m@^include/linux/lockdep@ &&
  			    $realfile !~ m@^drivers/base/core@) {
  				ERROR("lockdep_no_validate class is reserved for device->mutex.
  " . $herecurr);
  			}
  		}
88f8831c0   Dave Jones   checkpatch: check...
3061
3062
3063
3064
3065
3066
  
  		if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
  		    $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
  			WARN("Exporting world writable files is usually an error. Consider more restrictive permissions.
  " . $herecurr);
  		}
309c00c73   Dave Jones   checkpatch: warn ...
3067
3068
3069
3070
3071
3072
  
  		# Check for memset with swapped arguments
  		if ($line =~ /memset.*\,(\ |)(0x|)0(\ |0|)\);/) {
  			ERROR("memset size is 3rd argument, not the second.
  " . $herecurr);
  		}
13214adf7   Andy Whitcroft   update checkpatch...
3073
3074
3075
3076
3077
3078
  	}
  
  	# 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...
3079
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
  	# 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...
3093
3094
  		ERROR("Does not appear to be a unified-diff format patch
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
3095
3096
  	}
  	if ($is_patch && $chk_signoff && $signoff == 0) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
3097
3098
  		ERROR("Missing Signed-off-by: line(s)
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
3099
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
3100
  	print report_dump();
13214adf7   Andy Whitcroft   update checkpatch...
3101
3102
  	if ($summary && !($clean == 1 && $quiet == 1)) {
  		print "$filename " if ($summary_file);
8905a67c6   Andy Whitcroft   update checkpatch...
3103
3104
3105
3106
3107
3108
  		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...
3109
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
3110

d2c0a2351   Andy Whitcroft   checkpatch: sugge...
3111
3112
3113
3114
3115
3116
3117
3118
3119
  	if ($quiet == 0) {
  		# If there were whitespace errors which cleanpatch can fix
  		# then suggest that.
  		if ($rpt_cleaners) {
  			print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or
  ";
  			print "      scripts/cleanfile
  
  ";
b0781216e   Mike Frysinger   scripts/checkpatc...
3120
  			$rpt_cleaners = 0;
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
3121
3122
  		}
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3123
  	if ($clean == 1 && $quiet == 0) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3124
3125
  		print "$vname has no obvious style problems and is ready for submission.
  "
0a920b5b6   Andy Whitcroft   add a trivial pat...
3126
3127
  	}
  	if ($clean == 0 && $quiet == 0) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3128
3129
  		print "$vname has style problems, please review.  If any of these errors
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
3130
3131
3132
3133
3134
  		print "are false positives report them to the maintainer, see
  ";
  		print "CHECKPATCH in MAINTAINERS.
  ";
  	}
13214adf7   Andy Whitcroft   update checkpatch...
3135

0a920b5b6   Andy Whitcroft   add a trivial pat...
3136
3137
  	return $clean;
  }