xref: /rk3399_rockchip-uboot/scripts/checkpatch.pl (revision c10e0f5b38eb9aa707238edf794e6ff141cd45dc)
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;
10*c10e0f5bSDan Murphyuse File::Basename;
11*c10e0f5bSDan Murphyuse Cwd 'abs_path';
12dd88ab32SMasahiro Yamada
13dd88ab32SMasahiro Yamadamy $P = $0;
14dd88ab32SMasahiro Yamada$P =~ s@.*/@@g;
15*c10e0f5bSDan Murphymy $D = dirname(abs_path($P));
16dd88ab32SMasahiro Yamada
17dd88ab32SMasahiro Yamadamy $V = '0.32';
18dd88ab32SMasahiro Yamada
19dd88ab32SMasahiro Yamadause Getopt::Long qw(:config no_auto_abbrev);
20dd88ab32SMasahiro Yamada
21dd88ab32SMasahiro Yamadamy $quiet = 0;
22dd88ab32SMasahiro Yamadamy $tree = 1;
23dd88ab32SMasahiro Yamadamy $chk_signoff = 1;
24dd88ab32SMasahiro Yamadamy $chk_patch = 1;
25dd88ab32SMasahiro Yamadamy $tst_only;
26dd88ab32SMasahiro Yamadamy $emacs = 0;
27dd88ab32SMasahiro Yamadamy $terse = 0;
28dd88ab32SMasahiro Yamadamy $file = 0;
29dd88ab32SMasahiro Yamadamy $check = 0;
30dd88ab32SMasahiro Yamadamy $summary = 1;
31dd88ab32SMasahiro Yamadamy $mailback = 0;
32dd88ab32SMasahiro Yamadamy $summary_file = 0;
33dd88ab32SMasahiro Yamadamy $show_types = 0;
346b9709d9STom Rinimy $fix = 0;
356b9709d9STom Rinimy $fix_inplace = 0;
36dd88ab32SMasahiro Yamadamy $root;
37dd88ab32SMasahiro Yamadamy %debug;
386b9709d9STom Rinimy %camelcase = ();
396b9709d9STom Rinimy %use_type = ();
406b9709d9STom Rinimy @use = ();
41dd88ab32SMasahiro Yamadamy %ignore_type = ();
42dd88ab32SMasahiro Yamadamy @ignore = ();
43dd88ab32SMasahiro Yamadamy $help = 0;
44dd88ab32SMasahiro Yamadamy $configuration_file = ".checkpatch.conf";
45dd88ab32SMasahiro Yamadamy $max_line_length = 80;
466b9709d9STom Rinimy $ignore_perl_version = 0;
476b9709d9STom Rinimy $minimum_perl_version = 5.10.0;
48*c10e0f5bSDan Murphymy $spelling_file = "$D/spelling.txt";
49*c10e0f5bSDan Murphymy $codespell = 0;
50*c10e0f5bSDan Murphymy $codespellfile = "/usr/share/codespell/dictionary.txt";
51dd88ab32SMasahiro Yamada
52dd88ab32SMasahiro Yamadasub help {
53dd88ab32SMasahiro Yamada	my ($exitcode) = @_;
54dd88ab32SMasahiro Yamada
55dd88ab32SMasahiro Yamada	print << "EOM";
56dd88ab32SMasahiro YamadaUsage: $P [OPTION]... [FILE]...
57dd88ab32SMasahiro YamadaVersion: $V
58dd88ab32SMasahiro Yamada
59dd88ab32SMasahiro YamadaOptions:
60dd88ab32SMasahiro Yamada  -q, --quiet                quiet
61dd88ab32SMasahiro Yamada  --no-tree                  run without a kernel tree
62dd88ab32SMasahiro Yamada  --no-signoff               do not check for 'Signed-off-by' line
63dd88ab32SMasahiro Yamada  --patch                    treat FILE as patchfile (default)
64dd88ab32SMasahiro Yamada  --emacs                    emacs compile window format
65dd88ab32SMasahiro Yamada  --terse                    one line per report
66dd88ab32SMasahiro Yamada  -f, --file                 treat FILE as regular source file
67dd88ab32SMasahiro Yamada  --subjective, --strict     enable more subjective tests
686b9709d9STom Rini  --types TYPE(,TYPE2...)    show only these comma separated message types
69dd88ab32SMasahiro Yamada  --ignore TYPE(,TYPE2...)   ignore various comma separated message types
70dd88ab32SMasahiro Yamada  --max-line-length=n        set the maximum line length, if exceeded, warn
71dd88ab32SMasahiro Yamada  --show-types               show the message "types" in the output
72dd88ab32SMasahiro Yamada  --root=PATH                PATH to the kernel tree root
73dd88ab32SMasahiro Yamada  --no-summary               suppress the per-file summary
74dd88ab32SMasahiro Yamada  --mailback                 only produce a report in case of warnings/errors
75dd88ab32SMasahiro Yamada  --summary-file             include the filename in summary
76dd88ab32SMasahiro Yamada  --debug KEY=[0|1]          turn on/off debugging of KEY, where KEY is one of
77dd88ab32SMasahiro Yamada                             'values', 'possible', 'type', and 'attr' (default
78dd88ab32SMasahiro Yamada                             is all off)
79dd88ab32SMasahiro Yamada  --test-only=WORD           report only warnings/errors containing WORD
80dd88ab32SMasahiro Yamada                             literally
816b9709d9STom Rini  --fix                      EXPERIMENTAL - may create horrible results
826b9709d9STom Rini                             If correctable single-line errors exist, create
836b9709d9STom Rini                             "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
846b9709d9STom Rini                             with potential errors corrected to the preferred
856b9709d9STom Rini                             checkpatch style
866b9709d9STom Rini  --fix-inplace              EXPERIMENTAL - may create horrible results
876b9709d9STom Rini                             Is the same as --fix, but overwrites the input
886b9709d9STom Rini                             file.  It's your fault if there's no backup or git
896b9709d9STom Rini  --ignore-perl-version      override checking of perl version.  expect
906b9709d9STom Rini                             runtime errors.
91*c10e0f5bSDan Murphy  --codespell                Use the codespell dictionary for spelling/typos
92*c10e0f5bSDan Murphy                             (default:/usr/local/share/codespell/dictionary.txt)
93*c10e0f5bSDan Murphy  --codespellfile            Use this codespell dictionary
94dd88ab32SMasahiro Yamada  -h, --help, --version      display this help and exit
95dd88ab32SMasahiro Yamada
96dd88ab32SMasahiro YamadaWhen FILE is - read standard input.
97dd88ab32SMasahiro YamadaEOM
98dd88ab32SMasahiro Yamada
99dd88ab32SMasahiro Yamada	exit($exitcode);
100dd88ab32SMasahiro Yamada}
101dd88ab32SMasahiro Yamada
102dd88ab32SMasahiro Yamadamy $conf = which_conf($configuration_file);
103dd88ab32SMasahiro Yamadaif (-f $conf) {
104dd88ab32SMasahiro Yamada	my @conf_args;
105dd88ab32SMasahiro Yamada	open(my $conffile, '<', "$conf")
106dd88ab32SMasahiro Yamada	    or warn "$P: Can't find a readable $configuration_file file $!\n";
107dd88ab32SMasahiro Yamada
108dd88ab32SMasahiro Yamada	while (<$conffile>) {
109dd88ab32SMasahiro Yamada		my $line = $_;
110dd88ab32SMasahiro Yamada
111dd88ab32SMasahiro Yamada		$line =~ s/\s*\n?$//g;
112dd88ab32SMasahiro Yamada		$line =~ s/^\s*//g;
113dd88ab32SMasahiro Yamada		$line =~ s/\s+/ /g;
114dd88ab32SMasahiro Yamada
115dd88ab32SMasahiro Yamada		next if ($line =~ m/^\s*#/);
116dd88ab32SMasahiro Yamada		next if ($line =~ m/^\s*$/);
117dd88ab32SMasahiro Yamada
118dd88ab32SMasahiro Yamada		my @words = split(" ", $line);
119dd88ab32SMasahiro Yamada		foreach my $word (@words) {
120dd88ab32SMasahiro Yamada			last if ($word =~ m/^#/);
121dd88ab32SMasahiro Yamada			push (@conf_args, $word);
122dd88ab32SMasahiro Yamada		}
123dd88ab32SMasahiro Yamada	}
124dd88ab32SMasahiro Yamada	close($conffile);
125dd88ab32SMasahiro Yamada	unshift(@ARGV, @conf_args) if @conf_args;
126dd88ab32SMasahiro Yamada}
127dd88ab32SMasahiro Yamada
128dd88ab32SMasahiro YamadaGetOptions(
129dd88ab32SMasahiro Yamada	'q|quiet+'	=> \$quiet,
130dd88ab32SMasahiro Yamada	'tree!'		=> \$tree,
131dd88ab32SMasahiro Yamada	'signoff!'	=> \$chk_signoff,
132dd88ab32SMasahiro Yamada	'patch!'	=> \$chk_patch,
133dd88ab32SMasahiro Yamada	'emacs!'	=> \$emacs,
134dd88ab32SMasahiro Yamada	'terse!'	=> \$terse,
135dd88ab32SMasahiro Yamada	'f|file!'	=> \$file,
136dd88ab32SMasahiro Yamada	'subjective!'	=> \$check,
137dd88ab32SMasahiro Yamada	'strict!'	=> \$check,
138dd88ab32SMasahiro Yamada	'ignore=s'	=> \@ignore,
1396b9709d9STom Rini	'types=s'	=> \@use,
140dd88ab32SMasahiro Yamada	'show-types!'	=> \$show_types,
141dd88ab32SMasahiro Yamada	'max-line-length=i' => \$max_line_length,
142dd88ab32SMasahiro Yamada	'root=s'	=> \$root,
143dd88ab32SMasahiro Yamada	'summary!'	=> \$summary,
144dd88ab32SMasahiro Yamada	'mailback!'	=> \$mailback,
145dd88ab32SMasahiro Yamada	'summary-file!'	=> \$summary_file,
1466b9709d9STom Rini	'fix!'		=> \$fix,
1476b9709d9STom Rini	'fix-inplace!'	=> \$fix_inplace,
1486b9709d9STom Rini	'ignore-perl-version!' => \$ignore_perl_version,
149dd88ab32SMasahiro Yamada	'debug=s'	=> \%debug,
150dd88ab32SMasahiro Yamada	'test-only=s'	=> \$tst_only,
151*c10e0f5bSDan Murphy	'codespell!'    => \$codespell,
152*c10e0f5bSDan Murphy	'codespellfile=s' => \$codespellfile,
153dd88ab32SMasahiro Yamada	'h|help'	=> \$help,
154dd88ab32SMasahiro Yamada	'version'	=> \$help
155dd88ab32SMasahiro Yamada) or help(1);
156dd88ab32SMasahiro Yamada
157dd88ab32SMasahiro Yamadahelp(0) if ($help);
158dd88ab32SMasahiro Yamada
1596b9709d9STom Rini$fix = 1 if ($fix_inplace);
1606b9709d9STom Rini
161dd88ab32SMasahiro Yamadamy $exit = 0;
162dd88ab32SMasahiro Yamada
1636b9709d9STom Riniif ($^V && $^V lt $minimum_perl_version) {
1646b9709d9STom Rini	printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
1656b9709d9STom Rini	if (!$ignore_perl_version) {
1666b9709d9STom Rini		exit(1);
1676b9709d9STom Rini	}
1686b9709d9STom Rini}
1696b9709d9STom Rini
170dd88ab32SMasahiro Yamadaif ($#ARGV < 0) {
171dd88ab32SMasahiro Yamada	print "$P: no input files\n";
172dd88ab32SMasahiro Yamada	exit(1);
173dd88ab32SMasahiro Yamada}
174dd88ab32SMasahiro Yamada
1756b9709d9STom Rinisub hash_save_array_words {
1766b9709d9STom Rini	my ($hashRef, $arrayRef) = @_;
1776b9709d9STom Rini
1786b9709d9STom Rini	my @array = split(/,/, join(',', @$arrayRef));
1796b9709d9STom Rini	foreach my $word (@array) {
180dd88ab32SMasahiro Yamada		$word =~ s/\s*\n?$//g;
181dd88ab32SMasahiro Yamada		$word =~ s/^\s*//g;
182dd88ab32SMasahiro Yamada		$word =~ s/\s+/ /g;
183dd88ab32SMasahiro Yamada		$word =~ tr/[a-z]/[A-Z]/;
184dd88ab32SMasahiro Yamada
185dd88ab32SMasahiro Yamada		next if ($word =~ m/^\s*#/);
186dd88ab32SMasahiro Yamada		next if ($word =~ m/^\s*$/);
187dd88ab32SMasahiro Yamada
1886b9709d9STom Rini		$hashRef->{$word}++;
189dd88ab32SMasahiro Yamada	}
1906b9709d9STom Rini}
1916b9709d9STom Rini
1926b9709d9STom Rinisub hash_show_words {
1936b9709d9STom Rini	my ($hashRef, $prefix) = @_;
1946b9709d9STom Rini
1956b9709d9STom Rini	if ($quiet == 0 && keys %$hashRef) {
1966b9709d9STom Rini		print "NOTE: $prefix message types:";
1976b9709d9STom Rini		foreach my $word (sort keys %$hashRef) {
1986b9709d9STom Rini			print " $word";
1996b9709d9STom Rini		}
2006b9709d9STom Rini		print "\n\n";
2016b9709d9STom Rini	}
2026b9709d9STom Rini}
2036b9709d9STom Rini
2046b9709d9STom Rinihash_save_array_words(\%ignore_type, \@ignore);
2056b9709d9STom Rinihash_save_array_words(\%use_type, \@use);
206dd88ab32SMasahiro Yamada
207dd88ab32SMasahiro Yamadamy $dbg_values = 0;
208dd88ab32SMasahiro Yamadamy $dbg_possible = 0;
209dd88ab32SMasahiro Yamadamy $dbg_type = 0;
210dd88ab32SMasahiro Yamadamy $dbg_attr = 0;
211dd88ab32SMasahiro Yamadafor my $key (keys %debug) {
212dd88ab32SMasahiro Yamada	## no critic
213dd88ab32SMasahiro Yamada	eval "\${dbg_$key} = '$debug{$key}';";
214dd88ab32SMasahiro Yamada	die "$@" if ($@);
215dd88ab32SMasahiro Yamada}
216dd88ab32SMasahiro Yamada
217dd88ab32SMasahiro Yamadamy $rpt_cleaners = 0;
218dd88ab32SMasahiro Yamada
219dd88ab32SMasahiro Yamadaif ($terse) {
220dd88ab32SMasahiro Yamada	$emacs = 1;
221dd88ab32SMasahiro Yamada	$quiet++;
222dd88ab32SMasahiro Yamada}
223dd88ab32SMasahiro Yamada
224dd88ab32SMasahiro Yamadaif ($tree) {
225dd88ab32SMasahiro Yamada	if (defined $root) {
226dd88ab32SMasahiro Yamada		if (!top_of_kernel_tree($root)) {
227dd88ab32SMasahiro Yamada			die "$P: $root: --root does not point at a valid tree\n";
228dd88ab32SMasahiro Yamada		}
229dd88ab32SMasahiro Yamada	} else {
230dd88ab32SMasahiro Yamada		if (top_of_kernel_tree('.')) {
231dd88ab32SMasahiro Yamada			$root = '.';
232dd88ab32SMasahiro Yamada		} elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
233dd88ab32SMasahiro Yamada						top_of_kernel_tree($1)) {
234dd88ab32SMasahiro Yamada			$root = $1;
235dd88ab32SMasahiro Yamada		}
236dd88ab32SMasahiro Yamada	}
237dd88ab32SMasahiro Yamada
238dd88ab32SMasahiro Yamada	if (!defined $root) {
239dd88ab32SMasahiro Yamada		print "Must be run from the top-level dir. of a kernel tree\n";
240dd88ab32SMasahiro Yamada		exit(2);
241dd88ab32SMasahiro Yamada	}
242dd88ab32SMasahiro Yamada}
243dd88ab32SMasahiro Yamada
244dd88ab32SMasahiro Yamadamy $emitted_corrupt = 0;
245dd88ab32SMasahiro Yamada
246dd88ab32SMasahiro Yamadaour $Ident	= qr{
247dd88ab32SMasahiro Yamada			[A-Za-z_][A-Za-z\d_]*
248dd88ab32SMasahiro Yamada			(?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
249dd88ab32SMasahiro Yamada		}x;
250dd88ab32SMasahiro Yamadaour $Storage	= qr{extern|static|asmlinkage};
251dd88ab32SMasahiro Yamadaour $Sparse	= qr{
252dd88ab32SMasahiro Yamada			__user|
253dd88ab32SMasahiro Yamada			__kernel|
254dd88ab32SMasahiro Yamada			__force|
255dd88ab32SMasahiro Yamada			__iomem|
256dd88ab32SMasahiro Yamada			__must_check|
257dd88ab32SMasahiro Yamada			__init_refok|
258dd88ab32SMasahiro Yamada			__kprobes|
259dd88ab32SMasahiro Yamada			__ref|
260dd88ab32SMasahiro Yamada			__rcu
261dd88ab32SMasahiro Yamada		}x;
2626b9709d9STom Riniour $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
2636b9709d9STom Riniour $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
2646b9709d9STom Riniour $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
2656b9709d9STom Riniour $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
2666b9709d9STom Riniour $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
267dd88ab32SMasahiro Yamada
268dd88ab32SMasahiro Yamada# Notes to $Attribute:
269dd88ab32SMasahiro Yamada# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
270dd88ab32SMasahiro Yamadaour $Attribute	= qr{
271dd88ab32SMasahiro Yamada			const|
272dd88ab32SMasahiro Yamada			__percpu|
273dd88ab32SMasahiro Yamada			__nocast|
274dd88ab32SMasahiro Yamada			__safe|
275dd88ab32SMasahiro Yamada			__bitwise__|
276dd88ab32SMasahiro Yamada			__packed__|
277dd88ab32SMasahiro Yamada			__packed2__|
278dd88ab32SMasahiro Yamada			__naked|
279dd88ab32SMasahiro Yamada			__maybe_unused|
280dd88ab32SMasahiro Yamada			__always_unused|
281dd88ab32SMasahiro Yamada			__noreturn|
282dd88ab32SMasahiro Yamada			__used|
283dd88ab32SMasahiro Yamada			__cold|
284dd88ab32SMasahiro Yamada			__noclone|
285dd88ab32SMasahiro Yamada			__deprecated|
286dd88ab32SMasahiro Yamada			__read_mostly|
287dd88ab32SMasahiro Yamada			__kprobes|
2886b9709d9STom Rini			$InitAttribute|
289dd88ab32SMasahiro Yamada			____cacheline_aligned|
290dd88ab32SMasahiro Yamada			____cacheline_aligned_in_smp|
291dd88ab32SMasahiro Yamada			____cacheline_internodealigned_in_smp|
292dd88ab32SMasahiro Yamada			__weak
293dd88ab32SMasahiro Yamada		  }x;
294dd88ab32SMasahiro Yamadaour $Modifier;
295dd88ab32SMasahiro Yamadaour $Inline	= qr{inline|__always_inline|noinline};
296dd88ab32SMasahiro Yamadaour $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
297dd88ab32SMasahiro Yamadaour $Lval	= qr{$Ident(?:$Member)*};
298dd88ab32SMasahiro Yamada
2996b9709d9STom Riniour $Int_type	= qr{(?i)llu|ull|ll|lu|ul|l|u};
3006b9709d9STom Riniour $Binary	= qr{(?i)0b[01]+$Int_type?};
3016b9709d9STom Riniour $Hex	= qr{(?i)0x[0-9a-f]+$Int_type?};
3026b9709d9STom Riniour $Int	= qr{[0-9]+$Int_type?};
303dd88ab32SMasahiro Yamadaour $Float_hex	= qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
304dd88ab32SMasahiro Yamadaour $Float_dec	= qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
305dd88ab32SMasahiro Yamadaour $Float_int	= qr{(?i)[0-9]+e-?[0-9]+[fl]?};
306dd88ab32SMasahiro Yamadaour $Float	= qr{$Float_hex|$Float_dec|$Float_int};
3076b9709d9STom Riniour $Constant	= qr{$Float|$Binary|$Hex|$Int};
308dd88ab32SMasahiro Yamadaour $Assignment	= qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
309dd88ab32SMasahiro Yamadaour $Compare    = qr{<=|>=|==|!=|<|>};
3106b9709d9STom Riniour $Arithmetic = qr{\+|-|\*|\/|%};
311dd88ab32SMasahiro Yamadaour $Operators	= qr{
312dd88ab32SMasahiro Yamada			<=|>=|==|!=|
313dd88ab32SMasahiro Yamada			=>|->|<<|>>|<|>|!|~|
3146b9709d9STom Rini			&&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
315dd88ab32SMasahiro Yamada		  }x;
316dd88ab32SMasahiro Yamada
317dd88ab32SMasahiro Yamadaour $NonptrType;
3186b9709d9STom Riniour $NonptrTypeWithAttr;
319dd88ab32SMasahiro Yamadaour $Type;
320dd88ab32SMasahiro Yamadaour $Declare;
321dd88ab32SMasahiro Yamada
322dd88ab32SMasahiro Yamadaour $NON_ASCII_UTF8	= qr{
323dd88ab32SMasahiro Yamada	[\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
324dd88ab32SMasahiro Yamada	|  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
325dd88ab32SMasahiro Yamada	| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
326dd88ab32SMasahiro Yamada	|  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
327dd88ab32SMasahiro Yamada	|  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
328dd88ab32SMasahiro Yamada	| [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
329dd88ab32SMasahiro Yamada	|  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
330dd88ab32SMasahiro Yamada}x;
331dd88ab32SMasahiro Yamada
332dd88ab32SMasahiro Yamadaour $UTF8	= qr{
333dd88ab32SMasahiro Yamada	[\x09\x0A\x0D\x20-\x7E]              # ASCII
334dd88ab32SMasahiro Yamada	| $NON_ASCII_UTF8
335dd88ab32SMasahiro Yamada}x;
336dd88ab32SMasahiro Yamada
337dd88ab32SMasahiro Yamadaour $typeTypedefs = qr{(?x:
338dd88ab32SMasahiro Yamada	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
339dd88ab32SMasahiro Yamada	atomic_t
340dd88ab32SMasahiro Yamada)};
341dd88ab32SMasahiro Yamada
342dd88ab32SMasahiro Yamadaour $logFunctions = qr{(?x:
343dd88ab32SMasahiro Yamada	printk(?:_ratelimited|_once|)|
3446b9709d9STom Rini	(?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
345dd88ab32SMasahiro Yamada	WARN(?:_RATELIMIT|_ONCE|)|
346dd88ab32SMasahiro Yamada	panic|
347dd88ab32SMasahiro Yamada	debug|
348dd88ab32SMasahiro Yamada	printf|
3496b9709d9STom Rini	puts|
3506b9709d9STom Rini	MODULE_[A-Z_]+|
3516b9709d9STom Rini	seq_vprintf|seq_printf|seq_puts
352dd88ab32SMasahiro Yamada)};
353dd88ab32SMasahiro Yamada
354dd88ab32SMasahiro Yamadaour $signature_tags = qr{(?xi:
355dd88ab32SMasahiro Yamada	Signed-off-by:|
356dd88ab32SMasahiro Yamada	Acked-by:|
357dd88ab32SMasahiro Yamada	Tested-by:|
358dd88ab32SMasahiro Yamada	Reviewed-by:|
359dd88ab32SMasahiro Yamada	Reported-by:|
3606b9709d9STom Rini	Suggested-by:|
361dd88ab32SMasahiro Yamada	To:|
362dd88ab32SMasahiro Yamada	Cc:
363dd88ab32SMasahiro Yamada)};
364dd88ab32SMasahiro Yamada
365dd88ab32SMasahiro Yamadaour @typeList = (
366dd88ab32SMasahiro Yamada	qr{void},
367dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?char},
368dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?short},
369dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?int},
370dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?long},
371dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?long\s+int},
372dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?long\s+long},
373dd88ab32SMasahiro Yamada	qr{(?:unsigned\s+)?long\s+long\s+int},
374dd88ab32SMasahiro Yamada	qr{unsigned},
375dd88ab32SMasahiro Yamada	qr{float},
376dd88ab32SMasahiro Yamada	qr{double},
377dd88ab32SMasahiro Yamada	qr{bool},
378dd88ab32SMasahiro Yamada	qr{struct\s+$Ident},
379dd88ab32SMasahiro Yamada	qr{union\s+$Ident},
380dd88ab32SMasahiro Yamada	qr{enum\s+$Ident},
381dd88ab32SMasahiro Yamada	qr{${Ident}_t},
382dd88ab32SMasahiro Yamada	qr{${Ident}_handler},
383dd88ab32SMasahiro Yamada	qr{${Ident}_handler_fn},
384dd88ab32SMasahiro Yamada);
3856b9709d9STom Riniour @typeListWithAttr = (
3866b9709d9STom Rini	@typeList,
3876b9709d9STom Rini	qr{struct\s+$InitAttribute\s+$Ident},
3886b9709d9STom Rini	qr{union\s+$InitAttribute\s+$Ident},
3896b9709d9STom Rini);
3906b9709d9STom Rini
391dd88ab32SMasahiro Yamadaour @modifierList = (
392dd88ab32SMasahiro Yamada	qr{fastcall},
393dd88ab32SMasahiro Yamada);
394dd88ab32SMasahiro Yamada
395dd88ab32SMasahiro Yamadaour $allowed_asm_includes = qr{(?x:
396dd88ab32SMasahiro Yamada	irq|
397dd88ab32SMasahiro Yamada	memory
398dd88ab32SMasahiro Yamada)};
399dd88ab32SMasahiro Yamada# memory.h: ARM has a custom one
400dd88ab32SMasahiro Yamada
401*c10e0f5bSDan Murphy# Load common spelling mistakes and build regular expression list.
402*c10e0f5bSDan Murphymy $misspellings;
403*c10e0f5bSDan Murphymy %spelling_fix;
404*c10e0f5bSDan Murphy
405*c10e0f5bSDan Murphyif (open(my $spelling, '<', $spelling_file)) {
406*c10e0f5bSDan Murphy	while (<$spelling>) {
407*c10e0f5bSDan Murphy		my $line = $_;
408*c10e0f5bSDan Murphy
409*c10e0f5bSDan Murphy		$line =~ s/\s*\n?$//g;
410*c10e0f5bSDan Murphy		$line =~ s/^\s*//g;
411*c10e0f5bSDan Murphy
412*c10e0f5bSDan Murphy		next if ($line =~ m/^\s*#/);
413*c10e0f5bSDan Murphy		next if ($line =~ m/^\s*$/);
414*c10e0f5bSDan Murphy
415*c10e0f5bSDan Murphy		my ($suspect, $fix) = split(/\|\|/, $line);
416*c10e0f5bSDan Murphy
417*c10e0f5bSDan Murphy		$spelling_fix{$suspect} = $fix;
418*c10e0f5bSDan Murphy	}
419*c10e0f5bSDan Murphy	close($spelling);
420*c10e0f5bSDan Murphy} else {
421*c10e0f5bSDan Murphy	warn "No typos will be found - file '$spelling_file': $!\n";
422*c10e0f5bSDan Murphy}
423*c10e0f5bSDan Murphy
424*c10e0f5bSDan Murphyif ($codespell) {
425*c10e0f5bSDan Murphy	if (open(my $spelling, '<', $codespellfile)) {
426*c10e0f5bSDan Murphy		while (<$spelling>) {
427*c10e0f5bSDan Murphy			my $line = $_;
428*c10e0f5bSDan Murphy
429*c10e0f5bSDan Murphy			$line =~ s/\s*\n?$//g;
430*c10e0f5bSDan Murphy			$line =~ s/^\s*//g;
431*c10e0f5bSDan Murphy
432*c10e0f5bSDan Murphy			next if ($line =~ m/^\s*#/);
433*c10e0f5bSDan Murphy			next if ($line =~ m/^\s*$/);
434*c10e0f5bSDan Murphy			next if ($line =~ m/, disabled/i);
435*c10e0f5bSDan Murphy
436*c10e0f5bSDan Murphy			$line =~ s/,.*$//;
437*c10e0f5bSDan Murphy
438*c10e0f5bSDan Murphy			my ($suspect, $fix) = split(/->/, $line);
439*c10e0f5bSDan Murphy
440*c10e0f5bSDan Murphy			$spelling_fix{$suspect} = $fix;
441*c10e0f5bSDan Murphy		}
442*c10e0f5bSDan Murphy		close($spelling);
443*c10e0f5bSDan Murphy	} else {
444*c10e0f5bSDan Murphy		warn "No codespell typos will be found - file '$codespellfile': $!\n";
445*c10e0f5bSDan Murphy	}
446*c10e0f5bSDan Murphy}
447*c10e0f5bSDan Murphy
448*c10e0f5bSDan Murphy$misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix;
449*c10e0f5bSDan Murphy
450*c10e0f5bSDan Murphy
451dd88ab32SMasahiro Yamadasub build_types {
452dd88ab32SMasahiro Yamada	my $mods = "(?x:  \n" . join("|\n  ", @modifierList) . "\n)";
453dd88ab32SMasahiro Yamada	my $all = "(?x:  \n" . join("|\n  ", @typeList) . "\n)";
4546b9709d9STom Rini	my $allWithAttr = "(?x:  \n" . join("|\n  ", @typeListWithAttr) . "\n)";
455dd88ab32SMasahiro Yamada	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
456dd88ab32SMasahiro Yamada	$NonptrType	= qr{
457dd88ab32SMasahiro Yamada			(?:$Modifier\s+|const\s+)*
458dd88ab32SMasahiro Yamada			(?:
459dd88ab32SMasahiro Yamada				(?:typeof|__typeof__)\s*\([^\)]*\)|
460dd88ab32SMasahiro Yamada				(?:$typeTypedefs\b)|
461dd88ab32SMasahiro Yamada				(?:${all}\b)
462dd88ab32SMasahiro Yamada			)
463dd88ab32SMasahiro Yamada			(?:\s+$Modifier|\s+const)*
464dd88ab32SMasahiro Yamada		  }x;
4656b9709d9STom Rini	$NonptrTypeWithAttr	= qr{
4666b9709d9STom Rini			(?:$Modifier\s+|const\s+)*
4676b9709d9STom Rini			(?:
4686b9709d9STom Rini				(?:typeof|__typeof__)\s*\([^\)]*\)|
4696b9709d9STom Rini				(?:$typeTypedefs\b)|
4706b9709d9STom Rini				(?:${allWithAttr}\b)
4716b9709d9STom Rini			)
4726b9709d9STom Rini			(?:\s+$Modifier|\s+const)*
4736b9709d9STom Rini		  }x;
474dd88ab32SMasahiro Yamada	$Type	= qr{
475dd88ab32SMasahiro Yamada			$NonptrType
476dd88ab32SMasahiro Yamada			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*|\[\])+|(?:\s*\[\s*\])+)?
477dd88ab32SMasahiro Yamada			(?:\s+$Inline|\s+$Modifier)*
478dd88ab32SMasahiro Yamada		  }x;
479dd88ab32SMasahiro Yamada	$Declare	= qr{(?:$Storage\s+)?$Type};
480dd88ab32SMasahiro Yamada}
481dd88ab32SMasahiro Yamadabuild_types();
482dd88ab32SMasahiro Yamada
483dd88ab32SMasahiro Yamadaour $Typecast	= qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
484dd88ab32SMasahiro Yamada
485dd88ab32SMasahiro Yamada# Using $balanced_parens, $LvalOrFunc, or $FuncArg
486dd88ab32SMasahiro Yamada# requires at least perl version v5.10.0
487dd88ab32SMasahiro Yamada# Any use must be runtime checked with $^V
488dd88ab32SMasahiro Yamada
489dd88ab32SMasahiro Yamadaour $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
490dd88ab32SMasahiro Yamadaour $LvalOrFunc	= qr{($Lval)\s*($balanced_parens{0,1})\s*};
491dd88ab32SMasahiro Yamadaour $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};
492dd88ab32SMasahiro Yamada
493dd88ab32SMasahiro Yamadasub deparenthesize {
494dd88ab32SMasahiro Yamada	my ($string) = @_;
495dd88ab32SMasahiro Yamada	return "" if (!defined($string));
496dd88ab32SMasahiro Yamada	$string =~ s@^\s*\(\s*@@g;
497dd88ab32SMasahiro Yamada	$string =~ s@\s*\)\s*$@@g;
498dd88ab32SMasahiro Yamada	$string =~ s@\s+@ @g;
499dd88ab32SMasahiro Yamada	return $string;
500dd88ab32SMasahiro Yamada}
501dd88ab32SMasahiro Yamada
5026b9709d9STom Rinisub seed_camelcase_file {
5036b9709d9STom Rini	my ($file) = @_;
5046b9709d9STom Rini
5056b9709d9STom Rini	return if (!(-f $file));
5066b9709d9STom Rini
5076b9709d9STom Rini	local $/;
5086b9709d9STom Rini
5096b9709d9STom Rini	open(my $include_file, '<', "$file")
5106b9709d9STom Rini	    or warn "$P: Can't read '$file' $!\n";
5116b9709d9STom Rini	my $text = <$include_file>;
5126b9709d9STom Rini	close($include_file);
5136b9709d9STom Rini
5146b9709d9STom Rini	my @lines = split('\n', $text);
5156b9709d9STom Rini
5166b9709d9STom Rini	foreach my $line (@lines) {
5176b9709d9STom Rini		next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
5186b9709d9STom Rini		if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
5196b9709d9STom Rini			$camelcase{$1} = 1;
5206b9709d9STom Rini		} elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
5216b9709d9STom Rini			$camelcase{$1} = 1;
5226b9709d9STom Rini		} elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
5236b9709d9STom Rini			$camelcase{$1} = 1;
5246b9709d9STom Rini		}
5256b9709d9STom Rini	}
5266b9709d9STom Rini}
5276b9709d9STom Rini
5286b9709d9STom Rinimy $camelcase_seeded = 0;
5296b9709d9STom Rinisub seed_camelcase_includes {
5306b9709d9STom Rini	return if ($camelcase_seeded);
5316b9709d9STom Rini
5326b9709d9STom Rini	my $files;
5336b9709d9STom Rini	my $camelcase_cache = "";
5346b9709d9STom Rini	my @include_files = ();
5356b9709d9STom Rini
5366b9709d9STom Rini	$camelcase_seeded = 1;
5376b9709d9STom Rini
5386b9709d9STom Rini	if (-e ".git") {
5396b9709d9STom Rini		my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
5406b9709d9STom Rini		chomp $git_last_include_commit;
5416b9709d9STom Rini		$camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
5426b9709d9STom Rini	} else {
5436b9709d9STom Rini		my $last_mod_date = 0;
5446b9709d9STom Rini		$files = `find $root/include -name "*.h"`;
5456b9709d9STom Rini		@include_files = split('\n', $files);
5466b9709d9STom Rini		foreach my $file (@include_files) {
5476b9709d9STom Rini			my $date = POSIX::strftime("%Y%m%d%H%M",
5486b9709d9STom Rini						   localtime((stat $file)[9]));
5496b9709d9STom Rini			$last_mod_date = $date if ($last_mod_date < $date);
5506b9709d9STom Rini		}
5516b9709d9STom Rini		$camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
5526b9709d9STom Rini	}
5536b9709d9STom Rini
5546b9709d9STom Rini	if ($camelcase_cache ne "" && -f $camelcase_cache) {
5556b9709d9STom Rini		open(my $camelcase_file, '<', "$camelcase_cache")
5566b9709d9STom Rini		    or warn "$P: Can't read '$camelcase_cache' $!\n";
5576b9709d9STom Rini		while (<$camelcase_file>) {
5586b9709d9STom Rini			chomp;
5596b9709d9STom Rini			$camelcase{$_} = 1;
5606b9709d9STom Rini		}
5616b9709d9STom Rini		close($camelcase_file);
5626b9709d9STom Rini
5636b9709d9STom Rini		return;
5646b9709d9STom Rini	}
5656b9709d9STom Rini
5666b9709d9STom Rini	if (-e ".git") {
5676b9709d9STom Rini		$files = `git ls-files "include/*.h"`;
5686b9709d9STom Rini		@include_files = split('\n', $files);
5696b9709d9STom Rini	}
5706b9709d9STom Rini
5716b9709d9STom Rini	foreach my $file (@include_files) {
5726b9709d9STom Rini		seed_camelcase_file($file);
5736b9709d9STom Rini	}
5746b9709d9STom Rini
5756b9709d9STom Rini	if ($camelcase_cache ne "") {
5766b9709d9STom Rini		unlink glob ".checkpatch-camelcase.*";
5776b9709d9STom Rini		open(my $camelcase_file, '>', "$camelcase_cache")
5786b9709d9STom Rini		    or warn "$P: Can't write '$camelcase_cache' $!\n";
5796b9709d9STom Rini		foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
5806b9709d9STom Rini			print $camelcase_file ("$_\n");
5816b9709d9STom Rini		}
5826b9709d9STom Rini		close($camelcase_file);
5836b9709d9STom Rini	}
5846b9709d9STom Rini}
5856b9709d9STom Rini
586dd88ab32SMasahiro Yamada$chk_signoff = 0 if ($file);
587dd88ab32SMasahiro Yamada
588dd88ab32SMasahiro Yamadamy @rawlines = ();
589dd88ab32SMasahiro Yamadamy @lines = ();
5906b9709d9STom Rinimy @fixed = ();
591dd88ab32SMasahiro Yamadamy $vname;
592*c10e0f5bSDan Murphymy $fixlinenr = -1;
593*c10e0f5bSDan Murphy
594dd88ab32SMasahiro Yamadafor my $filename (@ARGV) {
595dd88ab32SMasahiro Yamada	my $FILE;
596dd88ab32SMasahiro Yamada	if ($file) {
597dd88ab32SMasahiro Yamada		open($FILE, '-|', "diff -u /dev/null $filename") ||
598dd88ab32SMasahiro Yamada			die "$P: $filename: diff failed - $!\n";
599dd88ab32SMasahiro Yamada	} elsif ($filename eq '-') {
600dd88ab32SMasahiro Yamada		open($FILE, '<&STDIN');
601dd88ab32SMasahiro Yamada	} else {
602dd88ab32SMasahiro Yamada		open($FILE, '<', "$filename") ||
603dd88ab32SMasahiro Yamada			die "$P: $filename: open failed - $!\n";
604dd88ab32SMasahiro Yamada	}
605dd88ab32SMasahiro Yamada	if ($filename eq '-') {
606dd88ab32SMasahiro Yamada		$vname = 'Your patch';
607dd88ab32SMasahiro Yamada	} else {
608dd88ab32SMasahiro Yamada		$vname = $filename;
609dd88ab32SMasahiro Yamada	}
610dd88ab32SMasahiro Yamada	while (<$FILE>) {
611dd88ab32SMasahiro Yamada		chomp;
612dd88ab32SMasahiro Yamada		push(@rawlines, $_);
613dd88ab32SMasahiro Yamada	}
614dd88ab32SMasahiro Yamada	close($FILE);
615dd88ab32SMasahiro Yamada	if (!process($filename)) {
616dd88ab32SMasahiro Yamada		$exit = 1;
617dd88ab32SMasahiro Yamada	}
618dd88ab32SMasahiro Yamada	@rawlines = ();
619dd88ab32SMasahiro Yamada	@lines = ();
6206b9709d9STom Rini	@fixed = ();
621dd88ab32SMasahiro Yamada}
622dd88ab32SMasahiro Yamada
623dd88ab32SMasahiro Yamadaexit($exit);
624dd88ab32SMasahiro Yamada
625dd88ab32SMasahiro Yamadasub top_of_kernel_tree {
626dd88ab32SMasahiro Yamada	my ($root) = @_;
627dd88ab32SMasahiro Yamada
628dd88ab32SMasahiro Yamada	my @tree_check = (
6296b9709d9STom Rini		"COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
630dd88ab32SMasahiro Yamada		"README", "Documentation", "arch", "include", "drivers",
631dd88ab32SMasahiro Yamada		"fs", "init", "ipc", "kernel", "lib", "scripts",
632dd88ab32SMasahiro Yamada	);
633dd88ab32SMasahiro Yamada
634dd88ab32SMasahiro Yamada	foreach my $check (@tree_check) {
635dd88ab32SMasahiro Yamada		if (! -e $root . '/' . $check) {
636dd88ab32SMasahiro Yamada			return 0;
637dd88ab32SMasahiro Yamada		}
638dd88ab32SMasahiro Yamada	}
639dd88ab32SMasahiro Yamada	return 1;
640dd88ab32SMasahiro Yamada}
641dd88ab32SMasahiro Yamada
642dd88ab32SMasahiro Yamadasub parse_email {
643dd88ab32SMasahiro Yamada	my ($formatted_email) = @_;
644dd88ab32SMasahiro Yamada
645dd88ab32SMasahiro Yamada	my $name = "";
646dd88ab32SMasahiro Yamada	my $address = "";
647dd88ab32SMasahiro Yamada	my $comment = "";
648dd88ab32SMasahiro Yamada
649dd88ab32SMasahiro Yamada	if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
650dd88ab32SMasahiro Yamada		$name = $1;
651dd88ab32SMasahiro Yamada		$address = $2;
652dd88ab32SMasahiro Yamada		$comment = $3 if defined $3;
653dd88ab32SMasahiro Yamada	} elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
654dd88ab32SMasahiro Yamada		$address = $1;
655dd88ab32SMasahiro Yamada		$comment = $2 if defined $2;
656dd88ab32SMasahiro Yamada	} elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
657dd88ab32SMasahiro Yamada		$address = $1;
658dd88ab32SMasahiro Yamada		$comment = $2 if defined $2;
659dd88ab32SMasahiro Yamada		$formatted_email =~ s/$address.*$//;
660dd88ab32SMasahiro Yamada		$name = $formatted_email;
6616b9709d9STom Rini		$name = trim($name);
662dd88ab32SMasahiro Yamada		$name =~ s/^\"|\"$//g;
663dd88ab32SMasahiro Yamada		# If there's a name left after stripping spaces and
664dd88ab32SMasahiro Yamada		# leading quotes, and the address doesn't have both
665dd88ab32SMasahiro Yamada		# leading and trailing angle brackets, the address
666dd88ab32SMasahiro Yamada		# is invalid. ie:
667dd88ab32SMasahiro Yamada		#   "joe smith joe@smith.com" bad
668dd88ab32SMasahiro Yamada		#   "joe smith <joe@smith.com" bad
669dd88ab32SMasahiro Yamada		if ($name ne "" && $address !~ /^<[^>]+>$/) {
670dd88ab32SMasahiro Yamada			$name = "";
671dd88ab32SMasahiro Yamada			$address = "";
672dd88ab32SMasahiro Yamada			$comment = "";
673dd88ab32SMasahiro Yamada		}
674dd88ab32SMasahiro Yamada	}
675dd88ab32SMasahiro Yamada
6766b9709d9STom Rini	$name = trim($name);
677dd88ab32SMasahiro Yamada	$name =~ s/^\"|\"$//g;
6786b9709d9STom Rini	$address = trim($address);
679dd88ab32SMasahiro Yamada	$address =~ s/^\<|\>$//g;
680dd88ab32SMasahiro Yamada
681dd88ab32SMasahiro Yamada	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
682dd88ab32SMasahiro Yamada		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
683dd88ab32SMasahiro Yamada		$name = "\"$name\"";
684dd88ab32SMasahiro Yamada	}
685dd88ab32SMasahiro Yamada
686dd88ab32SMasahiro Yamada	return ($name, $address, $comment);
687dd88ab32SMasahiro Yamada}
688dd88ab32SMasahiro Yamada
689dd88ab32SMasahiro Yamadasub format_email {
690dd88ab32SMasahiro Yamada	my ($name, $address) = @_;
691dd88ab32SMasahiro Yamada
692dd88ab32SMasahiro Yamada	my $formatted_email;
693dd88ab32SMasahiro Yamada
6946b9709d9STom Rini	$name = trim($name);
695dd88ab32SMasahiro Yamada	$name =~ s/^\"|\"$//g;
6966b9709d9STom Rini	$address = trim($address);
697dd88ab32SMasahiro Yamada
698dd88ab32SMasahiro Yamada	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
699dd88ab32SMasahiro Yamada		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
700dd88ab32SMasahiro Yamada		$name = "\"$name\"";
701dd88ab32SMasahiro Yamada	}
702dd88ab32SMasahiro Yamada
703dd88ab32SMasahiro Yamada	if ("$name" eq "") {
704dd88ab32SMasahiro Yamada		$formatted_email = "$address";
705dd88ab32SMasahiro Yamada	} else {
706dd88ab32SMasahiro Yamada		$formatted_email = "$name <$address>";
707dd88ab32SMasahiro Yamada	}
708dd88ab32SMasahiro Yamada
709dd88ab32SMasahiro Yamada	return $formatted_email;
710dd88ab32SMasahiro Yamada}
711dd88ab32SMasahiro Yamada
712dd88ab32SMasahiro Yamadasub which_conf {
713dd88ab32SMasahiro Yamada	my ($conf) = @_;
714dd88ab32SMasahiro Yamada
715dd88ab32SMasahiro Yamada	foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
716dd88ab32SMasahiro Yamada		if (-e "$path/$conf") {
717dd88ab32SMasahiro Yamada			return "$path/$conf";
718dd88ab32SMasahiro Yamada		}
719dd88ab32SMasahiro Yamada	}
720dd88ab32SMasahiro Yamada
721dd88ab32SMasahiro Yamada	return "";
722dd88ab32SMasahiro Yamada}
723dd88ab32SMasahiro Yamada
724dd88ab32SMasahiro Yamadasub expand_tabs {
725dd88ab32SMasahiro Yamada	my ($str) = @_;
726dd88ab32SMasahiro Yamada
727dd88ab32SMasahiro Yamada	my $res = '';
728dd88ab32SMasahiro Yamada	my $n = 0;
729dd88ab32SMasahiro Yamada	for my $c (split(//, $str)) {
730dd88ab32SMasahiro Yamada		if ($c eq "\t") {
731dd88ab32SMasahiro Yamada			$res .= ' ';
732dd88ab32SMasahiro Yamada			$n++;
733dd88ab32SMasahiro Yamada			for (; ($n % 8) != 0; $n++) {
734dd88ab32SMasahiro Yamada				$res .= ' ';
735dd88ab32SMasahiro Yamada			}
736dd88ab32SMasahiro Yamada			next;
737dd88ab32SMasahiro Yamada		}
738dd88ab32SMasahiro Yamada		$res .= $c;
739dd88ab32SMasahiro Yamada		$n++;
740dd88ab32SMasahiro Yamada	}
741dd88ab32SMasahiro Yamada
742dd88ab32SMasahiro Yamada	return $res;
743dd88ab32SMasahiro Yamada}
744dd88ab32SMasahiro Yamadasub copy_spacing {
745dd88ab32SMasahiro Yamada	(my $res = shift) =~ tr/\t/ /c;
746dd88ab32SMasahiro Yamada	return $res;
747dd88ab32SMasahiro Yamada}
748dd88ab32SMasahiro Yamada
749dd88ab32SMasahiro Yamadasub line_stats {
750dd88ab32SMasahiro Yamada	my ($line) = @_;
751dd88ab32SMasahiro Yamada
752dd88ab32SMasahiro Yamada	# Drop the diff line leader and expand tabs
753dd88ab32SMasahiro Yamada	$line =~ s/^.//;
754dd88ab32SMasahiro Yamada	$line = expand_tabs($line);
755dd88ab32SMasahiro Yamada
756dd88ab32SMasahiro Yamada	# Pick the indent from the front of the line.
757dd88ab32SMasahiro Yamada	my ($white) = ($line =~ /^(\s*)/);
758dd88ab32SMasahiro Yamada
759dd88ab32SMasahiro Yamada	return (length($line), length($white));
760dd88ab32SMasahiro Yamada}
761dd88ab32SMasahiro Yamada
762dd88ab32SMasahiro Yamadamy $sanitise_quote = '';
763dd88ab32SMasahiro Yamada
764dd88ab32SMasahiro Yamadasub sanitise_line_reset {
765dd88ab32SMasahiro Yamada	my ($in_comment) = @_;
766dd88ab32SMasahiro Yamada
767dd88ab32SMasahiro Yamada	if ($in_comment) {
768dd88ab32SMasahiro Yamada		$sanitise_quote = '*/';
769dd88ab32SMasahiro Yamada	} else {
770dd88ab32SMasahiro Yamada		$sanitise_quote = '';
771dd88ab32SMasahiro Yamada	}
772dd88ab32SMasahiro Yamada}
773dd88ab32SMasahiro Yamadasub sanitise_line {
774dd88ab32SMasahiro Yamada	my ($line) = @_;
775dd88ab32SMasahiro Yamada
776dd88ab32SMasahiro Yamada	my $res = '';
777dd88ab32SMasahiro Yamada	my $l = '';
778dd88ab32SMasahiro Yamada
779dd88ab32SMasahiro Yamada	my $qlen = 0;
780dd88ab32SMasahiro Yamada	my $off = 0;
781dd88ab32SMasahiro Yamada	my $c;
782dd88ab32SMasahiro Yamada
783dd88ab32SMasahiro Yamada	# Always copy over the diff marker.
784dd88ab32SMasahiro Yamada	$res = substr($line, 0, 1);
785dd88ab32SMasahiro Yamada
786dd88ab32SMasahiro Yamada	for ($off = 1; $off < length($line); $off++) {
787dd88ab32SMasahiro Yamada		$c = substr($line, $off, 1);
788dd88ab32SMasahiro Yamada
789dd88ab32SMasahiro Yamada		# Comments we are wacking completly including the begin
790dd88ab32SMasahiro Yamada		# and end, all to $;.
791dd88ab32SMasahiro Yamada		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
792dd88ab32SMasahiro Yamada			$sanitise_quote = '*/';
793dd88ab32SMasahiro Yamada
794dd88ab32SMasahiro Yamada			substr($res, $off, 2, "$;$;");
795dd88ab32SMasahiro Yamada			$off++;
796dd88ab32SMasahiro Yamada			next;
797dd88ab32SMasahiro Yamada		}
798dd88ab32SMasahiro Yamada		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
799dd88ab32SMasahiro Yamada			$sanitise_quote = '';
800dd88ab32SMasahiro Yamada			substr($res, $off, 2, "$;$;");
801dd88ab32SMasahiro Yamada			$off++;
802dd88ab32SMasahiro Yamada			next;
803dd88ab32SMasahiro Yamada		}
804dd88ab32SMasahiro Yamada		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
805dd88ab32SMasahiro Yamada			$sanitise_quote = '//';
806dd88ab32SMasahiro Yamada
807dd88ab32SMasahiro Yamada			substr($res, $off, 2, $sanitise_quote);
808dd88ab32SMasahiro Yamada			$off++;
809dd88ab32SMasahiro Yamada			next;
810dd88ab32SMasahiro Yamada		}
811dd88ab32SMasahiro Yamada
812dd88ab32SMasahiro Yamada		# A \ in a string means ignore the next character.
813dd88ab32SMasahiro Yamada		if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
814dd88ab32SMasahiro Yamada		    $c eq "\\") {
815dd88ab32SMasahiro Yamada			substr($res, $off, 2, 'XX');
816dd88ab32SMasahiro Yamada			$off++;
817dd88ab32SMasahiro Yamada			next;
818dd88ab32SMasahiro Yamada		}
819dd88ab32SMasahiro Yamada		# Regular quotes.
820dd88ab32SMasahiro Yamada		if ($c eq "'" || $c eq '"') {
821dd88ab32SMasahiro Yamada			if ($sanitise_quote eq '') {
822dd88ab32SMasahiro Yamada				$sanitise_quote = $c;
823dd88ab32SMasahiro Yamada
824dd88ab32SMasahiro Yamada				substr($res, $off, 1, $c);
825dd88ab32SMasahiro Yamada				next;
826dd88ab32SMasahiro Yamada			} elsif ($sanitise_quote eq $c) {
827dd88ab32SMasahiro Yamada				$sanitise_quote = '';
828dd88ab32SMasahiro Yamada			}
829dd88ab32SMasahiro Yamada		}
830dd88ab32SMasahiro Yamada
831dd88ab32SMasahiro Yamada		#print "c<$c> SQ<$sanitise_quote>\n";
832dd88ab32SMasahiro Yamada		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
833dd88ab32SMasahiro Yamada			substr($res, $off, 1, $;);
834dd88ab32SMasahiro Yamada		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
835dd88ab32SMasahiro Yamada			substr($res, $off, 1, $;);
836dd88ab32SMasahiro Yamada		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
837dd88ab32SMasahiro Yamada			substr($res, $off, 1, 'X');
838dd88ab32SMasahiro Yamada		} else {
839dd88ab32SMasahiro Yamada			substr($res, $off, 1, $c);
840dd88ab32SMasahiro Yamada		}
841dd88ab32SMasahiro Yamada	}
842dd88ab32SMasahiro Yamada
843dd88ab32SMasahiro Yamada	if ($sanitise_quote eq '//') {
844dd88ab32SMasahiro Yamada		$sanitise_quote = '';
845dd88ab32SMasahiro Yamada	}
846dd88ab32SMasahiro Yamada
847dd88ab32SMasahiro Yamada	# The pathname on a #include may be surrounded by '<' and '>'.
848dd88ab32SMasahiro Yamada	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
849dd88ab32SMasahiro Yamada		my $clean = 'X' x length($1);
850dd88ab32SMasahiro Yamada		$res =~ s@\<.*\>@<$clean>@;
851dd88ab32SMasahiro Yamada
852dd88ab32SMasahiro Yamada	# The whole of a #error is a string.
853dd88ab32SMasahiro Yamada	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
854dd88ab32SMasahiro Yamada		my $clean = 'X' x length($1);
855dd88ab32SMasahiro Yamada		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
856dd88ab32SMasahiro Yamada	}
857dd88ab32SMasahiro Yamada
858dd88ab32SMasahiro Yamada	return $res;
859dd88ab32SMasahiro Yamada}
860dd88ab32SMasahiro Yamada
8616b9709d9STom Rinisub get_quoted_string {
8626b9709d9STom Rini	my ($line, $rawline) = @_;
8636b9709d9STom Rini
8646b9709d9STom Rini	return "" if ($line !~ m/(\"[X]+\")/g);
8656b9709d9STom Rini	return substr($rawline, $-[0], $+[0] - $-[0]);
8666b9709d9STom Rini}
8676b9709d9STom Rini
868dd88ab32SMasahiro Yamadasub ctx_statement_block {
869dd88ab32SMasahiro Yamada	my ($linenr, $remain, $off) = @_;
870dd88ab32SMasahiro Yamada	my $line = $linenr - 1;
871dd88ab32SMasahiro Yamada	my $blk = '';
872dd88ab32SMasahiro Yamada	my $soff = $off;
873dd88ab32SMasahiro Yamada	my $coff = $off - 1;
874dd88ab32SMasahiro Yamada	my $coff_set = 0;
875dd88ab32SMasahiro Yamada
876dd88ab32SMasahiro Yamada	my $loff = 0;
877dd88ab32SMasahiro Yamada
878dd88ab32SMasahiro Yamada	my $type = '';
879dd88ab32SMasahiro Yamada	my $level = 0;
880dd88ab32SMasahiro Yamada	my @stack = ();
881dd88ab32SMasahiro Yamada	my $p;
882dd88ab32SMasahiro Yamada	my $c;
883dd88ab32SMasahiro Yamada	my $len = 0;
884dd88ab32SMasahiro Yamada
885dd88ab32SMasahiro Yamada	my $remainder;
886dd88ab32SMasahiro Yamada	while (1) {
887dd88ab32SMasahiro Yamada		@stack = (['', 0]) if ($#stack == -1);
888dd88ab32SMasahiro Yamada
889dd88ab32SMasahiro Yamada		#warn "CSB: blk<$blk> remain<$remain>\n";
890dd88ab32SMasahiro Yamada		# If we are about to drop off the end, pull in more
891dd88ab32SMasahiro Yamada		# context.
892dd88ab32SMasahiro Yamada		if ($off >= $len) {
893dd88ab32SMasahiro Yamada			for (; $remain > 0; $line++) {
894dd88ab32SMasahiro Yamada				last if (!defined $lines[$line]);
895dd88ab32SMasahiro Yamada				next if ($lines[$line] =~ /^-/);
896dd88ab32SMasahiro Yamada				$remain--;
897dd88ab32SMasahiro Yamada				$loff = $len;
898dd88ab32SMasahiro Yamada				$blk .= $lines[$line] . "\n";
899dd88ab32SMasahiro Yamada				$len = length($blk);
900dd88ab32SMasahiro Yamada				$line++;
901dd88ab32SMasahiro Yamada				last;
902dd88ab32SMasahiro Yamada			}
903dd88ab32SMasahiro Yamada			# Bail if there is no further context.
904dd88ab32SMasahiro Yamada			#warn "CSB: blk<$blk> off<$off> len<$len>\n";
905dd88ab32SMasahiro Yamada			if ($off >= $len) {
906dd88ab32SMasahiro Yamada				last;
907dd88ab32SMasahiro Yamada			}
908dd88ab32SMasahiro Yamada			if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
909dd88ab32SMasahiro Yamada				$level++;
910dd88ab32SMasahiro Yamada				$type = '#';
911dd88ab32SMasahiro Yamada			}
912dd88ab32SMasahiro Yamada		}
913dd88ab32SMasahiro Yamada		$p = $c;
914dd88ab32SMasahiro Yamada		$c = substr($blk, $off, 1);
915dd88ab32SMasahiro Yamada		$remainder = substr($blk, $off);
916dd88ab32SMasahiro Yamada
917dd88ab32SMasahiro Yamada		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
918dd88ab32SMasahiro Yamada
919dd88ab32SMasahiro Yamada		# Handle nested #if/#else.
920dd88ab32SMasahiro Yamada		if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
921dd88ab32SMasahiro Yamada			push(@stack, [ $type, $level ]);
922dd88ab32SMasahiro Yamada		} elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
923dd88ab32SMasahiro Yamada			($type, $level) = @{$stack[$#stack - 1]};
924dd88ab32SMasahiro Yamada		} elsif ($remainder =~ /^#\s*endif\b/) {
925dd88ab32SMasahiro Yamada			($type, $level) = @{pop(@stack)};
926dd88ab32SMasahiro Yamada		}
927dd88ab32SMasahiro Yamada
928dd88ab32SMasahiro Yamada		# Statement ends at the ';' or a close '}' at the
929dd88ab32SMasahiro Yamada		# outermost level.
930dd88ab32SMasahiro Yamada		if ($level == 0 && $c eq ';') {
931dd88ab32SMasahiro Yamada			last;
932dd88ab32SMasahiro Yamada		}
933dd88ab32SMasahiro Yamada
934dd88ab32SMasahiro Yamada		# An else is really a conditional as long as its not else if
935dd88ab32SMasahiro Yamada		if ($level == 0 && $coff_set == 0 &&
936dd88ab32SMasahiro Yamada				(!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
937dd88ab32SMasahiro Yamada				$remainder =~ /^(else)(?:\s|{)/ &&
938dd88ab32SMasahiro Yamada				$remainder !~ /^else\s+if\b/) {
939dd88ab32SMasahiro Yamada			$coff = $off + length($1) - 1;
940dd88ab32SMasahiro Yamada			$coff_set = 1;
941dd88ab32SMasahiro Yamada			#warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
942dd88ab32SMasahiro Yamada			#warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
943dd88ab32SMasahiro Yamada		}
944dd88ab32SMasahiro Yamada
945dd88ab32SMasahiro Yamada		if (($type eq '' || $type eq '(') && $c eq '(') {
946dd88ab32SMasahiro Yamada			$level++;
947dd88ab32SMasahiro Yamada			$type = '(';
948dd88ab32SMasahiro Yamada		}
949dd88ab32SMasahiro Yamada		if ($type eq '(' && $c eq ')') {
950dd88ab32SMasahiro Yamada			$level--;
951dd88ab32SMasahiro Yamada			$type = ($level != 0)? '(' : '';
952dd88ab32SMasahiro Yamada
953dd88ab32SMasahiro Yamada			if ($level == 0 && $coff < $soff) {
954dd88ab32SMasahiro Yamada				$coff = $off;
955dd88ab32SMasahiro Yamada				$coff_set = 1;
956dd88ab32SMasahiro Yamada				#warn "CSB: mark coff<$coff>\n";
957dd88ab32SMasahiro Yamada			}
958dd88ab32SMasahiro Yamada		}
959dd88ab32SMasahiro Yamada		if (($type eq '' || $type eq '{') && $c eq '{') {
960dd88ab32SMasahiro Yamada			$level++;
961dd88ab32SMasahiro Yamada			$type = '{';
962dd88ab32SMasahiro Yamada		}
963dd88ab32SMasahiro Yamada		if ($type eq '{' && $c eq '}') {
964dd88ab32SMasahiro Yamada			$level--;
965dd88ab32SMasahiro Yamada			$type = ($level != 0)? '{' : '';
966dd88ab32SMasahiro Yamada
967dd88ab32SMasahiro Yamada			if ($level == 0) {
968dd88ab32SMasahiro Yamada				if (substr($blk, $off + 1, 1) eq ';') {
969dd88ab32SMasahiro Yamada					$off++;
970dd88ab32SMasahiro Yamada				}
971dd88ab32SMasahiro Yamada				last;
972dd88ab32SMasahiro Yamada			}
973dd88ab32SMasahiro Yamada		}
974dd88ab32SMasahiro Yamada		# Preprocessor commands end at the newline unless escaped.
975dd88ab32SMasahiro Yamada		if ($type eq '#' && $c eq "\n" && $p ne "\\") {
976dd88ab32SMasahiro Yamada			$level--;
977dd88ab32SMasahiro Yamada			$type = '';
978dd88ab32SMasahiro Yamada			$off++;
979dd88ab32SMasahiro Yamada			last;
980dd88ab32SMasahiro Yamada		}
981dd88ab32SMasahiro Yamada		$off++;
982dd88ab32SMasahiro Yamada	}
983dd88ab32SMasahiro Yamada	# We are truly at the end, so shuffle to the next line.
984dd88ab32SMasahiro Yamada	if ($off == $len) {
985dd88ab32SMasahiro Yamada		$loff = $len + 1;
986dd88ab32SMasahiro Yamada		$line++;
987dd88ab32SMasahiro Yamada		$remain--;
988dd88ab32SMasahiro Yamada	}
989dd88ab32SMasahiro Yamada
990dd88ab32SMasahiro Yamada	my $statement = substr($blk, $soff, $off - $soff + 1);
991dd88ab32SMasahiro Yamada	my $condition = substr($blk, $soff, $coff - $soff + 1);
992dd88ab32SMasahiro Yamada
993dd88ab32SMasahiro Yamada	#warn "STATEMENT<$statement>\n";
994dd88ab32SMasahiro Yamada	#warn "CONDITION<$condition>\n";
995dd88ab32SMasahiro Yamada
996dd88ab32SMasahiro Yamada	#print "coff<$coff> soff<$off> loff<$loff>\n";
997dd88ab32SMasahiro Yamada
998dd88ab32SMasahiro Yamada	return ($statement, $condition,
999dd88ab32SMasahiro Yamada			$line, $remain + 1, $off - $loff + 1, $level);
1000dd88ab32SMasahiro Yamada}
1001dd88ab32SMasahiro Yamada
1002dd88ab32SMasahiro Yamadasub statement_lines {
1003dd88ab32SMasahiro Yamada	my ($stmt) = @_;
1004dd88ab32SMasahiro Yamada
1005dd88ab32SMasahiro Yamada	# Strip the diff line prefixes and rip blank lines at start and end.
1006dd88ab32SMasahiro Yamada	$stmt =~ s/(^|\n)./$1/g;
1007dd88ab32SMasahiro Yamada	$stmt =~ s/^\s*//;
1008dd88ab32SMasahiro Yamada	$stmt =~ s/\s*$//;
1009dd88ab32SMasahiro Yamada
1010dd88ab32SMasahiro Yamada	my @stmt_lines = ($stmt =~ /\n/g);
1011dd88ab32SMasahiro Yamada
1012dd88ab32SMasahiro Yamada	return $#stmt_lines + 2;
1013dd88ab32SMasahiro Yamada}
1014dd88ab32SMasahiro Yamada
1015dd88ab32SMasahiro Yamadasub statement_rawlines {
1016dd88ab32SMasahiro Yamada	my ($stmt) = @_;
1017dd88ab32SMasahiro Yamada
1018dd88ab32SMasahiro Yamada	my @stmt_lines = ($stmt =~ /\n/g);
1019dd88ab32SMasahiro Yamada
1020dd88ab32SMasahiro Yamada	return $#stmt_lines + 2;
1021dd88ab32SMasahiro Yamada}
1022dd88ab32SMasahiro Yamada
1023dd88ab32SMasahiro Yamadasub statement_block_size {
1024dd88ab32SMasahiro Yamada	my ($stmt) = @_;
1025dd88ab32SMasahiro Yamada
1026dd88ab32SMasahiro Yamada	$stmt =~ s/(^|\n)./$1/g;
1027dd88ab32SMasahiro Yamada	$stmt =~ s/^\s*{//;
1028dd88ab32SMasahiro Yamada	$stmt =~ s/}\s*$//;
1029dd88ab32SMasahiro Yamada	$stmt =~ s/^\s*//;
1030dd88ab32SMasahiro Yamada	$stmt =~ s/\s*$//;
1031dd88ab32SMasahiro Yamada
1032dd88ab32SMasahiro Yamada	my @stmt_lines = ($stmt =~ /\n/g);
1033dd88ab32SMasahiro Yamada	my @stmt_statements = ($stmt =~ /;/g);
1034dd88ab32SMasahiro Yamada
1035dd88ab32SMasahiro Yamada	my $stmt_lines = $#stmt_lines + 2;
1036dd88ab32SMasahiro Yamada	my $stmt_statements = $#stmt_statements + 1;
1037dd88ab32SMasahiro Yamada
1038dd88ab32SMasahiro Yamada	if ($stmt_lines > $stmt_statements) {
1039dd88ab32SMasahiro Yamada		return $stmt_lines;
1040dd88ab32SMasahiro Yamada	} else {
1041dd88ab32SMasahiro Yamada		return $stmt_statements;
1042dd88ab32SMasahiro Yamada	}
1043dd88ab32SMasahiro Yamada}
1044dd88ab32SMasahiro Yamada
1045dd88ab32SMasahiro Yamadasub ctx_statement_full {
1046dd88ab32SMasahiro Yamada	my ($linenr, $remain, $off) = @_;
1047dd88ab32SMasahiro Yamada	my ($statement, $condition, $level);
1048dd88ab32SMasahiro Yamada
1049dd88ab32SMasahiro Yamada	my (@chunks);
1050dd88ab32SMasahiro Yamada
1051dd88ab32SMasahiro Yamada	# Grab the first conditional/block pair.
1052dd88ab32SMasahiro Yamada	($statement, $condition, $linenr, $remain, $off, $level) =
1053dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $remain, $off);
1054dd88ab32SMasahiro Yamada	#print "F: c<$condition> s<$statement> remain<$remain>\n";
1055dd88ab32SMasahiro Yamada	push(@chunks, [ $condition, $statement ]);
1056dd88ab32SMasahiro Yamada	if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
1057dd88ab32SMasahiro Yamada		return ($level, $linenr, @chunks);
1058dd88ab32SMasahiro Yamada	}
1059dd88ab32SMasahiro Yamada
1060dd88ab32SMasahiro Yamada	# Pull in the following conditional/block pairs and see if they
1061dd88ab32SMasahiro Yamada	# could continue the statement.
1062dd88ab32SMasahiro Yamada	for (;;) {
1063dd88ab32SMasahiro Yamada		($statement, $condition, $linenr, $remain, $off, $level) =
1064dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $remain, $off);
1065dd88ab32SMasahiro Yamada		#print "C: c<$condition> s<$statement> remain<$remain>\n";
1066dd88ab32SMasahiro Yamada		last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
1067dd88ab32SMasahiro Yamada		#print "C: push\n";
1068dd88ab32SMasahiro Yamada		push(@chunks, [ $condition, $statement ]);
1069dd88ab32SMasahiro Yamada	}
1070dd88ab32SMasahiro Yamada
1071dd88ab32SMasahiro Yamada	return ($level, $linenr, @chunks);
1072dd88ab32SMasahiro Yamada}
1073dd88ab32SMasahiro Yamada
1074dd88ab32SMasahiro Yamadasub ctx_block_get {
1075dd88ab32SMasahiro Yamada	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
1076dd88ab32SMasahiro Yamada	my $line;
1077dd88ab32SMasahiro Yamada	my $start = $linenr - 1;
1078dd88ab32SMasahiro Yamada	my $blk = '';
1079dd88ab32SMasahiro Yamada	my @o;
1080dd88ab32SMasahiro Yamada	my @c;
1081dd88ab32SMasahiro Yamada	my @res = ();
1082dd88ab32SMasahiro Yamada
1083dd88ab32SMasahiro Yamada	my $level = 0;
1084dd88ab32SMasahiro Yamada	my @stack = ($level);
1085dd88ab32SMasahiro Yamada	for ($line = $start; $remain > 0; $line++) {
1086dd88ab32SMasahiro Yamada		next if ($rawlines[$line] =~ /^-/);
1087dd88ab32SMasahiro Yamada		$remain--;
1088dd88ab32SMasahiro Yamada
1089dd88ab32SMasahiro Yamada		$blk .= $rawlines[$line];
1090dd88ab32SMasahiro Yamada
1091dd88ab32SMasahiro Yamada		# Handle nested #if/#else.
1092dd88ab32SMasahiro Yamada		if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
1093dd88ab32SMasahiro Yamada			push(@stack, $level);
1094dd88ab32SMasahiro Yamada		} elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
1095dd88ab32SMasahiro Yamada			$level = $stack[$#stack - 1];
1096dd88ab32SMasahiro Yamada		} elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
1097dd88ab32SMasahiro Yamada			$level = pop(@stack);
1098dd88ab32SMasahiro Yamada		}
1099dd88ab32SMasahiro Yamada
1100dd88ab32SMasahiro Yamada		foreach my $c (split(//, $lines[$line])) {
1101dd88ab32SMasahiro Yamada			##print "C<$c>L<$level><$open$close>O<$off>\n";
1102dd88ab32SMasahiro Yamada			if ($off > 0) {
1103dd88ab32SMasahiro Yamada				$off--;
1104dd88ab32SMasahiro Yamada				next;
1105dd88ab32SMasahiro Yamada			}
1106dd88ab32SMasahiro Yamada
1107dd88ab32SMasahiro Yamada			if ($c eq $close && $level > 0) {
1108dd88ab32SMasahiro Yamada				$level--;
1109dd88ab32SMasahiro Yamada				last if ($level == 0);
1110dd88ab32SMasahiro Yamada			} elsif ($c eq $open) {
1111dd88ab32SMasahiro Yamada				$level++;
1112dd88ab32SMasahiro Yamada			}
1113dd88ab32SMasahiro Yamada		}
1114dd88ab32SMasahiro Yamada
1115dd88ab32SMasahiro Yamada		if (!$outer || $level <= 1) {
1116dd88ab32SMasahiro Yamada			push(@res, $rawlines[$line]);
1117dd88ab32SMasahiro Yamada		}
1118dd88ab32SMasahiro Yamada
1119dd88ab32SMasahiro Yamada		last if ($level == 0);
1120dd88ab32SMasahiro Yamada	}
1121dd88ab32SMasahiro Yamada
1122dd88ab32SMasahiro Yamada	return ($level, @res);
1123dd88ab32SMasahiro Yamada}
1124dd88ab32SMasahiro Yamadasub ctx_block_outer {
1125dd88ab32SMasahiro Yamada	my ($linenr, $remain) = @_;
1126dd88ab32SMasahiro Yamada
1127dd88ab32SMasahiro Yamada	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
1128dd88ab32SMasahiro Yamada	return @r;
1129dd88ab32SMasahiro Yamada}
1130dd88ab32SMasahiro Yamadasub ctx_block {
1131dd88ab32SMasahiro Yamada	my ($linenr, $remain) = @_;
1132dd88ab32SMasahiro Yamada
1133dd88ab32SMasahiro Yamada	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1134dd88ab32SMasahiro Yamada	return @r;
1135dd88ab32SMasahiro Yamada}
1136dd88ab32SMasahiro Yamadasub ctx_statement {
1137dd88ab32SMasahiro Yamada	my ($linenr, $remain, $off) = @_;
1138dd88ab32SMasahiro Yamada
1139dd88ab32SMasahiro Yamada	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1140dd88ab32SMasahiro Yamada	return @r;
1141dd88ab32SMasahiro Yamada}
1142dd88ab32SMasahiro Yamadasub ctx_block_level {
1143dd88ab32SMasahiro Yamada	my ($linenr, $remain) = @_;
1144dd88ab32SMasahiro Yamada
1145dd88ab32SMasahiro Yamada	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1146dd88ab32SMasahiro Yamada}
1147dd88ab32SMasahiro Yamadasub ctx_statement_level {
1148dd88ab32SMasahiro Yamada	my ($linenr, $remain, $off) = @_;
1149dd88ab32SMasahiro Yamada
1150dd88ab32SMasahiro Yamada	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1151dd88ab32SMasahiro Yamada}
1152dd88ab32SMasahiro Yamada
1153dd88ab32SMasahiro Yamadasub ctx_locate_comment {
1154dd88ab32SMasahiro Yamada	my ($first_line, $end_line) = @_;
1155dd88ab32SMasahiro Yamada
1156dd88ab32SMasahiro Yamada	# Catch a comment on the end of the line itself.
1157dd88ab32SMasahiro Yamada	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
1158dd88ab32SMasahiro Yamada	return $current_comment if (defined $current_comment);
1159dd88ab32SMasahiro Yamada
1160dd88ab32SMasahiro Yamada	# Look through the context and try and figure out if there is a
1161dd88ab32SMasahiro Yamada	# comment.
1162dd88ab32SMasahiro Yamada	my $in_comment = 0;
1163dd88ab32SMasahiro Yamada	$current_comment = '';
1164dd88ab32SMasahiro Yamada	for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
1165dd88ab32SMasahiro Yamada		my $line = $rawlines[$linenr - 1];
1166dd88ab32SMasahiro Yamada		#warn "           $line\n";
1167dd88ab32SMasahiro Yamada		if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
1168dd88ab32SMasahiro Yamada			$in_comment = 1;
1169dd88ab32SMasahiro Yamada		}
1170dd88ab32SMasahiro Yamada		if ($line =~ m@/\*@) {
1171dd88ab32SMasahiro Yamada			$in_comment = 1;
1172dd88ab32SMasahiro Yamada		}
1173dd88ab32SMasahiro Yamada		if (!$in_comment && $current_comment ne '') {
1174dd88ab32SMasahiro Yamada			$current_comment = '';
1175dd88ab32SMasahiro Yamada		}
1176dd88ab32SMasahiro Yamada		$current_comment .= $line . "\n" if ($in_comment);
1177dd88ab32SMasahiro Yamada		if ($line =~ m@\*/@) {
1178dd88ab32SMasahiro Yamada			$in_comment = 0;
1179dd88ab32SMasahiro Yamada		}
1180dd88ab32SMasahiro Yamada	}
1181dd88ab32SMasahiro Yamada
1182dd88ab32SMasahiro Yamada	chomp($current_comment);
1183dd88ab32SMasahiro Yamada	return($current_comment);
1184dd88ab32SMasahiro Yamada}
1185dd88ab32SMasahiro Yamadasub ctx_has_comment {
1186dd88ab32SMasahiro Yamada	my ($first_line, $end_line) = @_;
1187dd88ab32SMasahiro Yamada	my $cmt = ctx_locate_comment($first_line, $end_line);
1188dd88ab32SMasahiro Yamada
1189dd88ab32SMasahiro Yamada	##print "LINE: $rawlines[$end_line - 1 ]\n";
1190dd88ab32SMasahiro Yamada	##print "CMMT: $cmt\n";
1191dd88ab32SMasahiro Yamada
1192dd88ab32SMasahiro Yamada	return ($cmt ne '');
1193dd88ab32SMasahiro Yamada}
1194dd88ab32SMasahiro Yamada
1195dd88ab32SMasahiro Yamadasub raw_line {
1196dd88ab32SMasahiro Yamada	my ($linenr, $cnt) = @_;
1197dd88ab32SMasahiro Yamada
1198dd88ab32SMasahiro Yamada	my $offset = $linenr - 1;
1199dd88ab32SMasahiro Yamada	$cnt++;
1200dd88ab32SMasahiro Yamada
1201dd88ab32SMasahiro Yamada	my $line;
1202dd88ab32SMasahiro Yamada	while ($cnt) {
1203dd88ab32SMasahiro Yamada		$line = $rawlines[$offset++];
1204dd88ab32SMasahiro Yamada		next if (defined($line) && $line =~ /^-/);
1205dd88ab32SMasahiro Yamada		$cnt--;
1206dd88ab32SMasahiro Yamada	}
1207dd88ab32SMasahiro Yamada
1208dd88ab32SMasahiro Yamada	return $line;
1209dd88ab32SMasahiro Yamada}
1210dd88ab32SMasahiro Yamada
1211dd88ab32SMasahiro Yamadasub cat_vet {
1212dd88ab32SMasahiro Yamada	my ($vet) = @_;
1213dd88ab32SMasahiro Yamada	my ($res, $coded);
1214dd88ab32SMasahiro Yamada
1215dd88ab32SMasahiro Yamada	$res = '';
1216dd88ab32SMasahiro Yamada	while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
1217dd88ab32SMasahiro Yamada		$res .= $1;
1218dd88ab32SMasahiro Yamada		if ($2 ne '') {
1219dd88ab32SMasahiro Yamada			$coded = sprintf("^%c", unpack('C', $2) + 64);
1220dd88ab32SMasahiro Yamada			$res .= $coded;
1221dd88ab32SMasahiro Yamada		}
1222dd88ab32SMasahiro Yamada	}
1223dd88ab32SMasahiro Yamada	$res =~ s/$/\$/;
1224dd88ab32SMasahiro Yamada
1225dd88ab32SMasahiro Yamada	return $res;
1226dd88ab32SMasahiro Yamada}
1227dd88ab32SMasahiro Yamada
1228dd88ab32SMasahiro Yamadamy $av_preprocessor = 0;
1229dd88ab32SMasahiro Yamadamy $av_pending;
1230dd88ab32SMasahiro Yamadamy @av_paren_type;
1231dd88ab32SMasahiro Yamadamy $av_pend_colon;
1232dd88ab32SMasahiro Yamada
1233dd88ab32SMasahiro Yamadasub annotate_reset {
1234dd88ab32SMasahiro Yamada	$av_preprocessor = 0;
1235dd88ab32SMasahiro Yamada	$av_pending = '_';
1236dd88ab32SMasahiro Yamada	@av_paren_type = ('E');
1237dd88ab32SMasahiro Yamada	$av_pend_colon = 'O';
1238dd88ab32SMasahiro Yamada}
1239dd88ab32SMasahiro Yamada
1240dd88ab32SMasahiro Yamadasub annotate_values {
1241dd88ab32SMasahiro Yamada	my ($stream, $type) = @_;
1242dd88ab32SMasahiro Yamada
1243dd88ab32SMasahiro Yamada	my $res;
1244dd88ab32SMasahiro Yamada	my $var = '_' x length($stream);
1245dd88ab32SMasahiro Yamada	my $cur = $stream;
1246dd88ab32SMasahiro Yamada
1247dd88ab32SMasahiro Yamada	print "$stream\n" if ($dbg_values > 1);
1248dd88ab32SMasahiro Yamada
1249dd88ab32SMasahiro Yamada	while (length($cur)) {
1250dd88ab32SMasahiro Yamada		@av_paren_type = ('E') if ($#av_paren_type < 0);
1251dd88ab32SMasahiro Yamada		print " <" . join('', @av_paren_type) .
1252dd88ab32SMasahiro Yamada				"> <$type> <$av_pending>" if ($dbg_values > 1);
1253dd88ab32SMasahiro Yamada		if ($cur =~ /^(\s+)/o) {
1254dd88ab32SMasahiro Yamada			print "WS($1)\n" if ($dbg_values > 1);
1255dd88ab32SMasahiro Yamada			if ($1 =~ /\n/ && $av_preprocessor) {
1256dd88ab32SMasahiro Yamada				$type = pop(@av_paren_type);
1257dd88ab32SMasahiro Yamada				$av_preprocessor = 0;
1258dd88ab32SMasahiro Yamada			}
1259dd88ab32SMasahiro Yamada
1260dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
1261dd88ab32SMasahiro Yamada			print "CAST($1)\n" if ($dbg_values > 1);
1262dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1263dd88ab32SMasahiro Yamada			$type = 'c';
1264dd88ab32SMasahiro Yamada
1265dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
1266dd88ab32SMasahiro Yamada			print "DECLARE($1)\n" if ($dbg_values > 1);
1267dd88ab32SMasahiro Yamada			$type = 'T';
1268dd88ab32SMasahiro Yamada
1269dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Modifier)\s*/) {
1270dd88ab32SMasahiro Yamada			print "MODIFIER($1)\n" if ($dbg_values > 1);
1271dd88ab32SMasahiro Yamada			$type = 'T';
1272dd88ab32SMasahiro Yamada
1273dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
1274dd88ab32SMasahiro Yamada			print "DEFINE($1,$2)\n" if ($dbg_values > 1);
1275dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1276dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1277dd88ab32SMasahiro Yamada			if ($2 ne '') {
1278dd88ab32SMasahiro Yamada				$av_pending = 'N';
1279dd88ab32SMasahiro Yamada			}
1280dd88ab32SMasahiro Yamada			$type = 'E';
1281dd88ab32SMasahiro Yamada
1282dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
1283dd88ab32SMasahiro Yamada			print "UNDEF($1)\n" if ($dbg_values > 1);
1284dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1285dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1286dd88ab32SMasahiro Yamada
1287dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
1288dd88ab32SMasahiro Yamada			print "PRE_START($1)\n" if ($dbg_values > 1);
1289dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1290dd88ab32SMasahiro Yamada
1291dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1292dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1293dd88ab32SMasahiro Yamada			$type = 'E';
1294dd88ab32SMasahiro Yamada
1295dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
1296dd88ab32SMasahiro Yamada			print "PRE_RESTART($1)\n" if ($dbg_values > 1);
1297dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1298dd88ab32SMasahiro Yamada
1299dd88ab32SMasahiro Yamada			push(@av_paren_type, $av_paren_type[$#av_paren_type]);
1300dd88ab32SMasahiro Yamada
1301dd88ab32SMasahiro Yamada			$type = 'E';
1302dd88ab32SMasahiro Yamada
1303dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
1304dd88ab32SMasahiro Yamada			print "PRE_END($1)\n" if ($dbg_values > 1);
1305dd88ab32SMasahiro Yamada
1306dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1307dd88ab32SMasahiro Yamada
1308dd88ab32SMasahiro Yamada			# Assume all arms of the conditional end as this
1309dd88ab32SMasahiro Yamada			# one does, and continue as if the #endif was not here.
1310dd88ab32SMasahiro Yamada			pop(@av_paren_type);
1311dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1312dd88ab32SMasahiro Yamada			$type = 'E';
1313dd88ab32SMasahiro Yamada
1314dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\\\n)/o) {
1315dd88ab32SMasahiro Yamada			print "PRECONT($1)\n" if ($dbg_values > 1);
1316dd88ab32SMasahiro Yamada
1317dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
1318dd88ab32SMasahiro Yamada			print "ATTR($1)\n" if ($dbg_values > 1);
1319dd88ab32SMasahiro Yamada			$av_pending = $type;
1320dd88ab32SMasahiro Yamada			$type = 'N';
1321dd88ab32SMasahiro Yamada
1322dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
1323dd88ab32SMasahiro Yamada			print "SIZEOF($1)\n" if ($dbg_values > 1);
1324dd88ab32SMasahiro Yamada			if (defined $2) {
1325dd88ab32SMasahiro Yamada				$av_pending = 'V';
1326dd88ab32SMasahiro Yamada			}
1327dd88ab32SMasahiro Yamada			$type = 'N';
1328dd88ab32SMasahiro Yamada
1329dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(if|while|for)\b/o) {
1330dd88ab32SMasahiro Yamada			print "COND($1)\n" if ($dbg_values > 1);
1331dd88ab32SMasahiro Yamada			$av_pending = 'E';
1332dd88ab32SMasahiro Yamada			$type = 'N';
1333dd88ab32SMasahiro Yamada
1334dd88ab32SMasahiro Yamada		} elsif ($cur =~/^(case)/o) {
1335dd88ab32SMasahiro Yamada			print "CASE($1)\n" if ($dbg_values > 1);
1336dd88ab32SMasahiro Yamada			$av_pend_colon = 'C';
1337dd88ab32SMasahiro Yamada			$type = 'N';
1338dd88ab32SMasahiro Yamada
1339dd88ab32SMasahiro Yamada		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
1340dd88ab32SMasahiro Yamada			print "KEYWORD($1)\n" if ($dbg_values > 1);
1341dd88ab32SMasahiro Yamada			$type = 'N';
1342dd88ab32SMasahiro Yamada
1343dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\()/o) {
1344dd88ab32SMasahiro Yamada			print "PAREN('$1')\n" if ($dbg_values > 1);
1345dd88ab32SMasahiro Yamada			push(@av_paren_type, $av_pending);
1346dd88ab32SMasahiro Yamada			$av_pending = '_';
1347dd88ab32SMasahiro Yamada			$type = 'N';
1348dd88ab32SMasahiro Yamada
1349dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\))/o) {
1350dd88ab32SMasahiro Yamada			my $new_type = pop(@av_paren_type);
1351dd88ab32SMasahiro Yamada			if ($new_type ne '_') {
1352dd88ab32SMasahiro Yamada				$type = $new_type;
1353dd88ab32SMasahiro Yamada				print "PAREN('$1') -> $type\n"
1354dd88ab32SMasahiro Yamada							if ($dbg_values > 1);
1355dd88ab32SMasahiro Yamada			} else {
1356dd88ab32SMasahiro Yamada				print "PAREN('$1')\n" if ($dbg_values > 1);
1357dd88ab32SMasahiro Yamada			}
1358dd88ab32SMasahiro Yamada
1359dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Ident)\s*\(/o) {
1360dd88ab32SMasahiro Yamada			print "FUNC($1)\n" if ($dbg_values > 1);
1361dd88ab32SMasahiro Yamada			$type = 'V';
1362dd88ab32SMasahiro Yamada			$av_pending = 'V';
1363dd88ab32SMasahiro Yamada
1364dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
1365dd88ab32SMasahiro Yamada			if (defined $2 && $type eq 'C' || $type eq 'T') {
1366dd88ab32SMasahiro Yamada				$av_pend_colon = 'B';
1367dd88ab32SMasahiro Yamada			} elsif ($type eq 'E') {
1368dd88ab32SMasahiro Yamada				$av_pend_colon = 'L';
1369dd88ab32SMasahiro Yamada			}
1370dd88ab32SMasahiro Yamada			print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
1371dd88ab32SMasahiro Yamada			$type = 'V';
1372dd88ab32SMasahiro Yamada
1373dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Ident|$Constant)/o) {
1374dd88ab32SMasahiro Yamada			print "IDENT($1)\n" if ($dbg_values > 1);
1375dd88ab32SMasahiro Yamada			$type = 'V';
1376dd88ab32SMasahiro Yamada
1377dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Assignment)/o) {
1378dd88ab32SMasahiro Yamada			print "ASSIGN($1)\n" if ($dbg_values > 1);
1379dd88ab32SMasahiro Yamada			$type = 'N';
1380dd88ab32SMasahiro Yamada
1381dd88ab32SMasahiro Yamada		} elsif ($cur =~/^(;|{|})/) {
1382dd88ab32SMasahiro Yamada			print "END($1)\n" if ($dbg_values > 1);
1383dd88ab32SMasahiro Yamada			$type = 'E';
1384dd88ab32SMasahiro Yamada			$av_pend_colon = 'O';
1385dd88ab32SMasahiro Yamada
1386dd88ab32SMasahiro Yamada		} elsif ($cur =~/^(,)/) {
1387dd88ab32SMasahiro Yamada			print "COMMA($1)\n" if ($dbg_values > 1);
1388dd88ab32SMasahiro Yamada			$type = 'C';
1389dd88ab32SMasahiro Yamada
1390dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\?)/o) {
1391dd88ab32SMasahiro Yamada			print "QUESTION($1)\n" if ($dbg_values > 1);
1392dd88ab32SMasahiro Yamada			$type = 'N';
1393dd88ab32SMasahiro Yamada
1394dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(:)/o) {
1395dd88ab32SMasahiro Yamada			print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
1396dd88ab32SMasahiro Yamada
1397dd88ab32SMasahiro Yamada			substr($var, length($res), 1, $av_pend_colon);
1398dd88ab32SMasahiro Yamada			if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
1399dd88ab32SMasahiro Yamada				$type = 'E';
1400dd88ab32SMasahiro Yamada			} else {
1401dd88ab32SMasahiro Yamada				$type = 'N';
1402dd88ab32SMasahiro Yamada			}
1403dd88ab32SMasahiro Yamada			$av_pend_colon = 'O';
1404dd88ab32SMasahiro Yamada
1405dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\[)/o) {
1406dd88ab32SMasahiro Yamada			print "CLOSE($1)\n" if ($dbg_values > 1);
1407dd88ab32SMasahiro Yamada			$type = 'N';
1408dd88ab32SMasahiro Yamada
1409dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
1410dd88ab32SMasahiro Yamada			my $variant;
1411dd88ab32SMasahiro Yamada
1412dd88ab32SMasahiro Yamada			print "OPV($1)\n" if ($dbg_values > 1);
1413dd88ab32SMasahiro Yamada			if ($type eq 'V') {
1414dd88ab32SMasahiro Yamada				$variant = 'B';
1415dd88ab32SMasahiro Yamada			} else {
1416dd88ab32SMasahiro Yamada				$variant = 'U';
1417dd88ab32SMasahiro Yamada			}
1418dd88ab32SMasahiro Yamada
1419dd88ab32SMasahiro Yamada			substr($var, length($res), 1, $variant);
1420dd88ab32SMasahiro Yamada			$type = 'N';
1421dd88ab32SMasahiro Yamada
1422dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Operators)/o) {
1423dd88ab32SMasahiro Yamada			print "OP($1)\n" if ($dbg_values > 1);
1424dd88ab32SMasahiro Yamada			if ($1 ne '++' && $1 ne '--') {
1425dd88ab32SMasahiro Yamada				$type = 'N';
1426dd88ab32SMasahiro Yamada			}
1427dd88ab32SMasahiro Yamada
1428dd88ab32SMasahiro Yamada		} elsif ($cur =~ /(^.)/o) {
1429dd88ab32SMasahiro Yamada			print "C($1)\n" if ($dbg_values > 1);
1430dd88ab32SMasahiro Yamada		}
1431dd88ab32SMasahiro Yamada		if (defined $1) {
1432dd88ab32SMasahiro Yamada			$cur = substr($cur, length($1));
1433dd88ab32SMasahiro Yamada			$res .= $type x length($1);
1434dd88ab32SMasahiro Yamada		}
1435dd88ab32SMasahiro Yamada	}
1436dd88ab32SMasahiro Yamada
1437dd88ab32SMasahiro Yamada	return ($res, $var);
1438dd88ab32SMasahiro Yamada}
1439dd88ab32SMasahiro Yamada
1440dd88ab32SMasahiro Yamadasub possible {
1441dd88ab32SMasahiro Yamada	my ($possible, $line) = @_;
1442dd88ab32SMasahiro Yamada	my $notPermitted = qr{(?:
1443dd88ab32SMasahiro Yamada		^(?:
1444dd88ab32SMasahiro Yamada			$Modifier|
1445dd88ab32SMasahiro Yamada			$Storage|
1446dd88ab32SMasahiro Yamada			$Type|
1447dd88ab32SMasahiro Yamada			DEFINE_\S+
1448dd88ab32SMasahiro Yamada		)$|
1449dd88ab32SMasahiro Yamada		^(?:
1450dd88ab32SMasahiro Yamada			goto|
1451dd88ab32SMasahiro Yamada			return|
1452dd88ab32SMasahiro Yamada			case|
1453dd88ab32SMasahiro Yamada			else|
1454dd88ab32SMasahiro Yamada			asm|__asm__|
1455dd88ab32SMasahiro Yamada			do|
1456dd88ab32SMasahiro Yamada			\#|
1457dd88ab32SMasahiro Yamada			\#\#|
1458dd88ab32SMasahiro Yamada		)(?:\s|$)|
1459dd88ab32SMasahiro Yamada		^(?:typedef|struct|enum)\b
1460dd88ab32SMasahiro Yamada	    )}x;
1461dd88ab32SMasahiro Yamada	warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
1462dd88ab32SMasahiro Yamada	if ($possible !~ $notPermitted) {
1463dd88ab32SMasahiro Yamada		# Check for modifiers.
1464dd88ab32SMasahiro Yamada		$possible =~ s/\s*$Storage\s*//g;
1465dd88ab32SMasahiro Yamada		$possible =~ s/\s*$Sparse\s*//g;
1466dd88ab32SMasahiro Yamada		if ($possible =~ /^\s*$/) {
1467dd88ab32SMasahiro Yamada
1468dd88ab32SMasahiro Yamada		} elsif ($possible =~ /\s/) {
1469dd88ab32SMasahiro Yamada			$possible =~ s/\s*$Type\s*//g;
1470dd88ab32SMasahiro Yamada			for my $modifier (split(' ', $possible)) {
1471dd88ab32SMasahiro Yamada				if ($modifier !~ $notPermitted) {
1472dd88ab32SMasahiro Yamada					warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
1473dd88ab32SMasahiro Yamada					push(@modifierList, $modifier);
1474dd88ab32SMasahiro Yamada				}
1475dd88ab32SMasahiro Yamada			}
1476dd88ab32SMasahiro Yamada
1477dd88ab32SMasahiro Yamada		} else {
1478dd88ab32SMasahiro Yamada			warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
1479dd88ab32SMasahiro Yamada			push(@typeList, $possible);
1480dd88ab32SMasahiro Yamada		}
1481dd88ab32SMasahiro Yamada		build_types();
1482dd88ab32SMasahiro Yamada	} else {
1483dd88ab32SMasahiro Yamada		warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
1484dd88ab32SMasahiro Yamada	}
1485dd88ab32SMasahiro Yamada}
1486dd88ab32SMasahiro Yamada
1487dd88ab32SMasahiro Yamadamy $prefix = '';
1488dd88ab32SMasahiro Yamada
1489dd88ab32SMasahiro Yamadasub show_type {
14906b9709d9STom Rini	return defined $use_type{$_[0]} if (scalar keys %use_type > 0);
14916b9709d9STom Rini
1492dd88ab32SMasahiro Yamada	return !defined $ignore_type{$_[0]};
1493dd88ab32SMasahiro Yamada}
1494dd88ab32SMasahiro Yamada
1495dd88ab32SMasahiro Yamadasub report {
1496dd88ab32SMasahiro Yamada	if (!show_type($_[1]) ||
1497dd88ab32SMasahiro Yamada	    (defined $tst_only && $_[2] !~ /\Q$tst_only\E/)) {
1498dd88ab32SMasahiro Yamada		return 0;
1499dd88ab32SMasahiro Yamada	}
1500dd88ab32SMasahiro Yamada	my $line;
1501dd88ab32SMasahiro Yamada	if ($show_types) {
1502dd88ab32SMasahiro Yamada		$line = "$prefix$_[0]:$_[1]: $_[2]\n";
1503dd88ab32SMasahiro Yamada	} else {
1504dd88ab32SMasahiro Yamada		$line = "$prefix$_[0]: $_[2]\n";
1505dd88ab32SMasahiro Yamada	}
1506dd88ab32SMasahiro Yamada	$line = (split('\n', $line))[0] . "\n" if ($terse);
1507dd88ab32SMasahiro Yamada
1508dd88ab32SMasahiro Yamada	push(our @report, $line);
1509dd88ab32SMasahiro Yamada
1510dd88ab32SMasahiro Yamada	return 1;
1511dd88ab32SMasahiro Yamada}
1512dd88ab32SMasahiro Yamadasub report_dump {
1513dd88ab32SMasahiro Yamada	our @report;
1514dd88ab32SMasahiro Yamada}
1515dd88ab32SMasahiro Yamada
1516dd88ab32SMasahiro Yamadasub ERROR {
1517dd88ab32SMasahiro Yamada	if (report("ERROR", $_[0], $_[1])) {
1518dd88ab32SMasahiro Yamada		our $clean = 0;
1519dd88ab32SMasahiro Yamada		our $cnt_error++;
15206b9709d9STom Rini		return 1;
1521dd88ab32SMasahiro Yamada	}
15226b9709d9STom Rini	return 0;
1523dd88ab32SMasahiro Yamada}
1524dd88ab32SMasahiro Yamadasub WARN {
1525dd88ab32SMasahiro Yamada	if (report("WARNING", $_[0], $_[1])) {
1526dd88ab32SMasahiro Yamada		our $clean = 0;
1527dd88ab32SMasahiro Yamada		our $cnt_warn++;
15286b9709d9STom Rini		return 1;
1529dd88ab32SMasahiro Yamada	}
15306b9709d9STom Rini	return 0;
1531dd88ab32SMasahiro Yamada}
1532dd88ab32SMasahiro Yamadasub CHK {
1533dd88ab32SMasahiro Yamada	if ($check && report("CHECK", $_[0], $_[1])) {
1534dd88ab32SMasahiro Yamada		our $clean = 0;
1535dd88ab32SMasahiro Yamada		our $cnt_chk++;
15366b9709d9STom Rini		return 1;
1537dd88ab32SMasahiro Yamada	}
15386b9709d9STom Rini	return 0;
1539dd88ab32SMasahiro Yamada}
1540dd88ab32SMasahiro Yamada
1541dd88ab32SMasahiro Yamadasub check_absolute_file {
1542dd88ab32SMasahiro Yamada	my ($absolute, $herecurr) = @_;
1543dd88ab32SMasahiro Yamada	my $file = $absolute;
1544dd88ab32SMasahiro Yamada
1545dd88ab32SMasahiro Yamada	##print "absolute<$absolute>\n";
1546dd88ab32SMasahiro Yamada
1547dd88ab32SMasahiro Yamada	# See if any suffix of this path is a path within the tree.
1548dd88ab32SMasahiro Yamada	while ($file =~ s@^[^/]*/@@) {
1549dd88ab32SMasahiro Yamada		if (-f "$root/$file") {
1550dd88ab32SMasahiro Yamada			##print "file<$file>\n";
1551dd88ab32SMasahiro Yamada			last;
1552dd88ab32SMasahiro Yamada		}
1553dd88ab32SMasahiro Yamada	}
1554dd88ab32SMasahiro Yamada	if (! -f _)  {
1555dd88ab32SMasahiro Yamada		return 0;
1556dd88ab32SMasahiro Yamada	}
1557dd88ab32SMasahiro Yamada
1558dd88ab32SMasahiro Yamada	# It is, so see if the prefix is acceptable.
1559dd88ab32SMasahiro Yamada	my $prefix = $absolute;
1560dd88ab32SMasahiro Yamada	substr($prefix, -length($file)) = '';
1561dd88ab32SMasahiro Yamada
1562dd88ab32SMasahiro Yamada	##print "prefix<$prefix>\n";
1563dd88ab32SMasahiro Yamada	if ($prefix ne ".../") {
1564dd88ab32SMasahiro Yamada		WARN("USE_RELATIVE_PATH",
1565dd88ab32SMasahiro Yamada		     "use relative pathname instead of absolute in changelog text\n" . $herecurr);
1566dd88ab32SMasahiro Yamada	}
1567dd88ab32SMasahiro Yamada}
1568dd88ab32SMasahiro Yamada
15696b9709d9STom Rinisub trim {
15706b9709d9STom Rini	my ($string) = @_;
15716b9709d9STom Rini
15726b9709d9STom Rini	$string =~ s/^\s+|\s+$//g;
15736b9709d9STom Rini
15746b9709d9STom Rini	return $string;
15756b9709d9STom Rini}
15766b9709d9STom Rini
15776b9709d9STom Rinisub ltrim {
15786b9709d9STom Rini	my ($string) = @_;
15796b9709d9STom Rini
15806b9709d9STom Rini	$string =~ s/^\s+//;
15816b9709d9STom Rini
15826b9709d9STom Rini	return $string;
15836b9709d9STom Rini}
15846b9709d9STom Rini
15856b9709d9STom Rinisub rtrim {
15866b9709d9STom Rini	my ($string) = @_;
15876b9709d9STom Rini
15886b9709d9STom Rini	$string =~ s/\s+$//;
15896b9709d9STom Rini
15906b9709d9STom Rini	return $string;
15916b9709d9STom Rini}
15926b9709d9STom Rini
15936b9709d9STom Rinisub string_find_replace {
15946b9709d9STom Rini	my ($string, $find, $replace) = @_;
15956b9709d9STom Rini
15966b9709d9STom Rini	$string =~ s/$find/$replace/g;
15976b9709d9STom Rini
15986b9709d9STom Rini	return $string;
15996b9709d9STom Rini}
16006b9709d9STom Rini
16016b9709d9STom Rinisub tabify {
16026b9709d9STom Rini	my ($leading) = @_;
16036b9709d9STom Rini
16046b9709d9STom Rini	my $source_indent = 8;
16056b9709d9STom Rini	my $max_spaces_before_tab = $source_indent - 1;
16066b9709d9STom Rini	my $spaces_to_tab = " " x $source_indent;
16076b9709d9STom Rini
16086b9709d9STom Rini	#convert leading spaces to tabs
16096b9709d9STom Rini	1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
16106b9709d9STom Rini	#Remove spaces before a tab
16116b9709d9STom Rini	1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
16126b9709d9STom Rini
16136b9709d9STom Rini	return "$leading";
16146b9709d9STom Rini}
16156b9709d9STom Rini
1616dd88ab32SMasahiro Yamadasub pos_last_openparen {
1617dd88ab32SMasahiro Yamada	my ($line) = @_;
1618dd88ab32SMasahiro Yamada
1619dd88ab32SMasahiro Yamada	my $pos = 0;
1620dd88ab32SMasahiro Yamada
1621dd88ab32SMasahiro Yamada	my $opens = $line =~ tr/\(/\(/;
1622dd88ab32SMasahiro Yamada	my $closes = $line =~ tr/\)/\)/;
1623dd88ab32SMasahiro Yamada
1624dd88ab32SMasahiro Yamada	my $last_openparen = 0;
1625dd88ab32SMasahiro Yamada
1626dd88ab32SMasahiro Yamada	if (($opens == 0) || ($closes >= $opens)) {
1627dd88ab32SMasahiro Yamada		return -1;
1628dd88ab32SMasahiro Yamada	}
1629dd88ab32SMasahiro Yamada
1630dd88ab32SMasahiro Yamada	my $len = length($line);
1631dd88ab32SMasahiro Yamada
1632dd88ab32SMasahiro Yamada	for ($pos = 0; $pos < $len; $pos++) {
1633dd88ab32SMasahiro Yamada		my $string = substr($line, $pos);
1634dd88ab32SMasahiro Yamada		if ($string =~ /^($FuncArg|$balanced_parens)/) {
1635dd88ab32SMasahiro Yamada			$pos += length($1) - 1;
1636dd88ab32SMasahiro Yamada		} elsif (substr($line, $pos, 1) eq '(') {
1637dd88ab32SMasahiro Yamada			$last_openparen = $pos;
1638dd88ab32SMasahiro Yamada		} elsif (index($string, '(') == -1) {
1639dd88ab32SMasahiro Yamada			last;
1640dd88ab32SMasahiro Yamada		}
1641dd88ab32SMasahiro Yamada	}
1642dd88ab32SMasahiro Yamada
1643dd88ab32SMasahiro Yamada	return $last_openparen + 1;
1644dd88ab32SMasahiro Yamada}
1645dd88ab32SMasahiro Yamada
1646dd88ab32SMasahiro Yamadasub process {
1647dd88ab32SMasahiro Yamada	my $filename = shift;
1648dd88ab32SMasahiro Yamada
1649dd88ab32SMasahiro Yamada	my $linenr=0;
1650dd88ab32SMasahiro Yamada	my $prevline="";
1651dd88ab32SMasahiro Yamada	my $prevrawline="";
1652dd88ab32SMasahiro Yamada	my $stashline="";
1653dd88ab32SMasahiro Yamada	my $stashrawline="";
1654dd88ab32SMasahiro Yamada
1655dd88ab32SMasahiro Yamada	my $length;
1656dd88ab32SMasahiro Yamada	my $indent;
1657dd88ab32SMasahiro Yamada	my $previndent=0;
1658dd88ab32SMasahiro Yamada	my $stashindent=0;
1659dd88ab32SMasahiro Yamada
1660dd88ab32SMasahiro Yamada	our $clean = 1;
1661dd88ab32SMasahiro Yamada	my $signoff = 0;
1662dd88ab32SMasahiro Yamada	my $is_patch = 0;
1663dd88ab32SMasahiro Yamada
1664dd88ab32SMasahiro Yamada	my $in_header_lines = 1;
1665dd88ab32SMasahiro Yamada	my $in_commit_log = 0;		#Scanning lines before patch
1666dd88ab32SMasahiro Yamada
1667dd88ab32SMasahiro Yamada	my $non_utf8_charset = 0;
1668dd88ab32SMasahiro Yamada
1669dd88ab32SMasahiro Yamada	our @report = ();
1670dd88ab32SMasahiro Yamada	our $cnt_lines = 0;
1671dd88ab32SMasahiro Yamada	our $cnt_error = 0;
1672dd88ab32SMasahiro Yamada	our $cnt_warn = 0;
1673dd88ab32SMasahiro Yamada	our $cnt_chk = 0;
1674dd88ab32SMasahiro Yamada
1675dd88ab32SMasahiro Yamada	# Trace the real file/line as we go.
1676dd88ab32SMasahiro Yamada	my $realfile = '';
1677dd88ab32SMasahiro Yamada	my $realline = 0;
1678dd88ab32SMasahiro Yamada	my $realcnt = 0;
1679dd88ab32SMasahiro Yamada	my $here = '';
1680dd88ab32SMasahiro Yamada	my $in_comment = 0;
1681dd88ab32SMasahiro Yamada	my $comment_edge = 0;
1682dd88ab32SMasahiro Yamada	my $first_line = 0;
1683dd88ab32SMasahiro Yamada	my $p1_prefix = '';
1684dd88ab32SMasahiro Yamada
1685dd88ab32SMasahiro Yamada	my $prev_values = 'E';
1686dd88ab32SMasahiro Yamada
1687dd88ab32SMasahiro Yamada	# suppression flags
1688dd88ab32SMasahiro Yamada	my %suppress_ifbraces;
1689dd88ab32SMasahiro Yamada	my %suppress_whiletrailers;
1690dd88ab32SMasahiro Yamada	my %suppress_export;
1691dd88ab32SMasahiro Yamada	my $suppress_statement = 0;
1692dd88ab32SMasahiro Yamada
16936b9709d9STom Rini	my %signatures = ();
1694dd88ab32SMasahiro Yamada
1695dd88ab32SMasahiro Yamada	# Pre-scan the patch sanitizing the lines.
1696dd88ab32SMasahiro Yamada	# Pre-scan the patch looking for any __setup documentation.
1697dd88ab32SMasahiro Yamada	#
1698dd88ab32SMasahiro Yamada	my @setup_docs = ();
1699dd88ab32SMasahiro Yamada	my $setup_docs = 0;
1700dd88ab32SMasahiro Yamada
17016b9709d9STom Rini	my $camelcase_file_seeded = 0;
17026b9709d9STom Rini
1703dd88ab32SMasahiro Yamada	sanitise_line_reset();
1704dd88ab32SMasahiro Yamada	my $line;
1705dd88ab32SMasahiro Yamada	foreach my $rawline (@rawlines) {
1706dd88ab32SMasahiro Yamada		$linenr++;
1707dd88ab32SMasahiro Yamada		$line = $rawline;
1708dd88ab32SMasahiro Yamada
17096b9709d9STom Rini		push(@fixed, $rawline) if ($fix);
17106b9709d9STom Rini
1711dd88ab32SMasahiro Yamada		if ($rawline=~/^\+\+\+\s+(\S+)/) {
1712dd88ab32SMasahiro Yamada			$setup_docs = 0;
1713dd88ab32SMasahiro Yamada			if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
1714dd88ab32SMasahiro Yamada				$setup_docs = 1;
1715dd88ab32SMasahiro Yamada			}
1716dd88ab32SMasahiro Yamada			#next;
1717dd88ab32SMasahiro Yamada		}
1718dd88ab32SMasahiro Yamada		if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
1719dd88ab32SMasahiro Yamada			$realline=$1-1;
1720dd88ab32SMasahiro Yamada			if (defined $2) {
1721dd88ab32SMasahiro Yamada				$realcnt=$3+1;
1722dd88ab32SMasahiro Yamada			} else {
1723dd88ab32SMasahiro Yamada				$realcnt=1+1;
1724dd88ab32SMasahiro Yamada			}
1725dd88ab32SMasahiro Yamada			$in_comment = 0;
1726dd88ab32SMasahiro Yamada
1727dd88ab32SMasahiro Yamada			# Guestimate if this is a continuing comment.  Run
1728dd88ab32SMasahiro Yamada			# the context looking for a comment "edge".  If this
1729dd88ab32SMasahiro Yamada			# edge is a close comment then we must be in a comment
1730dd88ab32SMasahiro Yamada			# at context start.
1731dd88ab32SMasahiro Yamada			my $edge;
1732dd88ab32SMasahiro Yamada			my $cnt = $realcnt;
1733dd88ab32SMasahiro Yamada			for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
1734dd88ab32SMasahiro Yamada				next if (defined $rawlines[$ln - 1] &&
1735dd88ab32SMasahiro Yamada					 $rawlines[$ln - 1] =~ /^-/);
1736dd88ab32SMasahiro Yamada				$cnt--;
1737dd88ab32SMasahiro Yamada				#print "RAW<$rawlines[$ln - 1]>\n";
1738dd88ab32SMasahiro Yamada				last if (!defined $rawlines[$ln - 1]);
1739dd88ab32SMasahiro Yamada				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
1740dd88ab32SMasahiro Yamada				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
1741dd88ab32SMasahiro Yamada					($edge) = $1;
1742dd88ab32SMasahiro Yamada					last;
1743dd88ab32SMasahiro Yamada				}
1744dd88ab32SMasahiro Yamada			}
1745dd88ab32SMasahiro Yamada			if (defined $edge && $edge eq '*/') {
1746dd88ab32SMasahiro Yamada				$in_comment = 1;
1747dd88ab32SMasahiro Yamada			}
1748dd88ab32SMasahiro Yamada
1749dd88ab32SMasahiro Yamada			# Guestimate if this is a continuing comment.  If this
1750dd88ab32SMasahiro Yamada			# is the start of a diff block and this line starts
1751dd88ab32SMasahiro Yamada			# ' *' then it is very likely a comment.
1752dd88ab32SMasahiro Yamada			if (!defined $edge &&
1753dd88ab32SMasahiro Yamada			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
1754dd88ab32SMasahiro Yamada			{
1755dd88ab32SMasahiro Yamada				$in_comment = 1;
1756dd88ab32SMasahiro Yamada			}
1757dd88ab32SMasahiro Yamada
1758dd88ab32SMasahiro Yamada			##print "COMMENT:$in_comment edge<$edge> $rawline\n";
1759dd88ab32SMasahiro Yamada			sanitise_line_reset($in_comment);
1760dd88ab32SMasahiro Yamada
1761dd88ab32SMasahiro Yamada		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
1762dd88ab32SMasahiro Yamada			# Standardise the strings and chars within the input to
1763dd88ab32SMasahiro Yamada			# simplify matching -- only bother with positive lines.
1764dd88ab32SMasahiro Yamada			$line = sanitise_line($rawline);
1765dd88ab32SMasahiro Yamada		}
1766dd88ab32SMasahiro Yamada		push(@lines, $line);
1767dd88ab32SMasahiro Yamada
1768dd88ab32SMasahiro Yamada		if ($realcnt > 1) {
1769dd88ab32SMasahiro Yamada			$realcnt-- if ($line =~ /^(?:\+| |$)/);
1770dd88ab32SMasahiro Yamada		} else {
1771dd88ab32SMasahiro Yamada			$realcnt = 0;
1772dd88ab32SMasahiro Yamada		}
1773dd88ab32SMasahiro Yamada
1774dd88ab32SMasahiro Yamada		#print "==>$rawline\n";
1775dd88ab32SMasahiro Yamada		#print "-->$line\n";
1776dd88ab32SMasahiro Yamada
1777dd88ab32SMasahiro Yamada		if ($setup_docs && $line =~ /^\+/) {
1778dd88ab32SMasahiro Yamada			push(@setup_docs, $line);
1779dd88ab32SMasahiro Yamada		}
1780dd88ab32SMasahiro Yamada	}
1781dd88ab32SMasahiro Yamada
1782dd88ab32SMasahiro Yamada	$prefix = '';
1783dd88ab32SMasahiro Yamada
1784dd88ab32SMasahiro Yamada	$realcnt = 0;
1785dd88ab32SMasahiro Yamada	$linenr = 0;
1786dd88ab32SMasahiro Yamada	foreach my $line (@lines) {
1787dd88ab32SMasahiro Yamada		$linenr++;
17886b9709d9STom Rini		my $sline = $line;	#copy of $line
17896b9709d9STom Rini		$sline =~ s/$;/ /g;	#with comments as spaces
1790dd88ab32SMasahiro Yamada
1791dd88ab32SMasahiro Yamada		my $rawline = $rawlines[$linenr - 1];
1792dd88ab32SMasahiro Yamada
1793dd88ab32SMasahiro Yamada#extract the line range in the file after the patch is applied
1794dd88ab32SMasahiro Yamada		if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
1795dd88ab32SMasahiro Yamada			$is_patch = 1;
1796dd88ab32SMasahiro Yamada			$first_line = $linenr + 1;
1797dd88ab32SMasahiro Yamada			$realline=$1-1;
1798dd88ab32SMasahiro Yamada			if (defined $2) {
1799dd88ab32SMasahiro Yamada				$realcnt=$3+1;
1800dd88ab32SMasahiro Yamada			} else {
1801dd88ab32SMasahiro Yamada				$realcnt=1+1;
1802dd88ab32SMasahiro Yamada			}
1803dd88ab32SMasahiro Yamada			annotate_reset();
1804dd88ab32SMasahiro Yamada			$prev_values = 'E';
1805dd88ab32SMasahiro Yamada
1806dd88ab32SMasahiro Yamada			%suppress_ifbraces = ();
1807dd88ab32SMasahiro Yamada			%suppress_whiletrailers = ();
1808dd88ab32SMasahiro Yamada			%suppress_export = ();
1809dd88ab32SMasahiro Yamada			$suppress_statement = 0;
1810dd88ab32SMasahiro Yamada			next;
1811dd88ab32SMasahiro Yamada
1812dd88ab32SMasahiro Yamada# track the line number as we move through the hunk, note that
1813dd88ab32SMasahiro Yamada# new versions of GNU diff omit the leading space on completely
1814dd88ab32SMasahiro Yamada# blank context lines so we need to count that too.
1815dd88ab32SMasahiro Yamada		} elsif ($line =~ /^( |\+|$)/) {
1816dd88ab32SMasahiro Yamada			$realline++;
1817dd88ab32SMasahiro Yamada			$realcnt-- if ($realcnt != 0);
1818dd88ab32SMasahiro Yamada
1819dd88ab32SMasahiro Yamada			# Measure the line length and indent.
1820dd88ab32SMasahiro Yamada			($length, $indent) = line_stats($rawline);
1821dd88ab32SMasahiro Yamada
1822dd88ab32SMasahiro Yamada			# Track the previous line.
1823dd88ab32SMasahiro Yamada			($prevline, $stashline) = ($stashline, $line);
1824dd88ab32SMasahiro Yamada			($previndent, $stashindent) = ($stashindent, $indent);
1825dd88ab32SMasahiro Yamada			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
1826dd88ab32SMasahiro Yamada
1827dd88ab32SMasahiro Yamada			#warn "line<$line>\n";
1828dd88ab32SMasahiro Yamada
1829dd88ab32SMasahiro Yamada		} elsif ($realcnt == 1) {
1830dd88ab32SMasahiro Yamada			$realcnt--;
1831dd88ab32SMasahiro Yamada		}
1832dd88ab32SMasahiro Yamada
1833dd88ab32SMasahiro Yamada		my $hunk_line = ($realcnt != 0);
1834dd88ab32SMasahiro Yamada
1835dd88ab32SMasahiro Yamada#make up the handle for any error we report on this line
1836dd88ab32SMasahiro Yamada		$prefix = "$filename:$realline: " if ($emacs && $file);
1837dd88ab32SMasahiro Yamada		$prefix = "$filename:$linenr: " if ($emacs && !$file);
1838dd88ab32SMasahiro Yamada
1839dd88ab32SMasahiro Yamada		$here = "#$linenr: " if (!$file);
1840dd88ab32SMasahiro Yamada		$here = "#$realline: " if ($file);
1841dd88ab32SMasahiro Yamada
1842dd88ab32SMasahiro Yamada		# extract the filename as it passes
1843dd88ab32SMasahiro Yamada		if ($line =~ /^diff --git.*?(\S+)$/) {
1844dd88ab32SMasahiro Yamada			$realfile = $1;
18456b9709d9STom Rini			$realfile =~ s@^([^/]*)/@@ if (!$file);
1846dd88ab32SMasahiro Yamada			$in_commit_log = 0;
1847dd88ab32SMasahiro Yamada		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
1848dd88ab32SMasahiro Yamada			$realfile = $1;
18496b9709d9STom Rini			$realfile =~ s@^([^/]*)/@@ if (!$file);
1850dd88ab32SMasahiro Yamada			$in_commit_log = 0;
1851dd88ab32SMasahiro Yamada
1852dd88ab32SMasahiro Yamada			$p1_prefix = $1;
1853dd88ab32SMasahiro Yamada			if (!$file && $tree && $p1_prefix ne '' &&
1854dd88ab32SMasahiro Yamada			    -e "$root/$p1_prefix") {
1855dd88ab32SMasahiro Yamada				WARN("PATCH_PREFIX",
1856dd88ab32SMasahiro Yamada				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
1857dd88ab32SMasahiro Yamada			}
1858dd88ab32SMasahiro Yamada
1859dd88ab32SMasahiro Yamada			if ($realfile =~ m@^include/asm/@) {
1860dd88ab32SMasahiro Yamada				ERROR("MODIFIED_INCLUDE_ASM",
1861dd88ab32SMasahiro Yamada				      "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
1862dd88ab32SMasahiro Yamada			}
1863dd88ab32SMasahiro Yamada			next;
1864dd88ab32SMasahiro Yamada		}
1865dd88ab32SMasahiro Yamada
1866dd88ab32SMasahiro Yamada		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
1867dd88ab32SMasahiro Yamada
1868dd88ab32SMasahiro Yamada		my $hereline = "$here\n$rawline\n";
1869dd88ab32SMasahiro Yamada		my $herecurr = "$here\n$rawline\n";
1870dd88ab32SMasahiro Yamada		my $hereprev = "$here\n$prevrawline\n$rawline\n";
1871dd88ab32SMasahiro Yamada
1872dd88ab32SMasahiro Yamada		$cnt_lines++ if ($realcnt != 0);
1873dd88ab32SMasahiro Yamada
1874dd88ab32SMasahiro Yamada# Check for incorrect file permissions
1875dd88ab32SMasahiro Yamada		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
1876dd88ab32SMasahiro Yamada			my $permhere = $here . "FILE: $realfile\n";
18776b9709d9STom Rini			if ($realfile !~ m@scripts/@ &&
18786b9709d9STom Rini			    $realfile !~ /\.(py|pl|awk|sh)$/) {
1879dd88ab32SMasahiro Yamada				ERROR("EXECUTE_PERMISSIONS",
1880dd88ab32SMasahiro Yamada				      "do not set execute permissions for source files\n" . $permhere);
1881dd88ab32SMasahiro Yamada			}
1882dd88ab32SMasahiro Yamada		}
1883dd88ab32SMasahiro Yamada
1884dd88ab32SMasahiro Yamada# Check the patch for a signoff:
1885dd88ab32SMasahiro Yamada		if ($line =~ /^\s*signed-off-by:/i) {
1886dd88ab32SMasahiro Yamada			$signoff++;
1887dd88ab32SMasahiro Yamada			$in_commit_log = 0;
1888dd88ab32SMasahiro Yamada		}
1889dd88ab32SMasahiro Yamada
1890dd88ab32SMasahiro Yamada# Check signature styles
1891dd88ab32SMasahiro Yamada		if (!$in_header_lines &&
1892dd88ab32SMasahiro Yamada		    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
1893dd88ab32SMasahiro Yamada			my $space_before = $1;
1894dd88ab32SMasahiro Yamada			my $sign_off = $2;
1895dd88ab32SMasahiro Yamada			my $space_after = $3;
1896dd88ab32SMasahiro Yamada			my $email = $4;
1897dd88ab32SMasahiro Yamada			my $ucfirst_sign_off = ucfirst(lc($sign_off));
1898dd88ab32SMasahiro Yamada
1899dd88ab32SMasahiro Yamada			if ($sign_off !~ /$signature_tags/) {
1900dd88ab32SMasahiro Yamada				WARN("BAD_SIGN_OFF",
1901dd88ab32SMasahiro Yamada				     "Non-standard signature: $sign_off\n" . $herecurr);
1902dd88ab32SMasahiro Yamada			}
1903dd88ab32SMasahiro Yamada			if (defined $space_before && $space_before ne "") {
19046b9709d9STom Rini				if (WARN("BAD_SIGN_OFF",
19056b9709d9STom Rini					 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
19066b9709d9STom Rini				    $fix) {
19076b9709d9STom Rini					$fixed[$linenr - 1] =
19086b9709d9STom Rini					    "$ucfirst_sign_off $email";
19096b9709d9STom Rini				}
1910dd88ab32SMasahiro Yamada			}
1911dd88ab32SMasahiro Yamada			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
19126b9709d9STom Rini				if (WARN("BAD_SIGN_OFF",
19136b9709d9STom Rini					 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
19146b9709d9STom Rini				    $fix) {
19156b9709d9STom Rini					$fixed[$linenr - 1] =
19166b9709d9STom Rini					    "$ucfirst_sign_off $email";
19176b9709d9STom Rini				}
19186b9709d9STom Rini
1919dd88ab32SMasahiro Yamada			}
1920dd88ab32SMasahiro Yamada			if (!defined $space_after || $space_after ne " ") {
19216b9709d9STom Rini				if (WARN("BAD_SIGN_OFF",
19226b9709d9STom Rini					 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
19236b9709d9STom Rini				    $fix) {
19246b9709d9STom Rini					$fixed[$linenr - 1] =
19256b9709d9STom Rini					    "$ucfirst_sign_off $email";
19266b9709d9STom Rini				}
1927dd88ab32SMasahiro Yamada			}
1928dd88ab32SMasahiro Yamada
1929dd88ab32SMasahiro Yamada			my ($email_name, $email_address, $comment) = parse_email($email);
1930dd88ab32SMasahiro Yamada			my $suggested_email = format_email(($email_name, $email_address));
1931dd88ab32SMasahiro Yamada			if ($suggested_email eq "") {
1932dd88ab32SMasahiro Yamada				ERROR("BAD_SIGN_OFF",
1933dd88ab32SMasahiro Yamada				      "Unrecognized email address: '$email'\n" . $herecurr);
1934dd88ab32SMasahiro Yamada			} else {
1935dd88ab32SMasahiro Yamada				my $dequoted = $suggested_email;
1936dd88ab32SMasahiro Yamada				$dequoted =~ s/^"//;
1937dd88ab32SMasahiro Yamada				$dequoted =~ s/" </ </;
1938dd88ab32SMasahiro Yamada				# Don't force email to have quotes
1939dd88ab32SMasahiro Yamada				# Allow just an angle bracketed address
1940dd88ab32SMasahiro Yamada				if ("$dequoted$comment" ne $email &&
1941dd88ab32SMasahiro Yamada				    "<$email_address>$comment" ne $email &&
1942dd88ab32SMasahiro Yamada				    "$suggested_email$comment" ne $email) {
1943dd88ab32SMasahiro Yamada					WARN("BAD_SIGN_OFF",
1944dd88ab32SMasahiro Yamada					     "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
1945dd88ab32SMasahiro Yamada				}
1946dd88ab32SMasahiro Yamada			}
19476b9709d9STom Rini
19486b9709d9STom Rini# Check for duplicate signatures
19496b9709d9STom Rini			my $sig_nospace = $line;
19506b9709d9STom Rini			$sig_nospace =~ s/\s//g;
19516b9709d9STom Rini			$sig_nospace = lc($sig_nospace);
19526b9709d9STom Rini			if (defined $signatures{$sig_nospace}) {
19536b9709d9STom Rini				WARN("BAD_SIGN_OFF",
19546b9709d9STom Rini				     "Duplicate signature\n" . $herecurr);
19556b9709d9STom Rini			} else {
19566b9709d9STom Rini				$signatures{$sig_nospace} = 1;
19576b9709d9STom Rini			}
1958dd88ab32SMasahiro Yamada		}
1959dd88ab32SMasahiro Yamada
1960dd88ab32SMasahiro Yamada# Check for wrappage within a valid hunk of the file
1961dd88ab32SMasahiro Yamada		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
1962dd88ab32SMasahiro Yamada			ERROR("CORRUPTED_PATCH",
1963dd88ab32SMasahiro Yamada			      "patch seems to be corrupt (line wrapped?)\n" .
1964dd88ab32SMasahiro Yamada				$herecurr) if (!$emitted_corrupt++);
1965dd88ab32SMasahiro Yamada		}
1966dd88ab32SMasahiro Yamada
1967dd88ab32SMasahiro Yamada# Check for absolute kernel paths.
1968dd88ab32SMasahiro Yamada		if ($tree) {
1969dd88ab32SMasahiro Yamada			while ($line =~ m{(?:^|\s)(/\S*)}g) {
1970dd88ab32SMasahiro Yamada				my $file = $1;
1971dd88ab32SMasahiro Yamada
1972dd88ab32SMasahiro Yamada				if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
1973dd88ab32SMasahiro Yamada				    check_absolute_file($1, $herecurr)) {
1974dd88ab32SMasahiro Yamada					#
1975dd88ab32SMasahiro Yamada				} else {
1976dd88ab32SMasahiro Yamada					check_absolute_file($file, $herecurr);
1977dd88ab32SMasahiro Yamada				}
1978dd88ab32SMasahiro Yamada			}
1979dd88ab32SMasahiro Yamada		}
1980dd88ab32SMasahiro Yamada
1981dd88ab32SMasahiro Yamada# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
1982dd88ab32SMasahiro Yamada		if (($realfile =~ /^$/ || $line =~ /^\+/) &&
1983dd88ab32SMasahiro Yamada		    $rawline !~ m/^$UTF8*$/) {
1984dd88ab32SMasahiro Yamada			my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
1985dd88ab32SMasahiro Yamada
1986dd88ab32SMasahiro Yamada			my $blank = copy_spacing($rawline);
1987dd88ab32SMasahiro Yamada			my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
1988dd88ab32SMasahiro Yamada			my $hereptr = "$hereline$ptr\n";
1989dd88ab32SMasahiro Yamada
1990dd88ab32SMasahiro Yamada			CHK("INVALID_UTF8",
1991dd88ab32SMasahiro Yamada			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
1992dd88ab32SMasahiro Yamada		}
1993dd88ab32SMasahiro Yamada
1994dd88ab32SMasahiro Yamada# Check if it's the start of a commit log
1995dd88ab32SMasahiro Yamada# (not a header line and we haven't seen the patch filename)
1996dd88ab32SMasahiro Yamada		if ($in_header_lines && $realfile =~ /^$/ &&
1997dd88ab32SMasahiro Yamada		    $rawline !~ /^(commit\b|from\b|[\w-]+:).+$/i) {
1998dd88ab32SMasahiro Yamada			$in_header_lines = 0;
1999dd88ab32SMasahiro Yamada			$in_commit_log = 1;
2000dd88ab32SMasahiro Yamada		}
2001dd88ab32SMasahiro Yamada
2002dd88ab32SMasahiro Yamada# Check if there is UTF-8 in a commit log when a mail header has explicitly
2003dd88ab32SMasahiro Yamada# declined it, i.e defined some charset where it is missing.
2004dd88ab32SMasahiro Yamada		if ($in_header_lines &&
2005dd88ab32SMasahiro Yamada		    $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
2006dd88ab32SMasahiro Yamada		    $1 !~ /utf-8/i) {
2007dd88ab32SMasahiro Yamada			$non_utf8_charset = 1;
2008dd88ab32SMasahiro Yamada		}
2009dd88ab32SMasahiro Yamada
2010dd88ab32SMasahiro Yamada		if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
2011dd88ab32SMasahiro Yamada		    $rawline =~ /$NON_ASCII_UTF8/) {
2012dd88ab32SMasahiro Yamada			WARN("UTF8_BEFORE_PATCH",
2013dd88ab32SMasahiro Yamada			    "8-bit UTF-8 used in possible commit log\n" . $herecurr);
2014dd88ab32SMasahiro Yamada		}
2015dd88ab32SMasahiro Yamada
2016*c10e0f5bSDan Murphy# Check for various typo / spelling mistakes
2017*c10e0f5bSDan Murphy		if (defined($misspellings) &&
2018*c10e0f5bSDan Murphy		    ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
2019*c10e0f5bSDan Murphy			while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) {
2020*c10e0f5bSDan Murphy				my $typo = $1;
2021*c10e0f5bSDan Murphy				my $typo_fix = $spelling_fix{lc($typo)};
2022*c10e0f5bSDan Murphy				$typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/);
2023*c10e0f5bSDan Murphy				$typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/);
2024*c10e0f5bSDan Murphy				my $msg_type = \&WARN;
2025*c10e0f5bSDan Murphy				$msg_type = \&CHK if ($file);
2026*c10e0f5bSDan Murphy				if (&{$msg_type}("TYPO_SPELLING",
2027*c10e0f5bSDan Murphy						 "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) &&
2028*c10e0f5bSDan Murphy				    $fix) {
2029*c10e0f5bSDan Murphy					$fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
2030*c10e0f5bSDan Murphy				}
2031*c10e0f5bSDan Murphy			}
2032*c10e0f5bSDan Murphy		}
2033*c10e0f5bSDan Murphy
2034dd88ab32SMasahiro Yamada# ignore non-hunk lines and lines being removed
2035dd88ab32SMasahiro Yamada		next if (!$hunk_line || $line =~ /^-/);
2036dd88ab32SMasahiro Yamada
2037dd88ab32SMasahiro Yamada#trailing whitespace
2038dd88ab32SMasahiro Yamada		if ($line =~ /^\+.*\015/) {
2039dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
20406b9709d9STom Rini			if (ERROR("DOS_LINE_ENDINGS",
20416b9709d9STom Rini				  "DOS line endings\n" . $herevet) &&
20426b9709d9STom Rini			    $fix) {
20436b9709d9STom Rini				$fixed[$linenr - 1] =~ s/[\s\015]+$//;
20446b9709d9STom Rini			}
2045dd88ab32SMasahiro Yamada		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
2046dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
20476b9709d9STom Rini			if (ERROR("TRAILING_WHITESPACE",
20486b9709d9STom Rini				  "trailing whitespace\n" . $herevet) &&
20496b9709d9STom Rini			    $fix) {
20506b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\s+$//;
20516b9709d9STom Rini			}
20526b9709d9STom Rini
2053dd88ab32SMasahiro Yamada			$rpt_cleaners = 1;
2054dd88ab32SMasahiro Yamada		}
2055dd88ab32SMasahiro Yamada
20566b9709d9STom Rini# Check for FSF mailing addresses.
20576b9709d9STom Rini		if ($rawline =~ /\bwrite to the Free/i ||
20586b9709d9STom Rini		    $rawline =~ /\b59\s+Temple\s+Pl/i ||
20596b9709d9STom Rini		    $rawline =~ /\b51\s+Franklin\s+St/i) {
20606b9709d9STom Rini			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
20616b9709d9STom Rini			my $msg_type = \&ERROR;
20626b9709d9STom Rini			$msg_type = \&CHK if ($file);
20636b9709d9STom Rini			&{$msg_type}("FSF_MAILING_ADDRESS",
20646b9709d9STom 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)
20656b9709d9STom Rini		}
20666b9709d9STom Rini
2067dd88ab32SMasahiro Yamada# check for Kconfig help text having a real description
2068dd88ab32SMasahiro Yamada# Only applies when adding the entry originally, after that we do not have
2069dd88ab32SMasahiro Yamada# sufficient context to determine whether it is indeed long enough.
2070dd88ab32SMasahiro Yamada		if ($realfile =~ /Kconfig/ &&
2071dd88ab32SMasahiro Yamada		    $line =~ /.\s*config\s+/) {
2072dd88ab32SMasahiro Yamada			my $length = 0;
2073dd88ab32SMasahiro Yamada			my $cnt = $realcnt;
2074dd88ab32SMasahiro Yamada			my $ln = $linenr + 1;
2075dd88ab32SMasahiro Yamada			my $f;
2076dd88ab32SMasahiro Yamada			my $is_start = 0;
2077dd88ab32SMasahiro Yamada			my $is_end = 0;
2078dd88ab32SMasahiro Yamada			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
2079dd88ab32SMasahiro Yamada				$f = $lines[$ln - 1];
2080dd88ab32SMasahiro Yamada				$cnt-- if ($lines[$ln - 1] !~ /^-/);
2081dd88ab32SMasahiro Yamada				$is_end = $lines[$ln - 1] =~ /^\+/;
2082dd88ab32SMasahiro Yamada
2083dd88ab32SMasahiro Yamada				next if ($f =~ /^-/);
2084dd88ab32SMasahiro Yamada
2085dd88ab32SMasahiro Yamada				if ($lines[$ln - 1] =~ /.\s*(?:bool|tristate)\s*\"/) {
2086dd88ab32SMasahiro Yamada					$is_start = 1;
2087dd88ab32SMasahiro Yamada				} elsif ($lines[$ln - 1] =~ /.\s*(?:---)?help(?:---)?$/) {
2088dd88ab32SMasahiro Yamada					$length = -1;
2089dd88ab32SMasahiro Yamada				}
2090dd88ab32SMasahiro Yamada
2091dd88ab32SMasahiro Yamada				$f =~ s/^.//;
2092dd88ab32SMasahiro Yamada				$f =~ s/#.*//;
2093dd88ab32SMasahiro Yamada				$f =~ s/^\s+//;
2094dd88ab32SMasahiro Yamada				next if ($f =~ /^$/);
2095dd88ab32SMasahiro Yamada				if ($f =~ /^\s*config\s/) {
2096dd88ab32SMasahiro Yamada					$is_end = 1;
2097dd88ab32SMasahiro Yamada					last;
2098dd88ab32SMasahiro Yamada				}
2099dd88ab32SMasahiro Yamada				$length++;
2100dd88ab32SMasahiro Yamada			}
2101dd88ab32SMasahiro Yamada			WARN("CONFIG_DESCRIPTION",
2102dd88ab32SMasahiro Yamada			     "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_start && $is_end && $length < 4);
2103dd88ab32SMasahiro Yamada			#print "is_start<$is_start> is_end<$is_end> length<$length>\n";
2104dd88ab32SMasahiro Yamada		}
2105dd88ab32SMasahiro Yamada
2106dd88ab32SMasahiro Yamada# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
2107dd88ab32SMasahiro Yamada		if ($realfile =~ /Kconfig/ &&
2108dd88ab32SMasahiro Yamada		    $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
2109dd88ab32SMasahiro Yamada			WARN("CONFIG_EXPERIMENTAL",
2110dd88ab32SMasahiro Yamada			     "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2111dd88ab32SMasahiro Yamada		}
2112dd88ab32SMasahiro Yamada
2113dd88ab32SMasahiro Yamada		if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
2114dd88ab32SMasahiro Yamada		    ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
2115dd88ab32SMasahiro Yamada			my $flag = $1;
2116dd88ab32SMasahiro Yamada			my $replacement = {
2117dd88ab32SMasahiro Yamada				'EXTRA_AFLAGS' =>   'asflags-y',
2118dd88ab32SMasahiro Yamada				'EXTRA_CFLAGS' =>   'ccflags-y',
2119dd88ab32SMasahiro Yamada				'EXTRA_CPPFLAGS' => 'cppflags-y',
2120dd88ab32SMasahiro Yamada				'EXTRA_LDFLAGS' =>  'ldflags-y',
2121dd88ab32SMasahiro Yamada			};
2122dd88ab32SMasahiro Yamada
2123dd88ab32SMasahiro Yamada			WARN("DEPRECATED_VARIABLE",
2124dd88ab32SMasahiro Yamada			     "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
2125dd88ab32SMasahiro Yamada		}
2126dd88ab32SMasahiro Yamada
21276b9709d9STom Rini# check for DT compatible documentation
21286b9709d9STom Rini		if (defined $root && $realfile =~ /\.dts/ &&
21296b9709d9STom Rini		    $rawline =~ /^\+\s*compatible\s*=/) {
21306b9709d9STom Rini			my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
21316b9709d9STom Rini
21326b9709d9STom Rini			foreach my $compat (@compats) {
21336b9709d9STom Rini				my $compat2 = $compat;
21346b9709d9STom Rini				my $dt_path =  $root . "/Documentation/devicetree/bindings/";
21356b9709d9STom Rini				$compat2 =~ s/\,[a-z]*\-/\,<\.\*>\-/;
21366b9709d9STom Rini				`grep -Erq "$compat|$compat2" $dt_path`;
21376b9709d9STom Rini				if ( $? >> 8 ) {
21386b9709d9STom Rini					WARN("UNDOCUMENTED_DT_STRING",
21396b9709d9STom Rini					     "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
21406b9709d9STom Rini				}
21416b9709d9STom Rini
21426b9709d9STom Rini				my $vendor = $compat;
21436b9709d9STom Rini				my $vendor_path = $dt_path . "vendor-prefixes.txt";
21446b9709d9STom Rini				next if (! -f $vendor_path);
21456b9709d9STom Rini				$vendor =~ s/^([a-zA-Z0-9]+)\,.*/$1/;
21466b9709d9STom Rini				`grep -Eq "$vendor" $vendor_path`;
21476b9709d9STom Rini				if ( $? >> 8 ) {
21486b9709d9STom Rini					WARN("UNDOCUMENTED_DT_STRING",
21496b9709d9STom Rini					     "DT compatible string vendor \"$vendor\" appears un-documented -- check $vendor_path\n" . $herecurr);
21506b9709d9STom Rini				}
21516b9709d9STom Rini			}
21526b9709d9STom Rini		}
21536b9709d9STom Rini
2154dd88ab32SMasahiro Yamada# check we are in a valid source file if not then ignore this hunk
2155dd88ab32SMasahiro Yamada		next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
2156dd88ab32SMasahiro Yamada
2157dd88ab32SMasahiro Yamada#line length limit
2158dd88ab32SMasahiro Yamada		if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
2159dd88ab32SMasahiro Yamada		    $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
2160dd88ab32SMasahiro Yamada		    !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
2161dd88ab32SMasahiro Yamada		    $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
2162dd88ab32SMasahiro Yamada		    $length > $max_line_length)
2163dd88ab32SMasahiro Yamada		{
2164dd88ab32SMasahiro Yamada			WARN("LONG_LINE",
2165dd88ab32SMasahiro Yamada			     "line over $max_line_length characters\n" . $herecurr);
2166dd88ab32SMasahiro Yamada		}
2167dd88ab32SMasahiro Yamada
2168dd88ab32SMasahiro Yamada# Check for user-visible strings broken across lines, which breaks the ability
21696b9709d9STom Rini# to grep for the string.  Make exceptions when the previous string ends in a
21706b9709d9STom Rini# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
21716b9709d9STom Rini# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
2172dd88ab32SMasahiro Yamada		if ($line =~ /^\+\s*"/ &&
2173dd88ab32SMasahiro Yamada		    $prevline =~ /"\s*$/ &&
21746b9709d9STom Rini		    $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
2175dd88ab32SMasahiro Yamada			WARN("SPLIT_STRING",
2176dd88ab32SMasahiro Yamada			     "quoted string split across lines\n" . $hereprev);
2177dd88ab32SMasahiro Yamada		}
2178dd88ab32SMasahiro Yamada
2179dd88ab32SMasahiro Yamada# check for spaces before a quoted newline
2180dd88ab32SMasahiro Yamada		if ($rawline =~ /^.*\".*\s\\n/) {
21816b9709d9STom Rini			if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
21826b9709d9STom Rini				 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
21836b9709d9STom Rini			    $fix) {
21846b9709d9STom Rini				$fixed[$linenr - 1] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
21856b9709d9STom Rini			}
21866b9709d9STom Rini
2187dd88ab32SMasahiro Yamada		}
2188dd88ab32SMasahiro Yamada
2189dd88ab32SMasahiro Yamada# check for adding lines without a newline.
2190dd88ab32SMasahiro Yamada		if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
2191dd88ab32SMasahiro Yamada			WARN("MISSING_EOF_NEWLINE",
2192dd88ab32SMasahiro Yamada			     "adding a line without newline at end of file\n" . $herecurr);
2193dd88ab32SMasahiro Yamada		}
2194dd88ab32SMasahiro Yamada
2195dd88ab32SMasahiro Yamada# Blackfin: use hi/lo macros
2196dd88ab32SMasahiro Yamada		if ($realfile =~ m@arch/blackfin/.*\.S$@) {
2197dd88ab32SMasahiro Yamada			if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
2198dd88ab32SMasahiro Yamada				my $herevet = "$here\n" . cat_vet($line) . "\n";
2199dd88ab32SMasahiro Yamada				ERROR("LO_MACRO",
2200dd88ab32SMasahiro Yamada				      "use the LO() macro, not (... & 0xFFFF)\n" . $herevet);
2201dd88ab32SMasahiro Yamada			}
2202dd88ab32SMasahiro Yamada			if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
2203dd88ab32SMasahiro Yamada				my $herevet = "$here\n" . cat_vet($line) . "\n";
2204dd88ab32SMasahiro Yamada				ERROR("HI_MACRO",
2205dd88ab32SMasahiro Yamada				      "use the HI() macro, not (... >> 16)\n" . $herevet);
2206dd88ab32SMasahiro Yamada			}
2207dd88ab32SMasahiro Yamada		}
2208dd88ab32SMasahiro Yamada
2209dd88ab32SMasahiro Yamada# check we are in a valid source file C or perl if not then ignore this hunk
2210dd88ab32SMasahiro Yamada		next if ($realfile !~ /\.(h|c|pl)$/);
2211dd88ab32SMasahiro Yamada
2212dd88ab32SMasahiro Yamada# at the beginning of a line any tabs must come first and anything
2213dd88ab32SMasahiro Yamada# more than 8 must use tabs.
2214dd88ab32SMasahiro Yamada		if ($rawline =~ /^\+\s* \t\s*\S/ ||
2215dd88ab32SMasahiro Yamada		    $rawline =~ /^\+\s*        \s*/) {
2216dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2217dd88ab32SMasahiro Yamada			$rpt_cleaners = 1;
22186b9709d9STom Rini			if (ERROR("CODE_INDENT",
22196b9709d9STom Rini				  "code indent should use tabs where possible\n" . $herevet) &&
22206b9709d9STom Rini			    $fix) {
22216b9709d9STom Rini				$fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
22226b9709d9STom Rini			}
2223dd88ab32SMasahiro Yamada		}
2224dd88ab32SMasahiro Yamada
2225dd88ab32SMasahiro Yamada# check for space before tabs.
2226dd88ab32SMasahiro Yamada		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
2227dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
22286b9709d9STom Rini			if (WARN("SPACE_BEFORE_TAB",
22296b9709d9STom Rini				"please, no space before tabs\n" . $herevet) &&
22306b9709d9STom Rini			    $fix) {
22316b9709d9STom Rini				while ($fixed[$linenr - 1] =~
2232e3a4facdSJoe Perches					   s/(^\+.*) {8,8}\t/$1\t\t/) {}
22336b9709d9STom Rini				while ($fixed[$linenr - 1] =~
22346b9709d9STom Rini					   s/(^\+.*) +\t/$1\t/) {}
22356b9709d9STom Rini			}
2236dd88ab32SMasahiro Yamada		}
2237dd88ab32SMasahiro Yamada
2238dd88ab32SMasahiro Yamada# check for && or || at the start of a line
2239dd88ab32SMasahiro Yamada		if ($rawline =~ /^\+\s*(&&|\|\|)/) {
2240dd88ab32SMasahiro Yamada			CHK("LOGICAL_CONTINUATIONS",
2241dd88ab32SMasahiro Yamada			    "Logical continuations should be on the previous line\n" . $hereprev);
2242dd88ab32SMasahiro Yamada		}
2243dd88ab32SMasahiro Yamada
2244dd88ab32SMasahiro Yamada# check multi-line statement indentation matches previous line
2245dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
2246dd88ab32SMasahiro Yamada		    $prevline =~ /^\+(\t*)(if \(|$Ident\().*(\&\&|\|\||,)\s*$/) {
2247dd88ab32SMasahiro Yamada			$prevline =~ /^\+(\t*)(.*)$/;
2248dd88ab32SMasahiro Yamada			my $oldindent = $1;
2249dd88ab32SMasahiro Yamada			my $rest = $2;
2250dd88ab32SMasahiro Yamada
2251dd88ab32SMasahiro Yamada			my $pos = pos_last_openparen($rest);
2252dd88ab32SMasahiro Yamada			if ($pos >= 0) {
2253dd88ab32SMasahiro Yamada				$line =~ /^(\+| )([ \t]*)/;
2254dd88ab32SMasahiro Yamada				my $newindent = $2;
2255dd88ab32SMasahiro Yamada
2256dd88ab32SMasahiro Yamada				my $goodtabindent = $oldindent .
2257dd88ab32SMasahiro Yamada					"\t" x ($pos / 8) .
2258dd88ab32SMasahiro Yamada					" "  x ($pos % 8);
2259dd88ab32SMasahiro Yamada				my $goodspaceindent = $oldindent . " "  x $pos;
2260dd88ab32SMasahiro Yamada
2261dd88ab32SMasahiro Yamada				if ($newindent ne $goodtabindent &&
2262dd88ab32SMasahiro Yamada				    $newindent ne $goodspaceindent) {
22636b9709d9STom Rini
22646b9709d9STom Rini					if (CHK("PARENTHESIS_ALIGNMENT",
22656b9709d9STom Rini						"Alignment should match open parenthesis\n" . $hereprev) &&
22666b9709d9STom Rini					    $fix && $line =~ /^\+/) {
22676b9709d9STom Rini						$fixed[$linenr - 1] =~
22686b9709d9STom Rini						    s/^\+[ \t]*/\+$goodtabindent/;
22696b9709d9STom Rini					}
2270dd88ab32SMasahiro Yamada				}
2271dd88ab32SMasahiro Yamada			}
2272dd88ab32SMasahiro Yamada		}
2273dd88ab32SMasahiro Yamada
22746b9709d9STom Rini		if ($line =~ /^\+.*\*[ \t]*\)[ \t]+(?!$Assignment|$Arithmetic)/) {
22756b9709d9STom Rini			if (CHK("SPACING",
22766b9709d9STom Rini				"No space is necessary after a cast\n" . $hereprev) &&
22776b9709d9STom Rini			    $fix) {
22786b9709d9STom Rini				$fixed[$linenr - 1] =~
22796b9709d9STom Rini				    s/^(\+.*\*[ \t]*\))[ \t]+/$1/;
22806b9709d9STom Rini			}
2281dd88ab32SMasahiro Yamada		}
2282dd88ab32SMasahiro Yamada
2283dd88ab32SMasahiro Yamada		if ($realfile =~ m@^(drivers/net/|net/)@ &&
22846b9709d9STom Rini		    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
22856b9709d9STom Rini		    $rawline =~ /^\+[ \t]*\*/) {
2286dd88ab32SMasahiro Yamada			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2287dd88ab32SMasahiro Yamada			     "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
2288dd88ab32SMasahiro Yamada		}
2289dd88ab32SMasahiro Yamada
2290dd88ab32SMasahiro Yamada		if ($realfile =~ m@^(drivers/net/|net/)@ &&
22916b9709d9STom Rini		    $prevrawline =~ /^\+[ \t]*\/\*/ &&		#starting /*
22926b9709d9STom Rini		    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */
22936b9709d9STom Rini		    $rawline =~ /^\+/ &&			#line is new
22946b9709d9STom Rini		    $rawline !~ /^\+[ \t]*\*/) {		#no leading *
22956b9709d9STom Rini			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
22966b9709d9STom Rini			     "networking block comments start with * on subsequent lines\n" . $hereprev);
22976b9709d9STom Rini		}
22986b9709d9STom Rini
22996b9709d9STom Rini		if ($realfile =~ m@^(drivers/net/|net/)@ &&
2300dd88ab32SMasahiro Yamada		    $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */
2301dd88ab32SMasahiro Yamada		    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
2302dd88ab32SMasahiro Yamada		    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/
2303dd88ab32SMasahiro Yamada		    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */
2304dd88ab32SMasahiro Yamada			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2305dd88ab32SMasahiro Yamada			     "networking block comments put the trailing */ on a separate line\n" . $herecurr);
2306dd88ab32SMasahiro Yamada		}
2307dd88ab32SMasahiro Yamada
2308dd88ab32SMasahiro Yamada# check for spaces at the beginning of a line.
2309dd88ab32SMasahiro Yamada# Exceptions:
2310dd88ab32SMasahiro Yamada#  1) within comments
2311dd88ab32SMasahiro Yamada#  2) indented preprocessor commands
2312dd88ab32SMasahiro Yamada#  3) hanging labels
23136b9709d9STom Rini		if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/)  {
2314dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
23156b9709d9STom Rini			if (WARN("LEADING_SPACE",
23166b9709d9STom Rini				 "please, no spaces at the start of a line\n" . $herevet) &&
23176b9709d9STom Rini			    $fix) {
23186b9709d9STom Rini				$fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
23196b9709d9STom Rini			}
2320dd88ab32SMasahiro Yamada		}
2321dd88ab32SMasahiro Yamada
2322dd88ab32SMasahiro Yamada# check we are in a valid C source file if not then ignore this hunk
2323dd88ab32SMasahiro Yamada		next if ($realfile !~ /\.(h|c)$/);
2324dd88ab32SMasahiro Yamada
2325dd88ab32SMasahiro Yamada# discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
2326dd88ab32SMasahiro Yamada		if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
2327dd88ab32SMasahiro Yamada			WARN("CONFIG_EXPERIMENTAL",
2328dd88ab32SMasahiro Yamada			     "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2329dd88ab32SMasahiro Yamada		}
2330dd88ab32SMasahiro Yamada
2331dd88ab32SMasahiro Yamada# check for RCS/CVS revision markers
2332dd88ab32SMasahiro Yamada		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
2333dd88ab32SMasahiro Yamada			WARN("CVS_KEYWORD",
2334dd88ab32SMasahiro Yamada			     "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
2335dd88ab32SMasahiro Yamada		}
2336dd88ab32SMasahiro Yamada
2337dd88ab32SMasahiro Yamada# Blackfin: don't use __builtin_bfin_[cs]sync
2338dd88ab32SMasahiro Yamada		if ($line =~ /__builtin_bfin_csync/) {
2339dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($line) . "\n";
2340dd88ab32SMasahiro Yamada			ERROR("CSYNC",
2341dd88ab32SMasahiro Yamada			      "use the CSYNC() macro in asm/blackfin.h\n" . $herevet);
2342dd88ab32SMasahiro Yamada		}
2343dd88ab32SMasahiro Yamada		if ($line =~ /__builtin_bfin_ssync/) {
2344dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($line) . "\n";
2345dd88ab32SMasahiro Yamada			ERROR("SSYNC",
2346dd88ab32SMasahiro Yamada			      "use the SSYNC() macro in asm/blackfin.h\n" . $herevet);
2347dd88ab32SMasahiro Yamada		}
2348dd88ab32SMasahiro Yamada
2349dd88ab32SMasahiro Yamada# check for old HOTPLUG __dev<foo> section markings
2350dd88ab32SMasahiro Yamada		if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
2351dd88ab32SMasahiro Yamada			WARN("HOTPLUG_SECTION",
2352dd88ab32SMasahiro Yamada			     "Using $1 is unnecessary\n" . $herecurr);
2353dd88ab32SMasahiro Yamada		}
2354dd88ab32SMasahiro Yamada
2355dd88ab32SMasahiro Yamada# Check for potential 'bare' types
2356dd88ab32SMasahiro Yamada		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
2357dd88ab32SMasahiro Yamada		    $realline_next);
2358dd88ab32SMasahiro Yamada#print "LINE<$line>\n";
2359dd88ab32SMasahiro Yamada		if ($linenr >= $suppress_statement &&
23606b9709d9STom Rini		    $realcnt && $sline =~ /.\s*\S/) {
2361dd88ab32SMasahiro Yamada			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
2362dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0);
2363dd88ab32SMasahiro Yamada			$stat =~ s/\n./\n /g;
2364dd88ab32SMasahiro Yamada			$cond =~ s/\n./\n /g;
2365dd88ab32SMasahiro Yamada
2366dd88ab32SMasahiro Yamada#print "linenr<$linenr> <$stat>\n";
2367dd88ab32SMasahiro Yamada			# If this statement has no statement boundaries within
2368dd88ab32SMasahiro Yamada			# it there is no point in retrying a statement scan
2369dd88ab32SMasahiro Yamada			# until we hit end of it.
2370dd88ab32SMasahiro Yamada			my $frag = $stat; $frag =~ s/;+\s*$//;
2371dd88ab32SMasahiro Yamada			if ($frag !~ /(?:{|;)/) {
2372dd88ab32SMasahiro Yamada#print "skip<$line_nr_next>\n";
2373dd88ab32SMasahiro Yamada				$suppress_statement = $line_nr_next;
2374dd88ab32SMasahiro Yamada			}
2375dd88ab32SMasahiro Yamada
2376dd88ab32SMasahiro Yamada			# Find the real next line.
2377dd88ab32SMasahiro Yamada			$realline_next = $line_nr_next;
2378dd88ab32SMasahiro Yamada			if (defined $realline_next &&
2379dd88ab32SMasahiro Yamada			    (!defined $lines[$realline_next - 1] ||
2380dd88ab32SMasahiro Yamada			     substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
2381dd88ab32SMasahiro Yamada				$realline_next++;
2382dd88ab32SMasahiro Yamada			}
2383dd88ab32SMasahiro Yamada
2384dd88ab32SMasahiro Yamada			my $s = $stat;
2385dd88ab32SMasahiro Yamada			$s =~ s/{.*$//s;
2386dd88ab32SMasahiro Yamada
2387dd88ab32SMasahiro Yamada			# Ignore goto labels.
2388dd88ab32SMasahiro Yamada			if ($s =~ /$Ident:\*$/s) {
2389dd88ab32SMasahiro Yamada
2390dd88ab32SMasahiro Yamada			# Ignore functions being called
2391dd88ab32SMasahiro Yamada			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
2392dd88ab32SMasahiro Yamada
2393dd88ab32SMasahiro Yamada			} elsif ($s =~ /^.\s*else\b/s) {
2394dd88ab32SMasahiro Yamada
2395dd88ab32SMasahiro Yamada			# declarations always start with types
2396dd88ab32SMasahiro 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) {
2397dd88ab32SMasahiro Yamada				my $type = $1;
2398dd88ab32SMasahiro Yamada				$type =~ s/\s+/ /g;
2399dd88ab32SMasahiro Yamada				possible($type, "A:" . $s);
2400dd88ab32SMasahiro Yamada
2401dd88ab32SMasahiro Yamada			# definitions in global scope can only start with types
2402dd88ab32SMasahiro Yamada			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
2403dd88ab32SMasahiro Yamada				possible($1, "B:" . $s);
2404dd88ab32SMasahiro Yamada			}
2405dd88ab32SMasahiro Yamada
2406dd88ab32SMasahiro Yamada			# any (foo ... *) is a pointer cast, and foo is a type
2407dd88ab32SMasahiro Yamada			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
2408dd88ab32SMasahiro Yamada				possible($1, "C:" . $s);
2409dd88ab32SMasahiro Yamada			}
2410dd88ab32SMasahiro Yamada
2411dd88ab32SMasahiro Yamada			# Check for any sort of function declaration.
2412dd88ab32SMasahiro Yamada			# int foo(something bar, other baz);
2413dd88ab32SMasahiro Yamada			# void (*store_gdt)(x86_descr_ptr *);
2414dd88ab32SMasahiro Yamada			if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
2415dd88ab32SMasahiro Yamada				my ($name_len) = length($1);
2416dd88ab32SMasahiro Yamada
2417dd88ab32SMasahiro Yamada				my $ctx = $s;
2418dd88ab32SMasahiro Yamada				substr($ctx, 0, $name_len + 1, '');
2419dd88ab32SMasahiro Yamada				$ctx =~ s/\)[^\)]*$//;
2420dd88ab32SMasahiro Yamada
2421dd88ab32SMasahiro Yamada				for my $arg (split(/\s*,\s*/, $ctx)) {
2422dd88ab32SMasahiro Yamada					if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
2423dd88ab32SMasahiro Yamada
2424dd88ab32SMasahiro Yamada						possible($1, "D:" . $s);
2425dd88ab32SMasahiro Yamada					}
2426dd88ab32SMasahiro Yamada				}
2427dd88ab32SMasahiro Yamada			}
2428dd88ab32SMasahiro Yamada
2429dd88ab32SMasahiro Yamada		}
2430dd88ab32SMasahiro Yamada
2431dd88ab32SMasahiro Yamada#
2432dd88ab32SMasahiro Yamada# Checks which may be anchored in the context.
2433dd88ab32SMasahiro Yamada#
2434dd88ab32SMasahiro Yamada
2435dd88ab32SMasahiro Yamada# Check for switch () and associated case and default
2436dd88ab32SMasahiro Yamada# statements should be at the same indent.
2437dd88ab32SMasahiro Yamada		if ($line=~/\bswitch\s*\(.*\)/) {
2438dd88ab32SMasahiro Yamada			my $err = '';
2439dd88ab32SMasahiro Yamada			my $sep = '';
2440dd88ab32SMasahiro Yamada			my @ctx = ctx_block_outer($linenr, $realcnt);
2441dd88ab32SMasahiro Yamada			shift(@ctx);
2442dd88ab32SMasahiro Yamada			for my $ctx (@ctx) {
2443dd88ab32SMasahiro Yamada				my ($clen, $cindent) = line_stats($ctx);
2444dd88ab32SMasahiro Yamada				if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
2445dd88ab32SMasahiro Yamada							$indent != $cindent) {
2446dd88ab32SMasahiro Yamada					$err .= "$sep$ctx\n";
2447dd88ab32SMasahiro Yamada					$sep = '';
2448dd88ab32SMasahiro Yamada				} else {
2449dd88ab32SMasahiro Yamada					$sep = "[...]\n";
2450dd88ab32SMasahiro Yamada				}
2451dd88ab32SMasahiro Yamada			}
2452dd88ab32SMasahiro Yamada			if ($err ne '') {
2453dd88ab32SMasahiro Yamada				ERROR("SWITCH_CASE_INDENT_LEVEL",
2454dd88ab32SMasahiro Yamada				      "switch and case should be at the same indent\n$hereline$err");
2455dd88ab32SMasahiro Yamada			}
2456dd88ab32SMasahiro Yamada		}
2457dd88ab32SMasahiro Yamada
2458dd88ab32SMasahiro Yamada# if/while/etc brace do not go on next line, unless defining a do while loop,
2459dd88ab32SMasahiro Yamada# or if that brace on the next line is for something else
2460dd88ab32SMasahiro Yamada		if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
2461dd88ab32SMasahiro Yamada			my $pre_ctx = "$1$2";
2462dd88ab32SMasahiro Yamada
2463dd88ab32SMasahiro Yamada			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
2464dd88ab32SMasahiro Yamada
2465dd88ab32SMasahiro Yamada			if ($line =~ /^\+\t{6,}/) {
2466dd88ab32SMasahiro Yamada				WARN("DEEP_INDENTATION",
2467dd88ab32SMasahiro Yamada				     "Too many leading tabs - consider code refactoring\n" . $herecurr);
2468dd88ab32SMasahiro Yamada			}
2469dd88ab32SMasahiro Yamada
2470dd88ab32SMasahiro Yamada			my $ctx_cnt = $realcnt - $#ctx - 1;
2471dd88ab32SMasahiro Yamada			my $ctx = join("\n", @ctx);
2472dd88ab32SMasahiro Yamada
2473dd88ab32SMasahiro Yamada			my $ctx_ln = $linenr;
2474dd88ab32SMasahiro Yamada			my $ctx_skip = $realcnt;
2475dd88ab32SMasahiro Yamada
2476dd88ab32SMasahiro Yamada			while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
2477dd88ab32SMasahiro Yamada					defined $lines[$ctx_ln - 1] &&
2478dd88ab32SMasahiro Yamada					$lines[$ctx_ln - 1] =~ /^-/)) {
2479dd88ab32SMasahiro Yamada				##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
2480dd88ab32SMasahiro Yamada				$ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
2481dd88ab32SMasahiro Yamada				$ctx_ln++;
2482dd88ab32SMasahiro Yamada			}
2483dd88ab32SMasahiro Yamada
2484dd88ab32SMasahiro Yamada			#print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
2485dd88ab32SMasahiro Yamada			#print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
2486dd88ab32SMasahiro Yamada
2487dd88ab32SMasahiro Yamada			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
2488dd88ab32SMasahiro Yamada				ERROR("OPEN_BRACE",
2489dd88ab32SMasahiro Yamada				      "that open brace { should be on the previous line\n" .
2490dd88ab32SMasahiro Yamada					"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
2491dd88ab32SMasahiro Yamada			}
2492dd88ab32SMasahiro Yamada			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
2493dd88ab32SMasahiro Yamada			    $ctx =~ /\)\s*\;\s*$/ &&
2494dd88ab32SMasahiro Yamada			    defined $lines[$ctx_ln - 1])
2495dd88ab32SMasahiro Yamada			{
2496dd88ab32SMasahiro Yamada				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
2497dd88ab32SMasahiro Yamada				if ($nindent > $indent) {
2498dd88ab32SMasahiro Yamada					WARN("TRAILING_SEMICOLON",
2499dd88ab32SMasahiro Yamada					     "trailing semicolon indicates no statements, indent implies otherwise\n" .
2500dd88ab32SMasahiro Yamada						"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
2501dd88ab32SMasahiro Yamada				}
2502dd88ab32SMasahiro Yamada			}
2503dd88ab32SMasahiro Yamada		}
2504dd88ab32SMasahiro Yamada
2505dd88ab32SMasahiro Yamada# Check relative indent for conditionals and blocks.
2506dd88ab32SMasahiro Yamada		if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
2507dd88ab32SMasahiro Yamada			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
2508dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0)
2509dd88ab32SMasahiro Yamada					if (!defined $stat);
2510dd88ab32SMasahiro Yamada			my ($s, $c) = ($stat, $cond);
2511dd88ab32SMasahiro Yamada
2512dd88ab32SMasahiro Yamada			substr($s, 0, length($c), '');
2513dd88ab32SMasahiro Yamada
2514dd88ab32SMasahiro Yamada			# Make sure we remove the line prefixes as we have
2515dd88ab32SMasahiro Yamada			# none on the first line, and are going to readd them
2516dd88ab32SMasahiro Yamada			# where necessary.
2517dd88ab32SMasahiro Yamada			$s =~ s/\n./\n/gs;
2518dd88ab32SMasahiro Yamada
2519dd88ab32SMasahiro Yamada			# Find out how long the conditional actually is.
2520dd88ab32SMasahiro Yamada			my @newlines = ($c =~ /\n/gs);
2521dd88ab32SMasahiro Yamada			my $cond_lines = 1 + $#newlines;
2522dd88ab32SMasahiro Yamada
2523dd88ab32SMasahiro Yamada			# We want to check the first line inside the block
2524dd88ab32SMasahiro Yamada			# starting at the end of the conditional, so remove:
2525dd88ab32SMasahiro Yamada			#  1) any blank line termination
2526dd88ab32SMasahiro Yamada			#  2) any opening brace { on end of the line
2527dd88ab32SMasahiro Yamada			#  3) any do (...) {
2528dd88ab32SMasahiro Yamada			my $continuation = 0;
2529dd88ab32SMasahiro Yamada			my $check = 0;
2530dd88ab32SMasahiro Yamada			$s =~ s/^.*\bdo\b//;
2531dd88ab32SMasahiro Yamada			$s =~ s/^\s*{//;
2532dd88ab32SMasahiro Yamada			if ($s =~ s/^\s*\\//) {
2533dd88ab32SMasahiro Yamada				$continuation = 1;
2534dd88ab32SMasahiro Yamada			}
2535dd88ab32SMasahiro Yamada			if ($s =~ s/^\s*?\n//) {
2536dd88ab32SMasahiro Yamada				$check = 1;
2537dd88ab32SMasahiro Yamada				$cond_lines++;
2538dd88ab32SMasahiro Yamada			}
2539dd88ab32SMasahiro Yamada
2540dd88ab32SMasahiro Yamada			# Also ignore a loop construct at the end of a
2541dd88ab32SMasahiro Yamada			# preprocessor statement.
2542dd88ab32SMasahiro Yamada			if (($prevline =~ /^.\s*#\s*define\s/ ||
2543dd88ab32SMasahiro Yamada			    $prevline =~ /\\\s*$/) && $continuation == 0) {
2544dd88ab32SMasahiro Yamada				$check = 0;
2545dd88ab32SMasahiro Yamada			}
2546dd88ab32SMasahiro Yamada
2547dd88ab32SMasahiro Yamada			my $cond_ptr = -1;
2548dd88ab32SMasahiro Yamada			$continuation = 0;
2549dd88ab32SMasahiro Yamada			while ($cond_ptr != $cond_lines) {
2550dd88ab32SMasahiro Yamada				$cond_ptr = $cond_lines;
2551dd88ab32SMasahiro Yamada
2552dd88ab32SMasahiro Yamada				# If we see an #else/#elif then the code
2553dd88ab32SMasahiro Yamada				# is not linear.
2554dd88ab32SMasahiro Yamada				if ($s =~ /^\s*\#\s*(?:else|elif)/) {
2555dd88ab32SMasahiro Yamada					$check = 0;
2556dd88ab32SMasahiro Yamada				}
2557dd88ab32SMasahiro Yamada
2558dd88ab32SMasahiro Yamada				# Ignore:
2559dd88ab32SMasahiro Yamada				#  1) blank lines, they should be at 0,
2560dd88ab32SMasahiro Yamada				#  2) preprocessor lines, and
2561dd88ab32SMasahiro Yamada				#  3) labels.
2562dd88ab32SMasahiro Yamada				if ($continuation ||
2563dd88ab32SMasahiro Yamada				    $s =~ /^\s*?\n/ ||
2564dd88ab32SMasahiro Yamada				    $s =~ /^\s*#\s*?/ ||
2565dd88ab32SMasahiro Yamada				    $s =~ /^\s*$Ident\s*:/) {
2566dd88ab32SMasahiro Yamada					$continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
2567dd88ab32SMasahiro Yamada					if ($s =~ s/^.*?\n//) {
2568dd88ab32SMasahiro Yamada						$cond_lines++;
2569dd88ab32SMasahiro Yamada					}
2570dd88ab32SMasahiro Yamada				}
2571dd88ab32SMasahiro Yamada			}
2572dd88ab32SMasahiro Yamada
2573dd88ab32SMasahiro Yamada			my (undef, $sindent) = line_stats("+" . $s);
2574dd88ab32SMasahiro Yamada			my $stat_real = raw_line($linenr, $cond_lines);
2575dd88ab32SMasahiro Yamada
2576dd88ab32SMasahiro Yamada			# Check if either of these lines are modified, else
2577dd88ab32SMasahiro Yamada			# this is not this patch's fault.
2578dd88ab32SMasahiro Yamada			if (!defined($stat_real) ||
2579dd88ab32SMasahiro Yamada			    $stat !~ /^\+/ && $stat_real !~ /^\+/) {
2580dd88ab32SMasahiro Yamada				$check = 0;
2581dd88ab32SMasahiro Yamada			}
2582dd88ab32SMasahiro Yamada			if (defined($stat_real) && $cond_lines > 1) {
2583dd88ab32SMasahiro Yamada				$stat_real = "[...]\n$stat_real";
2584dd88ab32SMasahiro Yamada			}
2585dd88ab32SMasahiro Yamada
2586dd88ab32SMasahiro 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";
2587dd88ab32SMasahiro Yamada
2588dd88ab32SMasahiro Yamada			if ($check && (($sindent % 8) != 0 ||
2589dd88ab32SMasahiro Yamada			    ($sindent <= $indent && $s ne ''))) {
2590dd88ab32SMasahiro Yamada				WARN("SUSPECT_CODE_INDENT",
2591dd88ab32SMasahiro Yamada				     "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
2592dd88ab32SMasahiro Yamada			}
2593dd88ab32SMasahiro Yamada		}
2594dd88ab32SMasahiro Yamada
2595dd88ab32SMasahiro Yamada		# Track the 'values' across context and added lines.
2596dd88ab32SMasahiro Yamada		my $opline = $line; $opline =~ s/^./ /;
2597dd88ab32SMasahiro Yamada		my ($curr_values, $curr_vars) =
2598dd88ab32SMasahiro Yamada				annotate_values($opline . "\n", $prev_values);
2599dd88ab32SMasahiro Yamada		$curr_values = $prev_values . $curr_values;
2600dd88ab32SMasahiro Yamada		if ($dbg_values) {
2601dd88ab32SMasahiro Yamada			my $outline = $opline; $outline =~ s/\t/ /g;
2602dd88ab32SMasahiro Yamada			print "$linenr > .$outline\n";
2603dd88ab32SMasahiro Yamada			print "$linenr > $curr_values\n";
2604dd88ab32SMasahiro Yamada			print "$linenr >  $curr_vars\n";
2605dd88ab32SMasahiro Yamada		}
2606dd88ab32SMasahiro Yamada		$prev_values = substr($curr_values, -1);
2607dd88ab32SMasahiro Yamada
2608dd88ab32SMasahiro Yamada#ignore lines not being added
26096b9709d9STom Rini		next if ($line =~ /^[^\+]/);
2610dd88ab32SMasahiro Yamada
2611dd88ab32SMasahiro Yamada# TEST: allow direct testing of the type matcher.
2612dd88ab32SMasahiro Yamada		if ($dbg_type) {
2613dd88ab32SMasahiro Yamada			if ($line =~ /^.\s*$Declare\s*$/) {
2614dd88ab32SMasahiro Yamada				ERROR("TEST_TYPE",
2615dd88ab32SMasahiro Yamada				      "TEST: is type\n" . $herecurr);
2616dd88ab32SMasahiro Yamada			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
2617dd88ab32SMasahiro Yamada				ERROR("TEST_NOT_TYPE",
2618dd88ab32SMasahiro Yamada				      "TEST: is not type ($1 is)\n". $herecurr);
2619dd88ab32SMasahiro Yamada			}
2620dd88ab32SMasahiro Yamada			next;
2621dd88ab32SMasahiro Yamada		}
2622dd88ab32SMasahiro Yamada# TEST: allow direct testing of the attribute matcher.
2623dd88ab32SMasahiro Yamada		if ($dbg_attr) {
2624dd88ab32SMasahiro Yamada			if ($line =~ /^.\s*$Modifier\s*$/) {
2625dd88ab32SMasahiro Yamada				ERROR("TEST_ATTR",
2626dd88ab32SMasahiro Yamada				      "TEST: is attr\n" . $herecurr);
2627dd88ab32SMasahiro Yamada			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
2628dd88ab32SMasahiro Yamada				ERROR("TEST_NOT_ATTR",
2629dd88ab32SMasahiro Yamada				      "TEST: is not attr ($1 is)\n". $herecurr);
2630dd88ab32SMasahiro Yamada			}
2631dd88ab32SMasahiro Yamada			next;
2632dd88ab32SMasahiro Yamada		}
2633dd88ab32SMasahiro Yamada
2634dd88ab32SMasahiro Yamada# check for initialisation to aggregates open brace on the next line
2635dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*{/ &&
2636dd88ab32SMasahiro Yamada		    $prevline =~ /(?:^|[^=])=\s*$/) {
2637dd88ab32SMasahiro Yamada			ERROR("OPEN_BRACE",
2638dd88ab32SMasahiro Yamada			      "that open brace { should be on the previous line\n" . $hereprev);
2639dd88ab32SMasahiro Yamada		}
2640dd88ab32SMasahiro Yamada
2641dd88ab32SMasahiro Yamada#
2642dd88ab32SMasahiro Yamada# Checks which are anchored on the added line.
2643dd88ab32SMasahiro Yamada#
2644dd88ab32SMasahiro Yamada
2645dd88ab32SMasahiro Yamada# check for malformed paths in #include statements (uses RAW line)
2646dd88ab32SMasahiro Yamada		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
2647dd88ab32SMasahiro Yamada			my $path = $1;
2648dd88ab32SMasahiro Yamada			if ($path =~ m{//}) {
2649dd88ab32SMasahiro Yamada				ERROR("MALFORMED_INCLUDE",
2650dd88ab32SMasahiro Yamada				      "malformed #include filename\n" . $herecurr);
2651dd88ab32SMasahiro Yamada			}
2652dd88ab32SMasahiro Yamada			if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
2653dd88ab32SMasahiro Yamada				ERROR("UAPI_INCLUDE",
2654dd88ab32SMasahiro Yamada				      "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
2655dd88ab32SMasahiro Yamada			}
2656dd88ab32SMasahiro Yamada		}
2657dd88ab32SMasahiro Yamada
2658dd88ab32SMasahiro Yamada# no C99 // comments
2659dd88ab32SMasahiro Yamada		if ($line =~ m{//}) {
26606b9709d9STom Rini			if (ERROR("C99_COMMENTS",
26616b9709d9STom Rini				  "do not use C99 // comments\n" . $herecurr) &&
26626b9709d9STom Rini			    $fix) {
26636b9709d9STom Rini				my $line = $fixed[$linenr - 1];
26646b9709d9STom Rini				if ($line =~ /\/\/(.*)$/) {
26656b9709d9STom Rini					my $comment = trim($1);
26666b9709d9STom Rini					$fixed[$linenr - 1] =~ s@\/\/(.*)$@/\* $comment \*/@;
26676b9709d9STom Rini				}
26686b9709d9STom Rini			}
2669dd88ab32SMasahiro Yamada		}
2670dd88ab32SMasahiro Yamada		# Remove C99 comments.
2671dd88ab32SMasahiro Yamada		$line =~ s@//.*@@;
2672dd88ab32SMasahiro Yamada		$opline =~ s@//.*@@;
2673dd88ab32SMasahiro Yamada
2674dd88ab32SMasahiro Yamada# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
2675dd88ab32SMasahiro Yamada# the whole statement.
2676dd88ab32SMasahiro Yamada#print "APW <$lines[$realline_next - 1]>\n";
2677dd88ab32SMasahiro Yamada		if (defined $realline_next &&
2678dd88ab32SMasahiro Yamada		    exists $lines[$realline_next - 1] &&
2679dd88ab32SMasahiro Yamada		    !defined $suppress_export{$realline_next} &&
2680dd88ab32SMasahiro Yamada		    ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2681dd88ab32SMasahiro Yamada		     $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
2682dd88ab32SMasahiro Yamada			# Handle definitions which produce identifiers with
2683dd88ab32SMasahiro Yamada			# a prefix:
2684dd88ab32SMasahiro Yamada			#   XXX(foo);
2685dd88ab32SMasahiro Yamada			#   EXPORT_SYMBOL(something_foo);
2686dd88ab32SMasahiro Yamada			my $name = $1;
2687dd88ab32SMasahiro Yamada			if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
2688dd88ab32SMasahiro Yamada			    $name =~ /^${Ident}_$2/) {
2689dd88ab32SMasahiro Yamada#print "FOO C name<$name>\n";
2690dd88ab32SMasahiro Yamada				$suppress_export{$realline_next} = 1;
2691dd88ab32SMasahiro Yamada
2692dd88ab32SMasahiro Yamada			} elsif ($stat !~ /(?:
2693dd88ab32SMasahiro Yamada				\n.}\s*$|
2694dd88ab32SMasahiro Yamada				^.DEFINE_$Ident\(\Q$name\E\)|
2695dd88ab32SMasahiro Yamada				^.DECLARE_$Ident\(\Q$name\E\)|
2696dd88ab32SMasahiro Yamada				^.LIST_HEAD\(\Q$name\E\)|
2697dd88ab32SMasahiro Yamada				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
2698dd88ab32SMasahiro Yamada				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
2699dd88ab32SMasahiro Yamada			    )/x) {
2700dd88ab32SMasahiro Yamada#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
2701dd88ab32SMasahiro Yamada				$suppress_export{$realline_next} = 2;
2702dd88ab32SMasahiro Yamada			} else {
2703dd88ab32SMasahiro Yamada				$suppress_export{$realline_next} = 1;
2704dd88ab32SMasahiro Yamada			}
2705dd88ab32SMasahiro Yamada		}
2706dd88ab32SMasahiro Yamada		if (!defined $suppress_export{$linenr} &&
2707dd88ab32SMasahiro Yamada		    $prevline =~ /^.\s*$/ &&
2708dd88ab32SMasahiro Yamada		    ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2709dd88ab32SMasahiro Yamada		     $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
2710dd88ab32SMasahiro Yamada#print "FOO B <$lines[$linenr - 1]>\n";
2711dd88ab32SMasahiro Yamada			$suppress_export{$linenr} = 2;
2712dd88ab32SMasahiro Yamada		}
2713dd88ab32SMasahiro Yamada		if (defined $suppress_export{$linenr} &&
2714dd88ab32SMasahiro Yamada		    $suppress_export{$linenr} == 2) {
2715dd88ab32SMasahiro Yamada			WARN("EXPORT_SYMBOL",
2716dd88ab32SMasahiro Yamada			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
2717dd88ab32SMasahiro Yamada		}
2718dd88ab32SMasahiro Yamada
2719dd88ab32SMasahiro Yamada# check for global initialisers.
27206b9709d9STom Rini		if ($line =~ /^\+(\s*$Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/) {
27216b9709d9STom Rini			if (ERROR("GLOBAL_INITIALISERS",
2722dd88ab32SMasahiro Yamada				  "do not initialise globals to 0 or NULL\n" .
27236b9709d9STom Rini				      $herecurr) &&
27246b9709d9STom Rini			    $fix) {
27256b9709d9STom Rini				$fixed[$linenr - 1] =~ s/($Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/$1;/;
27266b9709d9STom Rini			}
2727dd88ab32SMasahiro Yamada		}
2728dd88ab32SMasahiro Yamada# check for static initialisers.
27296b9709d9STom Rini		if ($line =~ /^\+.*\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
27306b9709d9STom Rini			if (ERROR("INITIALISED_STATIC",
2731dd88ab32SMasahiro Yamada				  "do not initialise statics to 0 or NULL\n" .
27326b9709d9STom Rini				      $herecurr) &&
27336b9709d9STom Rini			    $fix) {
27346b9709d9STom Rini				$fixed[$linenr - 1] =~ s/(\bstatic\s.*?)\s*=\s*(0|NULL|false)\s*;/$1;/;
27356b9709d9STom Rini			}
2736dd88ab32SMasahiro Yamada		}
2737dd88ab32SMasahiro Yamada
2738dd88ab32SMasahiro Yamada# check for static const char * arrays.
2739dd88ab32SMasahiro Yamada		if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
2740dd88ab32SMasahiro Yamada			WARN("STATIC_CONST_CHAR_ARRAY",
2741dd88ab32SMasahiro Yamada			     "static const char * array should probably be static const char * const\n" .
2742dd88ab32SMasahiro Yamada				$herecurr);
2743dd88ab32SMasahiro Yamada               }
2744dd88ab32SMasahiro Yamada
2745dd88ab32SMasahiro Yamada# check for static char foo[] = "bar" declarations.
2746dd88ab32SMasahiro Yamada		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
2747dd88ab32SMasahiro Yamada			WARN("STATIC_CONST_CHAR_ARRAY",
2748dd88ab32SMasahiro Yamada			     "static char array declaration should probably be static const char\n" .
2749dd88ab32SMasahiro Yamada				$herecurr);
2750dd88ab32SMasahiro Yamada               }
2751dd88ab32SMasahiro Yamada
27526b9709d9STom Rini# check for function declarations without arguments like "int foo()"
27536b9709d9STom Rini		if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
27546b9709d9STom Rini			if (ERROR("FUNCTION_WITHOUT_ARGS",
27556b9709d9STom Rini				  "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
27566b9709d9STom Rini			    $fix) {
27576b9709d9STom Rini				$fixed[$linenr - 1] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
27586b9709d9STom Rini			}
27596b9709d9STom Rini		}
27606b9709d9STom Rini
27616b9709d9STom Rini# check for uses of DEFINE_PCI_DEVICE_TABLE
27626b9709d9STom Rini		if ($line =~ /\bDEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=/) {
27636b9709d9STom Rini			if (WARN("DEFINE_PCI_DEVICE_TABLE",
27646b9709d9STom Rini				 "Prefer struct pci_device_id over deprecated DEFINE_PCI_DEVICE_TABLE\n" . $herecurr) &&
27656b9709d9STom Rini			    $fix) {
27666b9709d9STom 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\[\] = /;
27676b9709d9STom Rini			}
2768dd88ab32SMasahiro Yamada		}
2769dd88ab32SMasahiro Yamada
2770dd88ab32SMasahiro Yamada# check for new typedefs, only function parameters and sparse annotations
2771dd88ab32SMasahiro Yamada# make sense.
2772dd88ab32SMasahiro Yamada		if ($line =~ /\btypedef\s/ &&
2773dd88ab32SMasahiro Yamada		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
2774dd88ab32SMasahiro Yamada		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
2775dd88ab32SMasahiro Yamada		    $line !~ /\b$typeTypedefs\b/ &&
2776dd88ab32SMasahiro Yamada		    $line !~ /\b__bitwise(?:__|)\b/) {
2777dd88ab32SMasahiro Yamada			WARN("NEW_TYPEDEFS",
2778dd88ab32SMasahiro Yamada			     "do not add new typedefs\n" . $herecurr);
2779dd88ab32SMasahiro Yamada		}
2780dd88ab32SMasahiro Yamada
2781dd88ab32SMasahiro Yamada# * goes on variable not on type
2782dd88ab32SMasahiro Yamada		# (char*[ const])
2783dd88ab32SMasahiro Yamada		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
2784dd88ab32SMasahiro Yamada			#print "AA<$1>\n";
27856b9709d9STom Rini			my ($ident, $from, $to) = ($1, $2, $2);
2786dd88ab32SMasahiro Yamada
2787dd88ab32SMasahiro Yamada			# Should start with a space.
2788dd88ab32SMasahiro Yamada			$to =~ s/^(\S)/ $1/;
2789dd88ab32SMasahiro Yamada			# Should not end with a space.
2790dd88ab32SMasahiro Yamada			$to =~ s/\s+$//;
2791dd88ab32SMasahiro Yamada			# '*'s should not have spaces between.
2792dd88ab32SMasahiro Yamada			while ($to =~ s/\*\s+\*/\*\*/) {
2793dd88ab32SMasahiro Yamada			}
2794dd88ab32SMasahiro Yamada
27956b9709d9STom Rini##			print "1: from<$from> to<$to> ident<$ident>\n";
2796dd88ab32SMasahiro Yamada			if ($from ne $to) {
27976b9709d9STom Rini				if (ERROR("POINTER_LOCATION",
27986b9709d9STom Rini					  "\"(foo$from)\" should be \"(foo$to)\"\n" .  $herecurr) &&
27996b9709d9STom Rini				    $fix) {
28006b9709d9STom Rini					my $sub_from = $ident;
28016b9709d9STom Rini					my $sub_to = $ident;
28026b9709d9STom Rini					$sub_to =~ s/\Q$from\E/$to/;
28036b9709d9STom Rini					$fixed[$linenr - 1] =~
28046b9709d9STom Rini					    s@\Q$sub_from\E@$sub_to@;
28056b9709d9STom Rini				}
2806dd88ab32SMasahiro Yamada			}
2807dd88ab32SMasahiro Yamada		}
2808dd88ab32SMasahiro Yamada		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
2809dd88ab32SMasahiro Yamada			#print "BB<$1>\n";
28106b9709d9STom Rini			my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
2811dd88ab32SMasahiro Yamada
2812dd88ab32SMasahiro Yamada			# Should start with a space.
2813dd88ab32SMasahiro Yamada			$to =~ s/^(\S)/ $1/;
2814dd88ab32SMasahiro Yamada			# Should not end with a space.
2815dd88ab32SMasahiro Yamada			$to =~ s/\s+$//;
2816dd88ab32SMasahiro Yamada			# '*'s should not have spaces between.
2817dd88ab32SMasahiro Yamada			while ($to =~ s/\*\s+\*/\*\*/) {
2818dd88ab32SMasahiro Yamada			}
2819dd88ab32SMasahiro Yamada			# Modifiers should have spaces.
2820dd88ab32SMasahiro Yamada			$to =~ s/(\b$Modifier$)/$1 /;
2821dd88ab32SMasahiro Yamada
28226b9709d9STom Rini##			print "2: from<$from> to<$to> ident<$ident>\n";
2823dd88ab32SMasahiro Yamada			if ($from ne $to && $ident !~ /^$Modifier$/) {
28246b9709d9STom Rini				if (ERROR("POINTER_LOCATION",
28256b9709d9STom Rini					  "\"foo${from}bar\" should be \"foo${to}bar\"\n" .  $herecurr) &&
28266b9709d9STom Rini				    $fix) {
28276b9709d9STom Rini
28286b9709d9STom Rini					my $sub_from = $match;
28296b9709d9STom Rini					my $sub_to = $match;
28306b9709d9STom Rini					$sub_to =~ s/\Q$from\E/$to/;
28316b9709d9STom Rini					$fixed[$linenr - 1] =~
28326b9709d9STom Rini					    s@\Q$sub_from\E@$sub_to@;
28336b9709d9STom Rini				}
2834dd88ab32SMasahiro Yamada			}
2835dd88ab32SMasahiro Yamada		}
2836dd88ab32SMasahiro Yamada
2837dd88ab32SMasahiro Yamada# # no BUG() or BUG_ON()
2838dd88ab32SMasahiro Yamada# 		if ($line =~ /\b(BUG|BUG_ON)\b/) {
2839dd88ab32SMasahiro Yamada# 			print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n";
2840dd88ab32SMasahiro Yamada# 			print "$herecurr";
2841dd88ab32SMasahiro Yamada# 			$clean = 0;
2842dd88ab32SMasahiro Yamada# 		}
2843dd88ab32SMasahiro Yamada
2844dd88ab32SMasahiro Yamada		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
2845dd88ab32SMasahiro Yamada			WARN("LINUX_VERSION_CODE",
2846dd88ab32SMasahiro Yamada			     "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
2847dd88ab32SMasahiro Yamada		}
2848dd88ab32SMasahiro Yamada
2849dd88ab32SMasahiro Yamada# check for uses of printk_ratelimit
2850dd88ab32SMasahiro Yamada		if ($line =~ /\bprintk_ratelimit\s*\(/) {
2851dd88ab32SMasahiro Yamada			WARN("PRINTK_RATELIMITED",
2852dd88ab32SMasahiro Yamada"Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
2853dd88ab32SMasahiro Yamada		}
2854dd88ab32SMasahiro Yamada
2855dd88ab32SMasahiro Yamada# printk should use KERN_* levels.  Note that follow on printk's on the
2856dd88ab32SMasahiro Yamada# same line do not need a level, so we use the current block context
2857dd88ab32SMasahiro Yamada# to try and find and validate the current printk.  In summary the current
2858dd88ab32SMasahiro Yamada# printk includes all preceding printk's which have no newline on the end.
2859dd88ab32SMasahiro Yamada# we assume the first bad printk is the one to report.
2860dd88ab32SMasahiro Yamada		if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
2861dd88ab32SMasahiro Yamada			my $ok = 0;
2862dd88ab32SMasahiro Yamada			for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
2863dd88ab32SMasahiro Yamada				#print "CHECK<$lines[$ln - 1]\n";
2864dd88ab32SMasahiro Yamada				# we have a preceding printk if it ends
2865dd88ab32SMasahiro Yamada				# with "\n" ignore it, else it is to blame
2866dd88ab32SMasahiro Yamada				if ($lines[$ln - 1] =~ m{\bprintk\(}) {
2867dd88ab32SMasahiro Yamada					if ($rawlines[$ln - 1] !~ m{\\n"}) {
2868dd88ab32SMasahiro Yamada						$ok = 1;
2869dd88ab32SMasahiro Yamada					}
2870dd88ab32SMasahiro Yamada					last;
2871dd88ab32SMasahiro Yamada				}
2872dd88ab32SMasahiro Yamada			}
2873dd88ab32SMasahiro Yamada			if ($ok == 0) {
2874dd88ab32SMasahiro Yamada				WARN("PRINTK_WITHOUT_KERN_LEVEL",
2875dd88ab32SMasahiro Yamada				     "printk() should include KERN_ facility level\n" . $herecurr);
2876dd88ab32SMasahiro Yamada			}
2877dd88ab32SMasahiro Yamada		}
2878dd88ab32SMasahiro Yamada
2879dd88ab32SMasahiro Yamada		if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
2880dd88ab32SMasahiro Yamada			my $orig = $1;
2881dd88ab32SMasahiro Yamada			my $level = lc($orig);
2882dd88ab32SMasahiro Yamada			$level = "warn" if ($level eq "warning");
2883dd88ab32SMasahiro Yamada			my $level2 = $level;
2884dd88ab32SMasahiro Yamada			$level2 = "dbg" if ($level eq "debug");
2885dd88ab32SMasahiro Yamada			WARN("PREFER_PR_LEVEL",
2886dd88ab32SMasahiro Yamada			     "Prefer netdev_$level2(netdev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...\n" . $herecurr);
2887dd88ab32SMasahiro Yamada		}
2888dd88ab32SMasahiro Yamada
2889dd88ab32SMasahiro Yamada		if ($line =~ /\bpr_warning\s*\(/) {
28906b9709d9STom Rini			if (WARN("PREFER_PR_LEVEL",
28916b9709d9STom Rini				 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
28926b9709d9STom Rini			    $fix) {
28936b9709d9STom Rini				$fixed[$linenr - 1] =~
28946b9709d9STom Rini				    s/\bpr_warning\b/pr_warn/;
28956b9709d9STom Rini			}
2896dd88ab32SMasahiro Yamada		}
2897dd88ab32SMasahiro Yamada
2898dd88ab32SMasahiro Yamada		if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
2899dd88ab32SMasahiro Yamada			my $orig = $1;
2900dd88ab32SMasahiro Yamada			my $level = lc($orig);
2901dd88ab32SMasahiro Yamada			$level = "warn" if ($level eq "warning");
2902dd88ab32SMasahiro Yamada			$level = "dbg" if ($level eq "debug");
2903dd88ab32SMasahiro Yamada			WARN("PREFER_DEV_LEVEL",
2904dd88ab32SMasahiro Yamada			     "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
2905dd88ab32SMasahiro Yamada		}
2906dd88ab32SMasahiro Yamada
2907dd88ab32SMasahiro Yamada# function brace can't be on same line, except for #defines of do while,
2908dd88ab32SMasahiro Yamada# or if closed on same line
2909d8a1a304SHeiko Schocher		if (($line=~/$Type\s*$Ident\(.*\).*\s\{/) and
2910d8a1a304SHeiko Schocher		    !($line=~/\#\s*define.*do\s\{/) and !($line=~/}/)) {
2911dd88ab32SMasahiro Yamada			ERROR("OPEN_BRACE",
2912dd88ab32SMasahiro Yamada			      "open brace '{' following function declarations go on the next line\n" . $herecurr);
2913dd88ab32SMasahiro Yamada		}
2914dd88ab32SMasahiro Yamada
2915dd88ab32SMasahiro Yamada# open braces for enum, union and struct go on the same line.
2916dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*{/ &&
2917dd88ab32SMasahiro Yamada		    $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
2918dd88ab32SMasahiro Yamada			ERROR("OPEN_BRACE",
2919dd88ab32SMasahiro Yamada			      "open brace '{' following $1 go on the same line\n" . $hereprev);
2920dd88ab32SMasahiro Yamada		}
2921dd88ab32SMasahiro Yamada
2922dd88ab32SMasahiro Yamada# missing space after union, struct or enum definition
29236b9709d9STom Rini		if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
29246b9709d9STom Rini			if (WARN("SPACING",
29256b9709d9STom Rini				 "missing space after $1 definition\n" . $herecurr) &&
29266b9709d9STom Rini			    $fix) {
29276b9709d9STom Rini				$fixed[$linenr - 1] =~
29286b9709d9STom Rini				    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
29296b9709d9STom Rini			}
29306b9709d9STom Rini		}
29316b9709d9STom Rini
29326b9709d9STom Rini# Function pointer declarations
29336b9709d9STom Rini# check spacing between type, funcptr, and args
29346b9709d9STom Rini# canonical declaration is "type (*funcptr)(args...)"
29356b9709d9STom Rini#
29366b9709d9STom Rini# the $Declare variable will capture all spaces after the type
29376b9709d9STom Rini# so check it for trailing missing spaces or multiple spaces
29386b9709d9STom Rini		if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)$Ident(\s*)\)(\s*)\(/) {
29396b9709d9STom Rini			my $declare = $1;
29406b9709d9STom Rini			my $pre_pointer_space = $2;
29416b9709d9STom Rini			my $post_pointer_space = $3;
29426b9709d9STom Rini			my $funcname = $4;
29436b9709d9STom Rini			my $post_funcname_space = $5;
29446b9709d9STom Rini			my $pre_args_space = $6;
29456b9709d9STom Rini
29466b9709d9STom Rini			if ($declare !~ /\s$/) {
2947dd88ab32SMasahiro Yamada				WARN("SPACING",
29486b9709d9STom Rini				     "missing space after return type\n" . $herecurr);
29496b9709d9STom Rini			}
29506b9709d9STom Rini
29516b9709d9STom Rini# unnecessary space "type  (*funcptr)(args...)"
29526b9709d9STom Rini			elsif ($declare =~ /\s{2,}$/) {
29536b9709d9STom Rini				WARN("SPACING",
29546b9709d9STom Rini				     "Multiple spaces after return type\n" . $herecurr);
29556b9709d9STom Rini			}
29566b9709d9STom Rini
29576b9709d9STom Rini# unnecessary space "type ( *funcptr)(args...)"
29586b9709d9STom Rini			if (defined $pre_pointer_space &&
29596b9709d9STom Rini			    $pre_pointer_space =~ /^\s/) {
29606b9709d9STom Rini				WARN("SPACING",
29616b9709d9STom Rini				     "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
29626b9709d9STom Rini			}
29636b9709d9STom Rini
29646b9709d9STom Rini# unnecessary space "type (* funcptr)(args...)"
29656b9709d9STom Rini			if (defined $post_pointer_space &&
29666b9709d9STom Rini			    $post_pointer_space =~ /^\s/) {
29676b9709d9STom Rini				WARN("SPACING",
29686b9709d9STom Rini				     "Unnecessary space before function pointer name\n" . $herecurr);
29696b9709d9STom Rini			}
29706b9709d9STom Rini
29716b9709d9STom Rini# unnecessary space "type (*funcptr )(args...)"
29726b9709d9STom Rini			if (defined $post_funcname_space &&
29736b9709d9STom Rini			    $post_funcname_space =~ /^\s/) {
29746b9709d9STom Rini				WARN("SPACING",
29756b9709d9STom Rini				     "Unnecessary space after function pointer name\n" . $herecurr);
29766b9709d9STom Rini			}
29776b9709d9STom Rini
29786b9709d9STom Rini# unnecessary space "type (*funcptr) (args...)"
29796b9709d9STom Rini			if (defined $pre_args_space &&
29806b9709d9STom Rini			    $pre_args_space =~ /^\s/) {
29816b9709d9STom Rini				WARN("SPACING",
29826b9709d9STom Rini				     "Unnecessary space before function pointer arguments\n" . $herecurr);
29836b9709d9STom Rini			}
29846b9709d9STom Rini
29856b9709d9STom Rini			if (show_type("SPACING") && $fix) {
29866b9709d9STom Rini				$fixed[$linenr - 1] =~
29876b9709d9STom Rini				    s/^(.\s*$Declare)\(\s*\*\s*($Ident)\s*\)\s*\(/rtrim($1) . " " . "\(\*$2\)\("/ex;
29886b9709d9STom Rini			}
2989dd88ab32SMasahiro Yamada		}
2990dd88ab32SMasahiro Yamada
2991dd88ab32SMasahiro Yamada# check for spacing round square brackets; allowed:
2992dd88ab32SMasahiro Yamada#  1. with a type on the left -- int [] a;
2993dd88ab32SMasahiro Yamada#  2. at the beginning of a line for slice initialisers -- [0...10] = 5,
2994dd88ab32SMasahiro Yamada#  3. inside a curly brace -- = { [0...10] = 5 }
2995dd88ab32SMasahiro Yamada		while ($line =~ /(.*?\s)\[/g) {
2996dd88ab32SMasahiro Yamada			my ($where, $prefix) = ($-[1], $1);
2997dd88ab32SMasahiro Yamada			if ($prefix !~ /$Type\s+$/ &&
2998dd88ab32SMasahiro Yamada			    ($where != 0 || $prefix !~ /^.\s+$/) &&
2999dd88ab32SMasahiro Yamada			    $prefix !~ /[{,]\s+$/) {
30006b9709d9STom Rini				if (ERROR("BRACKET_SPACE",
30016b9709d9STom Rini					  "space prohibited before open square bracket '['\n" . $herecurr) &&
30026b9709d9STom Rini				    $fix) {
30036b9709d9STom Rini				    $fixed[$linenr - 1] =~
30046b9709d9STom Rini					s/^(\+.*?)\s+\[/$1\[/;
30056b9709d9STom Rini				}
3006dd88ab32SMasahiro Yamada			}
3007dd88ab32SMasahiro Yamada		}
3008dd88ab32SMasahiro Yamada
3009dd88ab32SMasahiro Yamada# check for spaces between functions and their parentheses.
3010dd88ab32SMasahiro Yamada		while ($line =~ /($Ident)\s+\(/g) {
3011dd88ab32SMasahiro Yamada			my $name = $1;
3012dd88ab32SMasahiro Yamada			my $ctx_before = substr($line, 0, $-[1]);
3013dd88ab32SMasahiro Yamada			my $ctx = "$ctx_before$name";
3014dd88ab32SMasahiro Yamada
3015dd88ab32SMasahiro Yamada			# Ignore those directives where spaces _are_ permitted.
3016dd88ab32SMasahiro Yamada			if ($name =~ /^(?:
3017dd88ab32SMasahiro Yamada				if|for|while|switch|return|case|
3018dd88ab32SMasahiro Yamada				volatile|__volatile__|
3019dd88ab32SMasahiro Yamada				__attribute__|format|__extension__|
3020dd88ab32SMasahiro Yamada				asm|__asm__)$/x)
3021dd88ab32SMasahiro Yamada			{
3022dd88ab32SMasahiro Yamada			# cpp #define statements have non-optional spaces, ie
3023dd88ab32SMasahiro Yamada			# if there is a space between the name and the open
3024dd88ab32SMasahiro Yamada			# parenthesis it is simply not a parameter group.
3025dd88ab32SMasahiro Yamada			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
3026dd88ab32SMasahiro Yamada
3027dd88ab32SMasahiro Yamada			# cpp #elif statement condition may start with a (
3028dd88ab32SMasahiro Yamada			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
3029dd88ab32SMasahiro Yamada
3030dd88ab32SMasahiro Yamada			# If this whole things ends with a type its most
3031dd88ab32SMasahiro Yamada			# likely a typedef for a function.
3032dd88ab32SMasahiro Yamada			} elsif ($ctx =~ /$Type$/) {
3033dd88ab32SMasahiro Yamada
3034dd88ab32SMasahiro Yamada			} else {
30356b9709d9STom Rini				if (WARN("SPACING",
30366b9709d9STom Rini					 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
30376b9709d9STom Rini					     $fix) {
30386b9709d9STom Rini					$fixed[$linenr - 1] =~
30396b9709d9STom Rini					    s/\b$name\s+\(/$name\(/;
3040dd88ab32SMasahiro Yamada				}
3041dd88ab32SMasahiro Yamada			}
3042dd88ab32SMasahiro Yamada		}
3043dd88ab32SMasahiro Yamada
3044dd88ab32SMasahiro Yamada# Check operator spacing.
3045dd88ab32SMasahiro Yamada		if (!($line=~/\#\s*include/)) {
30466b9709d9STom Rini			my $fixed_line = "";
30476b9709d9STom Rini			my $line_fixed = 0;
30486b9709d9STom Rini
3049dd88ab32SMasahiro Yamada			my $ops = qr{
3050dd88ab32SMasahiro Yamada				<<=|>>=|<=|>=|==|!=|
3051dd88ab32SMasahiro Yamada				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
3052dd88ab32SMasahiro Yamada				=>|->|<<|>>|<|>|=|!|~|
3053dd88ab32SMasahiro Yamada				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
30546b9709d9STom Rini				\?:|\?|:
3055dd88ab32SMasahiro Yamada			}x;
3056dd88ab32SMasahiro Yamada			my @elements = split(/($ops|;)/, $opline);
30576b9709d9STom Rini
30586b9709d9STom Rini##			print("element count: <" . $#elements . ">\n");
30596b9709d9STom Rini##			foreach my $el (@elements) {
30606b9709d9STom Rini##				print("el: <$el>\n");
30616b9709d9STom Rini##			}
30626b9709d9STom Rini
30636b9709d9STom Rini			my @fix_elements = ();
3064dd88ab32SMasahiro Yamada			my $off = 0;
3065dd88ab32SMasahiro Yamada
30666b9709d9STom Rini			foreach my $el (@elements) {
30676b9709d9STom Rini				push(@fix_elements, substr($rawline, $off, length($el)));
30686b9709d9STom Rini				$off += length($el);
30696b9709d9STom Rini			}
30706b9709d9STom Rini
30716b9709d9STom Rini			$off = 0;
30726b9709d9STom Rini
3073dd88ab32SMasahiro Yamada			my $blank = copy_spacing($opline);
30746b9709d9STom Rini			my $last_after = -1;
3075dd88ab32SMasahiro Yamada
3076dd88ab32SMasahiro Yamada			for (my $n = 0; $n < $#elements; $n += 2) {
30776b9709d9STom Rini
30786b9709d9STom Rini				my $good = $fix_elements[$n] . $fix_elements[$n + 1];
30796b9709d9STom Rini
30806b9709d9STom Rini##				print("n: <$n> good: <$good>\n");
30816b9709d9STom Rini
3082dd88ab32SMasahiro Yamada				$off += length($elements[$n]);
3083dd88ab32SMasahiro Yamada
3084dd88ab32SMasahiro Yamada				# Pick up the preceding and succeeding characters.
3085dd88ab32SMasahiro Yamada				my $ca = substr($opline, 0, $off);
3086dd88ab32SMasahiro Yamada				my $cc = '';
3087dd88ab32SMasahiro Yamada				if (length($opline) >= ($off + length($elements[$n + 1]))) {
3088dd88ab32SMasahiro Yamada					$cc = substr($opline, $off + length($elements[$n + 1]));
3089dd88ab32SMasahiro Yamada				}
3090dd88ab32SMasahiro Yamada				my $cb = "$ca$;$cc";
3091dd88ab32SMasahiro Yamada
3092dd88ab32SMasahiro Yamada				my $a = '';
3093dd88ab32SMasahiro Yamada				$a = 'V' if ($elements[$n] ne '');
3094dd88ab32SMasahiro Yamada				$a = 'W' if ($elements[$n] =~ /\s$/);
3095dd88ab32SMasahiro Yamada				$a = 'C' if ($elements[$n] =~ /$;$/);
3096dd88ab32SMasahiro Yamada				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
3097dd88ab32SMasahiro Yamada				$a = 'O' if ($elements[$n] eq '');
3098dd88ab32SMasahiro Yamada				$a = 'E' if ($ca =~ /^\s*$/);
3099dd88ab32SMasahiro Yamada
3100dd88ab32SMasahiro Yamada				my $op = $elements[$n + 1];
3101dd88ab32SMasahiro Yamada
3102dd88ab32SMasahiro Yamada				my $c = '';
3103dd88ab32SMasahiro Yamada				if (defined $elements[$n + 2]) {
3104dd88ab32SMasahiro Yamada					$c = 'V' if ($elements[$n + 2] ne '');
3105dd88ab32SMasahiro Yamada					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
3106dd88ab32SMasahiro Yamada					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
3107dd88ab32SMasahiro Yamada					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
3108dd88ab32SMasahiro Yamada					$c = 'O' if ($elements[$n + 2] eq '');
3109dd88ab32SMasahiro Yamada					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
3110dd88ab32SMasahiro Yamada				} else {
3111dd88ab32SMasahiro Yamada					$c = 'E';
3112dd88ab32SMasahiro Yamada				}
3113dd88ab32SMasahiro Yamada
3114dd88ab32SMasahiro Yamada				my $ctx = "${a}x${c}";
3115dd88ab32SMasahiro Yamada
3116dd88ab32SMasahiro Yamada				my $at = "(ctx:$ctx)";
3117dd88ab32SMasahiro Yamada
3118dd88ab32SMasahiro Yamada				my $ptr = substr($blank, 0, $off) . "^";
3119dd88ab32SMasahiro Yamada				my $hereptr = "$hereline$ptr\n";
3120dd88ab32SMasahiro Yamada
3121dd88ab32SMasahiro Yamada				# Pull out the value of this operator.
3122dd88ab32SMasahiro Yamada				my $op_type = substr($curr_values, $off + 1, 1);
3123dd88ab32SMasahiro Yamada
3124dd88ab32SMasahiro Yamada				# Get the full operator variant.
3125dd88ab32SMasahiro Yamada				my $opv = $op . substr($curr_vars, $off, 1);
3126dd88ab32SMasahiro Yamada
3127dd88ab32SMasahiro Yamada				# Ignore operators passed as parameters.
3128dd88ab32SMasahiro Yamada				if ($op_type ne 'V' &&
3129dd88ab32SMasahiro Yamada				    $ca =~ /\s$/ && $cc =~ /^\s*,/) {
3130dd88ab32SMasahiro Yamada
3131dd88ab32SMasahiro Yamada#				# Ignore comments
3132dd88ab32SMasahiro Yamada#				} elsif ($op =~ /^$;+$/) {
3133dd88ab32SMasahiro Yamada
3134dd88ab32SMasahiro Yamada				# ; should have either the end of line or a space or \ after it
3135dd88ab32SMasahiro Yamada				} elsif ($op eq ';') {
3136dd88ab32SMasahiro Yamada					if ($ctx !~ /.x[WEBC]/ &&
3137dd88ab32SMasahiro Yamada					    $cc !~ /^\\/ && $cc !~ /^;/) {
31386b9709d9STom Rini						if (ERROR("SPACING",
31396b9709d9STom Rini							  "space required after that '$op' $at\n" . $hereptr)) {
31406b9709d9STom Rini							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
31416b9709d9STom Rini							$line_fixed = 1;
31426b9709d9STom Rini						}
3143dd88ab32SMasahiro Yamada					}
3144dd88ab32SMasahiro Yamada
3145dd88ab32SMasahiro Yamada				# // is a comment
3146dd88ab32SMasahiro Yamada				} elsif ($op eq '//') {
3147dd88ab32SMasahiro Yamada
3148dd88ab32SMasahiro Yamada				# No spaces for:
3149dd88ab32SMasahiro Yamada				#   ->
3150dd88ab32SMasahiro Yamada				#   :   when part of a bitfield
3151dd88ab32SMasahiro Yamada				} elsif ($op eq '->' || $opv eq ':B') {
3152dd88ab32SMasahiro Yamada					if ($ctx =~ /Wx.|.xW/) {
31536b9709d9STom Rini						if (ERROR("SPACING",
31546b9709d9STom Rini							  "spaces prohibited around that '$op' $at\n" . $hereptr)) {
31556b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
31566b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
31576b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
31586b9709d9STom Rini							}
31596b9709d9STom Rini							$line_fixed = 1;
31606b9709d9STom Rini						}
3161dd88ab32SMasahiro Yamada					}
3162dd88ab32SMasahiro Yamada
3163dd88ab32SMasahiro Yamada				# , must have a space on the right.
3164dd88ab32SMasahiro Yamada				} elsif ($op eq ',') {
3165dd88ab32SMasahiro Yamada					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
31666b9709d9STom Rini						if (ERROR("SPACING",
31676b9709d9STom Rini							  "space required after that '$op' $at\n" . $hereptr)) {
31686b9709d9STom Rini							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
31696b9709d9STom Rini							$line_fixed = 1;
31706b9709d9STom Rini							$last_after = $n;
31716b9709d9STom Rini						}
3172dd88ab32SMasahiro Yamada					}
3173dd88ab32SMasahiro Yamada
3174dd88ab32SMasahiro Yamada				# '*' as part of a type definition -- reported already.
3175dd88ab32SMasahiro Yamada				} elsif ($opv eq '*_') {
3176dd88ab32SMasahiro Yamada					#warn "'*' is part of type\n";
3177dd88ab32SMasahiro Yamada
3178dd88ab32SMasahiro Yamada				# unary operators should have a space before and
3179dd88ab32SMasahiro Yamada				# none after.  May be left adjacent to another
3180dd88ab32SMasahiro Yamada				# unary operator, or a cast
3181dd88ab32SMasahiro Yamada				} elsif ($op eq '!' || $op eq '~' ||
3182dd88ab32SMasahiro Yamada					 $opv eq '*U' || $opv eq '-U' ||
3183dd88ab32SMasahiro Yamada					 $opv eq '&U' || $opv eq '&&U') {
3184dd88ab32SMasahiro Yamada					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
31856b9709d9STom Rini						if (ERROR("SPACING",
31866b9709d9STom Rini							  "space required before that '$op' $at\n" . $hereptr)) {
31876b9709d9STom Rini							if ($n != $last_after + 2) {
31886b9709d9STom Rini								$good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
31896b9709d9STom Rini								$line_fixed = 1;
31906b9709d9STom Rini							}
31916b9709d9STom Rini						}
3192dd88ab32SMasahiro Yamada					}
3193dd88ab32SMasahiro Yamada					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
3194dd88ab32SMasahiro Yamada						# A unary '*' may be const
3195dd88ab32SMasahiro Yamada
3196dd88ab32SMasahiro Yamada					} elsif ($ctx =~ /.xW/) {
31976b9709d9STom Rini						if (ERROR("SPACING",
31986b9709d9STom Rini							  "space prohibited after that '$op' $at\n" . $hereptr)) {
31996b9709d9STom Rini							$good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
32006b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
32016b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
32026b9709d9STom Rini							}
32036b9709d9STom Rini							$line_fixed = 1;
32046b9709d9STom Rini						}
3205dd88ab32SMasahiro Yamada					}
3206dd88ab32SMasahiro Yamada
3207dd88ab32SMasahiro Yamada				# unary ++ and unary -- are allowed no space on one side.
3208dd88ab32SMasahiro Yamada				} elsif ($op eq '++' or $op eq '--') {
3209dd88ab32SMasahiro Yamada					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
32106b9709d9STom Rini						if (ERROR("SPACING",
32116b9709d9STom Rini							  "space required one side of that '$op' $at\n" . $hereptr)) {
32126b9709d9STom Rini							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
32136b9709d9STom Rini							$line_fixed = 1;
32146b9709d9STom Rini						}
3215dd88ab32SMasahiro Yamada					}
3216dd88ab32SMasahiro Yamada					if ($ctx =~ /Wx[BE]/ ||
3217dd88ab32SMasahiro Yamada					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
32186b9709d9STom Rini						if (ERROR("SPACING",
32196b9709d9STom Rini							  "space prohibited before that '$op' $at\n" . $hereptr)) {
32206b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
32216b9709d9STom Rini							$line_fixed = 1;
32226b9709d9STom Rini						}
3223dd88ab32SMasahiro Yamada					}
3224dd88ab32SMasahiro Yamada					if ($ctx =~ /ExW/) {
32256b9709d9STom Rini						if (ERROR("SPACING",
32266b9709d9STom Rini							  "space prohibited after that '$op' $at\n" . $hereptr)) {
32276b9709d9STom Rini							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
32286b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
32296b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
3230dd88ab32SMasahiro Yamada							}
32316b9709d9STom Rini							$line_fixed = 1;
32326b9709d9STom Rini						}
32336b9709d9STom Rini					}
3234dd88ab32SMasahiro Yamada
3235dd88ab32SMasahiro Yamada				# << and >> may either have or not have spaces both sides
3236dd88ab32SMasahiro Yamada				} elsif ($op eq '<<' or $op eq '>>' or
3237dd88ab32SMasahiro Yamada					 $op eq '&' or $op eq '^' or $op eq '|' or
3238dd88ab32SMasahiro Yamada					 $op eq '+' or $op eq '-' or
3239dd88ab32SMasahiro Yamada					 $op eq '*' or $op eq '/' or
3240dd88ab32SMasahiro Yamada					 $op eq '%')
3241dd88ab32SMasahiro Yamada				{
3242dd88ab32SMasahiro Yamada					if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
32436b9709d9STom Rini						if (ERROR("SPACING",
32446b9709d9STom Rini							  "need consistent spacing around '$op' $at\n" . $hereptr)) {
32456b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
32466b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
32476b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
32486b9709d9STom Rini							}
32496b9709d9STom Rini							$line_fixed = 1;
32506b9709d9STom Rini						}
3251dd88ab32SMasahiro Yamada					}
3252dd88ab32SMasahiro Yamada
3253dd88ab32SMasahiro Yamada				# A colon needs no spaces before when it is
3254dd88ab32SMasahiro Yamada				# terminating a case value or a label.
3255dd88ab32SMasahiro Yamada				} elsif ($opv eq ':C' || $opv eq ':L') {
3256dd88ab32SMasahiro Yamada					if ($ctx =~ /Wx./) {
32576b9709d9STom Rini						if (ERROR("SPACING",
32586b9709d9STom Rini							  "space prohibited before that '$op' $at\n" . $hereptr)) {
32596b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
32606b9709d9STom Rini							$line_fixed = 1;
32616b9709d9STom Rini						}
3262dd88ab32SMasahiro Yamada					}
3263dd88ab32SMasahiro Yamada
3264dd88ab32SMasahiro Yamada				# All the others need spaces both sides.
3265dd88ab32SMasahiro Yamada				} elsif ($ctx !~ /[EWC]x[CWE]/) {
3266dd88ab32SMasahiro Yamada					my $ok = 0;
3267dd88ab32SMasahiro Yamada
3268dd88ab32SMasahiro Yamada					# Ignore email addresses <foo@bar>
3269dd88ab32SMasahiro Yamada					if (($op eq '<' &&
3270dd88ab32SMasahiro Yamada					     $cc =~ /^\S+\@\S+>/) ||
3271dd88ab32SMasahiro Yamada					    ($op eq '>' &&
3272dd88ab32SMasahiro Yamada					     $ca =~ /<\S+\@\S+$/))
3273dd88ab32SMasahiro Yamada					{
3274dd88ab32SMasahiro Yamada					    	$ok = 1;
3275dd88ab32SMasahiro Yamada					}
3276dd88ab32SMasahiro Yamada
32776b9709d9STom Rini					# messages are ERROR, but ?: are CHK
3278dd88ab32SMasahiro Yamada					if ($ok == 0) {
32796b9709d9STom Rini						my $msg_type = \&ERROR;
32806b9709d9STom Rini						$msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
32816b9709d9STom Rini
32826b9709d9STom Rini						if (&{$msg_type}("SPACING",
32836b9709d9STom Rini								 "spaces required around that '$op' $at\n" . $hereptr)) {
32846b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
32856b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
32866b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
32876b9709d9STom Rini							}
32886b9709d9STom Rini							$line_fixed = 1;
32896b9709d9STom Rini						}
3290dd88ab32SMasahiro Yamada					}
3291dd88ab32SMasahiro Yamada				}
3292dd88ab32SMasahiro Yamada				$off += length($elements[$n + 1]);
32936b9709d9STom Rini
32946b9709d9STom Rini##				print("n: <$n> GOOD: <$good>\n");
32956b9709d9STom Rini
32966b9709d9STom Rini				$fixed_line = $fixed_line . $good;
32976b9709d9STom Rini			}
32986b9709d9STom Rini
32996b9709d9STom Rini			if (($#elements % 2) == 0) {
33006b9709d9STom Rini				$fixed_line = $fixed_line . $fix_elements[$#elements];
33016b9709d9STom Rini			}
33026b9709d9STom Rini
33036b9709d9STom Rini			if ($fix && $line_fixed && $fixed_line ne $fixed[$linenr - 1]) {
33046b9709d9STom Rini				$fixed[$linenr - 1] = $fixed_line;
33056b9709d9STom Rini			}
33066b9709d9STom Rini
33076b9709d9STom Rini
33086b9709d9STom Rini		}
33096b9709d9STom Rini
33106b9709d9STom Rini# check for whitespace before a non-naked semicolon
33116b9709d9STom Rini		if ($line =~ /^\+.*\S\s+;\s*$/) {
33126b9709d9STom Rini			if (WARN("SPACING",
33136b9709d9STom Rini				 "space prohibited before semicolon\n" . $herecurr) &&
33146b9709d9STom Rini			    $fix) {
33156b9709d9STom Rini				1 while $fixed[$linenr - 1] =~
33166b9709d9STom Rini				    s/^(\+.*\S)\s+;/$1;/;
3317dd88ab32SMasahiro Yamada			}
3318dd88ab32SMasahiro Yamada		}
3319dd88ab32SMasahiro Yamada
3320dd88ab32SMasahiro Yamada# check for multiple assignments
3321dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
3322dd88ab32SMasahiro Yamada			CHK("MULTIPLE_ASSIGNMENTS",
3323dd88ab32SMasahiro Yamada			    "multiple assignments should be avoided\n" . $herecurr);
3324dd88ab32SMasahiro Yamada		}
3325dd88ab32SMasahiro Yamada
3326dd88ab32SMasahiro Yamada## # check for multiple declarations, allowing for a function declaration
3327dd88ab32SMasahiro Yamada## # continuation.
3328dd88ab32SMasahiro Yamada## 		if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
3329dd88ab32SMasahiro Yamada## 		    $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
3330dd88ab32SMasahiro Yamada##
3331dd88ab32SMasahiro Yamada## 			# Remove any bracketed sections to ensure we do not
3332dd88ab32SMasahiro Yamada## 			# falsly report the parameters of functions.
3333dd88ab32SMasahiro Yamada## 			my $ln = $line;
3334dd88ab32SMasahiro Yamada## 			while ($ln =~ s/\([^\(\)]*\)//g) {
3335dd88ab32SMasahiro Yamada## 			}
3336dd88ab32SMasahiro Yamada## 			if ($ln =~ /,/) {
3337dd88ab32SMasahiro Yamada## 				WARN("MULTIPLE_DECLARATION",
3338dd88ab32SMasahiro Yamada##				     "declaring multiple variables together should be avoided\n" . $herecurr);
3339dd88ab32SMasahiro Yamada## 			}
3340dd88ab32SMasahiro Yamada## 		}
3341dd88ab32SMasahiro Yamada
3342dd88ab32SMasahiro Yamada#need space before brace following if, while, etc
3343d8a1a304SHeiko Schocher		if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\){/) ||
3344d8a1a304SHeiko Schocher		    $line =~ /do\{/) {
33456b9709d9STom Rini			if (ERROR("SPACING",
33466b9709d9STom Rini				  "space required before the open brace '{'\n" . $herecurr) &&
33476b9709d9STom Rini			    $fix) {
33486b9709d9STom Rini				$fixed[$linenr - 1] =~ s/^(\+.*(?:do|\))){/$1 {/;
3349dd88ab32SMasahiro Yamada			}
33506b9709d9STom Rini		}
33516b9709d9STom Rini
33526b9709d9STom Rini## # check for blank lines before declarations
33536b9709d9STom Rini##		if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
33546b9709d9STom Rini##		    $prevrawline =~ /^.\s*$/) {
33556b9709d9STom Rini##			WARN("SPACING",
33566b9709d9STom Rini##			     "No blank lines before declarations\n" . $hereprev);
33576b9709d9STom Rini##		}
33586b9709d9STom Rini##
3359dd88ab32SMasahiro Yamada
3360dd88ab32SMasahiro Yamada# closing brace should have a space following it when it has anything
3361dd88ab32SMasahiro Yamada# on the line
3362dd88ab32SMasahiro Yamada		if ($line =~ /}(?!(?:,|;|\)))\S/) {
33636b9709d9STom Rini			if (ERROR("SPACING",
33646b9709d9STom Rini				  "space required after that close brace '}'\n" . $herecurr) &&
33656b9709d9STom Rini			    $fix) {
33666b9709d9STom Rini				$fixed[$linenr - 1] =~
33676b9709d9STom Rini				    s/}((?!(?:,|;|\)))\S)/} $1/;
33686b9709d9STom Rini			}
3369dd88ab32SMasahiro Yamada		}
3370dd88ab32SMasahiro Yamada
3371dd88ab32SMasahiro Yamada# check spacing on square brackets
3372dd88ab32SMasahiro Yamada		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
33736b9709d9STom Rini			if (ERROR("SPACING",
33746b9709d9STom Rini				  "space prohibited after that open square bracket '['\n" . $herecurr) &&
33756b9709d9STom Rini			    $fix) {
33766b9709d9STom Rini				$fixed[$linenr - 1] =~
33776b9709d9STom Rini				    s/\[\s+/\[/;
33786b9709d9STom Rini			}
3379dd88ab32SMasahiro Yamada		}
3380dd88ab32SMasahiro Yamada		if ($line =~ /\s\]/) {
33816b9709d9STom Rini			if (ERROR("SPACING",
33826b9709d9STom Rini				  "space prohibited before that close square bracket ']'\n" . $herecurr) &&
33836b9709d9STom Rini			    $fix) {
33846b9709d9STom Rini				$fixed[$linenr - 1] =~
33856b9709d9STom Rini				    s/\s+\]/\]/;
33866b9709d9STom Rini			}
3387dd88ab32SMasahiro Yamada		}
3388dd88ab32SMasahiro Yamada
3389dd88ab32SMasahiro Yamada# check spacing on parentheses
3390dd88ab32SMasahiro Yamada		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
3391dd88ab32SMasahiro Yamada		    $line !~ /for\s*\(\s+;/) {
33926b9709d9STom Rini			if (ERROR("SPACING",
33936b9709d9STom Rini				  "space prohibited after that open parenthesis '('\n" . $herecurr) &&
33946b9709d9STom Rini			    $fix) {
33956b9709d9STom Rini				$fixed[$linenr - 1] =~
33966b9709d9STom Rini				    s/\(\s+/\(/;
33976b9709d9STom Rini			}
3398dd88ab32SMasahiro Yamada		}
3399dd88ab32SMasahiro Yamada		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
3400dd88ab32SMasahiro Yamada		    $line !~ /for\s*\(.*;\s+\)/ &&
3401dd88ab32SMasahiro Yamada		    $line !~ /:\s+\)/) {
34026b9709d9STom Rini			if (ERROR("SPACING",
34036b9709d9STom Rini				  "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
34046b9709d9STom Rini			    $fix) {
34056b9709d9STom Rini				$fixed[$linenr - 1] =~
34066b9709d9STom Rini				    s/\s+\)/\)/;
34076b9709d9STom Rini			}
3408dd88ab32SMasahiro Yamada		}
3409dd88ab32SMasahiro Yamada
3410dd88ab32SMasahiro Yamada#goto labels aren't indented, allow a single space however
3411dd88ab32SMasahiro Yamada		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
3412dd88ab32SMasahiro Yamada		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
34136b9709d9STom Rini			if (WARN("INDENTED_LABEL",
34146b9709d9STom Rini				 "labels should not be indented\n" . $herecurr) &&
34156b9709d9STom Rini			    $fix) {
34166b9709d9STom Rini				$fixed[$linenr - 1] =~
34176b9709d9STom Rini				    s/^(.)\s+/$1/;
34186b9709d9STom Rini			}
3419dd88ab32SMasahiro Yamada		}
3420dd88ab32SMasahiro Yamada
3421dd88ab32SMasahiro Yamada# Return is not a function.
34226b9709d9STom Rini		if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
3423dd88ab32SMasahiro Yamada			my $spacing = $1;
34246b9709d9STom Rini			if ($^V && $^V ge 5.10.0 &&
34256b9709d9STom Rini			    $stat =~ /^.\s*return\s*$balanced_parens\s*;\s*$/) {
3426dd88ab32SMasahiro Yamada				ERROR("RETURN_PARENTHESES",
3427dd88ab32SMasahiro Yamada				      "return is not a function, parentheses are not required\n" . $herecurr);
3428dd88ab32SMasahiro Yamada
3429dd88ab32SMasahiro Yamada			} elsif ($spacing !~ /\s+/) {
3430dd88ab32SMasahiro Yamada				ERROR("SPACING",
3431dd88ab32SMasahiro Yamada				      "space required before the open parenthesis '('\n" . $herecurr);
3432dd88ab32SMasahiro Yamada			}
3433dd88ab32SMasahiro Yamada		}
34346b9709d9STom Rini
34356b9709d9STom Rini# if statements using unnecessary parentheses - ie: if ((foo == bar))
34366b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
34376b9709d9STom Rini		    $line =~ /\bif\s*((?:\(\s*){2,})/) {
34386b9709d9STom Rini			my $openparens = $1;
34396b9709d9STom Rini			my $count = $openparens =~ tr@\(@\(@;
34406b9709d9STom Rini			my $msg = "";
34416b9709d9STom Rini			if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
34426b9709d9STom Rini				my $comp = $4;	#Not $1 because of $LvalOrFunc
34436b9709d9STom Rini				$msg = " - maybe == should be = ?" if ($comp eq "==");
34446b9709d9STom Rini				WARN("UNNECESSARY_PARENTHESES",
34456b9709d9STom Rini				     "Unnecessary parentheses$msg\n" . $herecurr);
34466b9709d9STom Rini			}
34476b9709d9STom Rini		}
34486b9709d9STom Rini
3449dd88ab32SMasahiro Yamada# Return of what appears to be an errno should normally be -'ve
3450dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
3451dd88ab32SMasahiro Yamada			my $name = $1;
3452dd88ab32SMasahiro Yamada			if ($name ne 'EOF' && $name ne 'ERROR') {
3453dd88ab32SMasahiro Yamada				WARN("USE_NEGATIVE_ERRNO",
3454dd88ab32SMasahiro Yamada				     "return of an errno should typically be -ve (return -$1)\n" . $herecurr);
3455dd88ab32SMasahiro Yamada			}
3456dd88ab32SMasahiro Yamada		}
3457dd88ab32SMasahiro Yamada
3458dd88ab32SMasahiro Yamada# Need a space before open parenthesis after if, while etc
3459dd88ab32SMasahiro Yamada		if ($line =~ /\b(if|while|for|switch)\(/) {
34606b9709d9STom Rini			if (ERROR("SPACING",
34616b9709d9STom Rini				  "space required before the open parenthesis '('\n" . $herecurr) &&
34626b9709d9STom Rini			    $fix) {
34636b9709d9STom Rini				$fixed[$linenr - 1] =~
34646b9709d9STom Rini				    s/\b(if|while|for|switch)\(/$1 \(/;
34656b9709d9STom Rini			}
3466dd88ab32SMasahiro Yamada		}
3467dd88ab32SMasahiro Yamada
3468dd88ab32SMasahiro Yamada# Check for illegal assignment in if conditional -- and check for trailing
3469dd88ab32SMasahiro Yamada# statements after the conditional.
3470dd88ab32SMasahiro Yamada		if ($line =~ /do\s*(?!{)/) {
3471dd88ab32SMasahiro Yamada			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3472dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0)
3473dd88ab32SMasahiro Yamada					if (!defined $stat);
3474dd88ab32SMasahiro Yamada			my ($stat_next) = ctx_statement_block($line_nr_next,
3475dd88ab32SMasahiro Yamada						$remain_next, $off_next);
3476dd88ab32SMasahiro Yamada			$stat_next =~ s/\n./\n /g;
3477dd88ab32SMasahiro Yamada			##print "stat<$stat> stat_next<$stat_next>\n";
3478dd88ab32SMasahiro Yamada
3479dd88ab32SMasahiro Yamada			if ($stat_next =~ /^\s*while\b/) {
3480dd88ab32SMasahiro Yamada				# If the statement carries leading newlines,
3481dd88ab32SMasahiro Yamada				# then count those as offsets.
3482dd88ab32SMasahiro Yamada				my ($whitespace) =
3483dd88ab32SMasahiro Yamada					($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
3484dd88ab32SMasahiro Yamada				my $offset =
3485dd88ab32SMasahiro Yamada					statement_rawlines($whitespace) - 1;
3486dd88ab32SMasahiro Yamada
3487dd88ab32SMasahiro Yamada				$suppress_whiletrailers{$line_nr_next +
3488dd88ab32SMasahiro Yamada								$offset} = 1;
3489dd88ab32SMasahiro Yamada			}
3490dd88ab32SMasahiro Yamada		}
3491dd88ab32SMasahiro Yamada		if (!defined $suppress_whiletrailers{$linenr} &&
34926b9709d9STom Rini		    defined($stat) && defined($cond) &&
3493dd88ab32SMasahiro Yamada		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
3494dd88ab32SMasahiro Yamada			my ($s, $c) = ($stat, $cond);
3495dd88ab32SMasahiro Yamada
3496dd88ab32SMasahiro Yamada			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
3497dd88ab32SMasahiro Yamada				ERROR("ASSIGN_IN_IF",
3498dd88ab32SMasahiro Yamada				      "do not use assignment in if condition\n" . $herecurr);
3499dd88ab32SMasahiro Yamada			}
3500dd88ab32SMasahiro Yamada
3501dd88ab32SMasahiro Yamada			# Find out what is on the end of the line after the
3502dd88ab32SMasahiro Yamada			# conditional.
3503dd88ab32SMasahiro Yamada			substr($s, 0, length($c), '');
3504dd88ab32SMasahiro Yamada			$s =~ s/\n.*//g;
3505dd88ab32SMasahiro Yamada			$s =~ s/$;//g; 	# Remove any comments
3506dd88ab32SMasahiro Yamada			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
3507dd88ab32SMasahiro Yamada			    $c !~ /}\s*while\s*/)
3508dd88ab32SMasahiro Yamada			{
3509dd88ab32SMasahiro Yamada				# Find out how long the conditional actually is.
3510dd88ab32SMasahiro Yamada				my @newlines = ($c =~ /\n/gs);
3511dd88ab32SMasahiro Yamada				my $cond_lines = 1 + $#newlines;
3512dd88ab32SMasahiro Yamada				my $stat_real = '';
3513dd88ab32SMasahiro Yamada
3514dd88ab32SMasahiro Yamada				$stat_real = raw_line($linenr, $cond_lines)
3515dd88ab32SMasahiro Yamada							. "\n" if ($cond_lines);
3516dd88ab32SMasahiro Yamada				if (defined($stat_real) && $cond_lines > 1) {
3517dd88ab32SMasahiro Yamada					$stat_real = "[...]\n$stat_real";
3518dd88ab32SMasahiro Yamada				}
3519dd88ab32SMasahiro Yamada
3520dd88ab32SMasahiro Yamada				ERROR("TRAILING_STATEMENTS",
3521dd88ab32SMasahiro Yamada				      "trailing statements should be on next line\n" . $herecurr . $stat_real);
3522dd88ab32SMasahiro Yamada			}
3523dd88ab32SMasahiro Yamada		}
3524dd88ab32SMasahiro Yamada
3525dd88ab32SMasahiro Yamada# Check for bitwise tests written as boolean
3526dd88ab32SMasahiro Yamada		if ($line =~ /
3527dd88ab32SMasahiro Yamada			(?:
3528dd88ab32SMasahiro Yamada				(?:\[|\(|\&\&|\|\|)
3529dd88ab32SMasahiro Yamada				\s*0[xX][0-9]+\s*
3530dd88ab32SMasahiro Yamada				(?:\&\&|\|\|)
3531dd88ab32SMasahiro Yamada			|
3532dd88ab32SMasahiro Yamada				(?:\&\&|\|\|)
3533dd88ab32SMasahiro Yamada				\s*0[xX][0-9]+\s*
3534dd88ab32SMasahiro Yamada				(?:\&\&|\|\||\)|\])
3535dd88ab32SMasahiro Yamada			)/x)
3536dd88ab32SMasahiro Yamada		{
3537dd88ab32SMasahiro Yamada			WARN("HEXADECIMAL_BOOLEAN_TEST",
3538dd88ab32SMasahiro Yamada			     "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
3539dd88ab32SMasahiro Yamada		}
3540dd88ab32SMasahiro Yamada
3541dd88ab32SMasahiro Yamada# if and else should not have general statements after it
3542dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
3543dd88ab32SMasahiro Yamada			my $s = $1;
3544dd88ab32SMasahiro Yamada			$s =~ s/$;//g; 	# Remove any comments
3545dd88ab32SMasahiro Yamada			if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
3546dd88ab32SMasahiro Yamada				ERROR("TRAILING_STATEMENTS",
3547dd88ab32SMasahiro Yamada				      "trailing statements should be on next line\n" . $herecurr);
3548dd88ab32SMasahiro Yamada			}
3549dd88ab32SMasahiro Yamada		}
3550dd88ab32SMasahiro Yamada# if should not continue a brace
3551dd88ab32SMasahiro Yamada		if ($line =~ /}\s*if\b/) {
3552dd88ab32SMasahiro Yamada			ERROR("TRAILING_STATEMENTS",
3553dd88ab32SMasahiro Yamada			      "trailing statements should be on next line\n" .
3554dd88ab32SMasahiro Yamada				$herecurr);
3555dd88ab32SMasahiro Yamada		}
3556dd88ab32SMasahiro Yamada# case and default should not have general statements after them
3557dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
3558dd88ab32SMasahiro Yamada		    $line !~ /\G(?:
3559dd88ab32SMasahiro Yamada			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
3560dd88ab32SMasahiro Yamada			\s*return\s+
3561dd88ab32SMasahiro Yamada		    )/xg)
3562dd88ab32SMasahiro Yamada		{
3563dd88ab32SMasahiro Yamada			ERROR("TRAILING_STATEMENTS",
3564dd88ab32SMasahiro Yamada			      "trailing statements should be on next line\n" . $herecurr);
3565dd88ab32SMasahiro Yamada		}
3566dd88ab32SMasahiro Yamada
3567dd88ab32SMasahiro Yamada		# Check for }<nl>else {, these must be at the same
3568dd88ab32SMasahiro Yamada		# indent level to be relevant to each other.
3569dd88ab32SMasahiro Yamada		if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
3570dd88ab32SMasahiro Yamada						$previndent == $indent) {
3571dd88ab32SMasahiro Yamada			ERROR("ELSE_AFTER_BRACE",
3572dd88ab32SMasahiro Yamada			      "else should follow close brace '}'\n" . $hereprev);
3573dd88ab32SMasahiro Yamada		}
3574dd88ab32SMasahiro Yamada
3575dd88ab32SMasahiro Yamada		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and
3576dd88ab32SMasahiro Yamada						$previndent == $indent) {
3577dd88ab32SMasahiro Yamada			my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
3578dd88ab32SMasahiro Yamada
3579dd88ab32SMasahiro Yamada			# Find out what is on the end of the line after the
3580dd88ab32SMasahiro Yamada			# conditional.
3581dd88ab32SMasahiro Yamada			substr($s, 0, length($c), '');
3582dd88ab32SMasahiro Yamada			$s =~ s/\n.*//g;
3583dd88ab32SMasahiro Yamada
3584dd88ab32SMasahiro Yamada			if ($s =~ /^\s*;/) {
3585dd88ab32SMasahiro Yamada				ERROR("WHILE_AFTER_BRACE",
3586dd88ab32SMasahiro Yamada				      "while should follow close brace '}'\n" . $hereprev);
3587dd88ab32SMasahiro Yamada			}
3588dd88ab32SMasahiro Yamada		}
3589dd88ab32SMasahiro Yamada
35906b9709d9STom Rini#Specific variable tests
3591dd88ab32SMasahiro Yamada		while ($line =~ m{($Constant|$Lval)}g) {
3592dd88ab32SMasahiro Yamada			my $var = $1;
35936b9709d9STom Rini
35946b9709d9STom Rini#gcc binary extension
35956b9709d9STom Rini			if ($var =~ /^$Binary$/) {
35966b9709d9STom Rini				if (WARN("GCC_BINARY_CONSTANT",
35976b9709d9STom Rini					 "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
35986b9709d9STom Rini				    $fix) {
35996b9709d9STom Rini					my $hexval = sprintf("0x%x", oct($var));
36006b9709d9STom Rini					$fixed[$linenr - 1] =~
36016b9709d9STom Rini					    s/\b$var\b/$hexval/;
36026b9709d9STom Rini				}
36036b9709d9STom Rini			}
36046b9709d9STom Rini
36056b9709d9STom Rini#CamelCase
36066b9709d9STom Rini			if ($var !~ /^$Constant$/ &&
36076b9709d9STom Rini			    $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
36086b9709d9STom Rini#Ignore Page<foo> variants
36096b9709d9STom Rini			    $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
36106b9709d9STom Rini#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
36116b9709d9STom Rini			    $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/) {
36126b9709d9STom Rini				while ($var =~ m{($Ident)}g) {
36136b9709d9STom Rini					my $word = $1;
36146b9709d9STom Rini					next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
36156b9709d9STom Rini					if ($check) {
36166b9709d9STom Rini						seed_camelcase_includes();
36176b9709d9STom Rini						if (!$file && !$camelcase_file_seeded) {
36186b9709d9STom Rini							seed_camelcase_file($realfile);
36196b9709d9STom Rini							$camelcase_file_seeded = 1;
36206b9709d9STom Rini						}
36216b9709d9STom Rini					}
36226b9709d9STom Rini					if (!defined $camelcase{$word}) {
36236b9709d9STom Rini						$camelcase{$word} = 1;
36246b9709d9STom Rini						CHK("CAMELCASE",
36256b9709d9STom Rini						    "Avoid CamelCase: <$word>\n" . $herecurr);
36266b9709d9STom Rini					}
36276b9709d9STom Rini				}
3628dd88ab32SMasahiro Yamada			}
3629dd88ab32SMasahiro Yamada		}
3630dd88ab32SMasahiro Yamada
3631dd88ab32SMasahiro Yamada#no spaces allowed after \ in define
36326b9709d9STom Rini		if ($line =~ /\#\s*define.*\\\s+$/) {
36336b9709d9STom Rini			if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
36346b9709d9STom Rini				 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
36356b9709d9STom Rini			    $fix) {
36366b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\s+$//;
36376b9709d9STom Rini			}
3638dd88ab32SMasahiro Yamada		}
3639dd88ab32SMasahiro Yamada
3640dd88ab32SMasahiro Yamada#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
3641dd88ab32SMasahiro Yamada		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
3642dd88ab32SMasahiro Yamada			my $file = "$1.h";
3643dd88ab32SMasahiro Yamada			my $checkfile = "include/linux/$file";
3644dd88ab32SMasahiro Yamada			if (-f "$root/$checkfile" &&
3645dd88ab32SMasahiro Yamada			    $realfile ne $checkfile &&
3646dd88ab32SMasahiro Yamada			    $1 !~ /$allowed_asm_includes/)
3647dd88ab32SMasahiro Yamada			{
3648dd88ab32SMasahiro Yamada				if ($realfile =~ m{^arch/}) {
3649dd88ab32SMasahiro Yamada					CHK("ARCH_INCLUDE_LINUX",
3650dd88ab32SMasahiro Yamada					    "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
3651dd88ab32SMasahiro Yamada				} else {
3652dd88ab32SMasahiro Yamada					WARN("INCLUDE_LINUX",
3653dd88ab32SMasahiro Yamada					     "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
3654dd88ab32SMasahiro Yamada				}
3655dd88ab32SMasahiro Yamada			}
3656dd88ab32SMasahiro Yamada		}
3657dd88ab32SMasahiro Yamada
3658dd88ab32SMasahiro Yamada# multi-statement macros should be enclosed in a do while loop, grab the
3659dd88ab32SMasahiro Yamada# first statement and ensure its the whole macro if its not enclosed
3660dd88ab32SMasahiro Yamada# in a known good container
3661dd88ab32SMasahiro Yamada		if ($realfile !~ m@/vmlinux.lds.h$@ &&
3662dd88ab32SMasahiro Yamada		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
3663dd88ab32SMasahiro Yamada			my $ln = $linenr;
3664dd88ab32SMasahiro Yamada			my $cnt = $realcnt;
3665dd88ab32SMasahiro Yamada			my ($off, $dstat, $dcond, $rest);
3666dd88ab32SMasahiro Yamada			my $ctx = '';
3667dd88ab32SMasahiro Yamada			($dstat, $dcond, $ln, $cnt, $off) =
3668dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0);
3669dd88ab32SMasahiro Yamada			$ctx = $dstat;
3670dd88ab32SMasahiro Yamada			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
3671dd88ab32SMasahiro Yamada			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
3672dd88ab32SMasahiro Yamada
3673dd88ab32SMasahiro Yamada			$dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
3674dd88ab32SMasahiro Yamada			$dstat =~ s/$;//g;
3675dd88ab32SMasahiro Yamada			$dstat =~ s/\\\n.//g;
3676dd88ab32SMasahiro Yamada			$dstat =~ s/^\s*//s;
3677dd88ab32SMasahiro Yamada			$dstat =~ s/\s*$//s;
3678dd88ab32SMasahiro Yamada
3679dd88ab32SMasahiro Yamada			# Flatten any parentheses and braces
3680dd88ab32SMasahiro Yamada			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
3681dd88ab32SMasahiro Yamada			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
3682dd88ab32SMasahiro Yamada			       $dstat =~ s/\[[^\[\]]*\]/1/)
3683dd88ab32SMasahiro Yamada			{
3684dd88ab32SMasahiro Yamada			}
3685dd88ab32SMasahiro Yamada
3686dd88ab32SMasahiro Yamada			# Flatten any obvious string concatentation.
3687dd88ab32SMasahiro Yamada			while ($dstat =~ s/("X*")\s*$Ident/$1/ ||
3688dd88ab32SMasahiro Yamada			       $dstat =~ s/$Ident\s*("X*")/$1/)
3689dd88ab32SMasahiro Yamada			{
3690dd88ab32SMasahiro Yamada			}
3691dd88ab32SMasahiro Yamada
3692dd88ab32SMasahiro Yamada			my $exceptions = qr{
3693dd88ab32SMasahiro Yamada				$Declare|
3694dd88ab32SMasahiro Yamada				module_param_named|
3695dd88ab32SMasahiro Yamada				MODULE_PARM_DESC|
3696dd88ab32SMasahiro Yamada				DECLARE_PER_CPU|
3697dd88ab32SMasahiro Yamada				DEFINE_PER_CPU|
3698dd88ab32SMasahiro Yamada				__typeof__\(|
3699dd88ab32SMasahiro Yamada				union|
3700dd88ab32SMasahiro Yamada				struct|
3701dd88ab32SMasahiro Yamada				\.$Ident\s*=\s*|
3702dd88ab32SMasahiro Yamada				^\"|\"$
3703dd88ab32SMasahiro Yamada			}x;
3704dd88ab32SMasahiro Yamada			#print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
3705dd88ab32SMasahiro Yamada			if ($dstat ne '' &&
3706dd88ab32SMasahiro Yamada			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
3707dd88ab32SMasahiro Yamada			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
37086b9709d9STom Rini			    $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
3709dd88ab32SMasahiro Yamada			    $dstat !~ /^'X'$/ &&					# character constants
3710dd88ab32SMasahiro Yamada			    $dstat !~ /$exceptions/ &&
3711dd88ab32SMasahiro Yamada			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
37126b9709d9STom Rini			    $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&		# stringification #foo
3713dd88ab32SMasahiro Yamada			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
3714dd88ab32SMasahiro Yamada			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
3715dd88ab32SMasahiro Yamada			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
3716dd88ab32SMasahiro Yamada			    $dstat !~ /^do\s*{/ &&					# do {...
3717d8a1a304SHeiko Schocher			    $dstat !~ /^\(\{/ &&						# ({...
37186b9709d9STom Rini			    $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
3719dd88ab32SMasahiro Yamada			{
3720dd88ab32SMasahiro Yamada				$ctx =~ s/\n*$//;
3721dd88ab32SMasahiro Yamada				my $herectx = $here . "\n";
3722dd88ab32SMasahiro Yamada				my $cnt = statement_rawlines($ctx);
3723dd88ab32SMasahiro Yamada
3724dd88ab32SMasahiro Yamada				for (my $n = 0; $n < $cnt; $n++) {
3725dd88ab32SMasahiro Yamada					$herectx .= raw_line($linenr, $n) . "\n";
3726dd88ab32SMasahiro Yamada				}
3727dd88ab32SMasahiro Yamada
3728dd88ab32SMasahiro Yamada				if ($dstat =~ /;/) {
3729dd88ab32SMasahiro Yamada					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
3730dd88ab32SMasahiro Yamada					      "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
3731dd88ab32SMasahiro Yamada				} else {
3732dd88ab32SMasahiro Yamada					ERROR("COMPLEX_MACRO",
3733dd88ab32SMasahiro Yamada					      "Macros with complex values should be enclosed in parenthesis\n" . "$herectx");
3734dd88ab32SMasahiro Yamada				}
3735dd88ab32SMasahiro Yamada			}
3736dd88ab32SMasahiro Yamada
3737dd88ab32SMasahiro Yamada# check for line continuations outside of #defines, preprocessor #, and asm
3738dd88ab32SMasahiro Yamada
3739dd88ab32SMasahiro Yamada		} else {
3740dd88ab32SMasahiro Yamada			if ($prevline !~ /^..*\\$/ &&
3741dd88ab32SMasahiro Yamada			    $line !~ /^\+\s*\#.*\\$/ &&		# preprocessor
3742dd88ab32SMasahiro Yamada			    $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&	# asm
3743dd88ab32SMasahiro Yamada			    $line =~ /^\+.*\\$/) {
3744dd88ab32SMasahiro Yamada				WARN("LINE_CONTINUATIONS",
3745dd88ab32SMasahiro Yamada				     "Avoid unnecessary line continuations\n" . $herecurr);
3746dd88ab32SMasahiro Yamada			}
3747dd88ab32SMasahiro Yamada		}
3748dd88ab32SMasahiro Yamada
3749dd88ab32SMasahiro Yamada# do {} while (0) macro tests:
3750dd88ab32SMasahiro Yamada# single-statement macros do not need to be enclosed in do while (0) loop,
3751dd88ab32SMasahiro Yamada# macro should not end with a semicolon
3752dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
3753dd88ab32SMasahiro Yamada		    $realfile !~ m@/vmlinux.lds.h$@ &&
3754dd88ab32SMasahiro Yamada		    $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
3755dd88ab32SMasahiro Yamada			my $ln = $linenr;
3756dd88ab32SMasahiro Yamada			my $cnt = $realcnt;
3757dd88ab32SMasahiro Yamada			my ($off, $dstat, $dcond, $rest);
3758dd88ab32SMasahiro Yamada			my $ctx = '';
3759dd88ab32SMasahiro Yamada			($dstat, $dcond, $ln, $cnt, $off) =
3760dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0);
3761dd88ab32SMasahiro Yamada			$ctx = $dstat;
3762dd88ab32SMasahiro Yamada
3763dd88ab32SMasahiro Yamada			$dstat =~ s/\\\n.//g;
3764dd88ab32SMasahiro Yamada
3765dd88ab32SMasahiro Yamada			if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
3766dd88ab32SMasahiro Yamada				my $stmts = $2;
3767dd88ab32SMasahiro Yamada				my $semis = $3;
3768dd88ab32SMasahiro Yamada
3769dd88ab32SMasahiro Yamada				$ctx =~ s/\n*$//;
3770dd88ab32SMasahiro Yamada				my $cnt = statement_rawlines($ctx);
3771dd88ab32SMasahiro Yamada				my $herectx = $here . "\n";
3772dd88ab32SMasahiro Yamada
3773dd88ab32SMasahiro Yamada				for (my $n = 0; $n < $cnt; $n++) {
3774dd88ab32SMasahiro Yamada					$herectx .= raw_line($linenr, $n) . "\n";
3775dd88ab32SMasahiro Yamada				}
3776dd88ab32SMasahiro Yamada
3777dd88ab32SMasahiro Yamada				if (($stmts =~ tr/;/;/) == 1 &&
3778dd88ab32SMasahiro Yamada				    $stmts !~ /^\s*(if|while|for|switch)\b/) {
3779dd88ab32SMasahiro Yamada					WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
3780dd88ab32SMasahiro Yamada					     "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
3781dd88ab32SMasahiro Yamada				}
3782dd88ab32SMasahiro Yamada				if (defined $semis && $semis ne "") {
3783dd88ab32SMasahiro Yamada					WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
3784dd88ab32SMasahiro Yamada					     "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
3785dd88ab32SMasahiro Yamada				}
3786dd88ab32SMasahiro Yamada			}
3787dd88ab32SMasahiro Yamada		}
3788dd88ab32SMasahiro Yamada
3789dd88ab32SMasahiro Yamada# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
3790dd88ab32SMasahiro Yamada# all assignments may have only one of the following with an assignment:
3791dd88ab32SMasahiro Yamada#	.
3792dd88ab32SMasahiro Yamada#	ALIGN(...)
3793dd88ab32SMasahiro Yamada#	VMLINUX_SYMBOL(...)
3794dd88ab32SMasahiro Yamada		if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
3795dd88ab32SMasahiro Yamada			WARN("MISSING_VMLINUX_SYMBOL",
3796dd88ab32SMasahiro Yamada			     "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
3797dd88ab32SMasahiro Yamada		}
3798dd88ab32SMasahiro Yamada
3799dd88ab32SMasahiro Yamada# check for redundant bracing round if etc
3800dd88ab32SMasahiro Yamada		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
3801dd88ab32SMasahiro Yamada			my ($level, $endln, @chunks) =
3802dd88ab32SMasahiro Yamada				ctx_statement_full($linenr, $realcnt, 1);
3803dd88ab32SMasahiro Yamada			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
3804dd88ab32SMasahiro Yamada			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
3805dd88ab32SMasahiro Yamada			if ($#chunks > 0 && $level == 0) {
3806dd88ab32SMasahiro Yamada				my @allowed = ();
3807dd88ab32SMasahiro Yamada				my $allow = 0;
3808dd88ab32SMasahiro Yamada				my $seen = 0;
3809dd88ab32SMasahiro Yamada				my $herectx = $here . "\n";
3810dd88ab32SMasahiro Yamada				my $ln = $linenr - 1;
3811dd88ab32SMasahiro Yamada				for my $chunk (@chunks) {
3812dd88ab32SMasahiro Yamada					my ($cond, $block) = @{$chunk};
3813dd88ab32SMasahiro Yamada
3814dd88ab32SMasahiro Yamada					# If the condition carries leading newlines, then count those as offsets.
3815dd88ab32SMasahiro Yamada					my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
3816dd88ab32SMasahiro Yamada					my $offset = statement_rawlines($whitespace) - 1;
3817dd88ab32SMasahiro Yamada
3818dd88ab32SMasahiro Yamada					$allowed[$allow] = 0;
3819dd88ab32SMasahiro Yamada					#print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
3820dd88ab32SMasahiro Yamada
3821dd88ab32SMasahiro Yamada					# We have looked at and allowed this specific line.
3822dd88ab32SMasahiro Yamada					$suppress_ifbraces{$ln + $offset} = 1;
3823dd88ab32SMasahiro Yamada
3824dd88ab32SMasahiro Yamada					$herectx .= "$rawlines[$ln + $offset]\n[...]\n";
3825dd88ab32SMasahiro Yamada					$ln += statement_rawlines($block) - 1;
3826dd88ab32SMasahiro Yamada
3827dd88ab32SMasahiro Yamada					substr($block, 0, length($cond), '');
3828dd88ab32SMasahiro Yamada
3829dd88ab32SMasahiro Yamada					$seen++ if ($block =~ /^\s*{/);
3830dd88ab32SMasahiro Yamada
3831dd88ab32SMasahiro Yamada					#print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
3832dd88ab32SMasahiro Yamada					if (statement_lines($cond) > 1) {
3833dd88ab32SMasahiro Yamada						#print "APW: ALLOWED: cond<$cond>\n";
3834dd88ab32SMasahiro Yamada						$allowed[$allow] = 1;
3835dd88ab32SMasahiro Yamada					}
3836dd88ab32SMasahiro Yamada					if ($block =~/\b(?:if|for|while)\b/) {
3837dd88ab32SMasahiro Yamada						#print "APW: ALLOWED: block<$block>\n";
3838dd88ab32SMasahiro Yamada						$allowed[$allow] = 1;
3839dd88ab32SMasahiro Yamada					}
3840dd88ab32SMasahiro Yamada					if (statement_block_size($block) > 1) {
3841dd88ab32SMasahiro Yamada						#print "APW: ALLOWED: lines block<$block>\n";
3842dd88ab32SMasahiro Yamada						$allowed[$allow] = 1;
3843dd88ab32SMasahiro Yamada					}
3844dd88ab32SMasahiro Yamada					$allow++;
3845dd88ab32SMasahiro Yamada				}
3846dd88ab32SMasahiro Yamada				if ($seen) {
3847dd88ab32SMasahiro Yamada					my $sum_allowed = 0;
3848dd88ab32SMasahiro Yamada					foreach (@allowed) {
3849dd88ab32SMasahiro Yamada						$sum_allowed += $_;
3850dd88ab32SMasahiro Yamada					}
3851dd88ab32SMasahiro Yamada					if ($sum_allowed == 0) {
3852dd88ab32SMasahiro Yamada						WARN("BRACES",
3853dd88ab32SMasahiro Yamada						     "braces {} are not necessary for any arm of this statement\n" . $herectx);
3854dd88ab32SMasahiro Yamada					} elsif ($sum_allowed != $allow &&
3855dd88ab32SMasahiro Yamada						 $seen != $allow) {
3856dd88ab32SMasahiro Yamada						CHK("BRACES",
3857dd88ab32SMasahiro Yamada						    "braces {} should be used on all arms of this statement\n" . $herectx);
3858dd88ab32SMasahiro Yamada					}
3859dd88ab32SMasahiro Yamada				}
3860dd88ab32SMasahiro Yamada			}
3861dd88ab32SMasahiro Yamada		}
3862dd88ab32SMasahiro Yamada		if (!defined $suppress_ifbraces{$linenr - 1} &&
3863dd88ab32SMasahiro Yamada					$line =~ /\b(if|while|for|else)\b/) {
3864dd88ab32SMasahiro Yamada			my $allowed = 0;
3865dd88ab32SMasahiro Yamada
3866dd88ab32SMasahiro Yamada			# Check the pre-context.
3867dd88ab32SMasahiro Yamada			if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
3868dd88ab32SMasahiro Yamada				#print "APW: ALLOWED: pre<$1>\n";
3869dd88ab32SMasahiro Yamada				$allowed = 1;
3870dd88ab32SMasahiro Yamada			}
3871dd88ab32SMasahiro Yamada
3872dd88ab32SMasahiro Yamada			my ($level, $endln, @chunks) =
3873dd88ab32SMasahiro Yamada				ctx_statement_full($linenr, $realcnt, $-[0]);
3874dd88ab32SMasahiro Yamada
3875dd88ab32SMasahiro Yamada			# Check the condition.
3876dd88ab32SMasahiro Yamada			my ($cond, $block) = @{$chunks[0]};
3877dd88ab32SMasahiro Yamada			#print "CHECKING<$linenr> cond<$cond> block<$block>\n";
3878dd88ab32SMasahiro Yamada			if (defined $cond) {
3879dd88ab32SMasahiro Yamada				substr($block, 0, length($cond), '');
3880dd88ab32SMasahiro Yamada			}
3881dd88ab32SMasahiro Yamada			if (statement_lines($cond) > 1) {
3882dd88ab32SMasahiro Yamada				#print "APW: ALLOWED: cond<$cond>\n";
3883dd88ab32SMasahiro Yamada				$allowed = 1;
3884dd88ab32SMasahiro Yamada			}
3885dd88ab32SMasahiro Yamada			if ($block =~/\b(?:if|for|while)\b/) {
3886dd88ab32SMasahiro Yamada				#print "APW: ALLOWED: block<$block>\n";
3887dd88ab32SMasahiro Yamada				$allowed = 1;
3888dd88ab32SMasahiro Yamada			}
3889dd88ab32SMasahiro Yamada			if (statement_block_size($block) > 1) {
3890dd88ab32SMasahiro Yamada				#print "APW: ALLOWED: lines block<$block>\n";
3891dd88ab32SMasahiro Yamada				$allowed = 1;
3892dd88ab32SMasahiro Yamada			}
3893dd88ab32SMasahiro Yamada			# Check the post-context.
3894dd88ab32SMasahiro Yamada			if (defined $chunks[1]) {
3895dd88ab32SMasahiro Yamada				my ($cond, $block) = @{$chunks[1]};
3896dd88ab32SMasahiro Yamada				if (defined $cond) {
3897dd88ab32SMasahiro Yamada					substr($block, 0, length($cond), '');
3898dd88ab32SMasahiro Yamada				}
3899dd88ab32SMasahiro Yamada				if ($block =~ /^\s*\{/) {
3900dd88ab32SMasahiro Yamada					#print "APW: ALLOWED: chunk-1 block<$block>\n";
3901dd88ab32SMasahiro Yamada					$allowed = 1;
3902dd88ab32SMasahiro Yamada				}
3903dd88ab32SMasahiro Yamada			}
3904dd88ab32SMasahiro Yamada			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
3905dd88ab32SMasahiro Yamada				my $herectx = $here . "\n";
3906dd88ab32SMasahiro Yamada				my $cnt = statement_rawlines($block);
3907dd88ab32SMasahiro Yamada
3908dd88ab32SMasahiro Yamada				for (my $n = 0; $n < $cnt; $n++) {
3909dd88ab32SMasahiro Yamada					$herectx .= raw_line($linenr, $n) . "\n";
3910dd88ab32SMasahiro Yamada				}
3911dd88ab32SMasahiro Yamada
3912dd88ab32SMasahiro Yamada				WARN("BRACES",
3913dd88ab32SMasahiro Yamada				     "braces {} are not necessary for single statement blocks\n" . $herectx);
3914dd88ab32SMasahiro Yamada			}
3915dd88ab32SMasahiro Yamada		}
3916dd88ab32SMasahiro Yamada
3917dd88ab32SMasahiro Yamada# check for unnecessary blank lines around braces
39186b9709d9STom Rini		if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
3919dd88ab32SMasahiro Yamada			CHK("BRACES",
3920dd88ab32SMasahiro Yamada			    "Blank lines aren't necessary before a close brace '}'\n" . $hereprev);
3921dd88ab32SMasahiro Yamada		}
39226b9709d9STom Rini		if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
3923dd88ab32SMasahiro Yamada			CHK("BRACES",
3924dd88ab32SMasahiro Yamada			    "Blank lines aren't necessary after an open brace '{'\n" . $hereprev);
3925dd88ab32SMasahiro Yamada		}
3926dd88ab32SMasahiro Yamada
3927dd88ab32SMasahiro Yamada# no volatiles please
3928dd88ab32SMasahiro Yamada		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
3929dd88ab32SMasahiro Yamada		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
3930dd88ab32SMasahiro Yamada			WARN("VOLATILE",
3931dd88ab32SMasahiro Yamada			     "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
3932dd88ab32SMasahiro Yamada		}
3933dd88ab32SMasahiro Yamada
3934dd88ab32SMasahiro Yamada# warn about #if 0
3935dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
3936dd88ab32SMasahiro Yamada			CHK("REDUNDANT_CODE",
3937dd88ab32SMasahiro Yamada			    "if this code is redundant consider removing it\n" .
3938dd88ab32SMasahiro Yamada				$herecurr);
3939dd88ab32SMasahiro Yamada		}
3940dd88ab32SMasahiro Yamada
3941dd88ab32SMasahiro Yamada# check for needless "if (<foo>) fn(<foo>)" uses
3942dd88ab32SMasahiro Yamada		if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
3943dd88ab32SMasahiro Yamada			my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';
3944dd88ab32SMasahiro Yamada			if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
3945dd88ab32SMasahiro Yamada				WARN('NEEDLESS_IF',
3946dd88ab32SMasahiro Yamada				     "$1(NULL) is safe this check is probably not required\n" . $hereprev);
3947dd88ab32SMasahiro Yamada			}
3948dd88ab32SMasahiro Yamada		}
3949dd88ab32SMasahiro Yamada
39506b9709d9STom Rini# check for bad placement of section $InitAttribute (e.g.: __initdata)
39516b9709d9STom Rini		if ($line =~ /(\b$InitAttribute\b)/) {
39526b9709d9STom Rini			my $attr = $1;
39536b9709d9STom Rini			if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
39546b9709d9STom Rini				my $ptr = $1;
39556b9709d9STom Rini				my $var = $2;
39566b9709d9STom Rini				if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
39576b9709d9STom Rini				      ERROR("MISPLACED_INIT",
39586b9709d9STom Rini					    "$attr should be placed after $var\n" . $herecurr)) ||
39596b9709d9STom Rini				     ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
39606b9709d9STom Rini				      WARN("MISPLACED_INIT",
39616b9709d9STom Rini					   "$attr should be placed after $var\n" . $herecurr))) &&
39626b9709d9STom Rini				    $fix) {
39636b9709d9STom 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;
39646b9709d9STom Rini				}
39656b9709d9STom Rini			}
39666b9709d9STom Rini		}
39676b9709d9STom Rini
39686b9709d9STom Rini# check for $InitAttributeData (ie: __initdata) with const
39696b9709d9STom Rini		if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
39706b9709d9STom Rini			my $attr = $1;
39716b9709d9STom Rini			$attr =~ /($InitAttributePrefix)(.*)/;
39726b9709d9STom Rini			my $attr_prefix = $1;
39736b9709d9STom Rini			my $attr_type = $2;
39746b9709d9STom Rini			if (ERROR("INIT_ATTRIBUTE",
39756b9709d9STom Rini				  "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
39766b9709d9STom Rini			    $fix) {
39776b9709d9STom Rini				$fixed[$linenr - 1] =~
39786b9709d9STom Rini				    s/$InitAttributeData/${attr_prefix}initconst/;
39796b9709d9STom Rini			}
39806b9709d9STom Rini		}
39816b9709d9STom Rini
39826b9709d9STom Rini# check for $InitAttributeConst (ie: __initconst) without const
39836b9709d9STom Rini		if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
39846b9709d9STom Rini			my $attr = $1;
39856b9709d9STom Rini			if (ERROR("INIT_ATTRIBUTE",
39866b9709d9STom Rini				  "Use of $attr requires a separate use of const\n" . $herecurr) &&
39876b9709d9STom Rini			    $fix) {
39886b9709d9STom Rini				my $lead = $fixed[$linenr - 1] =~
39896b9709d9STom Rini				    /(^\+\s*(?:static\s+))/;
39906b9709d9STom Rini				$lead = rtrim($1);
39916b9709d9STom Rini				$lead = "$lead " if ($lead !~ /^\+$/);
39926b9709d9STom Rini				$lead = "${lead}const ";
39936b9709d9STom Rini				$fixed[$linenr - 1] =~ s/(^\+\s*(?:static\s+))/$lead/;
39946b9709d9STom Rini			}
39956b9709d9STom Rini		}
39966b9709d9STom Rini
3997dd88ab32SMasahiro Yamada# prefer usleep_range over udelay
3998dd88ab32SMasahiro Yamada		if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
3999dd88ab32SMasahiro Yamada			# ignore udelay's < 10, however
4000dd88ab32SMasahiro Yamada			if (! ($1 < 10) ) {
4001dd88ab32SMasahiro Yamada				CHK("USLEEP_RANGE",
4002dd88ab32SMasahiro Yamada				    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $line);
4003dd88ab32SMasahiro Yamada			}
4004dd88ab32SMasahiro Yamada		}
4005dd88ab32SMasahiro Yamada
4006dd88ab32SMasahiro Yamada# warn about unexpectedly long msleep's
4007dd88ab32SMasahiro Yamada		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
4008dd88ab32SMasahiro Yamada			if ($1 < 20) {
4009dd88ab32SMasahiro Yamada				WARN("MSLEEP",
4010dd88ab32SMasahiro Yamada				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $line);
4011dd88ab32SMasahiro Yamada			}
4012dd88ab32SMasahiro Yamada		}
4013dd88ab32SMasahiro Yamada
40146b9709d9STom Rini# check for comparisons of jiffies
40156b9709d9STom Rini		if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
40166b9709d9STom Rini			WARN("JIFFIES_COMPARISON",
40176b9709d9STom Rini			     "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
40186b9709d9STom Rini		}
40196b9709d9STom Rini
40206b9709d9STom Rini# check for comparisons of get_jiffies_64()
40216b9709d9STom Rini		if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
40226b9709d9STom Rini			WARN("JIFFIES_COMPARISON",
40236b9709d9STom Rini			     "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
40246b9709d9STom Rini		}
40256b9709d9STom Rini
4026dd88ab32SMasahiro Yamada# warn about #ifdefs in C files
4027dd88ab32SMasahiro Yamada#		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
4028dd88ab32SMasahiro Yamada#			print "#ifdef in C files should be avoided\n";
4029dd88ab32SMasahiro Yamada#			print "$herecurr";
4030dd88ab32SMasahiro Yamada#			$clean = 0;
4031dd88ab32SMasahiro Yamada#		}
4032dd88ab32SMasahiro Yamada
4033dd88ab32SMasahiro Yamada# warn about spacing in #ifdefs
4034dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
40356b9709d9STom Rini			if (ERROR("SPACING",
40366b9709d9STom Rini				  "exactly one space required after that #$1\n" . $herecurr) &&
40376b9709d9STom Rini			    $fix) {
40386b9709d9STom Rini				$fixed[$linenr - 1] =~
40396b9709d9STom Rini				    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
40406b9709d9STom Rini			}
40416b9709d9STom Rini
4042dd88ab32SMasahiro Yamada		}
4043dd88ab32SMasahiro Yamada
4044dd88ab32SMasahiro Yamada# check for spinlock_t definitions without a comment.
4045dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
4046dd88ab32SMasahiro Yamada		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4047dd88ab32SMasahiro Yamada			my $which = $1;
4048dd88ab32SMasahiro Yamada			if (!ctx_has_comment($first_line, $linenr)) {
4049dd88ab32SMasahiro Yamada				CHK("UNCOMMENTED_DEFINITION",
4050dd88ab32SMasahiro Yamada				    "$1 definition without comment\n" . $herecurr);
4051dd88ab32SMasahiro Yamada			}
4052dd88ab32SMasahiro Yamada		}
4053dd88ab32SMasahiro Yamada# check for memory barriers without a comment.
4054dd88ab32SMasahiro Yamada		if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
4055dd88ab32SMasahiro Yamada			if (!ctx_has_comment($first_line, $linenr)) {
40566b9709d9STom Rini				WARN("MEMORY_BARRIER",
4057dd88ab32SMasahiro Yamada				     "memory barrier without comment\n" . $herecurr);
4058dd88ab32SMasahiro Yamada			}
4059dd88ab32SMasahiro Yamada		}
4060dd88ab32SMasahiro Yamada# check of hardware specific defines
4061dd88ab32SMasahiro Yamada		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
4062dd88ab32SMasahiro Yamada			CHK("ARCH_DEFINES",
4063dd88ab32SMasahiro Yamada			    "architecture specific defines should be avoided\n" .  $herecurr);
4064dd88ab32SMasahiro Yamada		}
4065dd88ab32SMasahiro Yamada
4066dd88ab32SMasahiro Yamada# Check that the storage class is at the beginning of a declaration
4067dd88ab32SMasahiro Yamada		if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
4068dd88ab32SMasahiro Yamada			WARN("STORAGE_CLASS",
4069dd88ab32SMasahiro Yamada			     "storage class should be at the beginning of the declaration\n" . $herecurr)
4070dd88ab32SMasahiro Yamada		}
4071dd88ab32SMasahiro Yamada
4072dd88ab32SMasahiro Yamada# check the location of the inline attribute, that it is between
4073dd88ab32SMasahiro Yamada# storage class and type.
4074dd88ab32SMasahiro Yamada		if ($line =~ /\b$Type\s+$Inline\b/ ||
4075dd88ab32SMasahiro Yamada		    $line =~ /\b$Inline\s+$Storage\b/) {
4076dd88ab32SMasahiro Yamada			ERROR("INLINE_LOCATION",
4077dd88ab32SMasahiro Yamada			      "inline keyword should sit between storage class and type\n" . $herecurr);
4078dd88ab32SMasahiro Yamada		}
4079dd88ab32SMasahiro Yamada
4080dd88ab32SMasahiro Yamada# Check for __inline__ and __inline, prefer inline
40816b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
40826b9709d9STom Rini		    $line =~ /\b(__inline__|__inline)\b/) {
40836b9709d9STom Rini			if (WARN("INLINE",
40846b9709d9STom Rini				 "plain inline is preferred over $1\n" . $herecurr) &&
40856b9709d9STom Rini			    $fix) {
40866b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\b(__inline__|__inline)\b/inline/;
40876b9709d9STom Rini
40886b9709d9STom Rini			}
4089dd88ab32SMasahiro Yamada		}
4090dd88ab32SMasahiro Yamada
4091dd88ab32SMasahiro Yamada# Check for __attribute__ packed, prefer __packed
40926b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
40936b9709d9STom Rini		    $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
4094dd88ab32SMasahiro Yamada			WARN("PREFER_PACKED",
4095dd88ab32SMasahiro Yamada			     "__packed is preferred over __attribute__((packed))\n" . $herecurr);
4096dd88ab32SMasahiro Yamada		}
4097f503cc49STom Rini# Check for new packed members, warn to use care
4098f503cc49STom Rini		if ($line =~ /\b(__attribute__\s*\(\s*\(.*\bpacked|__packed)\b/) {
4099f503cc49STom Rini			WARN("NEW_PACKED",
4100f503cc49STom Rini			     "Adding new packed members is to be done with care\n" . $herecurr);
4101f503cc49STom Rini		}
4102dd88ab32SMasahiro Yamada
4103dd88ab32SMasahiro Yamada# Check for __attribute__ aligned, prefer __aligned
41046b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
41056b9709d9STom Rini		    $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
4106dd88ab32SMasahiro Yamada			WARN("PREFER_ALIGNED",
4107dd88ab32SMasahiro Yamada			     "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
4108dd88ab32SMasahiro Yamada		}
4109dd88ab32SMasahiro Yamada
4110dd88ab32SMasahiro Yamada# Check for __attribute__ format(printf, prefer __printf
41116b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
41126b9709d9STom Rini		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
41136b9709d9STom Rini			if (WARN("PREFER_PRINTF",
41146b9709d9STom Rini				 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
41156b9709d9STom Rini			    $fix) {
41166b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
41176b9709d9STom Rini
41186b9709d9STom Rini			}
4119dd88ab32SMasahiro Yamada		}
4120dd88ab32SMasahiro Yamada
4121dd88ab32SMasahiro Yamada# Check for __attribute__ format(scanf, prefer __scanf
41226b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
41236b9709d9STom Rini		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
41246b9709d9STom Rini			if (WARN("PREFER_SCANF",
41256b9709d9STom Rini				 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
41266b9709d9STom Rini			    $fix) {
41276b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
41286b9709d9STom Rini			}
4129dd88ab32SMasahiro Yamada		}
4130dd88ab32SMasahiro Yamada
4131dd88ab32SMasahiro Yamada# check for sizeof(&)
4132dd88ab32SMasahiro Yamada		if ($line =~ /\bsizeof\s*\(\s*\&/) {
4133dd88ab32SMasahiro Yamada			WARN("SIZEOF_ADDRESS",
4134dd88ab32SMasahiro Yamada			     "sizeof(& should be avoided\n" . $herecurr);
4135dd88ab32SMasahiro Yamada		}
4136dd88ab32SMasahiro Yamada
4137dd88ab32SMasahiro Yamada# check for sizeof without parenthesis
4138dd88ab32SMasahiro Yamada		if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
41396b9709d9STom Rini			if (WARN("SIZEOF_PARENTHESIS",
41406b9709d9STom Rini				 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
41416b9709d9STom Rini			    $fix) {
41426b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
41436b9709d9STom Rini			}
4144dd88ab32SMasahiro Yamada		}
4145dd88ab32SMasahiro Yamada
4146dd88ab32SMasahiro Yamada# check for line continuations in quoted strings with odd counts of "
4147dd88ab32SMasahiro Yamada		if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
4148dd88ab32SMasahiro Yamada			WARN("LINE_CONTINUATIONS",
4149dd88ab32SMasahiro Yamada			     "Avoid line continuations in quoted strings\n" . $herecurr);
4150dd88ab32SMasahiro Yamada		}
4151dd88ab32SMasahiro Yamada
4152dd88ab32SMasahiro Yamada# check for struct spinlock declarations
4153dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
4154dd88ab32SMasahiro Yamada			WARN("USE_SPINLOCK_T",
4155dd88ab32SMasahiro Yamada			     "struct spinlock should be spinlock_t\n" . $herecurr);
4156dd88ab32SMasahiro Yamada		}
4157dd88ab32SMasahiro Yamada
41586b9709d9STom Rini# check for seq_printf uses that could be seq_puts
41596b9709d9STom Rini		if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
41606b9709d9STom Rini			my $fmt = get_quoted_string($line, $rawline);
41616b9709d9STom Rini			if ($fmt ne "" && $fmt !~ /[^\\]\%/) {
41626b9709d9STom Rini				if (WARN("PREFER_SEQ_PUTS",
41636b9709d9STom Rini					 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
41646b9709d9STom Rini				    $fix) {
41656b9709d9STom Rini					$fixed[$linenr - 1] =~ s/\bseq_printf\b/seq_puts/;
41666b9709d9STom Rini				}
41676b9709d9STom Rini			}
41686b9709d9STom Rini		}
41696b9709d9STom Rini
4170dd88ab32SMasahiro Yamada# Check for misused memsets
4171dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
4172dd88ab32SMasahiro Yamada		    defined $stat &&
4173dd88ab32SMasahiro Yamada		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
4174dd88ab32SMasahiro Yamada
4175dd88ab32SMasahiro Yamada			my $ms_addr = $2;
4176dd88ab32SMasahiro Yamada			my $ms_val = $7;
4177dd88ab32SMasahiro Yamada			my $ms_size = $12;
4178dd88ab32SMasahiro Yamada
4179dd88ab32SMasahiro Yamada			if ($ms_size =~ /^(0x|)0$/i) {
4180dd88ab32SMasahiro Yamada				ERROR("MEMSET",
4181dd88ab32SMasahiro Yamada				      "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
4182dd88ab32SMasahiro Yamada			} elsif ($ms_size =~ /^(0x|)1$/i) {
4183dd88ab32SMasahiro Yamada				WARN("MEMSET",
4184dd88ab32SMasahiro Yamada				     "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
4185dd88ab32SMasahiro Yamada			}
4186dd88ab32SMasahiro Yamada		}
4187dd88ab32SMasahiro Yamada
41886b9709d9STom Rini# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
41896b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
41906b9709d9STom Rini		    $line =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/s) {
41916b9709d9STom Rini			if (WARN("PREFER_ETHER_ADDR_COPY",
41926b9709d9STom Rini				 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . $herecurr) &&
41936b9709d9STom Rini			    $fix) {
41946b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
41956b9709d9STom Rini			}
41966b9709d9STom Rini		}
41976b9709d9STom Rini
4198dd88ab32SMasahiro Yamada# typecasts on min/max could be min_t/max_t
4199dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
4200dd88ab32SMasahiro Yamada		    defined $stat &&
4201dd88ab32SMasahiro Yamada		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
4202dd88ab32SMasahiro Yamada			if (defined $2 || defined $7) {
4203dd88ab32SMasahiro Yamada				my $call = $1;
4204dd88ab32SMasahiro Yamada				my $cast1 = deparenthesize($2);
4205dd88ab32SMasahiro Yamada				my $arg1 = $3;
4206dd88ab32SMasahiro Yamada				my $cast2 = deparenthesize($7);
4207dd88ab32SMasahiro Yamada				my $arg2 = $8;
4208dd88ab32SMasahiro Yamada				my $cast;
4209dd88ab32SMasahiro Yamada
4210dd88ab32SMasahiro Yamada				if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
4211dd88ab32SMasahiro Yamada					$cast = "$cast1 or $cast2";
4212dd88ab32SMasahiro Yamada				} elsif ($cast1 ne "") {
4213dd88ab32SMasahiro Yamada					$cast = $cast1;
4214dd88ab32SMasahiro Yamada				} else {
4215dd88ab32SMasahiro Yamada					$cast = $cast2;
4216dd88ab32SMasahiro Yamada				}
4217dd88ab32SMasahiro Yamada				WARN("MINMAX",
4218dd88ab32SMasahiro Yamada				     "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
4219dd88ab32SMasahiro Yamada			}
4220dd88ab32SMasahiro Yamada		}
4221dd88ab32SMasahiro Yamada
4222dd88ab32SMasahiro Yamada# check usleep_range arguments
4223dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
4224dd88ab32SMasahiro Yamada		    defined $stat &&
4225dd88ab32SMasahiro Yamada		    $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
4226dd88ab32SMasahiro Yamada			my $min = $1;
4227dd88ab32SMasahiro Yamada			my $max = $7;
4228dd88ab32SMasahiro Yamada			if ($min eq $max) {
4229dd88ab32SMasahiro Yamada				WARN("USLEEP_RANGE",
4230dd88ab32SMasahiro Yamada				     "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4231dd88ab32SMasahiro Yamada			} elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
4232dd88ab32SMasahiro Yamada				 $min > $max) {
4233dd88ab32SMasahiro Yamada				WARN("USLEEP_RANGE",
4234dd88ab32SMasahiro Yamada				     "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4235dd88ab32SMasahiro Yamada			}
4236dd88ab32SMasahiro Yamada		}
4237dd88ab32SMasahiro Yamada
42386b9709d9STom Rini# check for naked sscanf
42396b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
42406b9709d9STom Rini		    defined $stat &&
42416b9709d9STom Rini		    $stat =~ /\bsscanf\b/ &&
42426b9709d9STom Rini		    ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
42436b9709d9STom Rini		     $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
42446b9709d9STom Rini		     $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
42456b9709d9STom Rini			my $lc = $stat =~ tr@\n@@;
42466b9709d9STom Rini			$lc = $lc + $linenr;
42476b9709d9STom Rini			my $stat_real = raw_line($linenr, 0);
42486b9709d9STom Rini		        for (my $count = $linenr + 1; $count <= $lc; $count++) {
42496b9709d9STom Rini				$stat_real = $stat_real . "\n" . raw_line($count, 0);
42506b9709d9STom Rini			}
42516b9709d9STom Rini			WARN("NAKED_SSCANF",
42526b9709d9STom Rini			     "unchecked sscanf return value\n" . "$here\n$stat_real\n");
42536b9709d9STom Rini		}
42546b9709d9STom Rini
42556b9709d9STom Rini# check for new externs in .h files.
42566b9709d9STom Rini		if ($realfile =~ /\.h$/ &&
42576b9709d9STom Rini		    $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
42586b9709d9STom Rini			if (CHK("AVOID_EXTERNS",
42596b9709d9STom Rini				"extern prototypes should be avoided in .h files\n" . $herecurr) &&
42606b9709d9STom Rini			    $fix) {
42616b9709d9STom Rini				$fixed[$linenr - 1] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
42626b9709d9STom Rini			}
42636b9709d9STom Rini		}
42646b9709d9STom Rini
4265dd88ab32SMasahiro Yamada# check for new externs in .c files.
4266dd88ab32SMasahiro Yamada		if ($realfile =~ /\.c$/ && defined $stat &&
4267dd88ab32SMasahiro Yamada		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
4268dd88ab32SMasahiro Yamada		{
4269dd88ab32SMasahiro Yamada			my $function_name = $1;
4270dd88ab32SMasahiro Yamada			my $paren_space = $2;
4271dd88ab32SMasahiro Yamada
4272dd88ab32SMasahiro Yamada			my $s = $stat;
4273dd88ab32SMasahiro Yamada			if (defined $cond) {
4274dd88ab32SMasahiro Yamada				substr($s, 0, length($cond), '');
4275dd88ab32SMasahiro Yamada			}
4276dd88ab32SMasahiro Yamada			if ($s =~ /^\s*;/ &&
4277dd88ab32SMasahiro Yamada			    $function_name ne 'uninitialized_var')
4278dd88ab32SMasahiro Yamada			{
4279dd88ab32SMasahiro Yamada				WARN("AVOID_EXTERNS",
4280dd88ab32SMasahiro Yamada				     "externs should be avoided in .c files\n" .  $herecurr);
4281dd88ab32SMasahiro Yamada			}
4282dd88ab32SMasahiro Yamada
4283dd88ab32SMasahiro Yamada			if ($paren_space =~ /\n/) {
4284dd88ab32SMasahiro Yamada				WARN("FUNCTION_ARGUMENTS",
4285dd88ab32SMasahiro Yamada				     "arguments for function declarations should follow identifier\n" . $herecurr);
4286dd88ab32SMasahiro Yamada			}
4287dd88ab32SMasahiro Yamada
4288dd88ab32SMasahiro Yamada		} elsif ($realfile =~ /\.c$/ && defined $stat &&
4289dd88ab32SMasahiro Yamada		    $stat =~ /^.\s*extern\s+/)
4290dd88ab32SMasahiro Yamada		{
4291dd88ab32SMasahiro Yamada			WARN("AVOID_EXTERNS",
4292dd88ab32SMasahiro Yamada			     "externs should be avoided in .c files\n" .  $herecurr);
4293dd88ab32SMasahiro Yamada		}
4294dd88ab32SMasahiro Yamada
4295dd88ab32SMasahiro Yamada# checks for new __setup's
4296dd88ab32SMasahiro Yamada		if ($rawline =~ /\b__setup\("([^"]*)"/) {
4297dd88ab32SMasahiro Yamada			my $name = $1;
4298dd88ab32SMasahiro Yamada
4299dd88ab32SMasahiro Yamada			if (!grep(/$name/, @setup_docs)) {
4300dd88ab32SMasahiro Yamada				CHK("UNDOCUMENTED_SETUP",
4301dd88ab32SMasahiro Yamada				    "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
4302dd88ab32SMasahiro Yamada			}
4303dd88ab32SMasahiro Yamada		}
4304dd88ab32SMasahiro Yamada
4305dd88ab32SMasahiro Yamada# check for pointless casting of kmalloc return
4306dd88ab32SMasahiro Yamada		if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
4307dd88ab32SMasahiro Yamada			WARN("UNNECESSARY_CASTS",
4308dd88ab32SMasahiro Yamada			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
4309dd88ab32SMasahiro Yamada		}
4310dd88ab32SMasahiro Yamada
43116b9709d9STom Rini# alloc style
43126b9709d9STom Rini# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
43136b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
43146b9709d9STom Rini		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
43156b9709d9STom Rini			CHK("ALLOC_SIZEOF_STRUCT",
43166b9709d9STom Rini			    "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
43176b9709d9STom Rini		}
43186b9709d9STom Rini
43196b9709d9STom Rini# check for krealloc arg reuse
43206b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
43216b9709d9STom Rini		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
43226b9709d9STom Rini			WARN("KREALLOC_ARG_REUSE",
43236b9709d9STom Rini			     "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
43246b9709d9STom Rini		}
43256b9709d9STom Rini
4326dd88ab32SMasahiro Yamada# check for alloc argument mismatch
4327dd88ab32SMasahiro Yamada		if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
4328dd88ab32SMasahiro Yamada			WARN("ALLOC_ARRAY_ARGS",
4329dd88ab32SMasahiro Yamada			     "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
4330dd88ab32SMasahiro Yamada		}
4331dd88ab32SMasahiro Yamada
43326b9709d9STom Rini# check for GFP_NOWAIT use
43336b9709d9STom Rini		if ($line =~ /\b__GFP_NOFAIL\b/) {
43346b9709d9STom Rini			WARN("__GFP_NOFAIL",
43356b9709d9STom Rini			     "Use of __GFP_NOFAIL is deprecated, no new users should be added\n" . $herecurr);
43366b9709d9STom Rini		}
43376b9709d9STom Rini
4338dd88ab32SMasahiro Yamada# check for multiple semicolons
4339dd88ab32SMasahiro Yamada		if ($line =~ /;\s*;\s*$/) {
43406b9709d9STom Rini			if (WARN("ONE_SEMICOLON",
43416b9709d9STom Rini				 "Statements terminations use 1 semicolon\n" . $herecurr) &&
43426b9709d9STom Rini			    $fix) {
43436b9709d9STom Rini				$fixed[$linenr - 1] =~ s/(\s*;\s*){2,}$/;/g;
43446b9709d9STom Rini			}
43456b9709d9STom Rini		}
43466b9709d9STom Rini
4347fc0b5948SRobert P. J. Day# check for case / default statements not preceded by break/fallthrough/switch
43486b9709d9STom Rini		if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
43496b9709d9STom Rini			my $has_break = 0;
43506b9709d9STom Rini			my $has_statement = 0;
43516b9709d9STom Rini			my $count = 0;
43526b9709d9STom Rini			my $prevline = $linenr;
43536b9709d9STom Rini			while ($prevline > 1 && $count < 3 && !$has_break) {
43546b9709d9STom Rini				$prevline--;
43556b9709d9STom Rini				my $rline = $rawlines[$prevline - 1];
43566b9709d9STom Rini				my $fline = $lines[$prevline - 1];
43576b9709d9STom Rini				last if ($fline =~ /^\@\@/);
43586b9709d9STom Rini				next if ($fline =~ /^\-/);
43596b9709d9STom Rini				next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
43606b9709d9STom Rini				$has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
43616b9709d9STom Rini				next if ($fline =~ /^.[\s$;]*$/);
43626b9709d9STom Rini				$has_statement = 1;
43636b9709d9STom Rini				$count++;
43646b9709d9STom Rini				$has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/);
43656b9709d9STom Rini			}
43666b9709d9STom Rini			if (!$has_break && $has_statement) {
43676b9709d9STom Rini				WARN("MISSING_BREAK",
4368fc0b5948SRobert P. J. Day				     "Possible switch case/default not preceded by break or fallthrough comment\n" . $herecurr);
43696b9709d9STom Rini			}
4370dd88ab32SMasahiro Yamada		}
4371dd88ab32SMasahiro Yamada
4372dd88ab32SMasahiro Yamada# check for switch/default statements without a break;
4373dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
4374dd88ab32SMasahiro Yamada		    defined $stat &&
4375dd88ab32SMasahiro Yamada		    $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
4376dd88ab32SMasahiro Yamada			my $ctx = '';
4377dd88ab32SMasahiro Yamada			my $herectx = $here . "\n";
4378dd88ab32SMasahiro Yamada			my $cnt = statement_rawlines($stat);
4379dd88ab32SMasahiro Yamada			for (my $n = 0; $n < $cnt; $n++) {
4380dd88ab32SMasahiro Yamada				$herectx .= raw_line($linenr, $n) . "\n";
4381dd88ab32SMasahiro Yamada			}
4382dd88ab32SMasahiro Yamada			WARN("DEFAULT_NO_BREAK",
4383dd88ab32SMasahiro Yamada			     "switch default: should use break\n" . $herectx);
4384dd88ab32SMasahiro Yamada		}
4385dd88ab32SMasahiro Yamada
4386dd88ab32SMasahiro Yamada# check for gcc specific __FUNCTION__
43876b9709d9STom Rini		if ($line =~ /\b__FUNCTION__\b/) {
43886b9709d9STom Rini			if (WARN("USE_FUNC",
43896b9709d9STom Rini				 "__func__ should be used instead of gcc specific __FUNCTION__\n"  . $herecurr) &&
43906b9709d9STom Rini			    $fix) {
43916b9709d9STom Rini				$fixed[$linenr - 1] =~ s/\b__FUNCTION__\b/__func__/g;
43926b9709d9STom Rini			}
4393dd88ab32SMasahiro Yamada		}
4394dd88ab32SMasahiro Yamada
4395dd88ab32SMasahiro Yamada# check for use of yield()
4396dd88ab32SMasahiro Yamada		if ($line =~ /\byield\s*\(\s*\)/) {
4397dd88ab32SMasahiro Yamada			WARN("YIELD",
4398dd88ab32SMasahiro Yamada			     "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n"  . $herecurr);
4399dd88ab32SMasahiro Yamada		}
4400dd88ab32SMasahiro Yamada
44016b9709d9STom Rini# check for comparisons against true and false
44026b9709d9STom Rini		if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
44036b9709d9STom Rini			my $lead = $1;
44046b9709d9STom Rini			my $arg = $2;
44056b9709d9STom Rini			my $test = $3;
44066b9709d9STom Rini			my $otype = $4;
44076b9709d9STom Rini			my $trail = $5;
44086b9709d9STom Rini			my $op = "!";
44096b9709d9STom Rini
44106b9709d9STom Rini			($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
44116b9709d9STom Rini
44126b9709d9STom Rini			my $type = lc($otype);
44136b9709d9STom Rini			if ($type =~ /^(?:true|false)$/) {
44146b9709d9STom Rini				if (("$test" eq "==" && "$type" eq "true") ||
44156b9709d9STom Rini				    ("$test" eq "!=" && "$type" eq "false")) {
44166b9709d9STom Rini					$op = "";
44176b9709d9STom Rini				}
44186b9709d9STom Rini
44196b9709d9STom Rini				CHK("BOOL_COMPARISON",
44206b9709d9STom Rini				    "Using comparison to $otype is error prone\n" . $herecurr);
44216b9709d9STom Rini
44226b9709d9STom Rini## maybe suggesting a correct construct would better
44236b9709d9STom Rini##				    "Using comparison to $otype is error prone.  Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
44246b9709d9STom Rini
44256b9709d9STom Rini			}
44266b9709d9STom Rini		}
44276b9709d9STom Rini
4428dd88ab32SMasahiro Yamada# check for semaphores initialized locked
4429dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
4430dd88ab32SMasahiro Yamada			WARN("CONSIDER_COMPLETION",
4431dd88ab32SMasahiro Yamada			     "consider using a completion\n" . $herecurr);
4432dd88ab32SMasahiro Yamada		}
4433dd88ab32SMasahiro Yamada
4434dd88ab32SMasahiro Yamada# recommend kstrto* over simple_strto* and strict_strto*
4435dd88ab32SMasahiro Yamada		if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
4436dd88ab32SMasahiro Yamada			WARN("CONSIDER_KSTRTO",
4437dd88ab32SMasahiro Yamada			     "$1 is obsolete, use k$3 instead\n" . $herecurr);
4438dd88ab32SMasahiro Yamada		}
4439dd88ab32SMasahiro Yamada
4440dd88ab32SMasahiro Yamada# check for __initcall(), use device_initcall() explicitly please
4441dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*__initcall\s*\(/) {
4442dd88ab32SMasahiro Yamada			WARN("USE_DEVICE_INITCALL",
4443dd88ab32SMasahiro Yamada			     "please use device_initcall() instead of __initcall()\n" . $herecurr);
4444dd88ab32SMasahiro Yamada		}
4445dd88ab32SMasahiro Yamada
4446dd88ab32SMasahiro Yamada# check for various ops structs, ensure they are const.
4447dd88ab32SMasahiro Yamada		my $struct_ops = qr{acpi_dock_ops|
4448dd88ab32SMasahiro Yamada				address_space_operations|
4449dd88ab32SMasahiro Yamada				backlight_ops|
4450dd88ab32SMasahiro Yamada				block_device_operations|
4451dd88ab32SMasahiro Yamada				dentry_operations|
4452dd88ab32SMasahiro Yamada				dev_pm_ops|
4453dd88ab32SMasahiro Yamada				dma_map_ops|
4454dd88ab32SMasahiro Yamada				extent_io_ops|
4455dd88ab32SMasahiro Yamada				file_lock_operations|
4456dd88ab32SMasahiro Yamada				file_operations|
4457dd88ab32SMasahiro Yamada				hv_ops|
4458dd88ab32SMasahiro Yamada				ide_dma_ops|
4459dd88ab32SMasahiro Yamada				intel_dvo_dev_ops|
4460dd88ab32SMasahiro Yamada				item_operations|
4461dd88ab32SMasahiro Yamada				iwl_ops|
4462dd88ab32SMasahiro Yamada				kgdb_arch|
4463dd88ab32SMasahiro Yamada				kgdb_io|
4464dd88ab32SMasahiro Yamada				kset_uevent_ops|
4465dd88ab32SMasahiro Yamada				lock_manager_operations|
4466dd88ab32SMasahiro Yamada				microcode_ops|
4467dd88ab32SMasahiro Yamada				mtrr_ops|
4468dd88ab32SMasahiro Yamada				neigh_ops|
4469dd88ab32SMasahiro Yamada				nlmsvc_binding|
4470dd88ab32SMasahiro Yamada				pci_raw_ops|
4471dd88ab32SMasahiro Yamada				pipe_buf_operations|
4472dd88ab32SMasahiro Yamada				platform_hibernation_ops|
4473dd88ab32SMasahiro Yamada				platform_suspend_ops|
4474dd88ab32SMasahiro Yamada				proto_ops|
4475dd88ab32SMasahiro Yamada				rpc_pipe_ops|
4476dd88ab32SMasahiro Yamada				seq_operations|
4477dd88ab32SMasahiro Yamada				snd_ac97_build_ops|
4478dd88ab32SMasahiro Yamada				soc_pcmcia_socket_ops|
4479dd88ab32SMasahiro Yamada				stacktrace_ops|
4480dd88ab32SMasahiro Yamada				sysfs_ops|
4481dd88ab32SMasahiro Yamada				tty_operations|
4482dd88ab32SMasahiro Yamada				usb_mon_operations|
4483dd88ab32SMasahiro Yamada				wd_ops}x;
4484dd88ab32SMasahiro Yamada		if ($line !~ /\bconst\b/ &&
4485dd88ab32SMasahiro Yamada		    $line =~ /\bstruct\s+($struct_ops)\b/) {
4486dd88ab32SMasahiro Yamada			WARN("CONST_STRUCT",
4487dd88ab32SMasahiro Yamada			     "struct $1 should normally be const\n" .
4488dd88ab32SMasahiro Yamada				$herecurr);
4489dd88ab32SMasahiro Yamada		}
4490dd88ab32SMasahiro Yamada
4491dd88ab32SMasahiro Yamada# use of NR_CPUS is usually wrong
4492dd88ab32SMasahiro Yamada# ignore definitions of NR_CPUS and usage to define arrays as likely right
4493dd88ab32SMasahiro Yamada		if ($line =~ /\bNR_CPUS\b/ &&
4494dd88ab32SMasahiro Yamada		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
4495dd88ab32SMasahiro Yamada		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
4496dd88ab32SMasahiro Yamada		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
4497dd88ab32SMasahiro Yamada		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
4498dd88ab32SMasahiro Yamada		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
4499dd88ab32SMasahiro Yamada		{
4500dd88ab32SMasahiro Yamada			WARN("NR_CPUS",
4501dd88ab32SMasahiro Yamada			     "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
4502dd88ab32SMasahiro Yamada		}
4503dd88ab32SMasahiro Yamada
45046b9709d9STom Rini# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
45056b9709d9STom Rini		if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
45066b9709d9STom Rini			ERROR("DEFINE_ARCH_HAS",
45076b9709d9STom Rini			      "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
45086b9709d9STom Rini		}
45096b9709d9STom Rini
4510dd88ab32SMasahiro Yamada# check for %L{u,d,i} in strings
4511dd88ab32SMasahiro Yamada		my $string;
4512dd88ab32SMasahiro Yamada		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
4513dd88ab32SMasahiro Yamada			$string = substr($rawline, $-[1], $+[1] - $-[1]);
4514dd88ab32SMasahiro Yamada			$string =~ s/%%/__/g;
4515dd88ab32SMasahiro Yamada			if ($string =~ /(?<!%)%L[udi]/) {
4516dd88ab32SMasahiro Yamada				WARN("PRINTF_L",
4517dd88ab32SMasahiro Yamada				     "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
4518dd88ab32SMasahiro Yamada				last;
4519dd88ab32SMasahiro Yamada			}
4520dd88ab32SMasahiro Yamada		}
4521dd88ab32SMasahiro Yamada
4522dd88ab32SMasahiro Yamada# whine mightly about in_atomic
4523dd88ab32SMasahiro Yamada		if ($line =~ /\bin_atomic\s*\(/) {
4524dd88ab32SMasahiro Yamada			if ($realfile =~ m@^drivers/@) {
4525dd88ab32SMasahiro Yamada				ERROR("IN_ATOMIC",
4526dd88ab32SMasahiro Yamada				      "do not use in_atomic in drivers\n" . $herecurr);
4527dd88ab32SMasahiro Yamada			} elsif ($realfile !~ m@^kernel/@) {
4528dd88ab32SMasahiro Yamada				WARN("IN_ATOMIC",
4529dd88ab32SMasahiro Yamada				     "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
4530dd88ab32SMasahiro Yamada			}
4531dd88ab32SMasahiro Yamada		}
4532dd88ab32SMasahiro Yamada
4533dd88ab32SMasahiro Yamada# check for lockdep_set_novalidate_class
4534dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
4535dd88ab32SMasahiro Yamada		    $line =~ /__lockdep_no_validate__\s*\)/ ) {
4536dd88ab32SMasahiro Yamada			if ($realfile !~ m@^kernel/lockdep@ &&
4537dd88ab32SMasahiro Yamada			    $realfile !~ m@^include/linux/lockdep@ &&
4538dd88ab32SMasahiro Yamada			    $realfile !~ m@^drivers/base/core@) {
4539dd88ab32SMasahiro Yamada				ERROR("LOCKDEP",
4540dd88ab32SMasahiro Yamada				      "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
4541dd88ab32SMasahiro Yamada			}
4542dd88ab32SMasahiro Yamada		}
4543dd88ab32SMasahiro Yamada
4544dd88ab32SMasahiro Yamada		if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
4545dd88ab32SMasahiro Yamada		    $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
4546dd88ab32SMasahiro Yamada			WARN("EXPORTED_WORLD_WRITABLE",
4547dd88ab32SMasahiro Yamada			     "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
4548dd88ab32SMasahiro Yamada		}
4549dd88ab32SMasahiro Yamada	}
4550dd88ab32SMasahiro Yamada
4551dd88ab32SMasahiro Yamada	# If we have no input at all, then there is nothing to report on
4552dd88ab32SMasahiro Yamada	# so just keep quiet.
4553dd88ab32SMasahiro Yamada	if ($#rawlines == -1) {
4554dd88ab32SMasahiro Yamada		exit(0);
4555dd88ab32SMasahiro Yamada	}
4556dd88ab32SMasahiro Yamada
4557dd88ab32SMasahiro Yamada	# In mailback mode only produce a report in the negative, for
4558dd88ab32SMasahiro Yamada	# things that appear to be patches.
4559dd88ab32SMasahiro Yamada	if ($mailback && ($clean == 1 || !$is_patch)) {
4560dd88ab32SMasahiro Yamada		exit(0);
4561dd88ab32SMasahiro Yamada	}
4562dd88ab32SMasahiro Yamada
4563dd88ab32SMasahiro Yamada	# This is not a patch, and we are are in 'no-patch' mode so
4564dd88ab32SMasahiro Yamada	# just keep quiet.
4565dd88ab32SMasahiro Yamada	if (!$chk_patch && !$is_patch) {
4566dd88ab32SMasahiro Yamada		exit(0);
4567dd88ab32SMasahiro Yamada	}
4568dd88ab32SMasahiro Yamada
4569dd88ab32SMasahiro Yamada	if (!$is_patch) {
4570dd88ab32SMasahiro Yamada		ERROR("NOT_UNIFIED_DIFF",
4571dd88ab32SMasahiro Yamada		      "Does not appear to be a unified-diff format patch\n");
4572dd88ab32SMasahiro Yamada	}
4573dd88ab32SMasahiro Yamada	if ($is_patch && $chk_signoff && $signoff == 0) {
4574dd88ab32SMasahiro Yamada		ERROR("MISSING_SIGN_OFF",
4575dd88ab32SMasahiro Yamada		      "Missing Signed-off-by: line(s)\n");
4576dd88ab32SMasahiro Yamada	}
4577dd88ab32SMasahiro Yamada
4578dd88ab32SMasahiro Yamada	print report_dump();
4579dd88ab32SMasahiro Yamada	if ($summary && !($clean == 1 && $quiet == 1)) {
4580dd88ab32SMasahiro Yamada		print "$filename " if ($summary_file);
4581dd88ab32SMasahiro Yamada		print "total: $cnt_error errors, $cnt_warn warnings, " .
4582dd88ab32SMasahiro Yamada			(($check)? "$cnt_chk checks, " : "") .
4583dd88ab32SMasahiro Yamada			"$cnt_lines lines checked\n";
4584dd88ab32SMasahiro Yamada		print "\n" if ($quiet == 0);
4585dd88ab32SMasahiro Yamada	}
4586dd88ab32SMasahiro Yamada
4587dd88ab32SMasahiro Yamada	if ($quiet == 0) {
4588dd88ab32SMasahiro Yamada
4589dd88ab32SMasahiro Yamada		if ($^V lt 5.10.0) {
4590dd88ab32SMasahiro Yamada			print("NOTE: perl $^V is not modern enough to detect all possible issues.\n");
4591dd88ab32SMasahiro Yamada			print("An upgrade to at least perl v5.10.0 is suggested.\n\n");
4592dd88ab32SMasahiro Yamada		}
4593dd88ab32SMasahiro Yamada
4594dd88ab32SMasahiro Yamada		# If there were whitespace errors which cleanpatch can fix
4595dd88ab32SMasahiro Yamada		# then suggest that.
4596dd88ab32SMasahiro Yamada		if ($rpt_cleaners) {
4597dd88ab32SMasahiro Yamada			print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n";
4598dd88ab32SMasahiro Yamada			print "      scripts/cleanfile\n\n";
4599dd88ab32SMasahiro Yamada			$rpt_cleaners = 0;
4600dd88ab32SMasahiro Yamada		}
4601dd88ab32SMasahiro Yamada	}
4602dd88ab32SMasahiro Yamada
46036b9709d9STom Rini	hash_show_words(\%use_type, "Used");
46046b9709d9STom Rini	hash_show_words(\%ignore_type, "Ignored");
46056b9709d9STom Rini
46066b9709d9STom Rini	if ($clean == 0 && $fix && "@rawlines" ne "@fixed") {
46076b9709d9STom Rini		my $newfile = $filename;
46086b9709d9STom Rini		$newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
46096b9709d9STom Rini		my $linecount = 0;
46106b9709d9STom Rini		my $f;
46116b9709d9STom Rini
46126b9709d9STom Rini		open($f, '>', $newfile)
46136b9709d9STom Rini		    or die "$P: Can't open $newfile for write\n";
46146b9709d9STom Rini		foreach my $fixed_line (@fixed) {
46156b9709d9STom Rini			$linecount++;
46166b9709d9STom Rini			if ($file) {
46176b9709d9STom Rini				if ($linecount > 3) {
46186b9709d9STom Rini					$fixed_line =~ s/^\+//;
46196b9709d9STom Rini					print $f $fixed_line. "\n";
4620dd88ab32SMasahiro Yamada				}
46216b9709d9STom Rini			} else {
46226b9709d9STom Rini				print $f $fixed_line . "\n";
46236b9709d9STom Rini			}
46246b9709d9STom Rini		}
46256b9709d9STom Rini		close($f);
46266b9709d9STom Rini
46276b9709d9STom Rini		if (!$quiet) {
46286b9709d9STom Rini			print << "EOM";
46296b9709d9STom RiniWrote EXPERIMENTAL --fix correction(s) to '$newfile'
46306b9709d9STom Rini
46316b9709d9STom RiniDo _NOT_ trust the results written to this file.
46326b9709d9STom RiniDo _NOT_ submit these changes without inspecting them for correctness.
46336b9709d9STom Rini
46346b9709d9STom RiniThis EXPERIMENTAL file is simply a convenience to help rewrite patches.
46356b9709d9STom RiniNo warranties, expressed or implied...
46366b9709d9STom Rini
46376b9709d9STom RiniEOM
46386b9709d9STom Rini		}
4639dd88ab32SMasahiro Yamada	}
4640dd88ab32SMasahiro Yamada
4641dd88ab32SMasahiro Yamada	if ($clean == 1 && $quiet == 0) {
4642dd88ab32SMasahiro Yamada		print "$vname has no obvious style problems and is ready for submission.\n"
4643dd88ab32SMasahiro Yamada	}
4644dd88ab32SMasahiro Yamada	if ($clean == 0 && $quiet == 0) {
4645dd88ab32SMasahiro Yamada		print << "EOM";
4646dd88ab32SMasahiro Yamada$vname has style problems, please review.
4647dd88ab32SMasahiro Yamada
4648dd88ab32SMasahiro YamadaIf any of these errors are false positives, please report
46496b9709d9STom Rinithem to the maintainer, see CHECKPATCH in MAINTAINERS.
4650dd88ab32SMasahiro YamadaEOM
4651dd88ab32SMasahiro Yamada	}
4652dd88ab32SMasahiro Yamada
4653dd88ab32SMasahiro Yamada	return $clean;
4654dd88ab32SMasahiro Yamada}
4655