Blame view

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

5e8d8f6f2   Andy Whitcroft   checkpatch: versi...
13
  my $V = '0.30';
0a920b5b6   Andy Whitcroft   add a trivial pat...
14
15
16
17
18
19
20
  
  use Getopt::Long qw(:config no_auto_abbrev);
  
  my $quiet = 0;
  my $tree = 1;
  my $chk_signoff = 1;
  my $chk_patch = 1;
773647a09   Andy Whitcroft   update checkpatch...
21
  my $tst_only;
6c72ffaab   Andy Whitcroft   update checkpatch...
22
  my $emacs = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
23
  my $terse = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
24
25
  my $file = 0;
  my $check = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
26
27
  my $summary = 1;
  my $mailback = 0;
13214adf7   Andy Whitcroft   update checkpatch...
28
  my $summary_file = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
29
  my $root;
c2fdda0df   Andy Whitcroft   update checkpatch...
30
  my %debug;
77f5b10a8   Hannes Eder   checkpatch: make ...
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  my $help = 0;
  
  sub help {
  	my ($exitcode) = @_;
  
  	print << "EOM";
  Usage: $P [OPTION]... [FILE]...
  Version: $V
  
  Options:
    -q, --quiet                quiet
    --no-tree                  run without a kernel tree
    --no-signoff               do not check for 'Signed-off-by' line
    --patch                    treat FILE as patchfile (default)
    --emacs                    emacs compile window format
    --terse                    one line per report
    -f, --file                 treat FILE as regular source file
    --subjective, --strict     enable more subjective tests
    --root=PATH                PATH to the kernel tree root
    --no-summary               suppress the per-file summary
    --mailback                 only produce a report in case of warnings/errors
    --summary-file             include the filename in summary
    --debug KEY=[0|1]          turn on/off debugging of KEY, where KEY is one of
                               'values', 'possible', 'type', and 'attr' (default
                               is all off)
    --test-only=WORD           report only warnings/errors containing WORD
                               literally
    -h, --help, --version      display this help and exit
  
  When FILE is - read standard input.
  EOM
  
  	exit($exitcode);
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
65
  GetOptions(
6c72ffaab   Andy Whitcroft   update checkpatch...
66
  	'q|quiet+'	=> \$quiet,
0a920b5b6   Andy Whitcroft   add a trivial pat...
67
68
69
  	'tree!'		=> \$tree,
  	'signoff!'	=> \$chk_signoff,
  	'patch!'	=> \$chk_patch,
6c72ffaab   Andy Whitcroft   update checkpatch...
70
  	'emacs!'	=> \$emacs,
8905a67c6   Andy Whitcroft   update checkpatch...
71
  	'terse!'	=> \$terse,
77f5b10a8   Hannes Eder   checkpatch: make ...
72
  	'f|file!'	=> \$file,
6c72ffaab   Andy Whitcroft   update checkpatch...
73
74
75
  	'subjective!'	=> \$check,
  	'strict!'	=> \$check,
  	'root=s'	=> \$root,
8905a67c6   Andy Whitcroft   update checkpatch...
76
77
  	'summary!'	=> \$summary,
  	'mailback!'	=> \$mailback,
13214adf7   Andy Whitcroft   update checkpatch...
78
  	'summary-file!'	=> \$summary_file,
c2fdda0df   Andy Whitcroft   update checkpatch...
79
  	'debug=s'	=> \%debug,
773647a09   Andy Whitcroft   update checkpatch...
80
  	'test-only=s'	=> \$tst_only,
77f5b10a8   Hannes Eder   checkpatch: make ...
81
82
83
84
85
  	'h|help'	=> \$help,
  	'version'	=> \$help
  ) or help(1);
  
  help(0) if ($help);
0a920b5b6   Andy Whitcroft   add a trivial pat...
86
87
88
89
  
  my $exit = 0;
  
  if ($#ARGV < 0) {
77f5b10a8   Hannes Eder   checkpatch: make ...
90
91
  	print "$P: no input files
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
92
93
  	exit(1);
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
94
95
  my $dbg_values = 0;
  my $dbg_possible = 0;
7429c6903   Andy Whitcroft   checkpatch: impro...
96
  my $dbg_type = 0;
a1ef277e2   Andy Whitcroft   checkpatch: add t...
97
  my $dbg_attr = 0;
c2fdda0df   Andy Whitcroft   update checkpatch...
98
  for my $key (keys %debug) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
99
100
101
  	## no critic
  	eval "\${dbg_$key} = '$debug{$key}';";
  	die "$@" if ($@);
c2fdda0df   Andy Whitcroft   update checkpatch...
102
  }
8905a67c6   Andy Whitcroft   update checkpatch...
103
104
105
106
  if ($terse) {
  	$emacs = 1;
  	$quiet++;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
  if ($tree) {
  	if (defined $root) {
  		if (!top_of_kernel_tree($root)) {
  			die "$P: $root: --root does not point at a valid tree
  ";
  		}
  	} else {
  		if (top_of_kernel_tree('.')) {
  			$root = '.';
  		} elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
  						top_of_kernel_tree($1)) {
  			$root = $1;
  		}
  	}
  
  	if (!defined $root) {
  		print "Must be run from the top-level dir. of a kernel tree
  ";
  		exit(2);
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
127
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
128
  my $emitted_corrupt = 0;
2ceb532b0   Andy Whitcroft   checkpatch: fix f...
129
130
131
132
  our $Ident	= qr{
  			[A-Za-z_][A-Za-z\d_]*
  			(?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
  		}x;
6c72ffaab   Andy Whitcroft   update checkpatch...
133
134
135
136
137
138
139
140
  our $Storage	= qr{extern|static|asmlinkage};
  our $Sparse	= qr{
  			__user|
  			__kernel|
  			__force|
  			__iomem|
  			__must_check|
  			__init_refok|
417495eda   Andy Whitcroft   checkpatch: add _...
141
142
  			__kprobes|
  			__ref
6c72ffaab   Andy Whitcroft   update checkpatch...
143
  		}x;
52131292c   Wolfram Sang   checkpatch: fix f...
144
145
146
  
  # Notes to $Attribute:
  # We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
6c72ffaab   Andy Whitcroft   update checkpatch...
147
148
149
150
  our $Attribute	= qr{
  			const|
  			__read_mostly|
  			__kprobes|
52131292c   Wolfram Sang   checkpatch: fix f...
151
  			__(?:mem|cpu|dev|)(?:initdata|initconst|init\b)|
24e1d81ac   Andy Whitcroft   checkpatch: ____c...
152
153
  			____cacheline_aligned|
  			____cacheline_aligned_in_smp|
5fe3af119   Andy Whitcroft   checkpatch: __wea...
154
155
  			____cacheline_internodealigned_in_smp|
  			__weak
6c72ffaab   Andy Whitcroft   update checkpatch...
156
  		  }x;
c45dcabd2   Andy Whitcroft   update checkpatch...
157
  our $Modifier;
6c72ffaab   Andy Whitcroft   update checkpatch...
158
  our $Inline	= qr{inline|__always_inline|noinline};
6c72ffaab   Andy Whitcroft   update checkpatch...
159
160
161
162
163
  our $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
  our $Lval	= qr{$Ident(?:$Member)*};
  
  our $Constant	= qr{(?:[0-9]+|0x[0-9a-fA-F]+)[UL]*};
  our $Assignment	= qr{(?:\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=)};
86f9d059c   Andy Whitcroft   checkpatch: allow...
164
  our $Compare    = qr{<=|>=|==|!=|<|>};
6c72ffaab   Andy Whitcroft   update checkpatch...
165
166
167
  our $Operators	= qr{
  			<=|>=|==|!=|
  			=>|->|<<|>>|<|>|!|~|
c2fdda0df   Andy Whitcroft   update checkpatch...
168
  			&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%
6c72ffaab   Andy Whitcroft   update checkpatch...
169
  		  }x;
8905a67c6   Andy Whitcroft   update checkpatch...
170
171
172
  our $NonptrType;
  our $Type;
  our $Declare;
171ae1a49   Andy Whitcroft   update checkpatch...
173
174
175
176
177
178
179
180
181
182
  our $UTF8	= qr {
  	[\x09\x0A\x0D\x20-\x7E]              # ASCII
  	| [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
  	|  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
  	| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
  	|  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
  	|  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
  	| [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
  	|  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  }x;
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
183
  our $typeTypedefs = qr{(?x:
fb9e9096b   Andy Whitcroft   checkpatch: limit...
184
  	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
185
186
  	atomic_t
  )};
691e669ba   Joe Perches   checkpatch.pl: al...
187
188
189
  our $logFunctions = qr{(?x:
  	printk|
  	pr_(debug|dbg|vdbg|devel|info|warning|err|notice|alert|crit|emerg|cont)|
8bbea968f   Joe Perches   checkpatch: add m...
190
  	(dev|netdev|netif)_(printk|dbg|vdbg|info|warn|err|notice|alert|crit|emerg|WARN)|
691e669ba   Joe Perches   checkpatch.pl: al...
191
192
193
  	WARN|
  	panic
  )};
8905a67c6   Andy Whitcroft   update checkpatch...
194
195
  our @typeList = (
  	qr{void},
c45dcabd2   Andy Whitcroft   update checkpatch...
196
197
198
199
200
201
202
  	qr{(?:unsigned\s+)?char},
  	qr{(?:unsigned\s+)?short},
  	qr{(?:unsigned\s+)?int},
  	qr{(?:unsigned\s+)?long},
  	qr{(?:unsigned\s+)?long\s+int},
  	qr{(?:unsigned\s+)?long\s+long},
  	qr{(?:unsigned\s+)?long\s+long\s+int},
8905a67c6   Andy Whitcroft   update checkpatch...
203
204
205
206
  	qr{unsigned},
  	qr{float},
  	qr{double},
  	qr{bool},
8905a67c6   Andy Whitcroft   update checkpatch...
207
208
209
210
211
212
213
  	qr{struct\s+$Ident},
  	qr{union\s+$Ident},
  	qr{enum\s+$Ident},
  	qr{${Ident}_t},
  	qr{${Ident}_handler},
  	qr{${Ident}_handler_fn},
  );
c45dcabd2   Andy Whitcroft   update checkpatch...
214
215
216
  our @modifierList = (
  	qr{fastcall},
  );
8905a67c6   Andy Whitcroft   update checkpatch...
217

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

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

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

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

773647a09   Andy Whitcroft   update checkpatch...
423
424
425
426
427
428
  				substr($res, $off, 1, $c);
  				next;
  			} elsif ($sanitise_quote eq $c) {
  				$sanitise_quote = '';
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
429

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

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

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

f0a594c1c   Andy Whitcroft   update checkpatch...
694
695
696
697
698
699
700
  			if ($c eq $close && $level > 0) {
  				$level--;
  				last if ($level == 0);
  			} elsif ($c eq $open) {
  				$level++;
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
701

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

6c72ffaab   Andy Whitcroft   update checkpatch...
798
799
800
801
802
803
  	$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...
804
805
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
806
  	$res =~ s/$/\$/;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
807

6c72ffaab   Andy Whitcroft   update checkpatch...
808
  	return $res;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
809
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
810
  my $av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
811
  my $av_pending;
c2fdda0df   Andy Whitcroft   update checkpatch...
812
  my @av_paren_type;
1f65f947a   Andy Whitcroft   checkpatch: add c...
813
  my $av_pend_colon;
c2fdda0df   Andy Whitcroft   update checkpatch...
814
815
816
  
  sub annotate_reset {
  	$av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
817
818
  	$av_pending = '_';
  	@av_paren_type = ('E');
1f65f947a   Andy Whitcroft   checkpatch: add c...
819
  	$av_pend_colon = 'O';
c2fdda0df   Andy Whitcroft   update checkpatch...
820
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
821
822
  sub annotate_values {
  	my ($stream, $type) = @_;
0a920b5b6   Andy Whitcroft   add a trivial pat...
823

6c72ffaab   Andy Whitcroft   update checkpatch...
824
  	my $res;
1f65f947a   Andy Whitcroft   checkpatch: add c...
825
  	my $var = '_' x length($stream);
6c72ffaab   Andy Whitcroft   update checkpatch...
826
  	my $cur = $stream;
c2fdda0df   Andy Whitcroft   update checkpatch...
827
828
  	print "$stream
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
829

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

c45dcabd2   Andy Whitcroft   update checkpatch...
865
  		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
866
867
  			print "PRE_START($1)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
868
  			$av_preprocessor = 1;
cf655043d   Andy Whitcroft   update checkpatch...
869
870
871
  
  			push(@av_paren_type, $type);
  			push(@av_paren_type, $type);
171ae1a49   Andy Whitcroft   update checkpatch...
872
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
873

c45dcabd2   Andy Whitcroft   update checkpatch...
874
  		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
875
876
877
878
879
  			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...
880
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
881

c45dcabd2   Andy Whitcroft   update checkpatch...
882
  		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
883
884
885
886
887
888
889
890
891
  			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...
892
  			$type = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
893
894
895
  
  		} elsif ($cur =~ /^(\\
  )/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
896
897
  			print "PRECONT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
898

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

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

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

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

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

13214adf7   Andy Whitcroft   update checkpatch...
1177
1178
1179
  	my $prev_values = 'E';
  
  	# suppression flags
773647a09   Andy Whitcroft   update checkpatch...
1180
  	my %suppress_ifbraces;
170d3a226   Andy Whitcroft   checkpatch: handl...
1181
  	my %suppress_whiletrailers;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1182
  	my %suppress_export;
653d4876b   Andy Whitcroft   update checkpatch...
1183

c2fdda0df   Andy Whitcroft   update checkpatch...
1184
  	# Pre-scan the patch sanitizing the lines.
de7d4f0e1   Andy Whitcroft   update checkpatch...
1185
  	# Pre-scan the patch looking for any __setup documentation.
c2fdda0df   Andy Whitcroft   update checkpatch...
1186
  	#
de7d4f0e1   Andy Whitcroft   update checkpatch...
1187
1188
  	my @setup_docs = ();
  	my $setup_docs = 0;
773647a09   Andy Whitcroft   update checkpatch...
1189
1190
  
  	sanitise_line_reset();
c2fdda0df   Andy Whitcroft   update checkpatch...
1191
1192
  	my $line;
  	foreach my $rawline (@rawlines) {
773647a09   Andy Whitcroft   update checkpatch...
1193
1194
  		$linenr++;
  		$line = $rawline;
c2fdda0df   Andy Whitcroft   update checkpatch...
1195

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

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

4a0df2ef4   Andy Whitcroft   update checkpatch...
1293
1294
1295
  # 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...
1296
  		} elsif ($line =~ /^( |\+|$)/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
1297
  			$realline++;
d8aaf1214   Andy Whitcroft   update checkpatch...
1298
  			$realcnt-- if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1299

4a0df2ef4   Andy Whitcroft   update checkpatch...
1300
  			# Measure the line length and indent.
c2fdda0df   Andy Whitcroft   update checkpatch...
1301
  			($length, $indent) = line_stats($rawline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1302
1303
1304
1305
  
  			# Track the previous line.
  			($prevline, $stashline) = ($stashline, $line);
  			($previndent, $stashindent) = ($stashindent, $indent);
c2fdda0df   Andy Whitcroft   update checkpatch...
1306
  			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
773647a09   Andy Whitcroft   update checkpatch...
1307
1308
  			#warn "line<$line>
  ";
6c72ffaab   Andy Whitcroft   update checkpatch...
1309

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

c1ab33269   Andy Whitcroft   checkpatch: inclu...
1332
  			if ($realfile =~ m@^include/asm/@) {
773647a09   Andy Whitcroft   update checkpatch...
1333
1334
1335
1336
1337
1338
  				ERROR("do not modify files in include/asm, change architecture specific files in include/asm-<architecture>
  " . "$here$rawline
  ");
  			}
  			next;
  		}
389834b68   Randy Dunlap   checkpatch: produ...
1339
  		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1340

c2fdda0df   Andy Whitcroft   update checkpatch...
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
  		my $hereline = "$here
  $rawline
  ";
  		my $herecurr = "$here
  $rawline
  ";
  		my $hereprev = "$here
  $prevrawline
  $rawline
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1351

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

0a920b5b6   Andy Whitcroft   add a trivial pat...
1403
  #trailing whitespace
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1404
  		if ($line =~ /^\+.*\015/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1405
1406
1407
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1408
1409
  			ERROR("DOS line endings
  " . $herevet);
c2fdda0df   Andy Whitcroft   update checkpatch...
1410
1411
1412
1413
  		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
1414
1415
  			ERROR("trailing whitespace
  " . $herevet);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1416
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
1417

3354957a4   Andi Kleen   checkpatch: add c...
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
  # check for Kconfig help text having a real description
  		if ($realfile =~ /Kconfig/ &&
  		    $line =~ /\+?\s*(---)?help(---)?$/) {
  			my $length = 0;
  			for (my $l = $linenr; defined($lines[$l]); $l++) {
  				my $f = $lines[$l];
  				$f =~ s/#.*//;
  				$f =~ s/^\s+//;
  				next if ($f =~ /^$/);
  				last if ($f =~ /^\s*config\s/);
  				$length++;
  			}
  			WARN("please write a paragraph that describes the config symbol fully
  " . $herecurr) if ($length < 4);
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
1433
1434
  # 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...
1435
  #80 column limit
c45dcabd2   Andy Whitcroft   update checkpatch...
1436
  		if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
f4c014c0d   Andy Whitcroft   checkpatch: allow...
1437
  		    $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
8bbea968f   Joe Perches   checkpatch: add m...
1438
1439
  		    !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:,|\)\s*;)\s*$/ ||
  		    $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
f4c014c0d   Andy Whitcroft   checkpatch: allow...
1440
  		    $length > 80)
c45dcabd2   Andy Whitcroft   update checkpatch...
1441
  		{
de7d4f0e1   Andy Whitcroft   update checkpatch...
1442
1443
  			WARN("line over 80 characters
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1444
  		}
5e79d96ee   Joe Perches   checkpatch: warn ...
1445
1446
1447
1448
1449
1450
  # check for spaces before a quoted newline
  		if ($rawline =~ /^.*\".*\s\
  /) {
  			WARN("unnecessary whitespace before a quoted newline
  " . $herecurr);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1451
1452
1453
1454
1455
  # 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...
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
  # 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...
1473
1474
  # 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...
1475
1476
1477
  
  # at the beginning of a line any tabs must come first and anything
  # more than 8 must use tabs.
c2fdda0df   Andy Whitcroft   update checkpatch...
1478
1479
1480
1481
1482
  		if ($rawline =~ /^\+\s* \t\s*\S/ ||
  		    $rawline =~ /^\+\s*        \s*/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
171ae1a49   Andy Whitcroft   update checkpatch...
1483
1484
  			ERROR("code indent should use tabs where possible
  " . $herevet);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1485
  		}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
1486
1487
1488
1489
1490
1491
1492
1493
  # 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...
1494
1495
1496
1497
1498
1499
1500
1501
1502
  # check for spaces at the beginning of a line.
  		if ($rawline =~ /^\+ / && $rawline !~ /\+ +\*/)  {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
  			WARN("please, no space for starting a line, \
  				excluding comments
  " . $herevet);
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
1503
1504
  # 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...
1505
  # check for RCS/CVS revision markers
cf655043d   Andy Whitcroft   update checkpatch...
1506
  		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1507
1508
1509
  			WARN("CVS style keyword markers, these will _not_ be updated
  ". $herecurr);
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
1510

42e41c54d   Mike Frysinger   checkpatch: add s...
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
  # 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...
1526
  # Check for potential 'bare' types
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1527
1528
  		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
  		    $realline_next);
9c9ba34ee   Andy Whitcroft   update checkpatch...
1529
  		if ($realcnt && $line =~ /.\s*\S/) {
170d3a226   Andy Whitcroft   checkpatch: handl...
1530
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
1531
  				ctx_statement_block($linenr, $realcnt, 0);
171ae1a49   Andy Whitcroft   update checkpatch...
1532
1533
1534
1535
1536
1537
  			$stat =~ s/
  ./
   /g;
  			$cond =~ s/
  ./
   /g;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1538
1539
1540
1541
1542
1543
1544
  			# 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...
1545
1546
  			my $s = $stat;
  			$s =~ s/{.*$//s;
cf655043d   Andy Whitcroft   update checkpatch...
1547

c2fdda0df   Andy Whitcroft   update checkpatch...
1548
  			# Ignore goto labels.
171ae1a49   Andy Whitcroft   update checkpatch...
1549
  			if ($s =~ /$Ident:\*$/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1550
1551
  
  			# Ignore functions being called
171ae1a49   Andy Whitcroft   update checkpatch...
1552
  			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1553

463f28648   Andy Whitcroft   checkpatch: possi...
1554
  			} elsif ($s =~ /^.\s*else\b/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1555
  			# declarations always start with types
d25065865   Andy Whitcroft   checkpatch: possi...
1556
  			} 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...
1557
1558
1559
  				my $type = $1;
  				$type =~ s/\s+/ /g;
  				possible($type, "A:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1560
  			# definitions in global scope can only start with types
a6a840628   Andy Whitcroft   checkpatch: label...
1561
  			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1562
  				possible($1, "B:" . $s);
c2fdda0df   Andy Whitcroft   update checkpatch...
1563
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1564
1565
  
  			# any (foo ... *) is a pointer cast, and foo is a type
65863862b   Andy Whitcroft   checkpatch: dissa...
1566
  			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1567
  				possible($1, "C:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1568
1569
1570
1571
1572
  			}
  
  			# Check for any sort of function declaration.
  			# int foo(something bar, other baz);
  			# void (*store_gdt)(x86_descr_ptr *);
171ae1a49   Andy Whitcroft   update checkpatch...
1573
  			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...
1574
  				my ($name_len) = length($1);
8905a67c6   Andy Whitcroft   update checkpatch...
1575

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

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

c45dcabd2   Andy Whitcroft   update checkpatch...
1583
  						possible($1, "D:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1584
1585
  					}
  				}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1586
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1587

9c0ca6f9a   Andy Whitcroft   update checkpatch...
1588
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1589
1590
1591
  #
  # Checks which may be anchored in the context.
  #
00df344fd   Andy Whitcroft   update checkpatch...
1592

653d4876b   Andy Whitcroft   update checkpatch...
1593
1594
  # Check for switch () and associated case and default
  # statements should be at the same indent.
00df344fd   Andy Whitcroft   update checkpatch...
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
  		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...
1613
1614
  				ERROR("switch and case should be at the same indent
  $hereline$err");
de7d4f0e1   Andy Whitcroft   update checkpatch...
1615
1616
1617
1618
1619
  			}
  		}
  
  # 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...
1620
  		if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
773647a09   Andy Whitcroft   update checkpatch...
1621
  			my $pre_ctx = "$1$2";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1622
  			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1623
1624
1625
  			my $ctx_cnt = $realcnt - $#ctx - 1;
  			my $ctx = join("
  ", @ctx);
548596d52   Andy Whitcroft   checkpatch: trail...
1626
1627
  			my $ctx_ln = $linenr;
  			my $ctx_skip = $realcnt;
773647a09   Andy Whitcroft   update checkpatch...
1628

548596d52   Andy Whitcroft   checkpatch: trail...
1629
1630
1631
1632
1633
1634
  			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...
1635
  				$ctx_ln++;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1636
  			}
548596d52   Andy Whitcroft   checkpatch: trail...
1637

53210168f   Andy Whitcroft   checkpatch: tough...
1638
1639
1640
1641
1642
1643
1644
  			#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...
1645

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

f0a594c1c   Andy Whitcroft   update checkpatch...
1802
  # check for initialisation to aggregates open brace on the next line
99423c206   Andy Whitcroft   checkpatch: fix _...
1803
1804
  		if ($line =~ /^.\s*{/ &&
  		    $prevline =~ /(?:^|[^=])=\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
1805
1806
  			ERROR("that open brace { should be on the previous line
  " . $hereprev);
f0a594c1c   Andy Whitcroft   update checkpatch...
1807
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1808
1809
1810
1811
1812
  #
  # Checks which are anchored on the added line.
  #
  
  # check for malformed paths in #include statements (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
1813
  		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876b   Andy Whitcroft   update checkpatch...
1814
1815
  			my $path = $1;
  			if ($path =~ m{//}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1816
1817
1818
  				ERROR("malformed #include filename
  " .
  					$herecurr);
653d4876b   Andy Whitcroft   update checkpatch...
1819
  			}
653d4876b   Andy Whitcroft   update checkpatch...
1820
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1821

0a920b5b6   Andy Whitcroft   add a trivial pat...
1822
  # no C99 // comments
00df344fd   Andy Whitcroft   update checkpatch...
1823
  		if ($line =~ m{//}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1824
1825
  			ERROR("do not use C99 // comments
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1826
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1827
  		# Remove C99 comments.
0a920b5b6   Andy Whitcroft   add a trivial pat...
1828
  		$line =~ s@//.*@@;
6c72ffaab   Andy Whitcroft   update checkpatch...
1829
  		$opline =~ s@//.*@@;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1830

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1831
1832
1833
1834
1835
1836
1837
1838
1839
  # EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
  # the whole statement.
  #print "APW <$lines[$realline_next - 1]>
  ";
  		if (defined $realline_next &&
  		    exists $lines[$realline_next - 1] &&
  		    !defined $suppress_export{$realline_next} &&
  		    ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
  		     $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
653d4876b   Andy Whitcroft   update checkpatch...
1840
  			my $name = $1;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1841
1842
1843
  			if ($stat !~ /(?:
  				
  .}\s*$|
480120586   Andy Whitcroft   checkpatch: DEFIN...
1844
1845
1846
  				^.DEFINE_$Ident\(\Q$name\E\)|
  				^.DECLARE_$Ident\(\Q$name\E\)|
  				^.LIST_HEAD\(\Q$name\E\)|
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1847
1848
  				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
  				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
480120586   Andy Whitcroft   checkpatch: DEFIN...
1849
  			    )/x) {
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1850
1851
1852
1853
1854
  #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...
1855
1856
  			}
  		}
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
  		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...
1870

5150bda43   Joe Eloff   checkpatch: chang...
1871
  # check for global initialisers.
c45dcabd2   Andy Whitcroft   update checkpatch...
1872
  		if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) {
5150bda43   Joe Eloff   checkpatch: chang...
1873
1874
  			ERROR("do not initialise globals to 0 or NULL
  " .
f0a594c1c   Andy Whitcroft   update checkpatch...
1875
1876
  				$herecurr);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1877
  # check for static initialisers.
2d1bafd79   Andy Whitcroft   checkpatch: do no...
1878
  		if ($line =~ /\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1879
1880
1881
  			ERROR("do not initialise statics to 0 or NULL
  " .
  				$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1882
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1883
1884
1885
  # check for new typedefs, only function parameters and sparse annotations
  # make sense.
  		if ($line =~ /\btypedef\s/ &&
8054576dc   Andy Whitcroft   checkpatch: loose...
1886
  		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
1887
  		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
1888
  		    $line !~ /\b$typeTypedefs\b/ &&
653d4876b   Andy Whitcroft   update checkpatch...
1889
  		    $line !~ /\b__bitwise(?:__|)\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1890
1891
  			WARN("do not add new typedefs
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1892
1893
1894
  		}
  
  # * goes on variable not on type
65863862b   Andy Whitcroft   checkpatch: dissa...
1895
  		# (char*[ const])
00ef4ece0   Andy Whitcroft   checkpatch: corre...
1896
  		if ($line =~ m{\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\)}) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1897
1898
1899
1900
1901
1902
1903
  			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/...
1904
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1905
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
1906

65863862b   Andy Whitcroft   checkpatch: dissa...
1907
1908
1909
1910
1911
1912
  			#print "from<$from> to<$to>
  ";
  			if ($from ne $to) {
  				ERROR("\"(foo$from)\" should be \"(foo$to)\"
  " .  $herecurr);
  			}
00ef4ece0   Andy Whitcroft   checkpatch: corre...
1913
  		} elsif ($line =~ m{\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident)}) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1914
1915
1916
1917
1918
1919
1920
  			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/...
1921
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1922
1923
1924
  			}
  			# Modifiers should have spaces.
  			$to =~ s/(\b$Modifier$)/$1 /;
d8aaf1214   Andy Whitcroft   update checkpatch...
1925

667026e7b   Andy Whitcroft   checkpatch: a mod...
1926
1927
1928
  			#print "from<$from> to<$to> ident<$ident>
  ";
  			if ($from ne $to && $ident !~ /^$Modifier$/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
1929
1930
1931
  				ERROR("\"foo${from}bar\" should be \"foo${to}bar\"
  " .  $herecurr);
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1932
1933
1934
1935
1936
1937
1938
1939
1940
  		}
  
  # # 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...
1941
  		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1942
1943
  			WARN("LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
1944
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1945
1946
1947
1948
1949
  # printk should use KERN_* levels.  Note that follow on printk's on the
  # same line do not need a level, so we use the current block context
  # to try and find and validate the current printk.  In summary the current
  # printk includes all preceeding printk's which have no newline on the end.
  # we assume the first bad printk is the one to report.
f0a594c1c   Andy Whitcroft   update checkpatch...
1950
  		if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
00df344fd   Andy Whitcroft   update checkpatch...
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
  			my $ok = 0;
  			for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
  				#print "CHECK<$lines[$ln - 1]
  ";
  				# we have a preceeding printk if it ends
  				# with "
  " ignore it, else it is to blame
  				if ($lines[$ln - 1] =~ m{\bprintk\(}) {
  					if ($rawlines[$ln - 1] !~ m{\
  "}) {
  						$ok = 1;
  					}
  					last;
  				}
  			}
  			if ($ok == 0) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1967
1968
  				WARN("printk() should include KERN_ facility level
  " . $herecurr);
00df344fd   Andy Whitcroft   update checkpatch...
1969
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1970
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1971
1972
  # 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...
1973
1974
  		if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and
  		    !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1975
1976
  			ERROR("open brace '{' following function declarations go on the next line
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1977
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1978

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

0a920b5b6   Andy Whitcroft   add a trivial pat...
2059
  				my $op = $elements[$n + 1];
4a0df2ef4   Andy Whitcroft   update checkpatch...
2060
2061
  
  				my $c = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2062
  				if (defined $elements[$n + 2]) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2063
2064
  					$c = 'V' if ($elements[$n + 2] ne '');
  					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043d   Andy Whitcroft   update checkpatch...
2065
  					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2066
2067
  					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
  					$c = 'O' if ($elements[$n + 2] eq '');
8b1b33786   Andy Whitcroft   checkpatch: fix c...
2068
  					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2069
2070
  				} else {
  					$c = 'E';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2071
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2072
2073
2074
  				my $ctx = "${a}x${c}";
  
  				my $at = "(ctx:$ctx)";
6c72ffaab   Andy Whitcroft   update checkpatch...
2075
  				my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e1   Andy Whitcroft   update checkpatch...
2076
2077
  				my $hereptr = "$hereline$ptr
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2078

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

1f65f947a   Andy Whitcroft   checkpatch: add c...
2082
2083
  				# Get the full operator variant.
  				my $opv = $op . substr($curr_vars, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
2084
2085
2086
  				# Ignore operators passed as parameters.
  				if ($op_type ne 'V' &&
  				    $ca =~ /\s$/ && $cc =~ /^\s*,/) {
cf655043d   Andy Whitcroft   update checkpatch...
2087
2088
  #				# Ignore comments
  #				} elsif ($op =~ /^$;+$/) {
13214adf7   Andy Whitcroft   update checkpatch...
2089

d8aaf1214   Andy Whitcroft   update checkpatch...
2090
  				# ; should have either the end of line or a space or \ after it
13214adf7   Andy Whitcroft   update checkpatch...
2091
  				} elsif ($op eq ';') {
cf655043d   Andy Whitcroft   update checkpatch...
2092
2093
  					if ($ctx !~ /.x[WEBC]/ &&
  					    $cc !~ /^\\/ && $cc !~ /^;/) {
773647a09   Andy Whitcroft   update checkpatch...
2094
2095
  						ERROR("space required after that '$op' $at
  " . $hereptr);
d8aaf1214   Andy Whitcroft   update checkpatch...
2096
2097
2098
2099
  					}
  
  				# // is a comment
  				} elsif ($op eq '//') {
0a920b5b6   Andy Whitcroft   add a trivial pat...
2100

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

773647a09   Andy Whitcroft   update checkpatch...
2155

0a920b5b6   Andy Whitcroft   add a trivial pat...
2156
  				# << and >> may either have or not have spaces both sides
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2157
2158
2159
  				} 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...
2160
2161
  					 $op eq '*' or $op eq '/' or
  					 $op eq '%')
0a920b5b6   Andy Whitcroft   add a trivial pat...
2162
  				{
773647a09   Andy Whitcroft   update checkpatch...
2163
  					if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2164
2165
2166
  						ERROR("need consistent spacing around '$op' $at
  " .
  							$hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2167
  					}
1f65f947a   Andy Whitcroft   checkpatch: add c...
2168
2169
2170
2171
2172
2173
2174
  				# 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...
2175
  				# All the others need spaces both sides.
cf655043d   Andy Whitcroft   update checkpatch...
2176
  				} elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947a   Andy Whitcroft   checkpatch: add c...
2177
  					my $ok = 0;
22f2a2ef9   Andy Whitcroft   update checkpatch...
2178
  					# Ignore email addresses <foo@bar>
1f65f947a   Andy Whitcroft   checkpatch: add c...
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
  					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...
2194
2195
  						ERROR("spaces required around that '$op' $at
  " . $hereptr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2196
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2197
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2198
  				$off += length($elements[$n + 1]);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2199
2200
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2201
2202
  # check for multiple assignments
  		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
6c72ffaab   Andy Whitcroft   update checkpatch...
2203
2204
  			CHK("multiple assignments should be avoided
  " . $herecurr);
f0a594c1c   Andy Whitcroft   update checkpatch...
2205
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
  ## # 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...
2221

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

b53c8e104   Andy Whitcroft   checkpatch: ensur...
2317
  			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2318
2319
  				ERROR("do not use assignment in if condition
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
2320
2321
2322
2323
  			}
  
  			# Find out what is on the end of the line after the
  			# conditional.
773647a09   Andy Whitcroft   update checkpatch...
2324
  			substr($s, 0, length($c), '');
8905a67c6   Andy Whitcroft   update checkpatch...
2325
2326
  			$s =~ s/
  .*//g;
13214adf7   Andy Whitcroft   update checkpatch...
2327
  			$s =~ s/$;//g; 	# Remove any comments
53210168f   Andy Whitcroft   checkpatch: tough...
2328
2329
  			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
  			    $c !~ /}\s*while\s*/)
773647a09   Andy Whitcroft   update checkpatch...
2330
  			{
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2331
2332
2333
2334
  				# Find out how long the conditional actually is.
  				my @newlines = ($c =~ /
  /gs);
  				my $cond_lines = 1 + $#newlines;
42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
2335
  				my $stat_real = '';
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2336

42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
2337
2338
2339
  				$stat_real = raw_line($linenr, $cond_lines)
  							. "
  " if ($cond_lines);
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2340
2341
2342
2343
2344
2345
2346
  				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...
2347
2348
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
  # 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...
2364
  # if and else should not have general statements after it
13214adf7   Andy Whitcroft   update checkpatch...
2365
2366
2367
2368
2369
2370
2371
  		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...
2372
  		}
396677823   Andy Whitcroft   checkpatch: if sh...
2373
2374
2375
2376
2377
2378
  # 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/...
2379
2380
2381
  # 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...
2382
  			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf80   Andy Whitcroft   checkpatch: case/...
2383
2384
2385
2386
2387
2388
  			\s*return\s+
  		    )/xg)
  		{
  			ERROR("trailing statements should be on next line
  " . $herecurr);
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2389
2390
2391
2392
2393
  
  		# 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...
2394
2395
  			ERROR("else should follow close brace '}'
  " . $hereprev);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2396
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
2397
2398
2399
2400
2401
2402
  		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...
2403
  			substr($s, 0, length($c), '');
c2fdda0df   Andy Whitcroft   update checkpatch...
2404
2405
2406
2407
2408
2409
2410
2411
  			$s =~ s/
  .*//g;
  
  			if ($s =~ /^\s*;/) {
  				ERROR("while should follow close brace '}'
  " . $hereprev);
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2412
2413
2414
2415
2416
2417
2418
2419
2420
  #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...
2421
  		if ($line=~/\#\s*define.*\\\s$/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2422
2423
  			WARN("Whitepspace after \\ makes next lines useless
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2424
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2425
  #warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
2426
  		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec483   Andy Whitcroft   checkpatch: reduc...
2427
2428
2429
2430
  			my $file = "$1.h";
  			my $checkfile = "include/linux/$file";
  			if (-f "$root/$checkfile" &&
  			    $realfile ne $checkfile &&
7840a94cd   Wolfram Sang   checkpatch: refac...
2431
  			    $1 !~ /$allowed_asm_includes/)
c45dcabd2   Andy Whitcroft   update checkpatch...
2432
  			{
e09dec483   Andy Whitcroft   checkpatch: reduc...
2433
2434
2435
2436
2437
2438
2439
  				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...
2440
2441
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2442
2443
  # 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...
2444
  # in a known good container
b8f96a31f   Andy Whitcroft   checkpatch: macro...
2445
2446
  		if ($realfile !~ m@/vmlinux.lds.h$@ &&
  		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf1214   Andy Whitcroft   update checkpatch...
2447
2448
  			my $ln = $linenr;
  			my $cnt = $realcnt;
c45dcabd2   Andy Whitcroft   update checkpatch...
2449
2450
  			my ($off, $dstat, $dcond, $rest);
  			my $ctx = '';
653d4876b   Andy Whitcroft   update checkpatch...
2451

c45dcabd2   Andy Whitcroft   update checkpatch...
2452
2453
2454
2455
2456
2457
2458
2459
2460
  			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...
2461
  				$cnt-- if ($lines[$ln - 1] !~ /^-/);
c45dcabd2   Andy Whitcroft   update checkpatch...
2462
  				$ln++;
c45dcabd2   Andy Whitcroft   update checkpatch...
2463
2464
2465
2466
2467
2468
2469
  			}
  			$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...
2470
2471
  			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
2472
2473
2474
2475
  
  			# Extract the remainder of the define (if any) and
  			# rip off surrounding spaces, and trailing \'s.
  			$rest = '';
636d140a8   Andy Whitcroft   checkpatch: compl...
2476
2477
2478
  			while ($off != 0 || ($cnt > 0 && $rest =~ /\\\s*$/)) {
  				#print "ADDING cnt<$cnt> $off <" . substr($lines[$ln - 1], $off) . "> rest<$rest>
  ";
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
2479
2480
2481
2482
2483
  				if ($off != 0 || $lines[$ln - 1] !~ /^-/) {
  					$rest .= substr($lines[$ln - 1], $off) . "
  ";
  					$cnt--;
  				}
c45dcabd2   Andy Whitcroft   update checkpatch...
2484
  				$ln++;
c45dcabd2   Andy Whitcroft   update checkpatch...
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
  				$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...
2497
  			}
292f1a9b3   Andy Whitcroft   checkpatch: compl...
2498
  			$dstat =~ s/$;//g;
c45dcabd2   Andy Whitcroft   update checkpatch...
2499
2500
2501
2502
  			$dstat =~ s/\\
  .//g;
  			$dstat =~ s/^\s*//s;
  			$dstat =~ s/\s*$//s;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2503

c45dcabd2   Andy Whitcroft   update checkpatch...
2504
  			# Flatten any parentheses and braces
bf30d6ede   Andy Whitcroft   checkpatch: compl...
2505
2506
2507
2508
  			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
  			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
  			       $dstat =~ s/\[[^\{\}]*\]/1/)
  			{
de7d4f0e1   Andy Whitcroft   update checkpatch...
2509
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
2510

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

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

1a15a2508   Patrick Pannuto   checkpatch: prefe...
2726
2727
2728
2729
2730
2731
2732
2733
  # 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 ...
2734
2735
2736
2737
2738
2739
2740
  # 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...
2741
  # warn about #ifdefs in C files
c45dcabd2   Andy Whitcroft   update checkpatch...
2742
  #		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344fd   Andy Whitcroft   update checkpatch...
2743
2744
2745
2746
2747
  #			print "#ifdef in C files should be avoided
  ";
  #			print "$herecurr";
  #			$clean = 0;
  #		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2748
  # warn about spacing in #ifdefs
c45dcabd2   Andy Whitcroft   update checkpatch...
2749
  		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
22f2a2ef9   Andy Whitcroft   update checkpatch...
2750
2751
2752
  			ERROR("exactly one space required after that #$1
  " . $herecurr);
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2753
  # check for spinlock_t definitions without a comment.
171ae1a49   Andy Whitcroft   update checkpatch...
2754
2755
  		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
  		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2756
2757
  			my $which = $1;
  			if (!ctx_has_comment($first_line, $linenr)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2758
2759
  				CHK("$1 definition without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2760
2761
2762
2763
2764
  			}
  		}
  # 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...
2765
2766
  				CHK("memory barrier without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2767
2768
2769
  			}
  		}
  # check of hardware specific defines
c45dcabd2   Andy Whitcroft   update checkpatch...
2770
  		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2771
2772
  			CHK("architecture specific defines should be avoided
  " .  $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2773
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2774

d4977c78e   Tobias Klauser   checkpatch: warn ...
2775
2776
2777
2778
2779
  # 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...
2780
2781
  # check the location of the inline attribute, that it is between
  # storage class and type.
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2782
2783
  		if ($line =~ /\b$Type\s+$Inline\b/ ||
  		    $line =~ /\b$Inline\s+$Storage\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2784
2785
2786
  			ERROR("inline keyword should sit between storage class and type
  " . $herecurr);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
2787
2788
2789
2790
2791
  # Check for __inline__ and __inline, prefer inline
  		if ($line =~ /\b(__inline__|__inline)\b/) {
  			WARN("plain inline is preferred over $1
  " . $herecurr);
  		}
8f53a9b80   Joe Perches   scripts/checkpatc...
2792
2793
2794
2795
2796
  # check for sizeof(&)
  		if ($line =~ /\bsizeof\s*\(\s*\&/) {
  			WARN("sizeof(& should be avoided
  " . $herecurr);
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
2797
  # check for new externs in .c files.
171ae1a49   Andy Whitcroft   update checkpatch...
2798
  		if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2799
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a49   Andy Whitcroft   update checkpatch...
2800
  		{
c45dcabd2   Andy Whitcroft   update checkpatch...
2801
2802
  			my $function_name = $1;
  			my $paren_space = $2;
171ae1a49   Andy Whitcroft   update checkpatch...
2803
2804
2805
2806
2807
  
  			my $s = $stat;
  			if (defined $cond) {
  				substr($s, 0, length($cond), '');
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
2808
2809
2810
  			if ($s =~ /^\s*;/ &&
  			    $function_name ne 'uninitialized_var')
  			{
171ae1a49   Andy Whitcroft   update checkpatch...
2811
2812
2813
2814
2815
2816
2817
2818
2819
  				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...
2820
2821
2822
2823
2824
2825
  
  		} elsif ($realfile =~ /\.c$/ && defined $stat &&
  		    $stat =~ /^.\s*extern\s+/)
  		{
  			WARN("externs should be avoided in .c files
  " .  $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
  		}
  
  # 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...
2836
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2837
2838
2839
2840
2841
2842
  
  # check for pointless casting of kmalloc return
  		if ($line =~ /\*\s*\)\s*k[czm]alloc\b/) {
  			WARN("unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html
  " . $herecurr);
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2843
2844
2845
2846
2847
2848
  
  # check for gcc specific __FUNCTION__
  		if ($line =~ /__FUNCTION__/) {
  			WARN("__func__ should be used instead of gcc specific __FUNCTION__
  "  . $herecurr);
  		}
773647a09   Andy Whitcroft   update checkpatch...
2849
2850
  
  # check for semaphores used as mutexes
171ae1a49   Andy Whitcroft   update checkpatch...
2851
  		if ($line =~ /^.\s*(DECLARE_MUTEX|init_MUTEX)\s*\(/) {
773647a09   Andy Whitcroft   update checkpatch...
2852
2853
2854
2855
  			WARN("mutexes are preferred for single holder semaphores
  " . $herecurr);
  		}
  # check for semaphores used as mutexes
171ae1a49   Andy Whitcroft   update checkpatch...
2856
  		if ($line =~ /^.\s*init_MUTEX_LOCKED\s*\(/) {
773647a09   Andy Whitcroft   update checkpatch...
2857
2858
  			WARN("consider using a completion
  " . $herecurr);
1704f47b5   Peter Zijlstra   lockdep: Add nova...
2859

773647a09   Andy Whitcroft   update checkpatch...
2860
2861
2862
2863
2864
2865
  		}
  # recommend strict_strto* over simple_strto*
  		if ($line =~ /\bsimple_(strto.*?)\s*\(/) {
  			WARN("consider using strict_$1 in preference to simple_$1
  " . $herecurr);
  		}
f3db6639f   Michael Ellerman   checkpatch: add a...
2866
2867
2868
2869
2870
  # 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...
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
  # 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...
2909
  		if ($line !~ /\bconst\b/ &&
79404849e   Emese Revfy   checkpatch.pl: ex...
2910
  		    $line =~ /\bstruct\s+($struct_ops)\b/) {
6903ffb22   Andy Whitcroft   checkpatch: struc...
2911
2912
2913
  			WARN("struct $1 should normally be const
  " .
  				$herecurr);
2b6db5cb6   Andy Whitcroft   checkpatch: struc...
2914
  		}
773647a09   Andy Whitcroft   update checkpatch...
2915
2916
2917
2918
  
  # 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...
2919
2920
  		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
  		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a49   Andy Whitcroft   update checkpatch...
2921
2922
2923
  		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a09   Andy Whitcroft   update checkpatch...
2924
2925
2926
2927
  		{
  			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...
2928
2929
2930
2931
2932
  
  # 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...
2933
  			$string =~ s/%%/__/g;
9c9ba34ee   Andy Whitcroft   update checkpatch...
2934
2935
2936
2937
2938
2939
  			if ($string =~ /(?<!%)%L[udi]/) {
  				WARN("\%Ld/%Lu are not-standard C, use %lld/%llu
  " . $herecurr);
  				last;
  			}
  		}
691d77b6b   Andy Whitcroft   checkpatch: add c...
2940
2941
2942
2943
2944
2945
  
  # 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 ...
2946
  			} elsif ($realfile !~ m@^kernel/@) {
691d77b6b   Andy Whitcroft   checkpatch: add c...
2947
2948
2949
2950
  				WARN("use of in_atomic() is incorrect outside core kernel code
  " . $herecurr);
  			}
  		}
1704f47b5   Peter Zijlstra   lockdep: Add nova...
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
  
  # check for lockdep_set_novalidate_class
  		if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
  		    $line =~ /__lockdep_no_validate__\s*\)/ ) {
  			if ($realfile !~ m@^kernel/lockdep@ &&
  			    $realfile !~ m@^include/linux/lockdep@ &&
  			    $realfile !~ m@^drivers/base/core@) {
  				ERROR("lockdep_no_validate class is reserved for device->mutex.
  " . $herecurr);
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2962
2963
2964
2965
2966
2967
  	}
  
  	# 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...
2968
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
  	# 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...
2982
2983
  		ERROR("Does not appear to be a unified-diff format patch
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
2984
2985
  	}
  	if ($is_patch && $chk_signoff && $signoff == 0) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2986
2987
  		ERROR("Missing Signed-off-by: line(s)
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
2988
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
2989
  	print report_dump();
13214adf7   Andy Whitcroft   update checkpatch...
2990
2991
  	if ($summary && !($clean == 1 && $quiet == 1)) {
  		print "$filename " if ($summary_file);
8905a67c6   Andy Whitcroft   update checkpatch...
2992
2993
2994
2995
2996
2997
  		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...
2998
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
2999

0a920b5b6   Andy Whitcroft   add a trivial pat...
3000
  	if ($clean == 1 && $quiet == 0) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3001
3002
  		print "$vname has no obvious style problems and is ready for submission.
  "
0a920b5b6   Andy Whitcroft   add a trivial pat...
3003
3004
  	}
  	if ($clean == 0 && $quiet == 0) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3005
3006
  		print "$vname has style problems, please review.  If any of these errors
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
3007
3008
3009
3010
3011
  		print "are false positives report them to the maintainer, see
  ";
  		print "CHECKPATCH in MAINTAINERS.
  ";
  	}
13214adf7   Andy Whitcroft   update checkpatch...
3012

0a920b5b6   Andy Whitcroft   add a trivial pat...
3013
3014
  	return $clean;
  }