xref: /openbmc/u-boot/scripts/checkpatch.pl (revision d8a1a304)
1dd88ab32SMasahiro Yamada#!/usr/bin/perl -w
2dd88ab32SMasahiro Yamada# (c) 2001, Dave Jones. (the file handling bit)
3dd88ab32SMasahiro Yamada# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
4dd88ab32SMasahiro Yamada# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
5dd88ab32SMasahiro Yamada# (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
6dd88ab32SMasahiro Yamada# Licensed under the terms of the GNU GPL License version 2
7dd88ab32SMasahiro Yamada
8dd88ab32SMasahiro Yamadause strict;
96b9709d9STom Riniuse POSIX;
10dd88ab32SMasahiro Yamada
11dd88ab32SMasahiro Yamadamy $P = $0;
12dd88ab32SMasahiro Yamada$P =~ s@.*/@@g;
13dd88ab32SMasahiro Yamada
14dd88ab32SMasahiro Yamadamy $V = '0.32';
15dd88ab32SMasahiro Yamada
16dd88ab32SMasahiro Yamadause Getopt::Long qw(:config no_auto_abbrev);
17dd88ab32SMasahiro Yamada
18dd88ab32SMasahiro Yamadamy $quiet = 0;
19dd88ab32SMasahiro Yamadamy $tree = 1;
20dd88ab32SMasahiro Yamadamy $chk_signoff = 1;
21dd88ab32SMasahiro Yamadamy $chk_patch = 1;
22dd88ab32SMasahiro Yamadamy $tst_only;
23dd88ab32SMasahiro Yamadamy $emacs = 0;
24dd88ab32SMasahiro Yamadamy $terse = 0;
25dd88ab32SMasahiro Yamadamy $file = 0;
26dd88ab32SMasahiro Yamadamy $check = 0;
27dd88ab32SMasahiro Yamadamy $summary = 1;
28dd88ab32SMasahiro Yamadamy $mailback = 0;
29dd88ab32SMasahiro Yamadamy $summary_file = 0;
30dd88ab32SMasahiro Yamadamy $show_types = 0;
316b9709d9STom Rinimy $fix = 0;
326b9709d9STom Rinimy $fix_inplace = 0;
33dd88ab32SMasahiro Yamadamy $root;
34dd88ab32SMasahiro Yamadamy %debug;
356b9709d9STom Rinimy %camelcase = ();
366b9709d9STom Rinimy %use_type = ();
376b9709d9STom Rinimy @use = ();
38dd88ab32SMasahiro Yamadamy %ignore_type = ();
39dd88ab32SMasahiro Yamadamy @ignore = ();
40dd88ab32SMasahiro Yamadamy $help = 0;
41dd88ab32SMasahiro Yamadamy $configuration_file = ".checkpatch.conf";
42dd88ab32SMasahiro Yamadamy $max_line_length = 80;
436b9709d9STom Rinimy $ignore_perl_version = 0;
446b9709d9STom Rinimy $minimum_perl_version = 5.10.0;
45dd88ab32SMasahiro Yamada
46dd88ab32SMasahiro Yamadasub help {
47dd88ab32SMasahiro Yamada	my ($exitcode) = @_;
48dd88ab32SMasahiro Yamada
49dd88ab32SMasahiro Yamada	print << "EOM";
50dd88ab32SMasahiro YamadaUsage: $P [OPTION]... [FILE]...
51dd88ab32SMasahiro YamadaVersion: $V
52dd88ab32SMasahiro Yamada
53dd88ab32SMasahiro YamadaOptions:
54dd88ab32SMasahiro Yamada  -q, --quiet                quiet
55dd88ab32SMasahiro Yamada  --no-tree                  run without a kernel tree
56dd88ab32SMasahiro Yamada  --no-signoff               do not check for 'Signed-off-by' line
57dd88ab32SMasahiro Yamada  --patch                    treat FILE as patchfile (default)
58dd88ab32SMasahiro Yamada  --emacs                    emacs compile window format
59dd88ab32SMasahiro Yamada  --terse                    one line per report
60dd88ab32SMasahiro Yamada  -f, --file                 treat FILE as regular source file
61dd88ab32SMasahiro Yamada  --subjective, --strict     enable more subjective tests
626b9709d9STom Rini  --types TYPE(,TYPE2...)    show only these comma separated message types
63dd88ab32SMasahiro Yamada  --ignore TYPE(,TYPE2...)   ignore various comma separated message types
64dd88ab32SMasahiro Yamada  --max-line-length=n        set the maximum line length, if exceeded, warn
65dd88ab32SMasahiro Yamada  --show-types               show the message "types" in the output
66dd88ab32SMasahiro Yamada  --root=PATH                PATH to the kernel tree root
67dd88ab32SMasahiro Yamada  --no-summary               suppress the per-file summary
68dd88ab32SMasahiro Yamada  --mailback                 only produce a report in case of warnings/errors
69dd88ab32SMasahiro Yamada  --summary-file             include the filename in summary
70dd88ab32SMasahiro Yamada  --debug KEY=[0|1]          turn on/off debugging of KEY, where KEY is one of
71dd88ab32SMasahiro Yamada                             'values', 'possible', 'type', and 'attr' (default
72dd88ab32SMasahiro Yamada                             is all off)
73dd88ab32SMasahiro Yamada  --test-only=WORD           report only warnings/errors containing WORD
74dd88ab32SMasahiro Yamada                             literally
756b9709d9STom Rini  --fix                      EXPERIMENTAL - may create horrible results
766b9709d9STom Rini                             If correctable single-line errors exist, create
776b9709d9STom Rini                             "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
786b9709d9STom Rini                             with potential errors corrected to the preferred
796b9709d9STom Rini                             checkpatch style
806b9709d9STom Rini  --fix-inplace              EXPERIMENTAL - may create horrible results
816b9709d9STom Rini                             Is the same as --fix, but overwrites the input
826b9709d9STom Rini                             file.  It's your fault if there's no backup or git
836b9709d9STom Rini  --ignore-perl-version      override checking of perl version.  expect
846b9709d9STom Rini                             runtime errors.
85dd88ab32SMasahiro Yamada  -h, --help, --version      display this help and exit
86dd88ab32SMasahiro Yamada
87dd88ab32SMasahiro YamadaWhen FILE is - read standard input.
88dd88ab32SMasahiro YamadaEOM
89dd88ab32SMasahiro Yamada
90dd88ab32SMasahiro Yamada	exit($exitcode);
91dd88ab32SMasahiro Yamada}
92dd88ab32SMasahiro Yamada
93dd88ab32SMasahiro Yamadamy $conf = which_conf($configuration_file);
94dd88ab32SMasahiro Yamadaif (-f $conf) {
95dd88ab32SMasahiro Yamada	my @conf_args;
96dd88ab32SMasahiro Yamada	open(my $conffile, '<', "$conf")
97dd88ab32SMasahiro Yamada	    or warn "$P: Can't find a readable $configuration_file file $!\n";
98dd88ab32SMasahiro Yamada
99dd88ab32SMasahiro Yamada	while (<$conffile>) {
100dd88ab32SMasahiro Yamada		my $line = $_;
101dd88ab32SMasahiro Yamada
102dd88ab32SMasahiro Yamada		$line =~ s/\s*\n?$//g;
103dd88ab32SMasahiro Yamada		$line =~ s/^\s*//g;
104dd88ab32SMasahiro Yamada		$line =~ s/\s+/ /g;
105dd88ab32SMasahiro Yamada
106dd88ab32SMasahiro Yamada		next if ($line =~ m/^\s*#/);
107dd88ab32SMasahiro Yamada		next if ($line =~ m/^\s*$/);
108dd88ab32SMasahiro Yamada
109dd88ab32SMasahiro Yamada		my @words = split(" ", $line);
110dd88ab32SMasahiro Yamada		foreach my $word (@words) {
111dd88ab32SMasahiro Yamada			last if ($word =~ m/^#/);
112dd88ab32SMasahiro Yamada			push (@conf_args, $word);
113dd88ab32SMasahiro Yamada		}
114dd88ab32SMasahiro Yamada	}
115dd88ab32SMasahiro Yamada	close($conffile);
116dd88ab32SMasahiro Yamada	unshift(@ARGV, @conf_args) if @conf_args;
117dd88ab32SMasahiro Yamada}
118dd88ab32SMasahiro Yamada
119dd88ab32SMasahiro YamadaGetOptions(
120dd88ab32SMasahiro Yamada	'q|quiet+'	=> \$quiet,
121dd88ab32SMasahiro Yamada	'tree!'		=> \$tree,
122dd88ab32SMasahiro Yamada	'signoff!'	=> \$chk_signoff,
123dd88ab32SMasahiro Yamada	'patch!'	=> \$chk_patch,
124dd88ab32SMasahiro Yamada	'emacs!'	=> \$emacs,
125dd88ab32SMasahiro Yamada	'terse!'	=> \$terse,
126dd88ab32SMasahiro Yamada	'f|file!'	=> \$file,
127dd88ab32SMasahiro Yamada	'subjective!'	=> \$check,
128dd88ab32SMasahiro Yamada	'strict!'	=> \$check,
129dd88ab32SMasahiro Yamada	'ignore=s'	=> \@ignore,
1306b9709d9STom Rini	'types=s'	=> \@use,
131dd88ab32SMasahiro Yamada	'show-types!'	=> \$show_types,
132dd88ab32SMasahiro Yamada	'max-line-length=i' => \$max_line_length,
133dd88ab32SMasahiro Yamada	'root=s'	=> \$root,
134dd88ab32SMasahiro Yamada	'summary!'	=> \$summary,
135dd88ab32SMasahiro Yamada	'mailback!'	=> \$mailback,
136dd88ab32SMasahiro Yamada	'summary-file!'	=> \$summary_file,
1376b9709d9STom Rini	'fix!'		=> \$fix,
1386b9709d9STom Rini	'fix-inplace!'	=> \$fix_inplace,
1396b9709d9STom Rini	'ignore-perl-version!' => \$ignore_perl_version,
140dd88ab32SMasahiro Yamada	'debug=s'	=> \%debug,
141dd88ab32SMasahiro Yamada	'test-only=s'	=> \$tst_only,
142dd88ab32SMasahiro Yamada	'h|help'	=> \$help,
143dd88ab32SMasahiro Yamada	'version'	=> \$help
144dd88ab32SMasahiro Yamada) or help(1);
145dd88ab32SMasahiro Yamada
146dd88ab32SMasahiro Yamadahelp(0) if ($help);
147dd88ab32SMasahiro Yamada
1486b9709d9STom Rini$fix = 1 if ($fix_inplace);
1496b9709d9STom Rini
150dd88ab32SMasahiro Yamadamy $exit = 0;
151dd88ab32SMasahiro Yamada
1526b9709d9STom Riniif ($^V && $^V lt $minimum_perl_version) {
1536b9709d9STom Rini	printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
1546b9709d9STom Rini	if (!$ignore_perl_version) {
1556b9709d9STom Rini		exit(1);
1566b9709d9STom Rini	}
1576b9709d9STom Rini}
1586b9709d9STom Rini
159dd88ab32SMasahiro Yamadaif ($#ARGV < 0) {
160dd88ab32SMasahiro Yamada	print "$P: no input files\n";
161dd88ab32SMasahiro Yamada	exit(1);
162dd88ab32SMasahiro Yamada}
163dd88ab32SMasahiro Yamada
1646b9709d9STom Rinisub hash_save_array_words {
1656b9709d9STom Rini	my ($hashRef, $arrayRef) = @_;
1666b9709d9STom Rini
1676b9709d9STom Rini	my @array = split(/,/, join(',', @$arrayRef));
1686b9709d9STom Rini	foreach my $word (@array) {
169dd88ab32SMasahiro Yamada		$word =~ s/\s*\n?$//g;
170dd88ab32SMasahiro Yamada		$word =~ s/^\s*//g;
171dd88ab32SMasahiro Yamada		$word =~ s/\s+/ /g;
172dd88ab32SMasahiro Yamada		$word =~ tr/[a-z]/[A-Z]/;
173dd88ab32SMasahiro Yamada
174dd88ab32SMasahiro Yamada		next if ($word =~ m/^\s*#/);
175dd88ab32SMasahiro Yamada		next if ($word =~ m/^\s*$/);
176dd88ab32SMasahiro Yamada
1776b9709d9STom Rini		$hashRef->{$word}++;
178dd88ab32SMasahiro Yamada	}
1796b9709d9STom Rini}
1806b9709d9STom Rini
1816b9709d9STom Rinisub hash_show_words {
1826b9709d9STom Rini	my ($hashRef, $prefix) = @_;
1836b9709d9STom Rini
1846b9709d9STom Rini	if ($quiet == 0 && keys %$hashRef) {
1856b9709d9STom Rini		print "NOTE: $prefix message types:";
1866b9709d9STom Rini		foreach my $word (sort keys %$hashRef) {
1876b9709d9STom Rini			print " $word";
1886b9709d9STom Rini		}
1896b9709d9STom Rini		print "\n\n";
1906b9709d9STom Rini	}
1916b9709d9STom Rini}
1926b9709d9STom Rini
1936b9709d9STom Rinihash_save_array_words(\%ignore_type, \@ignore);
1946b9709d9STom Rinihash_save_array_words(\%use_type, \@use);
195dd88ab32SMasahiro Yamada
196dd88ab32SMasahiro Yamadamy $dbg_values = 0;
197dd88ab32SMasahiro Yamadamy $dbg_possible = 0;
198dd88ab32SMasahiro Yamadamy $dbg_type = 0;
199dd88ab32SMasahiro Yamadamy $dbg_attr = 0;
200dd88ab32SMasahiro Yamadafor my $key (keys %debug) {
201dd88ab32SMasahiro Yamada	## no critic
202dd88ab32SMasahiro Yamada	eval "\${dbg_$key} = '$debug{$key}';";
203dd88ab32SMasahiro Yamada	die "$@" if ($@);
204dd88ab32SMasahiro Yamada}
205dd88ab32SMasahiro Yamada
206dd88ab32SMasahiro Yamadamy $rpt_cleaners = 0;
207dd88ab32SMasahiro Yamada
208dd88ab32SMasahiro Yamadaif ($terse) {
209dd88ab32SMasahiro Yamada	$emacs = 1;
210dd88ab32SMasahiro Yamada	$quiet++;
211dd88ab32SMasahiro Yamada}
212dd88ab32SMasahiro Yamada
213dd88ab32SMasahiro Yamadaif ($tree) {
214dd88ab32SMasahiro Yamada	if (defined $root) {
215dd88ab32SMasahiro Yamada		if (!top_of_kernel_tree($root)) {
216dd88ab32SMasahiro Yamada			die "$P: $root: --root does not point at a valid tree\n";
217dd88ab32SMasahiro Yamada		}
218dd88ab32SMasahiro Yamada	} else {
219dd88ab32SMasahiro Yamada		if (top_of_kernel_tree('.')) {
220dd88ab32SMasahiro Yamada			$root = '.';
221dd88ab32SMasahiro Yamada		} elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
222dd88ab32SMasahiro Yamada						top_of_kernel_tree($1)) {
223dd88ab32SMasahiro Yamada			$root = $1;
224dd88ab32SMasahiro Yamada		}
225dd88ab32SMasahiro Yamada	}
226dd88ab32SMasahiro Yamada
227dd88ab32SMasahiro Yamada	if (!defined $root) {
228dd88ab32SMasahiro Yamada		print "Must be run from the top-level dir. of a kernel tree\n";
229dd88ab32SMasahiro Yamada		exit(2);
230dd88ab32SMasahiro Yamada	}
231dd88ab32SMasahiro Yamada}
232dd88ab32SMasahiro Yamada
233dd88ab32SMasahiro Yamadamy $emitted_corrupt = 0;
234dd88ab32SMasahiro Yamada
235dd88ab32SMasahiro Yamadaour $Ident	= qr{
236dd88ab32SMasahiro Yamada			[A-Za-z_][A-Za-z\d_]*
237dd88ab32SMasahiro Yamada			(?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
238dd88ab32SMasahiro Yamada		}x;
239dd88ab32SMasahiro Yamadaour $Storage	= qr{extern|static|asmlinkage};
240dd88ab32SMasahiro Yamadaour $Sparse	= qr{
241dd88ab32SMasahiro Yamada			__user|
242dd88ab32SMasahiro Yamada			__kernel|
243dd88ab32SMasahiro Yamada			__force|
244dd88ab32SMasahiro Yamada			__iomem|
245dd88ab32SMasahiro Yamada			__must_check|
246dd88ab32SMasahiro Yamada			__init_refok|
247dd88ab32SMasahiro Yamada			__kprobes|
248dd88ab32SMasahiro Yamada			__ref|
249dd88ab32SMasahiro Yamada			__rcu
250dd88ab32SMasahiro Yamada		}x;
2516b9709d9STom Riniour $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
2526b9709d9STom Riniour $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
2536b9709d9STom Riniour $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
2546b9709d9STom Riniour $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
2556b9709d9STom Riniour $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
256dd88ab32SMasahiro Yamada
257dd88ab32SMasahiro Yamada# Notes to $Attribute:
258dd88ab32SMasahiro Yamada# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
259dd88ab32SMasahiro Yamadaour $Attribute	= qr{
260dd88ab32SMasahiro Yamada			const|
261dd88ab32SMasahiro Yamada			__percpu|
262dd88ab32SMasahiro Yamada			__nocast|
263dd88ab32SMasahiro Yamada			__safe|
264dd88ab32SMasahiro Yamada			__bitwise__|
265dd88ab32SMasahiro Yamada			__packed__|
266dd88ab32SMasahiro Yamada			__packed2__|
267dd88ab32SMasahiro Yamada			__naked|
268dd88ab32SMasahiro Yamada			__maybe_unused|
269dd88ab32SMasahiro Yamada			__always_unused|
270dd88ab32SMasahiro Yamada			__noreturn|
271dd88ab32SMasahiro Yamada			__used|
272dd88ab32SMasahiro Yamada			__cold|
273dd88ab32SMasahiro Yamada			__noclone|
274dd88ab32SMasahiro Yamada			__deprecated|
275dd88ab32SMasahiro Yamada			__read_mostly|
276dd88ab32SMasahiro Yamada			__kprobes|
2776b9709d9STom Rini			$InitAttribute|
278dd88ab32SMasahiro Yamada			____cacheline_aligned|
279dd88ab32SMasahiro Yamada			____cacheline_aligned_in_smp|
280dd88ab32SMasahiro Yamada			____cacheline_internodealigned_in_smp|
281dd88ab32SMasahiro Yamada			__weak
282dd88ab32SMasahiro Yamada		  }x;
283dd88ab32SMasahiro Yamadaour $Modifier;
284dd88ab32SMasahiro Yamadaour $Inline	= qr{inline|__always_inline|noinline};
285dd88ab32SMasahiro Yamadaour $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
286dd88ab32SMasahiro Yamadaour $Lval	= qr{$Ident(?:$Member)*};
287dd88ab32SMasahiro Yamada
2886b9709d9STom Riniour $Int_type	= qr{(?i)llu|ull|ll|lu|ul|l|u};
2896b9709d9STom Riniour $Binary	= qr{(?i)0b[01]+$Int_type?};
2906b9709d9STom Riniour $Hex	= qr{(?i)0x[0-9a-f]+$Int_type?};
2916b9709d9STom Riniour $Int	= qr{[0-9]+$Int_type?};
292dd88ab32SMasahiro Yamadaour $Float_hex	= qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
293dd88ab32SMasahiro Yamadaour $Float_dec	= qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
294dd88ab32SMasahiro Yamadaour $Float_int	= qr{(?i)[0-9]+e-?[0-9]+[fl]?};
295dd88ab32SMasahiro Yamadaour $Float	= qr{$Float_hex|$Float_dec|$Float_int};
2966b9709d9STom Riniour $Constant	= qr{$Float|$Binary|$Hex|$Int};
297dd88ab32SMasahiro Yamadaour $Assignment	= qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
298dd88ab32SMasahiro Yamadaour $Compare    = qr{<=|>=|==|!=|<|>};
2996b9709d9STom Riniour $Arithmetic = qr{\+|-|\*|\/|%};
300dd88ab32SMasahiro Yamadaour $Operators	= qr{
301dd88ab32SMasahiro Yamada			<=|>=|==|!=|
302dd88ab32SMasahiro Yamada			=>|->|<<|>>|<|>|!|~|
3036b9709d9STom Rini			&&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
304dd88ab32SMasahiro Yamada		  }x;
305dd88ab32SMasahiro Yamada
306dd88ab32SMasahiro Yamadaour $NonptrType;
3076b9709d9STom Riniour $NonptrTypeWithAttr;
308dd88ab32SMasahiro Yamadaour $Type;
309dd88ab32SMasahiro Yamadaour $Declare;
310dd88ab32SMasahiro Yamada
311dd88ab32SMasahiro Yamadaour $NON_ASCII_UTF8	= qr{
312dd88ab32SMasahiro Yamada	[\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
313dd88ab32SMasahiro Yamada	|  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
314dd88ab32SMasahiro Yamada	| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
315dd88ab32SMasahiro Yamada	|  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
316dd88ab32SMasahiro Yamada	|  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
317dd88ab32SMasahiro Yamada	| [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
318dd88ab32SMasahiro Yamada	|  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
319dd88ab32SMasahiro Yamada}x;
320dd88ab32SMasahiro Yamada
321dd88ab32SMasahiro Yamadaour $UTF8	= qr{
322dd88ab32SMasahiro Yamada	[\x09\x0A\x0D\x20-\x7E]              # ASCII
323dd88ab32SMasahiro Yamada	| $NON_ASCII_UTF8
324dd88ab32SMasahiro Yamada}x;
325dd88ab32SMasahiro Yamada
326dd88ab32SMasahiro Yamadaour $typeTypedefs = qr{(?x:
327dd88ab32SMasahiro Yamada	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
328dd88ab32SMasahiro Yamada	atomic_t
329dd88ab32SMasahiro Yamada)};
330dd88ab32SMasahiro Yamada
331dd88ab32SMasahiro Yamadaour $logFunctions = qr{(?x:
332dd88ab32SMasahiro Yamada	printk(?:_ratelimited|_once|)|
3336b9709d9STom Rini	(?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
334dd88ab32SMasahiro Yamada	WARN(?:_RATELIMIT|_ONCE|)|
335dd88ab32SMasahiro Yamada	panic|
336dd88ab32SMasahiro Yamada	debug|
337dd88ab32SMasahiro Yamada	printf|
3386b9709d9STom Rini	puts|
3396b9709d9STom Rini	MODULE_[A-Z_]+|
3406b9709d9STom Rini	seq_vprintf|seq_printf|seq_puts
341dd88ab32SMasahiro Yamada)};
342dd88ab32SMasahiro Yamada
343dd88ab32SMasahiro Yamadaour $signature_tags = qr{(?xi:
344dd88ab32SMasahiro Yamada	Signed-off-by:|
345dd88ab32SMasahiro Yamada	Acked-by:|
346dd88ab32SMasahiro Yamada	Tested-by:|
347dd88ab32SMasahiro Yamada	Reviewed-by:|
348dd88ab32SMasahiro Yamada	Reported-by:|
3496b9709d9STom Rini	Suggested-by:|
350dd88ab32SMasahiro Yamada	To:|
351dd88ab32SMasahiro Yamada	Cc:
352dd88ab32SMasahiro Yamada)};
353dd88ab32SMasahiro Yamada
354dd88ab32SMasahiro Yamadaour @typeList = (
355dd88ab32SMasahiro Yamada	qr{void},
356dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?char},
357dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?short},
358dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?int},
359dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?long},
360dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?long\s+int},
361dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?long\s+long},
362dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?long\s+long\s+int},
363dd88ab32SMasahiro Yamada	qr{unsigned},
364dd88ab32SMasahiro Yamada	qr{float},
365dd88ab32SMasahiro Yamada	qr{double},
366dd88ab32SMasahiro Yamada	qr{bool},
367dd88ab32SMasahiro Yamada	qr{struct\s+$Ident},
368dd88ab32SMasahiro Yamada	qr{union\s+$Ident},
369dd88ab32SMasahiro Yamada	qr{enum\s+$Ident},
370dd88ab32SMasahiro Yamada	qr{${Ident}_t},
371dd88ab32SMasahiro Yamada	qr{${Ident}_handler},
372dd88ab32SMasahiro Yamada	qr{${Ident}_handler_fn},
373dd88ab32SMasahiro Yamada);
3746b9709d9STom Riniour @typeListWithAttr = (
3756b9709d9STom Rini	@typeList,
3766b9709d9STom Rini	qr{struct\s+$InitAttribute\s+$Ident},
3776b9709d9STom Rini	qr{union\s+$InitAttribute\s+$Ident},
3786b9709d9STom Rini);
3796b9709d9STom Rini
380dd88ab32SMasahiro Yamadaour @modifierList = (
381dd88ab32SMasahiro Yamada	qr{fastcall},
382dd88ab32SMasahiro Yamada);
383dd88ab32SMasahiro Yamada
384dd88ab32SMasahiro Yamadaour $allowed_asm_includes = qr{(?x:
385dd88ab32SMasahiro Yamada	irq|
386dd88ab32SMasahiro Yamada	memory
387dd88ab32SMasahiro Yamada)};
388dd88ab32SMasahiro Yamada# memory.h: ARM has a custom one
389dd88ab32SMasahiro Yamada
390dd88ab32SMasahiro Yamadasub build_types {
391dd88ab32SMasahiro Yamada	my $mods = "(?x:  \n" . join("|\n  ", @modifierList) . "\n)";
392dd88ab32SMasahiro Yamada	my $all = "(?x:  \n" . join("|\n  ", @typeList) . "\n)";
3936b9709d9STom Rini	my $allWithAttr = "(?x:  \n" . join("|\n  ", @typeListWithAttr) . "\n)";
394dd88ab32SMasahiro Yamada	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
395dd88ab32SMasahiro Yamada	$NonptrType	= qr{
396dd88ab32SMasahiro Yamada			(?:$Modifier\s+|const\s+)*
397dd88ab32SMasahiro Yamada			(?:
398dd88ab32SMasahiro Yamada				(?:typeof|__typeof__)\s*\([^\)]*\)|
399dd88ab32SMasahiro Yamada				(?:$typeTypedefs\b)|
400dd88ab32SMasahiro Yamada				(?:${all}\b)
401dd88ab32SMasahiro Yamada			)
402dd88ab32SMasahiro Yamada			(?:\s+$Modifier|\s+const)*
403dd88ab32SMasahiro Yamada		  }x;
4046b9709d9STom Rini	$NonptrTypeWithAttr	= qr{
4056b9709d9STom Rini			(?:$Modifier\s+|const\s+)*
4066b9709d9STom Rini			(?:
4076b9709d9STom Rini				(?:typeof|__typeof__)\s*\([^\)]*\)|
4086b9709d9STom Rini				(?:$typeTypedefs\b)|
4096b9709d9STom Rini				(?:${allWithAttr}\b)
4106b9709d9STom Rini			)
4116b9709d9STom Rini			(?:\s+$Modifier|\s+const)*
4126b9709d9STom Rini		  }x;
413dd88ab32SMasahiro Yamada	$Type	= qr{
414dd88ab32SMasahiro Yamada			$NonptrType
415dd88ab32SMasahiro Yamada			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*|\[\])+|(?:\s*\[\s*\])+)?
416dd88ab32SMasahiro Yamada			(?:\s+$Inline|\s+$Modifier)*
417dd88ab32SMasahiro Yamada		  }x;
418dd88ab32SMasahiro Yamada	$Declare	= qr{(?:$Storage\s+)?$Type};
419dd88ab32SMasahiro Yamada}
420dd88ab32SMasahiro Yamadabuild_types();
421dd88ab32SMasahiro Yamada
422dd88ab32SMasahiro Yamadaour $Typecast	= qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
423dd88ab32SMasahiro Yamada
424dd88ab32SMasahiro Yamada# Using $balanced_parens, $LvalOrFunc, or $FuncArg
425dd88ab32SMasahiro Yamada# requires at least perl version v5.10.0
426dd88ab32SMasahiro Yamada# Any use must be runtime checked with $^V
427dd88ab32SMasahiro Yamada
428dd88ab32SMasahiro Yamadaour $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
429dd88ab32SMasahiro Yamadaour $LvalOrFunc	= qr{($Lval)\s*($balanced_parens{0,1})\s*};
430dd88ab32SMasahiro Yamadaour $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};
431dd88ab32SMasahiro Yamada
432dd88ab32SMasahiro Yamadasub deparenthesize {
433dd88ab32SMasahiro Yamada	my ($string) = @_;
434dd88ab32SMasahiro Yamada	return "" if (!defined($string));
435dd88ab32SMasahiro Yamada	$string =~ s@^\s*\(\s*@@g;
436dd88ab32SMasahiro Yamada	$string =~ s@\s*\)\s*$@@g;
437dd88ab32SMasahiro Yamada	$string =~ s@\s+@ @g;
438dd88ab32SMasahiro Yamada	return $string;
439dd88ab32SMasahiro Yamada}
440dd88ab32SMasahiro Yamada
4416b9709d9STom Rinisub seed_camelcase_file {
4426b9709d9STom Rini	my ($file) = @_;
4436b9709d9STom Rini
4446b9709d9STom Rini	return if (!(-f $file));
4456b9709d9STom Rini
4466b9709d9STom Rini	local $/;
4476b9709d9STom Rini
4486b9709d9STom Rini	open(my $include_file, '<', "$file")
4496b9709d9STom Rini	    or warn "$P: Can't read '$file' $!\n";
4506b9709d9STom Rini	my $text = <$include_file>;
4516b9709d9STom Rini	close($include_file);
4526b9709d9STom Rini
4536b9709d9STom Rini	my @lines = split('\n', $text);
4546b9709d9STom Rini
4556b9709d9STom Rini	foreach my $line (@lines) {
4566b9709d9STom Rini		next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
4576b9709d9STom Rini		if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
4586b9709d9STom Rini			$camelcase{$1} = 1;
4596b9709d9STom Rini		} elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
4606b9709d9STom Rini			$camelcase{$1} = 1;
4616b9709d9STom Rini		} elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
4626b9709d9STom Rini			$camelcase{$1} = 1;
4636b9709d9STom Rini		}
4646b9709d9STom Rini	}
4656b9709d9STom Rini}
4666b9709d9STom Rini
4676b9709d9STom Rinimy $camelcase_seeded = 0;
4686b9709d9STom Rinisub seed_camelcase_includes {
4696b9709d9STom Rini	return if ($camelcase_seeded);
4706b9709d9STom Rini
4716b9709d9STom Rini	my $files;
4726b9709d9STom Rini	my $camelcase_cache = "";
4736b9709d9STom Rini	my @include_files = ();
4746b9709d9STom Rini
4756b9709d9STom Rini	$camelcase_seeded = 1;
4766b9709d9STom Rini
4776b9709d9STom Rini	if (-e ".git") {
4786b9709d9STom Rini		my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
4796b9709d9STom Rini		chomp $git_last_include_commit;
4806b9709d9STom Rini		$camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
4816b9709d9STom Rini	} else {
4826b9709d9STom Rini		my $last_mod_date = 0;
4836b9709d9STom Rini		$files = `find $root/include -name "*.h"`;
4846b9709d9STom Rini		@include_files = split('\n', $files);
4856b9709d9STom Rini		foreach my $file (@include_files) {
4866b9709d9STom Rini			my $date = POSIX::strftime("%Y%m%d%H%M",
4876b9709d9STom Rini						   localtime((stat $file)[9]));
4886b9709d9STom Rini			$last_mod_date = $date if ($last_mod_date < $date);
4896b9709d9STom Rini		}
4906b9709d9STom Rini		$camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
4916b9709d9STom Rini	}
4926b9709d9STom Rini
4936b9709d9STom Rini	if ($camelcase_cache ne "" && -f $camelcase_cache) {
4946b9709d9STom Rini		open(my $camelcase_file, '<', "$camelcase_cache")
4956b9709d9STom Rini		    or warn "$P: Can't read '$camelcase_cache' $!\n";
4966b9709d9STom Rini		while (<$camelcase_file>) {
4976b9709d9STom Rini			chomp;
4986b9709d9STom Rini			$camelcase{$_} = 1;
4996b9709d9STom Rini		}
5006b9709d9STom Rini		close($camelcase_file);
5016b9709d9STom Rini
5026b9709d9STom Rini		return;
5036b9709d9STom Rini	}
5046b9709d9STom Rini
5056b9709d9STom Rini	if (-e ".git") {
5066b9709d9STom Rini		$files = `git ls-files "include/*.h"`;
5076b9709d9STom Rini		@include_files = split('\n', $files);
5086b9709d9STom Rini	}
5096b9709d9STom Rini
5106b9709d9STom Rini	foreach my $file (@include_files) {
5116b9709d9STom Rini		seed_camelcase_file($file);
5126b9709d9STom Rini	}
5136b9709d9STom Rini
5146b9709d9STom Rini	if ($camelcase_cache ne "") {
5156b9709d9STom Rini		unlink glob ".checkpatch-camelcase.*";
5166b9709d9STom Rini		open(my $camelcase_file, '>', "$camelcase_cache")
5176b9709d9STom Rini		    or warn "$P: Can't write '$camelcase_cache' $!\n";
5186b9709d9STom Rini		foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
5196b9709d9STom Rini			print $camelcase_file ("$_\n");
5206b9709d9STom Rini		}
5216b9709d9STom Rini		close($camelcase_file);
5226b9709d9STom Rini	}
5236b9709d9STom Rini}
5246b9709d9STom Rini
525dd88ab32SMasahiro Yamada$chk_signoff = 0 if ($file);
526dd88ab32SMasahiro Yamada
527dd88ab32SMasahiro Yamadamy @rawlines = ();
528dd88ab32SMasahiro Yamadamy @lines = ();
5296b9709d9STom Rinimy @fixed = ();
530dd88ab32SMasahiro Yamadamy $vname;
531dd88ab32SMasahiro Yamadafor my $filename (@ARGV) {
532dd88ab32SMasahiro Yamada	my $FILE;
533dd88ab32SMasahiro Yamada	if ($file) {
534dd88ab32SMasahiro Yamada		open($FILE, '-|', "diff -u /dev/null $filename") ||
535dd88ab32SMasahiro Yamada			die "$P: $filename: diff failed - $!\n";
536dd88ab32SMasahiro Yamada	} elsif ($filename eq '-') {
537dd88ab32SMasahiro Yamada		open($FILE, '<&STDIN');
538dd88ab32SMasahiro Yamada	} else {
539dd88ab32SMasahiro Yamada		open($FILE, '<', "$filename") ||
540dd88ab32SMasahiro Yamada			die "$P: $filename: open failed - $!\n";
541dd88ab32SMasahiro Yamada	}
542dd88ab32SMasahiro Yamada	if ($filename eq '-') {
543dd88ab32SMasahiro Yamada		$vname = 'Your patch';
544dd88ab32SMasahiro Yamada	} else {
545dd88ab32SMasahiro Yamada		$vname = $filename;
546dd88ab32SMasahiro Yamada	}
547dd88ab32SMasahiro Yamada	while (<$FILE>) {
548dd88ab32SMasahiro Yamada		chomp;
549dd88ab32SMasahiro Yamada		push(@rawlines, $_);
550dd88ab32SMasahiro Yamada	}
551dd88ab32SMasahiro Yamada	close($FILE);
552dd88ab32SMasahiro Yamada	if (!process($filename)) {
553dd88ab32SMasahiro Yamada		$exit = 1;
554dd88ab32SMasahiro Yamada	}
555dd88ab32SMasahiro Yamada	@rawlines = ();
556dd88ab32SMasahiro Yamada	@lines = ();
5576b9709d9STom Rini	@fixed = ();
558dd88ab32SMasahiro Yamada}
559dd88ab32SMasahiro Yamada
560dd88ab32SMasahiro Yamadaexit($exit);
561dd88ab32SMasahiro Yamada
562dd88ab32SMasahiro Yamadasub top_of_kernel_tree {
563dd88ab32SMasahiro Yamada	my ($root) = @_;
564dd88ab32SMasahiro Yamada
565dd88ab32SMasahiro Yamada	my @tree_check = (
5666b9709d9STom Rini		"COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
567dd88ab32SMasahiro Yamada		"README", "Documentation", "arch", "include", "drivers",
568dd88ab32SMasahiro Yamada		"fs", "init", "ipc", "kernel", "lib", "scripts",
569dd88ab32SMasahiro Yamada	);
570dd88ab32SMasahiro Yamada
571dd88ab32SMasahiro Yamada	foreach my $check (@tree_check) {
572dd88ab32SMasahiro Yamada		if (! -e $root . '/' . $check) {
573dd88ab32SMasahiro Yamada			return 0;
574dd88ab32SMasahiro Yamada		}
575dd88ab32SMasahiro Yamada	}
576dd88ab32SMasahiro Yamada	return 1;
577dd88ab32SMasahiro Yamada}
578dd88ab32SMasahiro Yamada
579dd88ab32SMasahiro Yamadasub parse_email {
580dd88ab32SMasahiro Yamada	my ($formatted_email) = @_;
581dd88ab32SMasahiro Yamada
582dd88ab32SMasahiro Yamada	my $name = "";
583dd88ab32SMasahiro Yamada	my $address = "";
584dd88ab32SMasahiro Yamada	my $comment = "";
585dd88ab32SMasahiro Yamada
586dd88ab32SMasahiro Yamada	if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
587dd88ab32SMasahiro Yamada		$name = $1;
588dd88ab32SMasahiro Yamada		$address = $2;
589dd88ab32SMasahiro Yamada		$comment = $3 if defined $3;
590dd88ab32SMasahiro Yamada	} elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
591dd88ab32SMasahiro Yamada		$address = $1;
592dd88ab32SMasahiro Yamada		$comment = $2 if defined $2;
593dd88ab32SMasahiro Yamada	} elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
594dd88ab32SMasahiro Yamada		$address = $1;
595dd88ab32SMasahiro Yamada		$comment = $2 if defined $2;
596dd88ab32SMasahiro Yamada		$formatted_email =~ s/$address.*$//;
597dd88ab32SMasahiro Yamada		$name = $formatted_email;
5986b9709d9STom Rini		$name = trim($name);
599dd88ab32SMasahiro Yamada		$name =~ s/^\"|\"$//g;
600dd88ab32SMasahiro Yamada		# If there's a name left after stripping spaces and
601dd88ab32SMasahiro Yamada		# leading quotes, and the address doesn't have both
602dd88ab32SMasahiro Yamada		# leading and trailing angle brackets, the address
603dd88ab32SMasahiro Yamada		# is invalid. ie:
604dd88ab32SMasahiro Yamada		#   "joe smith joe@smith.com" bad
605dd88ab32SMasahiro Yamada		#   "joe smith <joe@smith.com" bad
606dd88ab32SMasahiro Yamada		if ($name ne "" && $address !~ /^<[^>]+>$/) {
607dd88ab32SMasahiro Yamada			$name = "";
608dd88ab32SMasahiro Yamada			$address = "";
609dd88ab32SMasahiro Yamada			$comment = "";
610dd88ab32SMasahiro Yamada		}
611dd88ab32SMasahiro Yamada	}
612dd88ab32SMasahiro Yamada
6136b9709d9STom Rini	$name = trim($name);
614dd88ab32SMasahiro Yamada	$name =~ s/^\"|\"$//g;
6156b9709d9STom Rini	$address = trim($address);
616dd88ab32SMasahiro Yamada	$address =~ s/^\<|\>$//g;
617dd88ab32SMasahiro Yamada
618dd88ab32SMasahiro Yamada	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
619dd88ab32SMasahiro Yamada		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
620dd88ab32SMasahiro Yamada		$name = "\"$name\"";
621dd88ab32SMasahiro Yamada	}
622dd88ab32SMasahiro Yamada
623dd88ab32SMasahiro Yamada	return ($name, $address, $comment);
624dd88ab32SMasahiro Yamada}
625dd88ab32SMasahiro Yamada
626dd88ab32SMasahiro Yamadasub format_email {
627dd88ab32SMasahiro Yamada	my ($name, $address) = @_;
628dd88ab32SMasahiro Yamada
629dd88ab32SMasahiro Yamada	my $formatted_email;
630dd88ab32SMasahiro Yamada
6316b9709d9STom Rini	$name = trim($name);
632dd88ab32SMasahiro Yamada	$name =~ s/^\"|\"$//g;
6336b9709d9STom Rini	$address = trim($address);
634dd88ab32SMasahiro Yamada
635dd88ab32SMasahiro Yamada	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
636dd88ab32SMasahiro Yamada		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
637dd88ab32SMasahiro Yamada		$name = "\"$name\"";
638dd88ab32SMasahiro Yamada	}
639dd88ab32SMasahiro Yamada
640dd88ab32SMasahiro Yamada	if ("$name" eq "") {
641dd88ab32SMasahiro Yamada		$formatted_email = "$address";
642dd88ab32SMasahiro Yamada	} else {
643dd88ab32SMasahiro Yamada		$formatted_email = "$name <$address>";
644dd88ab32SMasahiro Yamada	}
645dd88ab32SMasahiro Yamada
646dd88ab32SMasahiro Yamada	return $formatted_email;
647dd88ab32SMasahiro Yamada}
648dd88ab32SMasahiro Yamada
649dd88ab32SMasahiro Yamadasub which_conf {
650dd88ab32SMasahiro Yamada	my ($conf) = @_;
651dd88ab32SMasahiro Yamada
652dd88ab32SMasahiro Yamada	foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
653dd88ab32SMasahiro Yamada		if (-e "$path/$conf") {
654dd88ab32SMasahiro Yamada			return "$path/$conf";
655dd88ab32SMasahiro Yamada		}
656dd88ab32SMasahiro Yamada	}
657dd88ab32SMasahiro Yamada
658dd88ab32SMasahiro Yamada	return "";
659dd88ab32SMasahiro Yamada}
660dd88ab32SMasahiro Yamada
661dd88ab32SMasahiro Yamadasub expand_tabs {
662dd88ab32SMasahiro Yamada	my ($str) = @_;
663dd88ab32SMasahiro Yamada
664dd88ab32SMasahiro Yamada	my $res = '';
665dd88ab32SMasahiro Yamada	my $n = 0;
666dd88ab32SMasahiro Yamada	for my $c (split(//, $str)) {
667dd88ab32SMasahiro Yamada		if ($c eq "\t") {
668dd88ab32SMasahiro Yamada			$res .= ' ';
669dd88ab32SMasahiro Yamada			$n++;
670dd88ab32SMasahiro Yamada			for (; ($n % 8) != 0; $n++) {
671dd88ab32SMasahiro Yamada				$res .= ' ';
672dd88ab32SMasahiro Yamada			}
673dd88ab32SMasahiro Yamada			next;
674dd88ab32SMasahiro Yamada		}
675dd88ab32SMasahiro Yamada		$res .= $c;
676dd88ab32SMasahiro Yamada		$n++;
677dd88ab32SMasahiro Yamada	}
678dd88ab32SMasahiro Yamada
679dd88ab32SMasahiro Yamada	return $res;
680dd88ab32SMasahiro Yamada}
681dd88ab32SMasahiro Yamadasub copy_spacing {
682dd88ab32SMasahiro Yamada	(my $res = shift) =~ tr/\t/ /c;
683dd88ab32SMasahiro Yamada	return $res;
684dd88ab32SMasahiro Yamada}
685dd88ab32SMasahiro Yamada
686dd88ab32SMasahiro Yamadasub line_stats {
687dd88ab32SMasahiro Yamada	my ($line) = @_;
688dd88ab32SMasahiro Yamada
689dd88ab32SMasahiro Yamada	# Drop the diff line leader and expand tabs
690dd88ab32SMasahiro Yamada	$line =~ s/^.//;
691dd88ab32SMasahiro Yamada	$line = expand_tabs($line);
692dd88ab32SMasahiro Yamada
693dd88ab32SMasahiro Yamada	# Pick the indent from the front of the line.
694dd88ab32SMasahiro Yamada	my ($white) = ($line =~ /^(\s*)/);
695dd88ab32SMasahiro Yamada
696dd88ab32SMasahiro Yamada	return (length($line), length($white));
697dd88ab32SMasahiro Yamada}
698dd88ab32SMasahiro Yamada
699dd88ab32SMasahiro Yamadamy $sanitise_quote = '';
700dd88ab32SMasahiro Yamada
701dd88ab32SMasahiro Yamadasub sanitise_line_reset {
702dd88ab32SMasahiro Yamada	my ($in_comment) = @_;
703dd88ab32SMasahiro Yamada
704dd88ab32SMasahiro Yamada	if ($in_comment) {
705dd88ab32SMasahiro Yamada		$sanitise_quote = '*/';
706dd88ab32SMasahiro Yamada	} else {
707dd88ab32SMasahiro Yamada		$sanitise_quote = '';
708dd88ab32SMasahiro Yamada	}
709dd88ab32SMasahiro Yamada}
710dd88ab32SMasahiro Yamadasub sanitise_line {
711dd88ab32SMasahiro Yamada	my ($line) = @_;
712dd88ab32SMasahiro Yamada
713dd88ab32SMasahiro Yamada	my $res = '';
714dd88ab32SMasahiro Yamada	my $l = '';
715dd88ab32SMasahiro Yamada
716dd88ab32SMasahiro Yamada	my $qlen = 0;
717dd88ab32SMasahiro Yamada	my $off = 0;
718dd88ab32SMasahiro Yamada	my $c;
719dd88ab32SMasahiro Yamada
720dd88ab32SMasahiro Yamada	# Always copy over the diff marker.
721dd88ab32SMasahiro Yamada	$res = substr($line, 0, 1);
722dd88ab32SMasahiro Yamada
723dd88ab32SMasahiro Yamada	for ($off = 1; $off < length($line); $off++) {
724dd88ab32SMasahiro Yamada		$c = substr($line, $off, 1);
725dd88ab32SMasahiro Yamada
726dd88ab32SMasahiro Yamada		# Comments we are wacking completly including the begin
727dd88ab32SMasahiro Yamada		# and end, all to $;.
728dd88ab32SMasahiro Yamada		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
729dd88ab32SMasahiro Yamada			$sanitise_quote = '*/';
730dd88ab32SMasahiro Yamada
731dd88ab32SMasahiro Yamada			substr($res, $off, 2, "$;$;");
732dd88ab32SMasahiro Yamada			$off++;
733dd88ab32SMasahiro Yamada			next;
734dd88ab32SMasahiro Yamada		}
735dd88ab32SMasahiro Yamada		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
736dd88ab32SMasahiro Yamada			$sanitise_quote = '';
737dd88ab32SMasahiro Yamada			substr($res, $off, 2, "$;$;");
738dd88ab32SMasahiro Yamada			$off++;
739dd88ab32SMasahiro Yamada			next;
740dd88ab32SMasahiro Yamada		}
741dd88ab32SMasahiro Yamada		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
742dd88ab32SMasahiro Yamada			$sanitise_quote = '//';
743dd88ab32SMasahiro Yamada
744dd88ab32SMasahiro Yamada			substr($res, $off, 2, $sanitise_quote);
745dd88ab32SMasahiro Yamada			$off++;
746dd88ab32SMasahiro Yamada			next;
747dd88ab32SMasahiro Yamada		}
748dd88ab32SMasahiro Yamada
749dd88ab32SMasahiro Yamada		# A \ in a string means ignore the next character.
750dd88ab32SMasahiro Yamada		if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
751dd88ab32SMasahiro Yamada		    $c eq "\\") {
752dd88ab32SMasahiro Yamada			substr($res, $off, 2, 'XX');
753dd88ab32SMasahiro Yamada			$off++;
754dd88ab32SMasahiro Yamada			next;
755dd88ab32SMasahiro Yamada		}
756dd88ab32SMasahiro Yamada		# Regular quotes.
757dd88ab32SMasahiro Yamada		if ($c eq "'" || $c eq '"') {
758dd88ab32SMasahiro Yamada			if ($sanitise_quote eq '') {
759dd88ab32SMasahiro Yamada				$sanitise_quote = $c;
760dd88ab32SMasahiro Yamada
761dd88ab32SMasahiro Yamada				substr($res, $off, 1, $c);
762dd88ab32SMasahiro Yamada				next;
763dd88ab32SMasahiro Yamada			} elsif ($sanitise_quote eq $c) {
764dd88ab32SMasahiro Yamada				$sanitise_quote = '';
765dd88ab32SMasahiro Yamada			}
766dd88ab32SMasahiro Yamada		}
767dd88ab32SMasahiro Yamada
768dd88ab32SMasahiro Yamada		#print "c<$c> SQ<$sanitise_quote>\n";
769dd88ab32SMasahiro Yamada		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
770dd88ab32SMasahiro Yamada			substr($res, $off, 1, $;);
771dd88ab32SMasahiro Yamada		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
772dd88ab32SMasahiro Yamada			substr($res, $off, 1, $;);
773dd88ab32SMasahiro Yamada		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
774dd88ab32SMasahiro Yamada			substr($res, $off, 1, 'X');
775dd88ab32SMasahiro Yamada		} else {
776dd88ab32SMasahiro Yamada			substr($res, $off, 1, $c);
777dd88ab32SMasahiro Yamada		}
778dd88ab32SMasahiro Yamada	}
779dd88ab32SMasahiro Yamada
780dd88ab32SMasahiro Yamada	if ($sanitise_quote eq '//') {
781dd88ab32SMasahiro Yamada		$sanitise_quote = '';
782dd88ab32SMasahiro Yamada	}
783dd88ab32SMasahiro Yamada
784dd88ab32SMasahiro Yamada	# The pathname on a #include may be surrounded by '<' and '>'.
785dd88ab32SMasahiro Yamada	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
786dd88ab32SMasahiro Yamada		my $clean = 'X' x length($1);
787dd88ab32SMasahiro Yamada		$res =~ s@\<.*\>@<$clean>@;
788dd88ab32SMasahiro Yamada
789dd88ab32SMasahiro Yamada	# The whole of a #error is a string.
790dd88ab32SMasahiro Yamada	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
791dd88ab32SMasahiro Yamada		my $clean = 'X' x length($1);
792dd88ab32SMasahiro Yamada		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
793dd88ab32SMasahiro Yamada	}
794dd88ab32SMasahiro Yamada
795dd88ab32SMasahiro Yamada	return $res;
796dd88ab32SMasahiro Yamada}
797dd88ab32SMasahiro Yamada
7986b9709d9STom Rinisub get_quoted_string {
7996b9709d9STom Rini	my ($line, $rawline) = @_;
8006b9709d9STom Rini
8016b9709d9STom Rini	return "" if ($line !~ m/(\"[X]+\")/g);
8026b9709d9STom Rini	return substr($rawline, $-[0], $+[0] - $-[0]);
8036b9709d9STom Rini}
8046b9709d9STom Rini
805dd88ab32SMasahiro Yamadasub ctx_statement_block {
806dd88ab32SMasahiro Yamada	my ($linenr, $remain, $off) = @_;
807dd88ab32SMasahiro Yamada	my $line = $linenr - 1;
808dd88ab32SMasahiro Yamada	my $blk = '';
809dd88ab32SMasahiro Yamada	my $soff = $off;
810dd88ab32SMasahiro Yamada	my $coff = $off - 1;
811dd88ab32SMasahiro Yamada	my $coff_set = 0;
812dd88ab32SMasahiro Yamada
813dd88ab32SMasahiro Yamada	my $loff = 0;
814dd88ab32SMasahiro Yamada
815dd88ab32SMasahiro Yamada	my $type = '';
816dd88ab32SMasahiro Yamada	my $level = 0;
817dd88ab32SMasahiro Yamada	my @stack = ();
818dd88ab32SMasahiro Yamada	my $p;
819dd88ab32SMasahiro Yamada	my $c;
820dd88ab32SMasahiro Yamada	my $len = 0;
821dd88ab32SMasahiro Yamada
822dd88ab32SMasahiro Yamada	my $remainder;
823dd88ab32SMasahiro Yamada	while (1) {
824dd88ab32SMasahiro Yamada		@stack = (['', 0]) if ($#stack == -1);
825dd88ab32SMasahiro Yamada
826dd88ab32SMasahiro Yamada		#warn "CSB: blk<$blk> remain<$remain>\n";
827dd88ab32SMasahiro Yamada		# If we are about to drop off the end, pull in more
828dd88ab32SMasahiro Yamada		# context.
829dd88ab32SMasahiro Yamada		if ($off >= $len) {
830dd88ab32SMasahiro Yamada			for (; $remain > 0; $line++) {
831dd88ab32SMasahiro Yamada				last if (!defined $lines[$line]);
832dd88ab32SMasahiro Yamada				next if ($lines[$line] =~ /^-/);
833dd88ab32SMasahiro Yamada				$remain--;
834dd88ab32SMasahiro Yamada				$loff = $len;
835dd88ab32SMasahiro Yamada				$blk .= $lines[$line] . "\n";
836dd88ab32SMasahiro Yamada				$len = length($blk);
837dd88ab32SMasahiro Yamada				$line++;
838dd88ab32SMasahiro Yamada				last;
839dd88ab32SMasahiro Yamada			}
840dd88ab32SMasahiro Yamada			# Bail if there is no further context.
841dd88ab32SMasahiro Yamada			#warn "CSB: blk<$blk> off<$off> len<$len>\n";
842dd88ab32SMasahiro Yamada			if ($off >= $len) {
843dd88ab32SMasahiro Yamada				last;
844dd88ab32SMasahiro Yamada			}
845dd88ab32SMasahiro Yamada			if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
846dd88ab32SMasahiro Yamada				$level++;
847dd88ab32SMasahiro Yamada				$type = '#';
848dd88ab32SMasahiro Yamada			}
849dd88ab32SMasahiro Yamada		}
850dd88ab32SMasahiro Yamada		$p = $c;
851dd88ab32SMasahiro Yamada		$c = substr($blk, $off, 1);
852dd88ab32SMasahiro Yamada		$remainder = substr($blk, $off);
853dd88ab32SMasahiro Yamada
854dd88ab32SMasahiro Yamada		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
855dd88ab32SMasahiro Yamada
856dd88ab32SMasahiro Yamada		# Handle nested #if/#else.
857dd88ab32SMasahiro Yamada		if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
858dd88ab32SMasahiro Yamada			push(@stack, [ $type, $level ]);
859dd88ab32SMasahiro Yamada		} elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
860dd88ab32SMasahiro Yamada			($type, $level) = @{$stack[$#stack - 1]};
861dd88ab32SMasahiro Yamada		} elsif ($remainder =~ /^#\s*endif\b/) {
862dd88ab32SMasahiro Yamada			($type, $level) = @{pop(@stack)};
863dd88ab32SMasahiro Yamada		}
864dd88ab32SMasahiro Yamada
865dd88ab32SMasahiro Yamada		# Statement ends at the ';' or a close '}' at the
866dd88ab32SMasahiro Yamada		# outermost level.
867dd88ab32SMasahiro Yamada		if ($level == 0 && $c eq ';') {
868dd88ab32SMasahiro Yamada			last;
869dd88ab32SMasahiro Yamada		}
870dd88ab32SMasahiro Yamada
871dd88ab32SMasahiro Yamada		# An else is really a conditional as long as its not else if
872dd88ab32SMasahiro Yamada		if ($level == 0 && $coff_set == 0 &&
873dd88ab32SMasahiro Yamada				(!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
874dd88ab32SMasahiro Yamada				$remainder =~ /^(else)(?:\s|{)/ &&
875dd88ab32SMasahiro Yamada				$remainder !~ /^else\s+if\b/) {
876dd88ab32SMasahiro Yamada			$coff = $off + length($1) - 1;
877dd88ab32SMasahiro Yamada			$coff_set = 1;
878dd88ab32SMasahiro Yamada			#warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
879dd88ab32SMasahiro Yamada			#warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
880dd88ab32SMasahiro Yamada		}
881dd88ab32SMasahiro Yamada
882dd88ab32SMasahiro Yamada		if (($type eq '' || $type eq '(') && $c eq '(') {
883dd88ab32SMasahiro Yamada			$level++;
884dd88ab32SMasahiro Yamada			$type = '(';
885dd88ab32SMasahiro Yamada		}
886dd88ab32SMasahiro Yamada		if ($type eq '(' && $c eq ')') {
887dd88ab32SMasahiro Yamada			$level--;
888dd88ab32SMasahiro Yamada			$type = ($level != 0)? '(' : '';
889dd88ab32SMasahiro Yamada
890dd88ab32SMasahiro Yamada			if ($level == 0 && $coff < $soff) {
891dd88ab32SMasahiro Yamada				$coff = $off;
892dd88ab32SMasahiro Yamada				$coff_set = 1;
893dd88ab32SMasahiro Yamada				#warn "CSB: mark coff<$coff>\n";
894dd88ab32SMasahiro Yamada			}
895dd88ab32SMasahiro Yamada		}
896dd88ab32SMasahiro Yamada		if (($type eq '' || $type eq '{') && $c eq '{') {
897dd88ab32SMasahiro Yamada			$level++;
898dd88ab32SMasahiro Yamada			$type = '{';
899dd88ab32SMasahiro Yamada		}
900dd88ab32SMasahiro Yamada		if ($type eq '{' && $c eq '}') {
901dd88ab32SMasahiro Yamada			$level--;
902dd88ab32SMasahiro Yamada			$type = ($level != 0)? '{' : '';
903dd88ab32SMasahiro Yamada
904dd88ab32SMasahiro Yamada			if ($level == 0) {
905dd88ab32SMasahiro Yamada				if (substr($blk, $off + 1, 1) eq ';') {
906dd88ab32SMasahiro Yamada					$off++;
907dd88ab32SMasahiro Yamada				}
908dd88ab32SMasahiro Yamada				last;
909dd88ab32SMasahiro Yamada			}
910dd88ab32SMasahiro Yamada		}
911dd88ab32SMasahiro Yamada		# Preprocessor commands end at the newline unless escaped.
912dd88ab32SMasahiro Yamada		if ($type eq '#' && $c eq "\n" && $p ne "\\") {
913dd88ab32SMasahiro Yamada			$level--;
914dd88ab32SMasahiro Yamada			$type = '';
915dd88ab32SMasahiro Yamada			$off++;
916dd88ab32SMasahiro Yamada			last;
917dd88ab32SMasahiro Yamada		}
918dd88ab32SMasahiro Yamada		$off++;
919dd88ab32SMasahiro Yamada	}
920dd88ab32SMasahiro Yamada	# We are truly at the end, so shuffle to the next line.
921dd88ab32SMasahiro Yamada	if ($off == $len) {
922dd88ab32SMasahiro Yamada		$loff = $len + 1;
923dd88ab32SMasahiro Yamada		$line++;
924dd88ab32SMasahiro Yamada		$remain--;
925dd88ab32SMasahiro Yamada	}
926dd88ab32SMasahiro Yamada
927dd88ab32SMasahiro Yamada	my $statement = substr($blk, $soff, $off - $soff + 1);
928dd88ab32SMasahiro Yamada	my $condition = substr($blk, $soff, $coff - $soff + 1);
929dd88ab32SMasahiro Yamada
930dd88ab32SMasahiro Yamada	#warn "STATEMENT<$statement>\n";
931dd88ab32SMasahiro Yamada	#warn "CONDITION<$condition>\n";
932dd88ab32SMasahiro Yamada
933dd88ab32SMasahiro Yamada	#print "coff<$coff> soff<$off> loff<$loff>\n";
934dd88ab32SMasahiro Yamada
935dd88ab32SMasahiro Yamada	return ($statement, $condition,
936dd88ab32SMasahiro Yamada			$line, $remain + 1, $off - $loff + 1, $level);
937dd88ab32SMasahiro Yamada}
938dd88ab32SMasahiro Yamada
939dd88ab32SMasahiro Yamadasub statement_lines {
940dd88ab32SMasahiro Yamada	my ($stmt) = @_;
941dd88ab32SMasahiro Yamada
942dd88ab32SMasahiro Yamada	# Strip the diff line prefixes and rip blank lines at start and end.
943dd88ab32SMasahiro Yamada	$stmt =~ s/(^|\n)./$1/g;
944dd88ab32SMasahiro Yamada	$stmt =~ s/^\s*//;
945dd88ab32SMasahiro Yamada	$stmt =~ s/\s*$//;
946dd88ab32SMasahiro Yamada
947dd88ab32SMasahiro Yamada	my @stmt_lines = ($stmt =~ /\n/g);
948dd88ab32SMasahiro Yamada
949dd88ab32SMasahiro Yamada	return $#stmt_lines + 2;
950dd88ab32SMasahiro Yamada}
951dd88ab32SMasahiro Yamada
952dd88ab32SMasahiro Yamadasub statement_rawlines {
953dd88ab32SMasahiro Yamada	my ($stmt) = @_;
954dd88ab32SMasahiro Yamada
955dd88ab32SMasahiro Yamada	my @stmt_lines = ($stmt =~ /\n/g);
956dd88ab32SMasahiro Yamada
957dd88ab32SMasahiro Yamada	return $#stmt_lines + 2;
958dd88ab32SMasahiro Yamada}
959dd88ab32SMasahiro Yamada
960dd88ab32SMasahiro Yamadasub statement_block_size {
961dd88ab32SMasahiro Yamada	my ($stmt) = @_;
962dd88ab32SMasahiro Yamada
963dd88ab32SMasahiro Yamada	$stmt =~ s/(^|\n)./$1/g;
964dd88ab32SMasahiro Yamada	$stmt =~ s/^\s*{//;
965dd88ab32SMasahiro Yamada	$stmt =~ s/}\s*$//;
966dd88ab32SMasahiro Yamada	$stmt =~ s/^\s*//;
967dd88ab32SMasahiro Yamada	$stmt =~ s/\s*$//;
968dd88ab32SMasahiro Yamada
969dd88ab32SMasahiro Yamada	my @stmt_lines = ($stmt =~ /\n/g);
970dd88ab32SMasahiro Yamada	my @stmt_statements = ($stmt =~ /;/g);
971dd88ab32SMasahiro Yamada
972dd88ab32SMasahiro Yamada	my $stmt_lines = $#stmt_lines + 2;
973dd88ab32SMasahiro Yamada	my $stmt_statements = $#stmt_statements + 1;
974dd88ab32SMasahiro Yamada
975dd88ab32SMasahiro Yamada	if ($stmt_lines > $stmt_statements) {
976dd88ab32SMasahiro Yamada		return $stmt_lines;
977dd88ab32SMasahiro Yamada	} else {
978dd88ab32SMasahiro Yamada		return $stmt_statements;
979dd88ab32SMasahiro Yamada	}
980dd88ab32SMasahiro Yamada}
981dd88ab32SMasahiro Yamada
982dd88ab32SMasahiro Yamadasub ctx_statement_full {
983dd88ab32SMasahiro Yamada	my ($linenr, $remain, $off) = @_;
984dd88ab32SMasahiro Yamada	my ($statement, $condition, $level);
985dd88ab32SMasahiro Yamada
986dd88ab32SMasahiro Yamada	my (@chunks);
987dd88ab32SMasahiro Yamada
988dd88ab32SMasahiro Yamada	# Grab the first conditional/block pair.
989dd88ab32SMasahiro Yamada	($statement, $condition, $linenr, $remain, $off, $level) =
990dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $remain, $off);
991dd88ab32SMasahiro Yamada	#print "F: c<$condition> s<$statement> remain<$remain>\n";
992dd88ab32SMasahiro Yamada	push(@chunks, [ $condition, $statement ]);
993dd88ab32SMasahiro Yamada	if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
994dd88ab32SMasahiro Yamada		return ($level, $linenr, @chunks);
995dd88ab32SMasahiro Yamada	}
996dd88ab32SMasahiro Yamada
997dd88ab32SMasahiro Yamada	# Pull in the following conditional/block pairs and see if they
998dd88ab32SMasahiro Yamada	# could continue the statement.
999dd88ab32SMasahiro Yamada	for (;;) {
1000dd88ab32SMasahiro Yamada		($statement, $condition, $linenr, $remain, $off, $level) =
1001dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $remain, $off);
1002dd88ab32SMasahiro Yamada		#print "C: c<$condition> s<$statement> remain<$remain>\n";
1003dd88ab32SMasahiro Yamada		last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
1004dd88ab32SMasahiro Yamada		#print "C: push\n";
1005dd88ab32SMasahiro Yamada		push(@chunks, [ $condition, $statement ]);
1006dd88ab32SMasahiro Yamada	}
1007dd88ab32SMasahiro Yamada
1008dd88ab32SMasahiro Yamada	return ($level, $linenr, @chunks);
1009dd88ab32SMasahiro Yamada}
1010dd88ab32SMasahiro Yamada
1011dd88ab32SMasahiro Yamadasub ctx_block_get {
1012dd88ab32SMasahiro Yamada	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
1013dd88ab32SMasahiro Yamada	my $line;
1014dd88ab32SMasahiro Yamada	my $start = $linenr - 1;
1015dd88ab32SMasahiro Yamada	my $blk = '';
1016dd88ab32SMasahiro Yamada	my @o;
1017dd88ab32SMasahiro Yamada	my @c;
1018dd88ab32SMasahiro Yamada	my @res = ();
1019dd88ab32SMasahiro Yamada
1020dd88ab32SMasahiro Yamada	my $level = 0;
1021dd88ab32SMasahiro Yamada	my @stack = ($level);
1022dd88ab32SMasahiro Yamada	for ($line = $start; $remain > 0; $line++) {
1023dd88ab32SMasahiro Yamada		next if ($rawlines[$line] =~ /^-/);
1024dd88ab32SMasahiro Yamada		$remain--;
1025dd88ab32SMasahiro Yamada
1026dd88ab32SMasahiro Yamada		$blk .= $rawlines[$line];
1027dd88ab32SMasahiro Yamada
1028dd88ab32SMasahiro Yamada		# Handle nested #if/#else.
1029dd88ab32SMasahiro Yamada		if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
1030dd88ab32SMasahiro Yamada			push(@stack, $level);
1031dd88ab32SMasahiro Yamada		} elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
1032dd88ab32SMasahiro Yamada			$level = $stack[$#stack - 1];
1033dd88ab32SMasahiro Yamada		} elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
1034dd88ab32SMasahiro Yamada			$level = pop(@stack);
1035dd88ab32SMasahiro Yamada		}
1036dd88ab32SMasahiro Yamada
1037dd88ab32SMasahiro Yamada		foreach my $c (split(//, $lines[$line])) {
1038dd88ab32SMasahiro Yamada			##print "C<$c>L<$level><$open$close>O<$off>\n";
1039dd88ab32SMasahiro Yamada			if ($off > 0) {
1040dd88ab32SMasahiro Yamada				$off--;
1041dd88ab32SMasahiro Yamada				next;
1042dd88ab32SMasahiro Yamada			}
1043dd88ab32SMasahiro Yamada
1044dd88ab32SMasahiro Yamada			if ($c eq $close && $level > 0) {
1045dd88ab32SMasahiro Yamada				$level--;
1046dd88ab32SMasahiro Yamada				last if ($level == 0);
1047dd88ab32SMasahiro Yamada			} elsif ($c eq $open) {
1048dd88ab32SMasahiro Yamada				$level++;
1049dd88ab32SMasahiro Yamada			}
1050dd88ab32SMasahiro Yamada		}
1051dd88ab32SMasahiro Yamada
1052dd88ab32SMasahiro Yamada		if (!$outer || $level <= 1) {
1053dd88ab32SMasahiro Yamada			push(@res, $rawlines[$line]);
1054dd88ab32SMasahiro Yamada		}
1055dd88ab32SMasahiro Yamada
1056dd88ab32SMasahiro Yamada		last if ($level == 0);
1057dd88ab32SMasahiro Yamada	}
1058dd88ab32SMasahiro Yamada
1059dd88ab32SMasahiro Yamada	return ($level, @res);
1060dd88ab32SMasahiro Yamada}
1061dd88ab32SMasahiro Yamadasub ctx_block_outer {
1062dd88ab32SMasahiro Yamada	my ($linenr, $remain) = @_;
1063dd88ab32SMasahiro Yamada
1064dd88ab32SMasahiro Yamada	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
1065dd88ab32SMasahiro Yamada	return @r;
1066dd88ab32SMasahiro Yamada}
1067dd88ab32SMasahiro Yamadasub ctx_block {
1068dd88ab32SMasahiro Yamada	my ($linenr, $remain) = @_;
1069dd88ab32SMasahiro Yamada
1070dd88ab32SMasahiro Yamada	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1071dd88ab32SMasahiro Yamada	return @r;
1072dd88ab32SMasahiro Yamada}
1073dd88ab32SMasahiro Yamadasub ctx_statement {
1074dd88ab32SMasahiro Yamada	my ($linenr, $remain, $off) = @_;
1075dd88ab32SMasahiro Yamada
1076dd88ab32SMasahiro Yamada	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1077dd88ab32SMasahiro Yamada	return @r;
1078dd88ab32SMasahiro Yamada}
1079dd88ab32SMasahiro Yamadasub ctx_block_level {
1080dd88ab32SMasahiro Yamada	my ($linenr, $remain) = @_;
1081dd88ab32SMasahiro Yamada
1082dd88ab32SMasahiro Yamada	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1083dd88ab32SMasahiro Yamada}
1084dd88ab32SMasahiro Yamadasub ctx_statement_level {
1085dd88ab32SMasahiro Yamada	my ($linenr, $remain, $off) = @_;
1086dd88ab32SMasahiro Yamada
1087dd88ab32SMasahiro Yamada	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1088dd88ab32SMasahiro Yamada}
1089dd88ab32SMasahiro Yamada
1090dd88ab32SMasahiro Yamadasub ctx_locate_comment {
1091dd88ab32SMasahiro Yamada	my ($first_line, $end_line) = @_;
1092dd88ab32SMasahiro Yamada
1093dd88ab32SMasahiro Yamada	# Catch a comment on the end of the line itself.
1094dd88ab32SMasahiro Yamada	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
1095dd88ab32SMasahiro Yamada	return $current_comment if (defined $current_comment);
1096dd88ab32SMasahiro Yamada
1097dd88ab32SMasahiro Yamada	# Look through the context and try and figure out if there is a
1098dd88ab32SMasahiro Yamada	# comment.
1099dd88ab32SMasahiro Yamada	my $in_comment = 0;
1100dd88ab32SMasahiro Yamada	$current_comment = '';
1101dd88ab32SMasahiro Yamada	for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
1102dd88ab32SMasahiro Yamada		my $line = $rawlines[$linenr - 1];
1103dd88ab32SMasahiro Yamada		#warn "           $line\n";
1104dd88ab32SMasahiro Yamada		if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
1105dd88ab32SMasahiro Yamada			$in_comment = 1;
1106dd88ab32SMasahiro Yamada		}
1107dd88ab32SMasahiro Yamada		if ($line =~ m@/\*@) {
1108dd88ab32SMasahiro Yamada			$in_comment = 1;
1109dd88ab32SMasahiro Yamada		}
1110dd88ab32SMasahiro Yamada		if (!$in_comment && $current_comment ne '') {
1111dd88ab32SMasahiro Yamada			$current_comment = '';
1112dd88ab32SMasahiro Yamada		}
1113dd88ab32SMasahiro Yamada		$current_comment .= $line . "\n" if ($in_comment);
1114dd88ab32SMasahiro Yamada		if ($line =~ m@\*/@) {
1115dd88ab32SMasahiro Yamada			$in_comment = 0;
1116dd88ab32SMasahiro Yamada		}
1117dd88ab32SMasahiro Yamada	}
1118dd88ab32SMasahiro Yamada
1119dd88ab32SMasahiro Yamada	chomp($current_comment);
1120dd88ab32SMasahiro Yamada	return($current_comment);
1121dd88ab32SMasahiro Yamada}
1122dd88ab32SMasahiro Yamadasub ctx_has_comment {
1123dd88ab32SMasahiro Yamada	my ($first_line, $end_line) = @_;
1124dd88ab32SMasahiro Yamada	my $cmt = ctx_locate_comment($first_line, $end_line);
1125dd88ab32SMasahiro Yamada
1126dd88ab32SMasahiro Yamada	##print "LINE: $rawlines[$end_line - 1 ]\n";
1127dd88ab32SMasahiro Yamada	##print "CMMT: $cmt\n";
1128dd88ab32SMasahiro Yamada
1129dd88ab32SMasahiro Yamada	return ($cmt ne '');
1130dd88ab32SMasahiro Yamada}
1131dd88ab32SMasahiro Yamada
1132dd88ab32SMasahiro Yamadasub raw_line {
1133dd88ab32SMasahiro Yamada	my ($linenr, $cnt) = @_;
1134dd88ab32SMasahiro Yamada
1135dd88ab32SMasahiro Yamada	my $offset = $linenr - 1;
1136dd88ab32SMasahiro Yamada	$cnt++;
1137dd88ab32SMasahiro Yamada
1138dd88ab32SMasahiro Yamada	my $line;
1139dd88ab32SMasahiro Yamada	while ($cnt) {
1140dd88ab32SMasahiro Yamada		$line = $rawlines[$offset++];
1141dd88ab32SMasahiro Yamada		next if (defined($line) && $line =~ /^-/);
1142dd88ab32SMasahiro Yamada		$cnt--;
1143dd88ab32SMasahiro Yamada	}
1144dd88ab32SMasahiro Yamada
1145dd88ab32SMasahiro Yamada	return $line;
1146dd88ab32SMasahiro Yamada}
1147dd88ab32SMasahiro Yamada
1148dd88ab32SMasahiro Yamadasub cat_vet {
1149dd88ab32SMasahiro Yamada	my ($vet) = @_;
1150dd88ab32SMasahiro Yamada	my ($res, $coded);
1151dd88ab32SMasahiro Yamada
1152dd88ab32SMasahiro Yamada	$res = '';
1153dd88ab32SMasahiro Yamada	while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
1154dd88ab32SMasahiro Yamada		$res .= $1;
1155dd88ab32SMasahiro Yamada		if ($2 ne '') {
1156dd88ab32SMasahiro Yamada			$coded = sprintf("^%c", unpack('C', $2) + 64);
1157dd88ab32SMasahiro Yamada			$res .= $coded;
1158dd88ab32SMasahiro Yamada		}
1159dd88ab32SMasahiro Yamada	}
1160dd88ab32SMasahiro Yamada	$res =~ s/$/\$/;
1161dd88ab32SMasahiro Yamada
1162dd88ab32SMasahiro Yamada	return $res;
1163dd88ab32SMasahiro Yamada}
1164dd88ab32SMasahiro Yamada
1165dd88ab32SMasahiro Yamadamy $av_preprocessor = 0;
1166dd88ab32SMasahiro Yamadamy $av_pending;
1167dd88ab32SMasahiro Yamadamy @av_paren_type;
1168dd88ab32SMasahiro Yamadamy $av_pend_colon;
1169dd88ab32SMasahiro Yamada
1170dd88ab32SMasahiro Yamadasub annotate_reset {
1171dd88ab32SMasahiro Yamada	$av_preprocessor = 0;
1172dd88ab32SMasahiro Yamada	$av_pending = '_';
1173dd88ab32SMasahiro Yamada	@av_paren_type = ('E');
1174dd88ab32SMasahiro Yamada	$av_pend_colon = 'O';
1175dd88ab32SMasahiro Yamada}
1176dd88ab32SMasahiro Yamada
1177dd88ab32SMasahiro Yamadasub annotate_values {
1178dd88ab32SMasahiro Yamada	my ($stream, $type) = @_;
1179dd88ab32SMasahiro Yamada
1180dd88ab32SMasahiro Yamada	my $res;
1181dd88ab32SMasahiro Yamada	my $var = '_' x length($stream);
1182dd88ab32SMasahiro Yamada	my $cur = $stream;
1183dd88ab32SMasahiro Yamada
1184dd88ab32SMasahiro Yamada	print "$stream\n" if ($dbg_values > 1);
1185dd88ab32SMasahiro Yamada
1186dd88ab32SMasahiro Yamada	while (length($cur)) {
1187dd88ab32SMasahiro Yamada		@av_paren_type = ('E') if ($#av_paren_type < 0);
1188dd88ab32SMasahiro Yamada		print " <" . join('', @av_paren_type) .
1189dd88ab32SMasahiro Yamada				"> <$type> <$av_pending>" if ($dbg_values > 1);
1190dd88ab32SMasahiro Yamada		if ($cur =~ /^(\s+)/o) {
1191dd88ab32SMasahiro Yamada			print "WS($1)\n" if ($dbg_values > 1);
1192dd88ab32SMasahiro Yamada			if ($1 =~ /\n/ && $av_preprocessor) {
1193dd88ab32SMasahiro Yamada				$type = pop(@av_paren_type);
1194dd88ab32SMasahiro Yamada				$av_preprocessor = 0;
1195dd88ab32SMasahiro Yamada			}
1196dd88ab32SMasahiro Yamada
1197dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
1198dd88ab32SMasahiro Yamada			print "CAST($1)\n" if ($dbg_values > 1);
1199dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1200dd88ab32SMasahiro Yamada			$type = 'c';
1201dd88ab32SMasahiro Yamada
1202dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
1203dd88ab32SMasahiro Yamada			print "DECLARE($1)\n" if ($dbg_values > 1);
1204dd88ab32SMasahiro Yamada			$type = 'T';
1205dd88ab32SMasahiro Yamada
1206dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Modifier)\s*/) {
1207dd88ab32SMasahiro Yamada			print "MODIFIER($1)\n" if ($dbg_values > 1);
1208dd88ab32SMasahiro Yamada			$type = 'T';
1209dd88ab32SMasahiro Yamada
1210dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
1211dd88ab32SMasahiro Yamada			print "DEFINE($1,$2)\n" if ($dbg_values > 1);
1212dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1213dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1214dd88ab32SMasahiro Yamada			if ($2 ne '') {
1215dd88ab32SMasahiro Yamada				$av_pending = 'N';
1216dd88ab32SMasahiro Yamada			}
1217dd88ab32SMasahiro Yamada			$type = 'E';
1218dd88ab32SMasahiro Yamada
1219dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
1220dd88ab32SMasahiro Yamada			print "UNDEF($1)\n" if ($dbg_values > 1);
1221dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1222dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1223dd88ab32SMasahiro Yamada
1224dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
1225dd88ab32SMasahiro Yamada			print "PRE_START($1)\n" if ($dbg_values > 1);
1226dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1227dd88ab32SMasahiro Yamada
1228dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1229dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1230dd88ab32SMasahiro Yamada			$type = 'E';
1231dd88ab32SMasahiro Yamada
1232dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
1233dd88ab32SMasahiro Yamada			print "PRE_RESTART($1)\n" if ($dbg_values > 1);
1234dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1235dd88ab32SMasahiro Yamada
1236dd88ab32SMasahiro Yamada			push(@av_paren_type, $av_paren_type[$#av_paren_type]);
1237dd88ab32SMasahiro Yamada
1238dd88ab32SMasahiro Yamada			$type = 'E';
1239dd88ab32SMasahiro Yamada
1240dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
1241dd88ab32SMasahiro Yamada			print "PRE_END($1)\n" if ($dbg_values > 1);
1242dd88ab32SMasahiro Yamada
1243dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1244dd88ab32SMasahiro Yamada
1245dd88ab32SMasahiro Yamada			# Assume all arms of the conditional end as this
1246dd88ab32SMasahiro Yamada			# one does, and continue as if the #endif was not here.
1247dd88ab32SMasahiro Yamada			pop(@av_paren_type);
1248dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1249dd88ab32SMasahiro Yamada			$type = 'E';
1250dd88ab32SMasahiro Yamada
1251dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\\\n)/o) {
1252dd88ab32SMasahiro Yamada			print "PRECONT($1)\n" if ($dbg_values > 1);
1253dd88ab32SMasahiro Yamada
1254dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
1255dd88ab32SMasahiro Yamada			print "ATTR($1)\n" if ($dbg_values > 1);
1256dd88ab32SMasahiro Yamada			$av_pending = $type;
1257dd88ab32SMasahiro Yamada			$type = 'N';
1258dd88ab32SMasahiro Yamada
1259dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
1260dd88ab32SMasahiro Yamada			print "SIZEOF($1)\n" if ($dbg_values > 1);
1261dd88ab32SMasahiro Yamada			if (defined $2) {
1262dd88ab32SMasahiro Yamada				$av_pending = 'V';
1263dd88ab32SMasahiro Yamada			}
1264dd88ab32SMasahiro Yamada			$type = 'N';
1265dd88ab32SMasahiro Yamada
1266dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(if|while|for)\b/o) {
1267dd88ab32SMasahiro Yamada			print "COND($1)\n" if ($dbg_values > 1);
1268dd88ab32SMasahiro Yamada			$av_pending = 'E';
1269dd88ab32SMasahiro Yamada			$type = 'N';
1270dd88ab32SMasahiro Yamada
1271dd88ab32SMasahiro Yamada		} elsif ($cur =~/^(case)/o) {
1272dd88ab32SMasahiro Yamada			print "CASE($1)\n" if ($dbg_values > 1);
1273dd88ab32SMasahiro Yamada			$av_pend_colon = 'C';
1274dd88ab32SMasahiro Yamada			$type = 'N';
1275dd88ab32SMasahiro Yamada
1276dd88ab32SMasahiro Yamada		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
1277dd88ab32SMasahiro Yamada			print "KEYWORD($1)\n" if ($dbg_values > 1);
1278dd88ab32SMasahiro Yamada			$type = 'N';
1279dd88ab32SMasahiro Yamada
1280dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\()/o) {
1281dd88ab32SMasahiro Yamada			print "PAREN('$1')\n" if ($dbg_values > 1);
1282dd88ab32SMasahiro Yamada			push(@av_paren_type, $av_pending);
1283dd88ab32SMasahiro Yamada			$av_pending = '_';
1284dd88ab32SMasahiro Yamada			$type = 'N';
1285dd88ab32SMasahiro Yamada
1286dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\))/o) {
1287dd88ab32SMasahiro Yamada			my $new_type = pop(@av_paren_type);
1288dd88ab32SMasahiro Yamada			if ($new_type ne '_') {
1289dd88ab32SMasahiro Yamada				$type = $new_type;
1290dd88ab32SMasahiro Yamada				print "PAREN('$1') -> $type\n"
1291dd88ab32SMasahiro Yamada							if ($dbg_values > 1);
1292dd88ab32SMasahiro Yamada			} else {
1293dd88ab32SMasahiro Yamada				print "PAREN('$1')\n" if ($dbg_values > 1);
1294dd88ab32SMasahiro Yamada			}
1295dd88ab32SMasahiro Yamada
1296dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Ident)\s*\(/o) {
1297dd88ab32SMasahiro Yamada			print "FUNC($1)\n" if ($dbg_values > 1);
1298dd88ab32SMasahiro Yamada			$type = 'V';
1299dd88ab32SMasahiro Yamada			$av_pending = 'V';
1300dd88ab32SMasahiro Yamada
1301dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
1302dd88ab32SMasahiro Yamada			if (defined $2 && $type eq 'C' || $type eq 'T') {
1303dd88ab32SMasahiro Yamada				$av_pend_colon = 'B';
1304dd88ab32SMasahiro Yamada			} elsif ($type eq 'E') {
1305dd88ab32SMasahiro Yamada				$av_pend_colon = 'L';
1306dd88ab32SMasahiro Yamada			}
1307dd88ab32SMasahiro Yamada			print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
1308dd88ab32SMasahiro Yamada			$type = 'V';
1309dd88ab32SMasahiro Yamada
1310dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Ident|$Constant)/o) {
1311dd88ab32SMasahiro Yamada			print "IDENT($1)\n" if ($dbg_values > 1);
1312dd88ab32SMasahiro Yamada			$type = 'V';
1313dd88ab32SMasahiro Yamada
1314dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Assignment)/o) {
1315dd88ab32SMasahiro Yamada			print "ASSIGN($1)\n" if ($dbg_values > 1);
1316dd88ab32SMasahiro Yamada			$type = 'N';
1317dd88ab32SMasahiro Yamada
1318dd88ab32SMasahiro Yamada		} elsif ($cur =~/^(;|{|})/) {
1319dd88ab32SMasahiro Yamada			print "END($1)\n" if ($dbg_values > 1);
1320dd88ab32SMasahiro Yamada			$type = 'E';
1321dd88ab32SMasahiro Yamada			$av_pend_colon = 'O';
1322dd88ab32SMasahiro Yamada
1323dd88ab32SMasahiro Yamada		} elsif ($cur =~/^(,)/) {
1324dd88ab32SMasahiro Yamada			print "COMMA($1)\n" if ($dbg_values > 1);
1325dd88ab32SMasahiro Yamada			$type = 'C';
1326dd88ab32SMasahiro Yamada
1327dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\?)/o) {
1328dd88ab32SMasahiro Yamada			print "QUESTION($1)\n" if ($dbg_values > 1);
1329dd88ab32SMasahiro Yamada			$type = 'N';
1330dd88ab32SMasahiro Yamada
1331dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(:)/o) {
1332dd88ab32SMasahiro Yamada			print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
1333dd88ab32SMasahiro Yamada
1334dd88ab32SMasahiro Yamada			substr($var, length($res), 1, $av_pend_colon);
1335dd88ab32SMasahiro Yamada			if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
1336dd88ab32SMasahiro Yamada				$type = 'E';
1337dd88ab32SMasahiro Yamada			} else {
1338dd88ab32SMasahiro Yamada				$type = 'N';
1339dd88ab32SMasahiro Yamada			}
1340dd88ab32SMasahiro Yamada			$av_pend_colon = 'O';
1341dd88ab32SMasahiro Yamada
1342dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\[)/o) {
1343dd88ab32SMasahiro Yamada			print "CLOSE($1)\n" if ($dbg_values > 1);
1344dd88ab32SMasahiro Yamada			$type = 'N';
1345dd88ab32SMasahiro Yamada
1346dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
1347dd88ab32SMasahiro Yamada			my $variant;
1348dd88ab32SMasahiro Yamada
1349dd88ab32SMasahiro Yamada			print "OPV($1)\n" if ($dbg_values > 1);
1350dd88ab32SMasahiro Yamada			if ($type eq 'V') {
1351dd88ab32SMasahiro Yamada				$variant = 'B';
1352dd88ab32SMasahiro Yamada			} else {
1353dd88ab32SMasahiro Yamada				$variant = 'U';
1354dd88ab32SMasahiro Yamada			}
1355dd88ab32SMasahiro Yamada
1356dd88ab32SMasahiro Yamada			substr($var, length($res), 1, $variant);
1357dd88ab32SMasahiro Yamada			$type = 'N';
1358dd88ab32SMasahiro Yamada
1359dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Operators)/o) {
1360dd88ab32SMasahiro Yamada			print "OP($1)\n" if ($dbg_values > 1);
1361dd88ab32SMasahiro Yamada			if ($1 ne '++' && $1 ne '--') {
1362dd88ab32SMasahiro Yamada				$type = 'N';
1363dd88ab32SMasahiro Yamada			}
1364dd88ab32SMasahiro Yamada
1365dd88ab32SMasahiro Yamada		} elsif ($cur =~ /(^.)/o) {
1366dd88ab32SMasahiro Yamada			print "C($1)\n" if ($dbg_values > 1);
1367dd88ab32SMasahiro Yamada		}
1368dd88ab32SMasahiro Yamada		if (defined $1) {
1369dd88ab32SMasahiro Yamada			$cur = substr($cur, length($1));
1370dd88ab32SMasahiro Yamada			$res .= $type x length($1);
1371dd88ab32SMasahiro Yamada		}
1372dd88ab32SMasahiro Yamada	}
1373dd88ab32SMasahiro Yamada
1374dd88ab32SMasahiro Yamada	return ($res, $var);
1375dd88ab32SMasahiro Yamada}
1376dd88ab32SMasahiro Yamada
1377dd88ab32SMasahiro Yamadasub possible {
1378dd88ab32SMasahiro Yamada	my ($possible, $line) = @_;
1379dd88ab32SMasahiro Yamada	my $notPermitted = qr{(?:
1380dd88ab32SMasahiro Yamada		^(?:
1381dd88ab32SMasahiro Yamada			$Modifier|
1382dd88ab32SMasahiro Yamada			$Storage|
1383dd88ab32SMasahiro Yamada			$Type|
1384dd88ab32SMasahiro Yamada			DEFINE_\S+
1385dd88ab32SMasahiro Yamada		)$|
1386dd88ab32SMasahiro Yamada		^(?:
1387dd88ab32SMasahiro Yamada			goto|
1388dd88ab32SMasahiro Yamada			return|
1389dd88ab32SMasahiro Yamada			case|
1390dd88ab32SMasahiro Yamada			else|
1391dd88ab32SMasahiro Yamada			asm|__asm__|
1392dd88ab32SMasahiro Yamada			do|
1393dd88ab32SMasahiro Yamada			\#|
1394dd88ab32SMasahiro Yamada			\#\#|
1395dd88ab32SMasahiro Yamada		)(?:\s|$)|
1396dd88ab32SMasahiro Yamada		^(?:typedef|struct|enum)\b
1397dd88ab32SMasahiro Yamada	    )}x;
1398dd88ab32SMasahiro Yamada	warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
1399dd88ab32SMasahiro Yamada	if ($possible !~ $notPermitted) {
1400dd88ab32SMasahiro Yamada		# Check for modifiers.
1401dd88ab32SMasahiro Yamada		$possible =~ s/\s*$Storage\s*//g;
1402dd88ab32SMasahiro Yamada		$possible =~ s/\s*$Sparse\s*//g;
1403dd88ab32SMasahiro Yamada		if ($possible =~ /^\s*$/) {
1404dd88ab32SMasahiro Yamada
1405dd88ab32SMasahiro Yamada		} elsif ($possible =~ /\s/) {
1406dd88ab32SMasahiro Yamada			$possible =~ s/\s*$Type\s*//g;
1407dd88ab32SMasahiro Yamada			for my $modifier (split(' ', $possible)) {
1408dd88ab32SMasahiro Yamada				if ($modifier !~ $notPermitted) {
1409dd88ab32SMasahiro Yamada					warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
1410dd88ab32SMasahiro Yamada					push(@modifierList, $modifier);
1411dd88ab32SMasahiro Yamada				}
1412dd88ab32SMasahiro Yamada			}
1413dd88ab32SMasahiro Yamada
1414dd88ab32SMasahiro Yamada		} else {
1415dd88ab32SMasahiro Yamada			warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
1416dd88ab32SMasahiro Yamada			push(@typeList, $possible);
1417dd88ab32SMasahiro Yamada		}
1418dd88ab32SMasahiro Yamada		build_types();
1419dd88ab32SMasahiro Yamada	} else {
1420dd88ab32SMasahiro Yamada		warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
1421dd88ab32SMasahiro Yamada	}
1422dd88ab32SMasahiro Yamada}
1423dd88ab32SMasahiro Yamada
1424dd88ab32SMasahiro Yamadamy $prefix = '';
1425dd88ab32SMasahiro Yamada
1426dd88ab32SMasahiro Yamadasub show_type {
14276b9709d9STom Rini	return defined $use_type{$_[0]} if (scalar keys %use_type > 0);
14286b9709d9STom Rini
1429dd88ab32SMasahiro Yamada	return !defined $ignore_type{$_[0]};
1430dd88ab32SMasahiro Yamada}
1431dd88ab32SMasahiro Yamada
1432dd88ab32SMasahiro Yamadasub report {
1433dd88ab32SMasahiro Yamada	if (!show_type($_[1]) ||
1434dd88ab32SMasahiro Yamada	    (defined $tst_only && $_[2] !~ /\Q$tst_only\E/)) {
1435dd88ab32SMasahiro Yamada		return 0;
1436dd88ab32SMasahiro Yamada	}
1437dd88ab32SMasahiro Yamada	my $line;
1438dd88ab32SMasahiro Yamada	if ($show_types) {
1439dd88ab32SMasahiro Yamada		$line = "$prefix$_[0]:$_[1]: $_[2]\n";
1440dd88ab32SMasahiro Yamada	} else {
1441dd88ab32SMasahiro Yamada		$line = "$prefix$_[0]: $_[2]\n";
1442dd88ab32SMasahiro Yamada	}
1443dd88ab32SMasahiro Yamada	$line = (split('\n', $line))[0] . "\n" if ($terse);
1444dd88ab32SMasahiro Yamada
1445dd88ab32SMasahiro Yamada	push(our @report, $line);
1446dd88ab32SMasahiro Yamada
1447dd88ab32SMasahiro Yamada	return 1;
1448dd88ab32SMasahiro Yamada}
1449dd88ab32SMasahiro Yamadasub report_dump {
1450dd88ab32SMasahiro Yamada	our @report;
1451dd88ab32SMasahiro Yamada}
1452dd88ab32SMasahiro Yamada
1453dd88ab32SMasahiro Yamadasub ERROR {
1454dd88ab32SMasahiro Yamada	if (report("ERROR", $_[0], $_[1])) {
1455dd88ab32SMasahiro Yamada		our $clean = 0;
1456dd88ab32SMasahiro Yamada		our $cnt_error++;
14576b9709d9STom Rini		return 1;
1458dd88ab32SMasahiro Yamada	}
14596b9709d9STom Rini	return 0;
1460dd88ab32SMasahiro Yamada}
1461dd88ab32SMasahiro Yamadasub WARN {
1462dd88ab32SMasahiro Yamada	if (report("WARNING", $_[0], $_[1])) {
1463dd88ab32SMasahiro Yamada		our $clean = 0;
1464dd88ab32SMasahiro Yamada		our $cnt_warn++;
14656b9709d9STom Rini		return 1;
1466dd88ab32SMasahiro Yamada	}
14676b9709d9STom Rini	return 0;
1468dd88ab32SMasahiro Yamada}
1469dd88ab32SMasahiro Yamadasub CHK {
1470dd88ab32SMasahiro Yamada	if ($check && report("CHECK", $_[0], $_[1])) {
1471dd88ab32SMasahiro Yamada		our $clean = 0;
1472dd88ab32SMasahiro Yamada		our $cnt_chk++;
14736b9709d9STom Rini		return 1;
1474dd88ab32SMasahiro Yamada	}
14756b9709d9STom Rini	return 0;
1476dd88ab32SMasahiro Yamada}
1477dd88ab32SMasahiro Yamada
1478dd88ab32SMasahiro Yamadasub check_absolute_file {
1479dd88ab32SMasahiro Yamada	my ($absolute, $herecurr) = @_;
1480dd88ab32SMasahiro Yamada	my $file = $absolute;
1481dd88ab32SMasahiro Yamada
1482dd88ab32SMasahiro Yamada	##print "absolute<$absolute>\n";
1483dd88ab32SMasahiro Yamada
1484dd88ab32SMasahiro Yamada	# See if any suffix of this path is a path within the tree.
1485dd88ab32SMasahiro Yamada	while ($file =~ s@^[^/]*/@@) {
1486dd88ab32SMasahiro Yamada		if (-f "$root/$file") {
1487dd88ab32SMasahiro Yamada			##print "file<$file>\n";
1488dd88ab32SMasahiro Yamada			last;
1489dd88ab32SMasahiro Yamada		}
1490dd88ab32SMasahiro Yamada	}
1491dd88ab32SMasahiro Yamada	if (! -f _)  {
1492dd88ab32SMasahiro Yamada		return 0;
1493dd88ab32SMasahiro Yamada	}
1494dd88ab32SMasahiro Yamada
1495dd88ab32SMasahiro Yamada	# It is, so see if the prefix is acceptable.
1496dd88ab32SMasahiro Yamada	my $prefix = $absolute;
1497dd88ab32SMasahiro Yamada	substr($prefix, -length($file)) = '';
1498dd88ab32SMasahiro Yamada
1499dd88ab32SMasahiro Yamada	##print "prefix<$prefix>\n";
1500dd88ab32SMasahiro Yamada	if ($prefix ne ".../") {
1501dd88ab32SMasahiro Yamada		WARN("USE_RELATIVE_PATH",
1502dd88ab32SMasahiro Yamada		     "use relative pathname instead of absolute in changelog text\n" . $herecurr);
1503dd88ab32SMasahiro Yamada	}
1504dd88ab32SMasahiro Yamada}
1505dd88ab32SMasahiro Yamada
15066b9709d9STom Rinisub trim {
15076b9709d9STom Rini	my ($string) = @_;
15086b9709d9STom Rini
15096b9709d9STom Rini	$string =~ s/^\s+|\s+$//g;
15106b9709d9STom Rini
15116b9709d9STom Rini	return $string;
15126b9709d9STom Rini}
15136b9709d9STom Rini
15146b9709d9STom Rinisub ltrim {
15156b9709d9STom Rini	my ($string) = @_;
15166b9709d9STom Rini
15176b9709d9STom Rini	$string =~ s/^\s+//;
15186b9709d9STom Rini
15196b9709d9STom Rini	return $string;
15206b9709d9STom Rini}
15216b9709d9STom Rini
15226b9709d9STom Rinisub rtrim {
15236b9709d9STom Rini	my ($string) = @_;
15246b9709d9STom Rini
15256b9709d9STom Rini	$string =~ s/\s+$//;
15266b9709d9STom Rini
15276b9709d9STom Rini	return $string;
15286b9709d9STom Rini}
15296b9709d9STom Rini
15306b9709d9STom Rinisub string_find_replace {
15316b9709d9STom Rini	my ($string, $find, $replace) = @_;
15326b9709d9STom Rini
15336b9709d9STom Rini	$string =~ s/$find/$replace/g;
15346b9709d9STom Rini
15356b9709d9STom Rini	return $string;
15366b9709d9STom Rini}
15376b9709d9STom Rini
15386b9709d9STom Rinisub tabify {
15396b9709d9STom Rini	my ($leading) = @_;
15406b9709d9STom Rini
15416b9709d9STom Rini	my $source_indent = 8;
15426b9709d9STom Rini	my $max_spaces_before_tab = $source_indent - 1;
15436b9709d9STom Rini	my $spaces_to_tab = " " x $source_indent;
15446b9709d9STom Rini
15456b9709d9STom Rini	#convert leading spaces to tabs
15466b9709d9STom Rini	1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
15476b9709d9STom Rini	#Remove spaces before a tab
15486b9709d9STom Rini	1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
15496b9709d9STom Rini
15506b9709d9STom Rini	return "$leading";
15516b9709d9STom Rini}
15526b9709d9STom Rini
1553dd88ab32SMasahiro Yamadasub pos_last_openparen {
1554dd88ab32SMasahiro Yamada	my ($line) = @_;
1555dd88ab32SMasahiro Yamada
1556dd88ab32SMasahiro Yamada	my $pos = 0;
1557dd88ab32SMasahiro Yamada
1558dd88ab32SMasahiro Yamada	my $opens = $line =~ tr/\(/\(/;
1559dd88ab32SMasahiro Yamada	my $closes = $line =~ tr/\)/\)/;
1560dd88ab32SMasahiro Yamada
1561dd88ab32SMasahiro Yamada	my $last_openparen = 0;
1562dd88ab32SMasahiro Yamada
1563dd88ab32SMasahiro Yamada	if (($opens == 0) || ($closes >= $opens)) {
1564dd88ab32SMasahiro Yamada		return -1;
1565dd88ab32SMasahiro Yamada	}
1566dd88ab32SMasahiro Yamada
1567dd88ab32SMasahiro Yamada	my $len = length($line);
1568dd88ab32SMasahiro Yamada
1569dd88ab32SMasahiro Yamada	for ($pos = 0; $pos < $len; $pos++) {
1570dd88ab32SMasahiro Yamada		my $string = substr($line, $pos);
1571dd88ab32SMasahiro Yamada		if ($string =~ /^($FuncArg|$balanced_parens)/) {
1572dd88ab32SMasahiro Yamada			$pos += length($1) - 1;
1573dd88ab32SMasahiro Yamada		} elsif (substr($line, $pos, 1) eq '(') {
1574dd88ab32SMasahiro Yamada			$last_openparen = $pos;
1575dd88ab32SMasahiro Yamada		} elsif (index($string, '(') == -1) {
1576dd88ab32SMasahiro Yamada			last;
1577dd88ab32SMasahiro Yamada		}
1578dd88ab32SMasahiro Yamada	}
1579dd88ab32SMasahiro Yamada
1580dd88ab32SMasahiro Yamada	return $last_openparen + 1;
1581dd88ab32SMasahiro Yamada}
1582dd88ab32SMasahiro Yamada
1583dd88ab32SMasahiro Yamadasub process {
1584dd88ab32SMasahiro Yamada	my $filename = shift;
1585dd88ab32SMasahiro Yamada
1586dd88ab32SMasahiro Yamada	my $linenr=0;
1587dd88ab32SMasahiro Yamada	my $prevline="";
1588dd88ab32SMasahiro Yamada	my $prevrawline="";
1589dd88ab32SMasahiro Yamada	my $stashline="";
1590dd88ab32SMasahiro Yamada	my $stashrawline="";
1591dd88ab32SMasahiro Yamada
1592dd88ab32SMasahiro Yamada	my $length;
1593dd88ab32SMasahiro Yamada	my $indent;
1594dd88ab32SMasahiro Yamada	my $previndent=0;
1595dd88ab32SMasahiro Yamada	my $stashindent=0;
1596dd88ab32SMasahiro Yamada
1597dd88ab32SMasahiro Yamada	our $clean = 1;
1598dd88ab32SMasahiro Yamada	my $signoff = 0;
1599dd88ab32SMasahiro Yamada	my $is_patch = 0;
1600dd88ab32SMasahiro Yamada
1601dd88ab32SMasahiro Yamada	my $in_header_lines = 1;
1602dd88ab32SMasahiro Yamada	my $in_commit_log = 0;		#Scanning lines before patch
1603dd88ab32SMasahiro Yamada
1604dd88ab32SMasahiro Yamada	my $non_utf8_charset = 0;
1605dd88ab32SMasahiro Yamada
1606dd88ab32SMasahiro Yamada	our @report = ();
1607dd88ab32SMasahiro Yamada	our $cnt_lines = 0;
1608dd88ab32SMasahiro Yamada	our $cnt_error = 0;
1609dd88ab32SMasahiro Yamada	our $cnt_warn = 0;
1610dd88ab32SMasahiro Yamada	our $cnt_chk = 0;
1611dd88ab32SMasahiro Yamada
1612dd88ab32SMasahiro Yamada	# Trace the real file/line as we go.
1613dd88ab32SMasahiro Yamada	my $realfile = '';
1614dd88ab32SMasahiro Yamada	my $realline = 0;
1615dd88ab32SMasahiro Yamada	my $realcnt = 0;
1616dd88ab32SMasahiro Yamada	my $here = '';
1617dd88ab32SMasahiro Yamada	my $in_comment = 0;
1618dd88ab32SMasahiro Yamada	my $comment_edge = 0;
1619dd88ab32SMasahiro Yamada	my $first_line = 0;
1620dd88ab32SMasahiro Yamada	my $p1_prefix = '';
1621dd88ab32SMasahiro Yamada
1622dd88ab32SMasahiro Yamada	my $prev_values = 'E';
1623dd88ab32SMasahiro Yamada
1624dd88ab32SMasahiro Yamada	# suppression flags
1625dd88ab32SMasahiro Yamada	my %suppress_ifbraces;
1626dd88ab32SMasahiro Yamada	my %suppress_whiletrailers;
1627dd88ab32SMasahiro Yamada	my %suppress_export;
1628dd88ab32SMasahiro Yamada	my $suppress_statement = 0;
1629dd88ab32SMasahiro Yamada
16306b9709d9STom Rini	my %signatures = ();
1631dd88ab32SMasahiro Yamada
1632dd88ab32SMasahiro Yamada	# Pre-scan the patch sanitizing the lines.
1633dd88ab32SMasahiro Yamada	# Pre-scan the patch looking for any __setup documentation.
1634dd88ab32SMasahiro Yamada	#
1635dd88ab32SMasahiro Yamada	my @setup_docs = ();
1636dd88ab32SMasahiro Yamada	my $setup_docs = 0;
1637dd88ab32SMasahiro Yamada
16386b9709d9STom Rini	my $camelcase_file_seeded = 0;
16396b9709d9STom Rini
1640dd88ab32SMasahiro Yamada	sanitise_line_reset();
1641dd88ab32SMasahiro Yamada	my $line;
1642dd88ab32SMasahiro Yamada	foreach my $rawline (@rawlines) {
1643dd88ab32SMasahiro Yamada		$linenr++;
1644dd88ab32SMasahiro Yamada		$line = $rawline;
1645dd88ab32SMasahiro Yamada
16466b9709d9STom Rini		push(@fixed, $rawline) if ($fix);
16476b9709d9STom Rini
1648dd88ab32SMasahiro Yamada		if ($rawline=~/^\+\+\+\s+(\S+)/) {
1649dd88ab32SMasahiro Yamada			$setup_docs = 0;
1650dd88ab32SMasahiro Yamada			if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
1651dd88ab32SMasahiro Yamada				$setup_docs = 1;
1652dd88ab32SMasahiro Yamada			}
1653dd88ab32SMasahiro Yamada			#next;
1654dd88ab32SMasahiro Yamada		}
1655dd88ab32SMasahiro Yamada		if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
1656dd88ab32SMasahiro Yamada			$realline=$1-1;
1657dd88ab32SMasahiro Yamada			if (defined $2) {
1658dd88ab32SMasahiro Yamada				$realcnt=$3+1;
1659dd88ab32SMasahiro Yamada			} else {
1660dd88ab32SMasahiro Yamada				$realcnt=1+1;
1661dd88ab32SMasahiro Yamada			}
1662dd88ab32SMasahiro Yamada			$in_comment = 0;
1663dd88ab32SMasahiro Yamada
1664dd88ab32SMasahiro Yamada			# Guestimate if this is a continuing comment.  Run
1665dd88ab32SMasahiro Yamada			# the context looking for a comment "edge".  If this
1666dd88ab32SMasahiro Yamada			# edge is a close comment then we must be in a comment
1667dd88ab32SMasahiro Yamada			# at context start.
1668dd88ab32SMasahiro Yamada			my $edge;
1669dd88ab32SMasahiro Yamada			my $cnt = $realcnt;
1670dd88ab32SMasahiro Yamada			for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
1671dd88ab32SMasahiro Yamada				next if (defined $rawlines[$ln - 1] &&
1672dd88ab32SMasahiro Yamada					 $rawlines[$ln - 1] =~ /^-/);
1673dd88ab32SMasahiro Yamada				$cnt--;
1674dd88ab32SMasahiro Yamada				#print "RAW<$rawlines[$ln - 1]>\n";
1675dd88ab32SMasahiro Yamada				last if (!defined $rawlines[$ln - 1]);
1676dd88ab32SMasahiro Yamada				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
1677dd88ab32SMasahiro Yamada				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
1678dd88ab32SMasahiro Yamada					($edge) = $1;
1679dd88ab32SMasahiro Yamada					last;
1680dd88ab32SMasahiro Yamada				}
1681dd88ab32SMasahiro Yamada			}
1682dd88ab32SMasahiro Yamada			if (defined $edge && $edge eq '*/') {
1683dd88ab32SMasahiro Yamada				$in_comment = 1;
1684dd88ab32SMasahiro Yamada			}
1685dd88ab32SMasahiro Yamada
1686dd88ab32SMasahiro Yamada			# Guestimate if this is a continuing comment.  If this
1687dd88ab32SMasahiro Yamada			# is the start of a diff block and this line starts
1688dd88ab32SMasahiro Yamada			# ' *' then it is very likely a comment.
1689dd88ab32SMasahiro Yamada			if (!defined $edge &&
1690dd88ab32SMasahiro Yamada			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
1691dd88ab32SMasahiro Yamada			{
1692dd88ab32SMasahiro Yamada				$in_comment = 1;
1693dd88ab32SMasahiro Yamada			}
1694dd88ab32SMasahiro Yamada
1695dd88ab32SMasahiro Yamada			##print "COMMENT:$in_comment edge<$edge> $rawline\n";
1696dd88ab32SMasahiro Yamada			sanitise_line_reset($in_comment);
1697dd88ab32SMasahiro Yamada
1698dd88ab32SMasahiro Yamada		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
1699dd88ab32SMasahiro Yamada			# Standardise the strings and chars within the input to
1700dd88ab32SMasahiro Yamada			# simplify matching -- only bother with positive lines.
1701dd88ab32SMasahiro Yamada			$line = sanitise_line($rawline);
1702dd88ab32SMasahiro Yamada		}
1703dd88ab32SMasahiro Yamada		push(@lines, $line);
1704dd88ab32SMasahiro Yamada
1705dd88ab32SMasahiro Yamada		if ($realcnt > 1) {
1706dd88ab32SMasahiro Yamada			$realcnt-- if ($line =~ /^(?:\+| |$)/);
1707dd88ab32SMasahiro Yamada		} else {
1708dd88ab32SMasahiro Yamada			$realcnt = 0;
1709dd88ab32SMasahiro Yamada		}
1710dd88ab32SMasahiro Yamada
1711dd88ab32SMasahiro Yamada		#print "==>$rawline\n";
1712dd88ab32SMasahiro Yamada		#print "-->$line\n";
1713dd88ab32SMasahiro Yamada
1714dd88ab32SMasahiro Yamada		if ($setup_docs && $line =~ /^\+/) {
1715dd88ab32SMasahiro Yamada			push(@setup_docs, $line);
1716dd88ab32SMasahiro Yamada		}
1717dd88ab32SMasahiro Yamada	}
1718dd88ab32SMasahiro Yamada
1719dd88ab32SMasahiro Yamada	$prefix = '';
1720dd88ab32SMasahiro Yamada
1721dd88ab32SMasahiro Yamada	$realcnt = 0;
1722dd88ab32SMasahiro Yamada	$linenr = 0;
1723dd88ab32SMasahiro Yamada	foreach my $line (@lines) {
1724dd88ab32SMasahiro Yamada		$linenr++;
17256b9709d9STom Rini		my $sline = $line;	#copy of $line
17266b9709d9STom Rini		$sline =~ s/$;/ /g;	#with comments as spaces
1727dd88ab32SMasahiro Yamada
1728dd88ab32SMasahiro Yamada		my $rawline = $rawlines[$linenr - 1];
1729dd88ab32SMasahiro Yamada
1730dd88ab32SMasahiro Yamada#extract the line range in the file after the patch is applied
1731dd88ab32SMasahiro Yamada		if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
1732dd88ab32SMasahiro Yamada			$is_patch = 1;
1733dd88ab32SMasahiro Yamada			$first_line = $linenr + 1;
1734dd88ab32SMasahiro Yamada			$realline=$1-1;
1735dd88ab32SMasahiro Yamada			if (defined $2) {
1736dd88ab32SMasahiro Yamada				$realcnt=$3+1;
1737dd88ab32SMasahiro Yamada			} else {
1738dd88ab32SMasahiro Yamada				$realcnt=1+1;
1739dd88ab32SMasahiro Yamada			}
1740dd88ab32SMasahiro Yamada			annotate_reset();
1741dd88ab32SMasahiro Yamada			$prev_values = 'E';
1742dd88ab32SMasahiro Yamada
1743dd88ab32SMasahiro Yamada			%suppress_ifbraces = ();
1744dd88ab32SMasahiro Yamada			%suppress_whiletrailers = ();
1745dd88ab32SMasahiro Yamada			%suppress_export = ();
1746dd88ab32SMasahiro Yamada			$suppress_statement = 0;
1747dd88ab32SMasahiro Yamada			next;
1748dd88ab32SMasahiro Yamada
1749dd88ab32SMasahiro Yamada# track the line number as we move through the hunk, note that
1750dd88ab32SMasahiro Yamada# new versions of GNU diff omit the leading space on completely
1751dd88ab32SMasahiro Yamada# blank context lines so we need to count that too.
1752dd88ab32SMasahiro Yamada		} elsif ($line =~ /^( |\+|$)/) {
1753dd88ab32SMasahiro Yamada			$realline++;
1754dd88ab32SMasahiro Yamada			$realcnt-- if ($realcnt != 0);
1755dd88ab32SMasahiro Yamada
1756dd88ab32SMasahiro Yamada			# Measure the line length and indent.
1757dd88ab32SMasahiro Yamada			($length, $indent) = line_stats($rawline);
1758dd88ab32SMasahiro Yamada
1759dd88ab32SMasahiro Yamada			# Track the previous line.
1760dd88ab32SMasahiro Yamada			($prevline, $stashline) = ($stashline, $line);
1761dd88ab32SMasahiro Yamada			($previndent, $stashindent) = ($stashindent, $indent);
1762dd88ab32SMasahiro Yamada			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
1763dd88ab32SMasahiro Yamada
1764dd88ab32SMasahiro Yamada			#warn "line<$line>\n";
1765dd88ab32SMasahiro Yamada
1766dd88ab32SMasahiro Yamada		} elsif ($realcnt == 1) {
1767dd88ab32SMasahiro Yamada			$realcnt--;
1768dd88ab32SMasahiro Yamada		}
1769dd88ab32SMasahiro Yamada
1770dd88ab32SMasahiro Yamada		my $hunk_line = ($realcnt != 0);
1771dd88ab32SMasahiro Yamada
1772dd88ab32SMasahiro Yamada#make up the handle for any error we report on this line
1773dd88ab32SMasahiro Yamada		$prefix = "$filename:$realline: " if ($emacs && $file);
1774dd88ab32SMasahiro Yamada		$prefix = "$filename:$linenr: " if ($emacs && !$file);
1775dd88ab32SMasahiro Yamada
1776dd88ab32SMasahiro Yamada		$here = "#$linenr: " if (!$file);
1777dd88ab32SMasahiro Yamada		$here = "#$realline: " if ($file);
1778dd88ab32SMasahiro Yamada
1779dd88ab32SMasahiro Yamada		# extract the filename as it passes
1780dd88ab32SMasahiro Yamada		if ($line =~ /^diff --git.*?(\S+)$/) {
1781dd88ab32SMasahiro Yamada			$realfile = $1;
17826b9709d9STom Rini			$realfile =~ s@^([^/]*)/@@ if (!$file);
1783dd88ab32SMasahiro Yamada			$in_commit_log = 0;
1784dd88ab32SMasahiro Yamada		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
1785dd88ab32SMasahiro Yamada			$realfile = $1;
17866b9709d9STom Rini			$realfile =~ s@^([^/]*)/@@ if (!$file);
1787dd88ab32SMasahiro Yamada			$in_commit_log = 0;
1788dd88ab32SMasahiro Yamada
1789dd88ab32SMasahiro Yamada			$p1_prefix = $1;
1790dd88ab32SMasahiro Yamada			if (!$file && $tree && $p1_prefix ne '' &&
1791dd88ab32SMasahiro Yamada			    -e "$root/$p1_prefix") {
1792dd88ab32SMasahiro Yamada				WARN("PATCH_PREFIX",
1793dd88ab32SMasahiro Yamada				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
1794dd88ab32SMasahiro Yamada			}
1795dd88ab32SMasahiro Yamada
1796dd88ab32SMasahiro Yamada			if ($realfile =~ m@^include/asm/@) {
1797dd88ab32SMasahiro Yamada				ERROR("MODIFIED_INCLUDE_ASM",
1798dd88ab32SMasahiro Yamada				      "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
1799dd88ab32SMasahiro Yamada			}
1800dd88ab32SMasahiro Yamada			next;
1801dd88ab32SMasahiro Yamada		}
1802dd88ab32SMasahiro Yamada
1803dd88ab32SMasahiro Yamada		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
1804dd88ab32SMasahiro Yamada
1805dd88ab32SMasahiro Yamada		my $hereline = "$here\n$rawline\n";
1806dd88ab32SMasahiro Yamada		my $herecurr = "$here\n$rawline\n";
1807dd88ab32SMasahiro Yamada		my $hereprev = "$here\n$prevrawline\n$rawline\n";
1808dd88ab32SMasahiro Yamada
1809dd88ab32SMasahiro Yamada		$cnt_lines++ if ($realcnt != 0);
1810dd88ab32SMasahiro Yamada
1811dd88ab32SMasahiro Yamada# Check for incorrect file permissions
1812dd88ab32SMasahiro Yamada		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
1813dd88ab32SMasahiro Yamada			my $permhere = $here . "FILE: $realfile\n";
18146b9709d9STom Rini			if ($realfile !~ m@scripts/@ &&
18156b9709d9STom Rini			    $realfile !~ /\.(py|pl|awk|sh)$/) {
1816dd88ab32SMasahiro Yamada				ERROR("EXECUTE_PERMISSIONS",
1817dd88ab32SMasahiro Yamada				      "do not set execute permissions for source files\n" . $permhere);
1818dd88ab32SMasahiro Yamada			}
1819dd88ab32SMasahiro Yamada		}
1820dd88ab32SMasahiro Yamada
1821dd88ab32SMasahiro Yamada# Check the patch for a signoff:
1822dd88ab32SMasahiro Yamada		if ($line =~ /^\s*signed-off-by:/i) {
1823dd88ab32SMasahiro Yamada			$signoff++;
1824dd88ab32SMasahiro Yamada			$in_commit_log = 0;
1825dd88ab32SMasahiro Yamada		}
1826dd88ab32SMasahiro Yamada
1827dd88ab32SMasahiro Yamada# Check signature styles
1828dd88ab32SMasahiro Yamada		if (!$in_header_lines &&
1829dd88ab32SMasahiro Yamada		    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
1830dd88ab32SMasahiro Yamada			my $space_before = $1;
1831dd88ab32SMasahiro Yamada			my $sign_off = $2;
1832dd88ab32SMasahiro Yamada			my $space_after = $3;
1833dd88ab32SMasahiro Yamada			my $email = $4;
1834dd88ab32SMasahiro Yamada			my $ucfirst_sign_off = ucfirst(lc($sign_off));
1835dd88ab32SMasahiro Yamada
1836dd88ab32SMasahiro Yamada			if ($sign_off !~ /$signature_tags/) {
1837dd88ab32SMasahiro Yamada				WARN("BAD_SIGN_OFF",
1838dd88ab32SMasahiro Yamada				     "Non-standard signature: $sign_off\n" . $herecurr);
1839dd88ab32SMasahiro Yamada			}
1840dd88ab32SMasahiro Yamada			if (defined $space_before && $space_before ne "") {
18416b9709d9STom Rini				if (WARN("BAD_SIGN_OFF",
18426b9709d9STom Rini					 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
18436b9709d9STom Rini				    $fix) {
18446b9709d9STom Rini					$fixed[$linenr - 1] =
18456b9709d9STom Rini					    "$ucfirst_sign_off $email";
18466b9709d9STom Rini				}
1847dd88ab32SMasahiro Yamada			}
1848dd88ab32SMasahiro Yamada			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
18496b9709d9STom Rini				if (WARN("BAD_SIGN_OFF",
18506b9709d9STom Rini					 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
18516b9709d9STom Rini				    $fix) {
18526b9709d9STom Rini					$fixed[$linenr - 1] =
18536b9709d9STom Rini					    "$ucfirst_sign_off $email";
18546b9709d9STom Rini				}
18556b9709d9STom Rini
1856dd88ab32SMasahiro Yamada			}
1857dd88ab32SMasahiro Yamada			if (!defined $space_after || $space_after ne " ") {
18586b9709d9STom Rini				if (WARN("BAD_SIGN_OFF",
18596b9709d9STom Rini					 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
18606b9709d9STom Rini				    $fix) {
18616b9709d9STom Rini					$fixed[$linenr - 1] =
18626b9709d9STom Rini					    "$ucfirst_sign_off $email";
18636b9709d9STom Rini				}
1864dd88ab32SMasahiro Yamada			}
1865dd88ab32SMasahiro Yamada
1866dd88ab32SMasahiro Yamada			my ($email_name, $email_address, $comment) = parse_email($email);
1867dd88ab32SMasahiro Yamada			my $suggested_email = format_email(($email_name, $email_address));
1868dd88ab32SMasahiro Yamada			if ($suggested_email eq "") {
1869dd88ab32SMasahiro Yamada				ERROR("BAD_SIGN_OFF",
1870dd88ab32SMasahiro Yamada				      "Unrecognized email address: '$email'\n" . $herecurr);
1871dd88ab32SMasahiro Yamada			} else {
1872dd88ab32SMasahiro Yamada				my $dequoted = $suggested_email;
1873dd88ab32SMasahiro Yamada				$dequoted =~ s/^"//;
1874dd88ab32SMasahiro Yamada				$dequoted =~ s/" </ </;
1875dd88ab32SMasahiro Yamada				# Don't force email to have quotes
1876dd88ab32SMasahiro Yamada				# Allow just an angle bracketed address
1877dd88ab32SMasahiro Yamada				if ("$dequoted$comment" ne $email &&
1878dd88ab32SMasahiro Yamada				    "<$email_address>$comment" ne $email &&
1879dd88ab32SMasahiro Yamada				    "$suggested_email$comment" ne $email) {
1880dd88ab32SMasahiro Yamada					WARN("BAD_SIGN_OFF",
1881dd88ab32SMasahiro Yamada					     "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
1882dd88ab32SMasahiro Yamada				}
1883dd88ab32SMasahiro Yamada			}
18846b9709d9STom Rini
18856b9709d9STom Rini# Check for duplicate signatures
18866b9709d9STom Rini			my $sig_nospace = $line;
18876b9709d9STom Rini			$sig_nospace =~ s/\s//g;
18886b9709d9STom Rini			$sig_nospace = lc($sig_nospace);
18896b9709d9STom Rini			if (defined $signatures{$sig_nospace}) {
18906b9709d9STom Rini				WARN("BAD_SIGN_OFF",
18916b9709d9STom Rini				     "Duplicate signature\n" . $herecurr);
18926b9709d9STom Rini			} else {
18936b9709d9STom Rini				$signatures{$sig_nospace} = 1;
18946b9709d9STom Rini			}
1895dd88ab32SMasahiro Yamada		}
1896dd88ab32SMasahiro Yamada
1897dd88ab32SMasahiro Yamada# Check for wrappage within a valid hunk of the file
1898dd88ab32SMasahiro Yamada		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
1899dd88ab32SMasahiro Yamada			ERROR("CORRUPTED_PATCH",
1900dd88ab32SMasahiro Yamada			      "patch seems to be corrupt (line wrapped?)\n" .
1901dd88ab32SMasahiro Yamada				$herecurr) if (!$emitted_corrupt++);
1902dd88ab32SMasahiro Yamada		}
1903dd88ab32SMasahiro Yamada
1904dd88ab32SMasahiro Yamada# Check for absolute kernel paths.
1905dd88ab32SMasahiro Yamada		if ($tree) {
1906dd88ab32SMasahiro Yamada			while ($line =~ m{(?:^|\s)(/\S*)}g) {
1907dd88ab32SMasahiro Yamada				my $file = $1;
1908dd88ab32SMasahiro Yamada
1909dd88ab32SMasahiro Yamada				if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
1910dd88ab32SMasahiro Yamada				    check_absolute_file($1, $herecurr)) {
1911dd88ab32SMasahiro Yamada					#
1912dd88ab32SMasahiro Yamada				} else {
1913dd88ab32SMasahiro Yamada					check_absolute_file($file, $herecurr);
1914dd88ab32SMasahiro Yamada				}
1915dd88ab32SMasahiro Yamada			}
1916dd88ab32SMasahiro Yamada		}
1917dd88ab32SMasahiro Yamada
1918dd88ab32SMasahiro Yamada# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
1919dd88ab32SMasahiro Yamada		if (($realfile =~ /^$/ || $line =~ /^\+/) &&
1920dd88ab32SMasahiro Yamada		    $rawline !~ m/^$UTF8*$/) {
1921dd88ab32SMasahiro Yamada			my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
1922dd88ab32SMasahiro Yamada
1923dd88ab32SMasahiro Yamada			my $blank = copy_spacing($rawline);
1924dd88ab32SMasahiro Yamada			my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
1925dd88ab32SMasahiro Yamada			my $hereptr = "$hereline$ptr\n";
1926dd88ab32SMasahiro Yamada
1927dd88ab32SMasahiro Yamada			CHK("INVALID_UTF8",
1928dd88ab32SMasahiro Yamada			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
1929dd88ab32SMasahiro Yamada		}
1930dd88ab32SMasahiro Yamada
1931dd88ab32SMasahiro Yamada# Check if it's the start of a commit log
1932dd88ab32SMasahiro Yamada# (not a header line and we haven't seen the patch filename)
1933dd88ab32SMasahiro Yamada		if ($in_header_lines && $realfile =~ /^$/ &&
1934dd88ab32SMasahiro Yamada		    $rawline !~ /^(commit\b|from\b|[\w-]+:).+$/i) {
1935dd88ab32SMasahiro Yamada			$in_header_lines = 0;
1936dd88ab32SMasahiro Yamada			$in_commit_log = 1;
1937dd88ab32SMasahiro Yamada		}
1938dd88ab32SMasahiro Yamada
1939dd88ab32SMasahiro Yamada# Check if there is UTF-8 in a commit log when a mail header has explicitly
1940dd88ab32SMasahiro Yamada# declined it, i.e defined some charset where it is missing.
1941dd88ab32SMasahiro Yamada		if ($in_header_lines &&
1942dd88ab32SMasahiro Yamada		    $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
1943dd88ab32SMasahiro Yamada		    $1 !~ /utf-8/i) {
1944dd88ab32SMasahiro Yamada			$non_utf8_charset = 1;
1945dd88ab32SMasahiro Yamada		}
1946dd88ab32SMasahiro Yamada
1947dd88ab32SMasahiro Yamada		if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
1948dd88ab32SMasahiro Yamada		    $rawline =~ /$NON_ASCII_UTF8/) {
1949dd88ab32SMasahiro Yamada			WARN("UTF8_BEFORE_PATCH",
1950dd88ab32SMasahiro Yamada			    "8-bit UTF-8 used in possible commit log\n" . $herecurr);
1951dd88ab32SMasahiro Yamada		}
1952dd88ab32SMasahiro Yamada
1953dd88ab32SMasahiro Yamada# ignore non-hunk lines and lines being removed
1954dd88ab32SMasahiro Yamada		next if (!$hunk_line || $line =~ /^-/);
1955dd88ab32SMasahiro Yamada
1956dd88ab32SMasahiro Yamada#trailing whitespace
1957dd88ab32SMasahiro Yamada		if ($line =~ /^\+.*\015/) {
1958dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
19596b9709d9STom Rini			if (ERROR("DOS_LINE_ENDINGS",
19606b9709d9STom Rini				  "DOS line endings\n" . $herevet) &&
19616b9709d9STom Rini			    $fix) {
19626b9709d9STom Rini				$fixed[$linenr - 1] =~ s/[\s\015]+$//;
19636b9709d9STom Rini			}
1964dd88ab32SMasahiro Yamada		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
1965dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
19666b9709d9STom Rini			if (ERROR("TRAILING_WHITESPACE",
19676b9709d9STom Rini				  "trailing whitespace\n" . $herevet) &&
19686b9709d9STom Rini			    $fix) {
19696b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\s+$//;
19706b9709d9STom Rini			}
19716b9709d9STom Rini
1972dd88ab32SMasahiro Yamada			$rpt_cleaners = 1;
1973dd88ab32SMasahiro Yamada		}
1974dd88ab32SMasahiro Yamada
19756b9709d9STom Rini# Check for FSF mailing addresses.
19766b9709d9STom Rini		if ($rawline =~ /\bwrite to the Free/i ||
19776b9709d9STom Rini		    $rawline =~ /\b59\s+Temple\s+Pl/i ||
19786b9709d9STom Rini		    $rawline =~ /\b51\s+Franklin\s+St/i) {
19796b9709d9STom Rini			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
19806b9709d9STom Rini			my $msg_type = \&ERROR;
19816b9709d9STom Rini			$msg_type = \&CHK if ($file);
19826b9709d9STom Rini			&{$msg_type}("FSF_MAILING_ADDRESS",
19836b9709d9STom Rini				     "Do not include the paragraph about writing to the Free Software Foundation's mailing address from the sample GPL notice. The FSF has changed addresses in the past, and may do so again. Linux already includes a copy of the GPL.\n" . $herevet)
19846b9709d9STom Rini		}
19856b9709d9STom Rini
1986dd88ab32SMasahiro Yamada# check for Kconfig help text having a real description
1987dd88ab32SMasahiro Yamada# Only applies when adding the entry originally, after that we do not have
1988dd88ab32SMasahiro Yamada# sufficient context to determine whether it is indeed long enough.
1989dd88ab32SMasahiro Yamada		if ($realfile =~ /Kconfig/ &&
1990dd88ab32SMasahiro Yamada		    $line =~ /.\s*config\s+/) {
1991dd88ab32SMasahiro Yamada			my $length = 0;
1992dd88ab32SMasahiro Yamada			my $cnt = $realcnt;
1993dd88ab32SMasahiro Yamada			my $ln = $linenr + 1;
1994dd88ab32SMasahiro Yamada			my $f;
1995dd88ab32SMasahiro Yamada			my $is_start = 0;
1996dd88ab32SMasahiro Yamada			my $is_end = 0;
1997dd88ab32SMasahiro Yamada			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
1998dd88ab32SMasahiro Yamada				$f = $lines[$ln - 1];
1999dd88ab32SMasahiro Yamada				$cnt-- if ($lines[$ln - 1] !~ /^-/);
2000dd88ab32SMasahiro Yamada				$is_end = $lines[$ln - 1] =~ /^\+/;
2001dd88ab32SMasahiro Yamada
2002dd88ab32SMasahiro Yamada				next if ($f =~ /^-/);
2003dd88ab32SMasahiro Yamada
2004dd88ab32SMasahiro Yamada				if ($lines[$ln - 1] =~ /.\s*(?:bool|tristate)\s*\"/) {
2005dd88ab32SMasahiro Yamada					$is_start = 1;
2006dd88ab32SMasahiro Yamada				} elsif ($lines[$ln - 1] =~ /.\s*(?:---)?help(?:---)?$/) {
2007dd88ab32SMasahiro Yamada					$length = -1;
2008dd88ab32SMasahiro Yamada				}
2009dd88ab32SMasahiro Yamada
2010dd88ab32SMasahiro Yamada				$f =~ s/^.//;
2011dd88ab32SMasahiro Yamada				$f =~ s/#.*//;
2012dd88ab32SMasahiro Yamada				$f =~ s/^\s+//;
2013dd88ab32SMasahiro Yamada				next if ($f =~ /^$/);
2014dd88ab32SMasahiro Yamada				if ($f =~ /^\s*config\s/) {
2015dd88ab32SMasahiro Yamada					$is_end = 1;
2016dd88ab32SMasahiro Yamada					last;
2017dd88ab32SMasahiro Yamada				}
2018dd88ab32SMasahiro Yamada				$length++;
2019dd88ab32SMasahiro Yamada			}
2020dd88ab32SMasahiro Yamada			WARN("CONFIG_DESCRIPTION",
2021dd88ab32SMasahiro Yamada			     "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_start && $is_end && $length < 4);
2022dd88ab32SMasahiro Yamada			#print "is_start<$is_start> is_end<$is_end> length<$length>\n";
2023dd88ab32SMasahiro Yamada		}
2024dd88ab32SMasahiro Yamada
2025dd88ab32SMasahiro Yamada# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
2026dd88ab32SMasahiro Yamada		if ($realfile =~ /Kconfig/ &&
2027dd88ab32SMasahiro Yamada		    $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
2028dd88ab32SMasahiro Yamada			WARN("CONFIG_EXPERIMENTAL",
2029dd88ab32SMasahiro Yamada			     "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2030dd88ab32SMasahiro Yamada		}
2031dd88ab32SMasahiro Yamada
2032dd88ab32SMasahiro Yamada		if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
2033dd88ab32SMasahiro Yamada		    ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
2034dd88ab32SMasahiro Yamada			my $flag = $1;
2035dd88ab32SMasahiro Yamada			my $replacement = {
2036dd88ab32SMasahiro Yamada				'EXTRA_AFLAGS' =>   'asflags-y',
2037dd88ab32SMasahiro Yamada				'EXTRA_CFLAGS' =>   'ccflags-y',
2038dd88ab32SMasahiro Yamada				'EXTRA_CPPFLAGS' => 'cppflags-y',
2039dd88ab32SMasahiro Yamada				'EXTRA_LDFLAGS' =>  'ldflags-y',
2040dd88ab32SMasahiro Yamada			};
2041dd88ab32SMasahiro Yamada
2042dd88ab32SMasahiro Yamada			WARN("DEPRECATED_VARIABLE",
2043dd88ab32SMasahiro Yamada			     "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
2044dd88ab32SMasahiro Yamada		}
2045dd88ab32SMasahiro Yamada
20466b9709d9STom Rini# check for DT compatible documentation
20476b9709d9STom Rini		if (defined $root && $realfile =~ /\.dts/ &&
20486b9709d9STom Rini		    $rawline =~ /^\+\s*compatible\s*=/) {
20496b9709d9STom Rini			my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
20506b9709d9STom Rini
20516b9709d9STom Rini			foreach my $compat (@compats) {
20526b9709d9STom Rini				my $compat2 = $compat;
20536b9709d9STom Rini				my $dt_path =  $root . "/Documentation/devicetree/bindings/";
20546b9709d9STom Rini				$compat2 =~ s/\,[a-z]*\-/\,<\.\*>\-/;
20556b9709d9STom Rini				`grep -Erq "$compat|$compat2" $dt_path`;
20566b9709d9STom Rini				if ( $? >> 8 ) {
20576b9709d9STom Rini					WARN("UNDOCUMENTED_DT_STRING",
20586b9709d9STom Rini					     "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
20596b9709d9STom Rini				}
20606b9709d9STom Rini
20616b9709d9STom Rini				my $vendor = $compat;
20626b9709d9STom Rini				my $vendor_path = $dt_path . "vendor-prefixes.txt";
20636b9709d9STom Rini				next if (! -f $vendor_path);
20646b9709d9STom Rini				$vendor =~ s/^([a-zA-Z0-9]+)\,.*/$1/;
20656b9709d9STom Rini				`grep -Eq "$vendor" $vendor_path`;
20666b9709d9STom Rini				if ( $? >> 8 ) {
20676b9709d9STom Rini					WARN("UNDOCUMENTED_DT_STRING",
20686b9709d9STom Rini					     "DT compatible string vendor \"$vendor\" appears un-documented -- check $vendor_path\n" . $herecurr);
20696b9709d9STom Rini				}
20706b9709d9STom Rini			}
20716b9709d9STom Rini		}
20726b9709d9STom Rini
2073dd88ab32SMasahiro Yamada# check we are in a valid source file if not then ignore this hunk
2074dd88ab32SMasahiro Yamada		next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
2075dd88ab32SMasahiro Yamada
2076dd88ab32SMasahiro Yamada#line length limit
2077dd88ab32SMasahiro Yamada		if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
2078dd88ab32SMasahiro Yamada		    $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
2079dd88ab32SMasahiro Yamada		    !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
2080dd88ab32SMasahiro Yamada		    $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
2081dd88ab32SMasahiro Yamada		    $length > $max_line_length)
2082dd88ab32SMasahiro Yamada		{
2083dd88ab32SMasahiro Yamada			WARN("LONG_LINE",
2084dd88ab32SMasahiro Yamada			     "line over $max_line_length characters\n" . $herecurr);
2085dd88ab32SMasahiro Yamada		}
2086dd88ab32SMasahiro Yamada
2087dd88ab32SMasahiro Yamada# Check for user-visible strings broken across lines, which breaks the ability
20886b9709d9STom Rini# to grep for the string.  Make exceptions when the previous string ends in a
20896b9709d9STom Rini# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
20906b9709d9STom Rini# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
2091dd88ab32SMasahiro Yamada		if ($line =~ /^\+\s*"/ &&
2092dd88ab32SMasahiro Yamada		    $prevline =~ /"\s*$/ &&
20936b9709d9STom Rini		    $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
2094dd88ab32SMasahiro Yamada			WARN("SPLIT_STRING",
2095dd88ab32SMasahiro Yamada			     "quoted string split across lines\n" . $hereprev);
2096dd88ab32SMasahiro Yamada		}
2097dd88ab32SMasahiro Yamada
2098dd88ab32SMasahiro Yamada# check for spaces before a quoted newline
2099dd88ab32SMasahiro Yamada		if ($rawline =~ /^.*\".*\s\\n/) {
21006b9709d9STom Rini			if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
21016b9709d9STom Rini				 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
21026b9709d9STom Rini			    $fix) {
21036b9709d9STom Rini				$fixed[$linenr - 1] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
21046b9709d9STom Rini			}
21056b9709d9STom Rini
2106dd88ab32SMasahiro Yamada		}
2107dd88ab32SMasahiro Yamada
2108dd88ab32SMasahiro Yamada# check for adding lines without a newline.
2109dd88ab32SMasahiro Yamada		if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
2110dd88ab32SMasahiro Yamada			WARN("MISSING_EOF_NEWLINE",
2111dd88ab32SMasahiro Yamada			     "adding a line without newline at end of file\n" . $herecurr);
2112dd88ab32SMasahiro Yamada		}
2113dd88ab32SMasahiro Yamada
2114dd88ab32SMasahiro Yamada# Blackfin: use hi/lo macros
2115dd88ab32SMasahiro Yamada		if ($realfile =~ m@arch/blackfin/.*\.S$@) {
2116dd88ab32SMasahiro Yamada			if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
2117dd88ab32SMasahiro Yamada				my $herevet = "$here\n" . cat_vet($line) . "\n";
2118dd88ab32SMasahiro Yamada				ERROR("LO_MACRO",
2119dd88ab32SMasahiro Yamada				      "use the LO() macro, not (... & 0xFFFF)\n" . $herevet);
2120dd88ab32SMasahiro Yamada			}
2121dd88ab32SMasahiro Yamada			if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
2122dd88ab32SMasahiro Yamada				my $herevet = "$here\n" . cat_vet($line) . "\n";
2123dd88ab32SMasahiro Yamada				ERROR("HI_MACRO",
2124dd88ab32SMasahiro Yamada				      "use the HI() macro, not (... >> 16)\n" . $herevet);
2125dd88ab32SMasahiro Yamada			}
2126dd88ab32SMasahiro Yamada		}
2127dd88ab32SMasahiro Yamada
2128dd88ab32SMasahiro Yamada# check we are in a valid source file C or perl if not then ignore this hunk
2129dd88ab32SMasahiro Yamada		next if ($realfile !~ /\.(h|c|pl)$/);
2130dd88ab32SMasahiro Yamada
2131dd88ab32SMasahiro Yamada# at the beginning of a line any tabs must come first and anything
2132dd88ab32SMasahiro Yamada# more than 8 must use tabs.
2133dd88ab32SMasahiro Yamada		if ($rawline =~ /^\+\s* \t\s*\S/ ||
2134dd88ab32SMasahiro Yamada		    $rawline =~ /^\+\s*        \s*/) {
2135dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2136dd88ab32SMasahiro Yamada			$rpt_cleaners = 1;
21376b9709d9STom Rini			if (ERROR("CODE_INDENT",
21386b9709d9STom Rini				  "code indent should use tabs where possible\n" . $herevet) &&
21396b9709d9STom Rini			    $fix) {
21406b9709d9STom Rini				$fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
21416b9709d9STom Rini			}
2142dd88ab32SMasahiro Yamada		}
2143dd88ab32SMasahiro Yamada
2144dd88ab32SMasahiro Yamada# check for space before tabs.
2145dd88ab32SMasahiro Yamada		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
2146dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
21476b9709d9STom Rini			if (WARN("SPACE_BEFORE_TAB",
21486b9709d9STom Rini				"please, no space before tabs\n" . $herevet) &&
21496b9709d9STom Rini			    $fix) {
21506b9709d9STom Rini				while ($fixed[$linenr - 1] =~
2151e3a4facdSJoe Perches					   s/(^\+.*) {8,8}\t/$1\t\t/) {}
21526b9709d9STom Rini				while ($fixed[$linenr - 1] =~
21536b9709d9STom Rini					   s/(^\+.*) +\t/$1\t/) {}
21546b9709d9STom Rini			}
2155dd88ab32SMasahiro Yamada		}
2156dd88ab32SMasahiro Yamada
2157dd88ab32SMasahiro Yamada# check for && or || at the start of a line
2158dd88ab32SMasahiro Yamada		if ($rawline =~ /^\+\s*(&&|\|\|)/) {
2159dd88ab32SMasahiro Yamada			CHK("LOGICAL_CONTINUATIONS",
2160dd88ab32SMasahiro Yamada			    "Logical continuations should be on the previous line\n" . $hereprev);
2161dd88ab32SMasahiro Yamada		}
2162dd88ab32SMasahiro Yamada
2163dd88ab32SMasahiro Yamada# check multi-line statement indentation matches previous line
2164dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
2165dd88ab32SMasahiro Yamada		    $prevline =~ /^\+(\t*)(if \(|$Ident\().*(\&\&|\|\||,)\s*$/) {
2166dd88ab32SMasahiro Yamada			$prevline =~ /^\+(\t*)(.*)$/;
2167dd88ab32SMasahiro Yamada			my $oldindent = $1;
2168dd88ab32SMasahiro Yamada			my $rest = $2;
2169dd88ab32SMasahiro Yamada
2170dd88ab32SMasahiro Yamada			my $pos = pos_last_openparen($rest);
2171dd88ab32SMasahiro Yamada			if ($pos >= 0) {
2172dd88ab32SMasahiro Yamada				$line =~ /^(\+| )([ \t]*)/;
2173dd88ab32SMasahiro Yamada				my $newindent = $2;
2174dd88ab32SMasahiro Yamada
2175dd88ab32SMasahiro Yamada				my $goodtabindent = $oldindent .
2176dd88ab32SMasahiro Yamada					"\t" x ($pos / 8) .
2177dd88ab32SMasahiro Yamada					" "  x ($pos % 8);
2178dd88ab32SMasahiro Yamada				my $goodspaceindent = $oldindent . " "  x $pos;
2179dd88ab32SMasahiro Yamada
2180dd88ab32SMasahiro Yamada				if ($newindent ne $goodtabindent &&
2181dd88ab32SMasahiro Yamada				    $newindent ne $goodspaceindent) {
21826b9709d9STom Rini
21836b9709d9STom Rini					if (CHK("PARENTHESIS_ALIGNMENT",
21846b9709d9STom Rini						"Alignment should match open parenthesis\n" . $hereprev) &&
21856b9709d9STom Rini					    $fix && $line =~ /^\+/) {
21866b9709d9STom Rini						$fixed[$linenr - 1] =~
21876b9709d9STom Rini						    s/^\+[ \t]*/\+$goodtabindent/;
21886b9709d9STom Rini					}
2189dd88ab32SMasahiro Yamada				}
2190dd88ab32SMasahiro Yamada			}
2191dd88ab32SMasahiro Yamada		}
2192dd88ab32SMasahiro Yamada
21936b9709d9STom Rini		if ($line =~ /^\+.*\*[ \t]*\)[ \t]+(?!$Assignment|$Arithmetic)/) {
21946b9709d9STom Rini			if (CHK("SPACING",
21956b9709d9STom Rini				"No space is necessary after a cast\n" . $hereprev) &&
21966b9709d9STom Rini			    $fix) {
21976b9709d9STom Rini				$fixed[$linenr - 1] =~
21986b9709d9STom Rini				    s/^(\+.*\*[ \t]*\))[ \t]+/$1/;
21996b9709d9STom Rini			}
2200dd88ab32SMasahiro Yamada		}
2201dd88ab32SMasahiro Yamada
2202dd88ab32SMasahiro Yamada		if ($realfile =~ m@^(drivers/net/|net/)@ &&
22036b9709d9STom Rini		    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
22046b9709d9STom Rini		    $rawline =~ /^\+[ \t]*\*/) {
2205dd88ab32SMasahiro Yamada			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2206dd88ab32SMasahiro Yamada			     "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
2207dd88ab32SMasahiro Yamada		}
2208dd88ab32SMasahiro Yamada
2209dd88ab32SMasahiro Yamada		if ($realfile =~ m@^(drivers/net/|net/)@ &&
22106b9709d9STom Rini		    $prevrawline =~ /^\+[ \t]*\/\*/ &&		#starting /*
22116b9709d9STom Rini		    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */
22126b9709d9STom Rini		    $rawline =~ /^\+/ &&			#line is new
22136b9709d9STom Rini		    $rawline !~ /^\+[ \t]*\*/) {		#no leading *
22146b9709d9STom Rini			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
22156b9709d9STom Rini			     "networking block comments start with * on subsequent lines\n" . $hereprev);
22166b9709d9STom Rini		}
22176b9709d9STom Rini
22186b9709d9STom Rini		if ($realfile =~ m@^(drivers/net/|net/)@ &&
2219dd88ab32SMasahiro Yamada		    $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */
2220dd88ab32SMasahiro Yamada		    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
2221dd88ab32SMasahiro Yamada		    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/
2222dd88ab32SMasahiro Yamada		    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */
2223dd88ab32SMasahiro Yamada			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2224dd88ab32SMasahiro Yamada			     "networking block comments put the trailing */ on a separate line\n" . $herecurr);
2225dd88ab32SMasahiro Yamada		}
2226dd88ab32SMasahiro Yamada
2227dd88ab32SMasahiro Yamada# check for spaces at the beginning of a line.
2228dd88ab32SMasahiro Yamada# Exceptions:
2229dd88ab32SMasahiro Yamada#  1) within comments
2230dd88ab32SMasahiro Yamada#  2) indented preprocessor commands
2231dd88ab32SMasahiro Yamada#  3) hanging labels
22326b9709d9STom Rini		if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/)  {
2233dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
22346b9709d9STom Rini			if (WARN("LEADING_SPACE",
22356b9709d9STom Rini				 "please, no spaces at the start of a line\n" . $herevet) &&
22366b9709d9STom Rini			    $fix) {
22376b9709d9STom Rini				$fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
22386b9709d9STom Rini			}
2239dd88ab32SMasahiro Yamada		}
2240dd88ab32SMasahiro Yamada
2241dd88ab32SMasahiro Yamada# check we are in a valid C source file if not then ignore this hunk
2242dd88ab32SMasahiro Yamada		next if ($realfile !~ /\.(h|c)$/);
2243dd88ab32SMasahiro Yamada
2244dd88ab32SMasahiro Yamada# discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
2245dd88ab32SMasahiro Yamada		if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
2246dd88ab32SMasahiro Yamada			WARN("CONFIG_EXPERIMENTAL",
2247dd88ab32SMasahiro Yamada			     "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2248dd88ab32SMasahiro Yamada		}
2249dd88ab32SMasahiro Yamada
2250dd88ab32SMasahiro Yamada# check for RCS/CVS revision markers
2251dd88ab32SMasahiro Yamada		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
2252dd88ab32SMasahiro Yamada			WARN("CVS_KEYWORD",
2253dd88ab32SMasahiro Yamada			     "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
2254dd88ab32SMasahiro Yamada		}
2255dd88ab32SMasahiro Yamada
2256dd88ab32SMasahiro Yamada# Blackfin: don't use __builtin_bfin_[cs]sync
2257dd88ab32SMasahiro Yamada		if ($line =~ /__builtin_bfin_csync/) {
2258dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($line) . "\n";
2259dd88ab32SMasahiro Yamada			ERROR("CSYNC",
2260dd88ab32SMasahiro Yamada			      "use the CSYNC() macro in asm/blackfin.h\n" . $herevet);
2261dd88ab32SMasahiro Yamada		}
2262dd88ab32SMasahiro Yamada		if ($line =~ /__builtin_bfin_ssync/) {
2263dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($line) . "\n";
2264dd88ab32SMasahiro Yamada			ERROR("SSYNC",
2265dd88ab32SMasahiro Yamada			      "use the SSYNC() macro in asm/blackfin.h\n" . $herevet);
2266dd88ab32SMasahiro Yamada		}
2267dd88ab32SMasahiro Yamada
2268dd88ab32SMasahiro Yamada# check for old HOTPLUG __dev<foo> section markings
2269dd88ab32SMasahiro Yamada		if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
2270dd88ab32SMasahiro Yamada			WARN("HOTPLUG_SECTION",
2271dd88ab32SMasahiro Yamada			     "Using $1 is unnecessary\n" . $herecurr);
2272dd88ab32SMasahiro Yamada		}
2273dd88ab32SMasahiro Yamada
2274dd88ab32SMasahiro Yamada# Check for potential 'bare' types
2275dd88ab32SMasahiro Yamada		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
2276dd88ab32SMasahiro Yamada		    $realline_next);
2277dd88ab32SMasahiro Yamada#print "LINE<$line>\n";
2278dd88ab32SMasahiro Yamada		if ($linenr >= $suppress_statement &&
22796b9709d9STom Rini		    $realcnt && $sline =~ /.\s*\S/) {
2280dd88ab32SMasahiro Yamada			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
2281dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0);
2282dd88ab32SMasahiro Yamada			$stat =~ s/\n./\n /g;
2283dd88ab32SMasahiro Yamada			$cond =~ s/\n./\n /g;
2284dd88ab32SMasahiro Yamada
2285dd88ab32SMasahiro Yamada#print "linenr<$linenr> <$stat>\n";
2286dd88ab32SMasahiro Yamada			# If this statement has no statement boundaries within
2287dd88ab32SMasahiro Yamada			# it there is no point in retrying a statement scan
2288dd88ab32SMasahiro Yamada			# until we hit end of it.
2289dd88ab32SMasahiro Yamada			my $frag = $stat; $frag =~ s/;+\s*$//;
2290dd88ab32SMasahiro Yamada			if ($frag !~ /(?:{|;)/) {
2291dd88ab32SMasahiro Yamada#print "skip<$line_nr_next>\n";
2292dd88ab32SMasahiro Yamada				$suppress_statement = $line_nr_next;
2293dd88ab32SMasahiro Yamada			}
2294dd88ab32SMasahiro Yamada
2295dd88ab32SMasahiro Yamada			# Find the real next line.
2296dd88ab32SMasahiro Yamada			$realline_next = $line_nr_next;
2297dd88ab32SMasahiro Yamada			if (defined $realline_next &&
2298dd88ab32SMasahiro Yamada			    (!defined $lines[$realline_next - 1] ||
2299dd88ab32SMasahiro Yamada			     substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
2300dd88ab32SMasahiro Yamada				$realline_next++;
2301dd88ab32SMasahiro Yamada			}
2302dd88ab32SMasahiro Yamada
2303dd88ab32SMasahiro Yamada			my $s = $stat;
2304dd88ab32SMasahiro Yamada			$s =~ s/{.*$//s;
2305dd88ab32SMasahiro Yamada
2306dd88ab32SMasahiro Yamada			# Ignore goto labels.
2307dd88ab32SMasahiro Yamada			if ($s =~ /$Ident:\*$/s) {
2308dd88ab32SMasahiro Yamada
2309dd88ab32SMasahiro Yamada			# Ignore functions being called
2310dd88ab32SMasahiro Yamada			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
2311dd88ab32SMasahiro Yamada
2312dd88ab32SMasahiro Yamada			} elsif ($s =~ /^.\s*else\b/s) {
2313dd88ab32SMasahiro Yamada
2314dd88ab32SMasahiro Yamada			# declarations always start with types
2315dd88ab32SMasahiro Yamada			} 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) {
2316dd88ab32SMasahiro Yamada				my $type = $1;
2317dd88ab32SMasahiro Yamada				$type =~ s/\s+/ /g;
2318dd88ab32SMasahiro Yamada				possible($type, "A:" . $s);
2319dd88ab32SMasahiro Yamada
2320dd88ab32SMasahiro Yamada			# definitions in global scope can only start with types
2321dd88ab32SMasahiro Yamada			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
2322dd88ab32SMasahiro Yamada				possible($1, "B:" . $s);
2323dd88ab32SMasahiro Yamada			}
2324dd88ab32SMasahiro Yamada
2325dd88ab32SMasahiro Yamada			# any (foo ... *) is a pointer cast, and foo is a type
2326dd88ab32SMasahiro Yamada			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
2327dd88ab32SMasahiro Yamada				possible($1, "C:" . $s);
2328dd88ab32SMasahiro Yamada			}
2329dd88ab32SMasahiro Yamada
2330dd88ab32SMasahiro Yamada			# Check for any sort of function declaration.
2331dd88ab32SMasahiro Yamada			# int foo(something bar, other baz);
2332dd88ab32SMasahiro Yamada			# void (*store_gdt)(x86_descr_ptr *);
2333dd88ab32SMasahiro Yamada			if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
2334dd88ab32SMasahiro Yamada				my ($name_len) = length($1);
2335dd88ab32SMasahiro Yamada
2336dd88ab32SMasahiro Yamada				my $ctx = $s;
2337dd88ab32SMasahiro Yamada				substr($ctx, 0, $name_len + 1, '');
2338dd88ab32SMasahiro Yamada				$ctx =~ s/\)[^\)]*$//;
2339dd88ab32SMasahiro Yamada
2340dd88ab32SMasahiro Yamada				for my $arg (split(/\s*,\s*/, $ctx)) {
2341dd88ab32SMasahiro Yamada					if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
2342dd88ab32SMasahiro Yamada
2343dd88ab32SMasahiro Yamada						possible($1, "D:" . $s);
2344dd88ab32SMasahiro Yamada					}
2345dd88ab32SMasahiro Yamada				}
2346dd88ab32SMasahiro Yamada			}
2347dd88ab32SMasahiro Yamada
2348dd88ab32SMasahiro Yamada		}
2349dd88ab32SMasahiro Yamada
2350dd88ab32SMasahiro Yamada#
2351dd88ab32SMasahiro Yamada# Checks which may be anchored in the context.
2352dd88ab32SMasahiro Yamada#
2353dd88ab32SMasahiro Yamada
2354dd88ab32SMasahiro Yamada# Check for switch () and associated case and default
2355dd88ab32SMasahiro Yamada# statements should be at the same indent.
2356dd88ab32SMasahiro Yamada		if ($line=~/\bswitch\s*\(.*\)/) {
2357dd88ab32SMasahiro Yamada			my $err = '';
2358dd88ab32SMasahiro Yamada			my $sep = '';
2359dd88ab32SMasahiro Yamada			my @ctx = ctx_block_outer($linenr, $realcnt);
2360dd88ab32SMasahiro Yamada			shift(@ctx);
2361dd88ab32SMasahiro Yamada			for my $ctx (@ctx) {
2362dd88ab32SMasahiro Yamada				my ($clen, $cindent) = line_stats($ctx);
2363dd88ab32SMasahiro Yamada				if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
2364dd88ab32SMasahiro Yamada							$indent != $cindent) {
2365dd88ab32SMasahiro Yamada					$err .= "$sep$ctx\n";
2366dd88ab32SMasahiro Yamada					$sep = '';
2367dd88ab32SMasahiro Yamada				} else {
2368dd88ab32SMasahiro Yamada					$sep = "[...]\n";
2369dd88ab32SMasahiro Yamada				}
2370dd88ab32SMasahiro Yamada			}
2371dd88ab32SMasahiro Yamada			if ($err ne '') {
2372dd88ab32SMasahiro Yamada				ERROR("SWITCH_CASE_INDENT_LEVEL",
2373dd88ab32SMasahiro Yamada				      "switch and case should be at the same indent\n$hereline$err");
2374dd88ab32SMasahiro Yamada			}
2375dd88ab32SMasahiro Yamada		}
2376dd88ab32SMasahiro Yamada
2377dd88ab32SMasahiro Yamada# if/while/etc brace do not go on next line, unless defining a do while loop,
2378dd88ab32SMasahiro Yamada# or if that brace on the next line is for something else
2379dd88ab32SMasahiro Yamada		if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
2380dd88ab32SMasahiro Yamada			my $pre_ctx = "$1$2";
2381dd88ab32SMasahiro Yamada
2382dd88ab32SMasahiro Yamada			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
2383dd88ab32SMasahiro Yamada
2384dd88ab32SMasahiro Yamada			if ($line =~ /^\+\t{6,}/) {
2385dd88ab32SMasahiro Yamada				WARN("DEEP_INDENTATION",
2386dd88ab32SMasahiro Yamada				     "Too many leading tabs - consider code refactoring\n" . $herecurr);
2387dd88ab32SMasahiro Yamada			}
2388dd88ab32SMasahiro Yamada
2389dd88ab32SMasahiro Yamada			my $ctx_cnt = $realcnt - $#ctx - 1;
2390dd88ab32SMasahiro Yamada			my $ctx = join("\n", @ctx);
2391dd88ab32SMasahiro Yamada
2392dd88ab32SMasahiro Yamada			my $ctx_ln = $linenr;
2393dd88ab32SMasahiro Yamada			my $ctx_skip = $realcnt;
2394dd88ab32SMasahiro Yamada
2395dd88ab32SMasahiro Yamada			while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
2396dd88ab32SMasahiro Yamada					defined $lines[$ctx_ln - 1] &&
2397dd88ab32SMasahiro Yamada					$lines[$ctx_ln - 1] =~ /^-/)) {
2398dd88ab32SMasahiro Yamada				##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
2399dd88ab32SMasahiro Yamada				$ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
2400dd88ab32SMasahiro Yamada				$ctx_ln++;
2401dd88ab32SMasahiro Yamada			}
2402dd88ab32SMasahiro Yamada
2403dd88ab32SMasahiro Yamada			#print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
2404dd88ab32SMasahiro Yamada			#print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
2405dd88ab32SMasahiro Yamada
2406dd88ab32SMasahiro Yamada			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
2407dd88ab32SMasahiro Yamada				ERROR("OPEN_BRACE",
2408dd88ab32SMasahiro Yamada				      "that open brace { should be on the previous line\n" .
2409dd88ab32SMasahiro Yamada					"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
2410dd88ab32SMasahiro Yamada			}
2411dd88ab32SMasahiro Yamada			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
2412dd88ab32SMasahiro Yamada			    $ctx =~ /\)\s*\;\s*$/ &&
2413dd88ab32SMasahiro Yamada			    defined $lines[$ctx_ln - 1])
2414dd88ab32SMasahiro Yamada			{
2415dd88ab32SMasahiro Yamada				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
2416dd88ab32SMasahiro Yamada				if ($nindent > $indent) {
2417dd88ab32SMasahiro Yamada					WARN("TRAILING_SEMICOLON",
2418dd88ab32SMasahiro Yamada					     "trailing semicolon indicates no statements, indent implies otherwise\n" .
2419dd88ab32SMasahiro Yamada						"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
2420dd88ab32SMasahiro Yamada				}
2421dd88ab32SMasahiro Yamada			}
2422dd88ab32SMasahiro Yamada		}
2423dd88ab32SMasahiro Yamada
2424dd88ab32SMasahiro Yamada# Check relative indent for conditionals and blocks.
2425dd88ab32SMasahiro Yamada		if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
2426dd88ab32SMasahiro Yamada			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
2427dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0)
2428dd88ab32SMasahiro Yamada					if (!defined $stat);
2429dd88ab32SMasahiro Yamada			my ($s, $c) = ($stat, $cond);
2430dd88ab32SMasahiro Yamada
2431dd88ab32SMasahiro Yamada			substr($s, 0, length($c), '');
2432dd88ab32SMasahiro Yamada
2433dd88ab32SMasahiro Yamada			# Make sure we remove the line prefixes as we have
2434dd88ab32SMasahiro Yamada			# none on the first line, and are going to readd them
2435dd88ab32SMasahiro Yamada			# where necessary.
2436dd88ab32SMasahiro Yamada			$s =~ s/\n./\n/gs;
2437dd88ab32SMasahiro Yamada
2438dd88ab32SMasahiro Yamada			# Find out how long the conditional actually is.
2439dd88ab32SMasahiro Yamada			my @newlines = ($c =~ /\n/gs);
2440dd88ab32SMasahiro Yamada			my $cond_lines = 1 + $#newlines;
2441dd88ab32SMasahiro Yamada
2442dd88ab32SMasahiro Yamada			# We want to check the first line inside the block
2443dd88ab32SMasahiro Yamada			# starting at the end of the conditional, so remove:
2444dd88ab32SMasahiro Yamada			#  1) any blank line termination
2445dd88ab32SMasahiro Yamada			#  2) any opening brace { on end of the line
2446dd88ab32SMasahiro Yamada			#  3) any do (...) {
2447dd88ab32SMasahiro Yamada			my $continuation = 0;
2448dd88ab32SMasahiro Yamada			my $check = 0;
2449dd88ab32SMasahiro Yamada			$s =~ s/^.*\bdo\b//;
2450dd88ab32SMasahiro Yamada			$s =~ s/^\s*{//;
2451dd88ab32SMasahiro Yamada			if ($s =~ s/^\s*\\//) {
2452dd88ab32SMasahiro Yamada				$continuation = 1;
2453dd88ab32SMasahiro Yamada			}
2454dd88ab32SMasahiro Yamada			if ($s =~ s/^\s*?\n//) {
2455dd88ab32SMasahiro Yamada				$check = 1;
2456dd88ab32SMasahiro Yamada				$cond_lines++;
2457dd88ab32SMasahiro Yamada			}
2458dd88ab32SMasahiro Yamada
2459dd88ab32SMasahiro Yamada			# Also ignore a loop construct at the end of a
2460dd88ab32SMasahiro Yamada			# preprocessor statement.
2461dd88ab32SMasahiro Yamada			if (($prevline =~ /^.\s*#\s*define\s/ ||
2462dd88ab32SMasahiro Yamada			    $prevline =~ /\\\s*$/) && $continuation == 0) {
2463dd88ab32SMasahiro Yamada				$check = 0;
2464dd88ab32SMasahiro Yamada			}
2465dd88ab32SMasahiro Yamada
2466dd88ab32SMasahiro Yamada			my $cond_ptr = -1;
2467dd88ab32SMasahiro Yamada			$continuation = 0;
2468dd88ab32SMasahiro Yamada			while ($cond_ptr != $cond_lines) {
2469dd88ab32SMasahiro Yamada				$cond_ptr = $cond_lines;
2470dd88ab32SMasahiro Yamada
2471dd88ab32SMasahiro Yamada				# If we see an #else/#elif then the code
2472dd88ab32SMasahiro Yamada				# is not linear.
2473dd88ab32SMasahiro Yamada				if ($s =~ /^\s*\#\s*(?:else|elif)/) {
2474dd88ab32SMasahiro Yamada					$check = 0;
2475dd88ab32SMasahiro Yamada				}
2476dd88ab32SMasahiro Yamada
2477dd88ab32SMasahiro Yamada				# Ignore:
2478dd88ab32SMasahiro Yamada				#  1) blank lines, they should be at 0,
2479dd88ab32SMasahiro Yamada				#  2) preprocessor lines, and
2480dd88ab32SMasahiro Yamada				#  3) labels.
2481dd88ab32SMasahiro Yamada				if ($continuation ||
2482dd88ab32SMasahiro Yamada				    $s =~ /^\s*?\n/ ||
2483dd88ab32SMasahiro Yamada				    $s =~ /^\s*#\s*?/ ||
2484dd88ab32SMasahiro Yamada				    $s =~ /^\s*$Ident\s*:/) {
2485dd88ab32SMasahiro Yamada					$continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
2486dd88ab32SMasahiro Yamada					if ($s =~ s/^.*?\n//) {
2487dd88ab32SMasahiro Yamada						$cond_lines++;
2488dd88ab32SMasahiro Yamada					}
2489dd88ab32SMasahiro Yamada				}
2490dd88ab32SMasahiro Yamada			}
2491dd88ab32SMasahiro Yamada
2492dd88ab32SMasahiro Yamada			my (undef, $sindent) = line_stats("+" . $s);
2493dd88ab32SMasahiro Yamada			my $stat_real = raw_line($linenr, $cond_lines);
2494dd88ab32SMasahiro Yamada
2495dd88ab32SMasahiro Yamada			# Check if either of these lines are modified, else
2496dd88ab32SMasahiro Yamada			# this is not this patch's fault.
2497dd88ab32SMasahiro Yamada			if (!defined($stat_real) ||
2498dd88ab32SMasahiro Yamada			    $stat !~ /^\+/ && $stat_real !~ /^\+/) {
2499dd88ab32SMasahiro Yamada				$check = 0;
2500dd88ab32SMasahiro Yamada			}
2501dd88ab32SMasahiro Yamada			if (defined($stat_real) && $cond_lines > 1) {
2502dd88ab32SMasahiro Yamada				$stat_real = "[...]\n$stat_real";
2503dd88ab32SMasahiro Yamada			}
2504dd88ab32SMasahiro Yamada
2505dd88ab32SMasahiro Yamada			#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>\n";
2506dd88ab32SMasahiro Yamada
2507dd88ab32SMasahiro Yamada			if ($check && (($sindent % 8) != 0 ||
2508dd88ab32SMasahiro Yamada			    ($sindent <= $indent && $s ne ''))) {
2509dd88ab32SMasahiro Yamada				WARN("SUSPECT_CODE_INDENT",
2510dd88ab32SMasahiro Yamada				     "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
2511dd88ab32SMasahiro Yamada			}
2512dd88ab32SMasahiro Yamada		}
2513dd88ab32SMasahiro Yamada
2514dd88ab32SMasahiro Yamada		# Track the 'values' across context and added lines.
2515dd88ab32SMasahiro Yamada		my $opline = $line; $opline =~ s/^./ /;
2516dd88ab32SMasahiro Yamada		my ($curr_values, $curr_vars) =
2517dd88ab32SMasahiro Yamada				annotate_values($opline . "\n", $prev_values);
2518dd88ab32SMasahiro Yamada		$curr_values = $prev_values . $curr_values;
2519dd88ab32SMasahiro Yamada		if ($dbg_values) {
2520dd88ab32SMasahiro Yamada			my $outline = $opline; $outline =~ s/\t/ /g;
2521dd88ab32SMasahiro Yamada			print "$linenr > .$outline\n";
2522dd88ab32SMasahiro Yamada			print "$linenr > $curr_values\n";
2523dd88ab32SMasahiro Yamada			print "$linenr >  $curr_vars\n";
2524dd88ab32SMasahiro Yamada		}
2525dd88ab32SMasahiro Yamada		$prev_values = substr($curr_values, -1);
2526dd88ab32SMasahiro Yamada
2527dd88ab32SMasahiro Yamada#ignore lines not being added
25286b9709d9STom Rini		next if ($line =~ /^[^\+]/);
2529dd88ab32SMasahiro Yamada
2530dd88ab32SMasahiro Yamada# TEST: allow direct testing of the type matcher.
2531dd88ab32SMasahiro Yamada		if ($dbg_type) {
2532dd88ab32SMasahiro Yamada			if ($line =~ /^.\s*$Declare\s*$/) {
2533dd88ab32SMasahiro Yamada				ERROR("TEST_TYPE",
2534dd88ab32SMasahiro Yamada				      "TEST: is type\n" . $herecurr);
2535dd88ab32SMasahiro Yamada			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
2536dd88ab32SMasahiro Yamada				ERROR("TEST_NOT_TYPE",
2537dd88ab32SMasahiro Yamada				      "TEST: is not type ($1 is)\n". $herecurr);
2538dd88ab32SMasahiro Yamada			}
2539dd88ab32SMasahiro Yamada			next;
2540dd88ab32SMasahiro Yamada		}
2541dd88ab32SMasahiro Yamada# TEST: allow direct testing of the attribute matcher.
2542dd88ab32SMasahiro Yamada		if ($dbg_attr) {
2543dd88ab32SMasahiro Yamada			if ($line =~ /^.\s*$Modifier\s*$/) {
2544dd88ab32SMasahiro Yamada				ERROR("TEST_ATTR",
2545dd88ab32SMasahiro Yamada				      "TEST: is attr\n" . $herecurr);
2546dd88ab32SMasahiro Yamada			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
2547dd88ab32SMasahiro Yamada				ERROR("TEST_NOT_ATTR",
2548dd88ab32SMasahiro Yamada				      "TEST: is not attr ($1 is)\n". $herecurr);
2549dd88ab32SMasahiro Yamada			}
2550dd88ab32SMasahiro Yamada			next;
2551dd88ab32SMasahiro Yamada		}
2552dd88ab32SMasahiro Yamada
2553dd88ab32SMasahiro Yamada# check for initialisation to aggregates open brace on the next line
2554dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*{/ &&
2555dd88ab32SMasahiro Yamada		    $prevline =~ /(?:^|[^=])=\s*$/) {
2556dd88ab32SMasahiro Yamada			ERROR("OPEN_BRACE",
2557dd88ab32SMasahiro Yamada			      "that open brace { should be on the previous line\n" . $hereprev);
2558dd88ab32SMasahiro Yamada		}
2559dd88ab32SMasahiro Yamada
2560dd88ab32SMasahiro Yamada#
2561dd88ab32SMasahiro Yamada# Checks which are anchored on the added line.
2562dd88ab32SMasahiro Yamada#
2563dd88ab32SMasahiro Yamada
2564dd88ab32SMasahiro Yamada# check for malformed paths in #include statements (uses RAW line)
2565dd88ab32SMasahiro Yamada		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
2566dd88ab32SMasahiro Yamada			my $path = $1;
2567dd88ab32SMasahiro Yamada			if ($path =~ m{//}) {
2568dd88ab32SMasahiro Yamada				ERROR("MALFORMED_INCLUDE",
2569dd88ab32SMasahiro Yamada				      "malformed #include filename\n" . $herecurr);
2570dd88ab32SMasahiro Yamada			}
2571dd88ab32SMasahiro Yamada			if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
2572dd88ab32SMasahiro Yamada				ERROR("UAPI_INCLUDE",
2573dd88ab32SMasahiro Yamada				      "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
2574dd88ab32SMasahiro Yamada			}
2575dd88ab32SMasahiro Yamada		}
2576dd88ab32SMasahiro Yamada
2577dd88ab32SMasahiro Yamada# no C99 // comments
2578dd88ab32SMasahiro Yamada		if ($line =~ m{//}) {
25796b9709d9STom Rini			if (ERROR("C99_COMMENTS",
25806b9709d9STom Rini				  "do not use C99 // comments\n" . $herecurr) &&
25816b9709d9STom Rini			    $fix) {
25826b9709d9STom Rini				my $line = $fixed[$linenr - 1];
25836b9709d9STom Rini				if ($line =~ /\/\/(.*)$/) {
25846b9709d9STom Rini					my $comment = trim($1);
25856b9709d9STom Rini					$fixed[$linenr - 1] =~ s@\/\/(.*)$@/\* $comment \*/@;
25866b9709d9STom Rini				}
25876b9709d9STom Rini			}
2588dd88ab32SMasahiro Yamada		}
2589dd88ab32SMasahiro Yamada		# Remove C99 comments.
2590dd88ab32SMasahiro Yamada		$line =~ s@//.*@@;
2591dd88ab32SMasahiro Yamada		$opline =~ s@//.*@@;
2592dd88ab32SMasahiro Yamada
2593dd88ab32SMasahiro Yamada# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
2594dd88ab32SMasahiro Yamada# the whole statement.
2595dd88ab32SMasahiro Yamada#print "APW <$lines[$realline_next - 1]>\n";
2596dd88ab32SMasahiro Yamada		if (defined $realline_next &&
2597dd88ab32SMasahiro Yamada		    exists $lines[$realline_next - 1] &&
2598dd88ab32SMasahiro Yamada		    !defined $suppress_export{$realline_next} &&
2599dd88ab32SMasahiro Yamada		    ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2600dd88ab32SMasahiro Yamada		     $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
2601dd88ab32SMasahiro Yamada			# Handle definitions which produce identifiers with
2602dd88ab32SMasahiro Yamada			# a prefix:
2603dd88ab32SMasahiro Yamada			#   XXX(foo);
2604dd88ab32SMasahiro Yamada			#   EXPORT_SYMBOL(something_foo);
2605dd88ab32SMasahiro Yamada			my $name = $1;
2606dd88ab32SMasahiro Yamada			if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
2607dd88ab32SMasahiro Yamada			    $name =~ /^${Ident}_$2/) {
2608dd88ab32SMasahiro Yamada#print "FOO C name<$name>\n";
2609dd88ab32SMasahiro Yamada				$suppress_export{$realline_next} = 1;
2610dd88ab32SMasahiro Yamada
2611dd88ab32SMasahiro Yamada			} elsif ($stat !~ /(?:
2612dd88ab32SMasahiro Yamada				\n.}\s*$|
2613dd88ab32SMasahiro Yamada				^.DEFINE_$Ident\(\Q$name\E\)|
2614dd88ab32SMasahiro Yamada				^.DECLARE_$Ident\(\Q$name\E\)|
2615dd88ab32SMasahiro Yamada				^.LIST_HEAD\(\Q$name\E\)|
2616dd88ab32SMasahiro Yamada				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
2617dd88ab32SMasahiro Yamada				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
2618dd88ab32SMasahiro Yamada			    )/x) {
2619dd88ab32SMasahiro Yamada#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
2620dd88ab32SMasahiro Yamada				$suppress_export{$realline_next} = 2;
2621dd88ab32SMasahiro Yamada			} else {
2622dd88ab32SMasahiro Yamada				$suppress_export{$realline_next} = 1;
2623dd88ab32SMasahiro Yamada			}
2624dd88ab32SMasahiro Yamada		}
2625dd88ab32SMasahiro Yamada		if (!defined $suppress_export{$linenr} &&
2626dd88ab32SMasahiro Yamada		    $prevline =~ /^.\s*$/ &&
2627dd88ab32SMasahiro Yamada		    ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2628dd88ab32SMasahiro Yamada		     $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
2629dd88ab32SMasahiro Yamada#print "FOO B <$lines[$linenr - 1]>\n";
2630dd88ab32SMasahiro Yamada			$suppress_export{$linenr} = 2;
2631dd88ab32SMasahiro Yamada		}
2632dd88ab32SMasahiro Yamada		if (defined $suppress_export{$linenr} &&
2633dd88ab32SMasahiro Yamada		    $suppress_export{$linenr} == 2) {
2634dd88ab32SMasahiro Yamada			WARN("EXPORT_SYMBOL",
2635dd88ab32SMasahiro Yamada			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
2636dd88ab32SMasahiro Yamada		}
2637dd88ab32SMasahiro Yamada
2638dd88ab32SMasahiro Yamada# check for global initialisers.
26396b9709d9STom Rini		if ($line =~ /^\+(\s*$Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/) {
26406b9709d9STom Rini			if (ERROR("GLOBAL_INITIALISERS",
2641dd88ab32SMasahiro Yamada				  "do not initialise globals to 0 or NULL\n" .
26426b9709d9STom Rini				      $herecurr) &&
26436b9709d9STom Rini			    $fix) {
26446b9709d9STom Rini				$fixed[$linenr - 1] =~ s/($Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/$1;/;
26456b9709d9STom Rini			}
2646dd88ab32SMasahiro Yamada		}
2647dd88ab32SMasahiro Yamada# check for static initialisers.
26486b9709d9STom Rini		if ($line =~ /^\+.*\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
26496b9709d9STom Rini			if (ERROR("INITIALISED_STATIC",
2650dd88ab32SMasahiro Yamada				  "do not initialise statics to 0 or NULL\n" .
26516b9709d9STom Rini				      $herecurr) &&
26526b9709d9STom Rini			    $fix) {
26536b9709d9STom Rini				$fixed[$linenr - 1] =~ s/(\bstatic\s.*?)\s*=\s*(0|NULL|false)\s*;/$1;/;
26546b9709d9STom Rini			}
2655dd88ab32SMasahiro Yamada		}
2656dd88ab32SMasahiro Yamada
2657dd88ab32SMasahiro Yamada# check for static const char * arrays.
2658dd88ab32SMasahiro Yamada		if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
2659dd88ab32SMasahiro Yamada			WARN("STATIC_CONST_CHAR_ARRAY",
2660dd88ab32SMasahiro Yamada			     "static const char * array should probably be static const char * const\n" .
2661dd88ab32SMasahiro Yamada				$herecurr);
2662dd88ab32SMasahiro Yamada               }
2663dd88ab32SMasahiro Yamada
2664dd88ab32SMasahiro Yamada# check for static char foo[] = "bar" declarations.
2665dd88ab32SMasahiro Yamada		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
2666dd88ab32SMasahiro Yamada			WARN("STATIC_CONST_CHAR_ARRAY",
2667dd88ab32SMasahiro Yamada			     "static char array declaration should probably be static const char\n" .
2668dd88ab32SMasahiro Yamada				$herecurr);
2669dd88ab32SMasahiro Yamada               }
2670dd88ab32SMasahiro Yamada
26716b9709d9STom Rini# check for function declarations without arguments like "int foo()"
26726b9709d9STom Rini		if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
26736b9709d9STom Rini			if (ERROR("FUNCTION_WITHOUT_ARGS",
26746b9709d9STom Rini				  "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
26756b9709d9STom Rini			    $fix) {
26766b9709d9STom Rini				$fixed[$linenr - 1] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
26776b9709d9STom Rini			}
26786b9709d9STom Rini		}
26796b9709d9STom Rini
26806b9709d9STom Rini# check for uses of DEFINE_PCI_DEVICE_TABLE
26816b9709d9STom Rini		if ($line =~ /\bDEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=/) {
26826b9709d9STom Rini			if (WARN("DEFINE_PCI_DEVICE_TABLE",
26836b9709d9STom Rini				 "Prefer struct pci_device_id over deprecated DEFINE_PCI_DEVICE_TABLE\n" . $herecurr) &&
26846b9709d9STom Rini			    $fix) {
26856b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\b(?:static\s+|)DEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=\s*/static const struct pci_device_id $1\[\] = /;
26866b9709d9STom Rini			}
2687dd88ab32SMasahiro Yamada		}
2688dd88ab32SMasahiro Yamada
2689dd88ab32SMasahiro Yamada# check for new typedefs, only function parameters and sparse annotations
2690dd88ab32SMasahiro Yamada# make sense.
2691dd88ab32SMasahiro Yamada		if ($line =~ /\btypedef\s/ &&
2692dd88ab32SMasahiro Yamada		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
2693dd88ab32SMasahiro Yamada		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
2694dd88ab32SMasahiro Yamada		    $line !~ /\b$typeTypedefs\b/ &&
2695dd88ab32SMasahiro Yamada		    $line !~ /\b__bitwise(?:__|)\b/) {
2696dd88ab32SMasahiro Yamada			WARN("NEW_TYPEDEFS",
2697dd88ab32SMasahiro Yamada			     "do not add new typedefs\n" . $herecurr);
2698dd88ab32SMasahiro Yamada		}
2699dd88ab32SMasahiro Yamada
2700dd88ab32SMasahiro Yamada# * goes on variable not on type
2701dd88ab32SMasahiro Yamada		# (char*[ const])
2702dd88ab32SMasahiro Yamada		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
2703dd88ab32SMasahiro Yamada			#print "AA<$1>\n";
27046b9709d9STom Rini			my ($ident, $from, $to) = ($1, $2, $2);
2705dd88ab32SMasahiro Yamada
2706dd88ab32SMasahiro Yamada			# Should start with a space.
2707dd88ab32SMasahiro Yamada			$to =~ s/^(\S)/ $1/;
2708dd88ab32SMasahiro Yamada			# Should not end with a space.
2709dd88ab32SMasahiro Yamada			$to =~ s/\s+$//;
2710dd88ab32SMasahiro Yamada			# '*'s should not have spaces between.
2711dd88ab32SMasahiro Yamada			while ($to =~ s/\*\s+\*/\*\*/) {
2712dd88ab32SMasahiro Yamada			}
2713dd88ab32SMasahiro Yamada
27146b9709d9STom Rini##			print "1: from<$from> to<$to> ident<$ident>\n";
2715dd88ab32SMasahiro Yamada			if ($from ne $to) {
27166b9709d9STom Rini				if (ERROR("POINTER_LOCATION",
27176b9709d9STom Rini					  "\"(foo$from)\" should be \"(foo$to)\"\n" .  $herecurr) &&
27186b9709d9STom Rini				    $fix) {
27196b9709d9STom Rini					my $sub_from = $ident;
27206b9709d9STom Rini					my $sub_to = $ident;
27216b9709d9STom Rini					$sub_to =~ s/\Q$from\E/$to/;
27226b9709d9STom Rini					$fixed[$linenr - 1] =~
27236b9709d9STom Rini					    s@\Q$sub_from\E@$sub_to@;
27246b9709d9STom Rini				}
2725dd88ab32SMasahiro Yamada			}
2726dd88ab32SMasahiro Yamada		}
2727dd88ab32SMasahiro Yamada		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
2728dd88ab32SMasahiro Yamada			#print "BB<$1>\n";
27296b9709d9STom Rini			my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
2730dd88ab32SMasahiro Yamada
2731dd88ab32SMasahiro Yamada			# Should start with a space.
2732dd88ab32SMasahiro Yamada			$to =~ s/^(\S)/ $1/;
2733dd88ab32SMasahiro Yamada			# Should not end with a space.
2734dd88ab32SMasahiro Yamada			$to =~ s/\s+$//;
2735dd88ab32SMasahiro Yamada			# '*'s should not have spaces between.
2736dd88ab32SMasahiro Yamada			while ($to =~ s/\*\s+\*/\*\*/) {
2737dd88ab32SMasahiro Yamada			}
2738dd88ab32SMasahiro Yamada			# Modifiers should have spaces.
2739dd88ab32SMasahiro Yamada			$to =~ s/(\b$Modifier$)/$1 /;
2740dd88ab32SMasahiro Yamada
27416b9709d9STom Rini##			print "2: from<$from> to<$to> ident<$ident>\n";
2742dd88ab32SMasahiro Yamada			if ($from ne $to && $ident !~ /^$Modifier$/) {
27436b9709d9STom Rini				if (ERROR("POINTER_LOCATION",
27446b9709d9STom Rini					  "\"foo${from}bar\" should be \"foo${to}bar\"\n" .  $herecurr) &&
27456b9709d9STom Rini				    $fix) {
27466b9709d9STom Rini
27476b9709d9STom Rini					my $sub_from = $match;
27486b9709d9STom Rini					my $sub_to = $match;
27496b9709d9STom Rini					$sub_to =~ s/\Q$from\E/$to/;
27506b9709d9STom Rini					$fixed[$linenr - 1] =~
27516b9709d9STom Rini					    s@\Q$sub_from\E@$sub_to@;
27526b9709d9STom Rini				}
2753dd88ab32SMasahiro Yamada			}
2754dd88ab32SMasahiro Yamada		}
2755dd88ab32SMasahiro Yamada
2756dd88ab32SMasahiro Yamada# # no BUG() or BUG_ON()
2757dd88ab32SMasahiro Yamada# 		if ($line =~ /\b(BUG|BUG_ON)\b/) {
2758dd88ab32SMasahiro Yamada# 			print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n";
2759dd88ab32SMasahiro Yamada# 			print "$herecurr";
2760dd88ab32SMasahiro Yamada# 			$clean = 0;
2761dd88ab32SMasahiro Yamada# 		}
2762dd88ab32SMasahiro Yamada
2763dd88ab32SMasahiro Yamada		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
2764dd88ab32SMasahiro Yamada			WARN("LINUX_VERSION_CODE",
2765dd88ab32SMasahiro Yamada			     "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
2766dd88ab32SMasahiro Yamada		}
2767dd88ab32SMasahiro Yamada
2768dd88ab32SMasahiro Yamada# check for uses of printk_ratelimit
2769dd88ab32SMasahiro Yamada		if ($line =~ /\bprintk_ratelimit\s*\(/) {
2770dd88ab32SMasahiro Yamada			WARN("PRINTK_RATELIMITED",
2771dd88ab32SMasahiro Yamada"Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
2772dd88ab32SMasahiro Yamada		}
2773dd88ab32SMasahiro Yamada
2774dd88ab32SMasahiro Yamada# printk should use KERN_* levels.  Note that follow on printk's on the
2775dd88ab32SMasahiro Yamada# same line do not need a level, so we use the current block context
2776dd88ab32SMasahiro Yamada# to try and find and validate the current printk.  In summary the current
2777dd88ab32SMasahiro Yamada# printk includes all preceding printk's which have no newline on the end.
2778dd88ab32SMasahiro Yamada# we assume the first bad printk is the one to report.
2779dd88ab32SMasahiro Yamada		if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
2780dd88ab32SMasahiro Yamada			my $ok = 0;
2781dd88ab32SMasahiro Yamada			for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
2782dd88ab32SMasahiro Yamada				#print "CHECK<$lines[$ln - 1]\n";
2783dd88ab32SMasahiro Yamada				# we have a preceding printk if it ends
2784dd88ab32SMasahiro Yamada				# with "\n" ignore it, else it is to blame
2785dd88ab32SMasahiro Yamada				if ($lines[$ln - 1] =~ m{\bprintk\(}) {
2786dd88ab32SMasahiro Yamada					if ($rawlines[$ln - 1] !~ m{\\n"}) {
2787dd88ab32SMasahiro Yamada						$ok = 1;
2788dd88ab32SMasahiro Yamada					}
2789dd88ab32SMasahiro Yamada					last;
2790dd88ab32SMasahiro Yamada				}
2791dd88ab32SMasahiro Yamada			}
2792dd88ab32SMasahiro Yamada			if ($ok == 0) {
2793dd88ab32SMasahiro Yamada				WARN("PRINTK_WITHOUT_KERN_LEVEL",
2794dd88ab32SMasahiro Yamada				     "printk() should include KERN_ facility level\n" . $herecurr);
2795dd88ab32SMasahiro Yamada			}
2796dd88ab32SMasahiro Yamada		}
2797dd88ab32SMasahiro Yamada
2798dd88ab32SMasahiro Yamada		if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
2799dd88ab32SMasahiro Yamada			my $orig = $1;
2800dd88ab32SMasahiro Yamada			my $level = lc($orig);
2801dd88ab32SMasahiro Yamada			$level = "warn" if ($level eq "warning");
2802dd88ab32SMasahiro Yamada			my $level2 = $level;
2803dd88ab32SMasahiro Yamada			$level2 = "dbg" if ($level eq "debug");
2804dd88ab32SMasahiro Yamada			WARN("PREFER_PR_LEVEL",
2805dd88ab32SMasahiro Yamada			     "Prefer netdev_$level2(netdev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...\n" . $herecurr);
2806dd88ab32SMasahiro Yamada		}
2807dd88ab32SMasahiro Yamada
2808dd88ab32SMasahiro Yamada		if ($line =~ /\bpr_warning\s*\(/) {
28096b9709d9STom Rini			if (WARN("PREFER_PR_LEVEL",
28106b9709d9STom Rini				 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
28116b9709d9STom Rini			    $fix) {
28126b9709d9STom Rini				$fixed[$linenr - 1] =~
28136b9709d9STom Rini				    s/\bpr_warning\b/pr_warn/;
28146b9709d9STom Rini			}
2815dd88ab32SMasahiro Yamada		}
2816dd88ab32SMasahiro Yamada
2817dd88ab32SMasahiro Yamada		if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
2818dd88ab32SMasahiro Yamada			my $orig = $1;
2819dd88ab32SMasahiro Yamada			my $level = lc($orig);
2820dd88ab32SMasahiro Yamada			$level = "warn" if ($level eq "warning");
2821dd88ab32SMasahiro Yamada			$level = "dbg" if ($level eq "debug");
2822dd88ab32SMasahiro Yamada			WARN("PREFER_DEV_LEVEL",
2823dd88ab32SMasahiro Yamada			     "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
2824dd88ab32SMasahiro Yamada		}
2825dd88ab32SMasahiro Yamada
2826dd88ab32SMasahiro Yamada# function brace can't be on same line, except for #defines of do while,
2827dd88ab32SMasahiro Yamada# or if closed on same line
2828*d8a1a304SHeiko Schocher		if (($line=~/$Type\s*$Ident\(.*\).*\s\{/) and
2829*d8a1a304SHeiko Schocher		    !($line=~/\#\s*define.*do\s\{/) and !($line=~/}/)) {
2830dd88ab32SMasahiro Yamada			ERROR("OPEN_BRACE",
2831dd88ab32SMasahiro Yamada			      "open brace '{' following function declarations go on the next line\n" . $herecurr);
2832dd88ab32SMasahiro Yamada		}
2833dd88ab32SMasahiro Yamada
2834dd88ab32SMasahiro Yamada# open braces for enum, union and struct go on the same line.
2835dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*{/ &&
2836dd88ab32SMasahiro Yamada		    $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
2837dd88ab32SMasahiro Yamada			ERROR("OPEN_BRACE",
2838dd88ab32SMasahiro Yamada			      "open brace '{' following $1 go on the same line\n" . $hereprev);
2839dd88ab32SMasahiro Yamada		}
2840dd88ab32SMasahiro Yamada
2841dd88ab32SMasahiro Yamada# missing space after union, struct or enum definition
28426b9709d9STom Rini		if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
28436b9709d9STom Rini			if (WARN("SPACING",
28446b9709d9STom Rini				 "missing space after $1 definition\n" . $herecurr) &&
28456b9709d9STom Rini			    $fix) {
28466b9709d9STom Rini				$fixed[$linenr - 1] =~
28476b9709d9STom Rini				    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
28486b9709d9STom Rini			}
28496b9709d9STom Rini		}
28506b9709d9STom Rini
28516b9709d9STom Rini# Function pointer declarations
28526b9709d9STom Rini# check spacing between type, funcptr, and args
28536b9709d9STom Rini# canonical declaration is "type (*funcptr)(args...)"
28546b9709d9STom Rini#
28556b9709d9STom Rini# the $Declare variable will capture all spaces after the type
28566b9709d9STom Rini# so check it for trailing missing spaces or multiple spaces
28576b9709d9STom Rini		if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)$Ident(\s*)\)(\s*)\(/) {
28586b9709d9STom Rini			my $declare = $1;
28596b9709d9STom Rini			my $pre_pointer_space = $2;
28606b9709d9STom Rini			my $post_pointer_space = $3;
28616b9709d9STom Rini			my $funcname = $4;
28626b9709d9STom Rini			my $post_funcname_space = $5;
28636b9709d9STom Rini			my $pre_args_space = $6;
28646b9709d9STom Rini
28656b9709d9STom Rini			if ($declare !~ /\s$/) {
2866dd88ab32SMasahiro Yamada				WARN("SPACING",
28676b9709d9STom Rini				     "missing space after return type\n" . $herecurr);
28686b9709d9STom Rini			}
28696b9709d9STom Rini
28706b9709d9STom Rini# unnecessary space "type  (*funcptr)(args...)"
28716b9709d9STom Rini			elsif ($declare =~ /\s{2,}$/) {
28726b9709d9STom Rini				WARN("SPACING",
28736b9709d9STom Rini				     "Multiple spaces after return type\n" . $herecurr);
28746b9709d9STom Rini			}
28756b9709d9STom Rini
28766b9709d9STom Rini# unnecessary space "type ( *funcptr)(args...)"
28776b9709d9STom Rini			if (defined $pre_pointer_space &&
28786b9709d9STom Rini			    $pre_pointer_space =~ /^\s/) {
28796b9709d9STom Rini				WARN("SPACING",
28806b9709d9STom Rini				     "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
28816b9709d9STom Rini			}
28826b9709d9STom Rini
28836b9709d9STom Rini# unnecessary space "type (* funcptr)(args...)"
28846b9709d9STom Rini			if (defined $post_pointer_space &&
28856b9709d9STom Rini			    $post_pointer_space =~ /^\s/) {
28866b9709d9STom Rini				WARN("SPACING",
28876b9709d9STom Rini				     "Unnecessary space before function pointer name\n" . $herecurr);
28886b9709d9STom Rini			}
28896b9709d9STom Rini
28906b9709d9STom Rini# unnecessary space "type (*funcptr )(args...)"
28916b9709d9STom Rini			if (defined $post_funcname_space &&
28926b9709d9STom Rini			    $post_funcname_space =~ /^\s/) {
28936b9709d9STom Rini				WARN("SPACING",
28946b9709d9STom Rini				     "Unnecessary space after function pointer name\n" . $herecurr);
28956b9709d9STom Rini			}
28966b9709d9STom Rini
28976b9709d9STom Rini# unnecessary space "type (*funcptr) (args...)"
28986b9709d9STom Rini			if (defined $pre_args_space &&
28996b9709d9STom Rini			    $pre_args_space =~ /^\s/) {
29006b9709d9STom Rini				WARN("SPACING",
29016b9709d9STom Rini				     "Unnecessary space before function pointer arguments\n" . $herecurr);
29026b9709d9STom Rini			}
29036b9709d9STom Rini
29046b9709d9STom Rini			if (show_type("SPACING") && $fix) {
29056b9709d9STom Rini				$fixed[$linenr - 1] =~
29066b9709d9STom Rini				    s/^(.\s*$Declare)\(\s*\*\s*($Ident)\s*\)\s*\(/rtrim($1) . " " . "\(\*$2\)\("/ex;
29076b9709d9STom Rini			}
2908dd88ab32SMasahiro Yamada		}
2909dd88ab32SMasahiro Yamada
2910dd88ab32SMasahiro Yamada# check for spacing round square brackets; allowed:
2911dd88ab32SMasahiro Yamada#  1. with a type on the left -- int [] a;
2912dd88ab32SMasahiro Yamada#  2. at the beginning of a line for slice initialisers -- [0...10] = 5,
2913dd88ab32SMasahiro Yamada#  3. inside a curly brace -- = { [0...10] = 5 }
2914dd88ab32SMasahiro Yamada		while ($line =~ /(.*?\s)\[/g) {
2915dd88ab32SMasahiro Yamada			my ($where, $prefix) = ($-[1], $1);
2916dd88ab32SMasahiro Yamada			if ($prefix !~ /$Type\s+$/ &&
2917dd88ab32SMasahiro Yamada			    ($where != 0 || $prefix !~ /^.\s+$/) &&
2918dd88ab32SMasahiro Yamada			    $prefix !~ /[{,]\s+$/) {
29196b9709d9STom Rini				if (ERROR("BRACKET_SPACE",
29206b9709d9STom Rini					  "space prohibited before open square bracket '['\n" . $herecurr) &&
29216b9709d9STom Rini				    $fix) {
29226b9709d9STom Rini				    $fixed[$linenr - 1] =~
29236b9709d9STom Rini					s/^(\+.*?)\s+\[/$1\[/;
29246b9709d9STom Rini				}
2925dd88ab32SMasahiro Yamada			}
2926dd88ab32SMasahiro Yamada		}
2927dd88ab32SMasahiro Yamada
2928dd88ab32SMasahiro Yamada# check for spaces between functions and their parentheses.
2929dd88ab32SMasahiro Yamada		while ($line =~ /($Ident)\s+\(/g) {
2930dd88ab32SMasahiro Yamada			my $name = $1;
2931dd88ab32SMasahiro Yamada			my $ctx_before = substr($line, 0, $-[1]);
2932dd88ab32SMasahiro Yamada			my $ctx = "$ctx_before$name";
2933dd88ab32SMasahiro Yamada
2934dd88ab32SMasahiro Yamada			# Ignore those directives where spaces _are_ permitted.
2935dd88ab32SMasahiro Yamada			if ($name =~ /^(?:
2936dd88ab32SMasahiro Yamada				if|for|while|switch|return|case|
2937dd88ab32SMasahiro Yamada				volatile|__volatile__|
2938dd88ab32SMasahiro Yamada				__attribute__|format|__extension__|
2939dd88ab32SMasahiro Yamada				asm|__asm__)$/x)
2940dd88ab32SMasahiro Yamada			{
2941dd88ab32SMasahiro Yamada			# cpp #define statements have non-optional spaces, ie
2942dd88ab32SMasahiro Yamada			# if there is a space between the name and the open
2943dd88ab32SMasahiro Yamada			# parenthesis it is simply not a parameter group.
2944dd88ab32SMasahiro Yamada			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
2945dd88ab32SMasahiro Yamada
2946dd88ab32SMasahiro Yamada			# cpp #elif statement condition may start with a (
2947dd88ab32SMasahiro Yamada			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
2948dd88ab32SMasahiro Yamada
2949dd88ab32SMasahiro Yamada			# If this whole things ends with a type its most
2950dd88ab32SMasahiro Yamada			# likely a typedef for a function.
2951dd88ab32SMasahiro Yamada			} elsif ($ctx =~ /$Type$/) {
2952dd88ab32SMasahiro Yamada
2953dd88ab32SMasahiro Yamada			} else {
29546b9709d9STom Rini				if (WARN("SPACING",
29556b9709d9STom Rini					 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
29566b9709d9STom Rini					     $fix) {
29576b9709d9STom Rini					$fixed[$linenr - 1] =~
29586b9709d9STom Rini					    s/\b$name\s+\(/$name\(/;
2959dd88ab32SMasahiro Yamada				}
2960dd88ab32SMasahiro Yamada			}
2961dd88ab32SMasahiro Yamada		}
2962dd88ab32SMasahiro Yamada
2963dd88ab32SMasahiro Yamada# Check operator spacing.
2964dd88ab32SMasahiro Yamada		if (!($line=~/\#\s*include/)) {
29656b9709d9STom Rini			my $fixed_line = "";
29666b9709d9STom Rini			my $line_fixed = 0;
29676b9709d9STom Rini
2968dd88ab32SMasahiro Yamada			my $ops = qr{
2969dd88ab32SMasahiro Yamada				<<=|>>=|<=|>=|==|!=|
2970dd88ab32SMasahiro Yamada				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
2971dd88ab32SMasahiro Yamada				=>|->|<<|>>|<|>|=|!|~|
2972dd88ab32SMasahiro Yamada				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
29736b9709d9STom Rini				\?:|\?|:
2974dd88ab32SMasahiro Yamada			}x;
2975dd88ab32SMasahiro Yamada			my @elements = split(/($ops|;)/, $opline);
29766b9709d9STom Rini
29776b9709d9STom Rini##			print("element count: <" . $#elements . ">\n");
29786b9709d9STom Rini##			foreach my $el (@elements) {
29796b9709d9STom Rini##				print("el: <$el>\n");
29806b9709d9STom Rini##			}
29816b9709d9STom Rini
29826b9709d9STom Rini			my @fix_elements = ();
2983dd88ab32SMasahiro Yamada			my $off = 0;
2984dd88ab32SMasahiro Yamada
29856b9709d9STom Rini			foreach my $el (@elements) {
29866b9709d9STom Rini				push(@fix_elements, substr($rawline, $off, length($el)));
29876b9709d9STom Rini				$off += length($el);
29886b9709d9STom Rini			}
29896b9709d9STom Rini
29906b9709d9STom Rini			$off = 0;
29916b9709d9STom Rini
2992dd88ab32SMasahiro Yamada			my $blank = copy_spacing($opline);
29936b9709d9STom Rini			my $last_after = -1;
2994dd88ab32SMasahiro Yamada
2995dd88ab32SMasahiro Yamada			for (my $n = 0; $n < $#elements; $n += 2) {
29966b9709d9STom Rini
29976b9709d9STom Rini				my $good = $fix_elements[$n] . $fix_elements[$n + 1];
29986b9709d9STom Rini
29996b9709d9STom Rini##				print("n: <$n> good: <$good>\n");
30006b9709d9STom Rini
3001dd88ab32SMasahiro Yamada				$off += length($elements[$n]);
3002dd88ab32SMasahiro Yamada
3003dd88ab32SMasahiro Yamada				# Pick up the preceding and succeeding characters.
3004dd88ab32SMasahiro Yamada				my $ca = substr($opline, 0, $off);
3005dd88ab32SMasahiro Yamada				my $cc = '';
3006dd88ab32SMasahiro Yamada				if (length($opline) >= ($off + length($elements[$n + 1]))) {
3007dd88ab32SMasahiro Yamada					$cc = substr($opline, $off + length($elements[$n + 1]));
3008dd88ab32SMasahiro Yamada				}
3009dd88ab32SMasahiro Yamada				my $cb = "$ca$;$cc";
3010dd88ab32SMasahiro Yamada
3011dd88ab32SMasahiro Yamada				my $a = '';
3012dd88ab32SMasahiro Yamada				$a = 'V' if ($elements[$n] ne '');
3013dd88ab32SMasahiro Yamada				$a = 'W' if ($elements[$n] =~ /\s$/);
3014dd88ab32SMasahiro Yamada				$a = 'C' if ($elements[$n] =~ /$;$/);
3015dd88ab32SMasahiro Yamada				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
3016dd88ab32SMasahiro Yamada				$a = 'O' if ($elements[$n] eq '');
3017dd88ab32SMasahiro Yamada				$a = 'E' if ($ca =~ /^\s*$/);
3018dd88ab32SMasahiro Yamada
3019dd88ab32SMasahiro Yamada				my $op = $elements[$n + 1];
3020dd88ab32SMasahiro Yamada
3021dd88ab32SMasahiro Yamada				my $c = '';
3022dd88ab32SMasahiro Yamada				if (defined $elements[$n + 2]) {
3023dd88ab32SMasahiro Yamada					$c = 'V' if ($elements[$n + 2] ne '');
3024dd88ab32SMasahiro Yamada					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
3025dd88ab32SMasahiro Yamada					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
3026dd88ab32SMasahiro Yamada					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
3027dd88ab32SMasahiro Yamada					$c = 'O' if ($elements[$n + 2] eq '');
3028dd88ab32SMasahiro Yamada					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
3029dd88ab32SMasahiro Yamada				} else {
3030dd88ab32SMasahiro Yamada					$c = 'E';
3031dd88ab32SMasahiro Yamada				}
3032dd88ab32SMasahiro Yamada
3033dd88ab32SMasahiro Yamada				my $ctx = "${a}x${c}";
3034dd88ab32SMasahiro Yamada
3035dd88ab32SMasahiro Yamada				my $at = "(ctx:$ctx)";
3036dd88ab32SMasahiro Yamada
3037dd88ab32SMasahiro Yamada				my $ptr = substr($blank, 0, $off) . "^";
3038dd88ab32SMasahiro Yamada				my $hereptr = "$hereline$ptr\n";
3039dd88ab32SMasahiro Yamada
3040dd88ab32SMasahiro Yamada				# Pull out the value of this operator.
3041dd88ab32SMasahiro Yamada				my $op_type = substr($curr_values, $off + 1, 1);
3042dd88ab32SMasahiro Yamada
3043dd88ab32SMasahiro Yamada				# Get the full operator variant.
3044dd88ab32SMasahiro Yamada				my $opv = $op . substr($curr_vars, $off, 1);
3045dd88ab32SMasahiro Yamada
3046dd88ab32SMasahiro Yamada				# Ignore operators passed as parameters.
3047dd88ab32SMasahiro Yamada				if ($op_type ne 'V' &&
3048dd88ab32SMasahiro Yamada				    $ca =~ /\s$/ && $cc =~ /^\s*,/) {
3049dd88ab32SMasahiro Yamada
3050dd88ab32SMasahiro Yamada#				# Ignore comments
3051dd88ab32SMasahiro Yamada#				} elsif ($op =~ /^$;+$/) {
3052dd88ab32SMasahiro Yamada
3053dd88ab32SMasahiro Yamada				# ; should have either the end of line or a space or \ after it
3054dd88ab32SMasahiro Yamada				} elsif ($op eq ';') {
3055dd88ab32SMasahiro Yamada					if ($ctx !~ /.x[WEBC]/ &&
3056dd88ab32SMasahiro Yamada					    $cc !~ /^\\/ && $cc !~ /^;/) {
30576b9709d9STom Rini						if (ERROR("SPACING",
30586b9709d9STom Rini							  "space required after that '$op' $at\n" . $hereptr)) {
30596b9709d9STom Rini							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
30606b9709d9STom Rini							$line_fixed = 1;
30616b9709d9STom Rini						}
3062dd88ab32SMasahiro Yamada					}
3063dd88ab32SMasahiro Yamada
3064dd88ab32SMasahiro Yamada				# // is a comment
3065dd88ab32SMasahiro Yamada				} elsif ($op eq '//') {
3066dd88ab32SMasahiro Yamada
3067dd88ab32SMasahiro Yamada				# No spaces for:
3068dd88ab32SMasahiro Yamada				#   ->
3069dd88ab32SMasahiro Yamada				#   :   when part of a bitfield
3070dd88ab32SMasahiro Yamada				} elsif ($op eq '->' || $opv eq ':B') {
3071dd88ab32SMasahiro Yamada					if ($ctx =~ /Wx.|.xW/) {
30726b9709d9STom Rini						if (ERROR("SPACING",
30736b9709d9STom Rini							  "spaces prohibited around that '$op' $at\n" . $hereptr)) {
30746b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
30756b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
30766b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
30776b9709d9STom Rini							}
30786b9709d9STom Rini							$line_fixed = 1;
30796b9709d9STom Rini						}
3080dd88ab32SMasahiro Yamada					}
3081dd88ab32SMasahiro Yamada
3082dd88ab32SMasahiro Yamada				# , must have a space on the right.
3083dd88ab32SMasahiro Yamada				} elsif ($op eq ',') {
3084dd88ab32SMasahiro Yamada					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
30856b9709d9STom Rini						if (ERROR("SPACING",
30866b9709d9STom Rini							  "space required after that '$op' $at\n" . $hereptr)) {
30876b9709d9STom Rini							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
30886b9709d9STom Rini							$line_fixed = 1;
30896b9709d9STom Rini							$last_after = $n;
30906b9709d9STom Rini						}
3091dd88ab32SMasahiro Yamada					}
3092dd88ab32SMasahiro Yamada
3093dd88ab32SMasahiro Yamada				# '*' as part of a type definition -- reported already.
3094dd88ab32SMasahiro Yamada				} elsif ($opv eq '*_') {
3095dd88ab32SMasahiro Yamada					#warn "'*' is part of type\n";
3096dd88ab32SMasahiro Yamada
3097dd88ab32SMasahiro Yamada				# unary operators should have a space before and
3098dd88ab32SMasahiro Yamada				# none after.  May be left adjacent to another
3099dd88ab32SMasahiro Yamada				# unary operator, or a cast
3100dd88ab32SMasahiro Yamada				} elsif ($op eq '!' || $op eq '~' ||
3101dd88ab32SMasahiro Yamada					 $opv eq '*U' || $opv eq '-U' ||
3102dd88ab32SMasahiro Yamada					 $opv eq '&U' || $opv eq '&&U') {
3103dd88ab32SMasahiro Yamada					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
31046b9709d9STom Rini						if (ERROR("SPACING",
31056b9709d9STom Rini							  "space required before that '$op' $at\n" . $hereptr)) {
31066b9709d9STom Rini							if ($n != $last_after + 2) {
31076b9709d9STom Rini								$good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
31086b9709d9STom Rini								$line_fixed = 1;
31096b9709d9STom Rini							}
31106b9709d9STom Rini						}
3111dd88ab32SMasahiro Yamada					}
3112dd88ab32SMasahiro Yamada					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
3113dd88ab32SMasahiro Yamada						# A unary '*' may be const
3114dd88ab32SMasahiro Yamada
3115dd88ab32SMasahiro Yamada					} elsif ($ctx =~ /.xW/) {
31166b9709d9STom Rini						if (ERROR("SPACING",
31176b9709d9STom Rini							  "space prohibited after that '$op' $at\n" . $hereptr)) {
31186b9709d9STom Rini							$good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
31196b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
31206b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
31216b9709d9STom Rini							}
31226b9709d9STom Rini							$line_fixed = 1;
31236b9709d9STom Rini						}
3124dd88ab32SMasahiro Yamada					}
3125dd88ab32SMasahiro Yamada
3126dd88ab32SMasahiro Yamada				# unary ++ and unary -- are allowed no space on one side.
3127dd88ab32SMasahiro Yamada				} elsif ($op eq '++' or $op eq '--') {
3128dd88ab32SMasahiro Yamada					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
31296b9709d9STom Rini						if (ERROR("SPACING",
31306b9709d9STom Rini							  "space required one side of that '$op' $at\n" . $hereptr)) {
31316b9709d9STom Rini							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
31326b9709d9STom Rini							$line_fixed = 1;
31336b9709d9STom Rini						}
3134dd88ab32SMasahiro Yamada					}
3135dd88ab32SMasahiro Yamada					if ($ctx =~ /Wx[BE]/ ||
3136dd88ab32SMasahiro Yamada					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
31376b9709d9STom Rini						if (ERROR("SPACING",
31386b9709d9STom Rini							  "space prohibited before that '$op' $at\n" . $hereptr)) {
31396b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
31406b9709d9STom Rini							$line_fixed = 1;
31416b9709d9STom Rini						}
3142dd88ab32SMasahiro Yamada					}
3143dd88ab32SMasahiro Yamada					if ($ctx =~ /ExW/) {
31446b9709d9STom Rini						if (ERROR("SPACING",
31456b9709d9STom Rini							  "space prohibited after that '$op' $at\n" . $hereptr)) {
31466b9709d9STom Rini							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
31476b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
31486b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
3149dd88ab32SMasahiro Yamada							}
31506b9709d9STom Rini							$line_fixed = 1;
31516b9709d9STom Rini						}
31526b9709d9STom Rini					}
3153dd88ab32SMasahiro Yamada
3154dd88ab32SMasahiro Yamada				# << and >> may either have or not have spaces both sides
3155dd88ab32SMasahiro Yamada				} elsif ($op eq '<<' or $op eq '>>' or
3156dd88ab32SMasahiro Yamada					 $op eq '&' or $op eq '^' or $op eq '|' or
3157dd88ab32SMasahiro Yamada					 $op eq '+' or $op eq '-' or
3158dd88ab32SMasahiro Yamada					 $op eq '*' or $op eq '/' or
3159dd88ab32SMasahiro Yamada					 $op eq '%')
3160dd88ab32SMasahiro Yamada				{
3161dd88ab32SMasahiro Yamada					if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
31626b9709d9STom Rini						if (ERROR("SPACING",
31636b9709d9STom Rini							  "need consistent spacing around '$op' $at\n" . $hereptr)) {
31646b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
31656b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
31666b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
31676b9709d9STom Rini							}
31686b9709d9STom Rini							$line_fixed = 1;
31696b9709d9STom Rini						}
3170dd88ab32SMasahiro Yamada					}
3171dd88ab32SMasahiro Yamada
3172dd88ab32SMasahiro Yamada				# A colon needs no spaces before when it is
3173dd88ab32SMasahiro Yamada				# terminating a case value or a label.
3174dd88ab32SMasahiro Yamada				} elsif ($opv eq ':C' || $opv eq ':L') {
3175dd88ab32SMasahiro Yamada					if ($ctx =~ /Wx./) {
31766b9709d9STom Rini						if (ERROR("SPACING",
31776b9709d9STom Rini							  "space prohibited before that '$op' $at\n" . $hereptr)) {
31786b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
31796b9709d9STom Rini							$line_fixed = 1;
31806b9709d9STom Rini						}
3181dd88ab32SMasahiro Yamada					}
3182dd88ab32SMasahiro Yamada
3183dd88ab32SMasahiro Yamada				# All the others need spaces both sides.
3184dd88ab32SMasahiro Yamada				} elsif ($ctx !~ /[EWC]x[CWE]/) {
3185dd88ab32SMasahiro Yamada					my $ok = 0;
3186dd88ab32SMasahiro Yamada
3187dd88ab32SMasahiro Yamada					# Ignore email addresses <foo@bar>
3188dd88ab32SMasahiro Yamada					if (($op eq '<' &&
3189dd88ab32SMasahiro Yamada					     $cc =~ /^\S+\@\S+>/) ||
3190dd88ab32SMasahiro Yamada					    ($op eq '>' &&
3191dd88ab32SMasahiro Yamada					     $ca =~ /<\S+\@\S+$/))
3192dd88ab32SMasahiro Yamada					{
3193dd88ab32SMasahiro Yamada					    	$ok = 1;
3194dd88ab32SMasahiro Yamada					}
3195dd88ab32SMasahiro Yamada
31966b9709d9STom Rini					# messages are ERROR, but ?: are CHK
3197dd88ab32SMasahiro Yamada					if ($ok == 0) {
31986b9709d9STom Rini						my $msg_type = \&ERROR;
31996b9709d9STom Rini						$msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
32006b9709d9STom Rini
32016b9709d9STom Rini						if (&{$msg_type}("SPACING",
32026b9709d9STom Rini								 "spaces required around that '$op' $at\n" . $hereptr)) {
32036b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
32046b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
32056b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
32066b9709d9STom Rini							}
32076b9709d9STom Rini							$line_fixed = 1;
32086b9709d9STom Rini						}
3209dd88ab32SMasahiro Yamada					}
3210dd88ab32SMasahiro Yamada				}
3211dd88ab32SMasahiro Yamada				$off += length($elements[$n + 1]);
32126b9709d9STom Rini
32136b9709d9STom Rini##				print("n: <$n> GOOD: <$good>\n");
32146b9709d9STom Rini
32156b9709d9STom Rini				$fixed_line = $fixed_line . $good;
32166b9709d9STom Rini			}
32176b9709d9STom Rini
32186b9709d9STom Rini			if (($#elements % 2) == 0) {
32196b9709d9STom Rini				$fixed_line = $fixed_line . $fix_elements[$#elements];
32206b9709d9STom Rini			}
32216b9709d9STom Rini
32226b9709d9STom Rini			if ($fix && $line_fixed && $fixed_line ne $fixed[$linenr - 1]) {
32236b9709d9STom Rini				$fixed[$linenr - 1] = $fixed_line;
32246b9709d9STom Rini			}
32256b9709d9STom Rini
32266b9709d9STom Rini
32276b9709d9STom Rini		}
32286b9709d9STom Rini
32296b9709d9STom Rini# check for whitespace before a non-naked semicolon
32306b9709d9STom Rini		if ($line =~ /^\+.*\S\s+;\s*$/) {
32316b9709d9STom Rini			if (WARN("SPACING",
32326b9709d9STom Rini				 "space prohibited before semicolon\n" . $herecurr) &&
32336b9709d9STom Rini			    $fix) {
32346b9709d9STom Rini				1 while $fixed[$linenr - 1] =~
32356b9709d9STom Rini				    s/^(\+.*\S)\s+;/$1;/;
3236dd88ab32SMasahiro Yamada			}
3237dd88ab32SMasahiro Yamada		}
3238dd88ab32SMasahiro Yamada
3239dd88ab32SMasahiro Yamada# check for multiple assignments
3240dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
3241dd88ab32SMasahiro Yamada			CHK("MULTIPLE_ASSIGNMENTS",
3242dd88ab32SMasahiro Yamada			    "multiple assignments should be avoided\n" . $herecurr);
3243dd88ab32SMasahiro Yamada		}
3244dd88ab32SMasahiro Yamada
3245dd88ab32SMasahiro Yamada## # check for multiple declarations, allowing for a function declaration
3246dd88ab32SMasahiro Yamada## # continuation.
3247dd88ab32SMasahiro Yamada## 		if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
3248dd88ab32SMasahiro Yamada## 		    $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
3249dd88ab32SMasahiro Yamada##
3250dd88ab32SMasahiro Yamada## 			# Remove any bracketed sections to ensure we do not
3251dd88ab32SMasahiro Yamada## 			# falsly report the parameters of functions.
3252dd88ab32SMasahiro Yamada## 			my $ln = $line;
3253dd88ab32SMasahiro Yamada## 			while ($ln =~ s/\([^\(\)]*\)//g) {
3254dd88ab32SMasahiro Yamada## 			}
3255dd88ab32SMasahiro Yamada## 			if ($ln =~ /,/) {
3256dd88ab32SMasahiro Yamada## 				WARN("MULTIPLE_DECLARATION",
3257dd88ab32SMasahiro Yamada##				     "declaring multiple variables together should be avoided\n" . $herecurr);
3258dd88ab32SMasahiro Yamada## 			}
3259dd88ab32SMasahiro Yamada## 		}
3260dd88ab32SMasahiro Yamada
3261dd88ab32SMasahiro Yamada#need space before brace following if, while, etc
3262*d8a1a304SHeiko Schocher		if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\){/) ||
3263*d8a1a304SHeiko Schocher		    $line =~ /do\{/) {
32646b9709d9STom Rini			if (ERROR("SPACING",
32656b9709d9STom Rini				  "space required before the open brace '{'\n" . $herecurr) &&
32666b9709d9STom Rini			    $fix) {
32676b9709d9STom Rini				$fixed[$linenr - 1] =~ s/^(\+.*(?:do|\))){/$1 {/;
3268dd88ab32SMasahiro Yamada			}
32696b9709d9STom Rini		}
32706b9709d9STom Rini
32716b9709d9STom Rini## # check for blank lines before declarations
32726b9709d9STom Rini##		if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
32736b9709d9STom Rini##		    $prevrawline =~ /^.\s*$/) {
32746b9709d9STom Rini##			WARN("SPACING",
32756b9709d9STom Rini##			     "No blank lines before declarations\n" . $hereprev);
32766b9709d9STom Rini##		}
32776b9709d9STom Rini##
3278dd88ab32SMasahiro Yamada
3279dd88ab32SMasahiro Yamada# closing brace should have a space following it when it has anything
3280dd88ab32SMasahiro Yamada# on the line
3281dd88ab32SMasahiro Yamada		if ($line =~ /}(?!(?:,|;|\)))\S/) {
32826b9709d9STom Rini			if (ERROR("SPACING",
32836b9709d9STom Rini				  "space required after that close brace '}'\n" . $herecurr) &&
32846b9709d9STom Rini			    $fix) {
32856b9709d9STom Rini				$fixed[$linenr - 1] =~
32866b9709d9STom Rini				    s/}((?!(?:,|;|\)))\S)/} $1/;
32876b9709d9STom Rini			}
3288dd88ab32SMasahiro Yamada		}
3289dd88ab32SMasahiro Yamada
3290dd88ab32SMasahiro Yamada# check spacing on square brackets
3291dd88ab32SMasahiro Yamada		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
32926b9709d9STom Rini			if (ERROR("SPACING",
32936b9709d9STom Rini				  "space prohibited after that open square bracket '['\n" . $herecurr) &&
32946b9709d9STom Rini			    $fix) {
32956b9709d9STom Rini				$fixed[$linenr - 1] =~
32966b9709d9STom Rini				    s/\[\s+/\[/;
32976b9709d9STom Rini			}
3298dd88ab32SMasahiro Yamada		}
3299dd88ab32SMasahiro Yamada		if ($line =~ /\s\]/) {
33006b9709d9STom Rini			if (ERROR("SPACING",
33016b9709d9STom Rini				  "space prohibited before that close square bracket ']'\n" . $herecurr) &&
33026b9709d9STom Rini			    $fix) {
33036b9709d9STom Rini				$fixed[$linenr - 1] =~
33046b9709d9STom Rini				    s/\s+\]/\]/;
33056b9709d9STom Rini			}
3306dd88ab32SMasahiro Yamada		}
3307dd88ab32SMasahiro Yamada
3308dd88ab32SMasahiro Yamada# check spacing on parentheses
3309dd88ab32SMasahiro Yamada		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
3310dd88ab32SMasahiro Yamada		    $line !~ /for\s*\(\s+;/) {
33116b9709d9STom Rini			if (ERROR("SPACING",
33126b9709d9STom Rini				  "space prohibited after that open parenthesis '('\n" . $herecurr) &&
33136b9709d9STom Rini			    $fix) {
33146b9709d9STom Rini				$fixed[$linenr - 1] =~
33156b9709d9STom Rini				    s/\(\s+/\(/;
33166b9709d9STom Rini			}
3317dd88ab32SMasahiro Yamada		}
3318dd88ab32SMasahiro Yamada		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
3319dd88ab32SMasahiro Yamada		    $line !~ /for\s*\(.*;\s+\)/ &&
3320dd88ab32SMasahiro Yamada		    $line !~ /:\s+\)/) {
33216b9709d9STom Rini			if (ERROR("SPACING",
33226b9709d9STom Rini				  "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
33236b9709d9STom Rini			    $fix) {
33246b9709d9STom Rini				$fixed[$linenr - 1] =~
33256b9709d9STom Rini				    s/\s+\)/\)/;
33266b9709d9STom Rini			}
3327dd88ab32SMasahiro Yamada		}
3328dd88ab32SMasahiro Yamada
3329dd88ab32SMasahiro Yamada#goto labels aren't indented, allow a single space however
3330dd88ab32SMasahiro Yamada		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
3331dd88ab32SMasahiro Yamada		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
33326b9709d9STom Rini			if (WARN("INDENTED_LABEL",
33336b9709d9STom Rini				 "labels should not be indented\n" . $herecurr) &&
33346b9709d9STom Rini			    $fix) {
33356b9709d9STom Rini				$fixed[$linenr - 1] =~
33366b9709d9STom Rini				    s/^(.)\s+/$1/;
33376b9709d9STom Rini			}
3338dd88ab32SMasahiro Yamada		}
3339dd88ab32SMasahiro Yamada
3340dd88ab32SMasahiro Yamada# Return is not a function.
33416b9709d9STom Rini		if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
3342dd88ab32SMasahiro Yamada			my $spacing = $1;
33436b9709d9STom Rini			if ($^V && $^V ge 5.10.0 &&
33446b9709d9STom Rini			    $stat =~ /^.\s*return\s*$balanced_parens\s*;\s*$/) {
3345dd88ab32SMasahiro Yamada				ERROR("RETURN_PARENTHESES",
3346dd88ab32SMasahiro Yamada				      "return is not a function, parentheses are not required\n" . $herecurr);
3347dd88ab32SMasahiro Yamada
3348dd88ab32SMasahiro Yamada			} elsif ($spacing !~ /\s+/) {
3349dd88ab32SMasahiro Yamada				ERROR("SPACING",
3350dd88ab32SMasahiro Yamada				      "space required before the open parenthesis '('\n" . $herecurr);
3351dd88ab32SMasahiro Yamada			}
3352dd88ab32SMasahiro Yamada		}
33536b9709d9STom Rini
33546b9709d9STom Rini# if statements using unnecessary parentheses - ie: if ((foo == bar))
33556b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
33566b9709d9STom Rini		    $line =~ /\bif\s*((?:\(\s*){2,})/) {
33576b9709d9STom Rini			my $openparens = $1;
33586b9709d9STom Rini			my $count = $openparens =~ tr@\(@\(@;
33596b9709d9STom Rini			my $msg = "";
33606b9709d9STom Rini			if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
33616b9709d9STom Rini				my $comp = $4;	#Not $1 because of $LvalOrFunc
33626b9709d9STom Rini				$msg = " - maybe == should be = ?" if ($comp eq "==");
33636b9709d9STom Rini				WARN("UNNECESSARY_PARENTHESES",
33646b9709d9STom Rini				     "Unnecessary parentheses$msg\n" . $herecurr);
33656b9709d9STom Rini			}
33666b9709d9STom Rini		}
33676b9709d9STom Rini
3368dd88ab32SMasahiro Yamada# Return of what appears to be an errno should normally be -'ve
3369dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
3370dd88ab32SMasahiro Yamada			my $name = $1;
3371dd88ab32SMasahiro Yamada			if ($name ne 'EOF' && $name ne 'ERROR') {
3372dd88ab32SMasahiro Yamada				WARN("USE_NEGATIVE_ERRNO",
3373dd88ab32SMasahiro Yamada				     "return of an errno should typically be -ve (return -$1)\n" . $herecurr);
3374dd88ab32SMasahiro Yamada			}
3375dd88ab32SMasahiro Yamada		}
3376dd88ab32SMasahiro Yamada
3377dd88ab32SMasahiro Yamada# Need a space before open parenthesis after if, while etc
3378dd88ab32SMasahiro Yamada		if ($line =~ /\b(if|while|for|switch)\(/) {
33796b9709d9STom Rini			if (ERROR("SPACING",
33806b9709d9STom Rini				  "space required before the open parenthesis '('\n" . $herecurr) &&
33816b9709d9STom Rini			    $fix) {
33826b9709d9STom Rini				$fixed[$linenr - 1] =~
33836b9709d9STom Rini				    s/\b(if|while|for|switch)\(/$1 \(/;
33846b9709d9STom Rini			}
3385dd88ab32SMasahiro Yamada		}
3386dd88ab32SMasahiro Yamada
3387dd88ab32SMasahiro Yamada# Check for illegal assignment in if conditional -- and check for trailing
3388dd88ab32SMasahiro Yamada# statements after the conditional.
3389dd88ab32SMasahiro Yamada		if ($line =~ /do\s*(?!{)/) {
3390dd88ab32SMasahiro Yamada			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3391dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0)
3392dd88ab32SMasahiro Yamada					if (!defined $stat);
3393dd88ab32SMasahiro Yamada			my ($stat_next) = ctx_statement_block($line_nr_next,
3394dd88ab32SMasahiro Yamada						$remain_next, $off_next);
3395dd88ab32SMasahiro Yamada			$stat_next =~ s/\n./\n /g;
3396dd88ab32SMasahiro Yamada			##print "stat<$stat> stat_next<$stat_next>\n";
3397dd88ab32SMasahiro Yamada
3398dd88ab32SMasahiro Yamada			if ($stat_next =~ /^\s*while\b/) {
3399dd88ab32SMasahiro Yamada				# If the statement carries leading newlines,
3400dd88ab32SMasahiro Yamada				# then count those as offsets.
3401dd88ab32SMasahiro Yamada				my ($whitespace) =
3402dd88ab32SMasahiro Yamada					($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
3403dd88ab32SMasahiro Yamada				my $offset =
3404dd88ab32SMasahiro Yamada					statement_rawlines($whitespace) - 1;
3405dd88ab32SMasahiro Yamada
3406dd88ab32SMasahiro Yamada				$suppress_whiletrailers{$line_nr_next +
3407dd88ab32SMasahiro Yamada								$offset} = 1;
3408dd88ab32SMasahiro Yamada			}
3409dd88ab32SMasahiro Yamada		}
3410dd88ab32SMasahiro Yamada		if (!defined $suppress_whiletrailers{$linenr} &&
34116b9709d9STom Rini		    defined($stat) && defined($cond) &&
3412dd88ab32SMasahiro Yamada		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
3413dd88ab32SMasahiro Yamada			my ($s, $c) = ($stat, $cond);
3414dd88ab32SMasahiro Yamada
3415dd88ab32SMasahiro Yamada			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
3416dd88ab32SMasahiro Yamada				ERROR("ASSIGN_IN_IF",
3417dd88ab32SMasahiro Yamada				      "do not use assignment in if condition\n" . $herecurr);
3418dd88ab32SMasahiro Yamada			}
3419dd88ab32SMasahiro Yamada
3420dd88ab32SMasahiro Yamada			# Find out what is on the end of the line after the
3421dd88ab32SMasahiro Yamada			# conditional.
3422dd88ab32SMasahiro Yamada			substr($s, 0, length($c), '');
3423dd88ab32SMasahiro Yamada			$s =~ s/\n.*//g;
3424dd88ab32SMasahiro Yamada			$s =~ s/$;//g; 	# Remove any comments
3425dd88ab32SMasahiro Yamada			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
3426dd88ab32SMasahiro Yamada			    $c !~ /}\s*while\s*/)
3427dd88ab32SMasahiro Yamada			{
3428dd88ab32SMasahiro Yamada				# Find out how long the conditional actually is.
3429dd88ab32SMasahiro Yamada				my @newlines = ($c =~ /\n/gs);
3430dd88ab32SMasahiro Yamada				my $cond_lines = 1 + $#newlines;
3431dd88ab32SMasahiro Yamada				my $stat_real = '';
3432dd88ab32SMasahiro Yamada
3433dd88ab32SMasahiro Yamada				$stat_real = raw_line($linenr, $cond_lines)
3434dd88ab32SMasahiro Yamada							. "\n" if ($cond_lines);
3435dd88ab32SMasahiro Yamada				if (defined($stat_real) && $cond_lines > 1) {
3436dd88ab32SMasahiro Yamada					$stat_real = "[...]\n$stat_real";
3437dd88ab32SMasahiro Yamada				}
3438dd88ab32SMasahiro Yamada
3439dd88ab32SMasahiro Yamada				ERROR("TRAILING_STATEMENTS",
3440dd88ab32SMasahiro Yamada				      "trailing statements should be on next line\n" . $herecurr . $stat_real);
3441dd88ab32SMasahiro Yamada			}
3442dd88ab32SMasahiro Yamada		}
3443dd88ab32SMasahiro Yamada
3444dd88ab32SMasahiro Yamada# Check for bitwise tests written as boolean
3445dd88ab32SMasahiro Yamada		if ($line =~ /
3446dd88ab32SMasahiro Yamada			(?:
3447dd88ab32SMasahiro Yamada				(?:\[|\(|\&\&|\|\|)
3448dd88ab32SMasahiro Yamada				\s*0[xX][0-9]+\s*
3449dd88ab32SMasahiro Yamada				(?:\&\&|\|\|)
3450dd88ab32SMasahiro Yamada			|
3451dd88ab32SMasahiro Yamada				(?:\&\&|\|\|)
3452dd88ab32SMasahiro Yamada				\s*0[xX][0-9]+\s*
3453dd88ab32SMasahiro Yamada				(?:\&\&|\|\||\)|\])
3454dd88ab32SMasahiro Yamada			)/x)
3455dd88ab32SMasahiro Yamada		{
3456dd88ab32SMasahiro Yamada			WARN("HEXADECIMAL_BOOLEAN_TEST",
3457dd88ab32SMasahiro Yamada			     "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
3458dd88ab32SMasahiro Yamada		}
3459dd88ab32SMasahiro Yamada
3460dd88ab32SMasahiro Yamada# if and else should not have general statements after it
3461dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
3462dd88ab32SMasahiro Yamada			my $s = $1;
3463dd88ab32SMasahiro Yamada			$s =~ s/$;//g; 	# Remove any comments
3464dd88ab32SMasahiro Yamada			if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
3465dd88ab32SMasahiro Yamada				ERROR("TRAILING_STATEMENTS",
3466dd88ab32SMasahiro Yamada				      "trailing statements should be on next line\n" . $herecurr);
3467dd88ab32SMasahiro Yamada			}
3468dd88ab32SMasahiro Yamada		}
3469dd88ab32SMasahiro Yamada# if should not continue a brace
3470dd88ab32SMasahiro Yamada		if ($line =~ /}\s*if\b/) {
3471dd88ab32SMasahiro Yamada			ERROR("TRAILING_STATEMENTS",
3472dd88ab32SMasahiro Yamada			      "trailing statements should be on next line\n" .
3473dd88ab32SMasahiro Yamada				$herecurr);
3474dd88ab32SMasahiro Yamada		}
3475dd88ab32SMasahiro Yamada# case and default should not have general statements after them
3476dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
3477dd88ab32SMasahiro Yamada		    $line !~ /\G(?:
3478dd88ab32SMasahiro Yamada			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
3479dd88ab32SMasahiro Yamada			\s*return\s+
3480dd88ab32SMasahiro Yamada		    )/xg)
3481dd88ab32SMasahiro Yamada		{
3482dd88ab32SMasahiro Yamada			ERROR("TRAILING_STATEMENTS",
3483dd88ab32SMasahiro Yamada			      "trailing statements should be on next line\n" . $herecurr);
3484dd88ab32SMasahiro Yamada		}
3485dd88ab32SMasahiro Yamada
3486dd88ab32SMasahiro Yamada		# Check for }<nl>else {, these must be at the same
3487dd88ab32SMasahiro Yamada		# indent level to be relevant to each other.
3488dd88ab32SMasahiro Yamada		if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
3489dd88ab32SMasahiro Yamada						$previndent == $indent) {
3490dd88ab32SMasahiro Yamada			ERROR("ELSE_AFTER_BRACE",
3491dd88ab32SMasahiro Yamada			      "else should follow close brace '}'\n" . $hereprev);
3492dd88ab32SMasahiro Yamada		}
3493dd88ab32SMasahiro Yamada
3494dd88ab32SMasahiro Yamada		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and
3495dd88ab32SMasahiro Yamada						$previndent == $indent) {
3496dd88ab32SMasahiro Yamada			my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
3497dd88ab32SMasahiro Yamada
3498dd88ab32SMasahiro Yamada			# Find out what is on the end of the line after the
3499dd88ab32SMasahiro Yamada			# conditional.
3500dd88ab32SMasahiro Yamada			substr($s, 0, length($c), '');
3501dd88ab32SMasahiro Yamada			$s =~ s/\n.*//g;
3502dd88ab32SMasahiro Yamada
3503dd88ab32SMasahiro Yamada			if ($s =~ /^\s*;/) {
3504dd88ab32SMasahiro Yamada				ERROR("WHILE_AFTER_BRACE",
3505dd88ab32SMasahiro Yamada				      "while should follow close brace '}'\n" . $hereprev);
3506dd88ab32SMasahiro Yamada			}
3507dd88ab32SMasahiro Yamada		}
3508dd88ab32SMasahiro Yamada
35096b9709d9STom Rini#Specific variable tests
3510dd88ab32SMasahiro Yamada		while ($line =~ m{($Constant|$Lval)}g) {
3511dd88ab32SMasahiro Yamada			my $var = $1;
35126b9709d9STom Rini
35136b9709d9STom Rini#gcc binary extension
35146b9709d9STom Rini			if ($var =~ /^$Binary$/) {
35156b9709d9STom Rini				if (WARN("GCC_BINARY_CONSTANT",
35166b9709d9STom Rini					 "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
35176b9709d9STom Rini				    $fix) {
35186b9709d9STom Rini					my $hexval = sprintf("0x%x", oct($var));
35196b9709d9STom Rini					$fixed[$linenr - 1] =~
35206b9709d9STom Rini					    s/\b$var\b/$hexval/;
35216b9709d9STom Rini				}
35226b9709d9STom Rini			}
35236b9709d9STom Rini
35246b9709d9STom Rini#CamelCase
35256b9709d9STom Rini			if ($var !~ /^$Constant$/ &&
35266b9709d9STom Rini			    $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
35276b9709d9STom Rini#Ignore Page<foo> variants
35286b9709d9STom Rini			    $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
35296b9709d9STom Rini#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
35306b9709d9STom Rini			    $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/) {
35316b9709d9STom Rini				while ($var =~ m{($Ident)}g) {
35326b9709d9STom Rini					my $word = $1;
35336b9709d9STom Rini					next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
35346b9709d9STom Rini					if ($check) {
35356b9709d9STom Rini						seed_camelcase_includes();
35366b9709d9STom Rini						if (!$file && !$camelcase_file_seeded) {
35376b9709d9STom Rini							seed_camelcase_file($realfile);
35386b9709d9STom Rini							$camelcase_file_seeded = 1;
35396b9709d9STom Rini						}
35406b9709d9STom Rini					}
35416b9709d9STom Rini					if (!defined $camelcase{$word}) {
35426b9709d9STom Rini						$camelcase{$word} = 1;
35436b9709d9STom Rini						CHK("CAMELCASE",
35446b9709d9STom Rini						    "Avoid CamelCase: <$word>\n" . $herecurr);
35456b9709d9STom Rini					}
35466b9709d9STom Rini				}
3547dd88ab32SMasahiro Yamada			}
3548dd88ab32SMasahiro Yamada		}
3549dd88ab32SMasahiro Yamada
3550dd88ab32SMasahiro Yamada#no spaces allowed after \ in define
35516b9709d9STom Rini		if ($line =~ /\#\s*define.*\\\s+$/) {
35526b9709d9STom Rini			if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
35536b9709d9STom Rini				 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
35546b9709d9STom Rini			    $fix) {
35556b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\s+$//;
35566b9709d9STom Rini			}
3557dd88ab32SMasahiro Yamada		}
3558dd88ab32SMasahiro Yamada
3559dd88ab32SMasahiro Yamada#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
3560dd88ab32SMasahiro Yamada		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
3561dd88ab32SMasahiro Yamada			my $file = "$1.h";
3562dd88ab32SMasahiro Yamada			my $checkfile = "include/linux/$file";
3563dd88ab32SMasahiro Yamada			if (-f "$root/$checkfile" &&
3564dd88ab32SMasahiro Yamada			    $realfile ne $checkfile &&
3565dd88ab32SMasahiro Yamada			    $1 !~ /$allowed_asm_includes/)
3566dd88ab32SMasahiro Yamada			{
3567dd88ab32SMasahiro Yamada				if ($realfile =~ m{^arch/}) {
3568dd88ab32SMasahiro Yamada					CHK("ARCH_INCLUDE_LINUX",
3569dd88ab32SMasahiro Yamada					    "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
3570dd88ab32SMasahiro Yamada				} else {
3571dd88ab32SMasahiro Yamada					WARN("INCLUDE_LINUX",
3572dd88ab32SMasahiro Yamada					     "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
3573dd88ab32SMasahiro Yamada				}
3574dd88ab32SMasahiro Yamada			}
3575dd88ab32SMasahiro Yamada		}
3576dd88ab32SMasahiro Yamada
3577dd88ab32SMasahiro Yamada# multi-statement macros should be enclosed in a do while loop, grab the
3578dd88ab32SMasahiro Yamada# first statement and ensure its the whole macro if its not enclosed
3579dd88ab32SMasahiro Yamada# in a known good container
3580dd88ab32SMasahiro Yamada		if ($realfile !~ m@/vmlinux.lds.h$@ &&
3581dd88ab32SMasahiro Yamada		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
3582dd88ab32SMasahiro Yamada			my $ln = $linenr;
3583dd88ab32SMasahiro Yamada			my $cnt = $realcnt;
3584dd88ab32SMasahiro Yamada			my ($off, $dstat, $dcond, $rest);
3585dd88ab32SMasahiro Yamada			my $ctx = '';
3586dd88ab32SMasahiro Yamada			($dstat, $dcond, $ln, $cnt, $off) =
3587dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0);
3588dd88ab32SMasahiro Yamada			$ctx = $dstat;
3589dd88ab32SMasahiro Yamada			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
3590dd88ab32SMasahiro Yamada			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
3591dd88ab32SMasahiro Yamada
3592dd88ab32SMasahiro Yamada			$dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
3593dd88ab32SMasahiro Yamada			$dstat =~ s/$;//g;
3594dd88ab32SMasahiro Yamada			$dstat =~ s/\\\n.//g;
3595dd88ab32SMasahiro Yamada			$dstat =~ s/^\s*//s;
3596dd88ab32SMasahiro Yamada			$dstat =~ s/\s*$//s;
3597dd88ab32SMasahiro Yamada
3598dd88ab32SMasahiro Yamada			# Flatten any parentheses and braces
3599dd88ab32SMasahiro Yamada			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
3600dd88ab32SMasahiro Yamada			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
3601dd88ab32SMasahiro Yamada			       $dstat =~ s/\[[^\[\]]*\]/1/)
3602dd88ab32SMasahiro Yamada			{
3603dd88ab32SMasahiro Yamada			}
3604dd88ab32SMasahiro Yamada
3605dd88ab32SMasahiro Yamada			# Flatten any obvious string concatentation.
3606dd88ab32SMasahiro Yamada			while ($dstat =~ s/("X*")\s*$Ident/$1/ ||
3607dd88ab32SMasahiro Yamada			       $dstat =~ s/$Ident\s*("X*")/$1/)
3608dd88ab32SMasahiro Yamada			{
3609dd88ab32SMasahiro Yamada			}
3610dd88ab32SMasahiro Yamada
3611dd88ab32SMasahiro Yamada			my $exceptions = qr{
3612dd88ab32SMasahiro Yamada				$Declare|
3613dd88ab32SMasahiro Yamada				module_param_named|
3614dd88ab32SMasahiro Yamada				MODULE_PARM_DESC|
3615dd88ab32SMasahiro Yamada				DECLARE_PER_CPU|
3616dd88ab32SMasahiro Yamada				DEFINE_PER_CPU|
3617dd88ab32SMasahiro Yamada				__typeof__\(|
3618dd88ab32SMasahiro Yamada				union|
3619dd88ab32SMasahiro Yamada				struct|
3620dd88ab32SMasahiro Yamada				\.$Ident\s*=\s*|
3621dd88ab32SMasahiro Yamada				^\"|\"$
3622dd88ab32SMasahiro Yamada			}x;
3623dd88ab32SMasahiro Yamada			#print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
3624dd88ab32SMasahiro Yamada			if ($dstat ne '' &&
3625dd88ab32SMasahiro Yamada			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
3626dd88ab32SMasahiro Yamada			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
36276b9709d9STom Rini			    $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
3628dd88ab32SMasahiro Yamada			    $dstat !~ /^'X'$/ &&					# character constants
3629dd88ab32SMasahiro Yamada			    $dstat !~ /$exceptions/ &&
3630dd88ab32SMasahiro Yamada			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
36316b9709d9STom Rini			    $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&		# stringification #foo
3632dd88ab32SMasahiro Yamada			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
3633dd88ab32SMasahiro Yamada			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
3634dd88ab32SMasahiro Yamada			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
3635dd88ab32SMasahiro Yamada			    $dstat !~ /^do\s*{/ &&					# do {...
3636*d8a1a304SHeiko Schocher			    $dstat !~ /^\(\{/ &&						# ({...
36376b9709d9STom Rini			    $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
3638dd88ab32SMasahiro Yamada			{
3639dd88ab32SMasahiro Yamada				$ctx =~ s/\n*$//;
3640dd88ab32SMasahiro Yamada				my $herectx = $here . "\n";
3641dd88ab32SMasahiro Yamada				my $cnt = statement_rawlines($ctx);
3642dd88ab32SMasahiro Yamada
3643dd88ab32SMasahiro Yamada				for (my $n = 0; $n < $cnt; $n++) {
3644dd88ab32SMasahiro Yamada					$herectx .= raw_line($linenr, $n) . "\n";
3645dd88ab32SMasahiro Yamada				}
3646dd88ab32SMasahiro Yamada
3647dd88ab32SMasahiro Yamada				if ($dstat =~ /;/) {
3648dd88ab32SMasahiro Yamada					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
3649dd88ab32SMasahiro Yamada					      "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
3650dd88ab32SMasahiro Yamada				} else {
3651dd88ab32SMasahiro Yamada					ERROR("COMPLEX_MACRO",
3652dd88ab32SMasahiro Yamada					      "Macros with complex values should be enclosed in parenthesis\n" . "$herectx");
3653dd88ab32SMasahiro Yamada				}
3654dd88ab32SMasahiro Yamada			}
3655dd88ab32SMasahiro Yamada
3656dd88ab32SMasahiro Yamada# check for line continuations outside of #defines, preprocessor #, and asm
3657dd88ab32SMasahiro Yamada
3658dd88ab32SMasahiro Yamada		} else {
3659dd88ab32SMasahiro Yamada			if ($prevline !~ /^..*\\$/ &&
3660dd88ab32SMasahiro Yamada			    $line !~ /^\+\s*\#.*\\$/ &&		# preprocessor
3661dd88ab32SMasahiro Yamada			    $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&	# asm
3662dd88ab32SMasahiro Yamada			    $line =~ /^\+.*\\$/) {
3663dd88ab32SMasahiro Yamada				WARN("LINE_CONTINUATIONS",
3664dd88ab32SMasahiro Yamada				     "Avoid unnecessary line continuations\n" . $herecurr);
3665dd88ab32SMasahiro Yamada			}
3666dd88ab32SMasahiro Yamada		}
3667dd88ab32SMasahiro Yamada
3668dd88ab32SMasahiro Yamada# do {} while (0) macro tests:
3669dd88ab32SMasahiro Yamada# single-statement macros do not need to be enclosed in do while (0) loop,
3670dd88ab32SMasahiro Yamada# macro should not end with a semicolon
3671dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
3672dd88ab32SMasahiro Yamada		    $realfile !~ m@/vmlinux.lds.h$@ &&
3673dd88ab32SMasahiro Yamada		    $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
3674dd88ab32SMasahiro Yamada			my $ln = $linenr;
3675dd88ab32SMasahiro Yamada			my $cnt = $realcnt;
3676dd88ab32SMasahiro Yamada			my ($off, $dstat, $dcond, $rest);
3677dd88ab32SMasahiro Yamada			my $ctx = '';
3678dd88ab32SMasahiro Yamada			($dstat, $dcond, $ln, $cnt, $off) =
3679dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0);
3680dd88ab32SMasahiro Yamada			$ctx = $dstat;
3681dd88ab32SMasahiro Yamada
3682dd88ab32SMasahiro Yamada			$dstat =~ s/\\\n.//g;
3683dd88ab32SMasahiro Yamada
3684dd88ab32SMasahiro Yamada			if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
3685dd88ab32SMasahiro Yamada				my $stmts = $2;
3686dd88ab32SMasahiro Yamada				my $semis = $3;
3687dd88ab32SMasahiro Yamada
3688dd88ab32SMasahiro Yamada				$ctx =~ s/\n*$//;
3689dd88ab32SMasahiro Yamada				my $cnt = statement_rawlines($ctx);
3690dd88ab32SMasahiro Yamada				my $herectx = $here . "\n";
3691dd88ab32SMasahiro Yamada
3692dd88ab32SMasahiro Yamada				for (my $n = 0; $n < $cnt; $n++) {
3693dd88ab32SMasahiro Yamada					$herectx .= raw_line($linenr, $n) . "\n";
3694dd88ab32SMasahiro Yamada				}
3695dd88ab32SMasahiro Yamada
3696dd88ab32SMasahiro Yamada				if (($stmts =~ tr/;/;/) == 1 &&
3697dd88ab32SMasahiro Yamada				    $stmts !~ /^\s*(if|while|for|switch)\b/) {
3698dd88ab32SMasahiro Yamada					WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
3699dd88ab32SMasahiro Yamada					     "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
3700dd88ab32SMasahiro Yamada				}
3701dd88ab32SMasahiro Yamada				if (defined $semis && $semis ne "") {
3702dd88ab32SMasahiro Yamada					WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
3703dd88ab32SMasahiro Yamada					     "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
3704dd88ab32SMasahiro Yamada				}
3705dd88ab32SMasahiro Yamada			}
3706dd88ab32SMasahiro Yamada		}
3707dd88ab32SMasahiro Yamada
3708dd88ab32SMasahiro Yamada# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
3709dd88ab32SMasahiro Yamada# all assignments may have only one of the following with an assignment:
3710dd88ab32SMasahiro Yamada#	.
3711dd88ab32SMasahiro Yamada#	ALIGN(...)
3712dd88ab32SMasahiro Yamada#	VMLINUX_SYMBOL(...)
3713dd88ab32SMasahiro Yamada		if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
3714dd88ab32SMasahiro Yamada			WARN("MISSING_VMLINUX_SYMBOL",
3715dd88ab32SMasahiro Yamada			     "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
3716dd88ab32SMasahiro Yamada		}
3717dd88ab32SMasahiro Yamada
3718dd88ab32SMasahiro Yamada# check for redundant bracing round if etc
3719dd88ab32SMasahiro Yamada		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
3720dd88ab32SMasahiro Yamada			my ($level, $endln, @chunks) =
3721dd88ab32SMasahiro Yamada				ctx_statement_full($linenr, $realcnt, 1);
3722dd88ab32SMasahiro Yamada			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
3723dd88ab32SMasahiro Yamada			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
3724dd88ab32SMasahiro Yamada			if ($#chunks > 0 && $level == 0) {
3725dd88ab32SMasahiro Yamada				my @allowed = ();
3726dd88ab32SMasahiro Yamada				my $allow = 0;
3727dd88ab32SMasahiro Yamada				my $seen = 0;
3728dd88ab32SMasahiro Yamada				my $herectx = $here . "\n";
3729dd88ab32SMasahiro Yamada				my $ln = $linenr - 1;
3730dd88ab32SMasahiro Yamada				for my $chunk (@chunks) {
3731dd88ab32SMasahiro Yamada					my ($cond, $block) = @{$chunk};
3732dd88ab32SMasahiro Yamada
3733dd88ab32SMasahiro Yamada					# If the condition carries leading newlines, then count those as offsets.
3734dd88ab32SMasahiro Yamada					my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
3735dd88ab32SMasahiro Yamada					my $offset = statement_rawlines($whitespace) - 1;
3736dd88ab32SMasahiro Yamada
3737dd88ab32SMasahiro Yamada					$allowed[$allow] = 0;
3738dd88ab32SMasahiro Yamada					#print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
3739dd88ab32SMasahiro Yamada
3740dd88ab32SMasahiro Yamada					# We have looked at and allowed this specific line.
3741dd88ab32SMasahiro Yamada					$suppress_ifbraces{$ln + $offset} = 1;
3742dd88ab32SMasahiro Yamada
3743dd88ab32SMasahiro Yamada					$herectx .= "$rawlines[$ln + $offset]\n[...]\n";
3744dd88ab32SMasahiro Yamada					$ln += statement_rawlines($block) - 1;
3745dd88ab32SMasahiro Yamada
3746dd88ab32SMasahiro Yamada					substr($block, 0, length($cond), '');
3747dd88ab32SMasahiro Yamada
3748dd88ab32SMasahiro Yamada					$seen++ if ($block =~ /^\s*{/);
3749dd88ab32SMasahiro Yamada
3750dd88ab32SMasahiro Yamada					#print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
3751dd88ab32SMasahiro Yamada					if (statement_lines($cond) > 1) {
3752dd88ab32SMasahiro Yamada						#print "APW: ALLOWED: cond<$cond>\n";
3753dd88ab32SMasahiro Yamada						$allowed[$allow] = 1;
3754dd88ab32SMasahiro Yamada					}
3755dd88ab32SMasahiro Yamada					if ($block =~/\b(?:if|for|while)\b/) {
3756dd88ab32SMasahiro Yamada						#print "APW: ALLOWED: block<$block>\n";
3757dd88ab32SMasahiro Yamada						$allowed[$allow] = 1;
3758dd88ab32SMasahiro Yamada					}
3759dd88ab32SMasahiro Yamada					if (statement_block_size($block) > 1) {
3760dd88ab32SMasahiro Yamada						#print "APW: ALLOWED: lines block<$block>\n";
3761dd88ab32SMasahiro Yamada						$allowed[$allow] = 1;
3762dd88ab32SMasahiro Yamada					}
3763dd88ab32SMasahiro Yamada					$allow++;
3764dd88ab32SMasahiro Yamada				}
3765dd88ab32SMasahiro Yamada				if ($seen) {
3766dd88ab32SMasahiro Yamada					my $sum_allowed = 0;
3767dd88ab32SMasahiro Yamada					foreach (@allowed) {
3768dd88ab32SMasahiro Yamada						$sum_allowed += $_;
3769dd88ab32SMasahiro Yamada					}
3770dd88ab32SMasahiro Yamada					if ($sum_allowed == 0) {
3771dd88ab32SMasahiro Yamada						WARN("BRACES",
3772dd88ab32SMasahiro Yamada						     "braces {} are not necessary for any arm of this statement\n" . $herectx);
3773dd88ab32SMasahiro Yamada					} elsif ($sum_allowed != $allow &&
3774dd88ab32SMasahiro Yamada						 $seen != $allow) {
3775dd88ab32SMasahiro Yamada						CHK("BRACES",
3776dd88ab32SMasahiro Yamada						    "braces {} should be used on all arms of this statement\n" . $herectx);
3777dd88ab32SMasahiro Yamada					}
3778dd88ab32SMasahiro Yamada				}
3779dd88ab32SMasahiro Yamada			}
3780dd88ab32SMasahiro Yamada		}
3781dd88ab32SMasahiro Yamada		if (!defined $suppress_ifbraces{$linenr - 1} &&
3782dd88ab32SMasahiro Yamada					$line =~ /\b(if|while|for|else)\b/) {
3783dd88ab32SMasahiro Yamada			my $allowed = 0;
3784dd88ab32SMasahiro Yamada
3785dd88ab32SMasahiro Yamada			# Check the pre-context.
3786dd88ab32SMasahiro Yamada			if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
3787dd88ab32SMasahiro Yamada				#print "APW: ALLOWED: pre<$1>\n";
3788dd88ab32SMasahiro Yamada				$allowed = 1;
3789dd88ab32SMasahiro Yamada			}
3790dd88ab32SMasahiro Yamada
3791dd88ab32SMasahiro Yamada			my ($level, $endln, @chunks) =
3792dd88ab32SMasahiro Yamada				ctx_statement_full($linenr, $realcnt, $-[0]);
3793dd88ab32SMasahiro Yamada
3794dd88ab32SMasahiro Yamada			# Check the condition.
3795dd88ab32SMasahiro Yamada			my ($cond, $block) = @{$chunks[0]};
3796dd88ab32SMasahiro Yamada			#print "CHECKING<$linenr> cond<$cond> block<$block>\n";
3797dd88ab32SMasahiro Yamada			if (defined $cond) {
3798dd88ab32SMasahiro Yamada				substr($block, 0, length($cond), '');
3799dd88ab32SMasahiro Yamada			}
3800dd88ab32SMasahiro Yamada			if (statement_lines($cond) > 1) {
3801dd88ab32SMasahiro Yamada				#print "APW: ALLOWED: cond<$cond>\n";
3802dd88ab32SMasahiro Yamada				$allowed = 1;
3803dd88ab32SMasahiro Yamada			}
3804dd88ab32SMasahiro Yamada			if ($block =~/\b(?:if|for|while)\b/) {
3805dd88ab32SMasahiro Yamada				#print "APW: ALLOWED: block<$block>\n";
3806dd88ab32SMasahiro Yamada				$allowed = 1;
3807dd88ab32SMasahiro Yamada			}
3808dd88ab32SMasahiro Yamada			if (statement_block_size($block) > 1) {
3809dd88ab32SMasahiro Yamada				#print "APW: ALLOWED: lines block<$block>\n";
3810dd88ab32SMasahiro Yamada				$allowed = 1;
3811dd88ab32SMasahiro Yamada			}
3812dd88ab32SMasahiro Yamada			# Check the post-context.
3813dd88ab32SMasahiro Yamada			if (defined $chunks[1]) {
3814dd88ab32SMasahiro Yamada				my ($cond, $block) = @{$chunks[1]};
3815dd88ab32SMasahiro Yamada				if (defined $cond) {
3816dd88ab32SMasahiro Yamada					substr($block, 0, length($cond), '');
3817dd88ab32SMasahiro Yamada				}
3818dd88ab32SMasahiro Yamada				if ($block =~ /^\s*\{/) {
3819dd88ab32SMasahiro Yamada					#print "APW: ALLOWED: chunk-1 block<$block>\n";
3820dd88ab32SMasahiro Yamada					$allowed = 1;
3821dd88ab32SMasahiro Yamada				}
3822dd88ab32SMasahiro Yamada			}
3823dd88ab32SMasahiro Yamada			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
3824dd88ab32SMasahiro Yamada				my $herectx = $here . "\n";
3825dd88ab32SMasahiro Yamada				my $cnt = statement_rawlines($block);
3826dd88ab32SMasahiro Yamada
3827dd88ab32SMasahiro Yamada				for (my $n = 0; $n < $cnt; $n++) {
3828dd88ab32SMasahiro Yamada					$herectx .= raw_line($linenr, $n) . "\n";
3829dd88ab32SMasahiro Yamada				}
3830dd88ab32SMasahiro Yamada
3831dd88ab32SMasahiro Yamada				WARN("BRACES",
3832dd88ab32SMasahiro Yamada				     "braces {} are not necessary for single statement blocks\n" . $herectx);
3833dd88ab32SMasahiro Yamada			}
3834dd88ab32SMasahiro Yamada		}
3835dd88ab32SMasahiro Yamada
3836dd88ab32SMasahiro Yamada# check for unnecessary blank lines around braces
38376b9709d9STom Rini		if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
3838dd88ab32SMasahiro Yamada			CHK("BRACES",
3839dd88ab32SMasahiro Yamada			    "Blank lines aren't necessary before a close brace '}'\n" . $hereprev);
3840dd88ab32SMasahiro Yamada		}
38416b9709d9STom Rini		if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
3842dd88ab32SMasahiro Yamada			CHK("BRACES",
3843dd88ab32SMasahiro Yamada			    "Blank lines aren't necessary after an open brace '{'\n" . $hereprev);
3844dd88ab32SMasahiro Yamada		}
3845dd88ab32SMasahiro Yamada
3846dd88ab32SMasahiro Yamada# no volatiles please
3847dd88ab32SMasahiro Yamada		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
3848dd88ab32SMasahiro Yamada		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
3849dd88ab32SMasahiro Yamada			WARN("VOLATILE",
3850dd88ab32SMasahiro Yamada			     "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
3851dd88ab32SMasahiro Yamada		}
3852dd88ab32SMasahiro Yamada
3853dd88ab32SMasahiro Yamada# warn about #if 0
3854dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
3855dd88ab32SMasahiro Yamada			CHK("REDUNDANT_CODE",
3856dd88ab32SMasahiro Yamada			    "if this code is redundant consider removing it\n" .
3857dd88ab32SMasahiro Yamada				$herecurr);
3858dd88ab32SMasahiro Yamada		}
3859dd88ab32SMasahiro Yamada
3860dd88ab32SMasahiro Yamada# check for needless "if (<foo>) fn(<foo>)" uses
3861dd88ab32SMasahiro Yamada		if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
3862dd88ab32SMasahiro Yamada			my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';
3863dd88ab32SMasahiro Yamada			if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
3864dd88ab32SMasahiro Yamada				WARN('NEEDLESS_IF',
3865dd88ab32SMasahiro Yamada				     "$1(NULL) is safe this check is probably not required\n" . $hereprev);
3866dd88ab32SMasahiro Yamada			}
3867dd88ab32SMasahiro Yamada		}
3868dd88ab32SMasahiro Yamada
38696b9709d9STom Rini# check for bad placement of section $InitAttribute (e.g.: __initdata)
38706b9709d9STom Rini		if ($line =~ /(\b$InitAttribute\b)/) {
38716b9709d9STom Rini			my $attr = $1;
38726b9709d9STom Rini			if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
38736b9709d9STom Rini				my $ptr = $1;
38746b9709d9STom Rini				my $var = $2;
38756b9709d9STom Rini				if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
38766b9709d9STom Rini				      ERROR("MISPLACED_INIT",
38776b9709d9STom Rini					    "$attr should be placed after $var\n" . $herecurr)) ||
38786b9709d9STom Rini				     ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
38796b9709d9STom Rini				      WARN("MISPLACED_INIT",
38806b9709d9STom Rini					   "$attr should be placed after $var\n" . $herecurr))) &&
38816b9709d9STom Rini				    $fix) {
38826b9709d9STom Rini					$fixed[$linenr - 1] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e;
38836b9709d9STom Rini				}
38846b9709d9STom Rini			}
38856b9709d9STom Rini		}
38866b9709d9STom Rini
38876b9709d9STom Rini# check for $InitAttributeData (ie: __initdata) with const
38886b9709d9STom Rini		if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
38896b9709d9STom Rini			my $attr = $1;
38906b9709d9STom Rini			$attr =~ /($InitAttributePrefix)(.*)/;
38916b9709d9STom Rini			my $attr_prefix = $1;
38926b9709d9STom Rini			my $attr_type = $2;
38936b9709d9STom Rini			if (ERROR("INIT_ATTRIBUTE",
38946b9709d9STom Rini				  "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
38956b9709d9STom Rini			    $fix) {
38966b9709d9STom Rini				$fixed[$linenr - 1] =~
38976b9709d9STom Rini				    s/$InitAttributeData/${attr_prefix}initconst/;
38986b9709d9STom Rini			}
38996b9709d9STom Rini		}
39006b9709d9STom Rini
39016b9709d9STom Rini# check for $InitAttributeConst (ie: __initconst) without const
39026b9709d9STom Rini		if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
39036b9709d9STom Rini			my $attr = $1;
39046b9709d9STom Rini			if (ERROR("INIT_ATTRIBUTE",
39056b9709d9STom Rini				  "Use of $attr requires a separate use of const\n" . $herecurr) &&
39066b9709d9STom Rini			    $fix) {
39076b9709d9STom Rini				my $lead = $fixed[$linenr - 1] =~
39086b9709d9STom Rini				    /(^\+\s*(?:static\s+))/;
39096b9709d9STom Rini				$lead = rtrim($1);
39106b9709d9STom Rini				$lead = "$lead " if ($lead !~ /^\+$/);
39116b9709d9STom Rini				$lead = "${lead}const ";
39126b9709d9STom Rini				$fixed[$linenr - 1] =~ s/(^\+\s*(?:static\s+))/$lead/;
39136b9709d9STom Rini			}
39146b9709d9STom Rini		}
39156b9709d9STom Rini
3916dd88ab32SMasahiro Yamada# prefer usleep_range over udelay
3917dd88ab32SMasahiro Yamada		if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
3918dd88ab32SMasahiro Yamada			# ignore udelay's < 10, however
3919dd88ab32SMasahiro Yamada			if (! ($1 < 10) ) {
3920dd88ab32SMasahiro Yamada				CHK("USLEEP_RANGE",
3921dd88ab32SMasahiro Yamada				    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $line);
3922dd88ab32SMasahiro Yamada			}
3923dd88ab32SMasahiro Yamada		}
3924dd88ab32SMasahiro Yamada
3925dd88ab32SMasahiro Yamada# warn about unexpectedly long msleep's
3926dd88ab32SMasahiro Yamada		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
3927dd88ab32SMasahiro Yamada			if ($1 < 20) {
3928dd88ab32SMasahiro Yamada				WARN("MSLEEP",
3929dd88ab32SMasahiro Yamada				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $line);
3930dd88ab32SMasahiro Yamada			}
3931dd88ab32SMasahiro Yamada		}
3932dd88ab32SMasahiro Yamada
39336b9709d9STom Rini# check for comparisons of jiffies
39346b9709d9STom Rini		if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
39356b9709d9STom Rini			WARN("JIFFIES_COMPARISON",
39366b9709d9STom Rini			     "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
39376b9709d9STom Rini		}
39386b9709d9STom Rini
39396b9709d9STom Rini# check for comparisons of get_jiffies_64()
39406b9709d9STom Rini		if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
39416b9709d9STom Rini			WARN("JIFFIES_COMPARISON",
39426b9709d9STom Rini			     "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
39436b9709d9STom Rini		}
39446b9709d9STom Rini
3945dd88ab32SMasahiro Yamada# warn about #ifdefs in C files
3946dd88ab32SMasahiro Yamada#		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
3947dd88ab32SMasahiro Yamada#			print "#ifdef in C files should be avoided\n";
3948dd88ab32SMasahiro Yamada#			print "$herecurr";
3949dd88ab32SMasahiro Yamada#			$clean = 0;
3950dd88ab32SMasahiro Yamada#		}
3951dd88ab32SMasahiro Yamada
3952dd88ab32SMasahiro Yamada# warn about spacing in #ifdefs
3953dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
39546b9709d9STom Rini			if (ERROR("SPACING",
39556b9709d9STom Rini				  "exactly one space required after that #$1\n" . $herecurr) &&
39566b9709d9STom Rini			    $fix) {
39576b9709d9STom Rini				$fixed[$linenr - 1] =~
39586b9709d9STom Rini				    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
39596b9709d9STom Rini			}
39606b9709d9STom Rini
3961dd88ab32SMasahiro Yamada		}
3962dd88ab32SMasahiro Yamada
3963dd88ab32SMasahiro Yamada# check for spinlock_t definitions without a comment.
3964dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
3965dd88ab32SMasahiro Yamada		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
3966dd88ab32SMasahiro Yamada			my $which = $1;
3967dd88ab32SMasahiro Yamada			if (!ctx_has_comment($first_line, $linenr)) {
3968dd88ab32SMasahiro Yamada				CHK("UNCOMMENTED_DEFINITION",
3969dd88ab32SMasahiro Yamada				    "$1 definition without comment\n" . $herecurr);
3970dd88ab32SMasahiro Yamada			}
3971dd88ab32SMasahiro Yamada		}
3972dd88ab32SMasahiro Yamada# check for memory barriers without a comment.
3973dd88ab32SMasahiro Yamada		if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
3974dd88ab32SMasahiro Yamada			if (!ctx_has_comment($first_line, $linenr)) {
39756b9709d9STom Rini				WARN("MEMORY_BARRIER",
3976dd88ab32SMasahiro Yamada				     "memory barrier without comment\n" . $herecurr);
3977dd88ab32SMasahiro Yamada			}
3978dd88ab32SMasahiro Yamada		}
3979dd88ab32SMasahiro Yamada# check of hardware specific defines
3980dd88ab32SMasahiro Yamada		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
3981dd88ab32SMasahiro Yamada			CHK("ARCH_DEFINES",
3982dd88ab32SMasahiro Yamada			    "architecture specific defines should be avoided\n" .  $herecurr);
3983dd88ab32SMasahiro Yamada		}
3984dd88ab32SMasahiro Yamada
3985dd88ab32SMasahiro Yamada# Check that the storage class is at the beginning of a declaration
3986dd88ab32SMasahiro Yamada		if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
3987dd88ab32SMasahiro Yamada			WARN("STORAGE_CLASS",
3988dd88ab32SMasahiro Yamada			     "storage class should be at the beginning of the declaration\n" . $herecurr)
3989dd88ab32SMasahiro Yamada		}
3990dd88ab32SMasahiro Yamada
3991dd88ab32SMasahiro Yamada# check the location of the inline attribute, that it is between
3992dd88ab32SMasahiro Yamada# storage class and type.
3993dd88ab32SMasahiro Yamada		if ($line =~ /\b$Type\s+$Inline\b/ ||
3994dd88ab32SMasahiro Yamada		    $line =~ /\b$Inline\s+$Storage\b/) {
3995dd88ab32SMasahiro Yamada			ERROR("INLINE_LOCATION",
3996dd88ab32SMasahiro Yamada			      "inline keyword should sit between storage class and type\n" . $herecurr);
3997dd88ab32SMasahiro Yamada		}
3998dd88ab32SMasahiro Yamada
3999dd88ab32SMasahiro Yamada# Check for __inline__ and __inline, prefer inline
40006b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
40016b9709d9STom Rini		    $line =~ /\b(__inline__|__inline)\b/) {
40026b9709d9STom Rini			if (WARN("INLINE",
40036b9709d9STom Rini				 "plain inline is preferred over $1\n" . $herecurr) &&
40046b9709d9STom Rini			    $fix) {
40056b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\b(__inline__|__inline)\b/inline/;
40066b9709d9STom Rini
40076b9709d9STom Rini			}
4008dd88ab32SMasahiro Yamada		}
4009dd88ab32SMasahiro Yamada
4010dd88ab32SMasahiro Yamada# Check for __attribute__ packed, prefer __packed
40116b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
40126b9709d9STom Rini		    $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
4013dd88ab32SMasahiro Yamada			WARN("PREFER_PACKED",
4014dd88ab32SMasahiro Yamada			     "__packed is preferred over __attribute__((packed))\n" . $herecurr);
4015dd88ab32SMasahiro Yamada		}
4016f503cc49STom Rini# Check for new packed members, warn to use care
4017f503cc49STom Rini		if ($line =~ /\b(__attribute__\s*\(\s*\(.*\bpacked|__packed)\b/) {
4018f503cc49STom Rini			WARN("NEW_PACKED",
4019f503cc49STom Rini			     "Adding new packed members is to be done with care\n" . $herecurr);
4020f503cc49STom Rini		}
4021dd88ab32SMasahiro Yamada
4022dd88ab32SMasahiro Yamada# Check for __attribute__ aligned, prefer __aligned
40236b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
40246b9709d9STom Rini		    $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
4025dd88ab32SMasahiro Yamada			WARN("PREFER_ALIGNED",
4026dd88ab32SMasahiro Yamada			     "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
4027dd88ab32SMasahiro Yamada		}
4028dd88ab32SMasahiro Yamada
4029dd88ab32SMasahiro Yamada# Check for __attribute__ format(printf, prefer __printf
40306b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
40316b9709d9STom Rini		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
40326b9709d9STom Rini			if (WARN("PREFER_PRINTF",
40336b9709d9STom Rini				 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
40346b9709d9STom Rini			    $fix) {
40356b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
40366b9709d9STom Rini
40376b9709d9STom Rini			}
4038dd88ab32SMasahiro Yamada		}
4039dd88ab32SMasahiro Yamada
4040dd88ab32SMasahiro Yamada# Check for __attribute__ format(scanf, prefer __scanf
40416b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
40426b9709d9STom Rini		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
40436b9709d9STom Rini			if (WARN("PREFER_SCANF",
40446b9709d9STom Rini				 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
40456b9709d9STom Rini			    $fix) {
40466b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
40476b9709d9STom Rini			}
4048dd88ab32SMasahiro Yamada		}
4049dd88ab32SMasahiro Yamada
4050dd88ab32SMasahiro Yamada# check for sizeof(&)
4051dd88ab32SMasahiro Yamada		if ($line =~ /\bsizeof\s*\(\s*\&/) {
4052dd88ab32SMasahiro Yamada			WARN("SIZEOF_ADDRESS",
4053dd88ab32SMasahiro Yamada			     "sizeof(& should be avoided\n" . $herecurr);
4054dd88ab32SMasahiro Yamada		}
4055dd88ab32SMasahiro Yamada
4056dd88ab32SMasahiro Yamada# check for sizeof without parenthesis
4057dd88ab32SMasahiro Yamada		if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
40586b9709d9STom Rini			if (WARN("SIZEOF_PARENTHESIS",
40596b9709d9STom Rini				 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
40606b9709d9STom Rini			    $fix) {
40616b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
40626b9709d9STom Rini			}
4063dd88ab32SMasahiro Yamada		}
4064dd88ab32SMasahiro Yamada
4065dd88ab32SMasahiro Yamada# check for line continuations in quoted strings with odd counts of "
4066dd88ab32SMasahiro Yamada		if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
4067dd88ab32SMasahiro Yamada			WARN("LINE_CONTINUATIONS",
4068dd88ab32SMasahiro Yamada			     "Avoid line continuations in quoted strings\n" . $herecurr);
4069dd88ab32SMasahiro Yamada		}
4070dd88ab32SMasahiro Yamada
4071dd88ab32SMasahiro Yamada# check for struct spinlock declarations
4072dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
4073dd88ab32SMasahiro Yamada			WARN("USE_SPINLOCK_T",
4074dd88ab32SMasahiro Yamada			     "struct spinlock should be spinlock_t\n" . $herecurr);
4075dd88ab32SMasahiro Yamada		}
4076dd88ab32SMasahiro Yamada
40776b9709d9STom Rini# check for seq_printf uses that could be seq_puts
40786b9709d9STom Rini		if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
40796b9709d9STom Rini			my $fmt = get_quoted_string($line, $rawline);
40806b9709d9STom Rini			if ($fmt ne "" && $fmt !~ /[^\\]\%/) {
40816b9709d9STom Rini				if (WARN("PREFER_SEQ_PUTS",
40826b9709d9STom Rini					 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
40836b9709d9STom Rini				    $fix) {
40846b9709d9STom Rini					$fixed[$linenr - 1] =~ s/\bseq_printf\b/seq_puts/;
40856b9709d9STom Rini				}
40866b9709d9STom Rini			}
40876b9709d9STom Rini		}
40886b9709d9STom Rini
4089dd88ab32SMasahiro Yamada# Check for misused memsets
4090dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
4091dd88ab32SMasahiro Yamada		    defined $stat &&
4092dd88ab32SMasahiro Yamada		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
4093dd88ab32SMasahiro Yamada
4094dd88ab32SMasahiro Yamada			my $ms_addr = $2;
4095dd88ab32SMasahiro Yamada			my $ms_val = $7;
4096dd88ab32SMasahiro Yamada			my $ms_size = $12;
4097dd88ab32SMasahiro Yamada
4098dd88ab32SMasahiro Yamada			if ($ms_size =~ /^(0x|)0$/i) {
4099dd88ab32SMasahiro Yamada				ERROR("MEMSET",
4100dd88ab32SMasahiro Yamada				      "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
4101dd88ab32SMasahiro Yamada			} elsif ($ms_size =~ /^(0x|)1$/i) {
4102dd88ab32SMasahiro Yamada				WARN("MEMSET",
4103dd88ab32SMasahiro Yamada				     "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
4104dd88ab32SMasahiro Yamada			}
4105dd88ab32SMasahiro Yamada		}
4106dd88ab32SMasahiro Yamada
41076b9709d9STom Rini# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
41086b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
41096b9709d9STom Rini		    $line =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/s) {
41106b9709d9STom Rini			if (WARN("PREFER_ETHER_ADDR_COPY",
41116b9709d9STom Rini				 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . $herecurr) &&
41126b9709d9STom Rini			    $fix) {
41136b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
41146b9709d9STom Rini			}
41156b9709d9STom Rini		}
41166b9709d9STom Rini
4117dd88ab32SMasahiro Yamada# typecasts on min/max could be min_t/max_t
4118dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
4119dd88ab32SMasahiro Yamada		    defined $stat &&
4120dd88ab32SMasahiro Yamada		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
4121dd88ab32SMasahiro Yamada			if (defined $2 || defined $7) {
4122dd88ab32SMasahiro Yamada				my $call = $1;
4123dd88ab32SMasahiro Yamada				my $cast1 = deparenthesize($2);
4124dd88ab32SMasahiro Yamada				my $arg1 = $3;
4125dd88ab32SMasahiro Yamada				my $cast2 = deparenthesize($7);
4126dd88ab32SMasahiro Yamada				my $arg2 = $8;
4127dd88ab32SMasahiro Yamada				my $cast;
4128dd88ab32SMasahiro Yamada
4129dd88ab32SMasahiro Yamada				if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
4130dd88ab32SMasahiro Yamada					$cast = "$cast1 or $cast2";
4131dd88ab32SMasahiro Yamada				} elsif ($cast1 ne "") {
4132dd88ab32SMasahiro Yamada					$cast = $cast1;
4133dd88ab32SMasahiro Yamada				} else {
4134dd88ab32SMasahiro Yamada					$cast = $cast2;
4135dd88ab32SMasahiro Yamada				}
4136dd88ab32SMasahiro Yamada				WARN("MINMAX",
4137dd88ab32SMasahiro Yamada				     "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
4138dd88ab32SMasahiro Yamada			}
4139dd88ab32SMasahiro Yamada		}
4140dd88ab32SMasahiro Yamada
4141dd88ab32SMasahiro Yamada# check usleep_range arguments
4142dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
4143dd88ab32SMasahiro Yamada		    defined $stat &&
4144dd88ab32SMasahiro Yamada		    $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
4145dd88ab32SMasahiro Yamada			my $min = $1;
4146dd88ab32SMasahiro Yamada			my $max = $7;
4147dd88ab32SMasahiro Yamada			if ($min eq $max) {
4148dd88ab32SMasahiro Yamada				WARN("USLEEP_RANGE",
4149dd88ab32SMasahiro Yamada				     "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4150dd88ab32SMasahiro Yamada			} elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
4151dd88ab32SMasahiro Yamada				 $min > $max) {
4152dd88ab32SMasahiro Yamada				WARN("USLEEP_RANGE",
4153dd88ab32SMasahiro Yamada				     "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4154dd88ab32SMasahiro Yamada			}
4155dd88ab32SMasahiro Yamada		}
4156dd88ab32SMasahiro Yamada
41576b9709d9STom Rini# check for naked sscanf
41586b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
41596b9709d9STom Rini		    defined $stat &&
41606b9709d9STom Rini		    $stat =~ /\bsscanf\b/ &&
41616b9709d9STom Rini		    ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
41626b9709d9STom Rini		     $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
41636b9709d9STom Rini		     $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
41646b9709d9STom Rini			my $lc = $stat =~ tr@\n@@;
41656b9709d9STom Rini			$lc = $lc + $linenr;
41666b9709d9STom Rini			my $stat_real = raw_line($linenr, 0);
41676b9709d9STom Rini		        for (my $count = $linenr + 1; $count <= $lc; $count++) {
41686b9709d9STom Rini				$stat_real = $stat_real . "\n" . raw_line($count, 0);
41696b9709d9STom Rini			}
41706b9709d9STom Rini			WARN("NAKED_SSCANF",
41716b9709d9STom Rini			     "unchecked sscanf return value\n" . "$here\n$stat_real\n");
41726b9709d9STom Rini		}
41736b9709d9STom Rini
41746b9709d9STom Rini# check for new externs in .h files.
41756b9709d9STom Rini		if ($realfile =~ /\.h$/ &&
41766b9709d9STom Rini		    $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
41776b9709d9STom Rini			if (CHK("AVOID_EXTERNS",
41786b9709d9STom Rini				"extern prototypes should be avoided in .h files\n" . $herecurr) &&
41796b9709d9STom Rini			    $fix) {
41806b9709d9STom Rini				$fixed[$linenr - 1] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
41816b9709d9STom Rini			}
41826b9709d9STom Rini		}
41836b9709d9STom Rini
4184dd88ab32SMasahiro Yamada# check for new externs in .c files.
4185dd88ab32SMasahiro Yamada		if ($realfile =~ /\.c$/ && defined $stat &&
4186dd88ab32SMasahiro Yamada		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
4187dd88ab32SMasahiro Yamada		{
4188dd88ab32SMasahiro Yamada			my $function_name = $1;
4189dd88ab32SMasahiro Yamada			my $paren_space = $2;
4190dd88ab32SMasahiro Yamada
4191dd88ab32SMasahiro Yamada			my $s = $stat;
4192dd88ab32SMasahiro Yamada			if (defined $cond) {
4193dd88ab32SMasahiro Yamada				substr($s, 0, length($cond), '');
4194dd88ab32SMasahiro Yamada			}
4195dd88ab32SMasahiro Yamada			if ($s =~ /^\s*;/ &&
4196dd88ab32SMasahiro Yamada			    $function_name ne 'uninitialized_var')
4197dd88ab32SMasahiro Yamada			{
4198dd88ab32SMasahiro Yamada				WARN("AVOID_EXTERNS",
4199dd88ab32SMasahiro Yamada				     "externs should be avoided in .c files\n" .  $herecurr);
4200dd88ab32SMasahiro Yamada			}
4201dd88ab32SMasahiro Yamada
4202dd88ab32SMasahiro Yamada			if ($paren_space =~ /\n/) {
4203dd88ab32SMasahiro Yamada				WARN("FUNCTION_ARGUMENTS",
4204dd88ab32SMasahiro Yamada				     "arguments for function declarations should follow identifier\n" . $herecurr);
4205dd88ab32SMasahiro Yamada			}
4206dd88ab32SMasahiro Yamada
4207dd88ab32SMasahiro Yamada		} elsif ($realfile =~ /\.c$/ && defined $stat &&
4208dd88ab32SMasahiro Yamada		    $stat =~ /^.\s*extern\s+/)
4209dd88ab32SMasahiro Yamada		{
4210dd88ab32SMasahiro Yamada			WARN("AVOID_EXTERNS",
4211dd88ab32SMasahiro Yamada			     "externs should be avoided in .c files\n" .  $herecurr);
4212dd88ab32SMasahiro Yamada		}
4213dd88ab32SMasahiro Yamada
4214dd88ab32SMasahiro Yamada# checks for new __setup's
4215dd88ab32SMasahiro Yamada		if ($rawline =~ /\b__setup\("([^"]*)"/) {
4216dd88ab32SMasahiro Yamada			my $name = $1;
4217dd88ab32SMasahiro Yamada
4218dd88ab32SMasahiro Yamada			if (!grep(/$name/, @setup_docs)) {
4219dd88ab32SMasahiro Yamada				CHK("UNDOCUMENTED_SETUP",
4220dd88ab32SMasahiro Yamada				    "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
4221dd88ab32SMasahiro Yamada			}
4222dd88ab32SMasahiro Yamada		}
4223dd88ab32SMasahiro Yamada
4224dd88ab32SMasahiro Yamada# check for pointless casting of kmalloc return
4225dd88ab32SMasahiro Yamada		if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
4226dd88ab32SMasahiro Yamada			WARN("UNNECESSARY_CASTS",
4227dd88ab32SMasahiro Yamada			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
4228dd88ab32SMasahiro Yamada		}
4229dd88ab32SMasahiro Yamada
42306b9709d9STom Rini# alloc style
42316b9709d9STom Rini# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
42326b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
42336b9709d9STom Rini		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
42346b9709d9STom Rini			CHK("ALLOC_SIZEOF_STRUCT",
42356b9709d9STom Rini			    "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
42366b9709d9STom Rini		}
42376b9709d9STom Rini
42386b9709d9STom Rini# check for krealloc arg reuse
42396b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
42406b9709d9STom Rini		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
42416b9709d9STom Rini			WARN("KREALLOC_ARG_REUSE",
42426b9709d9STom Rini			     "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
42436b9709d9STom Rini		}
42446b9709d9STom Rini
4245dd88ab32SMasahiro Yamada# check for alloc argument mismatch
4246dd88ab32SMasahiro Yamada		if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
4247dd88ab32SMasahiro Yamada			WARN("ALLOC_ARRAY_ARGS",
4248dd88ab32SMasahiro Yamada			     "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
4249dd88ab32SMasahiro Yamada		}
4250dd88ab32SMasahiro Yamada
42516b9709d9STom Rini# check for GFP_NOWAIT use
42526b9709d9STom Rini		if ($line =~ /\b__GFP_NOFAIL\b/) {
42536b9709d9STom Rini			WARN("__GFP_NOFAIL",
42546b9709d9STom Rini			     "Use of __GFP_NOFAIL is deprecated, no new users should be added\n" . $herecurr);
42556b9709d9STom Rini		}
42566b9709d9STom Rini
4257dd88ab32SMasahiro Yamada# check for multiple semicolons
4258dd88ab32SMasahiro Yamada		if ($line =~ /;\s*;\s*$/) {
42596b9709d9STom Rini			if (WARN("ONE_SEMICOLON",
42606b9709d9STom Rini				 "Statements terminations use 1 semicolon\n" . $herecurr) &&
42616b9709d9STom Rini			    $fix) {
42626b9709d9STom Rini				$fixed[$linenr - 1] =~ s/(\s*;\s*){2,}$/;/g;
42636b9709d9STom Rini			}
42646b9709d9STom Rini		}
42656b9709d9STom Rini
42666b9709d9STom Rini# check for case / default statements not preceeded by break/fallthrough/switch
42676b9709d9STom Rini		if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
42686b9709d9STom Rini			my $has_break = 0;
42696b9709d9STom Rini			my $has_statement = 0;
42706b9709d9STom Rini			my $count = 0;
42716b9709d9STom Rini			my $prevline = $linenr;
42726b9709d9STom Rini			while ($prevline > 1 && $count < 3 && !$has_break) {
42736b9709d9STom Rini				$prevline--;
42746b9709d9STom Rini				my $rline = $rawlines[$prevline - 1];
42756b9709d9STom Rini				my $fline = $lines[$prevline - 1];
42766b9709d9STom Rini				last if ($fline =~ /^\@\@/);
42776b9709d9STom Rini				next if ($fline =~ /^\-/);
42786b9709d9STom Rini				next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
42796b9709d9STom Rini				$has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
42806b9709d9STom Rini				next if ($fline =~ /^.[\s$;]*$/);
42816b9709d9STom Rini				$has_statement = 1;
42826b9709d9STom Rini				$count++;
42836b9709d9STom Rini				$has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/);
42846b9709d9STom Rini			}
42856b9709d9STom Rini			if (!$has_break && $has_statement) {
42866b9709d9STom Rini				WARN("MISSING_BREAK",
42876b9709d9STom Rini				     "Possible switch case/default not preceeded by break or fallthrough comment\n" . $herecurr);
42886b9709d9STom Rini			}
4289dd88ab32SMasahiro Yamada		}
4290dd88ab32SMasahiro Yamada
4291dd88ab32SMasahiro Yamada# check for switch/default statements without a break;
4292dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
4293dd88ab32SMasahiro Yamada		    defined $stat &&
4294dd88ab32SMasahiro Yamada		    $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
4295dd88ab32SMasahiro Yamada			my $ctx = '';
4296dd88ab32SMasahiro Yamada			my $herectx = $here . "\n";
4297dd88ab32SMasahiro Yamada			my $cnt = statement_rawlines($stat);
4298dd88ab32SMasahiro Yamada			for (my $n = 0; $n < $cnt; $n++) {
4299dd88ab32SMasahiro Yamada				$herectx .= raw_line($linenr, $n) . "\n";
4300dd88ab32SMasahiro Yamada			}
4301dd88ab32SMasahiro Yamada			WARN("DEFAULT_NO_BREAK",
4302dd88ab32SMasahiro Yamada			     "switch default: should use break\n" . $herectx);
4303dd88ab32SMasahiro Yamada		}
4304dd88ab32SMasahiro Yamada
4305dd88ab32SMasahiro Yamada# check for gcc specific __FUNCTION__
43066b9709d9STom Rini		if ($line =~ /\b__FUNCTION__\b/) {
43076b9709d9STom Rini			if (WARN("USE_FUNC",
43086b9709d9STom Rini				 "__func__ should be used instead of gcc specific __FUNCTION__\n"  . $herecurr) &&
43096b9709d9STom Rini			    $fix) {
43106b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\b__FUNCTION__\b/__func__/g;
43116b9709d9STom Rini			}
4312dd88ab32SMasahiro Yamada		}
4313dd88ab32SMasahiro Yamada
4314dd88ab32SMasahiro Yamada# check for use of yield()
4315dd88ab32SMasahiro Yamada		if ($line =~ /\byield\s*\(\s*\)/) {
4316dd88ab32SMasahiro Yamada			WARN("YIELD",
4317dd88ab32SMasahiro Yamada			     "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n"  . $herecurr);
4318dd88ab32SMasahiro Yamada		}
4319dd88ab32SMasahiro Yamada
43206b9709d9STom Rini# check for comparisons against true and false
43216b9709d9STom Rini		if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
43226b9709d9STom Rini			my $lead = $1;
43236b9709d9STom Rini			my $arg = $2;
43246b9709d9STom Rini			my $test = $3;
43256b9709d9STom Rini			my $otype = $4;
43266b9709d9STom Rini			my $trail = $5;
43276b9709d9STom Rini			my $op = "!";
43286b9709d9STom Rini
43296b9709d9STom Rini			($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
43306b9709d9STom Rini
43316b9709d9STom Rini			my $type = lc($otype);
43326b9709d9STom Rini			if ($type =~ /^(?:true|false)$/) {
43336b9709d9STom Rini				if (("$test" eq "==" && "$type" eq "true") ||
43346b9709d9STom Rini				    ("$test" eq "!=" && "$type" eq "false")) {
43356b9709d9STom Rini					$op = "";
43366b9709d9STom Rini				}
43376b9709d9STom Rini
43386b9709d9STom Rini				CHK("BOOL_COMPARISON",
43396b9709d9STom Rini				    "Using comparison to $otype is error prone\n" . $herecurr);
43406b9709d9STom Rini
43416b9709d9STom Rini## maybe suggesting a correct construct would better
43426b9709d9STom Rini##				    "Using comparison to $otype is error prone.  Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
43436b9709d9STom Rini
43446b9709d9STom Rini			}
43456b9709d9STom Rini		}
43466b9709d9STom Rini
4347dd88ab32SMasahiro Yamada# check for semaphores initialized locked
4348dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
4349dd88ab32SMasahiro Yamada			WARN("CONSIDER_COMPLETION",
4350dd88ab32SMasahiro Yamada			     "consider using a completion\n" . $herecurr);
4351dd88ab32SMasahiro Yamada		}
4352dd88ab32SMasahiro Yamada
4353dd88ab32SMasahiro Yamada# recommend kstrto* over simple_strto* and strict_strto*
4354dd88ab32SMasahiro Yamada		if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
4355dd88ab32SMasahiro Yamada			WARN("CONSIDER_KSTRTO",
4356dd88ab32SMasahiro Yamada			     "$1 is obsolete, use k$3 instead\n" . $herecurr);
4357dd88ab32SMasahiro Yamada		}
4358dd88ab32SMasahiro Yamada
4359dd88ab32SMasahiro Yamada# check for __initcall(), use device_initcall() explicitly please
4360dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*__initcall\s*\(/) {
4361dd88ab32SMasahiro Yamada			WARN("USE_DEVICE_INITCALL",
4362dd88ab32SMasahiro Yamada			     "please use device_initcall() instead of __initcall()\n" . $herecurr);
4363dd88ab32SMasahiro Yamada		}
4364dd88ab32SMasahiro Yamada
4365dd88ab32SMasahiro Yamada# check for various ops structs, ensure they are const.
4366dd88ab32SMasahiro Yamada		my $struct_ops = qr{acpi_dock_ops|
4367dd88ab32SMasahiro Yamada				address_space_operations|
4368dd88ab32SMasahiro Yamada				backlight_ops|
4369dd88ab32SMasahiro Yamada				block_device_operations|
4370dd88ab32SMasahiro Yamada				dentry_operations|
4371dd88ab32SMasahiro Yamada				dev_pm_ops|
4372dd88ab32SMasahiro Yamada				dma_map_ops|
4373dd88ab32SMasahiro Yamada				extent_io_ops|
4374dd88ab32SMasahiro Yamada				file_lock_operations|
4375dd88ab32SMasahiro Yamada				file_operations|
4376dd88ab32SMasahiro Yamada				hv_ops|
4377dd88ab32SMasahiro Yamada				ide_dma_ops|
4378dd88ab32SMasahiro Yamada				intel_dvo_dev_ops|
4379dd88ab32SMasahiro Yamada				item_operations|
4380dd88ab32SMasahiro Yamada				iwl_ops|
4381dd88ab32SMasahiro Yamada				kgdb_arch|
4382dd88ab32SMasahiro Yamada				kgdb_io|
4383dd88ab32SMasahiro Yamada				kset_uevent_ops|
4384dd88ab32SMasahiro Yamada				lock_manager_operations|
4385dd88ab32SMasahiro Yamada				microcode_ops|
4386dd88ab32SMasahiro Yamada				mtrr_ops|
4387dd88ab32SMasahiro Yamada				neigh_ops|
4388dd88ab32SMasahiro Yamada				nlmsvc_binding|
4389dd88ab32SMasahiro Yamada				pci_raw_ops|
4390dd88ab32SMasahiro Yamada				pipe_buf_operations|
4391dd88ab32SMasahiro Yamada				platform_hibernation_ops|
4392dd88ab32SMasahiro Yamada				platform_suspend_ops|
4393dd88ab32SMasahiro Yamada				proto_ops|
4394dd88ab32SMasahiro Yamada				rpc_pipe_ops|
4395dd88ab32SMasahiro Yamada				seq_operations|
4396dd88ab32SMasahiro Yamada				snd_ac97_build_ops|
4397dd88ab32SMasahiro Yamada				soc_pcmcia_socket_ops|
4398dd88ab32SMasahiro Yamada				stacktrace_ops|
4399dd88ab32SMasahiro Yamada				sysfs_ops|
4400dd88ab32SMasahiro Yamada				tty_operations|
4401dd88ab32SMasahiro Yamada				usb_mon_operations|
4402dd88ab32SMasahiro Yamada				wd_ops}x;
4403dd88ab32SMasahiro Yamada		if ($line !~ /\bconst\b/ &&
4404dd88ab32SMasahiro Yamada		    $line =~ /\bstruct\s+($struct_ops)\b/) {
4405dd88ab32SMasahiro Yamada			WARN("CONST_STRUCT",
4406dd88ab32SMasahiro Yamada			     "struct $1 should normally be const\n" .
4407dd88ab32SMasahiro Yamada				$herecurr);
4408dd88ab32SMasahiro Yamada		}
4409dd88ab32SMasahiro Yamada
4410dd88ab32SMasahiro Yamada# use of NR_CPUS is usually wrong
4411dd88ab32SMasahiro Yamada# ignore definitions of NR_CPUS and usage to define arrays as likely right
4412dd88ab32SMasahiro Yamada		if ($line =~ /\bNR_CPUS\b/ &&
4413dd88ab32SMasahiro Yamada		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
4414dd88ab32SMasahiro Yamada		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
4415dd88ab32SMasahiro Yamada		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
4416dd88ab32SMasahiro Yamada		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
4417dd88ab32SMasahiro Yamada		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
4418dd88ab32SMasahiro Yamada		{
4419dd88ab32SMasahiro Yamada			WARN("NR_CPUS",
4420dd88ab32SMasahiro Yamada			     "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
4421dd88ab32SMasahiro Yamada		}
4422dd88ab32SMasahiro Yamada
44236b9709d9STom Rini# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
44246b9709d9STom Rini		if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
44256b9709d9STom Rini			ERROR("DEFINE_ARCH_HAS",
44266b9709d9STom Rini			      "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
44276b9709d9STom Rini		}
44286b9709d9STom Rini
4429dd88ab32SMasahiro Yamada# check for %L{u,d,i} in strings
4430dd88ab32SMasahiro Yamada		my $string;
4431dd88ab32SMasahiro Yamada		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
4432dd88ab32SMasahiro Yamada			$string = substr($rawline, $-[1], $+[1] - $-[1]);
4433dd88ab32SMasahiro Yamada			$string =~ s/%%/__/g;
4434dd88ab32SMasahiro Yamada			if ($string =~ /(?<!%)%L[udi]/) {
4435dd88ab32SMasahiro Yamada				WARN("PRINTF_L",
4436dd88ab32SMasahiro Yamada				     "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
4437dd88ab32SMasahiro Yamada				last;
4438dd88ab32SMasahiro Yamada			}
4439dd88ab32SMasahiro Yamada		}
4440dd88ab32SMasahiro Yamada
4441dd88ab32SMasahiro Yamada# whine mightly about in_atomic
4442dd88ab32SMasahiro Yamada		if ($line =~ /\bin_atomic\s*\(/) {
4443dd88ab32SMasahiro Yamada			if ($realfile =~ m@^drivers/@) {
4444dd88ab32SMasahiro Yamada				ERROR("IN_ATOMIC",
4445dd88ab32SMasahiro Yamada				      "do not use in_atomic in drivers\n" . $herecurr);
4446dd88ab32SMasahiro Yamada			} elsif ($realfile !~ m@^kernel/@) {
4447dd88ab32SMasahiro Yamada				WARN("IN_ATOMIC",
4448dd88ab32SMasahiro Yamada				     "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
4449dd88ab32SMasahiro Yamada			}
4450dd88ab32SMasahiro Yamada		}
4451dd88ab32SMasahiro Yamada
4452dd88ab32SMasahiro Yamada# check for lockdep_set_novalidate_class
4453dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
4454dd88ab32SMasahiro Yamada		    $line =~ /__lockdep_no_validate__\s*\)/ ) {
4455dd88ab32SMasahiro Yamada			if ($realfile !~ m@^kernel/lockdep@ &&
4456dd88ab32SMasahiro Yamada			    $realfile !~ m@^include/linux/lockdep@ &&
4457dd88ab32SMasahiro Yamada			    $realfile !~ m@^drivers/base/core@) {
4458dd88ab32SMasahiro Yamada				ERROR("LOCKDEP",
4459dd88ab32SMasahiro Yamada				      "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
4460dd88ab32SMasahiro Yamada			}
4461dd88ab32SMasahiro Yamada		}
4462dd88ab32SMasahiro Yamada
4463dd88ab32SMasahiro Yamada		if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
4464dd88ab32SMasahiro Yamada		    $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
4465dd88ab32SMasahiro Yamada			WARN("EXPORTED_WORLD_WRITABLE",
4466dd88ab32SMasahiro Yamada			     "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
4467dd88ab32SMasahiro Yamada		}
4468dd88ab32SMasahiro Yamada	}
4469dd88ab32SMasahiro Yamada
4470dd88ab32SMasahiro Yamada	# If we have no input at all, then there is nothing to report on
4471dd88ab32SMasahiro Yamada	# so just keep quiet.
4472dd88ab32SMasahiro Yamada	if ($#rawlines == -1) {
4473dd88ab32SMasahiro Yamada		exit(0);
4474dd88ab32SMasahiro Yamada	}
4475dd88ab32SMasahiro Yamada
4476dd88ab32SMasahiro Yamada	# In mailback mode only produce a report in the negative, for
4477dd88ab32SMasahiro Yamada	# things that appear to be patches.
4478dd88ab32SMasahiro Yamada	if ($mailback && ($clean == 1 || !$is_patch)) {
4479dd88ab32SMasahiro Yamada		exit(0);
4480dd88ab32SMasahiro Yamada	}
4481dd88ab32SMasahiro Yamada
4482dd88ab32SMasahiro Yamada	# This is not a patch, and we are are in 'no-patch' mode so
4483dd88ab32SMasahiro Yamada	# just keep quiet.
4484dd88ab32SMasahiro Yamada	if (!$chk_patch && !$is_patch) {
4485dd88ab32SMasahiro Yamada		exit(0);
4486dd88ab32SMasahiro Yamada	}
4487dd88ab32SMasahiro Yamada
4488dd88ab32SMasahiro Yamada	if (!$is_patch) {
4489dd88ab32SMasahiro Yamada		ERROR("NOT_UNIFIED_DIFF",
4490dd88ab32SMasahiro Yamada		      "Does not appear to be a unified-diff format patch\n");
4491dd88ab32SMasahiro Yamada	}
4492dd88ab32SMasahiro Yamada	if ($is_patch && $chk_signoff && $signoff == 0) {
4493dd88ab32SMasahiro Yamada		ERROR("MISSING_SIGN_OFF",
4494dd88ab32SMasahiro Yamada		      "Missing Signed-off-by: line(s)\n");
4495dd88ab32SMasahiro Yamada	}
4496dd88ab32SMasahiro Yamada
4497dd88ab32SMasahiro Yamada	print report_dump();
4498dd88ab32SMasahiro Yamada	if ($summary && !($clean == 1 && $quiet == 1)) {
4499dd88ab32SMasahiro Yamada		print "$filename " if ($summary_file);
4500dd88ab32SMasahiro Yamada		print "total: $cnt_error errors, $cnt_warn warnings, " .
4501dd88ab32SMasahiro Yamada			(($check)? "$cnt_chk checks, " : "") .
4502dd88ab32SMasahiro Yamada			"$cnt_lines lines checked\n";
4503dd88ab32SMasahiro Yamada		print "\n" if ($quiet == 0);
4504dd88ab32SMasahiro Yamada	}
4505dd88ab32SMasahiro Yamada
4506dd88ab32SMasahiro Yamada	if ($quiet == 0) {
4507dd88ab32SMasahiro Yamada
4508dd88ab32SMasahiro Yamada		if ($^V lt 5.10.0) {
4509dd88ab32SMasahiro Yamada			print("NOTE: perl $^V is not modern enough to detect all possible issues.\n");
4510dd88ab32SMasahiro Yamada			print("An upgrade to at least perl v5.10.0 is suggested.\n\n");
4511dd88ab32SMasahiro Yamada		}
4512dd88ab32SMasahiro Yamada
4513dd88ab32SMasahiro Yamada		# If there were whitespace errors which cleanpatch can fix
4514dd88ab32SMasahiro Yamada		# then suggest that.
4515dd88ab32SMasahiro Yamada		if ($rpt_cleaners) {
4516dd88ab32SMasahiro Yamada			print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n";
4517dd88ab32SMasahiro Yamada			print "      scripts/cleanfile\n\n";
4518dd88ab32SMasahiro Yamada			$rpt_cleaners = 0;
4519dd88ab32SMasahiro Yamada		}
4520dd88ab32SMasahiro Yamada	}
4521dd88ab32SMasahiro Yamada
45226b9709d9STom Rini	hash_show_words(\%use_type, "Used");
45236b9709d9STom Rini	hash_show_words(\%ignore_type, "Ignored");
45246b9709d9STom Rini
45256b9709d9STom Rini	if ($clean == 0 && $fix && "@rawlines" ne "@fixed") {
45266b9709d9STom Rini		my $newfile = $filename;
45276b9709d9STom Rini		$newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
45286b9709d9STom Rini		my $linecount = 0;
45296b9709d9STom Rini		my $f;
45306b9709d9STom Rini
45316b9709d9STom Rini		open($f, '>', $newfile)
45326b9709d9STom Rini		    or die "$P: Can't open $newfile for write\n";
45336b9709d9STom Rini		foreach my $fixed_line (@fixed) {
45346b9709d9STom Rini			$linecount++;
45356b9709d9STom Rini			if ($file) {
45366b9709d9STom Rini				if ($linecount > 3) {
45376b9709d9STom Rini					$fixed_line =~ s/^\+//;
45386b9709d9STom Rini					print $f $fixed_line. "\n";
4539dd88ab32SMasahiro Yamada				}
45406b9709d9STom Rini			} else {
45416b9709d9STom Rini				print $f $fixed_line . "\n";
45426b9709d9STom Rini			}
45436b9709d9STom Rini		}
45446b9709d9STom Rini		close($f);
45456b9709d9STom Rini
45466b9709d9STom Rini		if (!$quiet) {
45476b9709d9STom Rini			print << "EOM";
45486b9709d9STom RiniWrote EXPERIMENTAL --fix correction(s) to '$newfile'
45496b9709d9STom Rini
45506b9709d9STom RiniDo _NOT_ trust the results written to this file.
45516b9709d9STom RiniDo _NOT_ submit these changes without inspecting them for correctness.
45526b9709d9STom Rini
45536b9709d9STom RiniThis EXPERIMENTAL file is simply a convenience to help rewrite patches.
45546b9709d9STom RiniNo warranties, expressed or implied...
45556b9709d9STom Rini
45566b9709d9STom RiniEOM
45576b9709d9STom Rini		}
4558dd88ab32SMasahiro Yamada	}
4559dd88ab32SMasahiro Yamada
4560dd88ab32SMasahiro Yamada	if ($clean == 1 && $quiet == 0) {
4561dd88ab32SMasahiro Yamada		print "$vname has no obvious style problems and is ready for submission.\n"
4562dd88ab32SMasahiro Yamada	}
4563dd88ab32SMasahiro Yamada	if ($clean == 0 && $quiet == 0) {
4564dd88ab32SMasahiro Yamada		print << "EOM";
4565dd88ab32SMasahiro Yamada$vname has style problems, please review.
4566dd88ab32SMasahiro Yamada
4567dd88ab32SMasahiro YamadaIf any of these errors are false positives, please report
45686b9709d9STom Rinithem to the maintainer, see CHECKPATCH in MAINTAINERS.
4569dd88ab32SMasahiro YamadaEOM
4570dd88ab32SMasahiro Yamada	}
4571dd88ab32SMasahiro Yamada
4572dd88ab32SMasahiro Yamada	return $clean;
4573dd88ab32SMasahiro Yamada}
4574