xref: /openbmc/u-boot/scripts/checkpatch.pl (revision 5512f5cc)
16305db96SHeinrich Schuchardt#!/usr/bin/env perl
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;
96305db96SHeinrich Schuchardtuse warnings;
106b9709d9STom Riniuse POSIX;
11c10e0f5bSDan Murphyuse File::Basename;
12c10e0f5bSDan Murphyuse Cwd 'abs_path';
136305db96SHeinrich Schuchardtuse Term::ANSIColor qw(:constants);
14dd88ab32SMasahiro Yamada
15dd88ab32SMasahiro Yamadamy $P = $0;
16c10e0f5bSDan Murphymy $D = dirname(abs_path($P));
17dd88ab32SMasahiro Yamada
18dd88ab32SMasahiro Yamadamy $V = '0.32';
19dd88ab32SMasahiro Yamada
20dd88ab32SMasahiro Yamadause Getopt::Long qw(:config no_auto_abbrev);
21dd88ab32SMasahiro Yamada
22dd88ab32SMasahiro Yamadamy $quiet = 0;
23dd88ab32SMasahiro Yamadamy $tree = 1;
24dd88ab32SMasahiro Yamadamy $chk_signoff = 1;
25dd88ab32SMasahiro Yamadamy $chk_patch = 1;
26dd88ab32SMasahiro Yamadamy $tst_only;
27dd88ab32SMasahiro Yamadamy $emacs = 0;
28dd88ab32SMasahiro Yamadamy $terse = 0;
296305db96SHeinrich Schuchardtmy $showfile = 0;
30dd88ab32SMasahiro Yamadamy $file = 0;
316305db96SHeinrich Schuchardtmy $git = 0;
326305db96SHeinrich Schuchardtmy %git_commits = ();
33dd88ab32SMasahiro Yamadamy $check = 0;
346305db96SHeinrich Schuchardtmy $check_orig = 0;
35dd88ab32SMasahiro Yamadamy $summary = 1;
36dd88ab32SMasahiro Yamadamy $mailback = 0;
37dd88ab32SMasahiro Yamadamy $summary_file = 0;
38dd88ab32SMasahiro Yamadamy $show_types = 0;
396305db96SHeinrich Schuchardtmy $list_types = 0;
406b9709d9STom Rinimy $fix = 0;
416b9709d9STom Rinimy $fix_inplace = 0;
42dd88ab32SMasahiro Yamadamy $root;
43dd88ab32SMasahiro Yamadamy %debug;
446b9709d9STom Rinimy %camelcase = ();
456b9709d9STom Rinimy %use_type = ();
466b9709d9STom Rinimy @use = ();
47dd88ab32SMasahiro Yamadamy %ignore_type = ();
48dd88ab32SMasahiro Yamadamy @ignore = ();
49dd88ab32SMasahiro Yamadamy $help = 0;
50dd88ab32SMasahiro Yamadamy $configuration_file = ".checkpatch.conf";
51dd88ab32SMasahiro Yamadamy $max_line_length = 80;
526b9709d9STom Rinimy $ignore_perl_version = 0;
536b9709d9STom Rinimy $minimum_perl_version = 5.10.0;
546305db96SHeinrich Schuchardtmy $min_conf_desc_length = 4;
55c10e0f5bSDan Murphymy $spelling_file = "$D/spelling.txt";
56c10e0f5bSDan Murphymy $codespell = 0;
57c10e0f5bSDan Murphymy $codespellfile = "/usr/share/codespell/dictionary.txt";
586305db96SHeinrich Schuchardtmy $conststructsfile = "$D/const_structs.checkpatch";
596305db96SHeinrich Schuchardtmy $typedefsfile = "";
606305db96SHeinrich Schuchardtmy $color = "auto";
616305db96SHeinrich Schuchardtmy $allow_c99_comments = 1;
62dd88ab32SMasahiro Yamada
63dd88ab32SMasahiro Yamadasub help {
64dd88ab32SMasahiro Yamada	my ($exitcode) = @_;
65dd88ab32SMasahiro Yamada
66dd88ab32SMasahiro Yamada	print << "EOM";
67dd88ab32SMasahiro YamadaUsage: $P [OPTION]... [FILE]...
68dd88ab32SMasahiro YamadaVersion: $V
69dd88ab32SMasahiro Yamada
70dd88ab32SMasahiro YamadaOptions:
71dd88ab32SMasahiro Yamada  -q, --quiet                quiet
72dd88ab32SMasahiro Yamada  --no-tree                  run without a kernel tree
73dd88ab32SMasahiro Yamada  --no-signoff               do not check for 'Signed-off-by' line
74dd88ab32SMasahiro Yamada  --patch                    treat FILE as patchfile (default)
75dd88ab32SMasahiro Yamada  --emacs                    emacs compile window format
76dd88ab32SMasahiro Yamada  --terse                    one line per report
776305db96SHeinrich Schuchardt  --showfile                 emit diffed file position, not input file position
786305db96SHeinrich Schuchardt  -g, --git                  treat FILE as a single commit or git revision range
796305db96SHeinrich Schuchardt                             single git commit with:
806305db96SHeinrich Schuchardt                               <rev>
816305db96SHeinrich Schuchardt                               <rev>^
826305db96SHeinrich Schuchardt                               <rev>~n
836305db96SHeinrich Schuchardt                             multiple git commits with:
846305db96SHeinrich Schuchardt                               <rev1>..<rev2>
856305db96SHeinrich Schuchardt                               <rev1>...<rev2>
866305db96SHeinrich Schuchardt                               <rev>-<count>
876305db96SHeinrich Schuchardt                             git merges are ignored
88dd88ab32SMasahiro Yamada  -f, --file                 treat FILE as regular source file
89dd88ab32SMasahiro Yamada  --subjective, --strict     enable more subjective tests
906305db96SHeinrich Schuchardt  --list-types               list the possible message types
916b9709d9STom Rini  --types TYPE(,TYPE2...)    show only these comma separated message types
92dd88ab32SMasahiro Yamada  --ignore TYPE(,TYPE2...)   ignore various comma separated message types
936305db96SHeinrich Schuchardt  --show-types               show the specific message type in the output
94dd88ab32SMasahiro Yamada  --max-line-length=n        set the maximum line length, if exceeded, warn
956305db96SHeinrich Schuchardt  --min-conf-desc-length=n   set the min description length, if shorter, warn
96dd88ab32SMasahiro Yamada  --root=PATH                PATH to the kernel tree root
97dd88ab32SMasahiro Yamada  --no-summary               suppress the per-file summary
98dd88ab32SMasahiro Yamada  --mailback                 only produce a report in case of warnings/errors
99dd88ab32SMasahiro Yamada  --summary-file             include the filename in summary
100dd88ab32SMasahiro Yamada  --debug KEY=[0|1]          turn on/off debugging of KEY, where KEY is one of
101dd88ab32SMasahiro Yamada                             'values', 'possible', 'type', and 'attr' (default
102dd88ab32SMasahiro Yamada                             is all off)
103dd88ab32SMasahiro Yamada  --test-only=WORD           report only warnings/errors containing WORD
104dd88ab32SMasahiro Yamada                             literally
1056b9709d9STom Rini  --fix                      EXPERIMENTAL - may create horrible results
1066b9709d9STom Rini                             If correctable single-line errors exist, create
1076b9709d9STom Rini                             "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
1086b9709d9STom Rini                             with potential errors corrected to the preferred
1096b9709d9STom Rini                             checkpatch style
1106b9709d9STom Rini  --fix-inplace              EXPERIMENTAL - may create horrible results
1116b9709d9STom Rini                             Is the same as --fix, but overwrites the input
1126b9709d9STom Rini                             file.  It's your fault if there's no backup or git
1136b9709d9STom Rini  --ignore-perl-version      override checking of perl version.  expect
1146b9709d9STom Rini                             runtime errors.
115c10e0f5bSDan Murphy  --codespell                Use the codespell dictionary for spelling/typos
1166305db96SHeinrich Schuchardt                             (default:/usr/share/codespell/dictionary.txt)
117c10e0f5bSDan Murphy  --codespellfile            Use this codespell dictionary
1186305db96SHeinrich Schuchardt  --typedefsfile             Read additional types from this file
1196305db96SHeinrich Schuchardt  --color[=WHEN]             Use colors 'always', 'never', or only when output
1206305db96SHeinrich Schuchardt                             is a terminal ('auto'). Default is 'auto'.
121dd88ab32SMasahiro Yamada  -h, --help, --version      display this help and exit
122dd88ab32SMasahiro Yamada
123dd88ab32SMasahiro YamadaWhen FILE is - read standard input.
124dd88ab32SMasahiro YamadaEOM
125dd88ab32SMasahiro Yamada
126dd88ab32SMasahiro Yamada	exit($exitcode);
127dd88ab32SMasahiro Yamada}
128dd88ab32SMasahiro Yamada
1296305db96SHeinrich Schuchardtsub uniq {
1306305db96SHeinrich Schuchardt	my %seen;
1316305db96SHeinrich Schuchardt	return grep { !$seen{$_}++ } @_;
1326305db96SHeinrich Schuchardt}
1336305db96SHeinrich Schuchardt
1346305db96SHeinrich Schuchardtsub list_types {
1356305db96SHeinrich Schuchardt	my ($exitcode) = @_;
1366305db96SHeinrich Schuchardt
1376305db96SHeinrich Schuchardt	my $count = 0;
1386305db96SHeinrich Schuchardt
1396305db96SHeinrich Schuchardt	local $/ = undef;
1406305db96SHeinrich Schuchardt
1416305db96SHeinrich Schuchardt	open(my $script, '<', abs_path($P)) or
1426305db96SHeinrich Schuchardt	    die "$P: Can't read '$P' $!\n";
1436305db96SHeinrich Schuchardt
1446305db96SHeinrich Schuchardt	my $text = <$script>;
1456305db96SHeinrich Schuchardt	close($script);
1466305db96SHeinrich Schuchardt
1476305db96SHeinrich Schuchardt	my @types = ();
148*c398f2dfSHeinrich Schuchardt	# Also catch when type or level is passed through a variable
149*c398f2dfSHeinrich Schuchardt	for ($text =~ /(?:(?:\bCHK|\bWARN|\bERROR|&\{\$msg_level})\s*\(|\$msg_type\s*=)\s*"([^"]+)"/g) {
1506305db96SHeinrich Schuchardt		push (@types, $_);
1516305db96SHeinrich Schuchardt	}
1526305db96SHeinrich Schuchardt	@types = sort(uniq(@types));
1536305db96SHeinrich Schuchardt	print("#\tMessage type\n\n");
1546305db96SHeinrich Schuchardt	foreach my $type (@types) {
1556305db96SHeinrich Schuchardt		print(++$count . "\t" . $type . "\n");
1566305db96SHeinrich Schuchardt	}
1576305db96SHeinrich Schuchardt
1586305db96SHeinrich Schuchardt	exit($exitcode);
1596305db96SHeinrich Schuchardt}
1606305db96SHeinrich Schuchardt
161dd88ab32SMasahiro Yamadamy $conf = which_conf($configuration_file);
162dd88ab32SMasahiro Yamadaif (-f $conf) {
163dd88ab32SMasahiro Yamada	my @conf_args;
164dd88ab32SMasahiro Yamada	open(my $conffile, '<', "$conf")
165dd88ab32SMasahiro Yamada	    or warn "$P: Can't find a readable $configuration_file file $!\n";
166dd88ab32SMasahiro Yamada
167dd88ab32SMasahiro Yamada	while (<$conffile>) {
168dd88ab32SMasahiro Yamada		my $line = $_;
169dd88ab32SMasahiro Yamada
170dd88ab32SMasahiro Yamada		$line =~ s/\s*\n?$//g;
171dd88ab32SMasahiro Yamada		$line =~ s/^\s*//g;
172dd88ab32SMasahiro Yamada		$line =~ s/\s+/ /g;
173dd88ab32SMasahiro Yamada
174dd88ab32SMasahiro Yamada		next if ($line =~ m/^\s*#/);
175dd88ab32SMasahiro Yamada		next if ($line =~ m/^\s*$/);
176dd88ab32SMasahiro Yamada
177dd88ab32SMasahiro Yamada		my @words = split(" ", $line);
178dd88ab32SMasahiro Yamada		foreach my $word (@words) {
179dd88ab32SMasahiro Yamada			last if ($word =~ m/^#/);
180dd88ab32SMasahiro Yamada			push (@conf_args, $word);
181dd88ab32SMasahiro Yamada		}
182dd88ab32SMasahiro Yamada	}
183dd88ab32SMasahiro Yamada	close($conffile);
184dd88ab32SMasahiro Yamada	unshift(@ARGV, @conf_args) if @conf_args;
185dd88ab32SMasahiro Yamada}
186dd88ab32SMasahiro Yamada
1876305db96SHeinrich Schuchardt# Perl's Getopt::Long allows options to take optional arguments after a space.
1886305db96SHeinrich Schuchardt# Prevent --color by itself from consuming other arguments
1896305db96SHeinrich Schuchardtforeach (@ARGV) {
1906305db96SHeinrich Schuchardt	if ($_ eq "--color" || $_ eq "-color") {
1916305db96SHeinrich Schuchardt		$_ = "--color=$color";
1926305db96SHeinrich Schuchardt	}
1936305db96SHeinrich Schuchardt}
1946305db96SHeinrich Schuchardt
195dd88ab32SMasahiro YamadaGetOptions(
196dd88ab32SMasahiro Yamada	'q|quiet+'	=> \$quiet,
197dd88ab32SMasahiro Yamada	'tree!'		=> \$tree,
198dd88ab32SMasahiro Yamada	'signoff!'	=> \$chk_signoff,
199dd88ab32SMasahiro Yamada	'patch!'	=> \$chk_patch,
200dd88ab32SMasahiro Yamada	'emacs!'	=> \$emacs,
201dd88ab32SMasahiro Yamada	'terse!'	=> \$terse,
2026305db96SHeinrich Schuchardt	'showfile!'	=> \$showfile,
203dd88ab32SMasahiro Yamada	'f|file!'	=> \$file,
2046305db96SHeinrich Schuchardt	'g|git!'	=> \$git,
205dd88ab32SMasahiro Yamada	'subjective!'	=> \$check,
206dd88ab32SMasahiro Yamada	'strict!'	=> \$check,
207dd88ab32SMasahiro Yamada	'ignore=s'	=> \@ignore,
2086b9709d9STom Rini	'types=s'	=> \@use,
209dd88ab32SMasahiro Yamada	'show-types!'	=> \$show_types,
2106305db96SHeinrich Schuchardt	'list-types!'	=> \$list_types,
211dd88ab32SMasahiro Yamada	'max-line-length=i' => \$max_line_length,
2126305db96SHeinrich Schuchardt	'min-conf-desc-length=i' => \$min_conf_desc_length,
213dd88ab32SMasahiro Yamada	'root=s'	=> \$root,
214dd88ab32SMasahiro Yamada	'summary!'	=> \$summary,
215dd88ab32SMasahiro Yamada	'mailback!'	=> \$mailback,
216dd88ab32SMasahiro Yamada	'summary-file!'	=> \$summary_file,
2176b9709d9STom Rini	'fix!'		=> \$fix,
2186b9709d9STom Rini	'fix-inplace!'	=> \$fix_inplace,
2196b9709d9STom Rini	'ignore-perl-version!' => \$ignore_perl_version,
220dd88ab32SMasahiro Yamada	'debug=s'	=> \%debug,
221dd88ab32SMasahiro Yamada	'test-only=s'	=> \$tst_only,
222c10e0f5bSDan Murphy	'codespell!'	=> \$codespell,
223c10e0f5bSDan Murphy	'codespellfile=s'	=> \$codespellfile,
2246305db96SHeinrich Schuchardt	'typedefsfile=s'	=> \$typedefsfile,
2256305db96SHeinrich Schuchardt	'color=s'	=> \$color,
2266305db96SHeinrich Schuchardt	'no-color'	=> \$color,	#keep old behaviors of -nocolor
2276305db96SHeinrich Schuchardt	'nocolor'	=> \$color,	#keep old behaviors of -nocolor
228dd88ab32SMasahiro Yamada	'h|help'	=> \$help,
229dd88ab32SMasahiro Yamada	'version'	=> \$help
230dd88ab32SMasahiro Yamada) or help(1);
231dd88ab32SMasahiro Yamada
232dd88ab32SMasahiro Yamadahelp(0) if ($help);
233dd88ab32SMasahiro Yamada
2346305db96SHeinrich Schuchardtlist_types(0) if ($list_types);
2356305db96SHeinrich Schuchardt
2366b9709d9STom Rini$fix = 1 if ($fix_inplace);
2376305db96SHeinrich Schuchardt$check_orig = $check;
2386b9709d9STom Rini
239dd88ab32SMasahiro Yamadamy $exit = 0;
240dd88ab32SMasahiro Yamada
2416b9709d9STom Riniif ($^V && $^V lt $minimum_perl_version) {
2426b9709d9STom Rini	printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
2436b9709d9STom Rini	if (!$ignore_perl_version) {
2446b9709d9STom Rini		exit(1);
2456b9709d9STom Rini	}
2466b9709d9STom Rini}
2476b9709d9STom Rini
2486305db96SHeinrich Schuchardt#if no filenames are given, push '-' to read patch from stdin
249dd88ab32SMasahiro Yamadaif ($#ARGV < 0) {
2506305db96SHeinrich Schuchardt	push(@ARGV, '-');
2516305db96SHeinrich Schuchardt}
2526305db96SHeinrich Schuchardt
2536305db96SHeinrich Schuchardtif ($color =~ /^[01]$/) {
2546305db96SHeinrich Schuchardt	$color = !$color;
2556305db96SHeinrich Schuchardt} elsif ($color =~ /^always$/i) {
2566305db96SHeinrich Schuchardt	$color = 1;
2576305db96SHeinrich Schuchardt} elsif ($color =~ /^never$/i) {
2586305db96SHeinrich Schuchardt	$color = 0;
2596305db96SHeinrich Schuchardt} elsif ($color =~ /^auto$/i) {
2606305db96SHeinrich Schuchardt	$color = (-t STDOUT);
2616305db96SHeinrich Schuchardt} else {
2626305db96SHeinrich Schuchardt	die "Invalid color mode: $color\n";
263dd88ab32SMasahiro Yamada}
264dd88ab32SMasahiro Yamada
2656b9709d9STom Rinisub hash_save_array_words {
2666b9709d9STom Rini	my ($hashRef, $arrayRef) = @_;
2676b9709d9STom Rini
2686b9709d9STom Rini	my @array = split(/,/, join(',', @$arrayRef));
2696b9709d9STom Rini	foreach my $word (@array) {
270dd88ab32SMasahiro Yamada		$word =~ s/\s*\n?$//g;
271dd88ab32SMasahiro Yamada		$word =~ s/^\s*//g;
272dd88ab32SMasahiro Yamada		$word =~ s/\s+/ /g;
273dd88ab32SMasahiro Yamada		$word =~ tr/[a-z]/[A-Z]/;
274dd88ab32SMasahiro Yamada
275dd88ab32SMasahiro Yamada		next if ($word =~ m/^\s*#/);
276dd88ab32SMasahiro Yamada		next if ($word =~ m/^\s*$/);
277dd88ab32SMasahiro Yamada
2786b9709d9STom Rini		$hashRef->{$word}++;
279dd88ab32SMasahiro Yamada	}
2806b9709d9STom Rini}
2816b9709d9STom Rini
2826b9709d9STom Rinisub hash_show_words {
2836b9709d9STom Rini	my ($hashRef, $prefix) = @_;
2846b9709d9STom Rini
2856305db96SHeinrich Schuchardt	if (keys %$hashRef) {
2866305db96SHeinrich Schuchardt		print "\nNOTE: $prefix message types:";
2876b9709d9STom Rini		foreach my $word (sort keys %$hashRef) {
2886b9709d9STom Rini			print " $word";
2896b9709d9STom Rini		}
2906305db96SHeinrich Schuchardt		print "\n";
2916b9709d9STom Rini	}
2926b9709d9STom Rini}
2936b9709d9STom Rini
2946b9709d9STom Rinihash_save_array_words(\%ignore_type, \@ignore);
2956b9709d9STom Rinihash_save_array_words(\%use_type, \@use);
296dd88ab32SMasahiro Yamada
297dd88ab32SMasahiro Yamadamy $dbg_values = 0;
298dd88ab32SMasahiro Yamadamy $dbg_possible = 0;
299dd88ab32SMasahiro Yamadamy $dbg_type = 0;
300dd88ab32SMasahiro Yamadamy $dbg_attr = 0;
301dd88ab32SMasahiro Yamadafor my $key (keys %debug) {
302dd88ab32SMasahiro Yamada	## no critic
303dd88ab32SMasahiro Yamada	eval "\${dbg_$key} = '$debug{$key}';";
304dd88ab32SMasahiro Yamada	die "$@" if ($@);
305dd88ab32SMasahiro Yamada}
306dd88ab32SMasahiro Yamada
307dd88ab32SMasahiro Yamadamy $rpt_cleaners = 0;
308dd88ab32SMasahiro Yamada
309dd88ab32SMasahiro Yamadaif ($terse) {
310dd88ab32SMasahiro Yamada	$emacs = 1;
311dd88ab32SMasahiro Yamada	$quiet++;
312dd88ab32SMasahiro Yamada}
313dd88ab32SMasahiro Yamada
314dd88ab32SMasahiro Yamadaif ($tree) {
315dd88ab32SMasahiro Yamada	if (defined $root) {
316dd88ab32SMasahiro Yamada		if (!top_of_kernel_tree($root)) {
317dd88ab32SMasahiro Yamada			die "$P: $root: --root does not point at a valid tree\n";
318dd88ab32SMasahiro Yamada		}
319dd88ab32SMasahiro Yamada	} else {
320dd88ab32SMasahiro Yamada		if (top_of_kernel_tree('.')) {
321dd88ab32SMasahiro Yamada			$root = '.';
322dd88ab32SMasahiro Yamada		} elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
323dd88ab32SMasahiro Yamada						top_of_kernel_tree($1)) {
324dd88ab32SMasahiro Yamada			$root = $1;
325dd88ab32SMasahiro Yamada		}
326dd88ab32SMasahiro Yamada	}
327dd88ab32SMasahiro Yamada
328dd88ab32SMasahiro Yamada	if (!defined $root) {
329dd88ab32SMasahiro Yamada		print "Must be run from the top-level dir. of a kernel tree\n";
330dd88ab32SMasahiro Yamada		exit(2);
331dd88ab32SMasahiro Yamada	}
332dd88ab32SMasahiro Yamada}
333dd88ab32SMasahiro Yamada
334dd88ab32SMasahiro Yamadamy $emitted_corrupt = 0;
335dd88ab32SMasahiro Yamada
336dd88ab32SMasahiro Yamadaour $Ident	= qr{
337dd88ab32SMasahiro Yamada			[A-Za-z_][A-Za-z\d_]*
338dd88ab32SMasahiro Yamada			(?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
339dd88ab32SMasahiro Yamada		}x;
340dd88ab32SMasahiro Yamadaour $Storage	= qr{extern|static|asmlinkage};
341dd88ab32SMasahiro Yamadaour $Sparse	= qr{
342dd88ab32SMasahiro Yamada			__user|
343dd88ab32SMasahiro Yamada			__kernel|
344dd88ab32SMasahiro Yamada			__force|
345dd88ab32SMasahiro Yamada			__iomem|
346dd88ab32SMasahiro Yamada			__must_check|
347dd88ab32SMasahiro Yamada			__init_refok|
348dd88ab32SMasahiro Yamada			__kprobes|
349dd88ab32SMasahiro Yamada			__ref|
3506305db96SHeinrich Schuchardt			__rcu|
3516305db96SHeinrich Schuchardt			__private
352dd88ab32SMasahiro Yamada		}x;
3536b9709d9STom Riniour $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
3546b9709d9STom Riniour $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
3556b9709d9STom Riniour $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
3566b9709d9STom Riniour $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
3576b9709d9STom Riniour $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
358dd88ab32SMasahiro Yamada
359dd88ab32SMasahiro Yamada# Notes to $Attribute:
360dd88ab32SMasahiro Yamada# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
361dd88ab32SMasahiro Yamadaour $Attribute	= qr{
362dd88ab32SMasahiro Yamada			const|
363dd88ab32SMasahiro Yamada			__percpu|
364dd88ab32SMasahiro Yamada			__nocast|
365dd88ab32SMasahiro Yamada			__safe|
3666305db96SHeinrich Schuchardt			__bitwise|
367dd88ab32SMasahiro Yamada			__packed__|
368dd88ab32SMasahiro Yamada			__packed2__|
369dd88ab32SMasahiro Yamada			__naked|
370dd88ab32SMasahiro Yamada			__maybe_unused|
371dd88ab32SMasahiro Yamada			__always_unused|
372dd88ab32SMasahiro Yamada			__noreturn|
373dd88ab32SMasahiro Yamada			__used|
374dd88ab32SMasahiro Yamada			__cold|
3756305db96SHeinrich Schuchardt			__pure|
376dd88ab32SMasahiro Yamada			__noclone|
377dd88ab32SMasahiro Yamada			__deprecated|
378dd88ab32SMasahiro Yamada			__read_mostly|
379dd88ab32SMasahiro Yamada			__kprobes|
3806b9709d9STom Rini			$InitAttribute|
381dd88ab32SMasahiro Yamada			____cacheline_aligned|
382dd88ab32SMasahiro Yamada			____cacheline_aligned_in_smp|
383dd88ab32SMasahiro Yamada			____cacheline_internodealigned_in_smp|
384dd88ab32SMasahiro Yamada			__weak
385dd88ab32SMasahiro Yamada		  }x;
386dd88ab32SMasahiro Yamadaour $Modifier;
3876305db96SHeinrich Schuchardtour $Inline	= qr{inline|__always_inline|noinline|__inline|__inline__};
388dd88ab32SMasahiro Yamadaour $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
389dd88ab32SMasahiro Yamadaour $Lval	= qr{$Ident(?:$Member)*};
390dd88ab32SMasahiro Yamada
3916b9709d9STom Riniour $Int_type	= qr{(?i)llu|ull|ll|lu|ul|l|u};
3926b9709d9STom Riniour $Binary	= qr{(?i)0b[01]+$Int_type?};
3936b9709d9STom Riniour $Hex	= qr{(?i)0x[0-9a-f]+$Int_type?};
3946b9709d9STom Riniour $Int	= qr{[0-9]+$Int_type?};
3956305db96SHeinrich Schuchardtour $Octal	= qr{0[0-7]+$Int_type?};
396*c398f2dfSHeinrich Schuchardtour $String	= qr{"[X\t]*"};
397dd88ab32SMasahiro Yamadaour $Float_hex	= qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
398dd88ab32SMasahiro Yamadaour $Float_dec	= qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
399dd88ab32SMasahiro Yamadaour $Float_int	= qr{(?i)[0-9]+e-?[0-9]+[fl]?};
400dd88ab32SMasahiro Yamadaour $Float	= qr{$Float_hex|$Float_dec|$Float_int};
4016305db96SHeinrich Schuchardtour $Constant	= qr{$Float|$Binary|$Octal|$Hex|$Int};
402dd88ab32SMasahiro Yamadaour $Assignment	= qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
4036305db96SHeinrich Schuchardtour $Compare    = qr{<=|>=|==|!=|<|(?<!-)>};
4046b9709d9STom Riniour $Arithmetic = qr{\+|-|\*|\/|%};
405dd88ab32SMasahiro Yamadaour $Operators	= qr{
406dd88ab32SMasahiro Yamada			<=|>=|==|!=|
407dd88ab32SMasahiro Yamada			=>|->|<<|>>|<|>|!|~|
4086b9709d9STom Rini			&&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
409dd88ab32SMasahiro Yamada		  }x;
410dd88ab32SMasahiro Yamada
4116305db96SHeinrich Schuchardtour $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;
4126305db96SHeinrich Schuchardt
4136305db96SHeinrich Schuchardtour $BasicType;
414dd88ab32SMasahiro Yamadaour $NonptrType;
4156305db96SHeinrich Schuchardtour $NonptrTypeMisordered;
4166b9709d9STom Riniour $NonptrTypeWithAttr;
417dd88ab32SMasahiro Yamadaour $Type;
4186305db96SHeinrich Schuchardtour $TypeMisordered;
419dd88ab32SMasahiro Yamadaour $Declare;
4206305db96SHeinrich Schuchardtour $DeclareMisordered;
421dd88ab32SMasahiro Yamada
422dd88ab32SMasahiro Yamadaour $NON_ASCII_UTF8	= qr{
423dd88ab32SMasahiro Yamada	[\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
424dd88ab32SMasahiro Yamada	|  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
425dd88ab32SMasahiro Yamada	| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
426dd88ab32SMasahiro Yamada	|  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
427dd88ab32SMasahiro Yamada	|  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
428dd88ab32SMasahiro Yamada	| [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
429dd88ab32SMasahiro Yamada	|  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
430dd88ab32SMasahiro Yamada}x;
431dd88ab32SMasahiro Yamada
432dd88ab32SMasahiro Yamadaour $UTF8	= qr{
433dd88ab32SMasahiro Yamada	[\x09\x0A\x0D\x20-\x7E]              # ASCII
434dd88ab32SMasahiro Yamada	| $NON_ASCII_UTF8
435dd88ab32SMasahiro Yamada}x;
436dd88ab32SMasahiro Yamada
4376305db96SHeinrich Schuchardtour $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t};
4386305db96SHeinrich Schuchardtour $typeOtherOSTypedefs = qr{(?x:
4396305db96SHeinrich Schuchardt	u_(?:char|short|int|long) |          # bsd
4406305db96SHeinrich Schuchardt	u(?:nchar|short|int|long)            # sysv
4416305db96SHeinrich Schuchardt)};
4426305db96SHeinrich Schuchardtour $typeKernelTypedefs = qr{(?x:
443dd88ab32SMasahiro Yamada	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
444dd88ab32SMasahiro Yamada	atomic_t
445dd88ab32SMasahiro Yamada)};
4466305db96SHeinrich Schuchardtour $typeTypedefs = qr{(?x:
4476305db96SHeinrich Schuchardt	$typeC99Typedefs\b|
4486305db96SHeinrich Schuchardt	$typeOtherOSTypedefs\b|
4496305db96SHeinrich Schuchardt	$typeKernelTypedefs\b
4506305db96SHeinrich Schuchardt)};
4516305db96SHeinrich Schuchardt
4526305db96SHeinrich Schuchardtour $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b};
453dd88ab32SMasahiro Yamada
454dd88ab32SMasahiro Yamadaour $logFunctions = qr{(?x:
4556305db96SHeinrich Schuchardt	printk(?:_ratelimited|_once|_deferred_once|_deferred|)|
4566b9709d9STom Rini	(?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
457*c398f2dfSHeinrich Schuchardt	TP_printk|
458dd88ab32SMasahiro Yamada	WARN(?:_RATELIMIT|_ONCE|)|
459dd88ab32SMasahiro Yamada	panic|
4606b9709d9STom Rini	MODULE_[A-Z_]+|
4616b9709d9STom Rini	seq_vprintf|seq_printf|seq_puts
462dd88ab32SMasahiro Yamada)};
463dd88ab32SMasahiro Yamada
464dd88ab32SMasahiro Yamadaour $signature_tags = qr{(?xi:
465dd88ab32SMasahiro Yamada	Signed-off-by:|
466dd88ab32SMasahiro Yamada	Acked-by:|
467dd88ab32SMasahiro Yamada	Tested-by:|
468dd88ab32SMasahiro Yamada	Reviewed-by:|
469dd88ab32SMasahiro Yamada	Reported-by:|
4706b9709d9STom Rini	Suggested-by:|
471dd88ab32SMasahiro Yamada	To:|
472dd88ab32SMasahiro Yamada	Cc:
473dd88ab32SMasahiro Yamada)};
474dd88ab32SMasahiro Yamada
4756305db96SHeinrich Schuchardtour @typeListMisordered = (
4766305db96SHeinrich Schuchardt	qr{char\s+(?:un)?signed},
4776305db96SHeinrich Schuchardt	qr{int\s+(?:(?:un)?signed\s+)?short\s},
4786305db96SHeinrich Schuchardt	qr{int\s+short(?:\s+(?:un)?signed)},
4796305db96SHeinrich Schuchardt	qr{short\s+int(?:\s+(?:un)?signed)},
4806305db96SHeinrich Schuchardt	qr{(?:un)?signed\s+int\s+short},
4816305db96SHeinrich Schuchardt	qr{short\s+(?:un)?signed},
4826305db96SHeinrich Schuchardt	qr{long\s+int\s+(?:un)?signed},
4836305db96SHeinrich Schuchardt	qr{int\s+long\s+(?:un)?signed},
4846305db96SHeinrich Schuchardt	qr{long\s+(?:un)?signed\s+int},
4856305db96SHeinrich Schuchardt	qr{int\s+(?:un)?signed\s+long},
4866305db96SHeinrich Schuchardt	qr{int\s+(?:un)?signed},
4876305db96SHeinrich Schuchardt	qr{int\s+long\s+long\s+(?:un)?signed},
4886305db96SHeinrich Schuchardt	qr{long\s+long\s+int\s+(?:un)?signed},
4896305db96SHeinrich Schuchardt	qr{long\s+long\s+(?:un)?signed\s+int},
4906305db96SHeinrich Schuchardt	qr{long\s+long\s+(?:un)?signed},
4916305db96SHeinrich Schuchardt	qr{long\s+(?:un)?signed},
4926305db96SHeinrich Schuchardt);
4936305db96SHeinrich Schuchardt
494dd88ab32SMasahiro Yamadaour @typeList = (
495dd88ab32SMasahiro Yamada	qr{void},
4966305db96SHeinrich Schuchardt	qr{(?:(?:un)?signed\s+)?char},
4976305db96SHeinrich Schuchardt	qr{(?:(?:un)?signed\s+)?short\s+int},
4986305db96SHeinrich Schuchardt	qr{(?:(?:un)?signed\s+)?short},
4996305db96SHeinrich Schuchardt	qr{(?:(?:un)?signed\s+)?int},
5006305db96SHeinrich Schuchardt	qr{(?:(?:un)?signed\s+)?long\s+int},
5016305db96SHeinrich Schuchardt	qr{(?:(?:un)?signed\s+)?long\s+long\s+int},
5026305db96SHeinrich Schuchardt	qr{(?:(?:un)?signed\s+)?long\s+long},
5036305db96SHeinrich Schuchardt	qr{(?:(?:un)?signed\s+)?long},
5046305db96SHeinrich Schuchardt	qr{(?:un)?signed},
505dd88ab32SMasahiro Yamada	qr{float},
506dd88ab32SMasahiro Yamada	qr{double},
507dd88ab32SMasahiro Yamada	qr{bool},
508dd88ab32SMasahiro Yamada	qr{struct\s+$Ident},
509dd88ab32SMasahiro Yamada	qr{union\s+$Ident},
510dd88ab32SMasahiro Yamada	qr{enum\s+$Ident},
511dd88ab32SMasahiro Yamada	qr{${Ident}_t},
512dd88ab32SMasahiro Yamada	qr{${Ident}_handler},
513dd88ab32SMasahiro Yamada	qr{${Ident}_handler_fn},
5146305db96SHeinrich Schuchardt	@typeListMisordered,
515dd88ab32SMasahiro Yamada);
5166305db96SHeinrich Schuchardt
5176305db96SHeinrich Schuchardtour $C90_int_types = qr{(?x:
5186305db96SHeinrich Schuchardt	long\s+long\s+int\s+(?:un)?signed|
5196305db96SHeinrich Schuchardt	long\s+long\s+(?:un)?signed\s+int|
5206305db96SHeinrich Schuchardt	long\s+long\s+(?:un)?signed|
5216305db96SHeinrich Schuchardt	(?:(?:un)?signed\s+)?long\s+long\s+int|
5226305db96SHeinrich Schuchardt	(?:(?:un)?signed\s+)?long\s+long|
5236305db96SHeinrich Schuchardt	int\s+long\s+long\s+(?:un)?signed|
5246305db96SHeinrich Schuchardt	int\s+(?:(?:un)?signed\s+)?long\s+long|
5256305db96SHeinrich Schuchardt
5266305db96SHeinrich Schuchardt	long\s+int\s+(?:un)?signed|
5276305db96SHeinrich Schuchardt	long\s+(?:un)?signed\s+int|
5286305db96SHeinrich Schuchardt	long\s+(?:un)?signed|
5296305db96SHeinrich Schuchardt	(?:(?:un)?signed\s+)?long\s+int|
5306305db96SHeinrich Schuchardt	(?:(?:un)?signed\s+)?long|
5316305db96SHeinrich Schuchardt	int\s+long\s+(?:un)?signed|
5326305db96SHeinrich Schuchardt	int\s+(?:(?:un)?signed\s+)?long|
5336305db96SHeinrich Schuchardt
5346305db96SHeinrich Schuchardt	int\s+(?:un)?signed|
5356305db96SHeinrich Schuchardt	(?:(?:un)?signed\s+)?int
5366305db96SHeinrich Schuchardt)};
5376305db96SHeinrich Schuchardt
5386305db96SHeinrich Schuchardtour @typeListFile = ();
5396b9709d9STom Riniour @typeListWithAttr = (
5406b9709d9STom Rini	@typeList,
5416b9709d9STom Rini	qr{struct\s+$InitAttribute\s+$Ident},
5426b9709d9STom Rini	qr{union\s+$InitAttribute\s+$Ident},
5436b9709d9STom Rini);
5446b9709d9STom Rini
545dd88ab32SMasahiro Yamadaour @modifierList = (
546dd88ab32SMasahiro Yamada	qr{fastcall},
547dd88ab32SMasahiro Yamada);
5486305db96SHeinrich Schuchardtour @modifierListFile = ();
5496305db96SHeinrich Schuchardt
5506305db96SHeinrich Schuchardtour @mode_permission_funcs = (
5516305db96SHeinrich Schuchardt	["module_param", 3],
5526305db96SHeinrich Schuchardt	["module_param_(?:array|named|string)", 4],
5536305db96SHeinrich Schuchardt	["module_param_array_named", 5],
5546305db96SHeinrich Schuchardt	["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
5556305db96SHeinrich Schuchardt	["proc_create(?:_data|)", 2],
5566305db96SHeinrich Schuchardt	["(?:CLASS|DEVICE|SENSOR|SENSOR_DEVICE|IIO_DEVICE)_ATTR", 2],
5576305db96SHeinrich Schuchardt	["IIO_DEV_ATTR_[A-Z_]+", 1],
5586305db96SHeinrich Schuchardt	["SENSOR_(?:DEVICE_|)ATTR_2", 2],
5596305db96SHeinrich Schuchardt	["SENSOR_TEMPLATE(?:_2|)", 3],
5606305db96SHeinrich Schuchardt	["__ATTR", 2],
5616305db96SHeinrich Schuchardt);
5626305db96SHeinrich Schuchardt
5636305db96SHeinrich Schuchardt#Create a search pattern for all these functions to speed up a loop below
5646305db96SHeinrich Schuchardtour $mode_perms_search = "";
5656305db96SHeinrich Schuchardtforeach my $entry (@mode_permission_funcs) {
5666305db96SHeinrich Schuchardt	$mode_perms_search .= '|' if ($mode_perms_search ne "");
5676305db96SHeinrich Schuchardt	$mode_perms_search .= $entry->[0];
5686305db96SHeinrich Schuchardt}
569*c398f2dfSHeinrich Schuchardt$mode_perms_search = "(?:${mode_perms_search})";
5706305db96SHeinrich Schuchardt
5716305db96SHeinrich Schuchardtour $mode_perms_world_writable = qr{
5726305db96SHeinrich Schuchardt	S_IWUGO		|
5736305db96SHeinrich Schuchardt	S_IWOTH		|
5746305db96SHeinrich Schuchardt	S_IRWXUGO	|
5756305db96SHeinrich Schuchardt	S_IALLUGO	|
5766305db96SHeinrich Schuchardt	0[0-7][0-7][2367]
5776305db96SHeinrich Schuchardt}x;
5786305db96SHeinrich Schuchardt
5796305db96SHeinrich Schuchardtour %mode_permission_string_types = (
5806305db96SHeinrich Schuchardt	"S_IRWXU" => 0700,
5816305db96SHeinrich Schuchardt	"S_IRUSR" => 0400,
5826305db96SHeinrich Schuchardt	"S_IWUSR" => 0200,
5836305db96SHeinrich Schuchardt	"S_IXUSR" => 0100,
5846305db96SHeinrich Schuchardt	"S_IRWXG" => 0070,
5856305db96SHeinrich Schuchardt	"S_IRGRP" => 0040,
5866305db96SHeinrich Schuchardt	"S_IWGRP" => 0020,
5876305db96SHeinrich Schuchardt	"S_IXGRP" => 0010,
5886305db96SHeinrich Schuchardt	"S_IRWXO" => 0007,
5896305db96SHeinrich Schuchardt	"S_IROTH" => 0004,
5906305db96SHeinrich Schuchardt	"S_IWOTH" => 0002,
5916305db96SHeinrich Schuchardt	"S_IXOTH" => 0001,
5926305db96SHeinrich Schuchardt	"S_IRWXUGO" => 0777,
5936305db96SHeinrich Schuchardt	"S_IRUGO" => 0444,
5946305db96SHeinrich Schuchardt	"S_IWUGO" => 0222,
5956305db96SHeinrich Schuchardt	"S_IXUGO" => 0111,
5966305db96SHeinrich Schuchardt);
5976305db96SHeinrich Schuchardt
5986305db96SHeinrich Schuchardt#Create a search pattern for all these strings to speed up a loop below
5996305db96SHeinrich Schuchardtour $mode_perms_string_search = "";
6006305db96SHeinrich Schuchardtforeach my $entry (keys %mode_permission_string_types) {
6016305db96SHeinrich Schuchardt	$mode_perms_string_search .= '|' if ($mode_perms_string_search ne "");
6026305db96SHeinrich Schuchardt	$mode_perms_string_search .= $entry;
6036305db96SHeinrich Schuchardt}
604*c398f2dfSHeinrich Schuchardtour $single_mode_perms_string_search = "(?:${mode_perms_string_search})";
605*c398f2dfSHeinrich Schuchardtour $multi_mode_perms_string_search = qr{
606*c398f2dfSHeinrich Schuchardt	${single_mode_perms_string_search}
607*c398f2dfSHeinrich Schuchardt	(?:\s*\|\s*${single_mode_perms_string_search})*
608*c398f2dfSHeinrich Schuchardt}x;
609*c398f2dfSHeinrich Schuchardt
610*c398f2dfSHeinrich Schuchardtsub perms_to_octal {
611*c398f2dfSHeinrich Schuchardt	my ($string) = @_;
612*c398f2dfSHeinrich Schuchardt
613*c398f2dfSHeinrich Schuchardt	return trim($string) if ($string =~ /^\s*0[0-7]{3,3}\s*$/);
614*c398f2dfSHeinrich Schuchardt
615*c398f2dfSHeinrich Schuchardt	my $val = "";
616*c398f2dfSHeinrich Schuchardt	my $oval = "";
617*c398f2dfSHeinrich Schuchardt	my $to = 0;
618*c398f2dfSHeinrich Schuchardt	my $curpos = 0;
619*c398f2dfSHeinrich Schuchardt	my $lastpos = 0;
620*c398f2dfSHeinrich Schuchardt	while ($string =~ /\b(($single_mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {
621*c398f2dfSHeinrich Schuchardt		$curpos = pos($string);
622*c398f2dfSHeinrich Schuchardt		my $match = $2;
623*c398f2dfSHeinrich Schuchardt		my $omatch = $1;
624*c398f2dfSHeinrich Schuchardt		last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));
625*c398f2dfSHeinrich Schuchardt		$lastpos = $curpos;
626*c398f2dfSHeinrich Schuchardt		$to |= $mode_permission_string_types{$match};
627*c398f2dfSHeinrich Schuchardt		$val .= '\s*\|\s*' if ($val ne "");
628*c398f2dfSHeinrich Schuchardt		$val .= $match;
629*c398f2dfSHeinrich Schuchardt		$oval .= $omatch;
630*c398f2dfSHeinrich Schuchardt	}
631*c398f2dfSHeinrich Schuchardt	$oval =~ s/^\s*\|\s*//;
632*c398f2dfSHeinrich Schuchardt	$oval =~ s/\s*\|\s*$//;
633*c398f2dfSHeinrich Schuchardt	return sprintf("%04o", $to);
634*c398f2dfSHeinrich Schuchardt}
635dd88ab32SMasahiro Yamada
636dd88ab32SMasahiro Yamadaour $allowed_asm_includes = qr{(?x:
637dd88ab32SMasahiro Yamada	irq|
6386305db96SHeinrich Schuchardt	memory|
6396305db96SHeinrich Schuchardt	time|
6406305db96SHeinrich Schuchardt	reboot
641dd88ab32SMasahiro Yamada)};
642dd88ab32SMasahiro Yamada# memory.h: ARM has a custom one
643dd88ab32SMasahiro Yamada
644c10e0f5bSDan Murphy# Load common spelling mistakes and build regular expression list.
645c10e0f5bSDan Murphymy $misspellings;
646c10e0f5bSDan Murphymy %spelling_fix;
647c10e0f5bSDan Murphy
648c10e0f5bSDan Murphyif (open(my $spelling, '<', $spelling_file)) {
649c10e0f5bSDan Murphy	while (<$spelling>) {
650c10e0f5bSDan Murphy		my $line = $_;
651c10e0f5bSDan Murphy
652c10e0f5bSDan Murphy		$line =~ s/\s*\n?$//g;
653c10e0f5bSDan Murphy		$line =~ s/^\s*//g;
654c10e0f5bSDan Murphy
655c10e0f5bSDan Murphy		next if ($line =~ m/^\s*#/);
656c10e0f5bSDan Murphy		next if ($line =~ m/^\s*$/);
657c10e0f5bSDan Murphy
658c10e0f5bSDan Murphy		my ($suspect, $fix) = split(/\|\|/, $line);
659c10e0f5bSDan Murphy
660c10e0f5bSDan Murphy		$spelling_fix{$suspect} = $fix;
661c10e0f5bSDan Murphy	}
662c10e0f5bSDan Murphy	close($spelling);
663c10e0f5bSDan Murphy} else {
664c10e0f5bSDan Murphy	warn "No typos will be found - file '$spelling_file': $!\n";
665c10e0f5bSDan Murphy}
666c10e0f5bSDan Murphy
667c10e0f5bSDan Murphyif ($codespell) {
668c10e0f5bSDan Murphy	if (open(my $spelling, '<', $codespellfile)) {
669c10e0f5bSDan Murphy		while (<$spelling>) {
670c10e0f5bSDan Murphy			my $line = $_;
671c10e0f5bSDan Murphy
672c10e0f5bSDan Murphy			$line =~ s/\s*\n?$//g;
673c10e0f5bSDan Murphy			$line =~ s/^\s*//g;
674c10e0f5bSDan Murphy
675c10e0f5bSDan Murphy			next if ($line =~ m/^\s*#/);
676c10e0f5bSDan Murphy			next if ($line =~ m/^\s*$/);
677c10e0f5bSDan Murphy			next if ($line =~ m/, disabled/i);
678c10e0f5bSDan Murphy
679c10e0f5bSDan Murphy			$line =~ s/,.*$//;
680c10e0f5bSDan Murphy
681c10e0f5bSDan Murphy			my ($suspect, $fix) = split(/->/, $line);
682c10e0f5bSDan Murphy
683c10e0f5bSDan Murphy			$spelling_fix{$suspect} = $fix;
684c10e0f5bSDan Murphy		}
685c10e0f5bSDan Murphy		close($spelling);
686c10e0f5bSDan Murphy	} else {
687c10e0f5bSDan Murphy		warn "No codespell typos will be found - file '$codespellfile': $!\n";
688c10e0f5bSDan Murphy	}
689c10e0f5bSDan Murphy}
690c10e0f5bSDan Murphy
691c10e0f5bSDan Murphy$misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix;
692c10e0f5bSDan Murphy
6936305db96SHeinrich Schuchardtsub read_words {
6946305db96SHeinrich Schuchardt	my ($wordsRef, $file) = @_;
6956305db96SHeinrich Schuchardt
6966305db96SHeinrich Schuchardt	if (open(my $words, '<', $file)) {
6976305db96SHeinrich Schuchardt		while (<$words>) {
6986305db96SHeinrich Schuchardt			my $line = $_;
6996305db96SHeinrich Schuchardt
7006305db96SHeinrich Schuchardt			$line =~ s/\s*\n?$//g;
7016305db96SHeinrich Schuchardt			$line =~ s/^\s*//g;
7026305db96SHeinrich Schuchardt
7036305db96SHeinrich Schuchardt			next if ($line =~ m/^\s*#/);
7046305db96SHeinrich Schuchardt			next if ($line =~ m/^\s*$/);
7056305db96SHeinrich Schuchardt			if ($line =~ /\s/) {
7066305db96SHeinrich Schuchardt				print("$file: '$line' invalid - ignored\n");
7076305db96SHeinrich Schuchardt				next;
7086305db96SHeinrich Schuchardt			}
7096305db96SHeinrich Schuchardt
7106305db96SHeinrich Schuchardt			$$wordsRef .= '|' if ($$wordsRef ne "");
7116305db96SHeinrich Schuchardt			$$wordsRef .= $line;
7126305db96SHeinrich Schuchardt		}
7136305db96SHeinrich Schuchardt		close($file);
7146305db96SHeinrich Schuchardt		return 1;
7156305db96SHeinrich Schuchardt	}
7166305db96SHeinrich Schuchardt
7176305db96SHeinrich Schuchardt	return 0;
7186305db96SHeinrich Schuchardt}
7196305db96SHeinrich Schuchardt
7206305db96SHeinrich Schuchardtmy $const_structs = "";
7216305db96SHeinrich Schuchardtread_words(\$const_structs, $conststructsfile)
7226305db96SHeinrich Schuchardt    or warn "No structs that should be const will be found - file '$conststructsfile': $!\n";
7236305db96SHeinrich Schuchardt
7246305db96SHeinrich Schuchardtmy $typeOtherTypedefs = "";
7256305db96SHeinrich Schuchardtif (length($typedefsfile)) {
7266305db96SHeinrich Schuchardt	read_words(\$typeOtherTypedefs, $typedefsfile)
7276305db96SHeinrich Schuchardt	    or warn "No additional types will be considered - file '$typedefsfile': $!\n";
7286305db96SHeinrich Schuchardt}
7296305db96SHeinrich Schuchardt$typeTypedefs .= '|' . $typeOtherTypedefs if ($typeOtherTypedefs ne "");
730c10e0f5bSDan Murphy
731dd88ab32SMasahiro Yamadasub build_types {
7326305db96SHeinrich Schuchardt	my $mods = "(?x:  \n" . join("|\n  ", (@modifierList, @modifierListFile)) . "\n)";
7336305db96SHeinrich Schuchardt	my $all = "(?x:  \n" . join("|\n  ", (@typeList, @typeListFile)) . "\n)";
7346305db96SHeinrich Schuchardt	my $Misordered = "(?x:  \n" . join("|\n  ", @typeListMisordered) . "\n)";
7356b9709d9STom Rini	my $allWithAttr = "(?x:  \n" . join("|\n  ", @typeListWithAttr) . "\n)";
736dd88ab32SMasahiro Yamada	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
7376305db96SHeinrich Schuchardt	$BasicType	= qr{
7386305db96SHeinrich Schuchardt				(?:$typeTypedefs\b)|
7396305db96SHeinrich Schuchardt				(?:${all}\b)
7406305db96SHeinrich Schuchardt		}x;
741dd88ab32SMasahiro Yamada	$NonptrType	= qr{
742dd88ab32SMasahiro Yamada			(?:$Modifier\s+|const\s+)*
743dd88ab32SMasahiro Yamada			(?:
744dd88ab32SMasahiro Yamada				(?:typeof|__typeof__)\s*\([^\)]*\)|
745dd88ab32SMasahiro Yamada				(?:$typeTypedefs\b)|
746dd88ab32SMasahiro Yamada				(?:${all}\b)
747dd88ab32SMasahiro Yamada			)
748dd88ab32SMasahiro Yamada			(?:\s+$Modifier|\s+const)*
749dd88ab32SMasahiro Yamada		  }x;
7506305db96SHeinrich Schuchardt	$NonptrTypeMisordered	= qr{
7516305db96SHeinrich Schuchardt			(?:$Modifier\s+|const\s+)*
7526305db96SHeinrich Schuchardt			(?:
7536305db96SHeinrich Schuchardt				(?:${Misordered}\b)
7546305db96SHeinrich Schuchardt			)
7556305db96SHeinrich Schuchardt			(?:\s+$Modifier|\s+const)*
7566305db96SHeinrich Schuchardt		  }x;
7576b9709d9STom Rini	$NonptrTypeWithAttr	= qr{
7586b9709d9STom Rini			(?:$Modifier\s+|const\s+)*
7596b9709d9STom Rini			(?:
7606b9709d9STom Rini				(?:typeof|__typeof__)\s*\([^\)]*\)|
7616b9709d9STom Rini				(?:$typeTypedefs\b)|
7626b9709d9STom Rini				(?:${allWithAttr}\b)
7636b9709d9STom Rini			)
7646b9709d9STom Rini			(?:\s+$Modifier|\s+const)*
7656b9709d9STom Rini		  }x;
766dd88ab32SMasahiro Yamada	$Type	= qr{
767dd88ab32SMasahiro Yamada			$NonptrType
7686305db96SHeinrich Schuchardt			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
769dd88ab32SMasahiro Yamada			(?:\s+$Inline|\s+$Modifier)*
770dd88ab32SMasahiro Yamada		  }x;
7716305db96SHeinrich Schuchardt	$TypeMisordered	= qr{
7726305db96SHeinrich Schuchardt			$NonptrTypeMisordered
7736305db96SHeinrich Schuchardt			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
7746305db96SHeinrich Schuchardt			(?:\s+$Inline|\s+$Modifier)*
7756305db96SHeinrich Schuchardt		  }x;
7766305db96SHeinrich Schuchardt	$Declare	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
7776305db96SHeinrich Schuchardt	$DeclareMisordered	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
778dd88ab32SMasahiro Yamada}
779dd88ab32SMasahiro Yamadabuild_types();
780dd88ab32SMasahiro Yamada
781dd88ab32SMasahiro Yamadaour $Typecast	= qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
782dd88ab32SMasahiro Yamada
783dd88ab32SMasahiro Yamada# Using $balanced_parens, $LvalOrFunc, or $FuncArg
784dd88ab32SMasahiro Yamada# requires at least perl version v5.10.0
785dd88ab32SMasahiro Yamada# Any use must be runtime checked with $^V
786dd88ab32SMasahiro Yamada
787dd88ab32SMasahiro Yamadaour $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
7886305db96SHeinrich Schuchardtour $LvalOrFunc	= qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
7896305db96SHeinrich Schuchardtour $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
7906305db96SHeinrich Schuchardt
7916305db96SHeinrich Schuchardtour $declaration_macros = qr{(?x:
7926305db96SHeinrich Schuchardt	(?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
7936305db96SHeinrich Schuchardt	(?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|
794*c398f2dfSHeinrich Schuchardt	(?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(|
795*c398f2dfSHeinrich Schuchardt	(?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\(
7966305db96SHeinrich Schuchardt)};
797dd88ab32SMasahiro Yamada
798dd88ab32SMasahiro Yamadasub deparenthesize {
799dd88ab32SMasahiro Yamada	my ($string) = @_;
800dd88ab32SMasahiro Yamada	return "" if (!defined($string));
8016305db96SHeinrich Schuchardt
8026305db96SHeinrich Schuchardt	while ($string =~ /^\s*\(.*\)\s*$/) {
8036305db96SHeinrich Schuchardt		$string =~ s@^\s*\(\s*@@;
8046305db96SHeinrich Schuchardt		$string =~ s@\s*\)\s*$@@;
8056305db96SHeinrich Schuchardt	}
8066305db96SHeinrich Schuchardt
807dd88ab32SMasahiro Yamada	$string =~ s@\s+@ @g;
8086305db96SHeinrich Schuchardt
809dd88ab32SMasahiro Yamada	return $string;
810dd88ab32SMasahiro Yamada}
811dd88ab32SMasahiro Yamada
8126b9709d9STom Rinisub seed_camelcase_file {
8136b9709d9STom Rini	my ($file) = @_;
8146b9709d9STom Rini
8156b9709d9STom Rini	return if (!(-f $file));
8166b9709d9STom Rini
8176b9709d9STom Rini	local $/;
8186b9709d9STom Rini
8196b9709d9STom Rini	open(my $include_file, '<', "$file")
8206b9709d9STom Rini	    or warn "$P: Can't read '$file' $!\n";
8216b9709d9STom Rini	my $text = <$include_file>;
8226b9709d9STom Rini	close($include_file);
8236b9709d9STom Rini
8246b9709d9STom Rini	my @lines = split('\n', $text);
8256b9709d9STom Rini
8266b9709d9STom Rini	foreach my $line (@lines) {
8276b9709d9STom Rini		next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
8286b9709d9STom Rini		if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
8296b9709d9STom Rini			$camelcase{$1} = 1;
8306b9709d9STom Rini		} elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
8316b9709d9STom Rini			$camelcase{$1} = 1;
8326b9709d9STom Rini		} elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
8336b9709d9STom Rini			$camelcase{$1} = 1;
8346b9709d9STom Rini		}
8356b9709d9STom Rini	}
8366b9709d9STom Rini}
8376b9709d9STom Rini
8386305db96SHeinrich Schuchardtsub is_maintained_obsolete {
8396305db96SHeinrich Schuchardt	my ($filename) = @_;
8406305db96SHeinrich Schuchardt
8416305db96SHeinrich Schuchardt	return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl"));
8426305db96SHeinrich Schuchardt
8436305db96SHeinrich Schuchardt	my $status = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`;
8446305db96SHeinrich Schuchardt
8456305db96SHeinrich Schuchardt	return $status =~ /obsolete/i;
8466305db96SHeinrich Schuchardt}
8476305db96SHeinrich Schuchardt
8486b9709d9STom Rinimy $camelcase_seeded = 0;
8496b9709d9STom Rinisub seed_camelcase_includes {
8506b9709d9STom Rini	return if ($camelcase_seeded);
8516b9709d9STom Rini
8526b9709d9STom Rini	my $files;
8536b9709d9STom Rini	my $camelcase_cache = "";
8546b9709d9STom Rini	my @include_files = ();
8556b9709d9STom Rini
8566b9709d9STom Rini	$camelcase_seeded = 1;
8576b9709d9STom Rini
8586b9709d9STom Rini	if (-e ".git") {
8596b9709d9STom Rini		my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
8606b9709d9STom Rini		chomp $git_last_include_commit;
8616b9709d9STom Rini		$camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
8626b9709d9STom Rini	} else {
8636b9709d9STom Rini		my $last_mod_date = 0;
8646b9709d9STom Rini		$files = `find $root/include -name "*.h"`;
8656b9709d9STom Rini		@include_files = split('\n', $files);
8666b9709d9STom Rini		foreach my $file (@include_files) {
8676b9709d9STom Rini			my $date = POSIX::strftime("%Y%m%d%H%M",
8686b9709d9STom Rini						   localtime((stat $file)[9]));
8696b9709d9STom Rini			$last_mod_date = $date if ($last_mod_date < $date);
8706b9709d9STom Rini		}
8716b9709d9STom Rini		$camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
8726b9709d9STom Rini	}
8736b9709d9STom Rini
8746b9709d9STom Rini	if ($camelcase_cache ne "" && -f $camelcase_cache) {
8756b9709d9STom Rini		open(my $camelcase_file, '<', "$camelcase_cache")
8766b9709d9STom Rini		    or warn "$P: Can't read '$camelcase_cache' $!\n";
8776b9709d9STom Rini		while (<$camelcase_file>) {
8786b9709d9STom Rini			chomp;
8796b9709d9STom Rini			$camelcase{$_} = 1;
8806b9709d9STom Rini		}
8816b9709d9STom Rini		close($camelcase_file);
8826b9709d9STom Rini
8836b9709d9STom Rini		return;
8846b9709d9STom Rini	}
8856b9709d9STom Rini
8866b9709d9STom Rini	if (-e ".git") {
8876b9709d9STom Rini		$files = `git ls-files "include/*.h"`;
8886b9709d9STom Rini		@include_files = split('\n', $files);
8896b9709d9STom Rini	}
8906b9709d9STom Rini
8916b9709d9STom Rini	foreach my $file (@include_files) {
8926b9709d9STom Rini		seed_camelcase_file($file);
8936b9709d9STom Rini	}
8946b9709d9STom Rini
8956b9709d9STom Rini	if ($camelcase_cache ne "") {
8966b9709d9STom Rini		unlink glob ".checkpatch-camelcase.*";
8976b9709d9STom Rini		open(my $camelcase_file, '>', "$camelcase_cache")
8986b9709d9STom Rini		    or warn "$P: Can't write '$camelcase_cache' $!\n";
8996b9709d9STom Rini		foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
9006b9709d9STom Rini			print $camelcase_file ("$_\n");
9016b9709d9STom Rini		}
9026b9709d9STom Rini		close($camelcase_file);
9036b9709d9STom Rini	}
9046b9709d9STom Rini}
9056b9709d9STom Rini
9066305db96SHeinrich Schuchardtsub git_commit_info {
9076305db96SHeinrich Schuchardt	my ($commit, $id, $desc) = @_;
9086305db96SHeinrich Schuchardt
9096305db96SHeinrich Schuchardt	return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
9106305db96SHeinrich Schuchardt
9116305db96SHeinrich Schuchardt	my $output = `git log --no-color --format='%H %s' -1 $commit 2>&1`;
9126305db96SHeinrich Schuchardt	$output =~ s/^\s*//gm;
9136305db96SHeinrich Schuchardt	my @lines = split("\n", $output);
9146305db96SHeinrich Schuchardt
9156305db96SHeinrich Schuchardt	return ($id, $desc) if ($#lines < 0);
9166305db96SHeinrich Schuchardt
9176305db96SHeinrich Schuchardt	if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous\./) {
9186305db96SHeinrich Schuchardt# Maybe one day convert this block of bash into something that returns
9196305db96SHeinrich Schuchardt# all matching commit ids, but it's very slow...
9206305db96SHeinrich Schuchardt#
9216305db96SHeinrich Schuchardt#		echo "checking commits $1..."
9226305db96SHeinrich Schuchardt#		git rev-list --remotes | grep -i "^$1" |
9236305db96SHeinrich Schuchardt#		while read line ; do
9246305db96SHeinrich Schuchardt#		    git log --format='%H %s' -1 $line |
9256305db96SHeinrich Schuchardt#		    echo "commit $(cut -c 1-12,41-)"
9266305db96SHeinrich Schuchardt#		done
9276305db96SHeinrich Schuchardt	} elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
9286305db96SHeinrich Schuchardt		$id = undef;
9296305db96SHeinrich Schuchardt	} else {
9306305db96SHeinrich Schuchardt		$id = substr($lines[0], 0, 12);
9316305db96SHeinrich Schuchardt		$desc = substr($lines[0], 41);
9326305db96SHeinrich Schuchardt	}
9336305db96SHeinrich Schuchardt
9346305db96SHeinrich Schuchardt	return ($id, $desc);
9356305db96SHeinrich Schuchardt}
9366305db96SHeinrich Schuchardt
937dd88ab32SMasahiro Yamada$chk_signoff = 0 if ($file);
938dd88ab32SMasahiro Yamada
939dd88ab32SMasahiro Yamadamy @rawlines = ();
940dd88ab32SMasahiro Yamadamy @lines = ();
9416b9709d9STom Rinimy @fixed = ();
9426305db96SHeinrich Schuchardtmy @fixed_inserted = ();
9436305db96SHeinrich Schuchardtmy @fixed_deleted = ();
944c10e0f5bSDan Murphymy $fixlinenr = -1;
945c10e0f5bSDan Murphy
9466305db96SHeinrich Schuchardt# If input is git commits, extract all commits from the commit expressions.
9476305db96SHeinrich Schuchardt# For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'.
9486305db96SHeinrich Schuchardtdie "$P: No git repository found\n" if ($git && !-e ".git");
9496305db96SHeinrich Schuchardt
9506305db96SHeinrich Schuchardtif ($git) {
9516305db96SHeinrich Schuchardt	my @commits = ();
9526305db96SHeinrich Schuchardt	foreach my $commit_expr (@ARGV) {
9536305db96SHeinrich Schuchardt		my $git_range;
9546305db96SHeinrich Schuchardt		if ($commit_expr =~ m/^(.*)-(\d+)$/) {
9556305db96SHeinrich Schuchardt			$git_range = "-$2 $1";
9566305db96SHeinrich Schuchardt		} elsif ($commit_expr =~ m/\.\./) {
9576305db96SHeinrich Schuchardt			$git_range = "$commit_expr";
9586305db96SHeinrich Schuchardt		} else {
9596305db96SHeinrich Schuchardt			$git_range = "-1 $commit_expr";
9606305db96SHeinrich Schuchardt		}
9616305db96SHeinrich Schuchardt		my $lines = `git log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
9626305db96SHeinrich Schuchardt		foreach my $line (split(/\n/, $lines)) {
9636305db96SHeinrich Schuchardt			$line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
9646305db96SHeinrich Schuchardt			next if (!defined($1) || !defined($2));
9656305db96SHeinrich Schuchardt			my $sha1 = $1;
9666305db96SHeinrich Schuchardt			my $subject = $2;
9676305db96SHeinrich Schuchardt			unshift(@commits, $sha1);
9686305db96SHeinrich Schuchardt			$git_commits{$sha1} = $subject;
9696305db96SHeinrich Schuchardt		}
9706305db96SHeinrich Schuchardt	}
9716305db96SHeinrich Schuchardt	die "$P: no git commits after extraction!\n" if (@commits == 0);
9726305db96SHeinrich Schuchardt	@ARGV = @commits;
9736305db96SHeinrich Schuchardt}
9746305db96SHeinrich Schuchardt
9756305db96SHeinrich Schuchardtmy $vname;
976dd88ab32SMasahiro Yamadafor my $filename (@ARGV) {
977dd88ab32SMasahiro Yamada	my $FILE;
9786305db96SHeinrich Schuchardt	if ($git) {
9796305db96SHeinrich Schuchardt		open($FILE, '-|', "git format-patch -M --stdout -1 $filename") ||
9806305db96SHeinrich Schuchardt			die "$P: $filename: git format-patch failed - $!\n";
9816305db96SHeinrich Schuchardt	} elsif ($file) {
982dd88ab32SMasahiro Yamada		open($FILE, '-|', "diff -u /dev/null $filename") ||
983dd88ab32SMasahiro Yamada			die "$P: $filename: diff failed - $!\n";
984dd88ab32SMasahiro Yamada	} elsif ($filename eq '-') {
985dd88ab32SMasahiro Yamada		open($FILE, '<&STDIN');
986dd88ab32SMasahiro Yamada	} else {
987dd88ab32SMasahiro Yamada		open($FILE, '<', "$filename") ||
988dd88ab32SMasahiro Yamada			die "$P: $filename: open failed - $!\n";
989dd88ab32SMasahiro Yamada	}
990dd88ab32SMasahiro Yamada	if ($filename eq '-') {
991dd88ab32SMasahiro Yamada		$vname = 'Your patch';
9926305db96SHeinrich Schuchardt	} elsif ($git) {
9936305db96SHeinrich Schuchardt		$vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")';
994dd88ab32SMasahiro Yamada	} else {
995dd88ab32SMasahiro Yamada		$vname = $filename;
996dd88ab32SMasahiro Yamada	}
997dd88ab32SMasahiro Yamada	while (<$FILE>) {
998dd88ab32SMasahiro Yamada		chomp;
999dd88ab32SMasahiro Yamada		push(@rawlines, $_);
1000dd88ab32SMasahiro Yamada	}
1001dd88ab32SMasahiro Yamada	close($FILE);
10026305db96SHeinrich Schuchardt
10036305db96SHeinrich Schuchardt	if ($#ARGV > 0 && $quiet == 0) {
10046305db96SHeinrich Schuchardt		print '-' x length($vname) . "\n";
10056305db96SHeinrich Schuchardt		print "$vname\n";
10066305db96SHeinrich Schuchardt		print '-' x length($vname) . "\n";
10076305db96SHeinrich Schuchardt	}
10086305db96SHeinrich Schuchardt
1009dd88ab32SMasahiro Yamada	if (!process($filename)) {
1010dd88ab32SMasahiro Yamada		$exit = 1;
1011dd88ab32SMasahiro Yamada	}
1012dd88ab32SMasahiro Yamada	@rawlines = ();
1013dd88ab32SMasahiro Yamada	@lines = ();
10146b9709d9STom Rini	@fixed = ();
10156305db96SHeinrich Schuchardt	@fixed_inserted = ();
10166305db96SHeinrich Schuchardt	@fixed_deleted = ();
10176305db96SHeinrich Schuchardt	$fixlinenr = -1;
10186305db96SHeinrich Schuchardt	@modifierListFile = ();
10196305db96SHeinrich Schuchardt	@typeListFile = ();
10206305db96SHeinrich Schuchardt	build_types();
10216305db96SHeinrich Schuchardt}
10226305db96SHeinrich Schuchardt
10236305db96SHeinrich Schuchardtif (!$quiet) {
10246305db96SHeinrich Schuchardt	hash_show_words(\%use_type, "Used");
10256305db96SHeinrich Schuchardt	hash_show_words(\%ignore_type, "Ignored");
10266305db96SHeinrich Schuchardt
10276305db96SHeinrich Schuchardt	if ($^V lt 5.10.0) {
10286305db96SHeinrich Schuchardt		print << "EOM"
10296305db96SHeinrich Schuchardt
10306305db96SHeinrich SchuchardtNOTE: perl $^V is not modern enough to detect all possible issues.
10316305db96SHeinrich Schuchardt      An upgrade to at least perl v5.10.0 is suggested.
10326305db96SHeinrich SchuchardtEOM
10336305db96SHeinrich Schuchardt	}
10346305db96SHeinrich Schuchardt	if ($exit) {
10356305db96SHeinrich Schuchardt		print << "EOM"
10366305db96SHeinrich Schuchardt
10376305db96SHeinrich SchuchardtNOTE: If any of the errors are false positives, please report
10386305db96SHeinrich Schuchardt      them to the maintainer, see CHECKPATCH in MAINTAINERS.
10396305db96SHeinrich SchuchardtEOM
10406305db96SHeinrich Schuchardt	}
1041dd88ab32SMasahiro Yamada}
1042dd88ab32SMasahiro Yamada
1043dd88ab32SMasahiro Yamadaexit($exit);
1044dd88ab32SMasahiro Yamada
1045dd88ab32SMasahiro Yamadasub top_of_kernel_tree {
1046dd88ab32SMasahiro Yamada	my ($root) = @_;
1047dd88ab32SMasahiro Yamada
1048dd88ab32SMasahiro Yamada	my @tree_check = (
10496b9709d9STom Rini		"COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
1050dd88ab32SMasahiro Yamada		"README", "Documentation", "arch", "include", "drivers",
1051dd88ab32SMasahiro Yamada		"fs", "init", "ipc", "kernel", "lib", "scripts",
1052dd88ab32SMasahiro Yamada	);
1053dd88ab32SMasahiro Yamada
1054dd88ab32SMasahiro Yamada	foreach my $check (@tree_check) {
1055dd88ab32SMasahiro Yamada		if (! -e $root . '/' . $check) {
1056dd88ab32SMasahiro Yamada			return 0;
1057dd88ab32SMasahiro Yamada		}
1058dd88ab32SMasahiro Yamada	}
1059dd88ab32SMasahiro Yamada	return 1;
1060dd88ab32SMasahiro Yamada}
1061dd88ab32SMasahiro Yamada
1062dd88ab32SMasahiro Yamadasub parse_email {
1063dd88ab32SMasahiro Yamada	my ($formatted_email) = @_;
1064dd88ab32SMasahiro Yamada
1065dd88ab32SMasahiro Yamada	my $name = "";
1066dd88ab32SMasahiro Yamada	my $address = "";
1067dd88ab32SMasahiro Yamada	my $comment = "";
1068dd88ab32SMasahiro Yamada
1069dd88ab32SMasahiro Yamada	if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
1070dd88ab32SMasahiro Yamada		$name = $1;
1071dd88ab32SMasahiro Yamada		$address = $2;
1072dd88ab32SMasahiro Yamada		$comment = $3 if defined $3;
1073dd88ab32SMasahiro Yamada	} elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
1074dd88ab32SMasahiro Yamada		$address = $1;
1075dd88ab32SMasahiro Yamada		$comment = $2 if defined $2;
1076dd88ab32SMasahiro Yamada	} elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
1077dd88ab32SMasahiro Yamada		$address = $1;
1078dd88ab32SMasahiro Yamada		$comment = $2 if defined $2;
1079*c398f2dfSHeinrich Schuchardt		$formatted_email =~ s/\Q$address\E.*$//;
1080dd88ab32SMasahiro Yamada		$name = $formatted_email;
10816b9709d9STom Rini		$name = trim($name);
1082dd88ab32SMasahiro Yamada		$name =~ s/^\"|\"$//g;
1083dd88ab32SMasahiro Yamada		# If there's a name left after stripping spaces and
1084dd88ab32SMasahiro Yamada		# leading quotes, and the address doesn't have both
1085dd88ab32SMasahiro Yamada		# leading and trailing angle brackets, the address
1086dd88ab32SMasahiro Yamada		# is invalid. ie:
1087dd88ab32SMasahiro Yamada		#   "joe smith joe@smith.com" bad
1088dd88ab32SMasahiro Yamada		#   "joe smith <joe@smith.com" bad
1089dd88ab32SMasahiro Yamada		if ($name ne "" && $address !~ /^<[^>]+>$/) {
1090dd88ab32SMasahiro Yamada			$name = "";
1091dd88ab32SMasahiro Yamada			$address = "";
1092dd88ab32SMasahiro Yamada			$comment = "";
1093dd88ab32SMasahiro Yamada		}
1094dd88ab32SMasahiro Yamada	}
1095dd88ab32SMasahiro Yamada
10966b9709d9STom Rini	$name = trim($name);
1097dd88ab32SMasahiro Yamada	$name =~ s/^\"|\"$//g;
10986b9709d9STom Rini	$address = trim($address);
1099dd88ab32SMasahiro Yamada	$address =~ s/^\<|\>$//g;
1100dd88ab32SMasahiro Yamada
1101dd88ab32SMasahiro Yamada	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
1102dd88ab32SMasahiro Yamada		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
1103dd88ab32SMasahiro Yamada		$name = "\"$name\"";
1104dd88ab32SMasahiro Yamada	}
1105dd88ab32SMasahiro Yamada
1106dd88ab32SMasahiro Yamada	return ($name, $address, $comment);
1107dd88ab32SMasahiro Yamada}
1108dd88ab32SMasahiro Yamada
1109dd88ab32SMasahiro Yamadasub format_email {
1110dd88ab32SMasahiro Yamada	my ($name, $address) = @_;
1111dd88ab32SMasahiro Yamada
1112dd88ab32SMasahiro Yamada	my $formatted_email;
1113dd88ab32SMasahiro Yamada
11146b9709d9STom Rini	$name = trim($name);
1115dd88ab32SMasahiro Yamada	$name =~ s/^\"|\"$//g;
11166b9709d9STom Rini	$address = trim($address);
1117dd88ab32SMasahiro Yamada
1118dd88ab32SMasahiro Yamada	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
1119dd88ab32SMasahiro Yamada		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
1120dd88ab32SMasahiro Yamada		$name = "\"$name\"";
1121dd88ab32SMasahiro Yamada	}
1122dd88ab32SMasahiro Yamada
1123dd88ab32SMasahiro Yamada	if ("$name" eq "") {
1124dd88ab32SMasahiro Yamada		$formatted_email = "$address";
1125dd88ab32SMasahiro Yamada	} else {
1126dd88ab32SMasahiro Yamada		$formatted_email = "$name <$address>";
1127dd88ab32SMasahiro Yamada	}
1128dd88ab32SMasahiro Yamada
1129dd88ab32SMasahiro Yamada	return $formatted_email;
1130dd88ab32SMasahiro Yamada}
1131dd88ab32SMasahiro Yamada
11326305db96SHeinrich Schuchardtsub which {
11336305db96SHeinrich Schuchardt	my ($bin) = @_;
11346305db96SHeinrich Schuchardt
11356305db96SHeinrich Schuchardt	foreach my $path (split(/:/, $ENV{PATH})) {
11366305db96SHeinrich Schuchardt		if (-e "$path/$bin") {
11376305db96SHeinrich Schuchardt			return "$path/$bin";
11386305db96SHeinrich Schuchardt		}
11396305db96SHeinrich Schuchardt	}
11406305db96SHeinrich Schuchardt
11416305db96SHeinrich Schuchardt	return "";
11426305db96SHeinrich Schuchardt}
11436305db96SHeinrich Schuchardt
1144dd88ab32SMasahiro Yamadasub which_conf {
1145dd88ab32SMasahiro Yamada	my ($conf) = @_;
1146dd88ab32SMasahiro Yamada
1147dd88ab32SMasahiro Yamada	foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
1148dd88ab32SMasahiro Yamada		if (-e "$path/$conf") {
1149dd88ab32SMasahiro Yamada			return "$path/$conf";
1150dd88ab32SMasahiro Yamada		}
1151dd88ab32SMasahiro Yamada	}
1152dd88ab32SMasahiro Yamada
1153dd88ab32SMasahiro Yamada	return "";
1154dd88ab32SMasahiro Yamada}
1155dd88ab32SMasahiro Yamada
1156dd88ab32SMasahiro Yamadasub expand_tabs {
1157dd88ab32SMasahiro Yamada	my ($str) = @_;
1158dd88ab32SMasahiro Yamada
1159dd88ab32SMasahiro Yamada	my $res = '';
1160dd88ab32SMasahiro Yamada	my $n = 0;
1161dd88ab32SMasahiro Yamada	for my $c (split(//, $str)) {
1162dd88ab32SMasahiro Yamada		if ($c eq "\t") {
1163dd88ab32SMasahiro Yamada			$res .= ' ';
1164dd88ab32SMasahiro Yamada			$n++;
1165dd88ab32SMasahiro Yamada			for (; ($n % 8) != 0; $n++) {
1166dd88ab32SMasahiro Yamada				$res .= ' ';
1167dd88ab32SMasahiro Yamada			}
1168dd88ab32SMasahiro Yamada			next;
1169dd88ab32SMasahiro Yamada		}
1170dd88ab32SMasahiro Yamada		$res .= $c;
1171dd88ab32SMasahiro Yamada		$n++;
1172dd88ab32SMasahiro Yamada	}
1173dd88ab32SMasahiro Yamada
1174dd88ab32SMasahiro Yamada	return $res;
1175dd88ab32SMasahiro Yamada}
1176dd88ab32SMasahiro Yamadasub copy_spacing {
1177dd88ab32SMasahiro Yamada	(my $res = shift) =~ tr/\t/ /c;
1178dd88ab32SMasahiro Yamada	return $res;
1179dd88ab32SMasahiro Yamada}
1180dd88ab32SMasahiro Yamada
1181dd88ab32SMasahiro Yamadasub line_stats {
1182dd88ab32SMasahiro Yamada	my ($line) = @_;
1183dd88ab32SMasahiro Yamada
1184dd88ab32SMasahiro Yamada	# Drop the diff line leader and expand tabs
1185dd88ab32SMasahiro Yamada	$line =~ s/^.//;
1186dd88ab32SMasahiro Yamada	$line = expand_tabs($line);
1187dd88ab32SMasahiro Yamada
1188dd88ab32SMasahiro Yamada	# Pick the indent from the front of the line.
1189dd88ab32SMasahiro Yamada	my ($white) = ($line =~ /^(\s*)/);
1190dd88ab32SMasahiro Yamada
1191dd88ab32SMasahiro Yamada	return (length($line), length($white));
1192dd88ab32SMasahiro Yamada}
1193dd88ab32SMasahiro Yamada
1194dd88ab32SMasahiro Yamadamy $sanitise_quote = '';
1195dd88ab32SMasahiro Yamada
1196dd88ab32SMasahiro Yamadasub sanitise_line_reset {
1197dd88ab32SMasahiro Yamada	my ($in_comment) = @_;
1198dd88ab32SMasahiro Yamada
1199dd88ab32SMasahiro Yamada	if ($in_comment) {
1200dd88ab32SMasahiro Yamada		$sanitise_quote = '*/';
1201dd88ab32SMasahiro Yamada	} else {
1202dd88ab32SMasahiro Yamada		$sanitise_quote = '';
1203dd88ab32SMasahiro Yamada	}
1204dd88ab32SMasahiro Yamada}
1205dd88ab32SMasahiro Yamadasub sanitise_line {
1206dd88ab32SMasahiro Yamada	my ($line) = @_;
1207dd88ab32SMasahiro Yamada
1208dd88ab32SMasahiro Yamada	my $res = '';
1209dd88ab32SMasahiro Yamada	my $l = '';
1210dd88ab32SMasahiro Yamada
1211dd88ab32SMasahiro Yamada	my $qlen = 0;
1212dd88ab32SMasahiro Yamada	my $off = 0;
1213dd88ab32SMasahiro Yamada	my $c;
1214dd88ab32SMasahiro Yamada
1215dd88ab32SMasahiro Yamada	# Always copy over the diff marker.
1216dd88ab32SMasahiro Yamada	$res = substr($line, 0, 1);
1217dd88ab32SMasahiro Yamada
1218dd88ab32SMasahiro Yamada	for ($off = 1; $off < length($line); $off++) {
1219dd88ab32SMasahiro Yamada		$c = substr($line, $off, 1);
1220dd88ab32SMasahiro Yamada
1221*c398f2dfSHeinrich Schuchardt		# Comments we are whacking completely including the begin
1222dd88ab32SMasahiro Yamada		# and end, all to $;.
1223dd88ab32SMasahiro Yamada		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
1224dd88ab32SMasahiro Yamada			$sanitise_quote = '*/';
1225dd88ab32SMasahiro Yamada
1226dd88ab32SMasahiro Yamada			substr($res, $off, 2, "$;$;");
1227dd88ab32SMasahiro Yamada			$off++;
1228dd88ab32SMasahiro Yamada			next;
1229dd88ab32SMasahiro Yamada		}
1230dd88ab32SMasahiro Yamada		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
1231dd88ab32SMasahiro Yamada			$sanitise_quote = '';
1232dd88ab32SMasahiro Yamada			substr($res, $off, 2, "$;$;");
1233dd88ab32SMasahiro Yamada			$off++;
1234dd88ab32SMasahiro Yamada			next;
1235dd88ab32SMasahiro Yamada		}
1236dd88ab32SMasahiro Yamada		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
1237dd88ab32SMasahiro Yamada			$sanitise_quote = '//';
1238dd88ab32SMasahiro Yamada
1239dd88ab32SMasahiro Yamada			substr($res, $off, 2, $sanitise_quote);
1240dd88ab32SMasahiro Yamada			$off++;
1241dd88ab32SMasahiro Yamada			next;
1242dd88ab32SMasahiro Yamada		}
1243dd88ab32SMasahiro Yamada
1244dd88ab32SMasahiro Yamada		# A \ in a string means ignore the next character.
1245dd88ab32SMasahiro Yamada		if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
1246dd88ab32SMasahiro Yamada		    $c eq "\\") {
1247dd88ab32SMasahiro Yamada			substr($res, $off, 2, 'XX');
1248dd88ab32SMasahiro Yamada			$off++;
1249dd88ab32SMasahiro Yamada			next;
1250dd88ab32SMasahiro Yamada		}
1251dd88ab32SMasahiro Yamada		# Regular quotes.
1252dd88ab32SMasahiro Yamada		if ($c eq "'" || $c eq '"') {
1253dd88ab32SMasahiro Yamada			if ($sanitise_quote eq '') {
1254dd88ab32SMasahiro Yamada				$sanitise_quote = $c;
1255dd88ab32SMasahiro Yamada
1256dd88ab32SMasahiro Yamada				substr($res, $off, 1, $c);
1257dd88ab32SMasahiro Yamada				next;
1258dd88ab32SMasahiro Yamada			} elsif ($sanitise_quote eq $c) {
1259dd88ab32SMasahiro Yamada				$sanitise_quote = '';
1260dd88ab32SMasahiro Yamada			}
1261dd88ab32SMasahiro Yamada		}
1262dd88ab32SMasahiro Yamada
1263dd88ab32SMasahiro Yamada		#print "c<$c> SQ<$sanitise_quote>\n";
1264dd88ab32SMasahiro Yamada		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
1265dd88ab32SMasahiro Yamada			substr($res, $off, 1, $;);
1266dd88ab32SMasahiro Yamada		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
1267dd88ab32SMasahiro Yamada			substr($res, $off, 1, $;);
1268dd88ab32SMasahiro Yamada		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
1269dd88ab32SMasahiro Yamada			substr($res, $off, 1, 'X');
1270dd88ab32SMasahiro Yamada		} else {
1271dd88ab32SMasahiro Yamada			substr($res, $off, 1, $c);
1272dd88ab32SMasahiro Yamada		}
1273dd88ab32SMasahiro Yamada	}
1274dd88ab32SMasahiro Yamada
1275dd88ab32SMasahiro Yamada	if ($sanitise_quote eq '//') {
1276dd88ab32SMasahiro Yamada		$sanitise_quote = '';
1277dd88ab32SMasahiro Yamada	}
1278dd88ab32SMasahiro Yamada
1279dd88ab32SMasahiro Yamada	# The pathname on a #include may be surrounded by '<' and '>'.
1280dd88ab32SMasahiro Yamada	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
1281dd88ab32SMasahiro Yamada		my $clean = 'X' x length($1);
1282dd88ab32SMasahiro Yamada		$res =~ s@\<.*\>@<$clean>@;
1283dd88ab32SMasahiro Yamada
1284dd88ab32SMasahiro Yamada	# The whole of a #error is a string.
1285dd88ab32SMasahiro Yamada	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
1286dd88ab32SMasahiro Yamada		my $clean = 'X' x length($1);
1287dd88ab32SMasahiro Yamada		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
1288dd88ab32SMasahiro Yamada	}
1289dd88ab32SMasahiro Yamada
12906305db96SHeinrich Schuchardt	if ($allow_c99_comments && $res =~ m@(//.*$)@) {
12916305db96SHeinrich Schuchardt		my $match = $1;
12926305db96SHeinrich Schuchardt		$res =~ s/\Q$match\E/"$;" x length($match)/e;
12936305db96SHeinrich Schuchardt	}
12946305db96SHeinrich Schuchardt
1295dd88ab32SMasahiro Yamada	return $res;
1296dd88ab32SMasahiro Yamada}
1297dd88ab32SMasahiro Yamada
12986b9709d9STom Rinisub get_quoted_string {
12996b9709d9STom Rini	my ($line, $rawline) = @_;
13006b9709d9STom Rini
1301*c398f2dfSHeinrich Schuchardt	return "" if (!defined($line) || !defined($rawline));
13026305db96SHeinrich Schuchardt	return "" if ($line !~ m/($String)/g);
13036b9709d9STom Rini	return substr($rawline, $-[0], $+[0] - $-[0]);
13046b9709d9STom Rini}
13056b9709d9STom Rini
1306dd88ab32SMasahiro Yamadasub ctx_statement_block {
1307dd88ab32SMasahiro Yamada	my ($linenr, $remain, $off) = @_;
1308dd88ab32SMasahiro Yamada	my $line = $linenr - 1;
1309dd88ab32SMasahiro Yamada	my $blk = '';
1310dd88ab32SMasahiro Yamada	my $soff = $off;
1311dd88ab32SMasahiro Yamada	my $coff = $off - 1;
1312dd88ab32SMasahiro Yamada	my $coff_set = 0;
1313dd88ab32SMasahiro Yamada
1314dd88ab32SMasahiro Yamada	my $loff = 0;
1315dd88ab32SMasahiro Yamada
1316dd88ab32SMasahiro Yamada	my $type = '';
1317dd88ab32SMasahiro Yamada	my $level = 0;
1318dd88ab32SMasahiro Yamada	my @stack = ();
1319dd88ab32SMasahiro Yamada	my $p;
1320dd88ab32SMasahiro Yamada	my $c;
1321dd88ab32SMasahiro Yamada	my $len = 0;
1322dd88ab32SMasahiro Yamada
1323dd88ab32SMasahiro Yamada	my $remainder;
1324dd88ab32SMasahiro Yamada	while (1) {
1325dd88ab32SMasahiro Yamada		@stack = (['', 0]) if ($#stack == -1);
1326dd88ab32SMasahiro Yamada
1327dd88ab32SMasahiro Yamada		#warn "CSB: blk<$blk> remain<$remain>\n";
1328dd88ab32SMasahiro Yamada		# If we are about to drop off the end, pull in more
1329dd88ab32SMasahiro Yamada		# context.
1330dd88ab32SMasahiro Yamada		if ($off >= $len) {
1331dd88ab32SMasahiro Yamada			for (; $remain > 0; $line++) {
1332dd88ab32SMasahiro Yamada				last if (!defined $lines[$line]);
1333dd88ab32SMasahiro Yamada				next if ($lines[$line] =~ /^-/);
1334dd88ab32SMasahiro Yamada				$remain--;
1335dd88ab32SMasahiro Yamada				$loff = $len;
1336dd88ab32SMasahiro Yamada				$blk .= $lines[$line] . "\n";
1337dd88ab32SMasahiro Yamada				$len = length($blk);
1338dd88ab32SMasahiro Yamada				$line++;
1339dd88ab32SMasahiro Yamada				last;
1340dd88ab32SMasahiro Yamada			}
1341dd88ab32SMasahiro Yamada			# Bail if there is no further context.
1342dd88ab32SMasahiro Yamada			#warn "CSB: blk<$blk> off<$off> len<$len>\n";
1343dd88ab32SMasahiro Yamada			if ($off >= $len) {
1344dd88ab32SMasahiro Yamada				last;
1345dd88ab32SMasahiro Yamada			}
1346dd88ab32SMasahiro Yamada			if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
1347dd88ab32SMasahiro Yamada				$level++;
1348dd88ab32SMasahiro Yamada				$type = '#';
1349dd88ab32SMasahiro Yamada			}
1350dd88ab32SMasahiro Yamada		}
1351dd88ab32SMasahiro Yamada		$p = $c;
1352dd88ab32SMasahiro Yamada		$c = substr($blk, $off, 1);
1353dd88ab32SMasahiro Yamada		$remainder = substr($blk, $off);
1354dd88ab32SMasahiro Yamada
1355dd88ab32SMasahiro Yamada		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
1356dd88ab32SMasahiro Yamada
1357dd88ab32SMasahiro Yamada		# Handle nested #if/#else.
1358dd88ab32SMasahiro Yamada		if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
1359dd88ab32SMasahiro Yamada			push(@stack, [ $type, $level ]);
1360dd88ab32SMasahiro Yamada		} elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
1361dd88ab32SMasahiro Yamada			($type, $level) = @{$stack[$#stack - 1]};
1362dd88ab32SMasahiro Yamada		} elsif ($remainder =~ /^#\s*endif\b/) {
1363dd88ab32SMasahiro Yamada			($type, $level) = @{pop(@stack)};
1364dd88ab32SMasahiro Yamada		}
1365dd88ab32SMasahiro Yamada
1366dd88ab32SMasahiro Yamada		# Statement ends at the ';' or a close '}' at the
1367dd88ab32SMasahiro Yamada		# outermost level.
1368dd88ab32SMasahiro Yamada		if ($level == 0 && $c eq ';') {
1369dd88ab32SMasahiro Yamada			last;
1370dd88ab32SMasahiro Yamada		}
1371dd88ab32SMasahiro Yamada
1372dd88ab32SMasahiro Yamada		# An else is really a conditional as long as its not else if
1373dd88ab32SMasahiro Yamada		if ($level == 0 && $coff_set == 0 &&
1374dd88ab32SMasahiro Yamada				(!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
1375dd88ab32SMasahiro Yamada				$remainder =~ /^(else)(?:\s|{)/ &&
1376dd88ab32SMasahiro Yamada				$remainder !~ /^else\s+if\b/) {
1377dd88ab32SMasahiro Yamada			$coff = $off + length($1) - 1;
1378dd88ab32SMasahiro Yamada			$coff_set = 1;
1379dd88ab32SMasahiro Yamada			#warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
1380dd88ab32SMasahiro Yamada			#warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
1381dd88ab32SMasahiro Yamada		}
1382dd88ab32SMasahiro Yamada
1383dd88ab32SMasahiro Yamada		if (($type eq '' || $type eq '(') && $c eq '(') {
1384dd88ab32SMasahiro Yamada			$level++;
1385dd88ab32SMasahiro Yamada			$type = '(';
1386dd88ab32SMasahiro Yamada		}
1387dd88ab32SMasahiro Yamada		if ($type eq '(' && $c eq ')') {
1388dd88ab32SMasahiro Yamada			$level--;
1389dd88ab32SMasahiro Yamada			$type = ($level != 0)? '(' : '';
1390dd88ab32SMasahiro Yamada
1391dd88ab32SMasahiro Yamada			if ($level == 0 && $coff < $soff) {
1392dd88ab32SMasahiro Yamada				$coff = $off;
1393dd88ab32SMasahiro Yamada				$coff_set = 1;
1394dd88ab32SMasahiro Yamada				#warn "CSB: mark coff<$coff>\n";
1395dd88ab32SMasahiro Yamada			}
1396dd88ab32SMasahiro Yamada		}
1397dd88ab32SMasahiro Yamada		if (($type eq '' || $type eq '{') && $c eq '{') {
1398dd88ab32SMasahiro Yamada			$level++;
1399dd88ab32SMasahiro Yamada			$type = '{';
1400dd88ab32SMasahiro Yamada		}
1401dd88ab32SMasahiro Yamada		if ($type eq '{' && $c eq '}') {
1402dd88ab32SMasahiro Yamada			$level--;
1403dd88ab32SMasahiro Yamada			$type = ($level != 0)? '{' : '';
1404dd88ab32SMasahiro Yamada
1405dd88ab32SMasahiro Yamada			if ($level == 0) {
1406dd88ab32SMasahiro Yamada				if (substr($blk, $off + 1, 1) eq ';') {
1407dd88ab32SMasahiro Yamada					$off++;
1408dd88ab32SMasahiro Yamada				}
1409dd88ab32SMasahiro Yamada				last;
1410dd88ab32SMasahiro Yamada			}
1411dd88ab32SMasahiro Yamada		}
1412dd88ab32SMasahiro Yamada		# Preprocessor commands end at the newline unless escaped.
1413dd88ab32SMasahiro Yamada		if ($type eq '#' && $c eq "\n" && $p ne "\\") {
1414dd88ab32SMasahiro Yamada			$level--;
1415dd88ab32SMasahiro Yamada			$type = '';
1416dd88ab32SMasahiro Yamada			$off++;
1417dd88ab32SMasahiro Yamada			last;
1418dd88ab32SMasahiro Yamada		}
1419dd88ab32SMasahiro Yamada		$off++;
1420dd88ab32SMasahiro Yamada	}
1421dd88ab32SMasahiro Yamada	# We are truly at the end, so shuffle to the next line.
1422dd88ab32SMasahiro Yamada	if ($off == $len) {
1423dd88ab32SMasahiro Yamada		$loff = $len + 1;
1424dd88ab32SMasahiro Yamada		$line++;
1425dd88ab32SMasahiro Yamada		$remain--;
1426dd88ab32SMasahiro Yamada	}
1427dd88ab32SMasahiro Yamada
1428dd88ab32SMasahiro Yamada	my $statement = substr($blk, $soff, $off - $soff + 1);
1429dd88ab32SMasahiro Yamada	my $condition = substr($blk, $soff, $coff - $soff + 1);
1430dd88ab32SMasahiro Yamada
1431dd88ab32SMasahiro Yamada	#warn "STATEMENT<$statement>\n";
1432dd88ab32SMasahiro Yamada	#warn "CONDITION<$condition>\n";
1433dd88ab32SMasahiro Yamada
1434dd88ab32SMasahiro Yamada	#print "coff<$coff> soff<$off> loff<$loff>\n";
1435dd88ab32SMasahiro Yamada
1436dd88ab32SMasahiro Yamada	return ($statement, $condition,
1437dd88ab32SMasahiro Yamada			$line, $remain + 1, $off - $loff + 1, $level);
1438dd88ab32SMasahiro Yamada}
1439dd88ab32SMasahiro Yamada
1440dd88ab32SMasahiro Yamadasub statement_lines {
1441dd88ab32SMasahiro Yamada	my ($stmt) = @_;
1442dd88ab32SMasahiro Yamada
1443dd88ab32SMasahiro Yamada	# Strip the diff line prefixes and rip blank lines at start and end.
1444dd88ab32SMasahiro Yamada	$stmt =~ s/(^|\n)./$1/g;
1445dd88ab32SMasahiro Yamada	$stmt =~ s/^\s*//;
1446dd88ab32SMasahiro Yamada	$stmt =~ s/\s*$//;
1447dd88ab32SMasahiro Yamada
1448dd88ab32SMasahiro Yamada	my @stmt_lines = ($stmt =~ /\n/g);
1449dd88ab32SMasahiro Yamada
1450dd88ab32SMasahiro Yamada	return $#stmt_lines + 2;
1451dd88ab32SMasahiro Yamada}
1452dd88ab32SMasahiro Yamada
1453dd88ab32SMasahiro Yamadasub statement_rawlines {
1454dd88ab32SMasahiro Yamada	my ($stmt) = @_;
1455dd88ab32SMasahiro Yamada
1456dd88ab32SMasahiro Yamada	my @stmt_lines = ($stmt =~ /\n/g);
1457dd88ab32SMasahiro Yamada
1458dd88ab32SMasahiro Yamada	return $#stmt_lines + 2;
1459dd88ab32SMasahiro Yamada}
1460dd88ab32SMasahiro Yamada
1461dd88ab32SMasahiro Yamadasub statement_block_size {
1462dd88ab32SMasahiro Yamada	my ($stmt) = @_;
1463dd88ab32SMasahiro Yamada
1464dd88ab32SMasahiro Yamada	$stmt =~ s/(^|\n)./$1/g;
1465dd88ab32SMasahiro Yamada	$stmt =~ s/^\s*{//;
1466dd88ab32SMasahiro Yamada	$stmt =~ s/}\s*$//;
1467dd88ab32SMasahiro Yamada	$stmt =~ s/^\s*//;
1468dd88ab32SMasahiro Yamada	$stmt =~ s/\s*$//;
1469dd88ab32SMasahiro Yamada
1470dd88ab32SMasahiro Yamada	my @stmt_lines = ($stmt =~ /\n/g);
1471dd88ab32SMasahiro Yamada	my @stmt_statements = ($stmt =~ /;/g);
1472dd88ab32SMasahiro Yamada
1473dd88ab32SMasahiro Yamada	my $stmt_lines = $#stmt_lines + 2;
1474dd88ab32SMasahiro Yamada	my $stmt_statements = $#stmt_statements + 1;
1475dd88ab32SMasahiro Yamada
1476dd88ab32SMasahiro Yamada	if ($stmt_lines > $stmt_statements) {
1477dd88ab32SMasahiro Yamada		return $stmt_lines;
1478dd88ab32SMasahiro Yamada	} else {
1479dd88ab32SMasahiro Yamada		return $stmt_statements;
1480dd88ab32SMasahiro Yamada	}
1481dd88ab32SMasahiro Yamada}
1482dd88ab32SMasahiro Yamada
1483dd88ab32SMasahiro Yamadasub ctx_statement_full {
1484dd88ab32SMasahiro Yamada	my ($linenr, $remain, $off) = @_;
1485dd88ab32SMasahiro Yamada	my ($statement, $condition, $level);
1486dd88ab32SMasahiro Yamada
1487dd88ab32SMasahiro Yamada	my (@chunks);
1488dd88ab32SMasahiro Yamada
1489dd88ab32SMasahiro Yamada	# Grab the first conditional/block pair.
1490dd88ab32SMasahiro Yamada	($statement, $condition, $linenr, $remain, $off, $level) =
1491dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $remain, $off);
1492dd88ab32SMasahiro Yamada	#print "F: c<$condition> s<$statement> remain<$remain>\n";
1493dd88ab32SMasahiro Yamada	push(@chunks, [ $condition, $statement ]);
1494dd88ab32SMasahiro Yamada	if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
1495dd88ab32SMasahiro Yamada		return ($level, $linenr, @chunks);
1496dd88ab32SMasahiro Yamada	}
1497dd88ab32SMasahiro Yamada
1498dd88ab32SMasahiro Yamada	# Pull in the following conditional/block pairs and see if they
1499dd88ab32SMasahiro Yamada	# could continue the statement.
1500dd88ab32SMasahiro Yamada	for (;;) {
1501dd88ab32SMasahiro Yamada		($statement, $condition, $linenr, $remain, $off, $level) =
1502dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $remain, $off);
1503dd88ab32SMasahiro Yamada		#print "C: c<$condition> s<$statement> remain<$remain>\n";
1504dd88ab32SMasahiro Yamada		last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
1505dd88ab32SMasahiro Yamada		#print "C: push\n";
1506dd88ab32SMasahiro Yamada		push(@chunks, [ $condition, $statement ]);
1507dd88ab32SMasahiro Yamada	}
1508dd88ab32SMasahiro Yamada
1509dd88ab32SMasahiro Yamada	return ($level, $linenr, @chunks);
1510dd88ab32SMasahiro Yamada}
1511dd88ab32SMasahiro Yamada
1512dd88ab32SMasahiro Yamadasub ctx_block_get {
1513dd88ab32SMasahiro Yamada	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
1514dd88ab32SMasahiro Yamada	my $line;
1515dd88ab32SMasahiro Yamada	my $start = $linenr - 1;
1516dd88ab32SMasahiro Yamada	my $blk = '';
1517dd88ab32SMasahiro Yamada	my @o;
1518dd88ab32SMasahiro Yamada	my @c;
1519dd88ab32SMasahiro Yamada	my @res = ();
1520dd88ab32SMasahiro Yamada
1521dd88ab32SMasahiro Yamada	my $level = 0;
1522dd88ab32SMasahiro Yamada	my @stack = ($level);
1523dd88ab32SMasahiro Yamada	for ($line = $start; $remain > 0; $line++) {
1524dd88ab32SMasahiro Yamada		next if ($rawlines[$line] =~ /^-/);
1525dd88ab32SMasahiro Yamada		$remain--;
1526dd88ab32SMasahiro Yamada
1527dd88ab32SMasahiro Yamada		$blk .= $rawlines[$line];
1528dd88ab32SMasahiro Yamada
1529dd88ab32SMasahiro Yamada		# Handle nested #if/#else.
1530dd88ab32SMasahiro Yamada		if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
1531dd88ab32SMasahiro Yamada			push(@stack, $level);
1532dd88ab32SMasahiro Yamada		} elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
1533dd88ab32SMasahiro Yamada			$level = $stack[$#stack - 1];
1534dd88ab32SMasahiro Yamada		} elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
1535dd88ab32SMasahiro Yamada			$level = pop(@stack);
1536dd88ab32SMasahiro Yamada		}
1537dd88ab32SMasahiro Yamada
1538dd88ab32SMasahiro Yamada		foreach my $c (split(//, $lines[$line])) {
1539dd88ab32SMasahiro Yamada			##print "C<$c>L<$level><$open$close>O<$off>\n";
1540dd88ab32SMasahiro Yamada			if ($off > 0) {
1541dd88ab32SMasahiro Yamada				$off--;
1542dd88ab32SMasahiro Yamada				next;
1543dd88ab32SMasahiro Yamada			}
1544dd88ab32SMasahiro Yamada
1545dd88ab32SMasahiro Yamada			if ($c eq $close && $level > 0) {
1546dd88ab32SMasahiro Yamada				$level--;
1547dd88ab32SMasahiro Yamada				last if ($level == 0);
1548dd88ab32SMasahiro Yamada			} elsif ($c eq $open) {
1549dd88ab32SMasahiro Yamada				$level++;
1550dd88ab32SMasahiro Yamada			}
1551dd88ab32SMasahiro Yamada		}
1552dd88ab32SMasahiro Yamada
1553dd88ab32SMasahiro Yamada		if (!$outer || $level <= 1) {
1554dd88ab32SMasahiro Yamada			push(@res, $rawlines[$line]);
1555dd88ab32SMasahiro Yamada		}
1556dd88ab32SMasahiro Yamada
1557dd88ab32SMasahiro Yamada		last if ($level == 0);
1558dd88ab32SMasahiro Yamada	}
1559dd88ab32SMasahiro Yamada
1560dd88ab32SMasahiro Yamada	return ($level, @res);
1561dd88ab32SMasahiro Yamada}
1562dd88ab32SMasahiro Yamadasub ctx_block_outer {
1563dd88ab32SMasahiro Yamada	my ($linenr, $remain) = @_;
1564dd88ab32SMasahiro Yamada
1565dd88ab32SMasahiro Yamada	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
1566dd88ab32SMasahiro Yamada	return @r;
1567dd88ab32SMasahiro Yamada}
1568dd88ab32SMasahiro Yamadasub ctx_block {
1569dd88ab32SMasahiro Yamada	my ($linenr, $remain) = @_;
1570dd88ab32SMasahiro Yamada
1571dd88ab32SMasahiro Yamada	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1572dd88ab32SMasahiro Yamada	return @r;
1573dd88ab32SMasahiro Yamada}
1574dd88ab32SMasahiro Yamadasub ctx_statement {
1575dd88ab32SMasahiro Yamada	my ($linenr, $remain, $off) = @_;
1576dd88ab32SMasahiro Yamada
1577dd88ab32SMasahiro Yamada	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1578dd88ab32SMasahiro Yamada	return @r;
1579dd88ab32SMasahiro Yamada}
1580dd88ab32SMasahiro Yamadasub ctx_block_level {
1581dd88ab32SMasahiro Yamada	my ($linenr, $remain) = @_;
1582dd88ab32SMasahiro Yamada
1583dd88ab32SMasahiro Yamada	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1584dd88ab32SMasahiro Yamada}
1585dd88ab32SMasahiro Yamadasub ctx_statement_level {
1586dd88ab32SMasahiro Yamada	my ($linenr, $remain, $off) = @_;
1587dd88ab32SMasahiro Yamada
1588dd88ab32SMasahiro Yamada	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1589dd88ab32SMasahiro Yamada}
1590dd88ab32SMasahiro Yamada
1591dd88ab32SMasahiro Yamadasub ctx_locate_comment {
1592dd88ab32SMasahiro Yamada	my ($first_line, $end_line) = @_;
1593dd88ab32SMasahiro Yamada
1594dd88ab32SMasahiro Yamada	# Catch a comment on the end of the line itself.
1595dd88ab32SMasahiro Yamada	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
1596dd88ab32SMasahiro Yamada	return $current_comment if (defined $current_comment);
1597dd88ab32SMasahiro Yamada
1598dd88ab32SMasahiro Yamada	# Look through the context and try and figure out if there is a
1599dd88ab32SMasahiro Yamada	# comment.
1600dd88ab32SMasahiro Yamada	my $in_comment = 0;
1601dd88ab32SMasahiro Yamada	$current_comment = '';
1602dd88ab32SMasahiro Yamada	for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
1603dd88ab32SMasahiro Yamada		my $line = $rawlines[$linenr - 1];
1604dd88ab32SMasahiro Yamada		#warn "           $line\n";
1605dd88ab32SMasahiro Yamada		if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
1606dd88ab32SMasahiro Yamada			$in_comment = 1;
1607dd88ab32SMasahiro Yamada		}
1608dd88ab32SMasahiro Yamada		if ($line =~ m@/\*@) {
1609dd88ab32SMasahiro Yamada			$in_comment = 1;
1610dd88ab32SMasahiro Yamada		}
1611dd88ab32SMasahiro Yamada		if (!$in_comment && $current_comment ne '') {
1612dd88ab32SMasahiro Yamada			$current_comment = '';
1613dd88ab32SMasahiro Yamada		}
1614dd88ab32SMasahiro Yamada		$current_comment .= $line . "\n" if ($in_comment);
1615dd88ab32SMasahiro Yamada		if ($line =~ m@\*/@) {
1616dd88ab32SMasahiro Yamada			$in_comment = 0;
1617dd88ab32SMasahiro Yamada		}
1618dd88ab32SMasahiro Yamada	}
1619dd88ab32SMasahiro Yamada
1620dd88ab32SMasahiro Yamada	chomp($current_comment);
1621dd88ab32SMasahiro Yamada	return($current_comment);
1622dd88ab32SMasahiro Yamada}
1623dd88ab32SMasahiro Yamadasub ctx_has_comment {
1624dd88ab32SMasahiro Yamada	my ($first_line, $end_line) = @_;
1625dd88ab32SMasahiro Yamada	my $cmt = ctx_locate_comment($first_line, $end_line);
1626dd88ab32SMasahiro Yamada
1627dd88ab32SMasahiro Yamada	##print "LINE: $rawlines[$end_line - 1 ]\n";
1628dd88ab32SMasahiro Yamada	##print "CMMT: $cmt\n";
1629dd88ab32SMasahiro Yamada
1630dd88ab32SMasahiro Yamada	return ($cmt ne '');
1631dd88ab32SMasahiro Yamada}
1632dd88ab32SMasahiro Yamada
1633dd88ab32SMasahiro Yamadasub raw_line {
1634dd88ab32SMasahiro Yamada	my ($linenr, $cnt) = @_;
1635dd88ab32SMasahiro Yamada
1636dd88ab32SMasahiro Yamada	my $offset = $linenr - 1;
1637dd88ab32SMasahiro Yamada	$cnt++;
1638dd88ab32SMasahiro Yamada
1639dd88ab32SMasahiro Yamada	my $line;
1640dd88ab32SMasahiro Yamada	while ($cnt) {
1641dd88ab32SMasahiro Yamada		$line = $rawlines[$offset++];
1642dd88ab32SMasahiro Yamada		next if (defined($line) && $line =~ /^-/);
1643dd88ab32SMasahiro Yamada		$cnt--;
1644dd88ab32SMasahiro Yamada	}
1645dd88ab32SMasahiro Yamada
1646dd88ab32SMasahiro Yamada	return $line;
1647dd88ab32SMasahiro Yamada}
1648dd88ab32SMasahiro Yamada
1649*c398f2dfSHeinrich Schuchardtsub get_stat_real {
1650*c398f2dfSHeinrich Schuchardt	my ($linenr, $lc) = @_;
1651*c398f2dfSHeinrich Schuchardt
1652*c398f2dfSHeinrich Schuchardt	my $stat_real = raw_line($linenr, 0);
1653*c398f2dfSHeinrich Schuchardt	for (my $count = $linenr + 1; $count <= $lc; $count++) {
1654*c398f2dfSHeinrich Schuchardt		$stat_real = $stat_real . "\n" . raw_line($count, 0);
1655*c398f2dfSHeinrich Schuchardt	}
1656*c398f2dfSHeinrich Schuchardt
1657*c398f2dfSHeinrich Schuchardt	return $stat_real;
1658*c398f2dfSHeinrich Schuchardt}
1659*c398f2dfSHeinrich Schuchardt
1660*c398f2dfSHeinrich Schuchardtsub get_stat_here {
1661*c398f2dfSHeinrich Schuchardt	my ($linenr, $cnt, $here) = @_;
1662*c398f2dfSHeinrich Schuchardt
1663*c398f2dfSHeinrich Schuchardt	my $herectx = $here . "\n";
1664*c398f2dfSHeinrich Schuchardt	for (my $n = 0; $n < $cnt; $n++) {
1665*c398f2dfSHeinrich Schuchardt		$herectx .= raw_line($linenr, $n) . "\n";
1666*c398f2dfSHeinrich Schuchardt	}
1667*c398f2dfSHeinrich Schuchardt
1668*c398f2dfSHeinrich Schuchardt	return $herectx;
1669*c398f2dfSHeinrich Schuchardt}
1670*c398f2dfSHeinrich Schuchardt
1671dd88ab32SMasahiro Yamadasub cat_vet {
1672dd88ab32SMasahiro Yamada	my ($vet) = @_;
1673dd88ab32SMasahiro Yamada	my ($res, $coded);
1674dd88ab32SMasahiro Yamada
1675dd88ab32SMasahiro Yamada	$res = '';
1676dd88ab32SMasahiro Yamada	while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
1677dd88ab32SMasahiro Yamada		$res .= $1;
1678dd88ab32SMasahiro Yamada		if ($2 ne '') {
1679dd88ab32SMasahiro Yamada			$coded = sprintf("^%c", unpack('C', $2) + 64);
1680dd88ab32SMasahiro Yamada			$res .= $coded;
1681dd88ab32SMasahiro Yamada		}
1682dd88ab32SMasahiro Yamada	}
1683dd88ab32SMasahiro Yamada	$res =~ s/$/\$/;
1684dd88ab32SMasahiro Yamada
1685dd88ab32SMasahiro Yamada	return $res;
1686dd88ab32SMasahiro Yamada}
1687dd88ab32SMasahiro Yamada
1688dd88ab32SMasahiro Yamadamy $av_preprocessor = 0;
1689dd88ab32SMasahiro Yamadamy $av_pending;
1690dd88ab32SMasahiro Yamadamy @av_paren_type;
1691dd88ab32SMasahiro Yamadamy $av_pend_colon;
1692dd88ab32SMasahiro Yamada
1693dd88ab32SMasahiro Yamadasub annotate_reset {
1694dd88ab32SMasahiro Yamada	$av_preprocessor = 0;
1695dd88ab32SMasahiro Yamada	$av_pending = '_';
1696dd88ab32SMasahiro Yamada	@av_paren_type = ('E');
1697dd88ab32SMasahiro Yamada	$av_pend_colon = 'O';
1698dd88ab32SMasahiro Yamada}
1699dd88ab32SMasahiro Yamada
1700dd88ab32SMasahiro Yamadasub annotate_values {
1701dd88ab32SMasahiro Yamada	my ($stream, $type) = @_;
1702dd88ab32SMasahiro Yamada
1703dd88ab32SMasahiro Yamada	my $res;
1704dd88ab32SMasahiro Yamada	my $var = '_' x length($stream);
1705dd88ab32SMasahiro Yamada	my $cur = $stream;
1706dd88ab32SMasahiro Yamada
1707dd88ab32SMasahiro Yamada	print "$stream\n" if ($dbg_values > 1);
1708dd88ab32SMasahiro Yamada
1709dd88ab32SMasahiro Yamada	while (length($cur)) {
1710dd88ab32SMasahiro Yamada		@av_paren_type = ('E') if ($#av_paren_type < 0);
1711dd88ab32SMasahiro Yamada		print " <" . join('', @av_paren_type) .
1712dd88ab32SMasahiro Yamada				"> <$type> <$av_pending>" if ($dbg_values > 1);
1713dd88ab32SMasahiro Yamada		if ($cur =~ /^(\s+)/o) {
1714dd88ab32SMasahiro Yamada			print "WS($1)\n" if ($dbg_values > 1);
1715dd88ab32SMasahiro Yamada			if ($1 =~ /\n/ && $av_preprocessor) {
1716dd88ab32SMasahiro Yamada				$type = pop(@av_paren_type);
1717dd88ab32SMasahiro Yamada				$av_preprocessor = 0;
1718dd88ab32SMasahiro Yamada			}
1719dd88ab32SMasahiro Yamada
1720dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
1721dd88ab32SMasahiro Yamada			print "CAST($1)\n" if ($dbg_values > 1);
1722dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1723dd88ab32SMasahiro Yamada			$type = 'c';
1724dd88ab32SMasahiro Yamada
1725dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
1726dd88ab32SMasahiro Yamada			print "DECLARE($1)\n" if ($dbg_values > 1);
1727dd88ab32SMasahiro Yamada			$type = 'T';
1728dd88ab32SMasahiro Yamada
1729dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Modifier)\s*/) {
1730dd88ab32SMasahiro Yamada			print "MODIFIER($1)\n" if ($dbg_values > 1);
1731dd88ab32SMasahiro Yamada			$type = 'T';
1732dd88ab32SMasahiro Yamada
1733dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
1734dd88ab32SMasahiro Yamada			print "DEFINE($1,$2)\n" if ($dbg_values > 1);
1735dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1736dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1737dd88ab32SMasahiro Yamada			if ($2 ne '') {
1738dd88ab32SMasahiro Yamada				$av_pending = 'N';
1739dd88ab32SMasahiro Yamada			}
1740dd88ab32SMasahiro Yamada			$type = 'E';
1741dd88ab32SMasahiro Yamada
1742dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
1743dd88ab32SMasahiro Yamada			print "UNDEF($1)\n" if ($dbg_values > 1);
1744dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1745dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1746dd88ab32SMasahiro Yamada
1747dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
1748dd88ab32SMasahiro Yamada			print "PRE_START($1)\n" if ($dbg_values > 1);
1749dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1750dd88ab32SMasahiro Yamada
1751dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1752dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1753dd88ab32SMasahiro Yamada			$type = 'E';
1754dd88ab32SMasahiro Yamada
1755dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
1756dd88ab32SMasahiro Yamada			print "PRE_RESTART($1)\n" if ($dbg_values > 1);
1757dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1758dd88ab32SMasahiro Yamada
1759dd88ab32SMasahiro Yamada			push(@av_paren_type, $av_paren_type[$#av_paren_type]);
1760dd88ab32SMasahiro Yamada
1761dd88ab32SMasahiro Yamada			$type = 'E';
1762dd88ab32SMasahiro Yamada
1763dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
1764dd88ab32SMasahiro Yamada			print "PRE_END($1)\n" if ($dbg_values > 1);
1765dd88ab32SMasahiro Yamada
1766dd88ab32SMasahiro Yamada			$av_preprocessor = 1;
1767dd88ab32SMasahiro Yamada
1768dd88ab32SMasahiro Yamada			# Assume all arms of the conditional end as this
1769dd88ab32SMasahiro Yamada			# one does, and continue as if the #endif was not here.
1770dd88ab32SMasahiro Yamada			pop(@av_paren_type);
1771dd88ab32SMasahiro Yamada			push(@av_paren_type, $type);
1772dd88ab32SMasahiro Yamada			$type = 'E';
1773dd88ab32SMasahiro Yamada
1774dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\\\n)/o) {
1775dd88ab32SMasahiro Yamada			print "PRECONT($1)\n" if ($dbg_values > 1);
1776dd88ab32SMasahiro Yamada
1777dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
1778dd88ab32SMasahiro Yamada			print "ATTR($1)\n" if ($dbg_values > 1);
1779dd88ab32SMasahiro Yamada			$av_pending = $type;
1780dd88ab32SMasahiro Yamada			$type = 'N';
1781dd88ab32SMasahiro Yamada
1782dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
1783dd88ab32SMasahiro Yamada			print "SIZEOF($1)\n" if ($dbg_values > 1);
1784dd88ab32SMasahiro Yamada			if (defined $2) {
1785dd88ab32SMasahiro Yamada				$av_pending = 'V';
1786dd88ab32SMasahiro Yamada			}
1787dd88ab32SMasahiro Yamada			$type = 'N';
1788dd88ab32SMasahiro Yamada
1789dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(if|while|for)\b/o) {
1790dd88ab32SMasahiro Yamada			print "COND($1)\n" if ($dbg_values > 1);
1791dd88ab32SMasahiro Yamada			$av_pending = 'E';
1792dd88ab32SMasahiro Yamada			$type = 'N';
1793dd88ab32SMasahiro Yamada
1794dd88ab32SMasahiro Yamada		} elsif ($cur =~/^(case)/o) {
1795dd88ab32SMasahiro Yamada			print "CASE($1)\n" if ($dbg_values > 1);
1796dd88ab32SMasahiro Yamada			$av_pend_colon = 'C';
1797dd88ab32SMasahiro Yamada			$type = 'N';
1798dd88ab32SMasahiro Yamada
1799dd88ab32SMasahiro Yamada		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
1800dd88ab32SMasahiro Yamada			print "KEYWORD($1)\n" if ($dbg_values > 1);
1801dd88ab32SMasahiro Yamada			$type = 'N';
1802dd88ab32SMasahiro Yamada
1803dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\()/o) {
1804dd88ab32SMasahiro Yamada			print "PAREN('$1')\n" if ($dbg_values > 1);
1805dd88ab32SMasahiro Yamada			push(@av_paren_type, $av_pending);
1806dd88ab32SMasahiro Yamada			$av_pending = '_';
1807dd88ab32SMasahiro Yamada			$type = 'N';
1808dd88ab32SMasahiro Yamada
1809dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\))/o) {
1810dd88ab32SMasahiro Yamada			my $new_type = pop(@av_paren_type);
1811dd88ab32SMasahiro Yamada			if ($new_type ne '_') {
1812dd88ab32SMasahiro Yamada				$type = $new_type;
1813dd88ab32SMasahiro Yamada				print "PAREN('$1') -> $type\n"
1814dd88ab32SMasahiro Yamada							if ($dbg_values > 1);
1815dd88ab32SMasahiro Yamada			} else {
1816dd88ab32SMasahiro Yamada				print "PAREN('$1')\n" if ($dbg_values > 1);
1817dd88ab32SMasahiro Yamada			}
1818dd88ab32SMasahiro Yamada
1819dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Ident)\s*\(/o) {
1820dd88ab32SMasahiro Yamada			print "FUNC($1)\n" if ($dbg_values > 1);
1821dd88ab32SMasahiro Yamada			$type = 'V';
1822dd88ab32SMasahiro Yamada			$av_pending = 'V';
1823dd88ab32SMasahiro Yamada
1824dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
1825dd88ab32SMasahiro Yamada			if (defined $2 && $type eq 'C' || $type eq 'T') {
1826dd88ab32SMasahiro Yamada				$av_pend_colon = 'B';
1827dd88ab32SMasahiro Yamada			} elsif ($type eq 'E') {
1828dd88ab32SMasahiro Yamada				$av_pend_colon = 'L';
1829dd88ab32SMasahiro Yamada			}
1830dd88ab32SMasahiro Yamada			print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
1831dd88ab32SMasahiro Yamada			$type = 'V';
1832dd88ab32SMasahiro Yamada
1833dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Ident|$Constant)/o) {
1834dd88ab32SMasahiro Yamada			print "IDENT($1)\n" if ($dbg_values > 1);
1835dd88ab32SMasahiro Yamada			$type = 'V';
1836dd88ab32SMasahiro Yamada
1837dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Assignment)/o) {
1838dd88ab32SMasahiro Yamada			print "ASSIGN($1)\n" if ($dbg_values > 1);
1839dd88ab32SMasahiro Yamada			$type = 'N';
1840dd88ab32SMasahiro Yamada
1841dd88ab32SMasahiro Yamada		} elsif ($cur =~/^(;|{|})/) {
1842dd88ab32SMasahiro Yamada			print "END($1)\n" if ($dbg_values > 1);
1843dd88ab32SMasahiro Yamada			$type = 'E';
1844dd88ab32SMasahiro Yamada			$av_pend_colon = 'O';
1845dd88ab32SMasahiro Yamada
1846dd88ab32SMasahiro Yamada		} elsif ($cur =~/^(,)/) {
1847dd88ab32SMasahiro Yamada			print "COMMA($1)\n" if ($dbg_values > 1);
1848dd88ab32SMasahiro Yamada			$type = 'C';
1849dd88ab32SMasahiro Yamada
1850dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\?)/o) {
1851dd88ab32SMasahiro Yamada			print "QUESTION($1)\n" if ($dbg_values > 1);
1852dd88ab32SMasahiro Yamada			$type = 'N';
1853dd88ab32SMasahiro Yamada
1854dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(:)/o) {
1855dd88ab32SMasahiro Yamada			print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
1856dd88ab32SMasahiro Yamada
1857dd88ab32SMasahiro Yamada			substr($var, length($res), 1, $av_pend_colon);
1858dd88ab32SMasahiro Yamada			if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
1859dd88ab32SMasahiro Yamada				$type = 'E';
1860dd88ab32SMasahiro Yamada			} else {
1861dd88ab32SMasahiro Yamada				$type = 'N';
1862dd88ab32SMasahiro Yamada			}
1863dd88ab32SMasahiro Yamada			$av_pend_colon = 'O';
1864dd88ab32SMasahiro Yamada
1865dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(\[)/o) {
1866dd88ab32SMasahiro Yamada			print "CLOSE($1)\n" if ($dbg_values > 1);
1867dd88ab32SMasahiro Yamada			$type = 'N';
1868dd88ab32SMasahiro Yamada
1869dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
1870dd88ab32SMasahiro Yamada			my $variant;
1871dd88ab32SMasahiro Yamada
1872dd88ab32SMasahiro Yamada			print "OPV($1)\n" if ($dbg_values > 1);
1873dd88ab32SMasahiro Yamada			if ($type eq 'V') {
1874dd88ab32SMasahiro Yamada				$variant = 'B';
1875dd88ab32SMasahiro Yamada			} else {
1876dd88ab32SMasahiro Yamada				$variant = 'U';
1877dd88ab32SMasahiro Yamada			}
1878dd88ab32SMasahiro Yamada
1879dd88ab32SMasahiro Yamada			substr($var, length($res), 1, $variant);
1880dd88ab32SMasahiro Yamada			$type = 'N';
1881dd88ab32SMasahiro Yamada
1882dd88ab32SMasahiro Yamada		} elsif ($cur =~ /^($Operators)/o) {
1883dd88ab32SMasahiro Yamada			print "OP($1)\n" if ($dbg_values > 1);
1884dd88ab32SMasahiro Yamada			if ($1 ne '++' && $1 ne '--') {
1885dd88ab32SMasahiro Yamada				$type = 'N';
1886dd88ab32SMasahiro Yamada			}
1887dd88ab32SMasahiro Yamada
1888dd88ab32SMasahiro Yamada		} elsif ($cur =~ /(^.)/o) {
1889dd88ab32SMasahiro Yamada			print "C($1)\n" if ($dbg_values > 1);
1890dd88ab32SMasahiro Yamada		}
1891dd88ab32SMasahiro Yamada		if (defined $1) {
1892dd88ab32SMasahiro Yamada			$cur = substr($cur, length($1));
1893dd88ab32SMasahiro Yamada			$res .= $type x length($1);
1894dd88ab32SMasahiro Yamada		}
1895dd88ab32SMasahiro Yamada	}
1896dd88ab32SMasahiro Yamada
1897dd88ab32SMasahiro Yamada	return ($res, $var);
1898dd88ab32SMasahiro Yamada}
1899dd88ab32SMasahiro Yamada
1900dd88ab32SMasahiro Yamadasub possible {
1901dd88ab32SMasahiro Yamada	my ($possible, $line) = @_;
1902dd88ab32SMasahiro Yamada	my $notPermitted = qr{(?:
1903dd88ab32SMasahiro Yamada		^(?:
1904dd88ab32SMasahiro Yamada			$Modifier|
1905dd88ab32SMasahiro Yamada			$Storage|
1906dd88ab32SMasahiro Yamada			$Type|
1907dd88ab32SMasahiro Yamada			DEFINE_\S+
1908dd88ab32SMasahiro Yamada		)$|
1909dd88ab32SMasahiro Yamada		^(?:
1910dd88ab32SMasahiro Yamada			goto|
1911dd88ab32SMasahiro Yamada			return|
1912dd88ab32SMasahiro Yamada			case|
1913dd88ab32SMasahiro Yamada			else|
1914dd88ab32SMasahiro Yamada			asm|__asm__|
1915dd88ab32SMasahiro Yamada			do|
1916dd88ab32SMasahiro Yamada			\#|
1917dd88ab32SMasahiro Yamada			\#\#|
1918dd88ab32SMasahiro Yamada		)(?:\s|$)|
1919dd88ab32SMasahiro Yamada		^(?:typedef|struct|enum)\b
1920dd88ab32SMasahiro Yamada	    )}x;
1921dd88ab32SMasahiro Yamada	warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
1922dd88ab32SMasahiro Yamada	if ($possible !~ $notPermitted) {
1923dd88ab32SMasahiro Yamada		# Check for modifiers.
1924dd88ab32SMasahiro Yamada		$possible =~ s/\s*$Storage\s*//g;
1925dd88ab32SMasahiro Yamada		$possible =~ s/\s*$Sparse\s*//g;
1926dd88ab32SMasahiro Yamada		if ($possible =~ /^\s*$/) {
1927dd88ab32SMasahiro Yamada
1928dd88ab32SMasahiro Yamada		} elsif ($possible =~ /\s/) {
1929dd88ab32SMasahiro Yamada			$possible =~ s/\s*$Type\s*//g;
1930dd88ab32SMasahiro Yamada			for my $modifier (split(' ', $possible)) {
1931dd88ab32SMasahiro Yamada				if ($modifier !~ $notPermitted) {
1932dd88ab32SMasahiro Yamada					warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
19336305db96SHeinrich Schuchardt					push(@modifierListFile, $modifier);
1934dd88ab32SMasahiro Yamada				}
1935dd88ab32SMasahiro Yamada			}
1936dd88ab32SMasahiro Yamada
1937dd88ab32SMasahiro Yamada		} else {
1938dd88ab32SMasahiro Yamada			warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
19396305db96SHeinrich Schuchardt			push(@typeListFile, $possible);
1940dd88ab32SMasahiro Yamada		}
1941dd88ab32SMasahiro Yamada		build_types();
1942dd88ab32SMasahiro Yamada	} else {
1943dd88ab32SMasahiro Yamada		warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
1944dd88ab32SMasahiro Yamada	}
1945dd88ab32SMasahiro Yamada}
1946dd88ab32SMasahiro Yamada
1947dd88ab32SMasahiro Yamadamy $prefix = '';
1948dd88ab32SMasahiro Yamada
1949dd88ab32SMasahiro Yamadasub show_type {
19506305db96SHeinrich Schuchardt	my ($type) = @_;
19516b9709d9STom Rini
19526305db96SHeinrich Schuchardt	$type =~ tr/[a-z]/[A-Z]/;
19536305db96SHeinrich Schuchardt
19546305db96SHeinrich Schuchardt	return defined $use_type{$type} if (scalar keys %use_type > 0);
19556305db96SHeinrich Schuchardt
19566305db96SHeinrich Schuchardt	return !defined $ignore_type{$type};
1957dd88ab32SMasahiro Yamada}
1958dd88ab32SMasahiro Yamada
1959dd88ab32SMasahiro Yamadasub report {
19606305db96SHeinrich Schuchardt	my ($level, $type, $msg) = @_;
19616305db96SHeinrich Schuchardt
19626305db96SHeinrich Schuchardt	if (!show_type($type) ||
19636305db96SHeinrich Schuchardt	    (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
1964dd88ab32SMasahiro Yamada		return 0;
1965dd88ab32SMasahiro Yamada	}
19666305db96SHeinrich Schuchardt	my $output = '';
19676305db96SHeinrich Schuchardt	if ($color) {
19686305db96SHeinrich Schuchardt		if ($level eq 'ERROR') {
19696305db96SHeinrich Schuchardt			$output .= RED;
19706305db96SHeinrich Schuchardt		} elsif ($level eq 'WARNING') {
19716305db96SHeinrich Schuchardt			$output .= YELLOW;
1972dd88ab32SMasahiro Yamada		} else {
19736305db96SHeinrich Schuchardt			$output .= GREEN;
1974dd88ab32SMasahiro Yamada		}
19756305db96SHeinrich Schuchardt	}
19766305db96SHeinrich Schuchardt	$output .= $prefix . $level . ':';
19776305db96SHeinrich Schuchardt	if ($show_types) {
19786305db96SHeinrich Schuchardt		$output .= BLUE if ($color);
19796305db96SHeinrich Schuchardt		$output .= "$type:";
19806305db96SHeinrich Schuchardt	}
19816305db96SHeinrich Schuchardt	$output .= RESET if ($color);
19826305db96SHeinrich Schuchardt	$output .= ' ' . $msg . "\n";
1983dd88ab32SMasahiro Yamada
19846305db96SHeinrich Schuchardt	if ($showfile) {
19856305db96SHeinrich Schuchardt		my @lines = split("\n", $output, -1);
19866305db96SHeinrich Schuchardt		splice(@lines, 1, 1);
19876305db96SHeinrich Schuchardt		$output = join("\n", @lines);
19886305db96SHeinrich Schuchardt	}
19896305db96SHeinrich Schuchardt	$output = (split('\n', $output))[0] . "\n" if ($terse);
19906305db96SHeinrich Schuchardt
19916305db96SHeinrich Schuchardt	push(our @report, $output);
1992dd88ab32SMasahiro Yamada
1993dd88ab32SMasahiro Yamada	return 1;
1994dd88ab32SMasahiro Yamada}
19956305db96SHeinrich Schuchardt
1996dd88ab32SMasahiro Yamadasub report_dump {
1997dd88ab32SMasahiro Yamada	our @report;
1998dd88ab32SMasahiro Yamada}
1999dd88ab32SMasahiro Yamada
20006305db96SHeinrich Schuchardtsub fixup_current_range {
20016305db96SHeinrich Schuchardt	my ($lineRef, $offset, $length) = @_;
20026305db96SHeinrich Schuchardt
20036305db96SHeinrich Schuchardt	if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) {
20046305db96SHeinrich Schuchardt		my $o = $1;
20056305db96SHeinrich Schuchardt		my $l = $2;
20066305db96SHeinrich Schuchardt		my $no = $o + $offset;
20076305db96SHeinrich Schuchardt		my $nl = $l + $length;
20086305db96SHeinrich Schuchardt		$$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/;
20096305db96SHeinrich Schuchardt	}
20106305db96SHeinrich Schuchardt}
20116305db96SHeinrich Schuchardt
20126305db96SHeinrich Schuchardtsub fix_inserted_deleted_lines {
20136305db96SHeinrich Schuchardt	my ($linesRef, $insertedRef, $deletedRef) = @_;
20146305db96SHeinrich Schuchardt
20156305db96SHeinrich Schuchardt	my $range_last_linenr = 0;
20166305db96SHeinrich Schuchardt	my $delta_offset = 0;
20176305db96SHeinrich Schuchardt
20186305db96SHeinrich Schuchardt	my $old_linenr = 0;
20196305db96SHeinrich Schuchardt	my $new_linenr = 0;
20206305db96SHeinrich Schuchardt
20216305db96SHeinrich Schuchardt	my $next_insert = 0;
20226305db96SHeinrich Schuchardt	my $next_delete = 0;
20236305db96SHeinrich Schuchardt
20246305db96SHeinrich Schuchardt	my @lines = ();
20256305db96SHeinrich Schuchardt
20266305db96SHeinrich Schuchardt	my $inserted = @{$insertedRef}[$next_insert++];
20276305db96SHeinrich Schuchardt	my $deleted = @{$deletedRef}[$next_delete++];
20286305db96SHeinrich Schuchardt
20296305db96SHeinrich Schuchardt	foreach my $old_line (@{$linesRef}) {
20306305db96SHeinrich Schuchardt		my $save_line = 1;
20316305db96SHeinrich Schuchardt		my $line = $old_line;	#don't modify the array
20326305db96SHeinrich Schuchardt		if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) {	#new filename
20336305db96SHeinrich Schuchardt			$delta_offset = 0;
20346305db96SHeinrich Schuchardt		} elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) {	#new hunk
20356305db96SHeinrich Schuchardt			$range_last_linenr = $new_linenr;
20366305db96SHeinrich Schuchardt			fixup_current_range(\$line, $delta_offset, 0);
20376305db96SHeinrich Schuchardt		}
20386305db96SHeinrich Schuchardt
20396305db96SHeinrich Schuchardt		while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) {
20406305db96SHeinrich Schuchardt			$deleted = @{$deletedRef}[$next_delete++];
20416305db96SHeinrich Schuchardt			$save_line = 0;
20426305db96SHeinrich Schuchardt			fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1);
20436305db96SHeinrich Schuchardt		}
20446305db96SHeinrich Schuchardt
20456305db96SHeinrich Schuchardt		while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) {
20466305db96SHeinrich Schuchardt			push(@lines, ${$inserted}{'LINE'});
20476305db96SHeinrich Schuchardt			$inserted = @{$insertedRef}[$next_insert++];
20486305db96SHeinrich Schuchardt			$new_linenr++;
20496305db96SHeinrich Schuchardt			fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1);
20506305db96SHeinrich Schuchardt		}
20516305db96SHeinrich Schuchardt
20526305db96SHeinrich Schuchardt		if ($save_line) {
20536305db96SHeinrich Schuchardt			push(@lines, $line);
20546305db96SHeinrich Schuchardt			$new_linenr++;
20556305db96SHeinrich Schuchardt		}
20566305db96SHeinrich Schuchardt
20576305db96SHeinrich Schuchardt		$old_linenr++;
20586305db96SHeinrich Schuchardt	}
20596305db96SHeinrich Schuchardt
20606305db96SHeinrich Schuchardt	return @lines;
20616305db96SHeinrich Schuchardt}
20626305db96SHeinrich Schuchardt
20636305db96SHeinrich Schuchardtsub fix_insert_line {
20646305db96SHeinrich Schuchardt	my ($linenr, $line) = @_;
20656305db96SHeinrich Schuchardt
20666305db96SHeinrich Schuchardt	my $inserted = {
20676305db96SHeinrich Schuchardt		LINENR => $linenr,
20686305db96SHeinrich Schuchardt		LINE => $line,
20696305db96SHeinrich Schuchardt	};
20706305db96SHeinrich Schuchardt	push(@fixed_inserted, $inserted);
20716305db96SHeinrich Schuchardt}
20726305db96SHeinrich Schuchardt
20736305db96SHeinrich Schuchardtsub fix_delete_line {
20746305db96SHeinrich Schuchardt	my ($linenr, $line) = @_;
20756305db96SHeinrich Schuchardt
20766305db96SHeinrich Schuchardt	my $deleted = {
20776305db96SHeinrich Schuchardt		LINENR => $linenr,
20786305db96SHeinrich Schuchardt		LINE => $line,
20796305db96SHeinrich Schuchardt	};
20806305db96SHeinrich Schuchardt
20816305db96SHeinrich Schuchardt	push(@fixed_deleted, $deleted);
20826305db96SHeinrich Schuchardt}
20836305db96SHeinrich Schuchardt
2084dd88ab32SMasahiro Yamadasub ERROR {
20856305db96SHeinrich Schuchardt	my ($type, $msg) = @_;
20866305db96SHeinrich Schuchardt
20876305db96SHeinrich Schuchardt	if (report("ERROR", $type, $msg)) {
2088dd88ab32SMasahiro Yamada		our $clean = 0;
2089dd88ab32SMasahiro Yamada		our $cnt_error++;
20906b9709d9STom Rini		return 1;
2091dd88ab32SMasahiro Yamada	}
20926b9709d9STom Rini	return 0;
2093dd88ab32SMasahiro Yamada}
2094dd88ab32SMasahiro Yamadasub WARN {
20956305db96SHeinrich Schuchardt	my ($type, $msg) = @_;
20966305db96SHeinrich Schuchardt
20976305db96SHeinrich Schuchardt	if (report("WARNING", $type, $msg)) {
2098dd88ab32SMasahiro Yamada		our $clean = 0;
2099dd88ab32SMasahiro Yamada		our $cnt_warn++;
21006b9709d9STom Rini		return 1;
2101dd88ab32SMasahiro Yamada	}
21026b9709d9STom Rini	return 0;
2103dd88ab32SMasahiro Yamada}
2104dd88ab32SMasahiro Yamadasub CHK {
21056305db96SHeinrich Schuchardt	my ($type, $msg) = @_;
21066305db96SHeinrich Schuchardt
21076305db96SHeinrich Schuchardt	if ($check && report("CHECK", $type, $msg)) {
2108dd88ab32SMasahiro Yamada		our $clean = 0;
2109dd88ab32SMasahiro Yamada		our $cnt_chk++;
21106b9709d9STom Rini		return 1;
2111dd88ab32SMasahiro Yamada	}
21126b9709d9STom Rini	return 0;
2113dd88ab32SMasahiro Yamada}
2114dd88ab32SMasahiro Yamada
2115dd88ab32SMasahiro Yamadasub check_absolute_file {
2116dd88ab32SMasahiro Yamada	my ($absolute, $herecurr) = @_;
2117dd88ab32SMasahiro Yamada	my $file = $absolute;
2118dd88ab32SMasahiro Yamada
2119dd88ab32SMasahiro Yamada	##print "absolute<$absolute>\n";
2120dd88ab32SMasahiro Yamada
2121dd88ab32SMasahiro Yamada	# See if any suffix of this path is a path within the tree.
2122dd88ab32SMasahiro Yamada	while ($file =~ s@^[^/]*/@@) {
2123dd88ab32SMasahiro Yamada		if (-f "$root/$file") {
2124dd88ab32SMasahiro Yamada			##print "file<$file>\n";
2125dd88ab32SMasahiro Yamada			last;
2126dd88ab32SMasahiro Yamada		}
2127dd88ab32SMasahiro Yamada	}
2128dd88ab32SMasahiro Yamada	if (! -f _)  {
2129dd88ab32SMasahiro Yamada		return 0;
2130dd88ab32SMasahiro Yamada	}
2131dd88ab32SMasahiro Yamada
2132dd88ab32SMasahiro Yamada	# It is, so see if the prefix is acceptable.
2133dd88ab32SMasahiro Yamada	my $prefix = $absolute;
2134dd88ab32SMasahiro Yamada	substr($prefix, -length($file)) = '';
2135dd88ab32SMasahiro Yamada
2136dd88ab32SMasahiro Yamada	##print "prefix<$prefix>\n";
2137dd88ab32SMasahiro Yamada	if ($prefix ne ".../") {
2138dd88ab32SMasahiro Yamada		WARN("USE_RELATIVE_PATH",
2139dd88ab32SMasahiro Yamada		     "use relative pathname instead of absolute in changelog text\n" . $herecurr);
2140dd88ab32SMasahiro Yamada	}
2141dd88ab32SMasahiro Yamada}
2142dd88ab32SMasahiro Yamada
21436b9709d9STom Rinisub trim {
21446b9709d9STom Rini	my ($string) = @_;
21456b9709d9STom Rini
21466b9709d9STom Rini	$string =~ s/^\s+|\s+$//g;
21476b9709d9STom Rini
21486b9709d9STom Rini	return $string;
21496b9709d9STom Rini}
21506b9709d9STom Rini
21516b9709d9STom Rinisub ltrim {
21526b9709d9STom Rini	my ($string) = @_;
21536b9709d9STom Rini
21546b9709d9STom Rini	$string =~ s/^\s+//;
21556b9709d9STom Rini
21566b9709d9STom Rini	return $string;
21576b9709d9STom Rini}
21586b9709d9STom Rini
21596b9709d9STom Rinisub rtrim {
21606b9709d9STom Rini	my ($string) = @_;
21616b9709d9STom Rini
21626b9709d9STom Rini	$string =~ s/\s+$//;
21636b9709d9STom Rini
21646b9709d9STom Rini	return $string;
21656b9709d9STom Rini}
21666b9709d9STom Rini
21676b9709d9STom Rinisub string_find_replace {
21686b9709d9STom Rini	my ($string, $find, $replace) = @_;
21696b9709d9STom Rini
21706b9709d9STom Rini	$string =~ s/$find/$replace/g;
21716b9709d9STom Rini
21726b9709d9STom Rini	return $string;
21736b9709d9STom Rini}
21746b9709d9STom Rini
21756b9709d9STom Rinisub tabify {
21766b9709d9STom Rini	my ($leading) = @_;
21776b9709d9STom Rini
21786b9709d9STom Rini	my $source_indent = 8;
21796b9709d9STom Rini	my $max_spaces_before_tab = $source_indent - 1;
21806b9709d9STom Rini	my $spaces_to_tab = " " x $source_indent;
21816b9709d9STom Rini
21826b9709d9STom Rini	#convert leading spaces to tabs
21836b9709d9STom Rini	1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
21846b9709d9STom Rini	#Remove spaces before a tab
21856b9709d9STom Rini	1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
21866b9709d9STom Rini
21876b9709d9STom Rini	return "$leading";
21886b9709d9STom Rini}
21896b9709d9STom Rini
2190dd88ab32SMasahiro Yamadasub pos_last_openparen {
2191dd88ab32SMasahiro Yamada	my ($line) = @_;
2192dd88ab32SMasahiro Yamada
2193dd88ab32SMasahiro Yamada	my $pos = 0;
2194dd88ab32SMasahiro Yamada
2195dd88ab32SMasahiro Yamada	my $opens = $line =~ tr/\(/\(/;
2196dd88ab32SMasahiro Yamada	my $closes = $line =~ tr/\)/\)/;
2197dd88ab32SMasahiro Yamada
2198dd88ab32SMasahiro Yamada	my $last_openparen = 0;
2199dd88ab32SMasahiro Yamada
2200dd88ab32SMasahiro Yamada	if (($opens == 0) || ($closes >= $opens)) {
2201dd88ab32SMasahiro Yamada		return -1;
2202dd88ab32SMasahiro Yamada	}
2203dd88ab32SMasahiro Yamada
2204dd88ab32SMasahiro Yamada	my $len = length($line);
2205dd88ab32SMasahiro Yamada
2206dd88ab32SMasahiro Yamada	for ($pos = 0; $pos < $len; $pos++) {
2207dd88ab32SMasahiro Yamada		my $string = substr($line, $pos);
2208dd88ab32SMasahiro Yamada		if ($string =~ /^($FuncArg|$balanced_parens)/) {
2209dd88ab32SMasahiro Yamada			$pos += length($1) - 1;
2210dd88ab32SMasahiro Yamada		} elsif (substr($line, $pos, 1) eq '(') {
2211dd88ab32SMasahiro Yamada			$last_openparen = $pos;
2212dd88ab32SMasahiro Yamada		} elsif (index($string, '(') == -1) {
2213dd88ab32SMasahiro Yamada			last;
2214dd88ab32SMasahiro Yamada		}
2215dd88ab32SMasahiro Yamada	}
2216dd88ab32SMasahiro Yamada
22176305db96SHeinrich Schuchardt	return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
2218dd88ab32SMasahiro Yamada}
2219dd88ab32SMasahiro Yamada
2220dd88ab32SMasahiro Yamadasub process {
2221dd88ab32SMasahiro Yamada	my $filename = shift;
2222dd88ab32SMasahiro Yamada
2223dd88ab32SMasahiro Yamada	my $linenr=0;
2224dd88ab32SMasahiro Yamada	my $prevline="";
2225dd88ab32SMasahiro Yamada	my $prevrawline="";
2226dd88ab32SMasahiro Yamada	my $stashline="";
2227dd88ab32SMasahiro Yamada	my $stashrawline="";
2228dd88ab32SMasahiro Yamada
2229dd88ab32SMasahiro Yamada	my $length;
2230dd88ab32SMasahiro Yamada	my $indent;
2231dd88ab32SMasahiro Yamada	my $previndent=0;
2232dd88ab32SMasahiro Yamada	my $stashindent=0;
2233dd88ab32SMasahiro Yamada
2234dd88ab32SMasahiro Yamada	our $clean = 1;
2235dd88ab32SMasahiro Yamada	my $signoff = 0;
2236dd88ab32SMasahiro Yamada	my $is_patch = 0;
22376305db96SHeinrich Schuchardt	my $in_header_lines = $file ? 0 : 1;
2238dd88ab32SMasahiro Yamada	my $in_commit_log = 0;		#Scanning lines before patch
22396305db96SHeinrich Schuchardt	my $has_commit_log = 0;		#Encountered lines before patch
22406305db96SHeinrich Schuchardt	my $commit_log_possible_stack_dump = 0;
22416305db96SHeinrich Schuchardt	my $commit_log_long_line = 0;
22426305db96SHeinrich Schuchardt	my $commit_log_has_diff = 0;
22436305db96SHeinrich Schuchardt	my $reported_maintainer_file = 0;
2244dd88ab32SMasahiro Yamada	my $non_utf8_charset = 0;
2245dd88ab32SMasahiro Yamada
22466305db96SHeinrich Schuchardt	my $last_blank_line = 0;
22476305db96SHeinrich Schuchardt	my $last_coalesced_string_linenr = -1;
22486305db96SHeinrich Schuchardt
2249dd88ab32SMasahiro Yamada	our @report = ();
2250dd88ab32SMasahiro Yamada	our $cnt_lines = 0;
2251dd88ab32SMasahiro Yamada	our $cnt_error = 0;
2252dd88ab32SMasahiro Yamada	our $cnt_warn = 0;
2253dd88ab32SMasahiro Yamada	our $cnt_chk = 0;
2254dd88ab32SMasahiro Yamada
2255dd88ab32SMasahiro Yamada	# Trace the real file/line as we go.
2256dd88ab32SMasahiro Yamada	my $realfile = '';
2257dd88ab32SMasahiro Yamada	my $realline = 0;
2258dd88ab32SMasahiro Yamada	my $realcnt = 0;
2259dd88ab32SMasahiro Yamada	my $here = '';
22606305db96SHeinrich Schuchardt	my $context_function;		#undef'd unless there's a known function
2261dd88ab32SMasahiro Yamada	my $in_comment = 0;
2262dd88ab32SMasahiro Yamada	my $comment_edge = 0;
2263dd88ab32SMasahiro Yamada	my $first_line = 0;
2264dd88ab32SMasahiro Yamada	my $p1_prefix = '';
2265dd88ab32SMasahiro Yamada
2266dd88ab32SMasahiro Yamada	my $prev_values = 'E';
2267dd88ab32SMasahiro Yamada
2268dd88ab32SMasahiro Yamada	# suppression flags
2269dd88ab32SMasahiro Yamada	my %suppress_ifbraces;
2270dd88ab32SMasahiro Yamada	my %suppress_whiletrailers;
2271dd88ab32SMasahiro Yamada	my %suppress_export;
2272dd88ab32SMasahiro Yamada	my $suppress_statement = 0;
2273dd88ab32SMasahiro Yamada
22746b9709d9STom Rini	my %signatures = ();
2275dd88ab32SMasahiro Yamada
2276dd88ab32SMasahiro Yamada	# Pre-scan the patch sanitizing the lines.
2277dd88ab32SMasahiro Yamada	# Pre-scan the patch looking for any __setup documentation.
2278dd88ab32SMasahiro Yamada	#
2279dd88ab32SMasahiro Yamada	my @setup_docs = ();
2280dd88ab32SMasahiro Yamada	my $setup_docs = 0;
2281dd88ab32SMasahiro Yamada
22826b9709d9STom Rini	my $camelcase_file_seeded = 0;
22836b9709d9STom Rini
2284*c398f2dfSHeinrich Schuchardt	my $checklicenseline = 1;
2285*c398f2dfSHeinrich Schuchardt
2286dd88ab32SMasahiro Yamada	sanitise_line_reset();
2287dd88ab32SMasahiro Yamada	my $line;
2288dd88ab32SMasahiro Yamada	foreach my $rawline (@rawlines) {
2289dd88ab32SMasahiro Yamada		$linenr++;
2290dd88ab32SMasahiro Yamada		$line = $rawline;
2291dd88ab32SMasahiro Yamada
22926b9709d9STom Rini		push(@fixed, $rawline) if ($fix);
22936b9709d9STom Rini
2294dd88ab32SMasahiro Yamada		if ($rawline=~/^\+\+\+\s+(\S+)/) {
2295dd88ab32SMasahiro Yamada			$setup_docs = 0;
22966305db96SHeinrich Schuchardt			if ($1 =~ m@Documentation/admin-guide/kernel-parameters.rst$@) {
2297dd88ab32SMasahiro Yamada				$setup_docs = 1;
2298dd88ab32SMasahiro Yamada			}
2299dd88ab32SMasahiro Yamada			#next;
2300dd88ab32SMasahiro Yamada		}
2301dd88ab32SMasahiro Yamada		if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
2302dd88ab32SMasahiro Yamada			$realline=$1-1;
2303dd88ab32SMasahiro Yamada			if (defined $2) {
2304dd88ab32SMasahiro Yamada				$realcnt=$3+1;
2305dd88ab32SMasahiro Yamada			} else {
2306dd88ab32SMasahiro Yamada				$realcnt=1+1;
2307dd88ab32SMasahiro Yamada			}
2308dd88ab32SMasahiro Yamada			$in_comment = 0;
2309dd88ab32SMasahiro Yamada
2310dd88ab32SMasahiro Yamada			# Guestimate if this is a continuing comment.  Run
2311dd88ab32SMasahiro Yamada			# the context looking for a comment "edge".  If this
2312dd88ab32SMasahiro Yamada			# edge is a close comment then we must be in a comment
2313dd88ab32SMasahiro Yamada			# at context start.
2314dd88ab32SMasahiro Yamada			my $edge;
2315dd88ab32SMasahiro Yamada			my $cnt = $realcnt;
2316dd88ab32SMasahiro Yamada			for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
2317dd88ab32SMasahiro Yamada				next if (defined $rawlines[$ln - 1] &&
2318dd88ab32SMasahiro Yamada					 $rawlines[$ln - 1] =~ /^-/);
2319dd88ab32SMasahiro Yamada				$cnt--;
2320dd88ab32SMasahiro Yamada				#print "RAW<$rawlines[$ln - 1]>\n";
2321dd88ab32SMasahiro Yamada				last if (!defined $rawlines[$ln - 1]);
2322dd88ab32SMasahiro Yamada				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
2323dd88ab32SMasahiro Yamada				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
2324dd88ab32SMasahiro Yamada					($edge) = $1;
2325dd88ab32SMasahiro Yamada					last;
2326dd88ab32SMasahiro Yamada				}
2327dd88ab32SMasahiro Yamada			}
2328dd88ab32SMasahiro Yamada			if (defined $edge && $edge eq '*/') {
2329dd88ab32SMasahiro Yamada				$in_comment = 1;
2330dd88ab32SMasahiro Yamada			}
2331dd88ab32SMasahiro Yamada
2332dd88ab32SMasahiro Yamada			# Guestimate if this is a continuing comment.  If this
2333dd88ab32SMasahiro Yamada			# is the start of a diff block and this line starts
2334dd88ab32SMasahiro Yamada			# ' *' then it is very likely a comment.
2335dd88ab32SMasahiro Yamada			if (!defined $edge &&
2336dd88ab32SMasahiro Yamada			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
2337dd88ab32SMasahiro Yamada			{
2338dd88ab32SMasahiro Yamada				$in_comment = 1;
2339dd88ab32SMasahiro Yamada			}
2340dd88ab32SMasahiro Yamada
2341dd88ab32SMasahiro Yamada			##print "COMMENT:$in_comment edge<$edge> $rawline\n";
2342dd88ab32SMasahiro Yamada			sanitise_line_reset($in_comment);
2343dd88ab32SMasahiro Yamada
2344dd88ab32SMasahiro Yamada		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
2345dd88ab32SMasahiro Yamada			# Standardise the strings and chars within the input to
2346dd88ab32SMasahiro Yamada			# simplify matching -- only bother with positive lines.
2347dd88ab32SMasahiro Yamada			$line = sanitise_line($rawline);
2348dd88ab32SMasahiro Yamada		}
2349dd88ab32SMasahiro Yamada		push(@lines, $line);
2350dd88ab32SMasahiro Yamada
2351dd88ab32SMasahiro Yamada		if ($realcnt > 1) {
2352dd88ab32SMasahiro Yamada			$realcnt-- if ($line =~ /^(?:\+| |$)/);
2353dd88ab32SMasahiro Yamada		} else {
2354dd88ab32SMasahiro Yamada			$realcnt = 0;
2355dd88ab32SMasahiro Yamada		}
2356dd88ab32SMasahiro Yamada
2357dd88ab32SMasahiro Yamada		#print "==>$rawline\n";
2358dd88ab32SMasahiro Yamada		#print "-->$line\n";
2359dd88ab32SMasahiro Yamada
2360dd88ab32SMasahiro Yamada		if ($setup_docs && $line =~ /^\+/) {
2361dd88ab32SMasahiro Yamada			push(@setup_docs, $line);
2362dd88ab32SMasahiro Yamada		}
2363dd88ab32SMasahiro Yamada	}
2364dd88ab32SMasahiro Yamada
2365dd88ab32SMasahiro Yamada	$prefix = '';
2366dd88ab32SMasahiro Yamada
2367dd88ab32SMasahiro Yamada	$realcnt = 0;
2368dd88ab32SMasahiro Yamada	$linenr = 0;
23696305db96SHeinrich Schuchardt	$fixlinenr = -1;
2370dd88ab32SMasahiro Yamada	foreach my $line (@lines) {
2371dd88ab32SMasahiro Yamada		$linenr++;
23726305db96SHeinrich Schuchardt		$fixlinenr++;
23736b9709d9STom Rini		my $sline = $line;	#copy of $line
23746b9709d9STom Rini		$sline =~ s/$;/ /g;	#with comments as spaces
2375dd88ab32SMasahiro Yamada
2376dd88ab32SMasahiro Yamada		my $rawline = $rawlines[$linenr - 1];
2377dd88ab32SMasahiro Yamada
2378dd88ab32SMasahiro Yamada#extract the line range in the file after the patch is applied
23796305db96SHeinrich Schuchardt		if (!$in_commit_log &&
23806305db96SHeinrich Schuchardt		    $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) {
23816305db96SHeinrich Schuchardt			my $context = $4;
2382dd88ab32SMasahiro Yamada			$is_patch = 1;
2383dd88ab32SMasahiro Yamada			$first_line = $linenr + 1;
2384dd88ab32SMasahiro Yamada			$realline=$1-1;
2385dd88ab32SMasahiro Yamada			if (defined $2) {
2386dd88ab32SMasahiro Yamada				$realcnt=$3+1;
2387dd88ab32SMasahiro Yamada			} else {
2388dd88ab32SMasahiro Yamada				$realcnt=1+1;
2389dd88ab32SMasahiro Yamada			}
2390dd88ab32SMasahiro Yamada			annotate_reset();
2391dd88ab32SMasahiro Yamada			$prev_values = 'E';
2392dd88ab32SMasahiro Yamada
2393dd88ab32SMasahiro Yamada			%suppress_ifbraces = ();
2394dd88ab32SMasahiro Yamada			%suppress_whiletrailers = ();
2395dd88ab32SMasahiro Yamada			%suppress_export = ();
2396dd88ab32SMasahiro Yamada			$suppress_statement = 0;
23976305db96SHeinrich Schuchardt			if ($context =~ /\b(\w+)\s*\(/) {
23986305db96SHeinrich Schuchardt				$context_function = $1;
23996305db96SHeinrich Schuchardt			} else {
24006305db96SHeinrich Schuchardt				undef $context_function;
24016305db96SHeinrich Schuchardt			}
2402dd88ab32SMasahiro Yamada			next;
2403dd88ab32SMasahiro Yamada
2404dd88ab32SMasahiro Yamada# track the line number as we move through the hunk, note that
2405dd88ab32SMasahiro Yamada# new versions of GNU diff omit the leading space on completely
2406dd88ab32SMasahiro Yamada# blank context lines so we need to count that too.
2407dd88ab32SMasahiro Yamada		} elsif ($line =~ /^( |\+|$)/) {
2408dd88ab32SMasahiro Yamada			$realline++;
2409dd88ab32SMasahiro Yamada			$realcnt-- if ($realcnt != 0);
2410dd88ab32SMasahiro Yamada
2411dd88ab32SMasahiro Yamada			# Measure the line length and indent.
2412dd88ab32SMasahiro Yamada			($length, $indent) = line_stats($rawline);
2413dd88ab32SMasahiro Yamada
2414dd88ab32SMasahiro Yamada			# Track the previous line.
2415dd88ab32SMasahiro Yamada			($prevline, $stashline) = ($stashline, $line);
2416dd88ab32SMasahiro Yamada			($previndent, $stashindent) = ($stashindent, $indent);
2417dd88ab32SMasahiro Yamada			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
2418dd88ab32SMasahiro Yamada
2419dd88ab32SMasahiro Yamada			#warn "line<$line>\n";
2420dd88ab32SMasahiro Yamada
2421dd88ab32SMasahiro Yamada		} elsif ($realcnt == 1) {
2422dd88ab32SMasahiro Yamada			$realcnt--;
2423dd88ab32SMasahiro Yamada		}
2424dd88ab32SMasahiro Yamada
2425dd88ab32SMasahiro Yamada		my $hunk_line = ($realcnt != 0);
2426dd88ab32SMasahiro Yamada
2427dd88ab32SMasahiro Yamada		$here = "#$linenr: " if (!$file);
2428dd88ab32SMasahiro Yamada		$here = "#$realline: " if ($file);
2429dd88ab32SMasahiro Yamada
24306305db96SHeinrich Schuchardt		my $found_file = 0;
2431dd88ab32SMasahiro Yamada		# extract the filename as it passes
2432dd88ab32SMasahiro Yamada		if ($line =~ /^diff --git.*?(\S+)$/) {
2433dd88ab32SMasahiro Yamada			$realfile = $1;
24346b9709d9STom Rini			$realfile =~ s@^([^/]*)/@@ if (!$file);
2435dd88ab32SMasahiro Yamada			$in_commit_log = 0;
24366305db96SHeinrich Schuchardt			$found_file = 1;
2437dd88ab32SMasahiro Yamada		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
2438dd88ab32SMasahiro Yamada			$realfile = $1;
24396b9709d9STom Rini			$realfile =~ s@^([^/]*)/@@ if (!$file);
2440dd88ab32SMasahiro Yamada			$in_commit_log = 0;
2441dd88ab32SMasahiro Yamada
2442dd88ab32SMasahiro Yamada			$p1_prefix = $1;
2443dd88ab32SMasahiro Yamada			if (!$file && $tree && $p1_prefix ne '' &&
2444dd88ab32SMasahiro Yamada			    -e "$root/$p1_prefix") {
2445dd88ab32SMasahiro Yamada				WARN("PATCH_PREFIX",
2446dd88ab32SMasahiro Yamada				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
2447dd88ab32SMasahiro Yamada			}
2448dd88ab32SMasahiro Yamada
2449dd88ab32SMasahiro Yamada			if ($realfile =~ m@^include/asm/@) {
2450dd88ab32SMasahiro Yamada				ERROR("MODIFIED_INCLUDE_ASM",
2451dd88ab32SMasahiro Yamada				      "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
2452dd88ab32SMasahiro Yamada			}
24536305db96SHeinrich Schuchardt			$found_file = 1;
24546305db96SHeinrich Schuchardt		}
24556305db96SHeinrich Schuchardt
24566305db96SHeinrich Schuchardt#make up the handle for any error we report on this line
24576305db96SHeinrich Schuchardt		if ($showfile) {
24586305db96SHeinrich Schuchardt			$prefix = "$realfile:$realline: "
24596305db96SHeinrich Schuchardt		} elsif ($emacs) {
24606305db96SHeinrich Schuchardt			if ($file) {
24616305db96SHeinrich Schuchardt				$prefix = "$filename:$realline: ";
24626305db96SHeinrich Schuchardt			} else {
24636305db96SHeinrich Schuchardt				$prefix = "$filename:$linenr: ";
24646305db96SHeinrich Schuchardt			}
24656305db96SHeinrich Schuchardt		}
24666305db96SHeinrich Schuchardt
24676305db96SHeinrich Schuchardt		if ($found_file) {
24686305db96SHeinrich Schuchardt			if (is_maintained_obsolete($realfile)) {
24696305db96SHeinrich Schuchardt				WARN("OBSOLETE",
24706305db96SHeinrich Schuchardt				     "$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy.  No unnecessary modifications please.\n");
24716305db96SHeinrich Schuchardt			}
24726305db96SHeinrich Schuchardt			if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
24736305db96SHeinrich Schuchardt				$check = 1;
24746305db96SHeinrich Schuchardt			} else {
24756305db96SHeinrich Schuchardt				$check = $check_orig;
24766305db96SHeinrich Schuchardt			}
2477*c398f2dfSHeinrich Schuchardt			$checklicenseline = 1;
2478dd88ab32SMasahiro Yamada			next;
2479dd88ab32SMasahiro Yamada		}
2480dd88ab32SMasahiro Yamada
2481dd88ab32SMasahiro Yamada		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
2482dd88ab32SMasahiro Yamada
2483dd88ab32SMasahiro Yamada		my $hereline = "$here\n$rawline\n";
2484dd88ab32SMasahiro Yamada		my $herecurr = "$here\n$rawline\n";
2485dd88ab32SMasahiro Yamada		my $hereprev = "$here\n$prevrawline\n$rawline\n";
2486dd88ab32SMasahiro Yamada
2487dd88ab32SMasahiro Yamada		$cnt_lines++ if ($realcnt != 0);
2488dd88ab32SMasahiro Yamada
24896305db96SHeinrich Schuchardt# Check if the commit log has what seems like a diff which can confuse patch
24906305db96SHeinrich Schuchardt		if ($in_commit_log && !$commit_log_has_diff &&
24916305db96SHeinrich Schuchardt		    (($line =~ m@^\s+diff\b.*a/[\w/]+@ &&
24926305db96SHeinrich Schuchardt		      $line =~ m@^\s+diff\b.*a/([\w/]+)\s+b/$1\b@) ||
24936305db96SHeinrich Schuchardt		     $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ ||
24946305db96SHeinrich Schuchardt		     $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) {
24956305db96SHeinrich Schuchardt			ERROR("DIFF_IN_COMMIT_MSG",
24966305db96SHeinrich Schuchardt			      "Avoid using diff content in the commit message - patch(1) might not work\n" . $herecurr);
24976305db96SHeinrich Schuchardt			$commit_log_has_diff = 1;
24986305db96SHeinrich Schuchardt		}
24996305db96SHeinrich Schuchardt
2500dd88ab32SMasahiro Yamada# Check for incorrect file permissions
2501dd88ab32SMasahiro Yamada		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
2502dd88ab32SMasahiro Yamada			my $permhere = $here . "FILE: $realfile\n";
25036b9709d9STom Rini			if ($realfile !~ m@scripts/@ &&
25046b9709d9STom Rini			    $realfile !~ /\.(py|pl|awk|sh)$/) {
2505dd88ab32SMasahiro Yamada				ERROR("EXECUTE_PERMISSIONS",
2506dd88ab32SMasahiro Yamada				      "do not set execute permissions for source files\n" . $permhere);
2507dd88ab32SMasahiro Yamada			}
2508dd88ab32SMasahiro Yamada		}
2509dd88ab32SMasahiro Yamada
2510dd88ab32SMasahiro Yamada# Check the patch for a signoff:
2511dd88ab32SMasahiro Yamada		if ($line =~ /^\s*signed-off-by:/i) {
2512dd88ab32SMasahiro Yamada			$signoff++;
2513dd88ab32SMasahiro Yamada			$in_commit_log = 0;
2514dd88ab32SMasahiro Yamada		}
2515dd88ab32SMasahiro Yamada
25166305db96SHeinrich Schuchardt# Check if MAINTAINERS is being updated.  If so, there's probably no need to
25176305db96SHeinrich Schuchardt# emit the "does MAINTAINERS need updating?" message on file add/move/delete
25186305db96SHeinrich Schuchardt		if ($line =~ /^\s*MAINTAINERS\s*\|/) {
25196305db96SHeinrich Schuchardt			$reported_maintainer_file = 1;
25206305db96SHeinrich Schuchardt		}
25216305db96SHeinrich Schuchardt
2522dd88ab32SMasahiro Yamada# Check signature styles
2523dd88ab32SMasahiro Yamada		if (!$in_header_lines &&
2524dd88ab32SMasahiro Yamada		    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
2525dd88ab32SMasahiro Yamada			my $space_before = $1;
2526dd88ab32SMasahiro Yamada			my $sign_off = $2;
2527dd88ab32SMasahiro Yamada			my $space_after = $3;
2528dd88ab32SMasahiro Yamada			my $email = $4;
2529dd88ab32SMasahiro Yamada			my $ucfirst_sign_off = ucfirst(lc($sign_off));
2530dd88ab32SMasahiro Yamada
2531dd88ab32SMasahiro Yamada			if ($sign_off !~ /$signature_tags/) {
2532dd88ab32SMasahiro Yamada				WARN("BAD_SIGN_OFF",
2533dd88ab32SMasahiro Yamada				     "Non-standard signature: $sign_off\n" . $herecurr);
2534dd88ab32SMasahiro Yamada			}
2535dd88ab32SMasahiro Yamada			if (defined $space_before && $space_before ne "") {
25366b9709d9STom Rini				if (WARN("BAD_SIGN_OFF",
25376b9709d9STom Rini					 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
25386b9709d9STom Rini				    $fix) {
25396305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =
25406b9709d9STom Rini					    "$ucfirst_sign_off $email";
25416b9709d9STom Rini				}
2542dd88ab32SMasahiro Yamada			}
2543dd88ab32SMasahiro Yamada			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
25446b9709d9STom Rini				if (WARN("BAD_SIGN_OFF",
25456b9709d9STom Rini					 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
25466b9709d9STom Rini				    $fix) {
25476305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =
25486b9709d9STom Rini					    "$ucfirst_sign_off $email";
25496b9709d9STom Rini				}
25506b9709d9STom Rini
2551dd88ab32SMasahiro Yamada			}
2552dd88ab32SMasahiro Yamada			if (!defined $space_after || $space_after ne " ") {
25536b9709d9STom Rini				if (WARN("BAD_SIGN_OFF",
25546b9709d9STom Rini					 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
25556b9709d9STom Rini				    $fix) {
25566305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =
25576b9709d9STom Rini					    "$ucfirst_sign_off $email";
25586b9709d9STom Rini				}
2559dd88ab32SMasahiro Yamada			}
2560dd88ab32SMasahiro Yamada
2561dd88ab32SMasahiro Yamada			my ($email_name, $email_address, $comment) = parse_email($email);
2562dd88ab32SMasahiro Yamada			my $suggested_email = format_email(($email_name, $email_address));
2563dd88ab32SMasahiro Yamada			if ($suggested_email eq "") {
2564dd88ab32SMasahiro Yamada				ERROR("BAD_SIGN_OFF",
2565dd88ab32SMasahiro Yamada				      "Unrecognized email address: '$email'\n" . $herecurr);
2566dd88ab32SMasahiro Yamada			} else {
2567dd88ab32SMasahiro Yamada				my $dequoted = $suggested_email;
2568dd88ab32SMasahiro Yamada				$dequoted =~ s/^"//;
2569dd88ab32SMasahiro Yamada				$dequoted =~ s/" </ </;
2570dd88ab32SMasahiro Yamada				# Don't force email to have quotes
2571dd88ab32SMasahiro Yamada				# Allow just an angle bracketed address
2572dd88ab32SMasahiro Yamada				if ("$dequoted$comment" ne $email &&
2573dd88ab32SMasahiro Yamada				    "<$email_address>$comment" ne $email &&
2574dd88ab32SMasahiro Yamada				    "$suggested_email$comment" ne $email) {
2575dd88ab32SMasahiro Yamada					WARN("BAD_SIGN_OFF",
2576dd88ab32SMasahiro Yamada					     "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
2577dd88ab32SMasahiro Yamada				}
2578dd88ab32SMasahiro Yamada			}
25796b9709d9STom Rini
25806b9709d9STom Rini# Check for duplicate signatures
25816b9709d9STom Rini			my $sig_nospace = $line;
25826b9709d9STom Rini			$sig_nospace =~ s/\s//g;
25836b9709d9STom Rini			$sig_nospace = lc($sig_nospace);
25846b9709d9STom Rini			if (defined $signatures{$sig_nospace}) {
25856b9709d9STom Rini				WARN("BAD_SIGN_OFF",
25866b9709d9STom Rini				     "Duplicate signature\n" . $herecurr);
25876b9709d9STom Rini			} else {
25886b9709d9STom Rini				$signatures{$sig_nospace} = 1;
25896b9709d9STom Rini			}
2590dd88ab32SMasahiro Yamada		}
2591dd88ab32SMasahiro Yamada
25926305db96SHeinrich Schuchardt# Check email subject for common tools that don't need to be mentioned
25936305db96SHeinrich Schuchardt		if ($in_header_lines &&
25946305db96SHeinrich Schuchardt		    $line =~ /^Subject:.*\b(?:checkpatch|sparse|smatch)\b[^:]/i) {
25956305db96SHeinrich Schuchardt			WARN("EMAIL_SUBJECT",
25966305db96SHeinrich Schuchardt			     "A patch subject line should describe the change not the tool that found it\n" . $herecurr);
25976305db96SHeinrich Schuchardt		}
25986305db96SHeinrich Schuchardt
25996305db96SHeinrich Schuchardt# Check for old stable address
26006305db96SHeinrich Schuchardt		if ($line =~ /^\s*cc:\s*.*<?\bstable\@kernel\.org\b>?.*$/i) {
26016305db96SHeinrich Schuchardt			ERROR("STABLE_ADDRESS",
26026305db96SHeinrich Schuchardt			      "The 'stable' address should be 'stable\@vger.kernel.org'\n" . $herecurr);
26036305db96SHeinrich Schuchardt		}
26046305db96SHeinrich Schuchardt
26056305db96SHeinrich Schuchardt# Check for unwanted Gerrit info
26066305db96SHeinrich Schuchardt		if ($in_commit_log && $line =~ /^\s*change-id:/i) {
26076305db96SHeinrich Schuchardt			ERROR("GERRIT_CHANGE_ID",
26086305db96SHeinrich Schuchardt			      "Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr);
26096305db96SHeinrich Schuchardt		}
26106305db96SHeinrich Schuchardt
26116305db96SHeinrich Schuchardt# Check if the commit log is in a possible stack dump
26126305db96SHeinrich Schuchardt		if ($in_commit_log && !$commit_log_possible_stack_dump &&
26136305db96SHeinrich Schuchardt		    ($line =~ /^\s*(?:WARNING:|BUG:)/ ||
26146305db96SHeinrich Schuchardt		     $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ ||
26156305db96SHeinrich Schuchardt					# timestamp
26166305db96SHeinrich Schuchardt		     $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/)) {
26176305db96SHeinrich Schuchardt					# stack dump address
26186305db96SHeinrich Schuchardt			$commit_log_possible_stack_dump = 1;
26196305db96SHeinrich Schuchardt		}
26206305db96SHeinrich Schuchardt
26216305db96SHeinrich Schuchardt# Check for line lengths > 75 in commit log, warn once
26226305db96SHeinrich Schuchardt		if ($in_commit_log && !$commit_log_long_line &&
26236305db96SHeinrich Schuchardt		    length($line) > 75 &&
26246305db96SHeinrich Schuchardt		    !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ ||
26256305db96SHeinrich Schuchardt					# file delta changes
26266305db96SHeinrich Schuchardt		      $line =~ /^\s*(?:[\w\.\-]+\/)++[\w\.\-]+:/ ||
26276305db96SHeinrich Schuchardt					# filename then :
26286305db96SHeinrich Schuchardt		      $line =~ /^\s*(?:Fixes:|Link:)/i ||
26296305db96SHeinrich Schuchardt					# A Fixes: or Link: line
26306305db96SHeinrich Schuchardt		      $commit_log_possible_stack_dump)) {
26316305db96SHeinrich Schuchardt			WARN("COMMIT_LOG_LONG_LINE",
26326305db96SHeinrich Schuchardt			     "Possible unwrapped commit description (prefer a maximum 75 chars per line)\n" . $herecurr);
26336305db96SHeinrich Schuchardt			$commit_log_long_line = 1;
26346305db96SHeinrich Schuchardt		}
26356305db96SHeinrich Schuchardt
26366305db96SHeinrich Schuchardt# Reset possible stack dump if a blank line is found
26376305db96SHeinrich Schuchardt		if ($in_commit_log && $commit_log_possible_stack_dump &&
26386305db96SHeinrich Schuchardt		    $line =~ /^\s*$/) {
26396305db96SHeinrich Schuchardt			$commit_log_possible_stack_dump = 0;
26406305db96SHeinrich Schuchardt		}
26416305db96SHeinrich Schuchardt
26426305db96SHeinrich Schuchardt# Check for git id commit length and improperly formed commit descriptions
26436305db96SHeinrich Schuchardt		if ($in_commit_log && !$commit_log_possible_stack_dump &&
26446305db96SHeinrich Schuchardt		    $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink):/i &&
26456305db96SHeinrich Schuchardt		    $line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
26466305db96SHeinrich Schuchardt		    ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
26476305db96SHeinrich Schuchardt		     ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
26486305db96SHeinrich Schuchardt		      $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
26496305db96SHeinrich Schuchardt		      $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
26506305db96SHeinrich Schuchardt			my $init_char = "c";
26516305db96SHeinrich Schuchardt			my $orig_commit = "";
26526305db96SHeinrich Schuchardt			my $short = 1;
26536305db96SHeinrich Schuchardt			my $long = 0;
26546305db96SHeinrich Schuchardt			my $case = 1;
26556305db96SHeinrich Schuchardt			my $space = 1;
26566305db96SHeinrich Schuchardt			my $hasdesc = 0;
26576305db96SHeinrich Schuchardt			my $hasparens = 0;
26586305db96SHeinrich Schuchardt			my $id = '0123456789ab';
26596305db96SHeinrich Schuchardt			my $orig_desc = "commit description";
26606305db96SHeinrich Schuchardt			my $description = "";
26616305db96SHeinrich Schuchardt
26626305db96SHeinrich Schuchardt			if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) {
26636305db96SHeinrich Schuchardt				$init_char = $1;
26646305db96SHeinrich Schuchardt				$orig_commit = lc($2);
26656305db96SHeinrich Schuchardt			} elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) {
26666305db96SHeinrich Schuchardt				$orig_commit = lc($1);
26676305db96SHeinrich Schuchardt			}
26686305db96SHeinrich Schuchardt
26696305db96SHeinrich Schuchardt			$short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i);
26706305db96SHeinrich Schuchardt			$long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i);
26716305db96SHeinrich Schuchardt			$space = 0 if ($line =~ /\bcommit [0-9a-f]/i);
26726305db96SHeinrich Schuchardt			$case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/);
26736305db96SHeinrich Schuchardt			if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) {
26746305db96SHeinrich Schuchardt				$orig_desc = $1;
26756305db96SHeinrich Schuchardt				$hasparens = 1;
26766305db96SHeinrich Schuchardt			} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i &&
26776305db96SHeinrich Schuchardt				 defined $rawlines[$linenr] &&
26786305db96SHeinrich Schuchardt				 $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) {
26796305db96SHeinrich Schuchardt				$orig_desc = $1;
26806305db96SHeinrich Schuchardt				$hasparens = 1;
26816305db96SHeinrich Schuchardt			} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i &&
26826305db96SHeinrich Schuchardt				 defined $rawlines[$linenr] &&
26836305db96SHeinrich Schuchardt				 $rawlines[$linenr] =~ /^\s*[^"]+"\)/) {
26846305db96SHeinrich Schuchardt				$line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i;
26856305db96SHeinrich Schuchardt				$orig_desc = $1;
26866305db96SHeinrich Schuchardt				$rawlines[$linenr] =~ /^\s*([^"]+)"\)/;
26876305db96SHeinrich Schuchardt				$orig_desc .= " " . $1;
26886305db96SHeinrich Schuchardt				$hasparens = 1;
26896305db96SHeinrich Schuchardt			}
26906305db96SHeinrich Schuchardt
26916305db96SHeinrich Schuchardt			($id, $description) = git_commit_info($orig_commit,
26926305db96SHeinrich Schuchardt							      $id, $orig_desc);
26936305db96SHeinrich Schuchardt
26946305db96SHeinrich Schuchardt			if (defined($id) &&
26956305db96SHeinrich Schuchardt			   ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) {
26966305db96SHeinrich Schuchardt				ERROR("GIT_COMMIT_ID",
26976305db96SHeinrich Schuchardt				      "Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr);
26986305db96SHeinrich Schuchardt			}
26996305db96SHeinrich Schuchardt		}
27006305db96SHeinrich Schuchardt
27016305db96SHeinrich Schuchardt# Check for added, moved or deleted files
27026305db96SHeinrich Schuchardt		if (!$reported_maintainer_file && !$in_commit_log &&
27036305db96SHeinrich Schuchardt		    ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
27046305db96SHeinrich Schuchardt		     $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
27056305db96SHeinrich Schuchardt		     ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
27066305db96SHeinrich Schuchardt		      (defined($1) || defined($2))))) {
27076305db96SHeinrich Schuchardt			$is_patch = 1;
27086305db96SHeinrich Schuchardt			$reported_maintainer_file = 1;
27096305db96SHeinrich Schuchardt			WARN("FILE_PATH_CHANGES",
27106305db96SHeinrich Schuchardt			     "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
27116305db96SHeinrich Schuchardt		}
27126305db96SHeinrich Schuchardt
2713dd88ab32SMasahiro Yamada# Check for wrappage within a valid hunk of the file
2714dd88ab32SMasahiro Yamada		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
2715dd88ab32SMasahiro Yamada			ERROR("CORRUPTED_PATCH",
2716dd88ab32SMasahiro Yamada			      "patch seems to be corrupt (line wrapped?)\n" .
2717dd88ab32SMasahiro Yamada				$herecurr) if (!$emitted_corrupt++);
2718dd88ab32SMasahiro Yamada		}
2719dd88ab32SMasahiro Yamada
2720dd88ab32SMasahiro Yamada# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
2721dd88ab32SMasahiro Yamada		if (($realfile =~ /^$/ || $line =~ /^\+/) &&
2722dd88ab32SMasahiro Yamada		    $rawline !~ m/^$UTF8*$/) {
2723dd88ab32SMasahiro Yamada			my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
2724dd88ab32SMasahiro Yamada
2725dd88ab32SMasahiro Yamada			my $blank = copy_spacing($rawline);
2726dd88ab32SMasahiro Yamada			my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
2727dd88ab32SMasahiro Yamada			my $hereptr = "$hereline$ptr\n";
2728dd88ab32SMasahiro Yamada
2729dd88ab32SMasahiro Yamada			CHK("INVALID_UTF8",
2730dd88ab32SMasahiro Yamada			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
2731dd88ab32SMasahiro Yamada		}
2732dd88ab32SMasahiro Yamada
2733dd88ab32SMasahiro Yamada# Check if it's the start of a commit log
2734dd88ab32SMasahiro Yamada# (not a header line and we haven't seen the patch filename)
2735dd88ab32SMasahiro Yamada		if ($in_header_lines && $realfile =~ /^$/ &&
27366305db96SHeinrich Schuchardt		    !($rawline =~ /^\s+(?:\S|$)/ ||
27376305db96SHeinrich Schuchardt		      $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) {
2738dd88ab32SMasahiro Yamada			$in_header_lines = 0;
2739dd88ab32SMasahiro Yamada			$in_commit_log = 1;
27406305db96SHeinrich Schuchardt			$has_commit_log = 1;
2741dd88ab32SMasahiro Yamada		}
2742dd88ab32SMasahiro Yamada
2743dd88ab32SMasahiro Yamada# Check if there is UTF-8 in a commit log when a mail header has explicitly
2744dd88ab32SMasahiro Yamada# declined it, i.e defined some charset where it is missing.
2745dd88ab32SMasahiro Yamada		if ($in_header_lines &&
2746dd88ab32SMasahiro Yamada		    $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
2747dd88ab32SMasahiro Yamada		    $1 !~ /utf-8/i) {
2748dd88ab32SMasahiro Yamada			$non_utf8_charset = 1;
2749dd88ab32SMasahiro Yamada		}
2750dd88ab32SMasahiro Yamada
2751dd88ab32SMasahiro Yamada		if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
2752dd88ab32SMasahiro Yamada		    $rawline =~ /$NON_ASCII_UTF8/) {
2753dd88ab32SMasahiro Yamada			WARN("UTF8_BEFORE_PATCH",
2754dd88ab32SMasahiro Yamada			    "8-bit UTF-8 used in possible commit log\n" . $herecurr);
2755dd88ab32SMasahiro Yamada		}
2756dd88ab32SMasahiro Yamada
27576305db96SHeinrich Schuchardt# Check for absolute kernel paths in commit message
27586305db96SHeinrich Schuchardt		if ($tree && $in_commit_log) {
27596305db96SHeinrich Schuchardt			while ($line =~ m{(?:^|\s)(/\S*)}g) {
27606305db96SHeinrich Schuchardt				my $file = $1;
27616305db96SHeinrich Schuchardt
27626305db96SHeinrich Schuchardt				if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
27636305db96SHeinrich Schuchardt				    check_absolute_file($1, $herecurr)) {
27646305db96SHeinrich Schuchardt					#
27656305db96SHeinrich Schuchardt				} else {
27666305db96SHeinrich Schuchardt					check_absolute_file($file, $herecurr);
27676305db96SHeinrich Schuchardt				}
27686305db96SHeinrich Schuchardt			}
27696305db96SHeinrich Schuchardt		}
27706305db96SHeinrich Schuchardt
2771c10e0f5bSDan Murphy# Check for various typo / spelling mistakes
2772c10e0f5bSDan Murphy		if (defined($misspellings) &&
2773c10e0f5bSDan Murphy		    ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
2774c10e0f5bSDan Murphy			while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) {
2775c10e0f5bSDan Murphy				my $typo = $1;
2776c10e0f5bSDan Murphy				my $typo_fix = $spelling_fix{lc($typo)};
2777c10e0f5bSDan Murphy				$typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/);
2778c10e0f5bSDan Murphy				$typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/);
2779*c398f2dfSHeinrich Schuchardt				my $msg_level = \&WARN;
2780*c398f2dfSHeinrich Schuchardt				$msg_level = \&CHK if ($file);
2781*c398f2dfSHeinrich Schuchardt				if (&{$msg_level}("TYPO_SPELLING",
2782c10e0f5bSDan Murphy						  "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) &&
2783c10e0f5bSDan Murphy				    $fix) {
2784c10e0f5bSDan Murphy					$fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
2785c10e0f5bSDan Murphy				}
2786c10e0f5bSDan Murphy			}
2787c10e0f5bSDan Murphy		}
2788c10e0f5bSDan Murphy
2789dd88ab32SMasahiro Yamada# ignore non-hunk lines and lines being removed
2790dd88ab32SMasahiro Yamada		next if (!$hunk_line || $line =~ /^-/);
2791dd88ab32SMasahiro Yamada
2792dd88ab32SMasahiro Yamada#trailing whitespace
2793dd88ab32SMasahiro Yamada		if ($line =~ /^\+.*\015/) {
2794dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
27956b9709d9STom Rini			if (ERROR("DOS_LINE_ENDINGS",
27966b9709d9STom Rini				  "DOS line endings\n" . $herevet) &&
27976b9709d9STom Rini			    $fix) {
27986305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/[\s\015]+$//;
27996b9709d9STom Rini			}
2800dd88ab32SMasahiro Yamada		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
2801dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
28026b9709d9STom Rini			if (ERROR("TRAILING_WHITESPACE",
28036b9709d9STom Rini				  "trailing whitespace\n" . $herevet) &&
28046b9709d9STom Rini			    $fix) {
28056305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\s+$//;
28066b9709d9STom Rini			}
28076b9709d9STom Rini
2808dd88ab32SMasahiro Yamada			$rpt_cleaners = 1;
2809dd88ab32SMasahiro Yamada		}
2810dd88ab32SMasahiro Yamada
28116b9709d9STom Rini# Check for FSF mailing addresses.
28126b9709d9STom Rini		if ($rawline =~ /\bwrite to the Free/i ||
28136305db96SHeinrich Schuchardt		    $rawline =~ /\b675\s+Mass\s+Ave/i ||
28146b9709d9STom Rini		    $rawline =~ /\b59\s+Temple\s+Pl/i ||
28156b9709d9STom Rini		    $rawline =~ /\b51\s+Franklin\s+St/i) {
28166b9709d9STom Rini			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2817*c398f2dfSHeinrich Schuchardt			my $msg_level = \&ERROR;
2818*c398f2dfSHeinrich Schuchardt			$msg_level = \&CHK if ($file);
2819*c398f2dfSHeinrich Schuchardt			&{$msg_level}("FSF_MAILING_ADDRESS",
28206b9709d9STom 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)
28216b9709d9STom Rini		}
28226b9709d9STom Rini
2823dd88ab32SMasahiro Yamada# check for Kconfig help text having a real description
2824dd88ab32SMasahiro Yamada# Only applies when adding the entry originally, after that we do not have
2825dd88ab32SMasahiro Yamada# sufficient context to determine whether it is indeed long enough.
2826dd88ab32SMasahiro Yamada		if ($realfile =~ /Kconfig/ &&
2827*c398f2dfSHeinrich Schuchardt		    # 'choice' is usually the last thing on the line (though
2828*c398f2dfSHeinrich Schuchardt		    # Kconfig supports named choices), so use a word boundary
2829*c398f2dfSHeinrich Schuchardt		    # (\b) rather than a whitespace character (\s)
2830*c398f2dfSHeinrich Schuchardt		    $line =~ /^\+\s*(?:config|menuconfig|choice)\b/) {
2831dd88ab32SMasahiro Yamada			my $length = 0;
2832dd88ab32SMasahiro Yamada			my $cnt = $realcnt;
2833dd88ab32SMasahiro Yamada			my $ln = $linenr + 1;
2834dd88ab32SMasahiro Yamada			my $f;
2835dd88ab32SMasahiro Yamada			my $is_start = 0;
2836dd88ab32SMasahiro Yamada			my $is_end = 0;
2837dd88ab32SMasahiro Yamada			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
2838dd88ab32SMasahiro Yamada				$f = $lines[$ln - 1];
2839dd88ab32SMasahiro Yamada				$cnt-- if ($lines[$ln - 1] !~ /^-/);
2840dd88ab32SMasahiro Yamada				$is_end = $lines[$ln - 1] =~ /^\+/;
2841dd88ab32SMasahiro Yamada
2842dd88ab32SMasahiro Yamada				next if ($f =~ /^-/);
28436305db96SHeinrich Schuchardt				last if (!$file && $f =~ /^\@\@/);
2844dd88ab32SMasahiro Yamada
2845*c398f2dfSHeinrich Schuchardt				if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) {
2846dd88ab32SMasahiro Yamada					$is_start = 1;
2847*c398f2dfSHeinrich Schuchardt				} elsif ($lines[$ln - 1] =~ /^\+\s*(?:help|---help---)\s*$/) {
2848*c398f2dfSHeinrich Schuchardt					if ($lines[$ln - 1] =~ "---help---") {
2849*c398f2dfSHeinrich Schuchardt						WARN("CONFIG_DESCRIPTION",
2850*c398f2dfSHeinrich Schuchardt						     "prefer 'help' over '---help---' for new help texts\n" . $herecurr);
2851*c398f2dfSHeinrich Schuchardt					}
2852dd88ab32SMasahiro Yamada					$length = -1;
2853dd88ab32SMasahiro Yamada				}
2854dd88ab32SMasahiro Yamada
2855dd88ab32SMasahiro Yamada				$f =~ s/^.//;
2856dd88ab32SMasahiro Yamada				$f =~ s/#.*//;
2857dd88ab32SMasahiro Yamada				$f =~ s/^\s+//;
2858dd88ab32SMasahiro Yamada				next if ($f =~ /^$/);
2859*c398f2dfSHeinrich Schuchardt
2860*c398f2dfSHeinrich Schuchardt				# This only checks context lines in the patch
2861*c398f2dfSHeinrich Schuchardt				# and so hopefully shouldn't trigger false
2862*c398f2dfSHeinrich Schuchardt				# positives, even though some of these are
2863*c398f2dfSHeinrich Schuchardt				# common words in help texts
2864*c398f2dfSHeinrich Schuchardt				if ($f =~ /^\s*(?:config|menuconfig|choice|endchoice|
2865*c398f2dfSHeinrich Schuchardt						  if|endif|menu|endmenu|source)\b/x) {
2866dd88ab32SMasahiro Yamada					$is_end = 1;
2867dd88ab32SMasahiro Yamada					last;
2868dd88ab32SMasahiro Yamada				}
2869dd88ab32SMasahiro Yamada				$length++;
2870dd88ab32SMasahiro Yamada			}
28716305db96SHeinrich Schuchardt			if ($is_start && $is_end && $length < $min_conf_desc_length) {
2872dd88ab32SMasahiro Yamada				WARN("CONFIG_DESCRIPTION",
28736305db96SHeinrich Schuchardt				     "please write a paragraph that describes the config symbol fully\n" . $herecurr);
28746305db96SHeinrich Schuchardt			}
2875dd88ab32SMasahiro Yamada			#print "is_start<$is_start> is_end<$is_end> length<$length>\n";
2876dd88ab32SMasahiro Yamada		}
2877dd88ab32SMasahiro Yamada
28786305db96SHeinrich Schuchardt# check for MAINTAINERS entries that don't have the right form
28796305db96SHeinrich Schuchardt		if ($realfile =~ /^MAINTAINERS$/ &&
28806305db96SHeinrich Schuchardt		    $rawline =~ /^\+[A-Z]:/ &&
28816305db96SHeinrich Schuchardt		    $rawline !~ /^\+[A-Z]:\t\S/) {
28826305db96SHeinrich Schuchardt			if (WARN("MAINTAINERS_STYLE",
28836305db96SHeinrich Schuchardt				 "MAINTAINERS entries use one tab after TYPE:\n" . $herecurr) &&
28846305db96SHeinrich Schuchardt			    $fix) {
28856305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/^(\+[A-Z]):\s*/$1:\t/;
28866305db96SHeinrich Schuchardt			}
28876305db96SHeinrich Schuchardt		}
28886305db96SHeinrich Schuchardt
28896305db96SHeinrich Schuchardt# discourage the use of boolean for type definition attributes of Kconfig options
2890dd88ab32SMasahiro Yamada		if ($realfile =~ /Kconfig/ &&
28916305db96SHeinrich Schuchardt		    $line =~ /^\+\s*\bboolean\b/) {
28926305db96SHeinrich Schuchardt			WARN("CONFIG_TYPE_BOOLEAN",
28936305db96SHeinrich Schuchardt			     "Use of boolean is deprecated, please use bool instead.\n" . $herecurr);
2894dd88ab32SMasahiro Yamada		}
2895dd88ab32SMasahiro Yamada
2896dd88ab32SMasahiro Yamada		if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
2897dd88ab32SMasahiro Yamada		    ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
2898dd88ab32SMasahiro Yamada			my $flag = $1;
2899dd88ab32SMasahiro Yamada			my $replacement = {
2900dd88ab32SMasahiro Yamada				'EXTRA_AFLAGS' =>   'asflags-y',
2901dd88ab32SMasahiro Yamada				'EXTRA_CFLAGS' =>   'ccflags-y',
2902dd88ab32SMasahiro Yamada				'EXTRA_CPPFLAGS' => 'cppflags-y',
2903dd88ab32SMasahiro Yamada				'EXTRA_LDFLAGS' =>  'ldflags-y',
2904dd88ab32SMasahiro Yamada			};
2905dd88ab32SMasahiro Yamada
2906dd88ab32SMasahiro Yamada			WARN("DEPRECATED_VARIABLE",
2907dd88ab32SMasahiro Yamada			     "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
2908dd88ab32SMasahiro Yamada		}
2909dd88ab32SMasahiro Yamada
29106b9709d9STom Rini# check for DT compatible documentation
29116305db96SHeinrich Schuchardt		if (defined $root &&
29126305db96SHeinrich Schuchardt			(($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
29136305db96SHeinrich Schuchardt			 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
29146305db96SHeinrich Schuchardt
29156b9709d9STom Rini			my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
29166b9709d9STom Rini
29176305db96SHeinrich Schuchardt			my $dt_path = $root . "/Documentation/devicetree/bindings/";
29186305db96SHeinrich Schuchardt			my $vp_file = $dt_path . "vendor-prefixes.txt";
29196305db96SHeinrich Schuchardt
29206b9709d9STom Rini			foreach my $compat (@compats) {
29216b9709d9STom Rini				my $compat2 = $compat;
29226305db96SHeinrich Schuchardt				$compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
29236305db96SHeinrich Schuchardt				my $compat3 = $compat;
29246305db96SHeinrich Schuchardt				$compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
29256305db96SHeinrich Schuchardt				`grep -Erq "$compat|$compat2|$compat3" $dt_path`;
29266b9709d9STom Rini				if ( $? >> 8 ) {
29276b9709d9STom Rini					WARN("UNDOCUMENTED_DT_STRING",
29286b9709d9STom Rini					     "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
29296b9709d9STom Rini				}
29306b9709d9STom Rini
29316305db96SHeinrich Schuchardt				next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
29326305db96SHeinrich Schuchardt				my $vendor = $1;
29336305db96SHeinrich Schuchardt				`grep -Eq "^$vendor\\b" $vp_file`;
29346b9709d9STom Rini				if ( $? >> 8 ) {
29356b9709d9STom Rini					WARN("UNDOCUMENTED_DT_STRING",
29366305db96SHeinrich Schuchardt					     "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
29376b9709d9STom Rini				}
29386b9709d9STom Rini			}
29396b9709d9STom Rini		}
29406b9709d9STom Rini
2941*c398f2dfSHeinrich Schuchardt# check for using SPDX license tag at beginning of files
2942*c398f2dfSHeinrich Schuchardt		if ($realline == $checklicenseline) {
2943*c398f2dfSHeinrich Schuchardt			if ($rawline =~ /^[ \+]\s*\#\!\s*\//) {
2944*c398f2dfSHeinrich Schuchardt				$checklicenseline = 2;
2945*c398f2dfSHeinrich Schuchardt			} elsif ($rawline =~ /^\+/) {
2946*c398f2dfSHeinrich Schuchardt				my $comment = "";
2947*c398f2dfSHeinrich Schuchardt				if ($realfile =~ /\.(h|s|S)$/) {
2948*c398f2dfSHeinrich Schuchardt					$comment = '/*';
2949*c398f2dfSHeinrich Schuchardt				} elsif ($realfile =~ /\.(c|dts|dtsi)$/) {
2950*c398f2dfSHeinrich Schuchardt					$comment = '//';
2951*c398f2dfSHeinrich Schuchardt				} elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc)$/) {
2952*c398f2dfSHeinrich Schuchardt					$comment = '#';
2953*c398f2dfSHeinrich Schuchardt				} elsif ($realfile =~ /\.rst$/) {
2954*c398f2dfSHeinrich Schuchardt					$comment = '..';
2955*c398f2dfSHeinrich Schuchardt				}
2956*c398f2dfSHeinrich Schuchardt
2957*c398f2dfSHeinrich Schuchardt				if ($comment !~ /^$/ &&
2958*c398f2dfSHeinrich Schuchardt				    $rawline !~ /^\+\Q$comment\E SPDX-License-Identifier: /) {
2959*c398f2dfSHeinrich Schuchardt					WARN("SPDX_LICENSE_TAG",
2960*c398f2dfSHeinrich Schuchardt					     "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline\n" . $herecurr);
2961*c398f2dfSHeinrich Schuchardt				}
2962*c398f2dfSHeinrich Schuchardt			}
2963*c398f2dfSHeinrich Schuchardt		}
2964*c398f2dfSHeinrich Schuchardt
2965dd88ab32SMasahiro Yamada# check we are in a valid source file if not then ignore this hunk
29666305db96SHeinrich Schuchardt		next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/);
2967dd88ab32SMasahiro Yamada
29686305db96SHeinrich Schuchardt# line length limit (with some exclusions)
29696305db96SHeinrich Schuchardt#
29706305db96SHeinrich Schuchardt# There are a few types of lines that may extend beyond $max_line_length:
29716305db96SHeinrich Schuchardt#	logging functions like pr_info that end in a string
29726305db96SHeinrich Schuchardt#	lines with a single string
29736305db96SHeinrich Schuchardt#	#defines that are a single string
2974*c398f2dfSHeinrich Schuchardt#	lines with an RFC3986 like URL
29756305db96SHeinrich Schuchardt#
29766305db96SHeinrich Schuchardt# There are 3 different line length message types:
2977*c398f2dfSHeinrich Schuchardt# LONG_LINE_COMMENT	a comment starts before but extends beyond $max_line_length
29786305db96SHeinrich Schuchardt# LONG_LINE_STRING	a string starts before but extends beyond $max_line_length
29796305db96SHeinrich Schuchardt# LONG_LINE		all other lines longer than $max_line_length
29806305db96SHeinrich Schuchardt#
29816305db96SHeinrich Schuchardt# if LONG_LINE is ignored, the other 2 types are also ignored
29826305db96SHeinrich Schuchardt#
29836305db96SHeinrich Schuchardt
29846305db96SHeinrich Schuchardt		if ($line =~ /^\+/ && $length > $max_line_length) {
29856305db96SHeinrich Schuchardt			my $msg_type = "LONG_LINE";
29866305db96SHeinrich Schuchardt
29876305db96SHeinrich Schuchardt			# Check the allowed long line types first
29886305db96SHeinrich Schuchardt
29896305db96SHeinrich Schuchardt			# logging functions that end in a string that starts
29906305db96SHeinrich Schuchardt			# before $max_line_length
29916305db96SHeinrich Schuchardt			if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ &&
29926305db96SHeinrich Schuchardt			    length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
29936305db96SHeinrich Schuchardt				$msg_type = "";
29946305db96SHeinrich Schuchardt
29956305db96SHeinrich Schuchardt			# lines with only strings (w/ possible termination)
29966305db96SHeinrich Schuchardt			# #defines with only strings
29976305db96SHeinrich Schuchardt			} elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ ||
29986305db96SHeinrich Schuchardt				 $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) {
29996305db96SHeinrich Schuchardt				$msg_type = "";
30006305db96SHeinrich Schuchardt
3001*c398f2dfSHeinrich Schuchardt			# More special cases
3002*c398f2dfSHeinrich Schuchardt			} elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ ||
3003*c398f2dfSHeinrich Schuchardt				 $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) {
3004*c398f2dfSHeinrich Schuchardt				$msg_type = "";
3005*c398f2dfSHeinrich Schuchardt
3006*c398f2dfSHeinrich Schuchardt			# URL ($rawline is used in case the URL is in a comment)
3007*c398f2dfSHeinrich Schuchardt			} elsif ($rawline =~ /^\+.*\b[a-z][\w\.\+\-]*:\/\/\S+/i) {
30086305db96SHeinrich Schuchardt				$msg_type = "";
30096305db96SHeinrich Schuchardt
30106305db96SHeinrich Schuchardt			# Otherwise set the alternate message types
30116305db96SHeinrich Schuchardt
30126305db96SHeinrich Schuchardt			# a comment starts before $max_line_length
30136305db96SHeinrich Schuchardt			} elsif ($line =~ /($;[\s$;]*)$/ &&
30146305db96SHeinrich Schuchardt				 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
30156305db96SHeinrich Schuchardt				$msg_type = "LONG_LINE_COMMENT"
30166305db96SHeinrich Schuchardt
30176305db96SHeinrich Schuchardt			# a quoted string starts before $max_line_length
30186305db96SHeinrich Schuchardt			} elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ &&
30196305db96SHeinrich Schuchardt				 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
30206305db96SHeinrich Schuchardt				$msg_type = "LONG_LINE_STRING"
30216305db96SHeinrich Schuchardt			}
30226305db96SHeinrich Schuchardt
30236305db96SHeinrich Schuchardt			if ($msg_type ne "" &&
30246305db96SHeinrich Schuchardt			    (show_type("LONG_LINE") || show_type($msg_type))) {
30256305db96SHeinrich Schuchardt				WARN($msg_type,
3026dd88ab32SMasahiro Yamada				     "line over $max_line_length characters\n" . $herecurr);
3027dd88ab32SMasahiro Yamada			}
3028dd88ab32SMasahiro Yamada		}
3029dd88ab32SMasahiro Yamada
3030dd88ab32SMasahiro Yamada# check for adding lines without a newline.
3031dd88ab32SMasahiro Yamada		if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
3032dd88ab32SMasahiro Yamada			WARN("MISSING_EOF_NEWLINE",
3033dd88ab32SMasahiro Yamada			     "adding a line without newline at end of file\n" . $herecurr);
3034dd88ab32SMasahiro Yamada		}
3035dd88ab32SMasahiro Yamada
3036dd88ab32SMasahiro Yamada# check we are in a valid source file C or perl if not then ignore this hunk
30376305db96SHeinrich Schuchardt		next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
3038dd88ab32SMasahiro Yamada
3039dd88ab32SMasahiro Yamada# at the beginning of a line any tabs must come first and anything
3040dd88ab32SMasahiro Yamada# more than 8 must use tabs.
3041dd88ab32SMasahiro Yamada		if ($rawline =~ /^\+\s* \t\s*\S/ ||
3042dd88ab32SMasahiro Yamada		    $rawline =~ /^\+\s*        \s*/) {
3043dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3044dd88ab32SMasahiro Yamada			$rpt_cleaners = 1;
30456b9709d9STom Rini			if (ERROR("CODE_INDENT",
30466b9709d9STom Rini				  "code indent should use tabs where possible\n" . $herevet) &&
30476b9709d9STom Rini			    $fix) {
30486305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
30496b9709d9STom Rini			}
3050dd88ab32SMasahiro Yamada		}
3051dd88ab32SMasahiro Yamada
3052dd88ab32SMasahiro Yamada# check for space before tabs.
3053dd88ab32SMasahiro Yamada		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
3054dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
30556b9709d9STom Rini			if (WARN("SPACE_BEFORE_TAB",
30566b9709d9STom Rini				"please, no space before tabs\n" . $herevet) &&
30576b9709d9STom Rini			    $fix) {
30586305db96SHeinrich Schuchardt				while ($fixed[$fixlinenr] =~
3059e3a4facdSJoe Perches					   s/(^\+.*) {8,8}\t/$1\t\t/) {}
30606305db96SHeinrich Schuchardt				while ($fixed[$fixlinenr] =~
30616b9709d9STom Rini					   s/(^\+.*) +\t/$1\t/) {}
30626b9709d9STom Rini			}
3063dd88ab32SMasahiro Yamada		}
3064dd88ab32SMasahiro Yamada
3065dd88ab32SMasahiro Yamada# check for && or || at the start of a line
3066dd88ab32SMasahiro Yamada		if ($rawline =~ /^\+\s*(&&|\|\|)/) {
3067dd88ab32SMasahiro Yamada			CHK("LOGICAL_CONTINUATIONS",
3068dd88ab32SMasahiro Yamada			    "Logical continuations should be on the previous line\n" . $hereprev);
3069dd88ab32SMasahiro Yamada		}
3070dd88ab32SMasahiro Yamada
30716305db96SHeinrich Schuchardt# check indentation starts on a tab stop
30726305db96SHeinrich Schuchardt		if ($^V && $^V ge 5.10.0 &&
3073*c398f2dfSHeinrich Schuchardt		    $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {
30746305db96SHeinrich Schuchardt			my $indent = length($1);
30756305db96SHeinrich Schuchardt			if ($indent % 8) {
30766305db96SHeinrich Schuchardt				if (WARN("TABSTOP",
30776305db96SHeinrich Schuchardt					 "Statements should start on a tabstop\n" . $herecurr) &&
30786305db96SHeinrich Schuchardt				    $fix) {
30796305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/8)@e;
30806305db96SHeinrich Schuchardt				}
30816305db96SHeinrich Schuchardt			}
30826305db96SHeinrich Schuchardt		}
30836305db96SHeinrich Schuchardt
3084dd88ab32SMasahiro Yamada# check multi-line statement indentation matches previous line
3085dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
30866305db96SHeinrich Schuchardt		    $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|(?:\*\s*)*$Lval\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
3087dd88ab32SMasahiro Yamada			$prevline =~ /^\+(\t*)(.*)$/;
3088dd88ab32SMasahiro Yamada			my $oldindent = $1;
3089dd88ab32SMasahiro Yamada			my $rest = $2;
3090dd88ab32SMasahiro Yamada
3091dd88ab32SMasahiro Yamada			my $pos = pos_last_openparen($rest);
3092dd88ab32SMasahiro Yamada			if ($pos >= 0) {
3093dd88ab32SMasahiro Yamada				$line =~ /^(\+| )([ \t]*)/;
3094dd88ab32SMasahiro Yamada				my $newindent = $2;
3095dd88ab32SMasahiro Yamada
3096dd88ab32SMasahiro Yamada				my $goodtabindent = $oldindent .
3097dd88ab32SMasahiro Yamada					"\t" x ($pos / 8) .
3098dd88ab32SMasahiro Yamada					" "  x ($pos % 8);
3099dd88ab32SMasahiro Yamada				my $goodspaceindent = $oldindent . " "  x $pos;
3100dd88ab32SMasahiro Yamada
3101dd88ab32SMasahiro Yamada				if ($newindent ne $goodtabindent &&
3102dd88ab32SMasahiro Yamada				    $newindent ne $goodspaceindent) {
31036b9709d9STom Rini
31046b9709d9STom Rini					if (CHK("PARENTHESIS_ALIGNMENT",
31056b9709d9STom Rini						"Alignment should match open parenthesis\n" . $hereprev) &&
31066b9709d9STom Rini					    $fix && $line =~ /^\+/) {
31076305db96SHeinrich Schuchardt						$fixed[$fixlinenr] =~
31086b9709d9STom Rini						    s/^\+[ \t]*/\+$goodtabindent/;
31096b9709d9STom Rini					}
3110dd88ab32SMasahiro Yamada				}
3111dd88ab32SMasahiro Yamada			}
3112dd88ab32SMasahiro Yamada		}
3113dd88ab32SMasahiro Yamada
31146305db96SHeinrich Schuchardt# check for space after cast like "(int) foo" or "(struct foo) bar"
31156305db96SHeinrich Schuchardt# avoid checking a few false positives:
31166305db96SHeinrich Schuchardt#   "sizeof(<type>)" or "__alignof__(<type>)"
31176305db96SHeinrich Schuchardt#   function pointer declarations like "(*foo)(int) = bar;"
31186305db96SHeinrich Schuchardt#   structure definitions like "(struct foo) { 0 };"
31196305db96SHeinrich Schuchardt#   multiline macros that define functions
31206305db96SHeinrich Schuchardt#   known attributes or the __attribute__ keyword
31216305db96SHeinrich Schuchardt		if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ &&
31226305db96SHeinrich Schuchardt		    (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) {
31236b9709d9STom Rini			if (CHK("SPACING",
31246305db96SHeinrich Schuchardt				"No space is necessary after a cast\n" . $herecurr) &&
31256b9709d9STom Rini			    $fix) {
31266305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~
31276305db96SHeinrich Schuchardt				    s/(\(\s*$Type\s*\))[ \t]+/$1/;
31286b9709d9STom Rini			}
3129dd88ab32SMasahiro Yamada		}
3130dd88ab32SMasahiro Yamada
31316305db96SHeinrich Schuchardt# Block comment styles
31326305db96SHeinrich Schuchardt# Networking with an initial /*
3133dd88ab32SMasahiro Yamada		if ($realfile =~ m@^(drivers/net/|net/)@ &&
31346b9709d9STom Rini		    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
31356305db96SHeinrich Schuchardt		    $rawline =~ /^\+[ \t]*\*/ &&
31366305db96SHeinrich Schuchardt		    $realline > 2) {
3137dd88ab32SMasahiro Yamada			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
3138dd88ab32SMasahiro Yamada			     "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
3139dd88ab32SMasahiro Yamada		}
3140dd88ab32SMasahiro Yamada
31416305db96SHeinrich Schuchardt# Block comments use * on subsequent lines
31426305db96SHeinrich Schuchardt		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
31436305db96SHeinrich Schuchardt		    $prevrawline =~ /^\+.*?\/\*/ &&		#starting /*
31446b9709d9STom Rini		    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */
31456b9709d9STom Rini		    $rawline =~ /^\+/ &&			#line is new
31466b9709d9STom Rini		    $rawline !~ /^\+[ \t]*\*/) {		#no leading *
31476305db96SHeinrich Schuchardt			WARN("BLOCK_COMMENT_STYLE",
31486305db96SHeinrich Schuchardt			     "Block comments use * on subsequent lines\n" . $hereprev);
31496b9709d9STom Rini		}
31506b9709d9STom Rini
31516305db96SHeinrich Schuchardt# Block comments use */ on trailing lines
31526305db96SHeinrich Schuchardt		if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */
3153dd88ab32SMasahiro Yamada		    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
3154dd88ab32SMasahiro Yamada		    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/
3155dd88ab32SMasahiro Yamada		    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */
31566305db96SHeinrich Schuchardt			WARN("BLOCK_COMMENT_STYLE",
31576305db96SHeinrich Schuchardt			     "Block comments use a trailing */ on a separate line\n" . $herecurr);
31586305db96SHeinrich Schuchardt		}
31596305db96SHeinrich Schuchardt
31606305db96SHeinrich Schuchardt# Block comment * alignment
31616305db96SHeinrich Schuchardt		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
31626305db96SHeinrich Schuchardt		    $line =~ /^\+[ \t]*$;/ &&			#leading comment
31636305db96SHeinrich Schuchardt		    $rawline =~ /^\+[ \t]*\*/ &&		#leading *
31646305db96SHeinrich Schuchardt		    (($prevrawline =~ /^\+.*?\/\*/ &&		#leading /*
31656305db96SHeinrich Schuchardt		      $prevrawline !~ /\*\/[ \t]*$/) ||		#no trailing */
31666305db96SHeinrich Schuchardt		     $prevrawline =~ /^\+[ \t]*\*/)) {		#leading *
31676305db96SHeinrich Schuchardt			my $oldindent;
31686305db96SHeinrich Schuchardt			$prevrawline =~ m@^\+([ \t]*/?)\*@;
31696305db96SHeinrich Schuchardt			if (defined($1)) {
31706305db96SHeinrich Schuchardt				$oldindent = expand_tabs($1);
31716305db96SHeinrich Schuchardt			} else {
31726305db96SHeinrich Schuchardt				$prevrawline =~ m@^\+(.*/?)\*@;
31736305db96SHeinrich Schuchardt				$oldindent = expand_tabs($1);
31746305db96SHeinrich Schuchardt			}
31756305db96SHeinrich Schuchardt			$rawline =~ m@^\+([ \t]*)\*@;
31766305db96SHeinrich Schuchardt			my $newindent = $1;
31776305db96SHeinrich Schuchardt			$newindent = expand_tabs($newindent);
31786305db96SHeinrich Schuchardt			if (length($oldindent) ne length($newindent)) {
31796305db96SHeinrich Schuchardt				WARN("BLOCK_COMMENT_STYLE",
31806305db96SHeinrich Schuchardt				     "Block comments should align the * on each line\n" . $hereprev);
31816305db96SHeinrich Schuchardt			}
31826305db96SHeinrich Schuchardt		}
31836305db96SHeinrich Schuchardt
31846305db96SHeinrich Schuchardt# check for missing blank lines after struct/union declarations
31856305db96SHeinrich Schuchardt# with exceptions for various attributes and macros
31866305db96SHeinrich Schuchardt		if ($prevline =~ /^[\+ ]};?\s*$/ &&
31876305db96SHeinrich Schuchardt		    $line =~ /^\+/ &&
31886305db96SHeinrich Schuchardt		    !($line =~ /^\+\s*$/ ||
31896305db96SHeinrich Schuchardt		      $line =~ /^\+\s*EXPORT_SYMBOL/ ||
31906305db96SHeinrich Schuchardt		      $line =~ /^\+\s*MODULE_/i ||
31916305db96SHeinrich Schuchardt		      $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
31926305db96SHeinrich Schuchardt		      $line =~ /^\+[a-z_]*init/ ||
31936305db96SHeinrich Schuchardt		      $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||
31946305db96SHeinrich Schuchardt		      $line =~ /^\+\s*DECLARE/ ||
3195*c398f2dfSHeinrich Schuchardt		      $line =~ /^\+\s*builtin_[\w_]*driver/ ||
31966305db96SHeinrich Schuchardt		      $line =~ /^\+\s*__setup/)) {
31976305db96SHeinrich Schuchardt			if (CHK("LINE_SPACING",
31986305db96SHeinrich Schuchardt				"Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) &&
31996305db96SHeinrich Schuchardt			    $fix) {
32006305db96SHeinrich Schuchardt				fix_insert_line($fixlinenr, "\+");
32016305db96SHeinrich Schuchardt			}
32026305db96SHeinrich Schuchardt		}
32036305db96SHeinrich Schuchardt
32046305db96SHeinrich Schuchardt# check for multiple consecutive blank lines
32056305db96SHeinrich Schuchardt		if ($prevline =~ /^[\+ ]\s*$/ &&
32066305db96SHeinrich Schuchardt		    $line =~ /^\+\s*$/ &&
32076305db96SHeinrich Schuchardt		    $last_blank_line != ($linenr - 1)) {
32086305db96SHeinrich Schuchardt			if (CHK("LINE_SPACING",
32096305db96SHeinrich Schuchardt				"Please don't use multiple blank lines\n" . $hereprev) &&
32106305db96SHeinrich Schuchardt			    $fix) {
32116305db96SHeinrich Schuchardt				fix_delete_line($fixlinenr, $rawline);
32126305db96SHeinrich Schuchardt			}
32136305db96SHeinrich Schuchardt
32146305db96SHeinrich Schuchardt			$last_blank_line = $linenr;
32156305db96SHeinrich Schuchardt		}
32166305db96SHeinrich Schuchardt
32176305db96SHeinrich Schuchardt# check for missing blank lines after declarations
32186305db96SHeinrich Schuchardt		if ($sline =~ /^\+\s+\S/ &&			#Not at char 1
32196305db96SHeinrich Schuchardt			# actual declarations
32206305db96SHeinrich Schuchardt		    ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
32216305db96SHeinrich Schuchardt			# function pointer declarations
32226305db96SHeinrich Schuchardt		     $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
32236305db96SHeinrich Schuchardt			# foo bar; where foo is some local typedef or #define
32246305db96SHeinrich Schuchardt		     $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
32256305db96SHeinrich Schuchardt			# known declaration macros
32266305db96SHeinrich Schuchardt		     $prevline =~ /^\+\s+$declaration_macros/) &&
32276305db96SHeinrich Schuchardt			# for "else if" which can look like "$Ident $Ident"
32286305db96SHeinrich Schuchardt		    !($prevline =~ /^\+\s+$c90_Keywords\b/ ||
32296305db96SHeinrich Schuchardt			# other possible extensions of declaration lines
32306305db96SHeinrich Schuchardt		      $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
32316305db96SHeinrich Schuchardt			# not starting a section or a macro "\" extended line
32326305db96SHeinrich Schuchardt		      $prevline =~ /(?:\{\s*|\\)$/) &&
32336305db96SHeinrich Schuchardt			# looks like a declaration
32346305db96SHeinrich Schuchardt		    !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
32356305db96SHeinrich Schuchardt			# function pointer declarations
32366305db96SHeinrich Schuchardt		      $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
32376305db96SHeinrich Schuchardt			# foo bar; where foo is some local typedef or #define
32386305db96SHeinrich Schuchardt		      $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
32396305db96SHeinrich Schuchardt			# known declaration macros
32406305db96SHeinrich Schuchardt		      $sline =~ /^\+\s+$declaration_macros/ ||
32416305db96SHeinrich Schuchardt			# start of struct or union or enum
32426305db96SHeinrich Schuchardt		      $sline =~ /^\+\s+(?:union|struct|enum|typedef)\b/ ||
32436305db96SHeinrich Schuchardt			# start or end of block or continuation of declaration
32446305db96SHeinrich Schuchardt		      $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
32456305db96SHeinrich Schuchardt			# bitfield continuation
32466305db96SHeinrich Schuchardt		      $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
32476305db96SHeinrich Schuchardt			# other possible extensions of declaration lines
32486305db96SHeinrich Schuchardt		      $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) &&
32496305db96SHeinrich Schuchardt			# indentation of previous and current line are the same
32506305db96SHeinrich Schuchardt		    (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) {
32516305db96SHeinrich Schuchardt			if (WARN("LINE_SPACING",
32526305db96SHeinrich Schuchardt				 "Missing a blank line after declarations\n" . $hereprev) &&
32536305db96SHeinrich Schuchardt			    $fix) {
32546305db96SHeinrich Schuchardt				fix_insert_line($fixlinenr, "\+");
32556305db96SHeinrich Schuchardt			}
3256dd88ab32SMasahiro Yamada		}
3257dd88ab32SMasahiro Yamada
3258dd88ab32SMasahiro Yamada# check for spaces at the beginning of a line.
3259dd88ab32SMasahiro Yamada# Exceptions:
3260dd88ab32SMasahiro Yamada#  1) within comments
3261dd88ab32SMasahiro Yamada#  2) indented preprocessor commands
3262dd88ab32SMasahiro Yamada#  3) hanging labels
32636b9709d9STom Rini		if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/)  {
3264dd88ab32SMasahiro Yamada			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
32656b9709d9STom Rini			if (WARN("LEADING_SPACE",
32666b9709d9STom Rini				 "please, no spaces at the start of a line\n" . $herevet) &&
32676b9709d9STom Rini			    $fix) {
32686305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
32696b9709d9STom Rini			}
3270dd88ab32SMasahiro Yamada		}
3271dd88ab32SMasahiro Yamada
3272dd88ab32SMasahiro Yamada# check we are in a valid C source file if not then ignore this hunk
3273dd88ab32SMasahiro Yamada		next if ($realfile !~ /\.(h|c)$/);
3274dd88ab32SMasahiro Yamada
3275*c398f2dfSHeinrich Schuchardt# check for unusual line ending [ or (
3276*c398f2dfSHeinrich Schuchardt		if ($line =~ /^\+.*([\[\(])\s*$/) {
3277*c398f2dfSHeinrich Schuchardt			CHK("OPEN_ENDED_LINE",
3278*c398f2dfSHeinrich Schuchardt			    "Lines should not end with a '$1'\n" . $herecurr);
3279*c398f2dfSHeinrich Schuchardt		}
3280*c398f2dfSHeinrich Schuchardt
32816305db96SHeinrich Schuchardt# check if this appears to be the start function declaration, save the name
32826305db96SHeinrich Schuchardt		if ($sline =~ /^\+\{\s*$/ &&
32836305db96SHeinrich Schuchardt		    $prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) {
32846305db96SHeinrich Schuchardt			$context_function = $1;
32856305db96SHeinrich Schuchardt		}
32866305db96SHeinrich Schuchardt
32876305db96SHeinrich Schuchardt# check if this appears to be the end of function declaration
32886305db96SHeinrich Schuchardt		if ($sline =~ /^\+\}\s*$/) {
32896305db96SHeinrich Schuchardt			undef $context_function;
32906305db96SHeinrich Schuchardt		}
32916305db96SHeinrich Schuchardt
32926305db96SHeinrich Schuchardt# check indentation of any line with a bare else
32936305db96SHeinrich Schuchardt# (but not if it is a multiple line "if (foo) return bar; else return baz;")
32946305db96SHeinrich Schuchardt# if the previous line is a break or return and is indented 1 tab more...
32956305db96SHeinrich Schuchardt		if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
32966305db96SHeinrich Schuchardt			my $tabs = length($1) + 1;
32976305db96SHeinrich Schuchardt			if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ ||
32986305db96SHeinrich Schuchardt			    ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ &&
32996305db96SHeinrich Schuchardt			     defined $lines[$linenr] &&
33006305db96SHeinrich Schuchardt			     $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) {
33016305db96SHeinrich Schuchardt				WARN("UNNECESSARY_ELSE",
33026305db96SHeinrich Schuchardt				     "else is not generally useful after a break or return\n" . $hereprev);
33036305db96SHeinrich Schuchardt			}
33046305db96SHeinrich Schuchardt		}
33056305db96SHeinrich Schuchardt
33066305db96SHeinrich Schuchardt# check indentation of a line with a break;
33076305db96SHeinrich Schuchardt# if the previous line is a goto or return and is indented the same # of tabs
33086305db96SHeinrich Schuchardt		if ($sline =~ /^\+([\t]+)break\s*;\s*$/) {
33096305db96SHeinrich Schuchardt			my $tabs = $1;
33106305db96SHeinrich Schuchardt			if ($prevline =~ /^\+$tabs(?:goto|return)\b/) {
33116305db96SHeinrich Schuchardt				WARN("UNNECESSARY_BREAK",
33126305db96SHeinrich Schuchardt				     "break is not useful after a goto or return\n" . $hereprev);
33136305db96SHeinrich Schuchardt			}
3314dd88ab32SMasahiro Yamada		}
3315dd88ab32SMasahiro Yamada
3316dd88ab32SMasahiro Yamada# check for RCS/CVS revision markers
3317dd88ab32SMasahiro Yamada		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
3318dd88ab32SMasahiro Yamada			WARN("CVS_KEYWORD",
3319dd88ab32SMasahiro Yamada			     "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
3320dd88ab32SMasahiro Yamada		}
3321dd88ab32SMasahiro Yamada
3322dd88ab32SMasahiro Yamada# check for old HOTPLUG __dev<foo> section markings
3323dd88ab32SMasahiro Yamada		if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
3324dd88ab32SMasahiro Yamada			WARN("HOTPLUG_SECTION",
3325dd88ab32SMasahiro Yamada			     "Using $1 is unnecessary\n" . $herecurr);
3326dd88ab32SMasahiro Yamada		}
3327dd88ab32SMasahiro Yamada
3328dd88ab32SMasahiro Yamada# Check for potential 'bare' types
3329dd88ab32SMasahiro Yamada		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
3330dd88ab32SMasahiro Yamada		    $realline_next);
3331dd88ab32SMasahiro Yamada#print "LINE<$line>\n";
33326305db96SHeinrich Schuchardt		if ($linenr > $suppress_statement &&
33336b9709d9STom Rini		    $realcnt && $sline =~ /.\s*\S/) {
3334dd88ab32SMasahiro Yamada			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3335dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0);
3336dd88ab32SMasahiro Yamada			$stat =~ s/\n./\n /g;
3337dd88ab32SMasahiro Yamada			$cond =~ s/\n./\n /g;
3338dd88ab32SMasahiro Yamada
3339dd88ab32SMasahiro Yamada#print "linenr<$linenr> <$stat>\n";
3340dd88ab32SMasahiro Yamada			# If this statement has no statement boundaries within
3341dd88ab32SMasahiro Yamada			# it there is no point in retrying a statement scan
3342dd88ab32SMasahiro Yamada			# until we hit end of it.
3343dd88ab32SMasahiro Yamada			my $frag = $stat; $frag =~ s/;+\s*$//;
3344dd88ab32SMasahiro Yamada			if ($frag !~ /(?:{|;)/) {
3345dd88ab32SMasahiro Yamada#print "skip<$line_nr_next>\n";
3346dd88ab32SMasahiro Yamada				$suppress_statement = $line_nr_next;
3347dd88ab32SMasahiro Yamada			}
3348dd88ab32SMasahiro Yamada
3349dd88ab32SMasahiro Yamada			# Find the real next line.
3350dd88ab32SMasahiro Yamada			$realline_next = $line_nr_next;
3351dd88ab32SMasahiro Yamada			if (defined $realline_next &&
3352dd88ab32SMasahiro Yamada			    (!defined $lines[$realline_next - 1] ||
3353dd88ab32SMasahiro Yamada			     substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
3354dd88ab32SMasahiro Yamada				$realline_next++;
3355dd88ab32SMasahiro Yamada			}
3356dd88ab32SMasahiro Yamada
3357dd88ab32SMasahiro Yamada			my $s = $stat;
3358dd88ab32SMasahiro Yamada			$s =~ s/{.*$//s;
3359dd88ab32SMasahiro Yamada
3360dd88ab32SMasahiro Yamada			# Ignore goto labels.
3361dd88ab32SMasahiro Yamada			if ($s =~ /$Ident:\*$/s) {
3362dd88ab32SMasahiro Yamada
3363dd88ab32SMasahiro Yamada			# Ignore functions being called
3364dd88ab32SMasahiro Yamada			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
3365dd88ab32SMasahiro Yamada
3366dd88ab32SMasahiro Yamada			} elsif ($s =~ /^.\s*else\b/s) {
3367dd88ab32SMasahiro Yamada
3368dd88ab32SMasahiro Yamada			# declarations always start with types
3369dd88ab32SMasahiro 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) {
3370dd88ab32SMasahiro Yamada				my $type = $1;
3371dd88ab32SMasahiro Yamada				$type =~ s/\s+/ /g;
3372dd88ab32SMasahiro Yamada				possible($type, "A:" . $s);
3373dd88ab32SMasahiro Yamada
3374dd88ab32SMasahiro Yamada			# definitions in global scope can only start with types
3375dd88ab32SMasahiro Yamada			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
3376dd88ab32SMasahiro Yamada				possible($1, "B:" . $s);
3377dd88ab32SMasahiro Yamada			}
3378dd88ab32SMasahiro Yamada
3379dd88ab32SMasahiro Yamada			# any (foo ... *) is a pointer cast, and foo is a type
3380dd88ab32SMasahiro Yamada			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
3381dd88ab32SMasahiro Yamada				possible($1, "C:" . $s);
3382dd88ab32SMasahiro Yamada			}
3383dd88ab32SMasahiro Yamada
3384dd88ab32SMasahiro Yamada			# Check for any sort of function declaration.
3385dd88ab32SMasahiro Yamada			# int foo(something bar, other baz);
3386dd88ab32SMasahiro Yamada			# void (*store_gdt)(x86_descr_ptr *);
3387dd88ab32SMasahiro Yamada			if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
3388dd88ab32SMasahiro Yamada				my ($name_len) = length($1);
3389dd88ab32SMasahiro Yamada
3390dd88ab32SMasahiro Yamada				my $ctx = $s;
3391dd88ab32SMasahiro Yamada				substr($ctx, 0, $name_len + 1, '');
3392dd88ab32SMasahiro Yamada				$ctx =~ s/\)[^\)]*$//;
3393dd88ab32SMasahiro Yamada
3394dd88ab32SMasahiro Yamada				for my $arg (split(/\s*,\s*/, $ctx)) {
3395dd88ab32SMasahiro Yamada					if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
3396dd88ab32SMasahiro Yamada
3397dd88ab32SMasahiro Yamada						possible($1, "D:" . $s);
3398dd88ab32SMasahiro Yamada					}
3399dd88ab32SMasahiro Yamada				}
3400dd88ab32SMasahiro Yamada			}
3401dd88ab32SMasahiro Yamada
3402dd88ab32SMasahiro Yamada		}
3403dd88ab32SMasahiro Yamada
3404dd88ab32SMasahiro Yamada#
3405dd88ab32SMasahiro Yamada# Checks which may be anchored in the context.
3406dd88ab32SMasahiro Yamada#
3407dd88ab32SMasahiro Yamada
3408dd88ab32SMasahiro Yamada# Check for switch () and associated case and default
3409dd88ab32SMasahiro Yamada# statements should be at the same indent.
3410dd88ab32SMasahiro Yamada		if ($line=~/\bswitch\s*\(.*\)/) {
3411dd88ab32SMasahiro Yamada			my $err = '';
3412dd88ab32SMasahiro Yamada			my $sep = '';
3413dd88ab32SMasahiro Yamada			my @ctx = ctx_block_outer($linenr, $realcnt);
3414dd88ab32SMasahiro Yamada			shift(@ctx);
3415dd88ab32SMasahiro Yamada			for my $ctx (@ctx) {
3416dd88ab32SMasahiro Yamada				my ($clen, $cindent) = line_stats($ctx);
3417dd88ab32SMasahiro Yamada				if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
3418dd88ab32SMasahiro Yamada							$indent != $cindent) {
3419dd88ab32SMasahiro Yamada					$err .= "$sep$ctx\n";
3420dd88ab32SMasahiro Yamada					$sep = '';
3421dd88ab32SMasahiro Yamada				} else {
3422dd88ab32SMasahiro Yamada					$sep = "[...]\n";
3423dd88ab32SMasahiro Yamada				}
3424dd88ab32SMasahiro Yamada			}
3425dd88ab32SMasahiro Yamada			if ($err ne '') {
3426dd88ab32SMasahiro Yamada				ERROR("SWITCH_CASE_INDENT_LEVEL",
3427dd88ab32SMasahiro Yamada				      "switch and case should be at the same indent\n$hereline$err");
3428dd88ab32SMasahiro Yamada			}
3429dd88ab32SMasahiro Yamada		}
3430dd88ab32SMasahiro Yamada
3431dd88ab32SMasahiro Yamada# if/while/etc brace do not go on next line, unless defining a do while loop,
3432dd88ab32SMasahiro Yamada# or if that brace on the next line is for something else
34336305db96SHeinrich Schuchardt		if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
3434dd88ab32SMasahiro Yamada			my $pre_ctx = "$1$2";
3435dd88ab32SMasahiro Yamada
3436dd88ab32SMasahiro Yamada			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
3437dd88ab32SMasahiro Yamada
3438dd88ab32SMasahiro Yamada			if ($line =~ /^\+\t{6,}/) {
3439dd88ab32SMasahiro Yamada				WARN("DEEP_INDENTATION",
3440dd88ab32SMasahiro Yamada				     "Too many leading tabs - consider code refactoring\n" . $herecurr);
3441dd88ab32SMasahiro Yamada			}
3442dd88ab32SMasahiro Yamada
3443dd88ab32SMasahiro Yamada			my $ctx_cnt = $realcnt - $#ctx - 1;
3444dd88ab32SMasahiro Yamada			my $ctx = join("\n", @ctx);
3445dd88ab32SMasahiro Yamada
3446dd88ab32SMasahiro Yamada			my $ctx_ln = $linenr;
3447dd88ab32SMasahiro Yamada			my $ctx_skip = $realcnt;
3448dd88ab32SMasahiro Yamada
3449dd88ab32SMasahiro Yamada			while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
3450dd88ab32SMasahiro Yamada					defined $lines[$ctx_ln - 1] &&
3451dd88ab32SMasahiro Yamada					$lines[$ctx_ln - 1] =~ /^-/)) {
3452dd88ab32SMasahiro Yamada				##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
3453dd88ab32SMasahiro Yamada				$ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
3454dd88ab32SMasahiro Yamada				$ctx_ln++;
3455dd88ab32SMasahiro Yamada			}
3456dd88ab32SMasahiro Yamada
3457dd88ab32SMasahiro Yamada			#print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
3458dd88ab32SMasahiro Yamada			#print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
3459dd88ab32SMasahiro Yamada
3460dd88ab32SMasahiro Yamada			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
3461dd88ab32SMasahiro Yamada				ERROR("OPEN_BRACE",
3462dd88ab32SMasahiro Yamada				      "that open brace { should be on the previous line\n" .
3463dd88ab32SMasahiro Yamada					"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
3464dd88ab32SMasahiro Yamada			}
3465dd88ab32SMasahiro Yamada			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
3466dd88ab32SMasahiro Yamada			    $ctx =~ /\)\s*\;\s*$/ &&
3467dd88ab32SMasahiro Yamada			    defined $lines[$ctx_ln - 1])
3468dd88ab32SMasahiro Yamada			{
3469dd88ab32SMasahiro Yamada				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
3470dd88ab32SMasahiro Yamada				if ($nindent > $indent) {
3471dd88ab32SMasahiro Yamada					WARN("TRAILING_SEMICOLON",
3472dd88ab32SMasahiro Yamada					     "trailing semicolon indicates no statements, indent implies otherwise\n" .
3473dd88ab32SMasahiro Yamada						"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
3474dd88ab32SMasahiro Yamada				}
3475dd88ab32SMasahiro Yamada			}
3476dd88ab32SMasahiro Yamada		}
3477dd88ab32SMasahiro Yamada
3478dd88ab32SMasahiro Yamada# Check relative indent for conditionals and blocks.
34796305db96SHeinrich Schuchardt		if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
3480dd88ab32SMasahiro Yamada			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3481dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0)
3482dd88ab32SMasahiro Yamada					if (!defined $stat);
3483dd88ab32SMasahiro Yamada			my ($s, $c) = ($stat, $cond);
3484dd88ab32SMasahiro Yamada
3485dd88ab32SMasahiro Yamada			substr($s, 0, length($c), '');
3486dd88ab32SMasahiro Yamada
34876305db96SHeinrich Schuchardt			# remove inline comments
34886305db96SHeinrich Schuchardt			$s =~ s/$;/ /g;
34896305db96SHeinrich Schuchardt			$c =~ s/$;/ /g;
3490dd88ab32SMasahiro Yamada
3491dd88ab32SMasahiro Yamada			# Find out how long the conditional actually is.
3492dd88ab32SMasahiro Yamada			my @newlines = ($c =~ /\n/gs);
3493dd88ab32SMasahiro Yamada			my $cond_lines = 1 + $#newlines;
3494dd88ab32SMasahiro Yamada
34956305db96SHeinrich Schuchardt			# Make sure we remove the line prefixes as we have
34966305db96SHeinrich Schuchardt			# none on the first line, and are going to readd them
34976305db96SHeinrich Schuchardt			# where necessary.
34986305db96SHeinrich Schuchardt			$s =~ s/\n./\n/gs;
34996305db96SHeinrich Schuchardt			while ($s =~ /\n\s+\\\n/) {
35006305db96SHeinrich Schuchardt				$cond_lines += $s =~ s/\n\s+\\\n/\n/g;
35016305db96SHeinrich Schuchardt			}
35026305db96SHeinrich Schuchardt
3503dd88ab32SMasahiro Yamada			# We want to check the first line inside the block
3504dd88ab32SMasahiro Yamada			# starting at the end of the conditional, so remove:
3505dd88ab32SMasahiro Yamada			#  1) any blank line termination
3506dd88ab32SMasahiro Yamada			#  2) any opening brace { on end of the line
3507dd88ab32SMasahiro Yamada			#  3) any do (...) {
3508dd88ab32SMasahiro Yamada			my $continuation = 0;
3509dd88ab32SMasahiro Yamada			my $check = 0;
3510dd88ab32SMasahiro Yamada			$s =~ s/^.*\bdo\b//;
3511dd88ab32SMasahiro Yamada			$s =~ s/^\s*{//;
3512dd88ab32SMasahiro Yamada			if ($s =~ s/^\s*\\//) {
3513dd88ab32SMasahiro Yamada				$continuation = 1;
3514dd88ab32SMasahiro Yamada			}
3515dd88ab32SMasahiro Yamada			if ($s =~ s/^\s*?\n//) {
3516dd88ab32SMasahiro Yamada				$check = 1;
3517dd88ab32SMasahiro Yamada				$cond_lines++;
3518dd88ab32SMasahiro Yamada			}
3519dd88ab32SMasahiro Yamada
3520dd88ab32SMasahiro Yamada			# Also ignore a loop construct at the end of a
3521dd88ab32SMasahiro Yamada			# preprocessor statement.
3522dd88ab32SMasahiro Yamada			if (($prevline =~ /^.\s*#\s*define\s/ ||
3523dd88ab32SMasahiro Yamada			    $prevline =~ /\\\s*$/) && $continuation == 0) {
3524dd88ab32SMasahiro Yamada				$check = 0;
3525dd88ab32SMasahiro Yamada			}
3526dd88ab32SMasahiro Yamada
3527dd88ab32SMasahiro Yamada			my $cond_ptr = -1;
3528dd88ab32SMasahiro Yamada			$continuation = 0;
3529dd88ab32SMasahiro Yamada			while ($cond_ptr != $cond_lines) {
3530dd88ab32SMasahiro Yamada				$cond_ptr = $cond_lines;
3531dd88ab32SMasahiro Yamada
3532dd88ab32SMasahiro Yamada				# If we see an #else/#elif then the code
3533dd88ab32SMasahiro Yamada				# is not linear.
3534dd88ab32SMasahiro Yamada				if ($s =~ /^\s*\#\s*(?:else|elif)/) {
3535dd88ab32SMasahiro Yamada					$check = 0;
3536dd88ab32SMasahiro Yamada				}
3537dd88ab32SMasahiro Yamada
3538dd88ab32SMasahiro Yamada				# Ignore:
3539dd88ab32SMasahiro Yamada				#  1) blank lines, they should be at 0,
3540dd88ab32SMasahiro Yamada				#  2) preprocessor lines, and
3541dd88ab32SMasahiro Yamada				#  3) labels.
3542dd88ab32SMasahiro Yamada				if ($continuation ||
3543dd88ab32SMasahiro Yamada				    $s =~ /^\s*?\n/ ||
3544dd88ab32SMasahiro Yamada				    $s =~ /^\s*#\s*?/ ||
3545dd88ab32SMasahiro Yamada				    $s =~ /^\s*$Ident\s*:/) {
3546dd88ab32SMasahiro Yamada					$continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
3547dd88ab32SMasahiro Yamada					if ($s =~ s/^.*?\n//) {
3548dd88ab32SMasahiro Yamada						$cond_lines++;
3549dd88ab32SMasahiro Yamada					}
3550dd88ab32SMasahiro Yamada				}
3551dd88ab32SMasahiro Yamada			}
3552dd88ab32SMasahiro Yamada
3553dd88ab32SMasahiro Yamada			my (undef, $sindent) = line_stats("+" . $s);
3554dd88ab32SMasahiro Yamada			my $stat_real = raw_line($linenr, $cond_lines);
3555dd88ab32SMasahiro Yamada
3556dd88ab32SMasahiro Yamada			# Check if either of these lines are modified, else
3557dd88ab32SMasahiro Yamada			# this is not this patch's fault.
3558dd88ab32SMasahiro Yamada			if (!defined($stat_real) ||
3559dd88ab32SMasahiro Yamada			    $stat !~ /^\+/ && $stat_real !~ /^\+/) {
3560dd88ab32SMasahiro Yamada				$check = 0;
3561dd88ab32SMasahiro Yamada			}
3562dd88ab32SMasahiro Yamada			if (defined($stat_real) && $cond_lines > 1) {
3563dd88ab32SMasahiro Yamada				$stat_real = "[...]\n$stat_real";
3564dd88ab32SMasahiro Yamada			}
3565dd88ab32SMasahiro Yamada
3566dd88ab32SMasahiro 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";
3567dd88ab32SMasahiro Yamada
35686305db96SHeinrich Schuchardt			if ($check && $s ne '' &&
35696305db96SHeinrich Schuchardt			    (($sindent % 8) != 0 ||
35706305db96SHeinrich Schuchardt			     ($sindent < $indent) ||
35716305db96SHeinrich Schuchardt			     ($sindent == $indent &&
35726305db96SHeinrich Schuchardt			      ($s !~ /^\s*(?:\}|\{|else\b)/)) ||
35736305db96SHeinrich Schuchardt			     ($sindent > $indent + 8))) {
3574dd88ab32SMasahiro Yamada				WARN("SUSPECT_CODE_INDENT",
3575dd88ab32SMasahiro Yamada				     "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
3576dd88ab32SMasahiro Yamada			}
3577dd88ab32SMasahiro Yamada		}
3578dd88ab32SMasahiro Yamada
3579dd88ab32SMasahiro Yamada		# Track the 'values' across context and added lines.
3580dd88ab32SMasahiro Yamada		my $opline = $line; $opline =~ s/^./ /;
3581dd88ab32SMasahiro Yamada		my ($curr_values, $curr_vars) =
3582dd88ab32SMasahiro Yamada				annotate_values($opline . "\n", $prev_values);
3583dd88ab32SMasahiro Yamada		$curr_values = $prev_values . $curr_values;
3584dd88ab32SMasahiro Yamada		if ($dbg_values) {
3585dd88ab32SMasahiro Yamada			my $outline = $opline; $outline =~ s/\t/ /g;
3586dd88ab32SMasahiro Yamada			print "$linenr > .$outline\n";
3587dd88ab32SMasahiro Yamada			print "$linenr > $curr_values\n";
3588dd88ab32SMasahiro Yamada			print "$linenr >  $curr_vars\n";
3589dd88ab32SMasahiro Yamada		}
3590dd88ab32SMasahiro Yamada		$prev_values = substr($curr_values, -1);
3591dd88ab32SMasahiro Yamada
3592dd88ab32SMasahiro Yamada#ignore lines not being added
35936b9709d9STom Rini		next if ($line =~ /^[^\+]/);
3594dd88ab32SMasahiro Yamada
35956305db96SHeinrich Schuchardt# check for dereferences that span multiple lines
35966305db96SHeinrich Schuchardt		if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ &&
35976305db96SHeinrich Schuchardt		    $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) {
35986305db96SHeinrich Schuchardt			$prevline =~ /($Lval\s*(?:\.|->))\s*$/;
35996305db96SHeinrich Schuchardt			my $ref = $1;
36006305db96SHeinrich Schuchardt			$line =~ /^.\s*($Lval)/;
36016305db96SHeinrich Schuchardt			$ref .= $1;
36026305db96SHeinrich Schuchardt			$ref =~ s/\s//g;
36036305db96SHeinrich Schuchardt			WARN("MULTILINE_DEREFERENCE",
36046305db96SHeinrich Schuchardt			     "Avoid multiple line dereference - prefer '$ref'\n" . $hereprev);
36056305db96SHeinrich Schuchardt		}
36066305db96SHeinrich Schuchardt
36076305db96SHeinrich Schuchardt# check for declarations of signed or unsigned without int
36086305db96SHeinrich Schuchardt		while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
36096305db96SHeinrich Schuchardt			my $type = $1;
36106305db96SHeinrich Schuchardt			my $var = $2;
36116305db96SHeinrich Schuchardt			$var = "" if (!defined $var);
36126305db96SHeinrich Schuchardt			if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {
36136305db96SHeinrich Schuchardt				my $sign = $1;
36146305db96SHeinrich Schuchardt				my $pointer = $2;
36156305db96SHeinrich Schuchardt
36166305db96SHeinrich Schuchardt				$pointer = "" if (!defined $pointer);
36176305db96SHeinrich Schuchardt
36186305db96SHeinrich Schuchardt				if (WARN("UNSPECIFIED_INT",
36196305db96SHeinrich Schuchardt					 "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) &&
36206305db96SHeinrich Schuchardt				    $fix) {
36216305db96SHeinrich Schuchardt					my $decl = trim($sign) . " int ";
36226305db96SHeinrich Schuchardt					my $comp_pointer = $pointer;
36236305db96SHeinrich Schuchardt					$comp_pointer =~ s/\s//g;
36246305db96SHeinrich Schuchardt					$decl .= $comp_pointer;
36256305db96SHeinrich Schuchardt					$decl = rtrim($decl) if ($var eq "");
36266305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@;
36276305db96SHeinrich Schuchardt				}
36286305db96SHeinrich Schuchardt			}
36296305db96SHeinrich Schuchardt		}
36306305db96SHeinrich Schuchardt
3631dd88ab32SMasahiro Yamada# TEST: allow direct testing of the type matcher.
3632dd88ab32SMasahiro Yamada		if ($dbg_type) {
3633dd88ab32SMasahiro Yamada			if ($line =~ /^.\s*$Declare\s*$/) {
3634dd88ab32SMasahiro Yamada				ERROR("TEST_TYPE",
3635dd88ab32SMasahiro Yamada				      "TEST: is type\n" . $herecurr);
3636dd88ab32SMasahiro Yamada			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
3637dd88ab32SMasahiro Yamada				ERROR("TEST_NOT_TYPE",
3638dd88ab32SMasahiro Yamada				      "TEST: is not type ($1 is)\n". $herecurr);
3639dd88ab32SMasahiro Yamada			}
3640dd88ab32SMasahiro Yamada			next;
3641dd88ab32SMasahiro Yamada		}
3642dd88ab32SMasahiro Yamada# TEST: allow direct testing of the attribute matcher.
3643dd88ab32SMasahiro Yamada		if ($dbg_attr) {
3644dd88ab32SMasahiro Yamada			if ($line =~ /^.\s*$Modifier\s*$/) {
3645dd88ab32SMasahiro Yamada				ERROR("TEST_ATTR",
3646dd88ab32SMasahiro Yamada				      "TEST: is attr\n" . $herecurr);
3647dd88ab32SMasahiro Yamada			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
3648dd88ab32SMasahiro Yamada				ERROR("TEST_NOT_ATTR",
3649dd88ab32SMasahiro Yamada				      "TEST: is not attr ($1 is)\n". $herecurr);
3650dd88ab32SMasahiro Yamada			}
3651dd88ab32SMasahiro Yamada			next;
3652dd88ab32SMasahiro Yamada		}
3653dd88ab32SMasahiro Yamada
3654dd88ab32SMasahiro Yamada# check for initialisation to aggregates open brace on the next line
3655dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*{/ &&
3656dd88ab32SMasahiro Yamada		    $prevline =~ /(?:^|[^=])=\s*$/) {
36576305db96SHeinrich Schuchardt			if (ERROR("OPEN_BRACE",
36586305db96SHeinrich Schuchardt				  "that open brace { should be on the previous line\n" . $hereprev) &&
36596305db96SHeinrich Schuchardt			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
36606305db96SHeinrich Schuchardt				fix_delete_line($fixlinenr - 1, $prevrawline);
36616305db96SHeinrich Schuchardt				fix_delete_line($fixlinenr, $rawline);
36626305db96SHeinrich Schuchardt				my $fixedline = $prevrawline;
36636305db96SHeinrich Schuchardt				$fixedline =~ s/\s*=\s*$/ = {/;
36646305db96SHeinrich Schuchardt				fix_insert_line($fixlinenr, $fixedline);
36656305db96SHeinrich Schuchardt				$fixedline = $line;
36666305db96SHeinrich Schuchardt				$fixedline =~ s/^(.\s*)\{\s*/$1/;
36676305db96SHeinrich Schuchardt				fix_insert_line($fixlinenr, $fixedline);
36686305db96SHeinrich Schuchardt			}
3669dd88ab32SMasahiro Yamada		}
3670dd88ab32SMasahiro Yamada
3671dd88ab32SMasahiro Yamada#
3672dd88ab32SMasahiro Yamada# Checks which are anchored on the added line.
3673dd88ab32SMasahiro Yamada#
3674dd88ab32SMasahiro Yamada
3675dd88ab32SMasahiro Yamada# check for malformed paths in #include statements (uses RAW line)
3676dd88ab32SMasahiro Yamada		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
3677dd88ab32SMasahiro Yamada			my $path = $1;
3678dd88ab32SMasahiro Yamada			if ($path =~ m{//}) {
3679dd88ab32SMasahiro Yamada				ERROR("MALFORMED_INCLUDE",
3680dd88ab32SMasahiro Yamada				      "malformed #include filename\n" . $herecurr);
3681dd88ab32SMasahiro Yamada			}
3682dd88ab32SMasahiro Yamada			if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
3683dd88ab32SMasahiro Yamada				ERROR("UAPI_INCLUDE",
3684dd88ab32SMasahiro Yamada				      "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
3685dd88ab32SMasahiro Yamada			}
3686dd88ab32SMasahiro Yamada		}
3687dd88ab32SMasahiro Yamada
3688dd88ab32SMasahiro Yamada# no C99 // comments
3689dd88ab32SMasahiro Yamada		if ($line =~ m{//}) {
36906b9709d9STom Rini			if (ERROR("C99_COMMENTS",
36916b9709d9STom Rini				  "do not use C99 // comments\n" . $herecurr) &&
36926b9709d9STom Rini			    $fix) {
36936305db96SHeinrich Schuchardt				my $line = $fixed[$fixlinenr];
36946b9709d9STom Rini				if ($line =~ /\/\/(.*)$/) {
36956b9709d9STom Rini					my $comment = trim($1);
36966305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
36976b9709d9STom Rini				}
36986b9709d9STom Rini			}
3699dd88ab32SMasahiro Yamada		}
3700dd88ab32SMasahiro Yamada		# Remove C99 comments.
3701dd88ab32SMasahiro Yamada		$line =~ s@//.*@@;
3702dd88ab32SMasahiro Yamada		$opline =~ s@//.*@@;
3703dd88ab32SMasahiro Yamada
3704dd88ab32SMasahiro Yamada# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
3705dd88ab32SMasahiro Yamada# the whole statement.
3706dd88ab32SMasahiro Yamada#print "APW <$lines[$realline_next - 1]>\n";
3707dd88ab32SMasahiro Yamada		if (defined $realline_next &&
3708dd88ab32SMasahiro Yamada		    exists $lines[$realline_next - 1] &&
3709dd88ab32SMasahiro Yamada		    !defined $suppress_export{$realline_next} &&
3710dd88ab32SMasahiro Yamada		    ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
3711dd88ab32SMasahiro Yamada		     $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3712dd88ab32SMasahiro Yamada			# Handle definitions which produce identifiers with
3713dd88ab32SMasahiro Yamada			# a prefix:
3714dd88ab32SMasahiro Yamada			#   XXX(foo);
3715dd88ab32SMasahiro Yamada			#   EXPORT_SYMBOL(something_foo);
3716dd88ab32SMasahiro Yamada			my $name = $1;
3717dd88ab32SMasahiro Yamada			if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
3718dd88ab32SMasahiro Yamada			    $name =~ /^${Ident}_$2/) {
3719dd88ab32SMasahiro Yamada#print "FOO C name<$name>\n";
3720dd88ab32SMasahiro Yamada				$suppress_export{$realline_next} = 1;
3721dd88ab32SMasahiro Yamada
3722dd88ab32SMasahiro Yamada			} elsif ($stat !~ /(?:
3723dd88ab32SMasahiro Yamada				\n.}\s*$|
3724dd88ab32SMasahiro Yamada				^.DEFINE_$Ident\(\Q$name\E\)|
3725dd88ab32SMasahiro Yamada				^.DECLARE_$Ident\(\Q$name\E\)|
3726dd88ab32SMasahiro Yamada				^.LIST_HEAD\(\Q$name\E\)|
3727dd88ab32SMasahiro Yamada				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
3728dd88ab32SMasahiro Yamada				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
3729dd88ab32SMasahiro Yamada			    )/x) {
3730dd88ab32SMasahiro Yamada#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
3731dd88ab32SMasahiro Yamada				$suppress_export{$realline_next} = 2;
3732dd88ab32SMasahiro Yamada			} else {
3733dd88ab32SMasahiro Yamada				$suppress_export{$realline_next} = 1;
3734dd88ab32SMasahiro Yamada			}
3735dd88ab32SMasahiro Yamada		}
3736dd88ab32SMasahiro Yamada		if (!defined $suppress_export{$linenr} &&
3737dd88ab32SMasahiro Yamada		    $prevline =~ /^.\s*$/ &&
3738dd88ab32SMasahiro Yamada		    ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
3739dd88ab32SMasahiro Yamada		     $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3740dd88ab32SMasahiro Yamada#print "FOO B <$lines[$linenr - 1]>\n";
3741dd88ab32SMasahiro Yamada			$suppress_export{$linenr} = 2;
3742dd88ab32SMasahiro Yamada		}
3743dd88ab32SMasahiro Yamada		if (defined $suppress_export{$linenr} &&
3744dd88ab32SMasahiro Yamada		    $suppress_export{$linenr} == 2) {
3745dd88ab32SMasahiro Yamada			WARN("EXPORT_SYMBOL",
3746dd88ab32SMasahiro Yamada			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
3747dd88ab32SMasahiro Yamada		}
3748dd88ab32SMasahiro Yamada
3749dd88ab32SMasahiro Yamada# check for global initialisers.
37506305db96SHeinrich Schuchardt		if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) {
37516b9709d9STom Rini			if (ERROR("GLOBAL_INITIALISERS",
37526305db96SHeinrich Schuchardt				  "do not initialise globals to $1\n" . $herecurr) &&
37536b9709d9STom Rini			    $fix) {
37546305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;
37556b9709d9STom Rini			}
3756dd88ab32SMasahiro Yamada		}
3757dd88ab32SMasahiro Yamada# check for static initialisers.
37586305db96SHeinrich Schuchardt		if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {
37596b9709d9STom Rini			if (ERROR("INITIALISED_STATIC",
37606305db96SHeinrich Schuchardt				  "do not initialise statics to $1\n" .
37616b9709d9STom Rini				      $herecurr) &&
37626b9709d9STom Rini			    $fix) {
37636305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;
37646b9709d9STom Rini			}
3765dd88ab32SMasahiro Yamada		}
3766dd88ab32SMasahiro Yamada
37676305db96SHeinrich Schuchardt# check for misordered declarations of char/short/int/long with signed/unsigned
37686305db96SHeinrich Schuchardt		while ($sline =~ m{(\b$TypeMisordered\b)}g) {
37696305db96SHeinrich Schuchardt			my $tmp = trim($1);
37706305db96SHeinrich Schuchardt			WARN("MISORDERED_TYPE",
37716305db96SHeinrich Schuchardt			     "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr);
37726305db96SHeinrich Schuchardt		}
37736305db96SHeinrich Schuchardt
3774dd88ab32SMasahiro Yamada# check for static const char * arrays.
3775dd88ab32SMasahiro Yamada		if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
3776dd88ab32SMasahiro Yamada			WARN("STATIC_CONST_CHAR_ARRAY",
3777dd88ab32SMasahiro Yamada			     "static const char * array should probably be static const char * const\n" .
3778dd88ab32SMasahiro Yamada				$herecurr);
3779dd88ab32SMasahiro Yamada               }
3780dd88ab32SMasahiro Yamada
3781dd88ab32SMasahiro Yamada# check for static char foo[] = "bar" declarations.
3782dd88ab32SMasahiro Yamada		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
3783dd88ab32SMasahiro Yamada			WARN("STATIC_CONST_CHAR_ARRAY",
3784dd88ab32SMasahiro Yamada			     "static char array declaration should probably be static const char\n" .
3785dd88ab32SMasahiro Yamada				$herecurr);
3786dd88ab32SMasahiro Yamada               }
3787dd88ab32SMasahiro Yamada
37886305db96SHeinrich Schuchardt# check for const <foo> const where <foo> is not a pointer or array type
37896305db96SHeinrich Schuchardt		if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) {
37906305db96SHeinrich Schuchardt			my $found = $1;
37916305db96SHeinrich Schuchardt			if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) {
37926305db96SHeinrich Schuchardt				WARN("CONST_CONST",
37936305db96SHeinrich Schuchardt				     "'const $found const *' should probably be 'const $found * const'\n" . $herecurr);
37946305db96SHeinrich Schuchardt			} elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) {
37956305db96SHeinrich Schuchardt				WARN("CONST_CONST",
37966305db96SHeinrich Schuchardt				     "'const $found const' should probably be 'const $found'\n" . $herecurr);
37976305db96SHeinrich Schuchardt			}
37986305db96SHeinrich Schuchardt		}
37996305db96SHeinrich Schuchardt
38006305db96SHeinrich Schuchardt# check for non-global char *foo[] = {"bar", ...} declarations.
38016305db96SHeinrich Schuchardt		if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
38026305db96SHeinrich Schuchardt			WARN("STATIC_CONST_CHAR_ARRAY",
38036305db96SHeinrich Schuchardt			     "char * array declaration might be better as static const\n" .
38046305db96SHeinrich Schuchardt				$herecurr);
38056305db96SHeinrich Schuchardt               }
38066305db96SHeinrich Schuchardt
38076305db96SHeinrich Schuchardt# check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo)
38086305db96SHeinrich Schuchardt		if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) {
38096305db96SHeinrich Schuchardt			my $array = $1;
38106305db96SHeinrich Schuchardt			if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) {
38116305db96SHeinrich Schuchardt				my $array_div = $1;
38126305db96SHeinrich Schuchardt				if (WARN("ARRAY_SIZE",
38136305db96SHeinrich Schuchardt					 "Prefer ARRAY_SIZE($array)\n" . $herecurr) &&
38146305db96SHeinrich Schuchardt				    $fix) {
38156305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/;
38166305db96SHeinrich Schuchardt				}
38176305db96SHeinrich Schuchardt			}
38186305db96SHeinrich Schuchardt		}
38196305db96SHeinrich Schuchardt
38206b9709d9STom Rini# check for function declarations without arguments like "int foo()"
38216b9709d9STom Rini		if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
38226b9709d9STom Rini			if (ERROR("FUNCTION_WITHOUT_ARGS",
38236b9709d9STom Rini				  "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
38246b9709d9STom Rini			    $fix) {
38256305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
38266b9709d9STom Rini			}
3827dd88ab32SMasahiro Yamada		}
3828dd88ab32SMasahiro Yamada
3829dd88ab32SMasahiro Yamada# check for new typedefs, only function parameters and sparse annotations
3830dd88ab32SMasahiro Yamada# make sense.
3831dd88ab32SMasahiro Yamada		if ($line =~ /\btypedef\s/ &&
3832dd88ab32SMasahiro Yamada		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
3833dd88ab32SMasahiro Yamada		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
3834dd88ab32SMasahiro Yamada		    $line !~ /\b$typeTypedefs\b/ &&
38356305db96SHeinrich Schuchardt		    $line !~ /\b__bitwise\b/) {
3836dd88ab32SMasahiro Yamada			WARN("NEW_TYPEDEFS",
3837dd88ab32SMasahiro Yamada			     "do not add new typedefs\n" . $herecurr);
3838dd88ab32SMasahiro Yamada		}
3839dd88ab32SMasahiro Yamada
3840dd88ab32SMasahiro Yamada# * goes on variable not on type
3841dd88ab32SMasahiro Yamada		# (char*[ const])
3842dd88ab32SMasahiro Yamada		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
3843dd88ab32SMasahiro Yamada			#print "AA<$1>\n";
38446b9709d9STom Rini			my ($ident, $from, $to) = ($1, $2, $2);
3845dd88ab32SMasahiro Yamada
3846dd88ab32SMasahiro Yamada			# Should start with a space.
3847dd88ab32SMasahiro Yamada			$to =~ s/^(\S)/ $1/;
3848dd88ab32SMasahiro Yamada			# Should not end with a space.
3849dd88ab32SMasahiro Yamada			$to =~ s/\s+$//;
3850dd88ab32SMasahiro Yamada			# '*'s should not have spaces between.
3851dd88ab32SMasahiro Yamada			while ($to =~ s/\*\s+\*/\*\*/) {
3852dd88ab32SMasahiro Yamada			}
3853dd88ab32SMasahiro Yamada
38546b9709d9STom Rini##			print "1: from<$from> to<$to> ident<$ident>\n";
3855dd88ab32SMasahiro Yamada			if ($from ne $to) {
38566b9709d9STom Rini				if (ERROR("POINTER_LOCATION",
38576b9709d9STom Rini					  "\"(foo$from)\" should be \"(foo$to)\"\n" .  $herecurr) &&
38586b9709d9STom Rini				    $fix) {
38596b9709d9STom Rini					my $sub_from = $ident;
38606b9709d9STom Rini					my $sub_to = $ident;
38616b9709d9STom Rini					$sub_to =~ s/\Q$from\E/$to/;
38626305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =~
38636b9709d9STom Rini					    s@\Q$sub_from\E@$sub_to@;
38646b9709d9STom Rini				}
3865dd88ab32SMasahiro Yamada			}
3866dd88ab32SMasahiro Yamada		}
3867dd88ab32SMasahiro Yamada		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
3868dd88ab32SMasahiro Yamada			#print "BB<$1>\n";
38696b9709d9STom Rini			my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
3870dd88ab32SMasahiro Yamada
3871dd88ab32SMasahiro Yamada			# Should start with a space.
3872dd88ab32SMasahiro Yamada			$to =~ s/^(\S)/ $1/;
3873dd88ab32SMasahiro Yamada			# Should not end with a space.
3874dd88ab32SMasahiro Yamada			$to =~ s/\s+$//;
3875dd88ab32SMasahiro Yamada			# '*'s should not have spaces between.
3876dd88ab32SMasahiro Yamada			while ($to =~ s/\*\s+\*/\*\*/) {
3877dd88ab32SMasahiro Yamada			}
3878dd88ab32SMasahiro Yamada			# Modifiers should have spaces.
3879dd88ab32SMasahiro Yamada			$to =~ s/(\b$Modifier$)/$1 /;
3880dd88ab32SMasahiro Yamada
38816b9709d9STom Rini##			print "2: from<$from> to<$to> ident<$ident>\n";
3882dd88ab32SMasahiro Yamada			if ($from ne $to && $ident !~ /^$Modifier$/) {
38836b9709d9STom Rini				if (ERROR("POINTER_LOCATION",
38846b9709d9STom Rini					  "\"foo${from}bar\" should be \"foo${to}bar\"\n" .  $herecurr) &&
38856b9709d9STom Rini				    $fix) {
38866b9709d9STom Rini
38876b9709d9STom Rini					my $sub_from = $match;
38886b9709d9STom Rini					my $sub_to = $match;
38896b9709d9STom Rini					$sub_to =~ s/\Q$from\E/$to/;
38906305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =~
38916b9709d9STom Rini					    s@\Q$sub_from\E@$sub_to@;
38926b9709d9STom Rini				}
3893dd88ab32SMasahiro Yamada			}
3894dd88ab32SMasahiro Yamada		}
3895dd88ab32SMasahiro Yamada
38966305db96SHeinrich Schuchardt# avoid BUG() or BUG_ON()
38976305db96SHeinrich Schuchardt		if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
3898*c398f2dfSHeinrich Schuchardt			my $msg_level = \&WARN;
3899*c398f2dfSHeinrich Schuchardt			$msg_level = \&CHK if ($file);
3900*c398f2dfSHeinrich Schuchardt			&{$msg_level}("AVOID_BUG",
39016305db96SHeinrich Schuchardt				      "Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr);
39026305db96SHeinrich Schuchardt		}
3903dd88ab32SMasahiro Yamada
39046305db96SHeinrich Schuchardt# avoid LINUX_VERSION_CODE
3905dd88ab32SMasahiro Yamada		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
3906dd88ab32SMasahiro Yamada			WARN("LINUX_VERSION_CODE",
3907dd88ab32SMasahiro Yamada			     "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
3908dd88ab32SMasahiro Yamada		}
3909dd88ab32SMasahiro Yamada
3910dd88ab32SMasahiro Yamada# check for uses of printk_ratelimit
3911dd88ab32SMasahiro Yamada		if ($line =~ /\bprintk_ratelimit\s*\(/) {
3912dd88ab32SMasahiro Yamada			WARN("PRINTK_RATELIMITED",
3913dd88ab32SMasahiro Yamada			     "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
3914dd88ab32SMasahiro Yamada		}
3915dd88ab32SMasahiro Yamada
3916*c398f2dfSHeinrich Schuchardt# printk should use KERN_* levels
3917*c398f2dfSHeinrich Schuchardt		if ($line =~ /\bprintk\s*\(\s*(?!KERN_[A-Z]+\b)/) {
3918dd88ab32SMasahiro Yamada			WARN("PRINTK_WITHOUT_KERN_LEVEL",
3919*c398f2dfSHeinrich Schuchardt			     "printk() should include KERN_<LEVEL> facility level\n" . $herecurr);
3920dd88ab32SMasahiro Yamada		}
3921dd88ab32SMasahiro Yamada
3922dd88ab32SMasahiro Yamada		if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
3923dd88ab32SMasahiro Yamada			my $orig = $1;
3924dd88ab32SMasahiro Yamada			my $level = lc($orig);
3925dd88ab32SMasahiro Yamada			$level = "warn" if ($level eq "warning");
3926dd88ab32SMasahiro Yamada			my $level2 = $level;
3927dd88ab32SMasahiro Yamada			$level2 = "dbg" if ($level eq "debug");
3928dd88ab32SMasahiro Yamada			WARN("PREFER_PR_LEVEL",
39296305db96SHeinrich Schuchardt			     "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...\n" . $herecurr);
3930dd88ab32SMasahiro Yamada		}
3931dd88ab32SMasahiro Yamada
3932dd88ab32SMasahiro Yamada		if ($line =~ /\bpr_warning\s*\(/) {
39336b9709d9STom Rini			if (WARN("PREFER_PR_LEVEL",
39346b9709d9STom Rini				 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
39356b9709d9STom Rini			    $fix) {
39366305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~
39376b9709d9STom Rini				    s/\bpr_warning\b/pr_warn/;
39386b9709d9STom Rini			}
3939dd88ab32SMasahiro Yamada		}
3940dd88ab32SMasahiro Yamada
3941dd88ab32SMasahiro Yamada		if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
3942dd88ab32SMasahiro Yamada			my $orig = $1;
3943dd88ab32SMasahiro Yamada			my $level = lc($orig);
3944dd88ab32SMasahiro Yamada			$level = "warn" if ($level eq "warning");
3945dd88ab32SMasahiro Yamada			$level = "dbg" if ($level eq "debug");
3946dd88ab32SMasahiro Yamada			WARN("PREFER_DEV_LEVEL",
3947dd88ab32SMasahiro Yamada			     "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
3948dd88ab32SMasahiro Yamada		}
3949dd88ab32SMasahiro Yamada
39506305db96SHeinrich Schuchardt# ENOSYS means "bad syscall nr" and nothing else.  This will have a small
39516305db96SHeinrich Schuchardt# number of false positives, but assembly files are not checked, so at
39526305db96SHeinrich Schuchardt# least the arch entry code will not trigger this warning.
39536305db96SHeinrich Schuchardt		if ($line =~ /\bENOSYS\b/) {
39546305db96SHeinrich Schuchardt			WARN("ENOSYS",
39556305db96SHeinrich Schuchardt			     "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr);
39566305db96SHeinrich Schuchardt		}
39576305db96SHeinrich Schuchardt
3958dd88ab32SMasahiro Yamada# function brace can't be on same line, except for #defines of do while,
3959dd88ab32SMasahiro Yamada# or if closed on same line
3960*c398f2dfSHeinrich Schuchardt		if ($^V && $^V ge 5.10.0 &&
3961*c398f2dfSHeinrich Schuchardt		    $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ &&
3962*c398f2dfSHeinrich Schuchardt		    $sline !~ /\#\s*define\b.*do\s*\{/ &&
3963*c398f2dfSHeinrich Schuchardt		    $sline !~ /}/) {
39646305db96SHeinrich Schuchardt			if (ERROR("OPEN_BRACE",
3965*c398f2dfSHeinrich Schuchardt				  "open brace '{' following function definitions go on the next line\n" . $herecurr) &&
39666305db96SHeinrich Schuchardt			    $fix) {
39676305db96SHeinrich Schuchardt				fix_delete_line($fixlinenr, $rawline);
39686305db96SHeinrich Schuchardt				my $fixed_line = $rawline;
39696305db96SHeinrich Schuchardt				$fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*){(.*)$/;
39706305db96SHeinrich Schuchardt				my $line1 = $1;
39716305db96SHeinrich Schuchardt				my $line2 = $2;
39726305db96SHeinrich Schuchardt				fix_insert_line($fixlinenr, ltrim($line1));
39736305db96SHeinrich Schuchardt				fix_insert_line($fixlinenr, "\+{");
39746305db96SHeinrich Schuchardt				if ($line2 !~ /^\s*$/) {
39756305db96SHeinrich Schuchardt					fix_insert_line($fixlinenr, "\+\t" . trim($line2));
39766305db96SHeinrich Schuchardt				}
39776305db96SHeinrich Schuchardt			}
3978dd88ab32SMasahiro Yamada		}
3979dd88ab32SMasahiro Yamada
3980dd88ab32SMasahiro Yamada# open braces for enum, union and struct go on the same line.
3981dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*{/ &&
3982dd88ab32SMasahiro Yamada		    $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
39836305db96SHeinrich Schuchardt			if (ERROR("OPEN_BRACE",
39846305db96SHeinrich Schuchardt				  "open brace '{' following $1 go on the same line\n" . $hereprev) &&
39856305db96SHeinrich Schuchardt			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
39866305db96SHeinrich Schuchardt				fix_delete_line($fixlinenr - 1, $prevrawline);
39876305db96SHeinrich Schuchardt				fix_delete_line($fixlinenr, $rawline);
39886305db96SHeinrich Schuchardt				my $fixedline = rtrim($prevrawline) . " {";
39896305db96SHeinrich Schuchardt				fix_insert_line($fixlinenr, $fixedline);
39906305db96SHeinrich Schuchardt				$fixedline = $rawline;
39916305db96SHeinrich Schuchardt				$fixedline =~ s/^(.\s*)\{\s*/$1\t/;
39926305db96SHeinrich Schuchardt				if ($fixedline !~ /^\+\s*$/) {
39936305db96SHeinrich Schuchardt					fix_insert_line($fixlinenr, $fixedline);
39946305db96SHeinrich Schuchardt				}
39956305db96SHeinrich Schuchardt			}
3996dd88ab32SMasahiro Yamada		}
3997dd88ab32SMasahiro Yamada
3998dd88ab32SMasahiro Yamada# missing space after union, struct or enum definition
39996b9709d9STom Rini		if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
40006b9709d9STom Rini			if (WARN("SPACING",
40016b9709d9STom Rini				 "missing space after $1 definition\n" . $herecurr) &&
40026b9709d9STom Rini			    $fix) {
40036305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~
40046b9709d9STom Rini				    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
40056b9709d9STom Rini			}
40066b9709d9STom Rini		}
40076b9709d9STom Rini
40086b9709d9STom Rini# Function pointer declarations
40096b9709d9STom Rini# check spacing between type, funcptr, and args
40106b9709d9STom Rini# canonical declaration is "type (*funcptr)(args...)"
40116305db96SHeinrich Schuchardt		if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
40126b9709d9STom Rini			my $declare = $1;
40136b9709d9STom Rini			my $pre_pointer_space = $2;
40146b9709d9STom Rini			my $post_pointer_space = $3;
40156b9709d9STom Rini			my $funcname = $4;
40166b9709d9STom Rini			my $post_funcname_space = $5;
40176b9709d9STom Rini			my $pre_args_space = $6;
40186b9709d9STom Rini
40196305db96SHeinrich Schuchardt# the $Declare variable will capture all spaces after the type
40206305db96SHeinrich Schuchardt# so check it for a missing trailing missing space but pointer return types
40216305db96SHeinrich Schuchardt# don't need a space so don't warn for those.
40226305db96SHeinrich Schuchardt			my $post_declare_space = "";
40236305db96SHeinrich Schuchardt			if ($declare =~ /(\s+)$/) {
40246305db96SHeinrich Schuchardt				$post_declare_space = $1;
40256305db96SHeinrich Schuchardt				$declare = rtrim($declare);
40266305db96SHeinrich Schuchardt			}
40276305db96SHeinrich Schuchardt			if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
4028dd88ab32SMasahiro Yamada				WARN("SPACING",
40296b9709d9STom Rini				     "missing space after return type\n" . $herecurr);
40306305db96SHeinrich Schuchardt				$post_declare_space = " ";
40316b9709d9STom Rini			}
40326b9709d9STom Rini
40336b9709d9STom Rini# unnecessary space "type  (*funcptr)(args...)"
40346305db96SHeinrich Schuchardt# This test is not currently implemented because these declarations are
40356305db96SHeinrich Schuchardt# equivalent to
40366305db96SHeinrich Schuchardt#	int  foo(int bar, ...)
40376305db96SHeinrich Schuchardt# and this is form shouldn't/doesn't generate a checkpatch warning.
40386305db96SHeinrich Schuchardt#
40396305db96SHeinrich Schuchardt#			elsif ($declare =~ /\s{2,}$/) {
40406305db96SHeinrich Schuchardt#				WARN("SPACING",
40416305db96SHeinrich Schuchardt#				     "Multiple spaces after return type\n" . $herecurr);
40426305db96SHeinrich Schuchardt#			}
40436b9709d9STom Rini
40446b9709d9STom Rini# unnecessary space "type ( *funcptr)(args...)"
40456b9709d9STom Rini			if (defined $pre_pointer_space &&
40466b9709d9STom Rini			    $pre_pointer_space =~ /^\s/) {
40476b9709d9STom Rini				WARN("SPACING",
40486b9709d9STom Rini				     "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
40496b9709d9STom Rini			}
40506b9709d9STom Rini
40516b9709d9STom Rini# unnecessary space "type (* funcptr)(args...)"
40526b9709d9STom Rini			if (defined $post_pointer_space &&
40536b9709d9STom Rini			    $post_pointer_space =~ /^\s/) {
40546b9709d9STom Rini				WARN("SPACING",
40556b9709d9STom Rini				     "Unnecessary space before function pointer name\n" . $herecurr);
40566b9709d9STom Rini			}
40576b9709d9STom Rini
40586b9709d9STom Rini# unnecessary space "type (*funcptr )(args...)"
40596b9709d9STom Rini			if (defined $post_funcname_space &&
40606b9709d9STom Rini			    $post_funcname_space =~ /^\s/) {
40616b9709d9STom Rini				WARN("SPACING",
40626b9709d9STom Rini				     "Unnecessary space after function pointer name\n" . $herecurr);
40636b9709d9STom Rini			}
40646b9709d9STom Rini
40656b9709d9STom Rini# unnecessary space "type (*funcptr) (args...)"
40666b9709d9STom Rini			if (defined $pre_args_space &&
40676b9709d9STom Rini			    $pre_args_space =~ /^\s/) {
40686b9709d9STom Rini				WARN("SPACING",
40696b9709d9STom Rini				     "Unnecessary space before function pointer arguments\n" . $herecurr);
40706b9709d9STom Rini			}
40716b9709d9STom Rini
40726b9709d9STom Rini			if (show_type("SPACING") && $fix) {
40736305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~
40746305db96SHeinrich Schuchardt				    s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
40756b9709d9STom Rini			}
4076dd88ab32SMasahiro Yamada		}
4077dd88ab32SMasahiro Yamada
4078dd88ab32SMasahiro Yamada# check for spacing round square brackets; allowed:
4079dd88ab32SMasahiro Yamada#  1. with a type on the left -- int [] a;
4080dd88ab32SMasahiro Yamada#  2. at the beginning of a line for slice initialisers -- [0...10] = 5,
4081dd88ab32SMasahiro Yamada#  3. inside a curly brace -- = { [0...10] = 5 }
4082dd88ab32SMasahiro Yamada		while ($line =~ /(.*?\s)\[/g) {
4083dd88ab32SMasahiro Yamada			my ($where, $prefix) = ($-[1], $1);
4084dd88ab32SMasahiro Yamada			if ($prefix !~ /$Type\s+$/ &&
4085dd88ab32SMasahiro Yamada			    ($where != 0 || $prefix !~ /^.\s+$/) &&
4086dd88ab32SMasahiro Yamada			    $prefix !~ /[{,]\s+$/) {
40876b9709d9STom Rini				if (ERROR("BRACKET_SPACE",
40886b9709d9STom Rini					  "space prohibited before open square bracket '['\n" . $herecurr) &&
40896b9709d9STom Rini				    $fix) {
40906305db96SHeinrich Schuchardt				    $fixed[$fixlinenr] =~
40916b9709d9STom Rini					s/^(\+.*?)\s+\[/$1\[/;
40926b9709d9STom Rini				}
4093dd88ab32SMasahiro Yamada			}
4094dd88ab32SMasahiro Yamada		}
4095dd88ab32SMasahiro Yamada
4096dd88ab32SMasahiro Yamada# check for spaces between functions and their parentheses.
4097dd88ab32SMasahiro Yamada		while ($line =~ /($Ident)\s+\(/g) {
4098dd88ab32SMasahiro Yamada			my $name = $1;
4099dd88ab32SMasahiro Yamada			my $ctx_before = substr($line, 0, $-[1]);
4100dd88ab32SMasahiro Yamada			my $ctx = "$ctx_before$name";
4101dd88ab32SMasahiro Yamada
4102dd88ab32SMasahiro Yamada			# Ignore those directives where spaces _are_ permitted.
4103dd88ab32SMasahiro Yamada			if ($name =~ /^(?:
4104dd88ab32SMasahiro Yamada				if|for|while|switch|return|case|
4105dd88ab32SMasahiro Yamada				volatile|__volatile__|
4106dd88ab32SMasahiro Yamada				__attribute__|format|__extension__|
4107dd88ab32SMasahiro Yamada				asm|__asm__)$/x)
4108dd88ab32SMasahiro Yamada			{
4109dd88ab32SMasahiro Yamada			# cpp #define statements have non-optional spaces, ie
4110dd88ab32SMasahiro Yamada			# if there is a space between the name and the open
4111dd88ab32SMasahiro Yamada			# parenthesis it is simply not a parameter group.
4112dd88ab32SMasahiro Yamada			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
4113dd88ab32SMasahiro Yamada
4114dd88ab32SMasahiro Yamada			# cpp #elif statement condition may start with a (
4115dd88ab32SMasahiro Yamada			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
4116dd88ab32SMasahiro Yamada
4117dd88ab32SMasahiro Yamada			# If this whole things ends with a type its most
4118dd88ab32SMasahiro Yamada			# likely a typedef for a function.
4119dd88ab32SMasahiro Yamada			} elsif ($ctx =~ /$Type$/) {
4120dd88ab32SMasahiro Yamada
4121dd88ab32SMasahiro Yamada			} else {
41226b9709d9STom Rini				if (WARN("SPACING",
41236b9709d9STom Rini					 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
41246b9709d9STom Rini					     $fix) {
41256305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =~
41266b9709d9STom Rini					    s/\b$name\s+\(/$name\(/;
4127dd88ab32SMasahiro Yamada				}
4128dd88ab32SMasahiro Yamada			}
4129dd88ab32SMasahiro Yamada		}
4130dd88ab32SMasahiro Yamada
4131dd88ab32SMasahiro Yamada# Check operator spacing.
4132dd88ab32SMasahiro Yamada		if (!($line=~/\#\s*include/)) {
41336b9709d9STom Rini			my $fixed_line = "";
41346b9709d9STom Rini			my $line_fixed = 0;
41356b9709d9STom Rini
4136dd88ab32SMasahiro Yamada			my $ops = qr{
4137dd88ab32SMasahiro Yamada				<<=|>>=|<=|>=|==|!=|
4138dd88ab32SMasahiro Yamada				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
4139dd88ab32SMasahiro Yamada				=>|->|<<|>>|<|>|=|!|~|
4140dd88ab32SMasahiro Yamada				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
41416b9709d9STom Rini				\?:|\?|:
4142dd88ab32SMasahiro Yamada			}x;
4143dd88ab32SMasahiro Yamada			my @elements = split(/($ops|;)/, $opline);
41446b9709d9STom Rini
41456b9709d9STom Rini##			print("element count: <" . $#elements . ">\n");
41466b9709d9STom Rini##			foreach my $el (@elements) {
41476b9709d9STom Rini##				print("el: <$el>\n");
41486b9709d9STom Rini##			}
41496b9709d9STom Rini
41506b9709d9STom Rini			my @fix_elements = ();
4151dd88ab32SMasahiro Yamada			my $off = 0;
4152dd88ab32SMasahiro Yamada
41536b9709d9STom Rini			foreach my $el (@elements) {
41546b9709d9STom Rini				push(@fix_elements, substr($rawline, $off, length($el)));
41556b9709d9STom Rini				$off += length($el);
41566b9709d9STom Rini			}
41576b9709d9STom Rini
41586b9709d9STom Rini			$off = 0;
41596b9709d9STom Rini
4160dd88ab32SMasahiro Yamada			my $blank = copy_spacing($opline);
41616b9709d9STom Rini			my $last_after = -1;
4162dd88ab32SMasahiro Yamada
4163dd88ab32SMasahiro Yamada			for (my $n = 0; $n < $#elements; $n += 2) {
41646b9709d9STom Rini
41656b9709d9STom Rini				my $good = $fix_elements[$n] . $fix_elements[$n + 1];
41666b9709d9STom Rini
41676b9709d9STom Rini##				print("n: <$n> good: <$good>\n");
41686b9709d9STom Rini
4169dd88ab32SMasahiro Yamada				$off += length($elements[$n]);
4170dd88ab32SMasahiro Yamada
4171dd88ab32SMasahiro Yamada				# Pick up the preceding and succeeding characters.
4172dd88ab32SMasahiro Yamada				my $ca = substr($opline, 0, $off);
4173dd88ab32SMasahiro Yamada				my $cc = '';
4174dd88ab32SMasahiro Yamada				if (length($opline) >= ($off + length($elements[$n + 1]))) {
4175dd88ab32SMasahiro Yamada					$cc = substr($opline, $off + length($elements[$n + 1]));
4176dd88ab32SMasahiro Yamada				}
4177dd88ab32SMasahiro Yamada				my $cb = "$ca$;$cc";
4178dd88ab32SMasahiro Yamada
4179dd88ab32SMasahiro Yamada				my $a = '';
4180dd88ab32SMasahiro Yamada				$a = 'V' if ($elements[$n] ne '');
4181dd88ab32SMasahiro Yamada				$a = 'W' if ($elements[$n] =~ /\s$/);
4182dd88ab32SMasahiro Yamada				$a = 'C' if ($elements[$n] =~ /$;$/);
4183dd88ab32SMasahiro Yamada				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
4184dd88ab32SMasahiro Yamada				$a = 'O' if ($elements[$n] eq '');
4185dd88ab32SMasahiro Yamada				$a = 'E' if ($ca =~ /^\s*$/);
4186dd88ab32SMasahiro Yamada
4187dd88ab32SMasahiro Yamada				my $op = $elements[$n + 1];
4188dd88ab32SMasahiro Yamada
4189dd88ab32SMasahiro Yamada				my $c = '';
4190dd88ab32SMasahiro Yamada				if (defined $elements[$n + 2]) {
4191dd88ab32SMasahiro Yamada					$c = 'V' if ($elements[$n + 2] ne '');
4192dd88ab32SMasahiro Yamada					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
4193dd88ab32SMasahiro Yamada					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4194dd88ab32SMasahiro Yamada					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
4195dd88ab32SMasahiro Yamada					$c = 'O' if ($elements[$n + 2] eq '');
4196dd88ab32SMasahiro Yamada					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4197dd88ab32SMasahiro Yamada				} else {
4198dd88ab32SMasahiro Yamada					$c = 'E';
4199dd88ab32SMasahiro Yamada				}
4200dd88ab32SMasahiro Yamada
4201dd88ab32SMasahiro Yamada				my $ctx = "${a}x${c}";
4202dd88ab32SMasahiro Yamada
4203dd88ab32SMasahiro Yamada				my $at = "(ctx:$ctx)";
4204dd88ab32SMasahiro Yamada
4205dd88ab32SMasahiro Yamada				my $ptr = substr($blank, 0, $off) . "^";
4206dd88ab32SMasahiro Yamada				my $hereptr = "$hereline$ptr\n";
4207dd88ab32SMasahiro Yamada
4208dd88ab32SMasahiro Yamada				# Pull out the value of this operator.
4209dd88ab32SMasahiro Yamada				my $op_type = substr($curr_values, $off + 1, 1);
4210dd88ab32SMasahiro Yamada
4211dd88ab32SMasahiro Yamada				# Get the full operator variant.
4212dd88ab32SMasahiro Yamada				my $opv = $op . substr($curr_vars, $off, 1);
4213dd88ab32SMasahiro Yamada
4214dd88ab32SMasahiro Yamada				# Ignore operators passed as parameters.
4215dd88ab32SMasahiro Yamada				if ($op_type ne 'V' &&
42166305db96SHeinrich Schuchardt				    $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) {
4217dd88ab32SMasahiro Yamada
4218dd88ab32SMasahiro Yamada#				# Ignore comments
4219dd88ab32SMasahiro Yamada#				} elsif ($op =~ /^$;+$/) {
4220dd88ab32SMasahiro Yamada
4221dd88ab32SMasahiro Yamada				# ; should have either the end of line or a space or \ after it
4222dd88ab32SMasahiro Yamada				} elsif ($op eq ';') {
4223dd88ab32SMasahiro Yamada					if ($ctx !~ /.x[WEBC]/ &&
4224dd88ab32SMasahiro Yamada					    $cc !~ /^\\/ && $cc !~ /^;/) {
42256b9709d9STom Rini						if (ERROR("SPACING",
42266b9709d9STom Rini							  "space required after that '$op' $at\n" . $hereptr)) {
42276b9709d9STom Rini							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
42286b9709d9STom Rini							$line_fixed = 1;
42296b9709d9STom Rini						}
4230dd88ab32SMasahiro Yamada					}
4231dd88ab32SMasahiro Yamada
4232dd88ab32SMasahiro Yamada				# // is a comment
4233dd88ab32SMasahiro Yamada				} elsif ($op eq '//') {
4234dd88ab32SMasahiro Yamada
42356305db96SHeinrich Schuchardt				#   :   when part of a bitfield
42366305db96SHeinrich Schuchardt				} elsif ($opv eq ':B') {
42376305db96SHeinrich Schuchardt					# skip the bitfield test for now
42386305db96SHeinrich Schuchardt
4239dd88ab32SMasahiro Yamada				# No spaces for:
4240dd88ab32SMasahiro Yamada				#   ->
42416305db96SHeinrich Schuchardt				} elsif ($op eq '->') {
4242dd88ab32SMasahiro Yamada					if ($ctx =~ /Wx.|.xW/) {
42436b9709d9STom Rini						if (ERROR("SPACING",
42446b9709d9STom Rini							  "spaces prohibited around that '$op' $at\n" . $hereptr)) {
42456b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
42466b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
42476b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
42486b9709d9STom Rini							}
42496b9709d9STom Rini							$line_fixed = 1;
42506b9709d9STom Rini						}
4251dd88ab32SMasahiro Yamada					}
4252dd88ab32SMasahiro Yamada
42536305db96SHeinrich Schuchardt				# , must not have a space before and must have a space on the right.
4254dd88ab32SMasahiro Yamada				} elsif ($op eq ',') {
42556305db96SHeinrich Schuchardt					my $rtrim_before = 0;
42566305db96SHeinrich Schuchardt					my $space_after = 0;
42576305db96SHeinrich Schuchardt					if ($ctx =~ /Wx./) {
42586305db96SHeinrich Schuchardt						if (ERROR("SPACING",
42596305db96SHeinrich Schuchardt							  "space prohibited before that '$op' $at\n" . $hereptr)) {
42606305db96SHeinrich Schuchardt							$line_fixed = 1;
42616305db96SHeinrich Schuchardt							$rtrim_before = 1;
42626305db96SHeinrich Schuchardt						}
42636305db96SHeinrich Schuchardt					}
4264dd88ab32SMasahiro Yamada					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
42656b9709d9STom Rini						if (ERROR("SPACING",
42666b9709d9STom Rini							  "space required after that '$op' $at\n" . $hereptr)) {
42676b9709d9STom Rini							$line_fixed = 1;
42686b9709d9STom Rini							$last_after = $n;
42696305db96SHeinrich Schuchardt							$space_after = 1;
42706305db96SHeinrich Schuchardt						}
42716305db96SHeinrich Schuchardt					}
42726305db96SHeinrich Schuchardt					if ($rtrim_before || $space_after) {
42736305db96SHeinrich Schuchardt						if ($rtrim_before) {
42746305db96SHeinrich Schuchardt							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
42756305db96SHeinrich Schuchardt						} else {
42766305db96SHeinrich Schuchardt							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
42776305db96SHeinrich Schuchardt						}
42786305db96SHeinrich Schuchardt						if ($space_after) {
42796305db96SHeinrich Schuchardt							$good .= " ";
42806b9709d9STom Rini						}
4281dd88ab32SMasahiro Yamada					}
4282dd88ab32SMasahiro Yamada
4283dd88ab32SMasahiro Yamada				# '*' as part of a type definition -- reported already.
4284dd88ab32SMasahiro Yamada				} elsif ($opv eq '*_') {
4285dd88ab32SMasahiro Yamada					#warn "'*' is part of type\n";
4286dd88ab32SMasahiro Yamada
4287dd88ab32SMasahiro Yamada				# unary operators should have a space before and
4288dd88ab32SMasahiro Yamada				# none after.  May be left adjacent to another
4289dd88ab32SMasahiro Yamada				# unary operator, or a cast
4290dd88ab32SMasahiro Yamada				} elsif ($op eq '!' || $op eq '~' ||
4291dd88ab32SMasahiro Yamada					 $opv eq '*U' || $opv eq '-U' ||
4292dd88ab32SMasahiro Yamada					 $opv eq '&U' || $opv eq '&&U') {
4293dd88ab32SMasahiro Yamada					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
42946b9709d9STom Rini						if (ERROR("SPACING",
42956b9709d9STom Rini							  "space required before that '$op' $at\n" . $hereptr)) {
42966b9709d9STom Rini							if ($n != $last_after + 2) {
42976b9709d9STom Rini								$good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
42986b9709d9STom Rini								$line_fixed = 1;
42996b9709d9STom Rini							}
43006b9709d9STom Rini						}
4301dd88ab32SMasahiro Yamada					}
4302dd88ab32SMasahiro Yamada					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
4303dd88ab32SMasahiro Yamada						# A unary '*' may be const
4304dd88ab32SMasahiro Yamada
4305dd88ab32SMasahiro Yamada					} elsif ($ctx =~ /.xW/) {
43066b9709d9STom Rini						if (ERROR("SPACING",
43076b9709d9STom Rini							  "space prohibited after that '$op' $at\n" . $hereptr)) {
43086b9709d9STom Rini							$good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
43096b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
43106b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
43116b9709d9STom Rini							}
43126b9709d9STom Rini							$line_fixed = 1;
43136b9709d9STom Rini						}
4314dd88ab32SMasahiro Yamada					}
4315dd88ab32SMasahiro Yamada
4316dd88ab32SMasahiro Yamada				# unary ++ and unary -- are allowed no space on one side.
4317dd88ab32SMasahiro Yamada				} elsif ($op eq '++' or $op eq '--') {
4318dd88ab32SMasahiro Yamada					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
43196b9709d9STom Rini						if (ERROR("SPACING",
43206b9709d9STom Rini							  "space required one side of that '$op' $at\n" . $hereptr)) {
43216b9709d9STom Rini							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
43226b9709d9STom Rini							$line_fixed = 1;
43236b9709d9STom Rini						}
4324dd88ab32SMasahiro Yamada					}
4325dd88ab32SMasahiro Yamada					if ($ctx =~ /Wx[BE]/ ||
4326dd88ab32SMasahiro Yamada					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
43276b9709d9STom Rini						if (ERROR("SPACING",
43286b9709d9STom Rini							  "space prohibited before that '$op' $at\n" . $hereptr)) {
43296b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
43306b9709d9STom Rini							$line_fixed = 1;
43316b9709d9STom Rini						}
4332dd88ab32SMasahiro Yamada					}
4333dd88ab32SMasahiro Yamada					if ($ctx =~ /ExW/) {
43346b9709d9STom Rini						if (ERROR("SPACING",
43356b9709d9STom Rini							  "space prohibited after that '$op' $at\n" . $hereptr)) {
43366b9709d9STom Rini							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
43376b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
43386b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
4339dd88ab32SMasahiro Yamada							}
43406b9709d9STom Rini							$line_fixed = 1;
43416b9709d9STom Rini						}
43426b9709d9STom Rini					}
4343dd88ab32SMasahiro Yamada
4344dd88ab32SMasahiro Yamada				# << and >> may either have or not have spaces both sides
4345dd88ab32SMasahiro Yamada				} elsif ($op eq '<<' or $op eq '>>' or
4346dd88ab32SMasahiro Yamada					 $op eq '&' or $op eq '^' or $op eq '|' or
4347dd88ab32SMasahiro Yamada					 $op eq '+' or $op eq '-' or
4348dd88ab32SMasahiro Yamada					 $op eq '*' or $op eq '/' or
4349dd88ab32SMasahiro Yamada					 $op eq '%')
4350dd88ab32SMasahiro Yamada				{
43516305db96SHeinrich Schuchardt					if ($check) {
43526305db96SHeinrich Schuchardt						if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) {
43536305db96SHeinrich Schuchardt							if (CHK("SPACING",
43546305db96SHeinrich Schuchardt								"spaces preferred around that '$op' $at\n" . $hereptr)) {
43556305db96SHeinrich Schuchardt								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
43566305db96SHeinrich Schuchardt								$fix_elements[$n + 2] =~ s/^\s+//;
43576305db96SHeinrich Schuchardt								$line_fixed = 1;
43586305db96SHeinrich Schuchardt							}
43596305db96SHeinrich Schuchardt						} elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) {
43606305db96SHeinrich Schuchardt							if (CHK("SPACING",
43616305db96SHeinrich Schuchardt								"space preferred before that '$op' $at\n" . $hereptr)) {
43626305db96SHeinrich Schuchardt								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]);
43636305db96SHeinrich Schuchardt								$line_fixed = 1;
43646305db96SHeinrich Schuchardt							}
43656305db96SHeinrich Schuchardt						}
43666305db96SHeinrich Schuchardt					} elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
43676b9709d9STom Rini						if (ERROR("SPACING",
43686b9709d9STom Rini							  "need consistent spacing around '$op' $at\n" . $hereptr)) {
43696b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
43706b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
43716b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
43726b9709d9STom Rini							}
43736b9709d9STom Rini							$line_fixed = 1;
43746b9709d9STom Rini						}
4375dd88ab32SMasahiro Yamada					}
4376dd88ab32SMasahiro Yamada
4377dd88ab32SMasahiro Yamada				# A colon needs no spaces before when it is
4378dd88ab32SMasahiro Yamada				# terminating a case value or a label.
4379dd88ab32SMasahiro Yamada				} elsif ($opv eq ':C' || $opv eq ':L') {
4380dd88ab32SMasahiro Yamada					if ($ctx =~ /Wx./) {
43816b9709d9STom Rini						if (ERROR("SPACING",
43826b9709d9STom Rini							  "space prohibited before that '$op' $at\n" . $hereptr)) {
43836b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
43846b9709d9STom Rini							$line_fixed = 1;
43856b9709d9STom Rini						}
4386dd88ab32SMasahiro Yamada					}
4387dd88ab32SMasahiro Yamada
4388dd88ab32SMasahiro Yamada				# All the others need spaces both sides.
4389dd88ab32SMasahiro Yamada				} elsif ($ctx !~ /[EWC]x[CWE]/) {
4390dd88ab32SMasahiro Yamada					my $ok = 0;
4391dd88ab32SMasahiro Yamada
4392dd88ab32SMasahiro Yamada					# Ignore email addresses <foo@bar>
4393dd88ab32SMasahiro Yamada					if (($op eq '<' &&
4394dd88ab32SMasahiro Yamada					     $cc =~ /^\S+\@\S+>/) ||
4395dd88ab32SMasahiro Yamada					    ($op eq '>' &&
4396dd88ab32SMasahiro Yamada					     $ca =~ /<\S+\@\S+$/))
4397dd88ab32SMasahiro Yamada					{
4398dd88ab32SMasahiro Yamada					    	$ok = 1;
4399dd88ab32SMasahiro Yamada					}
4400dd88ab32SMasahiro Yamada
44016305db96SHeinrich Schuchardt					# for asm volatile statements
44026305db96SHeinrich Schuchardt					# ignore a colon with another
44036305db96SHeinrich Schuchardt					# colon immediately before or after
44046305db96SHeinrich Schuchardt					if (($op eq ':') &&
44056305db96SHeinrich Schuchardt					    ($ca =~ /:$/ || $cc =~ /^:/)) {
44066305db96SHeinrich Schuchardt						$ok = 1;
44076305db96SHeinrich Schuchardt					}
44086305db96SHeinrich Schuchardt
44096b9709d9STom Rini					# messages are ERROR, but ?: are CHK
4410dd88ab32SMasahiro Yamada					if ($ok == 0) {
4411*c398f2dfSHeinrich Schuchardt						my $msg_level = \&ERROR;
4412*c398f2dfSHeinrich Schuchardt						$msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
44136b9709d9STom Rini
4414*c398f2dfSHeinrich Schuchardt						if (&{$msg_level}("SPACING",
44156b9709d9STom Rini								  "spaces required around that '$op' $at\n" . $hereptr)) {
44166b9709d9STom Rini							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
44176b9709d9STom Rini							if (defined $fix_elements[$n + 2]) {
44186b9709d9STom Rini								$fix_elements[$n + 2] =~ s/^\s+//;
44196b9709d9STom Rini							}
44206b9709d9STom Rini							$line_fixed = 1;
44216b9709d9STom Rini						}
4422dd88ab32SMasahiro Yamada					}
4423dd88ab32SMasahiro Yamada				}
4424dd88ab32SMasahiro Yamada				$off += length($elements[$n + 1]);
44256b9709d9STom Rini
44266b9709d9STom Rini##				print("n: <$n> GOOD: <$good>\n");
44276b9709d9STom Rini
44286b9709d9STom Rini				$fixed_line = $fixed_line . $good;
44296b9709d9STom Rini			}
44306b9709d9STom Rini
44316b9709d9STom Rini			if (($#elements % 2) == 0) {
44326b9709d9STom Rini				$fixed_line = $fixed_line . $fix_elements[$#elements];
44336b9709d9STom Rini			}
44346b9709d9STom Rini
44356305db96SHeinrich Schuchardt			if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
44366305db96SHeinrich Schuchardt				$fixed[$fixlinenr] = $fixed_line;
44376b9709d9STom Rini			}
44386b9709d9STom Rini
44396b9709d9STom Rini
44406b9709d9STom Rini		}
44416b9709d9STom Rini
44426b9709d9STom Rini# check for whitespace before a non-naked semicolon
44436b9709d9STom Rini		if ($line =~ /^\+.*\S\s+;\s*$/) {
44446b9709d9STom Rini			if (WARN("SPACING",
44456b9709d9STom Rini				 "space prohibited before semicolon\n" . $herecurr) &&
44466b9709d9STom Rini			    $fix) {
44476305db96SHeinrich Schuchardt				1 while $fixed[$fixlinenr] =~
44486b9709d9STom Rini				    s/^(\+.*\S)\s+;/$1;/;
4449dd88ab32SMasahiro Yamada			}
4450dd88ab32SMasahiro Yamada		}
4451dd88ab32SMasahiro Yamada
4452dd88ab32SMasahiro Yamada# check for multiple assignments
4453dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
4454dd88ab32SMasahiro Yamada			CHK("MULTIPLE_ASSIGNMENTS",
4455dd88ab32SMasahiro Yamada			    "multiple assignments should be avoided\n" . $herecurr);
4456dd88ab32SMasahiro Yamada		}
4457dd88ab32SMasahiro Yamada
4458dd88ab32SMasahiro Yamada## # check for multiple declarations, allowing for a function declaration
4459dd88ab32SMasahiro Yamada## # continuation.
4460dd88ab32SMasahiro Yamada## 		if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
4461dd88ab32SMasahiro Yamada## 		    $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
4462dd88ab32SMasahiro Yamada##
4463dd88ab32SMasahiro Yamada## 			# Remove any bracketed sections to ensure we do not
4464dd88ab32SMasahiro Yamada## 			# falsly report the parameters of functions.
4465dd88ab32SMasahiro Yamada## 			my $ln = $line;
4466dd88ab32SMasahiro Yamada## 			while ($ln =~ s/\([^\(\)]*\)//g) {
4467dd88ab32SMasahiro Yamada## 			}
4468dd88ab32SMasahiro Yamada## 			if ($ln =~ /,/) {
4469dd88ab32SMasahiro Yamada## 				WARN("MULTIPLE_DECLARATION",
4470dd88ab32SMasahiro Yamada##				     "declaring multiple variables together should be avoided\n" . $herecurr);
4471dd88ab32SMasahiro Yamada## 			}
4472dd88ab32SMasahiro Yamada## 		}
4473dd88ab32SMasahiro Yamada
4474dd88ab32SMasahiro Yamada#need space before brace following if, while, etc
44756305db96SHeinrich Schuchardt		if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
4476d8a1a304SHeiko Schocher		    $line =~ /do\{/) {
44776b9709d9STom Rini			if (ERROR("SPACING",
44786b9709d9STom Rini				  "space required before the open brace '{'\n" . $herecurr) &&
44796b9709d9STom Rini			    $fix) {
44806305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/^(\+.*(?:do|\)))\{/$1 {/;
4481dd88ab32SMasahiro Yamada			}
44826b9709d9STom Rini		}
44836b9709d9STom Rini
44846b9709d9STom Rini## # check for blank lines before declarations
44856b9709d9STom Rini##		if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
44866b9709d9STom Rini##		    $prevrawline =~ /^.\s*$/) {
44876b9709d9STom Rini##			WARN("SPACING",
44886b9709d9STom Rini##			     "No blank lines before declarations\n" . $hereprev);
44896b9709d9STom Rini##		}
44906b9709d9STom Rini##
4491dd88ab32SMasahiro Yamada
4492dd88ab32SMasahiro Yamada# closing brace should have a space following it when it has anything
4493dd88ab32SMasahiro Yamada# on the line
4494dd88ab32SMasahiro Yamada		if ($line =~ /}(?!(?:,|;|\)))\S/) {
44956b9709d9STom Rini			if (ERROR("SPACING",
44966b9709d9STom Rini				  "space required after that close brace '}'\n" . $herecurr) &&
44976b9709d9STom Rini			    $fix) {
44986305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~
44996b9709d9STom Rini				    s/}((?!(?:,|;|\)))\S)/} $1/;
45006b9709d9STom Rini			}
4501dd88ab32SMasahiro Yamada		}
4502dd88ab32SMasahiro Yamada
4503dd88ab32SMasahiro Yamada# check spacing on square brackets
4504dd88ab32SMasahiro Yamada		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
45056b9709d9STom Rini			if (ERROR("SPACING",
45066b9709d9STom Rini				  "space prohibited after that open square bracket '['\n" . $herecurr) &&
45076b9709d9STom Rini			    $fix) {
45086305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~
45096b9709d9STom Rini				    s/\[\s+/\[/;
45106b9709d9STom Rini			}
4511dd88ab32SMasahiro Yamada		}
4512dd88ab32SMasahiro Yamada		if ($line =~ /\s\]/) {
45136b9709d9STom Rini			if (ERROR("SPACING",
45146b9709d9STom Rini				  "space prohibited before that close square bracket ']'\n" . $herecurr) &&
45156b9709d9STom Rini			    $fix) {
45166305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~
45176b9709d9STom Rini				    s/\s+\]/\]/;
45186b9709d9STom Rini			}
4519dd88ab32SMasahiro Yamada		}
4520dd88ab32SMasahiro Yamada
4521dd88ab32SMasahiro Yamada# check spacing on parentheses
4522dd88ab32SMasahiro Yamada		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
4523dd88ab32SMasahiro Yamada		    $line !~ /for\s*\(\s+;/) {
45246b9709d9STom Rini			if (ERROR("SPACING",
45256b9709d9STom Rini				  "space prohibited after that open parenthesis '('\n" . $herecurr) &&
45266b9709d9STom Rini			    $fix) {
45276305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~
45286b9709d9STom Rini				    s/\(\s+/\(/;
45296b9709d9STom Rini			}
4530dd88ab32SMasahiro Yamada		}
4531dd88ab32SMasahiro Yamada		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
4532dd88ab32SMasahiro Yamada		    $line !~ /for\s*\(.*;\s+\)/ &&
4533dd88ab32SMasahiro Yamada		    $line !~ /:\s+\)/) {
45346b9709d9STom Rini			if (ERROR("SPACING",
45356b9709d9STom Rini				  "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
45366b9709d9STom Rini			    $fix) {
45376305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~
45386b9709d9STom Rini				    s/\s+\)/\)/;
45396b9709d9STom Rini			}
4540dd88ab32SMasahiro Yamada		}
4541dd88ab32SMasahiro Yamada
45426305db96SHeinrich Schuchardt# check unnecessary parentheses around addressof/dereference single $Lvals
45436305db96SHeinrich Schuchardt# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar
45446305db96SHeinrich Schuchardt
45456305db96SHeinrich Schuchardt		while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {
45466305db96SHeinrich Schuchardt			my $var = $1;
45476305db96SHeinrich Schuchardt			if (CHK("UNNECESSARY_PARENTHESES",
45486305db96SHeinrich Schuchardt				"Unnecessary parentheses around $var\n" . $herecurr) &&
45496305db96SHeinrich Schuchardt			    $fix) {
45506305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/;
45516305db96SHeinrich Schuchardt			}
45526305db96SHeinrich Schuchardt		}
45536305db96SHeinrich Schuchardt
45546305db96SHeinrich Schuchardt# check for unnecessary parentheses around function pointer uses
45556305db96SHeinrich Schuchardt# ie: (foo->bar)(); should be foo->bar();
45566305db96SHeinrich Schuchardt# but not "if (foo->bar) (" to avoid some false positives
45576305db96SHeinrich Schuchardt		if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) {
45586305db96SHeinrich Schuchardt			my $var = $2;
45596305db96SHeinrich Schuchardt			if (CHK("UNNECESSARY_PARENTHESES",
45606305db96SHeinrich Schuchardt				"Unnecessary parentheses around function pointer $var\n" . $herecurr) &&
45616305db96SHeinrich Schuchardt			    $fix) {
45626305db96SHeinrich Schuchardt				my $var2 = deparenthesize($var);
45636305db96SHeinrich Schuchardt				$var2 =~ s/\s//g;
45646305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\Q$var\E/$var2/;
45656305db96SHeinrich Schuchardt			}
45666305db96SHeinrich Schuchardt		}
45676305db96SHeinrich Schuchardt
4568*c398f2dfSHeinrich Schuchardt# check for unnecessary parentheses around comparisons in if uses
4569*c398f2dfSHeinrich Schuchardt# when !drivers/staging or command-line uses --strict
4570*c398f2dfSHeinrich Schuchardt		if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) &&
4571*c398f2dfSHeinrich Schuchardt		    $^V && $^V ge 5.10.0 && defined($stat) &&
4572*c398f2dfSHeinrich Schuchardt		    $stat =~ /(^.\s*if\s*($balanced_parens))/) {
4573*c398f2dfSHeinrich Schuchardt			my $if_stat = $1;
4574*c398f2dfSHeinrich Schuchardt			my $test = substr($2, 1, -1);
4575*c398f2dfSHeinrich Schuchardt			my $herectx;
4576*c398f2dfSHeinrich Schuchardt			while ($test =~ /(?:^|[^\w\&\!\~])+\s*\(\s*([\&\!\~]?\s*$Lval\s*(?:$Compare\s*$FuncArg)?)\s*\)/g) {
4577*c398f2dfSHeinrich Schuchardt				my $match = $1;
4578*c398f2dfSHeinrich Schuchardt				# avoid parentheses around potential macro args
4579*c398f2dfSHeinrich Schuchardt				next if ($match =~ /^\s*\w+\s*$/);
4580*c398f2dfSHeinrich Schuchardt				if (!defined($herectx)) {
4581*c398f2dfSHeinrich Schuchardt					$herectx = $here . "\n";
4582*c398f2dfSHeinrich Schuchardt					my $cnt = statement_rawlines($if_stat);
4583*c398f2dfSHeinrich Schuchardt					for (my $n = 0; $n < $cnt; $n++) {
4584*c398f2dfSHeinrich Schuchardt						my $rl = raw_line($linenr, $n);
4585*c398f2dfSHeinrich Schuchardt						$herectx .=  $rl . "\n";
4586*c398f2dfSHeinrich Schuchardt						last if $rl =~ /^[ \+].*\{/;
4587*c398f2dfSHeinrich Schuchardt					}
4588*c398f2dfSHeinrich Schuchardt				}
4589*c398f2dfSHeinrich Schuchardt				CHK("UNNECESSARY_PARENTHESES",
4590*c398f2dfSHeinrich Schuchardt				    "Unnecessary parentheses around '$match'\n" . $herectx);
4591*c398f2dfSHeinrich Schuchardt			}
4592*c398f2dfSHeinrich Schuchardt		}
4593*c398f2dfSHeinrich Schuchardt
4594dd88ab32SMasahiro Yamada#goto labels aren't indented, allow a single space however
4595dd88ab32SMasahiro Yamada		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
4596dd88ab32SMasahiro Yamada		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
45976b9709d9STom Rini			if (WARN("INDENTED_LABEL",
45986b9709d9STom Rini				 "labels should not be indented\n" . $herecurr) &&
45996b9709d9STom Rini			    $fix) {
46006305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~
46016b9709d9STom Rini				    s/^(.)\s+/$1/;
46026b9709d9STom Rini			}
4603dd88ab32SMasahiro Yamada		}
4604dd88ab32SMasahiro Yamada
46056305db96SHeinrich Schuchardt# return is not a function
46066b9709d9STom Rini		if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
4607dd88ab32SMasahiro Yamada			my $spacing = $1;
46086b9709d9STom Rini			if ($^V && $^V ge 5.10.0 &&
46096305db96SHeinrich Schuchardt			    $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
46106305db96SHeinrich Schuchardt				my $value = $1;
46116305db96SHeinrich Schuchardt				$value = deparenthesize($value);
46126305db96SHeinrich Schuchardt				if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
4613dd88ab32SMasahiro Yamada					ERROR("RETURN_PARENTHESES",
4614dd88ab32SMasahiro Yamada					      "return is not a function, parentheses are not required\n" . $herecurr);
46156305db96SHeinrich Schuchardt				}
4616dd88ab32SMasahiro Yamada			} elsif ($spacing !~ /\s+/) {
4617dd88ab32SMasahiro Yamada				ERROR("SPACING",
4618dd88ab32SMasahiro Yamada				      "space required before the open parenthesis '('\n" . $herecurr);
4619dd88ab32SMasahiro Yamada			}
4620dd88ab32SMasahiro Yamada		}
46216b9709d9STom Rini
46226305db96SHeinrich Schuchardt# unnecessary return in a void function
46236305db96SHeinrich Schuchardt# at end-of-function, with the previous line a single leading tab, then return;
46246305db96SHeinrich Schuchardt# and the line before that not a goto label target like "out:"
46256305db96SHeinrich Schuchardt		if ($sline =~ /^[ \+]}\s*$/ &&
46266305db96SHeinrich Schuchardt		    $prevline =~ /^\+\treturn\s*;\s*$/ &&
46276305db96SHeinrich Schuchardt		    $linenr >= 3 &&
46286305db96SHeinrich Schuchardt		    $lines[$linenr - 3] =~ /^[ +]/ &&
46296305db96SHeinrich Schuchardt		    $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
46306305db96SHeinrich Schuchardt			WARN("RETURN_VOID",
46316305db96SHeinrich Schuchardt			     "void function return statements are not generally useful\n" . $hereprev);
46326305db96SHeinrich Schuchardt               }
46336305db96SHeinrich Schuchardt
46346b9709d9STom Rini# if statements using unnecessary parentheses - ie: if ((foo == bar))
46356b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
46366b9709d9STom Rini		    $line =~ /\bif\s*((?:\(\s*){2,})/) {
46376b9709d9STom Rini			my $openparens = $1;
46386b9709d9STom Rini			my $count = $openparens =~ tr@\(@\(@;
46396b9709d9STom Rini			my $msg = "";
46406b9709d9STom Rini			if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
46416b9709d9STom Rini				my $comp = $4;	#Not $1 because of $LvalOrFunc
46426b9709d9STom Rini				$msg = " - maybe == should be = ?" if ($comp eq "==");
46436b9709d9STom Rini				WARN("UNNECESSARY_PARENTHESES",
46446b9709d9STom Rini				     "Unnecessary parentheses$msg\n" . $herecurr);
46456b9709d9STom Rini			}
46466b9709d9STom Rini		}
46476b9709d9STom Rini
46486305db96SHeinrich Schuchardt# comparisons with a constant or upper case identifier on the left
46496305db96SHeinrich Schuchardt#	avoid cases like "foo + BAR < baz"
46506305db96SHeinrich Schuchardt#	only fix matches surrounded by parentheses to avoid incorrect
46516305db96SHeinrich Schuchardt#	conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5"
46526305db96SHeinrich Schuchardt		if ($^V && $^V ge 5.10.0 &&
46536305db96SHeinrich Schuchardt		    $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) {
46546305db96SHeinrich Schuchardt			my $lead = $1;
46556305db96SHeinrich Schuchardt			my $const = $2;
46566305db96SHeinrich Schuchardt			my $comp = $3;
46576305db96SHeinrich Schuchardt			my $to = $4;
46586305db96SHeinrich Schuchardt			my $newcomp = $comp;
46596305db96SHeinrich Schuchardt			if ($lead !~ /(?:$Operators|\.)\s*$/ &&
46606305db96SHeinrich Schuchardt			    $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ &&
46616305db96SHeinrich Schuchardt			    WARN("CONSTANT_COMPARISON",
46626305db96SHeinrich Schuchardt				 "Comparisons should place the constant on the right side of the test\n" . $herecurr) &&
46636305db96SHeinrich Schuchardt			    $fix) {
46646305db96SHeinrich Schuchardt				if ($comp eq "<") {
46656305db96SHeinrich Schuchardt					$newcomp = ">";
46666305db96SHeinrich Schuchardt				} elsif ($comp eq "<=") {
46676305db96SHeinrich Schuchardt					$newcomp = ">=";
46686305db96SHeinrich Schuchardt				} elsif ($comp eq ">") {
46696305db96SHeinrich Schuchardt					$newcomp = "<";
46706305db96SHeinrich Schuchardt				} elsif ($comp eq ">=") {
46716305db96SHeinrich Schuchardt					$newcomp = "<=";
46726305db96SHeinrich Schuchardt				}
46736305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/;
46746305db96SHeinrich Schuchardt			}
46756305db96SHeinrich Schuchardt		}
46766305db96SHeinrich Schuchardt
46776305db96SHeinrich Schuchardt# Return of what appears to be an errno should normally be negative
46786305db96SHeinrich Schuchardt		if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
4679dd88ab32SMasahiro Yamada			my $name = $1;
4680dd88ab32SMasahiro Yamada			if ($name ne 'EOF' && $name ne 'ERROR') {
4681dd88ab32SMasahiro Yamada				WARN("USE_NEGATIVE_ERRNO",
46826305db96SHeinrich Schuchardt				     "return of an errno should typically be negative (ie: return -$1)\n" . $herecurr);
4683dd88ab32SMasahiro Yamada			}
4684dd88ab32SMasahiro Yamada		}
4685dd88ab32SMasahiro Yamada
4686dd88ab32SMasahiro Yamada# Need a space before open parenthesis after if, while etc
4687dd88ab32SMasahiro Yamada		if ($line =~ /\b(if|while|for|switch)\(/) {
46886b9709d9STom Rini			if (ERROR("SPACING",
46896b9709d9STom Rini				  "space required before the open parenthesis '('\n" . $herecurr) &&
46906b9709d9STom Rini			    $fix) {
46916305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~
46926b9709d9STom Rini				    s/\b(if|while|for|switch)\(/$1 \(/;
46936b9709d9STom Rini			}
4694dd88ab32SMasahiro Yamada		}
4695dd88ab32SMasahiro Yamada
4696dd88ab32SMasahiro Yamada# Check for illegal assignment in if conditional -- and check for trailing
4697dd88ab32SMasahiro Yamada# statements after the conditional.
4698dd88ab32SMasahiro Yamada		if ($line =~ /do\s*(?!{)/) {
4699dd88ab32SMasahiro Yamada			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
4700dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0)
4701dd88ab32SMasahiro Yamada					if (!defined $stat);
4702dd88ab32SMasahiro Yamada			my ($stat_next) = ctx_statement_block($line_nr_next,
4703dd88ab32SMasahiro Yamada						$remain_next, $off_next);
4704dd88ab32SMasahiro Yamada			$stat_next =~ s/\n./\n /g;
4705dd88ab32SMasahiro Yamada			##print "stat<$stat> stat_next<$stat_next>\n";
4706dd88ab32SMasahiro Yamada
4707dd88ab32SMasahiro Yamada			if ($stat_next =~ /^\s*while\b/) {
4708dd88ab32SMasahiro Yamada				# If the statement carries leading newlines,
4709dd88ab32SMasahiro Yamada				# then count those as offsets.
4710dd88ab32SMasahiro Yamada				my ($whitespace) =
4711dd88ab32SMasahiro Yamada					($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
4712dd88ab32SMasahiro Yamada				my $offset =
4713dd88ab32SMasahiro Yamada					statement_rawlines($whitespace) - 1;
4714dd88ab32SMasahiro Yamada
4715dd88ab32SMasahiro Yamada				$suppress_whiletrailers{$line_nr_next +
4716dd88ab32SMasahiro Yamada								$offset} = 1;
4717dd88ab32SMasahiro Yamada			}
4718dd88ab32SMasahiro Yamada		}
4719dd88ab32SMasahiro Yamada		if (!defined $suppress_whiletrailers{$linenr} &&
47206b9709d9STom Rini		    defined($stat) && defined($cond) &&
4721dd88ab32SMasahiro Yamada		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
4722dd88ab32SMasahiro Yamada			my ($s, $c) = ($stat, $cond);
4723dd88ab32SMasahiro Yamada
4724dd88ab32SMasahiro Yamada			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
4725dd88ab32SMasahiro Yamada				ERROR("ASSIGN_IN_IF",
4726dd88ab32SMasahiro Yamada				      "do not use assignment in if condition\n" . $herecurr);
4727dd88ab32SMasahiro Yamada			}
4728dd88ab32SMasahiro Yamada
4729dd88ab32SMasahiro Yamada			# Find out what is on the end of the line after the
4730dd88ab32SMasahiro Yamada			# conditional.
4731dd88ab32SMasahiro Yamada			substr($s, 0, length($c), '');
4732dd88ab32SMasahiro Yamada			$s =~ s/\n.*//g;
4733dd88ab32SMasahiro Yamada			$s =~ s/$;//g; 	# Remove any comments
4734dd88ab32SMasahiro Yamada			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
4735dd88ab32SMasahiro Yamada			    $c !~ /}\s*while\s*/)
4736dd88ab32SMasahiro Yamada			{
4737dd88ab32SMasahiro Yamada				# Find out how long the conditional actually is.
4738dd88ab32SMasahiro Yamada				my @newlines = ($c =~ /\n/gs);
4739dd88ab32SMasahiro Yamada				my $cond_lines = 1 + $#newlines;
4740dd88ab32SMasahiro Yamada				my $stat_real = '';
4741dd88ab32SMasahiro Yamada
4742dd88ab32SMasahiro Yamada				$stat_real = raw_line($linenr, $cond_lines)
4743dd88ab32SMasahiro Yamada							. "\n" if ($cond_lines);
4744dd88ab32SMasahiro Yamada				if (defined($stat_real) && $cond_lines > 1) {
4745dd88ab32SMasahiro Yamada					$stat_real = "[...]\n$stat_real";
4746dd88ab32SMasahiro Yamada				}
4747dd88ab32SMasahiro Yamada
4748dd88ab32SMasahiro Yamada				ERROR("TRAILING_STATEMENTS",
4749dd88ab32SMasahiro Yamada				      "trailing statements should be on next line\n" . $herecurr . $stat_real);
4750dd88ab32SMasahiro Yamada			}
4751dd88ab32SMasahiro Yamada		}
4752dd88ab32SMasahiro Yamada
4753dd88ab32SMasahiro Yamada# Check for bitwise tests written as boolean
4754dd88ab32SMasahiro Yamada		if ($line =~ /
4755dd88ab32SMasahiro Yamada			(?:
4756dd88ab32SMasahiro Yamada				(?:\[|\(|\&\&|\|\|)
4757dd88ab32SMasahiro Yamada				\s*0[xX][0-9]+\s*
4758dd88ab32SMasahiro Yamada				(?:\&\&|\|\|)
4759dd88ab32SMasahiro Yamada			|
4760dd88ab32SMasahiro Yamada				(?:\&\&|\|\|)
4761dd88ab32SMasahiro Yamada				\s*0[xX][0-9]+\s*
4762dd88ab32SMasahiro Yamada				(?:\&\&|\|\||\)|\])
4763dd88ab32SMasahiro Yamada			)/x)
4764dd88ab32SMasahiro Yamada		{
4765dd88ab32SMasahiro Yamada			WARN("HEXADECIMAL_BOOLEAN_TEST",
4766dd88ab32SMasahiro Yamada			     "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
4767dd88ab32SMasahiro Yamada		}
4768dd88ab32SMasahiro Yamada
4769dd88ab32SMasahiro Yamada# if and else should not have general statements after it
4770dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
4771dd88ab32SMasahiro Yamada			my $s = $1;
4772dd88ab32SMasahiro Yamada			$s =~ s/$;//g; 	# Remove any comments
4773dd88ab32SMasahiro Yamada			if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
4774dd88ab32SMasahiro Yamada				ERROR("TRAILING_STATEMENTS",
4775dd88ab32SMasahiro Yamada				      "trailing statements should be on next line\n" . $herecurr);
4776dd88ab32SMasahiro Yamada			}
4777dd88ab32SMasahiro Yamada		}
4778dd88ab32SMasahiro Yamada# if should not continue a brace
4779dd88ab32SMasahiro Yamada		if ($line =~ /}\s*if\b/) {
4780dd88ab32SMasahiro Yamada			ERROR("TRAILING_STATEMENTS",
47816305db96SHeinrich Schuchardt			      "trailing statements should be on next line (or did you mean 'else if'?)\n" .
4782dd88ab32SMasahiro Yamada				$herecurr);
4783dd88ab32SMasahiro Yamada		}
4784dd88ab32SMasahiro Yamada# case and default should not have general statements after them
4785dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
4786dd88ab32SMasahiro Yamada		    $line !~ /\G(?:
4787dd88ab32SMasahiro Yamada			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
4788dd88ab32SMasahiro Yamada			\s*return\s+
4789dd88ab32SMasahiro Yamada		    )/xg)
4790dd88ab32SMasahiro Yamada		{
4791dd88ab32SMasahiro Yamada			ERROR("TRAILING_STATEMENTS",
4792dd88ab32SMasahiro Yamada			      "trailing statements should be on next line\n" . $herecurr);
4793dd88ab32SMasahiro Yamada		}
4794dd88ab32SMasahiro Yamada
4795dd88ab32SMasahiro Yamada		# Check for }<nl>else {, these must be at the same
4796dd88ab32SMasahiro Yamada		# indent level to be relevant to each other.
47976305db96SHeinrich Schuchardt		if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ &&
4798dd88ab32SMasahiro Yamada		    $previndent == $indent) {
47996305db96SHeinrich Schuchardt			if (ERROR("ELSE_AFTER_BRACE",
48006305db96SHeinrich Schuchardt				  "else should follow close brace '}'\n" . $hereprev) &&
48016305db96SHeinrich Schuchardt			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
48026305db96SHeinrich Schuchardt				fix_delete_line($fixlinenr - 1, $prevrawline);
48036305db96SHeinrich Schuchardt				fix_delete_line($fixlinenr, $rawline);
48046305db96SHeinrich Schuchardt				my $fixedline = $prevrawline;
48056305db96SHeinrich Schuchardt				$fixedline =~ s/}\s*$//;
48066305db96SHeinrich Schuchardt				if ($fixedline !~ /^\+\s*$/) {
48076305db96SHeinrich Schuchardt					fix_insert_line($fixlinenr, $fixedline);
48086305db96SHeinrich Schuchardt				}
48096305db96SHeinrich Schuchardt				$fixedline = $rawline;
48106305db96SHeinrich Schuchardt				$fixedline =~ s/^(.\s*)else/$1} else/;
48116305db96SHeinrich Schuchardt				fix_insert_line($fixlinenr, $fixedline);
48126305db96SHeinrich Schuchardt			}
4813dd88ab32SMasahiro Yamada		}
4814dd88ab32SMasahiro Yamada
48156305db96SHeinrich Schuchardt		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
4816dd88ab32SMasahiro Yamada		    $previndent == $indent) {
4817dd88ab32SMasahiro Yamada			my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
4818dd88ab32SMasahiro Yamada
4819dd88ab32SMasahiro Yamada			# Find out what is on the end of the line after the
4820dd88ab32SMasahiro Yamada			# conditional.
4821dd88ab32SMasahiro Yamada			substr($s, 0, length($c), '');
4822dd88ab32SMasahiro Yamada			$s =~ s/\n.*//g;
4823dd88ab32SMasahiro Yamada
4824dd88ab32SMasahiro Yamada			if ($s =~ /^\s*;/) {
48256305db96SHeinrich Schuchardt				if (ERROR("WHILE_AFTER_BRACE",
48266305db96SHeinrich Schuchardt					  "while should follow close brace '}'\n" . $hereprev) &&
48276305db96SHeinrich Schuchardt				    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
48286305db96SHeinrich Schuchardt					fix_delete_line($fixlinenr - 1, $prevrawline);
48296305db96SHeinrich Schuchardt					fix_delete_line($fixlinenr, $rawline);
48306305db96SHeinrich Schuchardt					my $fixedline = $prevrawline;
48316305db96SHeinrich Schuchardt					my $trailing = $rawline;
48326305db96SHeinrich Schuchardt					$trailing =~ s/^\+//;
48336305db96SHeinrich Schuchardt					$trailing = trim($trailing);
48346305db96SHeinrich Schuchardt					$fixedline =~ s/}\s*$/} $trailing/;
48356305db96SHeinrich Schuchardt					fix_insert_line($fixlinenr, $fixedline);
48366305db96SHeinrich Schuchardt				}
4837dd88ab32SMasahiro Yamada			}
4838dd88ab32SMasahiro Yamada		}
4839dd88ab32SMasahiro Yamada
48406b9709d9STom Rini#Specific variable tests
4841dd88ab32SMasahiro Yamada		while ($line =~ m{($Constant|$Lval)}g) {
4842dd88ab32SMasahiro Yamada			my $var = $1;
48436b9709d9STom Rini
48446b9709d9STom Rini#gcc binary extension
48456b9709d9STom Rini			if ($var =~ /^$Binary$/) {
48466b9709d9STom Rini				if (WARN("GCC_BINARY_CONSTANT",
48476b9709d9STom Rini					 "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
48486b9709d9STom Rini				    $fix) {
48496b9709d9STom Rini					my $hexval = sprintf("0x%x", oct($var));
48506305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =~
48516b9709d9STom Rini					    s/\b$var\b/$hexval/;
48526b9709d9STom Rini				}
48536b9709d9STom Rini			}
48546b9709d9STom Rini
48556b9709d9STom Rini#CamelCase
48566b9709d9STom Rini			if ($var !~ /^$Constant$/ &&
48576b9709d9STom Rini			    $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
48586b9709d9STom Rini#Ignore Page<foo> variants
48596b9709d9STom Rini			    $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
48606b9709d9STom Rini#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
48616305db96SHeinrich Schuchardt			    $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/ &&
48626305db96SHeinrich Schuchardt#Ignore some three character SI units explicitly, like MiB and KHz
48636305db96SHeinrich Schuchardt			    $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
48646b9709d9STom Rini				while ($var =~ m{($Ident)}g) {
48656b9709d9STom Rini					my $word = $1;
48666b9709d9STom Rini					next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
48676b9709d9STom Rini					if ($check) {
48686b9709d9STom Rini						seed_camelcase_includes();
48696b9709d9STom Rini						if (!$file && !$camelcase_file_seeded) {
48706b9709d9STom Rini							seed_camelcase_file($realfile);
48716b9709d9STom Rini							$camelcase_file_seeded = 1;
48726b9709d9STom Rini						}
48736b9709d9STom Rini					}
48746b9709d9STom Rini					if (!defined $camelcase{$word}) {
48756b9709d9STom Rini						$camelcase{$word} = 1;
48766b9709d9STom Rini						CHK("CAMELCASE",
48776b9709d9STom Rini						    "Avoid CamelCase: <$word>\n" . $herecurr);
48786b9709d9STom Rini					}
48796b9709d9STom Rini				}
4880dd88ab32SMasahiro Yamada			}
4881dd88ab32SMasahiro Yamada		}
4882dd88ab32SMasahiro Yamada
4883dd88ab32SMasahiro Yamada#no spaces allowed after \ in define
48846b9709d9STom Rini		if ($line =~ /\#\s*define.*\\\s+$/) {
48856b9709d9STom Rini			if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
48866b9709d9STom Rini				 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
48876b9709d9STom Rini			    $fix) {
48886305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\s+$//;
48896b9709d9STom Rini			}
4890dd88ab32SMasahiro Yamada		}
4891dd88ab32SMasahiro Yamada
48926305db96SHeinrich Schuchardt# warn if <asm/foo.h> is #included and <linux/foo.h> is available and includes
48936305db96SHeinrich Schuchardt# itself <asm/foo.h> (uses RAW line)
4894dd88ab32SMasahiro Yamada		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
4895dd88ab32SMasahiro Yamada			my $file = "$1.h";
4896dd88ab32SMasahiro Yamada			my $checkfile = "include/linux/$file";
4897dd88ab32SMasahiro Yamada			if (-f "$root/$checkfile" &&
4898dd88ab32SMasahiro Yamada			    $realfile ne $checkfile &&
4899dd88ab32SMasahiro Yamada			    $1 !~ /$allowed_asm_includes/)
4900dd88ab32SMasahiro Yamada			{
49016305db96SHeinrich Schuchardt				my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`;
49026305db96SHeinrich Schuchardt				if ($asminclude > 0) {
4903dd88ab32SMasahiro Yamada					if ($realfile =~ m{^arch/}) {
4904dd88ab32SMasahiro Yamada						CHK("ARCH_INCLUDE_LINUX",
4905dd88ab32SMasahiro Yamada						    "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
4906dd88ab32SMasahiro Yamada					} else {
4907dd88ab32SMasahiro Yamada						WARN("INCLUDE_LINUX",
4908dd88ab32SMasahiro Yamada						     "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
4909dd88ab32SMasahiro Yamada					}
4910dd88ab32SMasahiro Yamada				}
4911dd88ab32SMasahiro Yamada			}
49126305db96SHeinrich Schuchardt		}
4913dd88ab32SMasahiro Yamada
4914dd88ab32SMasahiro Yamada# multi-statement macros should be enclosed in a do while loop, grab the
4915dd88ab32SMasahiro Yamada# first statement and ensure its the whole macro if its not enclosed
4916dd88ab32SMasahiro Yamada# in a known good container
4917dd88ab32SMasahiro Yamada		if ($realfile !~ m@/vmlinux.lds.h$@ &&
4918dd88ab32SMasahiro Yamada		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
4919dd88ab32SMasahiro Yamada			my $ln = $linenr;
4920dd88ab32SMasahiro Yamada			my $cnt = $realcnt;
4921dd88ab32SMasahiro Yamada			my ($off, $dstat, $dcond, $rest);
4922dd88ab32SMasahiro Yamada			my $ctx = '';
49236305db96SHeinrich Schuchardt			my $has_flow_statement = 0;
49246305db96SHeinrich Schuchardt			my $has_arg_concat = 0;
4925dd88ab32SMasahiro Yamada			($dstat, $dcond, $ln, $cnt, $off) =
4926dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0);
4927dd88ab32SMasahiro Yamada			$ctx = $dstat;
4928dd88ab32SMasahiro Yamada			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
4929dd88ab32SMasahiro Yamada			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
4930dd88ab32SMasahiro Yamada
49316305db96SHeinrich Schuchardt			$has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
49326305db96SHeinrich Schuchardt			$has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/);
49336305db96SHeinrich Schuchardt
49346305db96SHeinrich Schuchardt			$dstat =~ s/^.\s*\#\s*define\s+$Ident(\([^\)]*\))?\s*//;
49356305db96SHeinrich Schuchardt			my $define_args = $1;
49366305db96SHeinrich Schuchardt			my $define_stmt = $dstat;
49376305db96SHeinrich Schuchardt			my @def_args = ();
49386305db96SHeinrich Schuchardt
49396305db96SHeinrich Schuchardt			if (defined $define_args && $define_args ne "") {
49406305db96SHeinrich Schuchardt				$define_args = substr($define_args, 1, length($define_args) - 2);
49416305db96SHeinrich Schuchardt				$define_args =~ s/\s*//g;
49426305db96SHeinrich Schuchardt				@def_args = split(",", $define_args);
49436305db96SHeinrich Schuchardt			}
49446305db96SHeinrich Schuchardt
4945dd88ab32SMasahiro Yamada			$dstat =~ s/$;//g;
4946dd88ab32SMasahiro Yamada			$dstat =~ s/\\\n.//g;
4947dd88ab32SMasahiro Yamada			$dstat =~ s/^\s*//s;
4948dd88ab32SMasahiro Yamada			$dstat =~ s/\s*$//s;
4949dd88ab32SMasahiro Yamada
4950dd88ab32SMasahiro Yamada			# Flatten any parentheses and braces
4951dd88ab32SMasahiro Yamada			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
4952dd88ab32SMasahiro Yamada			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
49536305db96SHeinrich Schuchardt			       $dstat =~ s/.\[[^\[\]]*\]/1/)
4954dd88ab32SMasahiro Yamada			{
4955dd88ab32SMasahiro Yamada			}
4956dd88ab32SMasahiro Yamada
4957dd88ab32SMasahiro Yamada			# Flatten any obvious string concatentation.
49586305db96SHeinrich Schuchardt			while ($dstat =~ s/($String)\s*$Ident/$1/ ||
49596305db96SHeinrich Schuchardt			       $dstat =~ s/$Ident\s*($String)/$1/)
4960dd88ab32SMasahiro Yamada			{
4961dd88ab32SMasahiro Yamada			}
4962dd88ab32SMasahiro Yamada
49636305db96SHeinrich Schuchardt			# Make asm volatile uses seem like a generic function
49646305db96SHeinrich Schuchardt			$dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g;
49656305db96SHeinrich Schuchardt
4966dd88ab32SMasahiro Yamada			my $exceptions = qr{
4967dd88ab32SMasahiro Yamada				$Declare|
4968dd88ab32SMasahiro Yamada				module_param_named|
4969dd88ab32SMasahiro Yamada				MODULE_PARM_DESC|
4970dd88ab32SMasahiro Yamada				DECLARE_PER_CPU|
4971dd88ab32SMasahiro Yamada				DEFINE_PER_CPU|
4972dd88ab32SMasahiro Yamada				__typeof__\(|
4973dd88ab32SMasahiro Yamada				union|
4974dd88ab32SMasahiro Yamada				struct|
4975dd88ab32SMasahiro Yamada				\.$Ident\s*=\s*|
49766305db96SHeinrich Schuchardt				^\"|\"$|
49776305db96SHeinrich Schuchardt				^\[
4978dd88ab32SMasahiro Yamada			}x;
4979dd88ab32SMasahiro Yamada			#print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
49806305db96SHeinrich Schuchardt
49816305db96SHeinrich Schuchardt			$ctx =~ s/\n*$//;
49826305db96SHeinrich Schuchardt			my $stmt_cnt = statement_rawlines($ctx);
4983*c398f2dfSHeinrich Schuchardt			my $herectx = get_stat_here($linenr, $stmt_cnt, $here);
49846305db96SHeinrich Schuchardt
4985dd88ab32SMasahiro Yamada			if ($dstat ne '' &&
4986dd88ab32SMasahiro Yamada			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
4987dd88ab32SMasahiro Yamada			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
49886b9709d9STom Rini			    $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
49896305db96SHeinrich Schuchardt			    $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ &&			# character constants
4990dd88ab32SMasahiro Yamada			    $dstat !~ /$exceptions/ &&
4991dd88ab32SMasahiro Yamada			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
49926b9709d9STom Rini			    $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&		# stringification #foo
4993dd88ab32SMasahiro Yamada			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
4994dd88ab32SMasahiro Yamada			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
4995dd88ab32SMasahiro Yamada			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
4996dd88ab32SMasahiro Yamada			    $dstat !~ /^do\s*{/ &&					# do {...
4997d8a1a304SHeiko Schocher			    $dstat !~ /^\(\{/ &&						# ({...
49986b9709d9STom Rini			    $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
4999dd88ab32SMasahiro Yamada			{
50006305db96SHeinrich Schuchardt				if ($dstat =~ /^\s*if\b/) {
50016305db96SHeinrich Schuchardt					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
50026305db96SHeinrich Schuchardt					      "Macros starting with if should be enclosed by a do - while loop to avoid possible if/else logic defects\n" . "$herectx");
50036305db96SHeinrich Schuchardt				} elsif ($dstat =~ /;/) {
50046305db96SHeinrich Schuchardt					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
50056305db96SHeinrich Schuchardt					      "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
50066305db96SHeinrich Schuchardt				} else {
50076305db96SHeinrich Schuchardt					ERROR("COMPLEX_MACRO",
50086305db96SHeinrich Schuchardt					      "Macros with complex values should be enclosed in parentheses\n" . "$herectx");
50096305db96SHeinrich Schuchardt				}
50106305db96SHeinrich Schuchardt
50116305db96SHeinrich Schuchardt			}
50126305db96SHeinrich Schuchardt
50136305db96SHeinrich Schuchardt			# Make $define_stmt single line, comment-free, etc
50146305db96SHeinrich Schuchardt			my @stmt_array = split('\n', $define_stmt);
50156305db96SHeinrich Schuchardt			my $first = 1;
50166305db96SHeinrich Schuchardt			$define_stmt = "";
50176305db96SHeinrich Schuchardt			foreach my $l (@stmt_array) {
50186305db96SHeinrich Schuchardt				$l =~ s/\\$//;
50196305db96SHeinrich Schuchardt				if ($first) {
50206305db96SHeinrich Schuchardt					$define_stmt = $l;
50216305db96SHeinrich Schuchardt					$first = 0;
50226305db96SHeinrich Schuchardt				} elsif ($l =~ /^[\+ ]/) {
50236305db96SHeinrich Schuchardt					$define_stmt .= substr($l, 1);
50246305db96SHeinrich Schuchardt				}
50256305db96SHeinrich Schuchardt			}
50266305db96SHeinrich Schuchardt			$define_stmt =~ s/$;//g;
50276305db96SHeinrich Schuchardt			$define_stmt =~ s/\s+/ /g;
50286305db96SHeinrich Schuchardt			$define_stmt = trim($define_stmt);
50296305db96SHeinrich Schuchardt
50306305db96SHeinrich Schuchardt# check if any macro arguments are reused (ignore '...' and 'type')
50316305db96SHeinrich Schuchardt			foreach my $arg (@def_args) {
50326305db96SHeinrich Schuchardt			        next if ($arg =~ /\.\.\./);
50336305db96SHeinrich Schuchardt			        next if ($arg =~ /^type$/i);
50346305db96SHeinrich Schuchardt				my $tmp_stmt = $define_stmt;
50356305db96SHeinrich Schuchardt				$tmp_stmt =~ s/\b(typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
50366305db96SHeinrich Schuchardt				$tmp_stmt =~ s/\#+\s*$arg\b//g;
50376305db96SHeinrich Schuchardt				$tmp_stmt =~ s/\b$arg\s*\#\#//g;
50386305db96SHeinrich Schuchardt				my $use_cnt = $tmp_stmt =~ s/\b$arg\b//g;
50396305db96SHeinrich Schuchardt				if ($use_cnt > 1) {
50406305db96SHeinrich Schuchardt					CHK("MACRO_ARG_REUSE",
50416305db96SHeinrich Schuchardt					    "Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx");
50426305db96SHeinrich Schuchardt				    }
50436305db96SHeinrich Schuchardt# check if any macro arguments may have other precedence issues
50446305db96SHeinrich Schuchardt				if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
50456305db96SHeinrich Schuchardt				    ((defined($1) && $1 ne ',') ||
50466305db96SHeinrich Schuchardt				     (defined($2) && $2 ne ','))) {
50476305db96SHeinrich Schuchardt					CHK("MACRO_ARG_PRECEDENCE",
50486305db96SHeinrich Schuchardt					    "Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx");
50496305db96SHeinrich Schuchardt				}
50506305db96SHeinrich Schuchardt			}
50516305db96SHeinrich Schuchardt
50526305db96SHeinrich Schuchardt# check for macros with flow control, but without ## concatenation
50536305db96SHeinrich Schuchardt# ## concatenation is commonly a macro that defines a function so ignore those
50546305db96SHeinrich Schuchardt			if ($has_flow_statement && !$has_arg_concat) {
5055dd88ab32SMasahiro Yamada				my $cnt = statement_rawlines($ctx);
5056*c398f2dfSHeinrich Schuchardt				my $herectx = get_stat_here($linenr, $cnt, $here);
5057dd88ab32SMasahiro Yamada
50586305db96SHeinrich Schuchardt				WARN("MACRO_WITH_FLOW_CONTROL",
50596305db96SHeinrich Schuchardt				     "Macros with flow control statements should be avoided\n" . "$herectx");
5060dd88ab32SMasahiro Yamada			}
5061dd88ab32SMasahiro Yamada
5062dd88ab32SMasahiro Yamada# check for line continuations outside of #defines, preprocessor #, and asm
5063dd88ab32SMasahiro Yamada
5064dd88ab32SMasahiro Yamada		} else {
5065dd88ab32SMasahiro Yamada			if ($prevline !~ /^..*\\$/ &&
5066dd88ab32SMasahiro Yamada			    $line !~ /^\+\s*\#.*\\$/ &&		# preprocessor
5067dd88ab32SMasahiro Yamada			    $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&	# asm
5068dd88ab32SMasahiro Yamada			    $line =~ /^\+.*\\$/) {
5069dd88ab32SMasahiro Yamada				WARN("LINE_CONTINUATIONS",
5070dd88ab32SMasahiro Yamada				     "Avoid unnecessary line continuations\n" . $herecurr);
5071dd88ab32SMasahiro Yamada			}
5072dd88ab32SMasahiro Yamada		}
5073dd88ab32SMasahiro Yamada
5074dd88ab32SMasahiro Yamada# do {} while (0) macro tests:
5075dd88ab32SMasahiro Yamada# single-statement macros do not need to be enclosed in do while (0) loop,
5076dd88ab32SMasahiro Yamada# macro should not end with a semicolon
5077dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
5078dd88ab32SMasahiro Yamada		    $realfile !~ m@/vmlinux.lds.h$@ &&
5079dd88ab32SMasahiro Yamada		    $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
5080dd88ab32SMasahiro Yamada			my $ln = $linenr;
5081dd88ab32SMasahiro Yamada			my $cnt = $realcnt;
5082dd88ab32SMasahiro Yamada			my ($off, $dstat, $dcond, $rest);
5083dd88ab32SMasahiro Yamada			my $ctx = '';
5084dd88ab32SMasahiro Yamada			($dstat, $dcond, $ln, $cnt, $off) =
5085dd88ab32SMasahiro Yamada				ctx_statement_block($linenr, $realcnt, 0);
5086dd88ab32SMasahiro Yamada			$ctx = $dstat;
5087dd88ab32SMasahiro Yamada
5088dd88ab32SMasahiro Yamada			$dstat =~ s/\\\n.//g;
50896305db96SHeinrich Schuchardt			$dstat =~ s/$;/ /g;
5090dd88ab32SMasahiro Yamada
5091dd88ab32SMasahiro Yamada			if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
5092dd88ab32SMasahiro Yamada				my $stmts = $2;
5093dd88ab32SMasahiro Yamada				my $semis = $3;
5094dd88ab32SMasahiro Yamada
5095dd88ab32SMasahiro Yamada				$ctx =~ s/\n*$//;
5096dd88ab32SMasahiro Yamada				my $cnt = statement_rawlines($ctx);
5097*c398f2dfSHeinrich Schuchardt				my $herectx = get_stat_here($linenr, $cnt, $here);
5098dd88ab32SMasahiro Yamada
5099dd88ab32SMasahiro Yamada				if (($stmts =~ tr/;/;/) == 1 &&
5100dd88ab32SMasahiro Yamada				    $stmts !~ /^\s*(if|while|for|switch)\b/) {
5101dd88ab32SMasahiro Yamada					WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
5102dd88ab32SMasahiro Yamada					     "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
5103dd88ab32SMasahiro Yamada				}
5104dd88ab32SMasahiro Yamada				if (defined $semis && $semis ne "") {
5105dd88ab32SMasahiro Yamada					WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
5106dd88ab32SMasahiro Yamada					     "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
5107dd88ab32SMasahiro Yamada				}
51086305db96SHeinrich Schuchardt			} elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
51096305db96SHeinrich Schuchardt				$ctx =~ s/\n*$//;
51106305db96SHeinrich Schuchardt				my $cnt = statement_rawlines($ctx);
5111*c398f2dfSHeinrich Schuchardt				my $herectx = get_stat_here($linenr, $cnt, $here);
51126305db96SHeinrich Schuchardt
51136305db96SHeinrich Schuchardt				WARN("TRAILING_SEMICOLON",
51146305db96SHeinrich Schuchardt				     "macros should not use a trailing semicolon\n" . "$herectx");
5115dd88ab32SMasahiro Yamada			}
5116dd88ab32SMasahiro Yamada		}
5117dd88ab32SMasahiro Yamada
5118dd88ab32SMasahiro Yamada# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
5119dd88ab32SMasahiro Yamada# all assignments may have only one of the following with an assignment:
5120dd88ab32SMasahiro Yamada#	.
5121dd88ab32SMasahiro Yamada#	ALIGN(...)
5122dd88ab32SMasahiro Yamada#	VMLINUX_SYMBOL(...)
5123dd88ab32SMasahiro Yamada		if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
5124dd88ab32SMasahiro Yamada			WARN("MISSING_VMLINUX_SYMBOL",
5125dd88ab32SMasahiro Yamada			     "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
5126dd88ab32SMasahiro Yamada		}
5127dd88ab32SMasahiro Yamada
5128dd88ab32SMasahiro Yamada# check for redundant bracing round if etc
5129dd88ab32SMasahiro Yamada		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
5130dd88ab32SMasahiro Yamada			my ($level, $endln, @chunks) =
5131dd88ab32SMasahiro Yamada				ctx_statement_full($linenr, $realcnt, 1);
5132dd88ab32SMasahiro Yamada			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
5133dd88ab32SMasahiro Yamada			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
5134dd88ab32SMasahiro Yamada			if ($#chunks > 0 && $level == 0) {
5135dd88ab32SMasahiro Yamada				my @allowed = ();
5136dd88ab32SMasahiro Yamada				my $allow = 0;
5137dd88ab32SMasahiro Yamada				my $seen = 0;
5138dd88ab32SMasahiro Yamada				my $herectx = $here . "\n";
5139dd88ab32SMasahiro Yamada				my $ln = $linenr - 1;
5140dd88ab32SMasahiro Yamada				for my $chunk (@chunks) {
5141dd88ab32SMasahiro Yamada					my ($cond, $block) = @{$chunk};
5142dd88ab32SMasahiro Yamada
5143dd88ab32SMasahiro Yamada					# If the condition carries leading newlines, then count those as offsets.
5144dd88ab32SMasahiro Yamada					my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
5145dd88ab32SMasahiro Yamada					my $offset = statement_rawlines($whitespace) - 1;
5146dd88ab32SMasahiro Yamada
5147dd88ab32SMasahiro Yamada					$allowed[$allow] = 0;
5148dd88ab32SMasahiro Yamada					#print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
5149dd88ab32SMasahiro Yamada
5150dd88ab32SMasahiro Yamada					# We have looked at and allowed this specific line.
5151dd88ab32SMasahiro Yamada					$suppress_ifbraces{$ln + $offset} = 1;
5152dd88ab32SMasahiro Yamada
5153dd88ab32SMasahiro Yamada					$herectx .= "$rawlines[$ln + $offset]\n[...]\n";
5154dd88ab32SMasahiro Yamada					$ln += statement_rawlines($block) - 1;
5155dd88ab32SMasahiro Yamada
5156dd88ab32SMasahiro Yamada					substr($block, 0, length($cond), '');
5157dd88ab32SMasahiro Yamada
5158dd88ab32SMasahiro Yamada					$seen++ if ($block =~ /^\s*{/);
5159dd88ab32SMasahiro Yamada
5160dd88ab32SMasahiro Yamada					#print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
5161dd88ab32SMasahiro Yamada					if (statement_lines($cond) > 1) {
5162dd88ab32SMasahiro Yamada						#print "APW: ALLOWED: cond<$cond>\n";
5163dd88ab32SMasahiro Yamada						$allowed[$allow] = 1;
5164dd88ab32SMasahiro Yamada					}
5165dd88ab32SMasahiro Yamada					if ($block =~/\b(?:if|for|while)\b/) {
5166dd88ab32SMasahiro Yamada						#print "APW: ALLOWED: block<$block>\n";
5167dd88ab32SMasahiro Yamada						$allowed[$allow] = 1;
5168dd88ab32SMasahiro Yamada					}
5169dd88ab32SMasahiro Yamada					if (statement_block_size($block) > 1) {
5170dd88ab32SMasahiro Yamada						#print "APW: ALLOWED: lines block<$block>\n";
5171dd88ab32SMasahiro Yamada						$allowed[$allow] = 1;
5172dd88ab32SMasahiro Yamada					}
5173dd88ab32SMasahiro Yamada					$allow++;
5174dd88ab32SMasahiro Yamada				}
5175dd88ab32SMasahiro Yamada				if ($seen) {
5176dd88ab32SMasahiro Yamada					my $sum_allowed = 0;
5177dd88ab32SMasahiro Yamada					foreach (@allowed) {
5178dd88ab32SMasahiro Yamada						$sum_allowed += $_;
5179dd88ab32SMasahiro Yamada					}
5180dd88ab32SMasahiro Yamada					if ($sum_allowed == 0) {
5181dd88ab32SMasahiro Yamada						WARN("BRACES",
5182dd88ab32SMasahiro Yamada						     "braces {} are not necessary for any arm of this statement\n" . $herectx);
5183dd88ab32SMasahiro Yamada					} elsif ($sum_allowed != $allow &&
5184dd88ab32SMasahiro Yamada						 $seen != $allow) {
5185dd88ab32SMasahiro Yamada						CHK("BRACES",
5186dd88ab32SMasahiro Yamada						    "braces {} should be used on all arms of this statement\n" . $herectx);
5187dd88ab32SMasahiro Yamada					}
5188dd88ab32SMasahiro Yamada				}
5189dd88ab32SMasahiro Yamada			}
5190dd88ab32SMasahiro Yamada		}
5191dd88ab32SMasahiro Yamada		if (!defined $suppress_ifbraces{$linenr - 1} &&
5192dd88ab32SMasahiro Yamada					$line =~ /\b(if|while|for|else)\b/) {
5193dd88ab32SMasahiro Yamada			my $allowed = 0;
5194dd88ab32SMasahiro Yamada
5195dd88ab32SMasahiro Yamada			# Check the pre-context.
5196dd88ab32SMasahiro Yamada			if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
5197dd88ab32SMasahiro Yamada				#print "APW: ALLOWED: pre<$1>\n";
5198dd88ab32SMasahiro Yamada				$allowed = 1;
5199dd88ab32SMasahiro Yamada			}
5200dd88ab32SMasahiro Yamada
5201dd88ab32SMasahiro Yamada			my ($level, $endln, @chunks) =
5202dd88ab32SMasahiro Yamada				ctx_statement_full($linenr, $realcnt, $-[0]);
5203dd88ab32SMasahiro Yamada
5204dd88ab32SMasahiro Yamada			# Check the condition.
5205dd88ab32SMasahiro Yamada			my ($cond, $block) = @{$chunks[0]};
5206dd88ab32SMasahiro Yamada			#print "CHECKING<$linenr> cond<$cond> block<$block>\n";
5207dd88ab32SMasahiro Yamada			if (defined $cond) {
5208dd88ab32SMasahiro Yamada				substr($block, 0, length($cond), '');
5209dd88ab32SMasahiro Yamada			}
5210dd88ab32SMasahiro Yamada			if (statement_lines($cond) > 1) {
5211dd88ab32SMasahiro Yamada				#print "APW: ALLOWED: cond<$cond>\n";
5212dd88ab32SMasahiro Yamada				$allowed = 1;
5213dd88ab32SMasahiro Yamada			}
5214dd88ab32SMasahiro Yamada			if ($block =~/\b(?:if|for|while)\b/) {
5215dd88ab32SMasahiro Yamada				#print "APW: ALLOWED: block<$block>\n";
5216dd88ab32SMasahiro Yamada				$allowed = 1;
5217dd88ab32SMasahiro Yamada			}
5218dd88ab32SMasahiro Yamada			if (statement_block_size($block) > 1) {
5219dd88ab32SMasahiro Yamada				#print "APW: ALLOWED: lines block<$block>\n";
5220dd88ab32SMasahiro Yamada				$allowed = 1;
5221dd88ab32SMasahiro Yamada			}
5222dd88ab32SMasahiro Yamada			# Check the post-context.
5223dd88ab32SMasahiro Yamada			if (defined $chunks[1]) {
5224dd88ab32SMasahiro Yamada				my ($cond, $block) = @{$chunks[1]};
5225dd88ab32SMasahiro Yamada				if (defined $cond) {
5226dd88ab32SMasahiro Yamada					substr($block, 0, length($cond), '');
5227dd88ab32SMasahiro Yamada				}
5228dd88ab32SMasahiro Yamada				if ($block =~ /^\s*\{/) {
5229dd88ab32SMasahiro Yamada					#print "APW: ALLOWED: chunk-1 block<$block>\n";
5230dd88ab32SMasahiro Yamada					$allowed = 1;
5231dd88ab32SMasahiro Yamada				}
5232dd88ab32SMasahiro Yamada			}
5233dd88ab32SMasahiro Yamada			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
5234dd88ab32SMasahiro Yamada				my $cnt = statement_rawlines($block);
5235*c398f2dfSHeinrich Schuchardt				my $herectx = get_stat_here($linenr, $cnt, $here);
5236dd88ab32SMasahiro Yamada
5237dd88ab32SMasahiro Yamada				WARN("BRACES",
5238dd88ab32SMasahiro Yamada				     "braces {} are not necessary for single statement blocks\n" . $herectx);
5239dd88ab32SMasahiro Yamada			}
5240dd88ab32SMasahiro Yamada		}
5241dd88ab32SMasahiro Yamada
52426305db96SHeinrich Schuchardt# check for single line unbalanced braces
52436305db96SHeinrich Schuchardt		if ($sline =~ /^.\s*\}\s*else\s*$/ ||
52446305db96SHeinrich Schuchardt		    $sline =~ /^.\s*else\s*\{\s*$/) {
52456305db96SHeinrich Schuchardt			CHK("BRACES", "Unbalanced braces around else statement\n" . $herecurr);
52466305db96SHeinrich Schuchardt		}
52476305db96SHeinrich Schuchardt
5248dd88ab32SMasahiro Yamada# check for unnecessary blank lines around braces
52496b9709d9STom Rini		if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
52506305db96SHeinrich Schuchardt			if (CHK("BRACES",
52516305db96SHeinrich Schuchardt				"Blank lines aren't necessary before a close brace '}'\n" . $hereprev) &&
52526305db96SHeinrich Schuchardt			    $fix && $prevrawline =~ /^\+/) {
52536305db96SHeinrich Schuchardt				fix_delete_line($fixlinenr - 1, $prevrawline);
52546305db96SHeinrich Schuchardt			}
5255dd88ab32SMasahiro Yamada		}
52566b9709d9STom Rini		if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
52576305db96SHeinrich Schuchardt			if (CHK("BRACES",
52586305db96SHeinrich Schuchardt				"Blank lines aren't necessary after an open brace '{'\n" . $hereprev) &&
52596305db96SHeinrich Schuchardt			    $fix) {
52606305db96SHeinrich Schuchardt				fix_delete_line($fixlinenr, $rawline);
52616305db96SHeinrich Schuchardt			}
5262dd88ab32SMasahiro Yamada		}
5263dd88ab32SMasahiro Yamada
5264dd88ab32SMasahiro Yamada# no volatiles please
5265dd88ab32SMasahiro Yamada		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
5266dd88ab32SMasahiro Yamada		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
5267dd88ab32SMasahiro Yamada			WARN("VOLATILE",
52686305db96SHeinrich Schuchardt			     "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst\n" . $herecurr);
52696305db96SHeinrich Schuchardt		}
52706305db96SHeinrich Schuchardt
52716305db96SHeinrich Schuchardt# Check for user-visible strings broken across lines, which breaks the ability
52726305db96SHeinrich Schuchardt# to grep for the string.  Make exceptions when the previous string ends in a
52736305db96SHeinrich Schuchardt# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
52746305db96SHeinrich Schuchardt# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
52756305db96SHeinrich Schuchardt		if ($line =~ /^\+\s*$String/ &&
52766305db96SHeinrich Schuchardt		    $prevline =~ /"\s*$/ &&
52776305db96SHeinrich Schuchardt		    $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
52786305db96SHeinrich Schuchardt			if (WARN("SPLIT_STRING",
52796305db96SHeinrich Schuchardt				 "quoted string split across lines\n" . $hereprev) &&
52806305db96SHeinrich Schuchardt				     $fix &&
52816305db96SHeinrich Schuchardt				     $prevrawline =~ /^\+.*"\s*$/ &&
52826305db96SHeinrich Schuchardt				     $last_coalesced_string_linenr != $linenr - 1) {
52836305db96SHeinrich Schuchardt				my $extracted_string = get_quoted_string($line, $rawline);
52846305db96SHeinrich Schuchardt				my $comma_close = "";
52856305db96SHeinrich Schuchardt				if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) {
52866305db96SHeinrich Schuchardt					$comma_close = $1;
52876305db96SHeinrich Schuchardt				}
52886305db96SHeinrich Schuchardt
52896305db96SHeinrich Schuchardt				fix_delete_line($fixlinenr - 1, $prevrawline);
52906305db96SHeinrich Schuchardt				fix_delete_line($fixlinenr, $rawline);
52916305db96SHeinrich Schuchardt				my $fixedline = $prevrawline;
52926305db96SHeinrich Schuchardt				$fixedline =~ s/"\s*$//;
52936305db96SHeinrich Schuchardt				$fixedline .= substr($extracted_string, 1) . trim($comma_close);
52946305db96SHeinrich Schuchardt				fix_insert_line($fixlinenr - 1, $fixedline);
52956305db96SHeinrich Schuchardt				$fixedline = $rawline;
52966305db96SHeinrich Schuchardt				$fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//;
52976305db96SHeinrich Schuchardt				if ($fixedline !~ /\+\s*$/) {
52986305db96SHeinrich Schuchardt					fix_insert_line($fixlinenr, $fixedline);
52996305db96SHeinrich Schuchardt				}
53006305db96SHeinrich Schuchardt				$last_coalesced_string_linenr = $linenr;
53016305db96SHeinrich Schuchardt			}
53026305db96SHeinrich Schuchardt		}
53036305db96SHeinrich Schuchardt
53046305db96SHeinrich Schuchardt# check for missing a space in a string concatenation
53056305db96SHeinrich Schuchardt		if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) {
53066305db96SHeinrich Schuchardt			WARN('MISSING_SPACE',
53076305db96SHeinrich Schuchardt			     "break quoted strings at a space character\n" . $hereprev);
53086305db96SHeinrich Schuchardt		}
53096305db96SHeinrich Schuchardt
53106305db96SHeinrich Schuchardt# check for an embedded function name in a string when the function is known
53116305db96SHeinrich Schuchardt# This does not work very well for -f --file checking as it depends on patch
53126305db96SHeinrich Schuchardt# context providing the function name or a single line form for in-file
53136305db96SHeinrich Schuchardt# function declarations
53146305db96SHeinrich Schuchardt		if ($line =~ /^\+.*$String/ &&
53156305db96SHeinrich Schuchardt		    defined($context_function) &&
53166305db96SHeinrich Schuchardt		    get_quoted_string($line, $rawline) =~ /\b$context_function\b/ &&
53176305db96SHeinrich Schuchardt		    length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) {
53186305db96SHeinrich Schuchardt			WARN("EMBEDDED_FUNCTION_NAME",
53196305db96SHeinrich Schuchardt			     "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string\n" . $herecurr);
53206305db96SHeinrich Schuchardt		}
53216305db96SHeinrich Schuchardt
53226305db96SHeinrich Schuchardt# check for spaces before a quoted newline
53236305db96SHeinrich Schuchardt		if ($rawline =~ /^.*\".*\s\\n/) {
53246305db96SHeinrich Schuchardt			if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
53256305db96SHeinrich Schuchardt				 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
53266305db96SHeinrich Schuchardt			    $fix) {
53276305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
53286305db96SHeinrich Schuchardt			}
53296305db96SHeinrich Schuchardt
53306305db96SHeinrich Schuchardt		}
53316305db96SHeinrich Schuchardt
53326305db96SHeinrich Schuchardt# concatenated string without spaces between elements
5333*c398f2dfSHeinrich Schuchardt		if ($line =~ /$String[A-Z_]/ || $line =~ /[A-Za-z0-9_]$String/) {
53346305db96SHeinrich Schuchardt			CHK("CONCATENATED_STRING",
53356305db96SHeinrich Schuchardt			    "Concatenated strings should use spaces between elements\n" . $herecurr);
53366305db96SHeinrich Schuchardt		}
53376305db96SHeinrich Schuchardt
53386305db96SHeinrich Schuchardt# uncoalesced string fragments
5339*c398f2dfSHeinrich Schuchardt		if ($line =~ /$String\s*"/) {
53406305db96SHeinrich Schuchardt			WARN("STRING_FRAGMENTS",
53416305db96SHeinrich Schuchardt			     "Consecutive strings are generally better as a single string\n" . $herecurr);
53426305db96SHeinrich Schuchardt		}
53436305db96SHeinrich Schuchardt
53446305db96SHeinrich Schuchardt# check for non-standard and hex prefixed decimal printf formats
53456305db96SHeinrich Schuchardt		my $show_L = 1;	#don't show the same defect twice
53466305db96SHeinrich Schuchardt		my $show_Z = 1;
53476305db96SHeinrich Schuchardt		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
53486305db96SHeinrich Schuchardt			my $string = substr($rawline, $-[1], $+[1] - $-[1]);
53496305db96SHeinrich Schuchardt			$string =~ s/%%/__/g;
53506305db96SHeinrich Schuchardt			# check for %L
53516305db96SHeinrich Schuchardt			if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) {
53526305db96SHeinrich Schuchardt				WARN("PRINTF_L",
53536305db96SHeinrich Schuchardt				     "\%L$1 is non-standard C, use %ll$1\n" . $herecurr);
53546305db96SHeinrich Schuchardt				$show_L = 0;
53556305db96SHeinrich Schuchardt			}
53566305db96SHeinrich Schuchardt			# check for %Z
53576305db96SHeinrich Schuchardt			if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) {
53586305db96SHeinrich Schuchardt				WARN("PRINTF_Z",
53596305db96SHeinrich Schuchardt				     "%Z$1 is non-standard C, use %z$1\n" . $herecurr);
53606305db96SHeinrich Schuchardt				$show_Z = 0;
53616305db96SHeinrich Schuchardt			}
53626305db96SHeinrich Schuchardt			# check for 0x<decimal>
53636305db96SHeinrich Schuchardt			if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) {
53646305db96SHeinrich Schuchardt				ERROR("PRINTF_0XDECIMAL",
53656305db96SHeinrich Schuchardt				      "Prefixing 0x with decimal output is defective\n" . $herecurr);
53666305db96SHeinrich Schuchardt			}
53676305db96SHeinrich Schuchardt		}
53686305db96SHeinrich Schuchardt
53696305db96SHeinrich Schuchardt# check for line continuations in quoted strings with odd counts of "
5370*c398f2dfSHeinrich Schuchardt		if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) {
53716305db96SHeinrich Schuchardt			WARN("LINE_CONTINUATIONS",
53726305db96SHeinrich Schuchardt			     "Avoid line continuations in quoted strings\n" . $herecurr);
5373dd88ab32SMasahiro Yamada		}
5374dd88ab32SMasahiro Yamada
5375dd88ab32SMasahiro Yamada# warn about #if 0
5376dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
5377dd88ab32SMasahiro Yamada			CHK("REDUNDANT_CODE",
5378dd88ab32SMasahiro Yamada			    "if this code is redundant consider removing it\n" .
5379dd88ab32SMasahiro Yamada				$herecurr);
5380dd88ab32SMasahiro Yamada		}
5381dd88ab32SMasahiro Yamada
5382dd88ab32SMasahiro Yamada# check for needless "if (<foo>) fn(<foo>)" uses
5383dd88ab32SMasahiro Yamada		if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
53846305db96SHeinrich Schuchardt			my $tested = quotemeta($1);
53856305db96SHeinrich Schuchardt			my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;';
53866305db96SHeinrich Schuchardt			if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) {
53876305db96SHeinrich Schuchardt				my $func = $1;
53886305db96SHeinrich Schuchardt				if (WARN('NEEDLESS_IF',
53896305db96SHeinrich Schuchardt					 "$func(NULL) is safe and this check is probably not required\n" . $hereprev) &&
53906305db96SHeinrich Schuchardt				    $fix) {
53916305db96SHeinrich Schuchardt					my $do_fix = 1;
53926305db96SHeinrich Schuchardt					my $leading_tabs = "";
53936305db96SHeinrich Schuchardt					my $new_leading_tabs = "";
53946305db96SHeinrich Schuchardt					if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) {
53956305db96SHeinrich Schuchardt						$leading_tabs = $1;
53966305db96SHeinrich Schuchardt					} else {
53976305db96SHeinrich Schuchardt						$do_fix = 0;
53986305db96SHeinrich Schuchardt					}
53996305db96SHeinrich Schuchardt					if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) {
54006305db96SHeinrich Schuchardt						$new_leading_tabs = $1;
54016305db96SHeinrich Schuchardt						if (length($leading_tabs) + 1 ne length($new_leading_tabs)) {
54026305db96SHeinrich Schuchardt							$do_fix = 0;
54036305db96SHeinrich Schuchardt						}
54046305db96SHeinrich Schuchardt					} else {
54056305db96SHeinrich Schuchardt						$do_fix = 0;
54066305db96SHeinrich Schuchardt					}
54076305db96SHeinrich Schuchardt					if ($do_fix) {
54086305db96SHeinrich Schuchardt						fix_delete_line($fixlinenr - 1, $prevrawline);
54096305db96SHeinrich Schuchardt						$fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/;
54106305db96SHeinrich Schuchardt					}
54116305db96SHeinrich Schuchardt				}
54126305db96SHeinrich Schuchardt			}
54136305db96SHeinrich Schuchardt		}
54146305db96SHeinrich Schuchardt
54156305db96SHeinrich Schuchardt# check for unnecessary "Out of Memory" messages
54166305db96SHeinrich Schuchardt		if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
54176305db96SHeinrich Schuchardt		    $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
54186305db96SHeinrich Schuchardt		    (defined $1 || defined $3) &&
54196305db96SHeinrich Schuchardt		    $linenr > 3) {
54206305db96SHeinrich Schuchardt			my $testval = $2;
54216305db96SHeinrich Schuchardt			my $testline = $lines[$linenr - 3];
54226305db96SHeinrich Schuchardt
54236305db96SHeinrich Schuchardt			my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
54246305db96SHeinrich Schuchardt#			print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
54256305db96SHeinrich Schuchardt
54266305db96SHeinrich Schuchardt			if ($s =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|kmemdup|(?:dev_)?alloc_skb)/) {
54276305db96SHeinrich Schuchardt				WARN("OOM_MESSAGE",
54286305db96SHeinrich Schuchardt				     "Possible unnecessary 'out of memory' message\n" . $hereprev);
54296305db96SHeinrich Schuchardt			}
54306305db96SHeinrich Schuchardt		}
54316305db96SHeinrich Schuchardt
54326305db96SHeinrich Schuchardt# check for logging functions with KERN_<LEVEL>
54336305db96SHeinrich Schuchardt		if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
54346305db96SHeinrich Schuchardt		    $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) {
54356305db96SHeinrich Schuchardt			my $level = $1;
54366305db96SHeinrich Schuchardt			if (WARN("UNNECESSARY_KERN_LEVEL",
54376305db96SHeinrich Schuchardt				 "Possible unnecessary $level\n" . $herecurr) &&
54386305db96SHeinrich Schuchardt			    $fix) {
54396305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\s*$level\s*//;
54406305db96SHeinrich Schuchardt			}
54416305db96SHeinrich Schuchardt		}
54426305db96SHeinrich Schuchardt
54436305db96SHeinrich Schuchardt# check for logging continuations
54446305db96SHeinrich Schuchardt		if ($line =~ /\bprintk\s*\(\s*KERN_CONT\b|\bpr_cont\s*\(/) {
54456305db96SHeinrich Schuchardt			WARN("LOGGING_CONTINUATION",
54466305db96SHeinrich Schuchardt			     "Avoid logging continuation uses where feasible\n" . $herecurr);
54476305db96SHeinrich Schuchardt		}
54486305db96SHeinrich Schuchardt
54496305db96SHeinrich Schuchardt# check for mask then right shift without a parentheses
54506305db96SHeinrich Schuchardt		if ($^V && $^V ge 5.10.0 &&
54516305db96SHeinrich Schuchardt		    $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ &&
54526305db96SHeinrich Schuchardt		    $4 !~ /^\&/) { # $LvalOrFunc may be &foo, ignore if so
54536305db96SHeinrich Schuchardt			WARN("MASK_THEN_SHIFT",
54546305db96SHeinrich Schuchardt			     "Possible precedence defect with mask then right shift - may need parentheses\n" . $herecurr);
54556305db96SHeinrich Schuchardt		}
54566305db96SHeinrich Schuchardt
54576305db96SHeinrich Schuchardt# check for pointer comparisons to NULL
54586305db96SHeinrich Schuchardt		if ($^V && $^V ge 5.10.0) {
54596305db96SHeinrich Schuchardt			while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) {
54606305db96SHeinrich Schuchardt				my $val = $1;
54616305db96SHeinrich Schuchardt				my $equal = "!";
54626305db96SHeinrich Schuchardt				$equal = "" if ($4 eq "!=");
54636305db96SHeinrich Schuchardt				if (CHK("COMPARISON_TO_NULL",
54646305db96SHeinrich Schuchardt					"Comparison to NULL could be written \"${equal}${val}\"\n" . $herecurr) &&
54656305db96SHeinrich Schuchardt					    $fix) {
54666305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/;
54676305db96SHeinrich Schuchardt				}
5468dd88ab32SMasahiro Yamada			}
5469dd88ab32SMasahiro Yamada		}
5470dd88ab32SMasahiro Yamada
54716b9709d9STom Rini# check for bad placement of section $InitAttribute (e.g.: __initdata)
54726b9709d9STom Rini		if ($line =~ /(\b$InitAttribute\b)/) {
54736b9709d9STom Rini			my $attr = $1;
54746b9709d9STom Rini			if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
54756b9709d9STom Rini				my $ptr = $1;
54766b9709d9STom Rini				my $var = $2;
54776b9709d9STom Rini				if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
54786b9709d9STom Rini				      ERROR("MISPLACED_INIT",
54796b9709d9STom Rini					    "$attr should be placed after $var\n" . $herecurr)) ||
54806b9709d9STom Rini				     ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
54816b9709d9STom Rini				      WARN("MISPLACED_INIT",
54826b9709d9STom Rini					   "$attr should be placed after $var\n" . $herecurr))) &&
54836b9709d9STom Rini				    $fix) {
54846305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =~ 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;
54856b9709d9STom Rini				}
54866b9709d9STom Rini			}
54876b9709d9STom Rini		}
54886b9709d9STom Rini
54896b9709d9STom Rini# check for $InitAttributeData (ie: __initdata) with const
54906b9709d9STom Rini		if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
54916b9709d9STom Rini			my $attr = $1;
54926b9709d9STom Rini			$attr =~ /($InitAttributePrefix)(.*)/;
54936b9709d9STom Rini			my $attr_prefix = $1;
54946b9709d9STom Rini			my $attr_type = $2;
54956b9709d9STom Rini			if (ERROR("INIT_ATTRIBUTE",
54966b9709d9STom Rini				  "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
54976b9709d9STom Rini			    $fix) {
54986305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~
54996b9709d9STom Rini				    s/$InitAttributeData/${attr_prefix}initconst/;
55006b9709d9STom Rini			}
55016b9709d9STom Rini		}
55026b9709d9STom Rini
55036b9709d9STom Rini# check for $InitAttributeConst (ie: __initconst) without const
55046b9709d9STom Rini		if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
55056b9709d9STom Rini			my $attr = $1;
55066b9709d9STom Rini			if (ERROR("INIT_ATTRIBUTE",
55076b9709d9STom Rini				  "Use of $attr requires a separate use of const\n" . $herecurr) &&
55086b9709d9STom Rini			    $fix) {
55096305db96SHeinrich Schuchardt				my $lead = $fixed[$fixlinenr] =~
55106b9709d9STom Rini				    /(^\+\s*(?:static\s+))/;
55116b9709d9STom Rini				$lead = rtrim($1);
55126b9709d9STom Rini				$lead = "$lead " if ($lead !~ /^\+$/);
55136b9709d9STom Rini				$lead = "${lead}const ";
55146305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
55156305db96SHeinrich Schuchardt			}
55166305db96SHeinrich Schuchardt		}
55176305db96SHeinrich Schuchardt
55186305db96SHeinrich Schuchardt# check for __read_mostly with const non-pointer (should just be const)
55196305db96SHeinrich Schuchardt		if ($line =~ /\b__read_mostly\b/ &&
55206305db96SHeinrich Schuchardt		    $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) {
55216305db96SHeinrich Schuchardt			if (ERROR("CONST_READ_MOSTLY",
55226305db96SHeinrich Schuchardt				  "Invalid use of __read_mostly with const type\n" . $herecurr) &&
55236305db96SHeinrich Schuchardt			    $fix) {
55246305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\s+__read_mostly\b//;
55256305db96SHeinrich Schuchardt			}
55266305db96SHeinrich Schuchardt		}
55276305db96SHeinrich Schuchardt
55286305db96SHeinrich Schuchardt# don't use __constant_<foo> functions outside of include/uapi/
55296305db96SHeinrich Schuchardt		if ($realfile !~ m@^include/uapi/@ &&
55306305db96SHeinrich Schuchardt		    $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
55316305db96SHeinrich Schuchardt			my $constant_func = $1;
55326305db96SHeinrich Schuchardt			my $func = $constant_func;
55336305db96SHeinrich Schuchardt			$func =~ s/^__constant_//;
55346305db96SHeinrich Schuchardt			if (WARN("CONSTANT_CONVERSION",
55356305db96SHeinrich Schuchardt				 "$constant_func should be $func\n" . $herecurr) &&
55366305db96SHeinrich Schuchardt			    $fix) {
55376305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
55386b9709d9STom Rini			}
55396b9709d9STom Rini		}
55406b9709d9STom Rini
5541dd88ab32SMasahiro Yamada# prefer usleep_range over udelay
5542dd88ab32SMasahiro Yamada		if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
55436305db96SHeinrich Schuchardt			my $delay = $1;
5544dd88ab32SMasahiro Yamada			# ignore udelay's < 10, however
55456305db96SHeinrich Schuchardt			if (! ($delay < 10) ) {
5546dd88ab32SMasahiro Yamada				CHK("USLEEP_RANGE",
55476305db96SHeinrich Schuchardt				    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr);
55486305db96SHeinrich Schuchardt			}
55496305db96SHeinrich Schuchardt			if ($delay > 2000) {
55506305db96SHeinrich Schuchardt				WARN("LONG_UDELAY",
55516305db96SHeinrich Schuchardt				     "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);
5552dd88ab32SMasahiro Yamada			}
5553dd88ab32SMasahiro Yamada		}
5554dd88ab32SMasahiro Yamada
5555dd88ab32SMasahiro Yamada# warn about unexpectedly long msleep's
5556dd88ab32SMasahiro Yamada		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
5557dd88ab32SMasahiro Yamada			if ($1 < 20) {
5558dd88ab32SMasahiro Yamada				WARN("MSLEEP",
55596305db96SHeinrich Schuchardt				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr);
5560dd88ab32SMasahiro Yamada			}
5561dd88ab32SMasahiro Yamada		}
5562dd88ab32SMasahiro Yamada
55636b9709d9STom Rini# check for comparisons of jiffies
55646b9709d9STom Rini		if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
55656b9709d9STom Rini			WARN("JIFFIES_COMPARISON",
55666b9709d9STom Rini			     "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
55676b9709d9STom Rini		}
55686b9709d9STom Rini
55696b9709d9STom Rini# check for comparisons of get_jiffies_64()
55706b9709d9STom Rini		if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
55716b9709d9STom Rini			WARN("JIFFIES_COMPARISON",
55726b9709d9STom Rini			     "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
55736b9709d9STom Rini		}
55746b9709d9STom Rini
5575dd88ab32SMasahiro Yamada# warn about #ifdefs in C files
5576dd88ab32SMasahiro Yamada#		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
5577dd88ab32SMasahiro Yamada#			print "#ifdef in C files should be avoided\n";
5578dd88ab32SMasahiro Yamada#			print "$herecurr";
5579dd88ab32SMasahiro Yamada#			$clean = 0;
5580dd88ab32SMasahiro Yamada#		}
5581dd88ab32SMasahiro Yamada
5582dd88ab32SMasahiro Yamada# warn about spacing in #ifdefs
5583dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
55846b9709d9STom Rini			if (ERROR("SPACING",
55856b9709d9STom Rini				  "exactly one space required after that #$1\n" . $herecurr) &&
55866b9709d9STom Rini			    $fix) {
55876305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~
55886b9709d9STom Rini				    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
55896b9709d9STom Rini			}
55906b9709d9STom Rini
5591dd88ab32SMasahiro Yamada		}
5592dd88ab32SMasahiro Yamada
5593dd88ab32SMasahiro Yamada# check for spinlock_t definitions without a comment.
5594dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
5595dd88ab32SMasahiro Yamada		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
5596dd88ab32SMasahiro Yamada			my $which = $1;
5597dd88ab32SMasahiro Yamada			if (!ctx_has_comment($first_line, $linenr)) {
5598dd88ab32SMasahiro Yamada				CHK("UNCOMMENTED_DEFINITION",
5599dd88ab32SMasahiro Yamada				    "$1 definition without comment\n" . $herecurr);
5600dd88ab32SMasahiro Yamada			}
5601dd88ab32SMasahiro Yamada		}
5602dd88ab32SMasahiro Yamada# check for memory barriers without a comment.
56036305db96SHeinrich Schuchardt
56046305db96SHeinrich Schuchardt		my $barriers = qr{
56056305db96SHeinrich Schuchardt			mb|
56066305db96SHeinrich Schuchardt			rmb|
56076305db96SHeinrich Schuchardt			wmb|
56086305db96SHeinrich Schuchardt			read_barrier_depends
56096305db96SHeinrich Schuchardt		}x;
56106305db96SHeinrich Schuchardt		my $barrier_stems = qr{
56116305db96SHeinrich Schuchardt			mb__before_atomic|
56126305db96SHeinrich Schuchardt			mb__after_atomic|
56136305db96SHeinrich Schuchardt			store_release|
56146305db96SHeinrich Schuchardt			load_acquire|
56156305db96SHeinrich Schuchardt			store_mb|
56166305db96SHeinrich Schuchardt			(?:$barriers)
56176305db96SHeinrich Schuchardt		}x;
56186305db96SHeinrich Schuchardt		my $all_barriers = qr{
56196305db96SHeinrich Schuchardt			(?:$barriers)|
56206305db96SHeinrich Schuchardt			smp_(?:$barrier_stems)|
56216305db96SHeinrich Schuchardt			virt_(?:$barrier_stems)
56226305db96SHeinrich Schuchardt		}x;
56236305db96SHeinrich Schuchardt
56246305db96SHeinrich Schuchardt		if ($line =~ /\b(?:$all_barriers)\s*\(/) {
5625dd88ab32SMasahiro Yamada			if (!ctx_has_comment($first_line, $linenr)) {
56266b9709d9STom Rini				WARN("MEMORY_BARRIER",
5627dd88ab32SMasahiro Yamada				     "memory barrier without comment\n" . $herecurr);
5628dd88ab32SMasahiro Yamada			}
5629dd88ab32SMasahiro Yamada		}
56306305db96SHeinrich Schuchardt
56316305db96SHeinrich Schuchardt		my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x;
56326305db96SHeinrich Schuchardt
56336305db96SHeinrich Schuchardt		if ($realfile !~ m@^include/asm-generic/@ &&
56346305db96SHeinrich Schuchardt		    $realfile !~ m@/barrier\.h$@ &&
56356305db96SHeinrich Schuchardt		    $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ &&
56366305db96SHeinrich Schuchardt		    $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) {
56376305db96SHeinrich Schuchardt			WARN("MEMORY_BARRIER",
56386305db96SHeinrich Schuchardt			     "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr);
56396305db96SHeinrich Schuchardt		}
56406305db96SHeinrich Schuchardt
56416305db96SHeinrich Schuchardt# check for waitqueue_active without a comment.
56426305db96SHeinrich Schuchardt		if ($line =~ /\bwaitqueue_active\s*\(/) {
56436305db96SHeinrich Schuchardt			if (!ctx_has_comment($first_line, $linenr)) {
56446305db96SHeinrich Schuchardt				WARN("WAITQUEUE_ACTIVE",
56456305db96SHeinrich Schuchardt				     "waitqueue_active without comment\n" . $herecurr);
56466305db96SHeinrich Schuchardt			}
56476305db96SHeinrich Schuchardt		}
56486305db96SHeinrich Schuchardt
5649*c398f2dfSHeinrich Schuchardt# check for smp_read_barrier_depends and read_barrier_depends
5650*c398f2dfSHeinrich Schuchardt		if (!$file && $line =~ /\b(smp_|)read_barrier_depends\s*\(/) {
5651*c398f2dfSHeinrich Schuchardt			WARN("READ_BARRIER_DEPENDS",
5652*c398f2dfSHeinrich Schuchardt			     "$1read_barrier_depends should only be used in READ_ONCE or DEC Alpha code\n" . $herecurr);
5653*c398f2dfSHeinrich Schuchardt		}
5654*c398f2dfSHeinrich Schuchardt
5655dd88ab32SMasahiro Yamada# check of hardware specific defines
5656dd88ab32SMasahiro Yamada		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
5657dd88ab32SMasahiro Yamada			CHK("ARCH_DEFINES",
5658dd88ab32SMasahiro Yamada			    "architecture specific defines should be avoided\n" .  $herecurr);
5659dd88ab32SMasahiro Yamada		}
5660dd88ab32SMasahiro Yamada
56616305db96SHeinrich Schuchardt# check that the storage class is not after a type
56626305db96SHeinrich Schuchardt		if ($line =~ /\b($Type)\s+($Storage)\b/) {
5663dd88ab32SMasahiro Yamada			WARN("STORAGE_CLASS",
56646305db96SHeinrich Schuchardt			     "storage class '$2' should be located before type '$1'\n" . $herecurr);
56656305db96SHeinrich Schuchardt		}
56666305db96SHeinrich Schuchardt# Check that the storage class is at the beginning of a declaration
56676305db96SHeinrich Schuchardt		if ($line =~ /\b$Storage\b/ &&
56686305db96SHeinrich Schuchardt		    $line !~ /^.\s*$Storage/ &&
56696305db96SHeinrich Schuchardt		    $line =~ /^.\s*(.+?)\$Storage\s/ &&
56706305db96SHeinrich Schuchardt		    $1 !~ /[\,\)]\s*$/) {
56716305db96SHeinrich Schuchardt			WARN("STORAGE_CLASS",
56726305db96SHeinrich Schuchardt			     "storage class should be at the beginning of the declaration\n" . $herecurr);
5673dd88ab32SMasahiro Yamada		}
5674dd88ab32SMasahiro Yamada
5675dd88ab32SMasahiro Yamada# check the location of the inline attribute, that it is between
5676dd88ab32SMasahiro Yamada# storage class and type.
5677dd88ab32SMasahiro Yamada		if ($line =~ /\b$Type\s+$Inline\b/ ||
5678dd88ab32SMasahiro Yamada		    $line =~ /\b$Inline\s+$Storage\b/) {
5679dd88ab32SMasahiro Yamada			ERROR("INLINE_LOCATION",
5680dd88ab32SMasahiro Yamada			      "inline keyword should sit between storage class and type\n" . $herecurr);
5681dd88ab32SMasahiro Yamada		}
5682dd88ab32SMasahiro Yamada
5683dd88ab32SMasahiro Yamada# Check for __inline__ and __inline, prefer inline
56846b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
56856b9709d9STom Rini		    $line =~ /\b(__inline__|__inline)\b/) {
56866b9709d9STom Rini			if (WARN("INLINE",
56876b9709d9STom Rini				 "plain inline is preferred over $1\n" . $herecurr) &&
56886b9709d9STom Rini			    $fix) {
56896305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
56906b9709d9STom Rini
56916b9709d9STom Rini			}
5692dd88ab32SMasahiro Yamada		}
5693dd88ab32SMasahiro Yamada
5694dd88ab32SMasahiro Yamada# Check for __attribute__ packed, prefer __packed
56956b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
56966b9709d9STom Rini		    $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
5697dd88ab32SMasahiro Yamada			WARN("PREFER_PACKED",
5698dd88ab32SMasahiro Yamada			     "__packed is preferred over __attribute__((packed))\n" . $herecurr);
5699dd88ab32SMasahiro Yamada		}
5700dd88ab32SMasahiro Yamada
57015c761ce5SHeinrich Schuchardt# Check for new packed members, warn to use care
57025c761ce5SHeinrich Schuchardt		if ($realfile !~ m@\binclude/uapi/@ &&
57035c761ce5SHeinrich Schuchardt		    $line =~ /\b(__attribute__\s*\(\s*\(.*\bpacked|__packed)\b/) {
57045c761ce5SHeinrich Schuchardt			WARN("NEW_PACKED",
57055c761ce5SHeinrich Schuchardt			     "Adding new packed members is to be done with care\n" . $herecurr);
57065c761ce5SHeinrich Schuchardt		}
57075c761ce5SHeinrich Schuchardt
5708dd88ab32SMasahiro Yamada# Check for __attribute__ aligned, prefer __aligned
57096b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
57106b9709d9STom Rini		    $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
5711dd88ab32SMasahiro Yamada			WARN("PREFER_ALIGNED",
5712dd88ab32SMasahiro Yamada			     "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
5713dd88ab32SMasahiro Yamada		}
5714dd88ab32SMasahiro Yamada
5715dd88ab32SMasahiro Yamada# Check for __attribute__ format(printf, prefer __printf
57166b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
57176b9709d9STom Rini		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
57186b9709d9STom Rini			if (WARN("PREFER_PRINTF",
57196b9709d9STom Rini				 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
57206b9709d9STom Rini			    $fix) {
57216305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
57226b9709d9STom Rini
57236b9709d9STom Rini			}
5724dd88ab32SMasahiro Yamada		}
5725dd88ab32SMasahiro Yamada
5726dd88ab32SMasahiro Yamada# Check for __attribute__ format(scanf, prefer __scanf
57276b9709d9STom Rini		if ($realfile !~ m@\binclude/uapi/@ &&
57286b9709d9STom Rini		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
57296b9709d9STom Rini			if (WARN("PREFER_SCANF",
57306b9709d9STom Rini				 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
57316b9709d9STom Rini			    $fix) {
57326305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
57336305db96SHeinrich Schuchardt			}
57346305db96SHeinrich Schuchardt		}
57356305db96SHeinrich Schuchardt
57366305db96SHeinrich Schuchardt# Check for __attribute__ weak, or __weak declarations (may have link issues)
57376305db96SHeinrich Schuchardt		if ($^V && $^V ge 5.10.0 &&
57386305db96SHeinrich Schuchardt		    $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ &&
57396305db96SHeinrich Schuchardt		    ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ ||
57406305db96SHeinrich Schuchardt		     $line =~ /\b__weak\b/)) {
57416305db96SHeinrich Schuchardt			ERROR("WEAK_DECLARATION",
57426305db96SHeinrich Schuchardt			      "Using weak declarations can have unintended link defects\n" . $herecurr);
57436305db96SHeinrich Schuchardt		}
57446305db96SHeinrich Schuchardt
57456305db96SHeinrich Schuchardt# check for c99 types like uint8_t used outside of uapi/ and tools/
57466305db96SHeinrich Schuchardt		if ($realfile !~ m@\binclude/uapi/@ &&
57476305db96SHeinrich Schuchardt		    $realfile !~ m@\btools/@ &&
57486305db96SHeinrich Schuchardt		    $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) {
57496305db96SHeinrich Schuchardt			my $type = $1;
57506305db96SHeinrich Schuchardt			if ($type =~ /\b($typeC99Typedefs)\b/) {
57516305db96SHeinrich Schuchardt				$type = $1;
57526305db96SHeinrich Schuchardt				my $kernel_type = 'u';
57536305db96SHeinrich Schuchardt				$kernel_type = 's' if ($type =~ /^_*[si]/);
57546305db96SHeinrich Schuchardt				$type =~ /(\d+)/;
57556305db96SHeinrich Schuchardt				$kernel_type .= $1;
57566305db96SHeinrich Schuchardt				if (CHK("PREFER_KERNEL_TYPES",
57576305db96SHeinrich Schuchardt					"Prefer kernel type '$kernel_type' over '$type'\n" . $herecurr) &&
57586305db96SHeinrich Schuchardt				    $fix) {
57596305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/;
57606305db96SHeinrich Schuchardt				}
57616305db96SHeinrich Schuchardt			}
57626305db96SHeinrich Schuchardt		}
57636305db96SHeinrich Schuchardt
57646305db96SHeinrich Schuchardt# check for cast of C90 native int or longer types constants
57656305db96SHeinrich Schuchardt		if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) {
57666305db96SHeinrich Schuchardt			my $cast = $1;
57676305db96SHeinrich Schuchardt			my $const = $2;
57686305db96SHeinrich Schuchardt			if (WARN("TYPECAST_INT_CONSTANT",
57696305db96SHeinrich Schuchardt				 "Unnecessary typecast of c90 int constant\n" . $herecurr) &&
57706305db96SHeinrich Schuchardt			    $fix) {
57716305db96SHeinrich Schuchardt				my $suffix = "";
57726305db96SHeinrich Schuchardt				my $newconst = $const;
57736305db96SHeinrich Schuchardt				$newconst =~ s/${Int_type}$//;
57746305db96SHeinrich Schuchardt				$suffix .= 'U' if ($cast =~ /\bunsigned\b/);
57756305db96SHeinrich Schuchardt				if ($cast =~ /\blong\s+long\b/) {
57766305db96SHeinrich Schuchardt					$suffix .= 'LL';
57776305db96SHeinrich Schuchardt				} elsif ($cast =~ /\blong\b/) {
57786305db96SHeinrich Schuchardt					$suffix .= 'L';
57796305db96SHeinrich Schuchardt				}
57806305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/;
57816b9709d9STom Rini			}
5782dd88ab32SMasahiro Yamada		}
5783dd88ab32SMasahiro Yamada
5784dd88ab32SMasahiro Yamada# check for sizeof(&)
5785dd88ab32SMasahiro Yamada		if ($line =~ /\bsizeof\s*\(\s*\&/) {
5786dd88ab32SMasahiro Yamada			WARN("SIZEOF_ADDRESS",
5787dd88ab32SMasahiro Yamada			     "sizeof(& should be avoided\n" . $herecurr);
5788dd88ab32SMasahiro Yamada		}
5789dd88ab32SMasahiro Yamada
5790dd88ab32SMasahiro Yamada# check for sizeof without parenthesis
5791dd88ab32SMasahiro Yamada		if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
57926b9709d9STom Rini			if (WARN("SIZEOF_PARENTHESIS",
57936b9709d9STom Rini				 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
57946b9709d9STom Rini			    $fix) {
57956305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
57966b9709d9STom Rini			}
5797dd88ab32SMasahiro Yamada		}
5798dd88ab32SMasahiro Yamada
5799dd88ab32SMasahiro Yamada# check for struct spinlock declarations
5800dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
5801dd88ab32SMasahiro Yamada			WARN("USE_SPINLOCK_T",
5802dd88ab32SMasahiro Yamada			     "struct spinlock should be spinlock_t\n" . $herecurr);
5803dd88ab32SMasahiro Yamada		}
5804dd88ab32SMasahiro Yamada
58056b9709d9STom Rini# check for seq_printf uses that could be seq_puts
58066b9709d9STom Rini		if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
58076b9709d9STom Rini			my $fmt = get_quoted_string($line, $rawline);
58086305db96SHeinrich Schuchardt			$fmt =~ s/%%//g;
58096305db96SHeinrich Schuchardt			if ($fmt !~ /%/) {
58106b9709d9STom Rini				if (WARN("PREFER_SEQ_PUTS",
58116b9709d9STom Rini					 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
58126b9709d9STom Rini				    $fix) {
58136305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
58146b9709d9STom Rini				}
58156b9709d9STom Rini			}
58166b9709d9STom Rini		}
58176b9709d9STom Rini
58186305db96SHeinrich Schuchardt# check for vsprintf extension %p<foo> misuses
58196305db96SHeinrich Schuchardt		if ($^V && $^V ge 5.10.0 &&
58206305db96SHeinrich Schuchardt		    defined $stat &&
58216305db96SHeinrich Schuchardt		    $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
58226305db96SHeinrich Schuchardt		    $1 !~ /^_*volatile_*$/) {
5823*c398f2dfSHeinrich Schuchardt			my $specifier;
5824*c398f2dfSHeinrich Schuchardt			my $extension;
5825*c398f2dfSHeinrich Schuchardt			my $bad_specifier = "";
5826*c398f2dfSHeinrich Schuchardt			my $stat_real;
5827*c398f2dfSHeinrich Schuchardt
58286305db96SHeinrich Schuchardt			my $lc = $stat =~ tr@\n@@;
58296305db96SHeinrich Schuchardt			$lc = $lc + $linenr;
58306305db96SHeinrich Schuchardt		        for (my $count = $linenr; $count <= $lc; $count++) {
58316305db96SHeinrich Schuchardt				my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
58326305db96SHeinrich Schuchardt				$fmt =~ s/%%//g;
5833*c398f2dfSHeinrich Schuchardt
5834*c398f2dfSHeinrich Schuchardt				while ($fmt =~ /(\%[\*\d\.]*p(\w))/g) {
5835*c398f2dfSHeinrich Schuchardt					$specifier = $1;
5836*c398f2dfSHeinrich Schuchardt					$extension = $2;
5837*c398f2dfSHeinrich Schuchardt					if ($extension !~ /[SsBKRraEhMmIiUDdgVCbGNOx]/) {
5838*c398f2dfSHeinrich Schuchardt						$bad_specifier = $specifier;
58396305db96SHeinrich Schuchardt						last;
58406305db96SHeinrich Schuchardt					}
5841*c398f2dfSHeinrich Schuchardt					if ($extension eq "x" && !defined($stat_real)) {
5842*c398f2dfSHeinrich Schuchardt						if (!defined($stat_real)) {
5843*c398f2dfSHeinrich Schuchardt							$stat_real = get_stat_real($linenr, $lc);
58446305db96SHeinrich Schuchardt						}
5845*c398f2dfSHeinrich Schuchardt						WARN("VSPRINTF_SPECIFIER_PX",
5846*c398f2dfSHeinrich Schuchardt						     "Using vsprintf specifier '\%px' potentially exposes the kernel memory layout, if you don't really need the address please consider using '\%p'.\n" . "$here\n$stat_real\n");
58476305db96SHeinrich Schuchardt					}
5848*c398f2dfSHeinrich Schuchardt				}
5849*c398f2dfSHeinrich Schuchardt				if ($bad_specifier ne "") {
5850*c398f2dfSHeinrich Schuchardt					my $stat_real = get_stat_real($linenr, $lc);
5851*c398f2dfSHeinrich Schuchardt					my $ext_type = "Invalid";
5852*c398f2dfSHeinrich Schuchardt					my $use = "";
5853*c398f2dfSHeinrich Schuchardt					if ($bad_specifier =~ /p[Ff]/) {
5854*c398f2dfSHeinrich Schuchardt						$ext_type = "Deprecated";
5855*c398f2dfSHeinrich Schuchardt						$use = " - use %pS instead";
5856*c398f2dfSHeinrich Schuchardt						$use =~ s/pS/ps/ if ($bad_specifier =~ /pf/);
5857*c398f2dfSHeinrich Schuchardt					}
5858*c398f2dfSHeinrich Schuchardt
58596305db96SHeinrich Schuchardt					WARN("VSPRINTF_POINTER_EXTENSION",
5860*c398f2dfSHeinrich Schuchardt					     "$ext_type vsprintf pointer extension '$bad_specifier'$use\n" . "$here\n$stat_real\n");
5861*c398f2dfSHeinrich Schuchardt				}
58626305db96SHeinrich Schuchardt			}
58636305db96SHeinrich Schuchardt		}
58646305db96SHeinrich Schuchardt
5865dd88ab32SMasahiro Yamada# Check for misused memsets
5866dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
5867dd88ab32SMasahiro Yamada		    defined $stat &&
58686305db96SHeinrich Schuchardt		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) {
5869dd88ab32SMasahiro Yamada
5870dd88ab32SMasahiro Yamada			my $ms_addr = $2;
5871dd88ab32SMasahiro Yamada			my $ms_val = $7;
5872dd88ab32SMasahiro Yamada			my $ms_size = $12;
5873dd88ab32SMasahiro Yamada
5874dd88ab32SMasahiro Yamada			if ($ms_size =~ /^(0x|)0$/i) {
5875dd88ab32SMasahiro Yamada				ERROR("MEMSET",
5876dd88ab32SMasahiro Yamada				      "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
5877dd88ab32SMasahiro Yamada			} elsif ($ms_size =~ /^(0x|)1$/i) {
5878dd88ab32SMasahiro Yamada				WARN("MEMSET",
5879dd88ab32SMasahiro Yamada				     "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
5880dd88ab32SMasahiro Yamada			}
5881dd88ab32SMasahiro Yamada		}
5882dd88ab32SMasahiro Yamada
58836b9709d9STom Rini# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
58846305db96SHeinrich Schuchardt#		if ($^V && $^V ge 5.10.0 &&
58856305db96SHeinrich Schuchardt#		    defined $stat &&
58866305db96SHeinrich Schuchardt#		    $stat =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
58876305db96SHeinrich Schuchardt#			if (WARN("PREFER_ETHER_ADDR_COPY",
58886305db96SHeinrich Schuchardt#				 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . "$here\n$stat\n") &&
58896305db96SHeinrich Schuchardt#			    $fix) {
58906305db96SHeinrich Schuchardt#				$fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
58916305db96SHeinrich Schuchardt#			}
58926305db96SHeinrich Schuchardt#		}
58936305db96SHeinrich Schuchardt
58946305db96SHeinrich Schuchardt# Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar)
58956305db96SHeinrich Schuchardt#		if ($^V && $^V ge 5.10.0 &&
58966305db96SHeinrich Schuchardt#		    defined $stat &&
58976305db96SHeinrich Schuchardt#		    $stat =~ /^\+(?:.*?)\bmemcmp\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
58986305db96SHeinrich Schuchardt#			WARN("PREFER_ETHER_ADDR_EQUAL",
58996305db96SHeinrich Schuchardt#			     "Prefer ether_addr_equal() or ether_addr_equal_unaligned() over memcmp()\n" . "$here\n$stat\n")
59006305db96SHeinrich Schuchardt#		}
59016305db96SHeinrich Schuchardt
59026305db96SHeinrich Schuchardt# check for memset(foo, 0x0, ETH_ALEN) that could be eth_zero_addr
59036305db96SHeinrich Schuchardt# check for memset(foo, 0xFF, ETH_ALEN) that could be eth_broadcast_addr
59046305db96SHeinrich Schuchardt#		if ($^V && $^V ge 5.10.0 &&
59056305db96SHeinrich Schuchardt#		    defined $stat &&
59066305db96SHeinrich Schuchardt#		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
59076305db96SHeinrich Schuchardt#
59086305db96SHeinrich Schuchardt#			my $ms_val = $7;
59096305db96SHeinrich Schuchardt#
59106305db96SHeinrich Schuchardt#			if ($ms_val =~ /^(?:0x|)0+$/i) {
59116305db96SHeinrich Schuchardt#				if (WARN("PREFER_ETH_ZERO_ADDR",
59126305db96SHeinrich Schuchardt#					 "Prefer eth_zero_addr over memset()\n" . "$here\n$stat\n") &&
59136305db96SHeinrich Schuchardt#				    $fix) {
59146305db96SHeinrich Schuchardt#					$fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_zero_addr($2)/;
59156305db96SHeinrich Schuchardt#				}
59166305db96SHeinrich Schuchardt#			} elsif ($ms_val =~ /^(?:0xff|255)$/i) {
59176305db96SHeinrich Schuchardt#				if (WARN("PREFER_ETH_BROADCAST_ADDR",
59186305db96SHeinrich Schuchardt#					 "Prefer eth_broadcast_addr() over memset()\n" . "$here\n$stat\n") &&
59196305db96SHeinrich Schuchardt#				    $fix) {
59206305db96SHeinrich Schuchardt#					$fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_broadcast_addr($2)/;
59216305db96SHeinrich Schuchardt#				}
59226305db96SHeinrich Schuchardt#			}
59236305db96SHeinrich Schuchardt#		}
59246b9709d9STom Rini
5925dd88ab32SMasahiro Yamada# typecasts on min/max could be min_t/max_t
5926dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
5927dd88ab32SMasahiro Yamada		    defined $stat &&
5928dd88ab32SMasahiro Yamada		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
5929dd88ab32SMasahiro Yamada			if (defined $2 || defined $7) {
5930dd88ab32SMasahiro Yamada				my $call = $1;
5931dd88ab32SMasahiro Yamada				my $cast1 = deparenthesize($2);
5932dd88ab32SMasahiro Yamada				my $arg1 = $3;
5933dd88ab32SMasahiro Yamada				my $cast2 = deparenthesize($7);
5934dd88ab32SMasahiro Yamada				my $arg2 = $8;
5935dd88ab32SMasahiro Yamada				my $cast;
5936dd88ab32SMasahiro Yamada
5937dd88ab32SMasahiro Yamada				if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
5938dd88ab32SMasahiro Yamada					$cast = "$cast1 or $cast2";
5939dd88ab32SMasahiro Yamada				} elsif ($cast1 ne "") {
5940dd88ab32SMasahiro Yamada					$cast = $cast1;
5941dd88ab32SMasahiro Yamada				} else {
5942dd88ab32SMasahiro Yamada					$cast = $cast2;
5943dd88ab32SMasahiro Yamada				}
5944dd88ab32SMasahiro Yamada				WARN("MINMAX",
5945dd88ab32SMasahiro Yamada				     "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
5946dd88ab32SMasahiro Yamada			}
5947dd88ab32SMasahiro Yamada		}
5948dd88ab32SMasahiro Yamada
5949dd88ab32SMasahiro Yamada# check usleep_range arguments
5950dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
5951dd88ab32SMasahiro Yamada		    defined $stat &&
5952dd88ab32SMasahiro Yamada		    $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
5953dd88ab32SMasahiro Yamada			my $min = $1;
5954dd88ab32SMasahiro Yamada			my $max = $7;
5955dd88ab32SMasahiro Yamada			if ($min eq $max) {
5956dd88ab32SMasahiro Yamada				WARN("USLEEP_RANGE",
5957dd88ab32SMasahiro Yamada				     "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
5958dd88ab32SMasahiro Yamada			} elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
5959dd88ab32SMasahiro Yamada				 $min > $max) {
5960dd88ab32SMasahiro Yamada				WARN("USLEEP_RANGE",
5961dd88ab32SMasahiro Yamada				     "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
5962dd88ab32SMasahiro Yamada			}
5963dd88ab32SMasahiro Yamada		}
5964dd88ab32SMasahiro Yamada
59656b9709d9STom Rini# check for naked sscanf
59666b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
59676b9709d9STom Rini		    defined $stat &&
59686305db96SHeinrich Schuchardt		    $line =~ /\bsscanf\b/ &&
59696b9709d9STom Rini		    ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
59706b9709d9STom Rini		     $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
59716b9709d9STom Rini		     $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
59726b9709d9STom Rini			my $lc = $stat =~ tr@\n@@;
59736b9709d9STom Rini			$lc = $lc + $linenr;
5974*c398f2dfSHeinrich Schuchardt			my $stat_real = get_stat_real($linenr, $lc);
59756b9709d9STom Rini			WARN("NAKED_SSCANF",
59766b9709d9STom Rini			     "unchecked sscanf return value\n" . "$here\n$stat_real\n");
59776b9709d9STom Rini		}
59786b9709d9STom Rini
59796305db96SHeinrich Schuchardt# check for simple sscanf that should be kstrto<foo>
59806305db96SHeinrich Schuchardt		if ($^V && $^V ge 5.10.0 &&
59816305db96SHeinrich Schuchardt		    defined $stat &&
59826305db96SHeinrich Schuchardt		    $line =~ /\bsscanf\b/) {
59836305db96SHeinrich Schuchardt			my $lc = $stat =~ tr@\n@@;
59846305db96SHeinrich Schuchardt			$lc = $lc + $linenr;
5985*c398f2dfSHeinrich Schuchardt			my $stat_real = get_stat_real($linenr, $lc);
59866305db96SHeinrich Schuchardt			if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
59876305db96SHeinrich Schuchardt				my $format = $6;
59886305db96SHeinrich Schuchardt				my $count = $format =~ tr@%@%@;
59896305db96SHeinrich Schuchardt				if ($count == 1 &&
59906305db96SHeinrich Schuchardt				    $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
59916305db96SHeinrich Schuchardt					WARN("SSCANF_TO_KSTRTO",
59926305db96SHeinrich Schuchardt					     "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n");
59936305db96SHeinrich Schuchardt				}
59946305db96SHeinrich Schuchardt			}
59956305db96SHeinrich Schuchardt		}
59966305db96SHeinrich Schuchardt
59976b9709d9STom Rini# check for new externs in .h files.
59986b9709d9STom Rini		if ($realfile =~ /\.h$/ &&
59996b9709d9STom Rini		    $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
60006b9709d9STom Rini			if (CHK("AVOID_EXTERNS",
60016b9709d9STom Rini				"extern prototypes should be avoided in .h files\n" . $herecurr) &&
60026b9709d9STom Rini			    $fix) {
60036305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
60046b9709d9STom Rini			}
60056b9709d9STom Rini		}
60066b9709d9STom Rini
6007dd88ab32SMasahiro Yamada# check for new externs in .c files.
6008dd88ab32SMasahiro Yamada		if ($realfile =~ /\.c$/ && defined $stat &&
6009dd88ab32SMasahiro Yamada		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
6010dd88ab32SMasahiro Yamada		{
6011dd88ab32SMasahiro Yamada			my $function_name = $1;
6012dd88ab32SMasahiro Yamada			my $paren_space = $2;
6013dd88ab32SMasahiro Yamada
6014dd88ab32SMasahiro Yamada			my $s = $stat;
6015dd88ab32SMasahiro Yamada			if (defined $cond) {
6016dd88ab32SMasahiro Yamada				substr($s, 0, length($cond), '');
6017dd88ab32SMasahiro Yamada			}
6018dd88ab32SMasahiro Yamada			if ($s =~ /^\s*;/ &&
6019dd88ab32SMasahiro Yamada			    $function_name ne 'uninitialized_var')
6020dd88ab32SMasahiro Yamada			{
6021dd88ab32SMasahiro Yamada				WARN("AVOID_EXTERNS",
6022dd88ab32SMasahiro Yamada				     "externs should be avoided in .c files\n" .  $herecurr);
6023dd88ab32SMasahiro Yamada			}
6024dd88ab32SMasahiro Yamada
6025dd88ab32SMasahiro Yamada			if ($paren_space =~ /\n/) {
6026dd88ab32SMasahiro Yamada				WARN("FUNCTION_ARGUMENTS",
6027dd88ab32SMasahiro Yamada				     "arguments for function declarations should follow identifier\n" . $herecurr);
6028dd88ab32SMasahiro Yamada			}
6029dd88ab32SMasahiro Yamada
6030dd88ab32SMasahiro Yamada		} elsif ($realfile =~ /\.c$/ && defined $stat &&
6031dd88ab32SMasahiro Yamada		    $stat =~ /^.\s*extern\s+/)
6032dd88ab32SMasahiro Yamada		{
6033dd88ab32SMasahiro Yamada			WARN("AVOID_EXTERNS",
6034dd88ab32SMasahiro Yamada			     "externs should be avoided in .c files\n" .  $herecurr);
6035dd88ab32SMasahiro Yamada		}
6036dd88ab32SMasahiro Yamada
60376305db96SHeinrich Schuchardt# check for function declarations that have arguments without identifier names
60386305db96SHeinrich Schuchardt		if (defined $stat &&
6039*c398f2dfSHeinrich Schuchardt		    $stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&
60406305db96SHeinrich Schuchardt		    $1 ne "void") {
60416305db96SHeinrich Schuchardt			my $args = trim($1);
60426305db96SHeinrich Schuchardt			while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
60436305db96SHeinrich Schuchardt				my $arg = trim($1);
60446305db96SHeinrich Schuchardt				if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) {
60456305db96SHeinrich Schuchardt					WARN("FUNCTION_ARGUMENTS",
60466305db96SHeinrich Schuchardt					     "function definition argument '$arg' should also have an identifier name\n" . $herecurr);
60476305db96SHeinrich Schuchardt				}
60486305db96SHeinrich Schuchardt			}
60496305db96SHeinrich Schuchardt		}
60506305db96SHeinrich Schuchardt
60516305db96SHeinrich Schuchardt# check for function definitions
60526305db96SHeinrich Schuchardt		if ($^V && $^V ge 5.10.0 &&
60536305db96SHeinrich Schuchardt		    defined $stat &&
60546305db96SHeinrich Schuchardt		    $stat =~ /^.\s*(?:$Storage\s+)?$Type\s*($Ident)\s*$balanced_parens\s*{/s) {
60556305db96SHeinrich Schuchardt			$context_function = $1;
60566305db96SHeinrich Schuchardt
60576305db96SHeinrich Schuchardt# check for multiline function definition with misplaced open brace
60586305db96SHeinrich Schuchardt			my $ok = 0;
60596305db96SHeinrich Schuchardt			my $cnt = statement_rawlines($stat);
60606305db96SHeinrich Schuchardt			my $herectx = $here . "\n";
60616305db96SHeinrich Schuchardt			for (my $n = 0; $n < $cnt; $n++) {
60626305db96SHeinrich Schuchardt				my $rl = raw_line($linenr, $n);
60636305db96SHeinrich Schuchardt				$herectx .=  $rl . "\n";
60646305db96SHeinrich Schuchardt				$ok = 1 if ($rl =~ /^[ \+]\{/);
60656305db96SHeinrich Schuchardt				$ok = 1 if ($rl =~ /\{/ && $n == 0);
60666305db96SHeinrich Schuchardt				last if $rl =~ /^[ \+].*\{/;
60676305db96SHeinrich Schuchardt			}
60686305db96SHeinrich Schuchardt			if (!$ok) {
60696305db96SHeinrich Schuchardt				ERROR("OPEN_BRACE",
60706305db96SHeinrich Schuchardt				      "open brace '{' following function definitions go on the next line\n" . $herectx);
60716305db96SHeinrich Schuchardt			}
60726305db96SHeinrich Schuchardt		}
60736305db96SHeinrich Schuchardt
6074dd88ab32SMasahiro Yamada# checks for new __setup's
6075dd88ab32SMasahiro Yamada		if ($rawline =~ /\b__setup\("([^"]*)"/) {
6076dd88ab32SMasahiro Yamada			my $name = $1;
6077dd88ab32SMasahiro Yamada
6078dd88ab32SMasahiro Yamada			if (!grep(/$name/, @setup_docs)) {
6079dd88ab32SMasahiro Yamada				CHK("UNDOCUMENTED_SETUP",
60806305db96SHeinrich Schuchardt				    "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.rst\n" . $herecurr);
6081dd88ab32SMasahiro Yamada			}
6082dd88ab32SMasahiro Yamada		}
6083dd88ab32SMasahiro Yamada
6084dd88ab32SMasahiro Yamada# check for pointless casting of kmalloc return
6085dd88ab32SMasahiro Yamada		if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
6086dd88ab32SMasahiro Yamada			WARN("UNNECESSARY_CASTS",
6087dd88ab32SMasahiro Yamada			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
6088dd88ab32SMasahiro Yamada		}
6089dd88ab32SMasahiro Yamada
60906b9709d9STom Rini# alloc style
60916b9709d9STom Rini# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
60926b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
60936b9709d9STom Rini		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
60946b9709d9STom Rini			CHK("ALLOC_SIZEOF_STRUCT",
60956b9709d9STom Rini			    "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
60966b9709d9STom Rini		}
60976b9709d9STom Rini
60986305db96SHeinrich Schuchardt# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
60996305db96SHeinrich Schuchardt		if ($^V && $^V ge 5.10.0 &&
61006305db96SHeinrich Schuchardt		    defined $stat &&
61016305db96SHeinrich Schuchardt		    $stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
61026305db96SHeinrich Schuchardt			my $oldfunc = $3;
61036305db96SHeinrich Schuchardt			my $a1 = $4;
61046305db96SHeinrich Schuchardt			my $a2 = $10;
61056305db96SHeinrich Schuchardt			my $newfunc = "kmalloc_array";
61066305db96SHeinrich Schuchardt			$newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
61076305db96SHeinrich Schuchardt			my $r1 = $a1;
61086305db96SHeinrich Schuchardt			my $r2 = $a2;
61096305db96SHeinrich Schuchardt			if ($a1 =~ /^sizeof\s*\S/) {
61106305db96SHeinrich Schuchardt				$r1 = $a2;
61116305db96SHeinrich Schuchardt				$r2 = $a1;
61126305db96SHeinrich Schuchardt			}
61136305db96SHeinrich Schuchardt			if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
61146305db96SHeinrich Schuchardt			    !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
61156305db96SHeinrich Schuchardt				my $cnt = statement_rawlines($stat);
6116*c398f2dfSHeinrich Schuchardt				my $herectx = get_stat_here($linenr, $cnt, $here);
6117*c398f2dfSHeinrich Schuchardt
61186305db96SHeinrich Schuchardt				if (WARN("ALLOC_WITH_MULTIPLY",
61196305db96SHeinrich Schuchardt					 "Prefer $newfunc over $oldfunc with multiply\n" . $herectx) &&
61206305db96SHeinrich Schuchardt				    $cnt == 1 &&
61216305db96SHeinrich Schuchardt				    $fix) {
61226305db96SHeinrich Schuchardt					$fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e;
61236305db96SHeinrich Schuchardt				}
61246305db96SHeinrich Schuchardt			}
61256305db96SHeinrich Schuchardt		}
61266305db96SHeinrich Schuchardt
61276b9709d9STom Rini# check for krealloc arg reuse
61286b9709d9STom Rini		if ($^V && $^V ge 5.10.0 &&
61296b9709d9STom Rini		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
61306b9709d9STom Rini			WARN("KREALLOC_ARG_REUSE",
61316b9709d9STom Rini			     "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
61326b9709d9STom Rini		}
61336b9709d9STom Rini
6134dd88ab32SMasahiro Yamada# check for alloc argument mismatch
6135dd88ab32SMasahiro Yamada		if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
6136dd88ab32SMasahiro Yamada			WARN("ALLOC_ARRAY_ARGS",
6137dd88ab32SMasahiro Yamada			     "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
6138dd88ab32SMasahiro Yamada		}
6139dd88ab32SMasahiro Yamada
6140dd88ab32SMasahiro Yamada# check for multiple semicolons
6141dd88ab32SMasahiro Yamada		if ($line =~ /;\s*;\s*$/) {
61426b9709d9STom Rini			if (WARN("ONE_SEMICOLON",
61436b9709d9STom Rini				 "Statements terminations use 1 semicolon\n" . $herecurr) &&
61446b9709d9STom Rini			    $fix) {
61456305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
61466305db96SHeinrich Schuchardt			}
61476305db96SHeinrich Schuchardt		}
61486305db96SHeinrich Schuchardt
61496305db96SHeinrich Schuchardt# check for #defines like: 1 << <digit> that could be BIT(digit), it is not exported to uapi
61506305db96SHeinrich Schuchardt		if ($realfile !~ m@^include/uapi/@ &&
61516305db96SHeinrich Schuchardt		    $line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) {
61526305db96SHeinrich Schuchardt			my $ull = "";
61536305db96SHeinrich Schuchardt			$ull = "_ULL" if (defined($1) && $1 =~ /ll/i);
61546305db96SHeinrich Schuchardt			if (CHK("BIT_MACRO",
61556305db96SHeinrich Schuchardt				"Prefer using the BIT$ull macro\n" . $herecurr) &&
61566305db96SHeinrich Schuchardt			    $fix) {
61576305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/;
61586305db96SHeinrich Schuchardt			}
61596305db96SHeinrich Schuchardt		}
61606305db96SHeinrich Schuchardt
61616305db96SHeinrich Schuchardt# check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE
61626305db96SHeinrich Schuchardt		if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(CONFIG_[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) {
61636305db96SHeinrich Schuchardt			my $config = $1;
61646305db96SHeinrich Schuchardt			if (WARN("PREFER_IS_ENABLED",
61656305db96SHeinrich Schuchardt				 "Prefer IS_ENABLED(<FOO>) to CONFIG_<FOO> || CONFIG_<FOO>_MODULE\n" . $herecurr) &&
61666305db96SHeinrich Schuchardt			    $fix) {
61676305db96SHeinrich Schuchardt				$fixed[$fixlinenr] = "\+#if IS_ENABLED($config)";
61686b9709d9STom Rini			}
61696b9709d9STom Rini		}
61706b9709d9STom Rini
6171fc0b5948SRobert P. J. Day# check for case / default statements not preceded by break/fallthrough/switch
61726b9709d9STom Rini		if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
61736b9709d9STom Rini			my $has_break = 0;
61746b9709d9STom Rini			my $has_statement = 0;
61756b9709d9STom Rini			my $count = 0;
61766b9709d9STom Rini			my $prevline = $linenr;
61776305db96SHeinrich Schuchardt			while ($prevline > 1 && ($file || $count < 3) && !$has_break) {
61786b9709d9STom Rini				$prevline--;
61796b9709d9STom Rini				my $rline = $rawlines[$prevline - 1];
61806b9709d9STom Rini				my $fline = $lines[$prevline - 1];
61816b9709d9STom Rini				last if ($fline =~ /^\@\@/);
61826b9709d9STom Rini				next if ($fline =~ /^\-/);
61836b9709d9STom Rini				next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
61846b9709d9STom Rini				$has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
61856b9709d9STom Rini				next if ($fline =~ /^.[\s$;]*$/);
61866b9709d9STom Rini				$has_statement = 1;
61876b9709d9STom Rini				$count++;
6188*c398f2dfSHeinrich Schuchardt				$has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|exit\s*\(\b|return\b|goto\b|continue\b)/);
61896b9709d9STom Rini			}
61906b9709d9STom Rini			if (!$has_break && $has_statement) {
61916b9709d9STom Rini				WARN("MISSING_BREAK",
6192fc0b5948SRobert P. J. Day				     "Possible switch case/default not preceded by break or fallthrough comment\n" . $herecurr);
61936b9709d9STom Rini			}
6194dd88ab32SMasahiro Yamada		}
6195dd88ab32SMasahiro Yamada
6196dd88ab32SMasahiro Yamada# check for switch/default statements without a break;
6197dd88ab32SMasahiro Yamada		if ($^V && $^V ge 5.10.0 &&
6198dd88ab32SMasahiro Yamada		    defined $stat &&
6199dd88ab32SMasahiro Yamada		    $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
6200dd88ab32SMasahiro Yamada			my $cnt = statement_rawlines($stat);
6201*c398f2dfSHeinrich Schuchardt			my $herectx = get_stat_here($linenr, $cnt, $here);
6202*c398f2dfSHeinrich Schuchardt
6203dd88ab32SMasahiro Yamada			WARN("DEFAULT_NO_BREAK",
6204dd88ab32SMasahiro Yamada			     "switch default: should use break\n" . $herectx);
6205dd88ab32SMasahiro Yamada		}
6206dd88ab32SMasahiro Yamada
6207dd88ab32SMasahiro Yamada# check for gcc specific __FUNCTION__
62086b9709d9STom Rini		if ($line =~ /\b__FUNCTION__\b/) {
62096b9709d9STom Rini			if (WARN("USE_FUNC",
62106b9709d9STom Rini				 "__func__ should be used instead of gcc specific __FUNCTION__\n"  . $herecurr) &&
62116b9709d9STom Rini			    $fix) {
62126305db96SHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
62136b9709d9STom Rini			}
6214dd88ab32SMasahiro Yamada		}
6215dd88ab32SMasahiro Yamada
62166305db96SHeinrich Schuchardt# check for uses of __DATE__, __TIME__, __TIMESTAMP__
62176305db96SHeinrich Schuchardt		while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) {
62186305db96SHeinrich Schuchardt			ERROR("DATE_TIME",
62196305db96SHeinrich Schuchardt			      "Use of the '$1' macro makes the build non-deterministic\n" . $herecurr);
62206305db96SHeinrich Schuchardt		}
62216305db96SHeinrich Schuchardt
6222dd88ab32SMasahiro Yamada# check for use of yield()
6223dd88ab32SMasahiro Yamada		if ($line =~ /\byield\s*\(\s*\)/) {
6224dd88ab32SMasahiro Yamada			WARN("YIELD",
6225dd88ab32SMasahiro Yamada			     "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n"  . $herecurr);
6226dd88ab32SMasahiro Yamada		}
6227dd88ab32SMasahiro Yamada
62286b9709d9STom Rini# check for comparisons against true and false
62296b9709d9STom Rini		if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
62306b9709d9STom Rini			my $lead = $1;
62316b9709d9STom Rini			my $arg = $2;
62326b9709d9STom Rini			my $test = $3;
62336b9709d9STom Rini			my $otype = $4;
62346b9709d9STom Rini			my $trail = $5;
62356b9709d9STom Rini			my $op = "!";
62366b9709d9STom Rini
62376b9709d9STom Rini			($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
62386b9709d9STom Rini
62396b9709d9STom Rini			my $type = lc($otype);
62406b9709d9STom Rini			if ($type =~ /^(?:true|false)$/) {
62416b9709d9STom Rini				if (("$test" eq "==" && "$type" eq "true") ||
62426b9709d9STom Rini				    ("$test" eq "!=" && "$type" eq "false")) {
62436b9709d9STom Rini					$op = "";
62446b9709d9STom Rini				}
62456b9709d9STom Rini
62466b9709d9STom Rini				CHK("BOOL_COMPARISON",
62476b9709d9STom Rini				    "Using comparison to $otype is error prone\n" . $herecurr);
62486b9709d9STom Rini
62496b9709d9STom Rini## maybe suggesting a correct construct would better
62506b9709d9STom Rini##				    "Using comparison to $otype is error prone.  Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
62516b9709d9STom Rini
62526b9709d9STom Rini			}
62536b9709d9STom Rini		}
62546b9709d9STom Rini
6255dd88ab32SMasahiro Yamada# check for semaphores initialized locked
6256dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
6257dd88ab32SMasahiro Yamada			WARN("CONSIDER_COMPLETION",
6258dd88ab32SMasahiro Yamada			     "consider using a completion\n" . $herecurr);
6259dd88ab32SMasahiro Yamada		}
6260dd88ab32SMasahiro Yamada
6261dd88ab32SMasahiro Yamada# recommend kstrto* over simple_strto* and strict_strto*
6262dd88ab32SMasahiro Yamada		if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
6263dd88ab32SMasahiro Yamada			WARN("CONSIDER_KSTRTO",
6264dd88ab32SMasahiro Yamada			     "$1 is obsolete, use k$3 instead\n" . $herecurr);
6265dd88ab32SMasahiro Yamada		}
6266dd88ab32SMasahiro Yamada
62676305db96SHeinrich Schuchardt# check for __initcall(), use device_initcall() explicitly or more appropriate function please
6268dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*__initcall\s*\(/) {
6269dd88ab32SMasahiro Yamada			WARN("USE_DEVICE_INITCALL",
62706305db96SHeinrich Schuchardt			     "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
6271dd88ab32SMasahiro Yamada		}
6272dd88ab32SMasahiro Yamada
62736305db96SHeinrich Schuchardt# check for various structs that are normally const (ops, kgdb, device_tree)
62746305db96SHeinrich Schuchardt# and avoid what seem like struct definitions 'struct foo {'
6275dd88ab32SMasahiro Yamada		if ($line !~ /\bconst\b/ &&
62766305db96SHeinrich Schuchardt		    $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) {
6277dd88ab32SMasahiro Yamada			WARN("CONST_STRUCT",
62786305db96SHeinrich Schuchardt			     "struct $1 should normally be const\n" . $herecurr);
6279dd88ab32SMasahiro Yamada		}
6280dd88ab32SMasahiro Yamada
6281dd88ab32SMasahiro Yamada# use of NR_CPUS is usually wrong
6282dd88ab32SMasahiro Yamada# ignore definitions of NR_CPUS and usage to define arrays as likely right
6283dd88ab32SMasahiro Yamada		if ($line =~ /\bNR_CPUS\b/ &&
6284dd88ab32SMasahiro Yamada		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
6285dd88ab32SMasahiro Yamada		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
6286dd88ab32SMasahiro Yamada		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
6287dd88ab32SMasahiro Yamada		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
6288dd88ab32SMasahiro Yamada		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
6289dd88ab32SMasahiro Yamada		{
6290dd88ab32SMasahiro Yamada			WARN("NR_CPUS",
6291dd88ab32SMasahiro Yamada			     "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
6292dd88ab32SMasahiro Yamada		}
6293dd88ab32SMasahiro Yamada
62946b9709d9STom Rini# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
62956b9709d9STom Rini		if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
62966b9709d9STom Rini			ERROR("DEFINE_ARCH_HAS",
62976b9709d9STom Rini			      "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
62986b9709d9STom Rini		}
62996b9709d9STom Rini
63006305db96SHeinrich Schuchardt# likely/unlikely comparisons similar to "(likely(foo) > 0)"
63016305db96SHeinrich Schuchardt		if ($^V && $^V ge 5.10.0 &&
63026305db96SHeinrich Schuchardt		    $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) {
63036305db96SHeinrich Schuchardt			WARN("LIKELY_MISUSE",
63046305db96SHeinrich Schuchardt			     "Using $1 should generally have parentheses around the comparison\n" . $herecurr);
6305dd88ab32SMasahiro Yamada		}
6306dd88ab32SMasahiro Yamada
6307dd88ab32SMasahiro Yamada# whine mightly about in_atomic
6308dd88ab32SMasahiro Yamada		if ($line =~ /\bin_atomic\s*\(/) {
6309dd88ab32SMasahiro Yamada			if ($realfile =~ m@^drivers/@) {
6310dd88ab32SMasahiro Yamada				ERROR("IN_ATOMIC",
6311dd88ab32SMasahiro Yamada				      "do not use in_atomic in drivers\n" . $herecurr);
6312dd88ab32SMasahiro Yamada			} elsif ($realfile !~ m@^kernel/@) {
6313dd88ab32SMasahiro Yamada				WARN("IN_ATOMIC",
6314dd88ab32SMasahiro Yamada				     "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
6315dd88ab32SMasahiro Yamada			}
6316dd88ab32SMasahiro Yamada		}
6317dd88ab32SMasahiro Yamada
63186305db96SHeinrich Schuchardt# check for mutex_trylock_recursive usage
63196305db96SHeinrich Schuchardt		if ($line =~ /mutex_trylock_recursive/) {
63206305db96SHeinrich Schuchardt			ERROR("LOCKING",
63216305db96SHeinrich Schuchardt			      "recursive locking is bad, do not use this ever.\n" . $herecurr);
63226305db96SHeinrich Schuchardt		}
63236305db96SHeinrich Schuchardt
6324dd88ab32SMasahiro Yamada# check for lockdep_set_novalidate_class
6325dd88ab32SMasahiro Yamada		if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
6326dd88ab32SMasahiro Yamada		    $line =~ /__lockdep_no_validate__\s*\)/ ) {
6327dd88ab32SMasahiro Yamada			if ($realfile !~ m@^kernel/lockdep@ &&
6328dd88ab32SMasahiro Yamada			    $realfile !~ m@^include/linux/lockdep@ &&
6329dd88ab32SMasahiro Yamada			    $realfile !~ m@^drivers/base/core@) {
6330dd88ab32SMasahiro Yamada				ERROR("LOCKDEP",
6331dd88ab32SMasahiro Yamada				      "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
6332dd88ab32SMasahiro Yamada			}
6333dd88ab32SMasahiro Yamada		}
6334dd88ab32SMasahiro Yamada
63356305db96SHeinrich Schuchardt		if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ ||
63366305db96SHeinrich Schuchardt		    $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) {
6337dd88ab32SMasahiro Yamada			WARN("EXPORTED_WORLD_WRITABLE",
6338dd88ab32SMasahiro Yamada			     "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
6339dd88ab32SMasahiro Yamada		}
63406305db96SHeinrich Schuchardt
6341*c398f2dfSHeinrich Schuchardt# check for DEVICE_ATTR uses that could be DEVICE_ATTR_<FOO>
6342*c398f2dfSHeinrich Schuchardt# and whether or not function naming is typical and if
6343*c398f2dfSHeinrich Schuchardt# DEVICE_ATTR permissions uses are unusual too
6344*c398f2dfSHeinrich Schuchardt		if ($^V && $^V ge 5.10.0 &&
6345*c398f2dfSHeinrich Schuchardt		    defined $stat &&
6346*c398f2dfSHeinrich Schuchardt		    $stat =~ /\bDEVICE_ATTR\s*\(\s*(\w+)\s*,\s*\(?\s*(\s*(?:${multi_mode_perms_string_search}|0[0-7]{3,3})\s*)\s*\)?\s*,\s*(\w+)\s*,\s*(\w+)\s*\)/) {
6347*c398f2dfSHeinrich Schuchardt			my $var = $1;
6348*c398f2dfSHeinrich Schuchardt			my $perms = $2;
6349*c398f2dfSHeinrich Schuchardt			my $show = $3;
6350*c398f2dfSHeinrich Schuchardt			my $store = $4;
6351*c398f2dfSHeinrich Schuchardt			my $octal_perms = perms_to_octal($perms);
6352*c398f2dfSHeinrich Schuchardt			if ($show =~ /^${var}_show$/ &&
6353*c398f2dfSHeinrich Schuchardt			    $store =~ /^${var}_store$/ &&
6354*c398f2dfSHeinrich Schuchardt			    $octal_perms eq "0644") {
6355*c398f2dfSHeinrich Schuchardt				if (WARN("DEVICE_ATTR_RW",
6356*c398f2dfSHeinrich Schuchardt					 "Use DEVICE_ATTR_RW\n" . $herecurr) &&
6357*c398f2dfSHeinrich Schuchardt				    $fix) {
6358*c398f2dfSHeinrich Schuchardt					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*$store\s*\)/DEVICE_ATTR_RW(${var})/;
6359*c398f2dfSHeinrich Schuchardt				}
6360*c398f2dfSHeinrich Schuchardt			} elsif ($show =~ /^${var}_show$/ &&
6361*c398f2dfSHeinrich Schuchardt				 $store =~ /^NULL$/ &&
6362*c398f2dfSHeinrich Schuchardt				 $octal_perms eq "0444") {
6363*c398f2dfSHeinrich Schuchardt				if (WARN("DEVICE_ATTR_RO",
6364*c398f2dfSHeinrich Schuchardt					 "Use DEVICE_ATTR_RO\n" . $herecurr) &&
6365*c398f2dfSHeinrich Schuchardt				    $fix) {
6366*c398f2dfSHeinrich Schuchardt					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*NULL\s*\)/DEVICE_ATTR_RO(${var})/;
6367*c398f2dfSHeinrich Schuchardt				}
6368*c398f2dfSHeinrich Schuchardt			} elsif ($show =~ /^NULL$/ &&
6369*c398f2dfSHeinrich Schuchardt				 $store =~ /^${var}_store$/ &&
6370*c398f2dfSHeinrich Schuchardt				 $octal_perms eq "0200") {
6371*c398f2dfSHeinrich Schuchardt				if (WARN("DEVICE_ATTR_WO",
6372*c398f2dfSHeinrich Schuchardt					 "Use DEVICE_ATTR_WO\n" . $herecurr) &&
6373*c398f2dfSHeinrich Schuchardt				    $fix) {
6374*c398f2dfSHeinrich Schuchardt					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*NULL\s*,\s*$store\s*\)/DEVICE_ATTR_WO(${var})/;
6375*c398f2dfSHeinrich Schuchardt				}
6376*c398f2dfSHeinrich Schuchardt			} elsif ($octal_perms eq "0644" ||
6377*c398f2dfSHeinrich Schuchardt				 $octal_perms eq "0444" ||
6378*c398f2dfSHeinrich Schuchardt				 $octal_perms eq "0200") {
6379*c398f2dfSHeinrich Schuchardt				my $newshow = "$show";
6380*c398f2dfSHeinrich Schuchardt				$newshow = "${var}_show" if ($show ne "NULL" && $show ne "${var}_show");
6381*c398f2dfSHeinrich Schuchardt				my $newstore = $store;
6382*c398f2dfSHeinrich Schuchardt				$newstore = "${var}_store" if ($store ne "NULL" && $store ne "${var}_store");
6383*c398f2dfSHeinrich Schuchardt				my $rename = "";
6384*c398f2dfSHeinrich Schuchardt				if ($show ne $newshow) {
6385*c398f2dfSHeinrich Schuchardt					$rename .= " '$show' to '$newshow'";
6386*c398f2dfSHeinrich Schuchardt				}
6387*c398f2dfSHeinrich Schuchardt				if ($store ne $newstore) {
6388*c398f2dfSHeinrich Schuchardt					$rename .= " '$store' to '$newstore'";
6389*c398f2dfSHeinrich Schuchardt				}
6390*c398f2dfSHeinrich Schuchardt				WARN("DEVICE_ATTR_FUNCTIONS",
6391*c398f2dfSHeinrich Schuchardt				     "Consider renaming function(s)$rename\n" . $herecurr);
6392*c398f2dfSHeinrich Schuchardt			} else {
6393*c398f2dfSHeinrich Schuchardt				WARN("DEVICE_ATTR_PERMS",
6394*c398f2dfSHeinrich Schuchardt				     "DEVICE_ATTR unusual permissions '$perms' used\n" . $herecurr);
6395*c398f2dfSHeinrich Schuchardt			}
6396*c398f2dfSHeinrich Schuchardt		}
6397*c398f2dfSHeinrich Schuchardt
63986305db96SHeinrich Schuchardt# Mode permission misuses where it seems decimal should be octal
63996305db96SHeinrich Schuchardt# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
6400*c398f2dfSHeinrich Schuchardt# o Ignore module_param*(...) uses with a decimal 0 permission as that has a
6401*c398f2dfSHeinrich Schuchardt#   specific definition of not visible in sysfs.
6402*c398f2dfSHeinrich Schuchardt# o Ignore proc_create*(...) uses with a decimal 0 permission as that means
6403*c398f2dfSHeinrich Schuchardt#   use the default permissions
64046305db96SHeinrich Schuchardt		if ($^V && $^V ge 5.10.0 &&
64056305db96SHeinrich Schuchardt		    defined $stat &&
64066305db96SHeinrich Schuchardt		    $line =~ /$mode_perms_search/) {
64076305db96SHeinrich Schuchardt			foreach my $entry (@mode_permission_funcs) {
64086305db96SHeinrich Schuchardt				my $func = $entry->[0];
64096305db96SHeinrich Schuchardt				my $arg_pos = $entry->[1];
64106305db96SHeinrich Schuchardt
64116305db96SHeinrich Schuchardt				my $lc = $stat =~ tr@\n@@;
64126305db96SHeinrich Schuchardt				$lc = $lc + $linenr;
6413*c398f2dfSHeinrich Schuchardt				my $stat_real = get_stat_real($linenr, $lc);
64146305db96SHeinrich Schuchardt
64156305db96SHeinrich Schuchardt				my $skip_args = "";
64166305db96SHeinrich Schuchardt				if ($arg_pos > 1) {
64176305db96SHeinrich Schuchardt					$arg_pos--;
64186305db96SHeinrich Schuchardt					$skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
64196305db96SHeinrich Schuchardt				}
64206305db96SHeinrich Schuchardt				my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]";
64216305db96SHeinrich Schuchardt				if ($stat =~ /$test/) {
64226305db96SHeinrich Schuchardt					my $val = $1;
64236305db96SHeinrich Schuchardt					$val = $6 if ($skip_args ne "");
6424*c398f2dfSHeinrich Schuchardt					if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") &&
6425*c398f2dfSHeinrich Schuchardt					    (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
6426*c398f2dfSHeinrich Schuchardt					     ($val =~ /^$Octal$/ && length($val) ne 4))) {
64276305db96SHeinrich Schuchardt						ERROR("NON_OCTAL_PERMISSIONS",
64286305db96SHeinrich Schuchardt						      "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real);
64296305db96SHeinrich Schuchardt					}
64306305db96SHeinrich Schuchardt					if ($val =~ /^$Octal$/ && (oct($val) & 02)) {
64316305db96SHeinrich Schuchardt						ERROR("EXPORTED_WORLD_WRITABLE",
64326305db96SHeinrich Schuchardt						      "Exporting writable files is usually an error. Consider more restrictive permissions.\n" . "$here\n" . $stat_real);
64336305db96SHeinrich Schuchardt					}
64346305db96SHeinrich Schuchardt				}
64356305db96SHeinrich Schuchardt			}
64366305db96SHeinrich Schuchardt		}
64376305db96SHeinrich Schuchardt
64386305db96SHeinrich Schuchardt# check for uses of S_<PERMS> that could be octal for readability
6439*c398f2dfSHeinrich Schuchardt		while ($line =~ m{\b($multi_mode_perms_string_search)\b}g) {
6440*c398f2dfSHeinrich Schuchardt			my $oval = $1;
6441*c398f2dfSHeinrich Schuchardt			my $octal = perms_to_octal($oval);
64426305db96SHeinrich Schuchardt			if (WARN("SYMBOLIC_PERMS",
64436305db96SHeinrich Schuchardt				 "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) &&
64446305db96SHeinrich Schuchardt			    $fix) {
6445*c398f2dfSHeinrich Schuchardt				$fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/;
64466305db96SHeinrich Schuchardt			}
64476305db96SHeinrich Schuchardt		}
64486305db96SHeinrich Schuchardt
64496305db96SHeinrich Schuchardt# validate content of MODULE_LICENSE against list from include/linux/module.h
64506305db96SHeinrich Schuchardt		if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) {
64516305db96SHeinrich Schuchardt			my $extracted_string = get_quoted_string($line, $rawline);
64526305db96SHeinrich Schuchardt			my $valid_licenses = qr{
64536305db96SHeinrich Schuchardt						GPL|
64546305db96SHeinrich Schuchardt						GPL\ v2|
64556305db96SHeinrich Schuchardt						GPL\ and\ additional\ rights|
64566305db96SHeinrich Schuchardt						Dual\ BSD/GPL|
64576305db96SHeinrich Schuchardt						Dual\ MIT/GPL|
64586305db96SHeinrich Schuchardt						Dual\ MPL/GPL|
64596305db96SHeinrich Schuchardt						Proprietary
64606305db96SHeinrich Schuchardt					}x;
64616305db96SHeinrich Schuchardt			if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) {
64626305db96SHeinrich Schuchardt				WARN("MODULE_LICENSE",
64636305db96SHeinrich Schuchardt				     "unknown module license " . $extracted_string . "\n" . $herecurr);
64646305db96SHeinrich Schuchardt			}
64656305db96SHeinrich Schuchardt		}
6466dd88ab32SMasahiro Yamada	}
6467dd88ab32SMasahiro Yamada
6468dd88ab32SMasahiro Yamada	# If we have no input at all, then there is nothing to report on
6469dd88ab32SMasahiro Yamada	# so just keep quiet.
6470dd88ab32SMasahiro Yamada	if ($#rawlines == -1) {
6471dd88ab32SMasahiro Yamada		exit(0);
6472dd88ab32SMasahiro Yamada	}
6473dd88ab32SMasahiro Yamada
6474dd88ab32SMasahiro Yamada	# In mailback mode only produce a report in the negative, for
6475dd88ab32SMasahiro Yamada	# things that appear to be patches.
6476dd88ab32SMasahiro Yamada	if ($mailback && ($clean == 1 || !$is_patch)) {
6477dd88ab32SMasahiro Yamada		exit(0);
6478dd88ab32SMasahiro Yamada	}
6479dd88ab32SMasahiro Yamada
6480dd88ab32SMasahiro Yamada	# This is not a patch, and we are are in 'no-patch' mode so
6481dd88ab32SMasahiro Yamada	# just keep quiet.
6482dd88ab32SMasahiro Yamada	if (!$chk_patch && !$is_patch) {
6483dd88ab32SMasahiro Yamada		exit(0);
6484dd88ab32SMasahiro Yamada	}
6485dd88ab32SMasahiro Yamada
6486*c398f2dfSHeinrich Schuchardt	if (!$is_patch && $filename !~ /cover-letter\.patch$/) {
6487dd88ab32SMasahiro Yamada		ERROR("NOT_UNIFIED_DIFF",
6488dd88ab32SMasahiro Yamada		      "Does not appear to be a unified-diff format patch\n");
6489dd88ab32SMasahiro Yamada	}
64906305db96SHeinrich Schuchardt	if ($is_patch && $has_commit_log && $chk_signoff && $signoff == 0) {
6491dd88ab32SMasahiro Yamada		ERROR("MISSING_SIGN_OFF",
6492dd88ab32SMasahiro Yamada		      "Missing Signed-off-by: line(s)\n");
6493dd88ab32SMasahiro Yamada	}
6494dd88ab32SMasahiro Yamada
6495dd88ab32SMasahiro Yamada	print report_dump();
6496dd88ab32SMasahiro Yamada	if ($summary && !($clean == 1 && $quiet == 1)) {
6497dd88ab32SMasahiro Yamada		print "$filename " if ($summary_file);
6498dd88ab32SMasahiro Yamada		print "total: $cnt_error errors, $cnt_warn warnings, " .
6499dd88ab32SMasahiro Yamada			(($check)? "$cnt_chk checks, " : "") .
6500dd88ab32SMasahiro Yamada			"$cnt_lines lines checked\n";
6501dd88ab32SMasahiro Yamada	}
6502dd88ab32SMasahiro Yamada
6503dd88ab32SMasahiro Yamada	if ($quiet == 0) {
65046305db96SHeinrich Schuchardt		# If there were any defects found and not already fixing them
65056305db96SHeinrich Schuchardt		if (!$clean and !$fix) {
65066305db96SHeinrich Schuchardt			print << "EOM"
6507dd88ab32SMasahiro Yamada
65086305db96SHeinrich SchuchardtNOTE: For some of the reported defects, checkpatch may be able to
65096305db96SHeinrich Schuchardt      mechanically convert to the typical style using --fix or --fix-inplace.
65106305db96SHeinrich SchuchardtEOM
6511dd88ab32SMasahiro Yamada		}
6512dd88ab32SMasahiro Yamada		# If there were whitespace errors which cleanpatch can fix
6513dd88ab32SMasahiro Yamada		# then suggest that.
6514dd88ab32SMasahiro Yamada		if ($rpt_cleaners) {
6515dd88ab32SMasahiro Yamada			$rpt_cleaners = 0;
65166305db96SHeinrich Schuchardt			print << "EOM"
65176305db96SHeinrich Schuchardt
65186305db96SHeinrich SchuchardtNOTE: Whitespace errors detected.
65196305db96SHeinrich Schuchardt      You may wish to use scripts/cleanpatch or scripts/cleanfile
65206305db96SHeinrich SchuchardtEOM
6521dd88ab32SMasahiro Yamada		}
6522dd88ab32SMasahiro Yamada	}
6523dd88ab32SMasahiro Yamada
65246305db96SHeinrich Schuchardt	if ($clean == 0 && $fix &&
65256305db96SHeinrich Schuchardt	    ("@rawlines" ne "@fixed" ||
65266305db96SHeinrich Schuchardt	     $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
65276b9709d9STom Rini		my $newfile = $filename;
65286b9709d9STom Rini		$newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
65296b9709d9STom Rini		my $linecount = 0;
65306b9709d9STom Rini		my $f;
65316b9709d9STom Rini
65326305db96SHeinrich Schuchardt		@fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
65336305db96SHeinrich Schuchardt
65346b9709d9STom Rini		open($f, '>', $newfile)
65356b9709d9STom Rini		    or die "$P: Can't open $newfile for write\n";
65366b9709d9STom Rini		foreach my $fixed_line (@fixed) {
65376b9709d9STom Rini			$linecount++;
65386b9709d9STom Rini			if ($file) {
65396b9709d9STom Rini				if ($linecount > 3) {
65406b9709d9STom Rini					$fixed_line =~ s/^\+//;
65416b9709d9STom Rini					print $f $fixed_line . "\n";
6542dd88ab32SMasahiro Yamada				}
65436b9709d9STom Rini			} else {
65446b9709d9STom Rini				print $f $fixed_line . "\n";
65456b9709d9STom Rini			}
65466b9709d9STom Rini		}
65476b9709d9STom Rini		close($f);
65486b9709d9STom Rini
65496b9709d9STom Rini		if (!$quiet) {
65506b9709d9STom Rini			print << "EOM";
65516305db96SHeinrich Schuchardt
65526b9709d9STom RiniWrote EXPERIMENTAL --fix correction(s) to '$newfile'
65536b9709d9STom Rini
65546b9709d9STom RiniDo _NOT_ trust the results written to this file.
65556b9709d9STom RiniDo _NOT_ submit these changes without inspecting them for correctness.
65566b9709d9STom Rini
65576b9709d9STom RiniThis EXPERIMENTAL file is simply a convenience to help rewrite patches.
65586b9709d9STom RiniNo warranties, expressed or implied...
65596b9709d9STom RiniEOM
65606b9709d9STom Rini		}
6561dd88ab32SMasahiro Yamada	}
6562dd88ab32SMasahiro Yamada
65636305db96SHeinrich Schuchardt	if ($quiet == 0) {
65646305db96SHeinrich Schuchardt		print "\n";
65656305db96SHeinrich Schuchardt		if ($clean == 1) {
65666305db96SHeinrich Schuchardt			print "$vname has no obvious style problems and is ready for submission.\n";
65676305db96SHeinrich Schuchardt		} else {
65686305db96SHeinrich Schuchardt			print "$vname has style problems, please review.\n";
6569dd88ab32SMasahiro Yamada		}
6570dd88ab32SMasahiro Yamada	}
6571dd88ab32SMasahiro Yamada	return $clean;
6572dd88ab32SMasahiro Yamada}
6573