* Why these dot chars in scripts/checkpatch.pl?
@ 2008-04-28 20:31 Paul Jackson
2008-04-28 20:47 ` Rogan Dawes
2008-04-28 23:02 ` Andy Whitcroft
0 siblings, 2 replies; 7+ messages in thread
From: Paul Jackson @ 2008-04-28 20:31 UTC (permalink / raw)
To: Andy Whitcroft; +Cc: linux-kernel
Andy,
Perhaps I'm loosing my magic regex pixie dust, but the dot '.' char
in the pattern "/^.#" in the following lines looks wrong to me, as if
one were trying to match pre-processor directives that were set in by
one character:
The command:
grep '^[^#].*\/\^\.#' scripts/checkpatch.pl
displays:
if ($res =~ /^.#\s*include\s+\<(.*)\>/) {
} elsif ($res =~ /^.#\s*(?:error|warning)\s+(.*)\b/) {
if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.#/) {
if ($line =~ /^.#\s*if\s+0\b/) {
if ($line =~ /^.#\s*(ifdef|ifndef|elif)\s\s+/) {
$line !~ /^.#\s*if\b.*\bNR_CPUS\b/ &&
$line !~ /^.#\s*define\b.*\bNR_CPUS\b/ &&
--
I won't rest till it's the best ...
Programmer, Linux Scalability
Paul Jackson <pj@sgi.com> 1.940.382.4214
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: Why these dot chars in scripts/checkpatch.pl? 2008-04-28 20:31 Why these dot chars in scripts/checkpatch.pl? Paul Jackson @ 2008-04-28 20:47 ` Rogan Dawes 2008-04-28 20:51 ` Paul Jackson 2008-04-28 22:10 ` Jan Engelhardt 2008-04-28 23:02 ` Andy Whitcroft 1 sibling, 2 replies; 7+ messages in thread From: Rogan Dawes @ 2008-04-28 20:47 UTC (permalink / raw) To: Paul Jackson; +Cc: Andy Whitcroft, linux-kernel Paul Jackson wrote: > Andy, > > Perhaps I'm loosing my magic regex pixie dust, but the dot '.' char > in the pattern "/^.#" in the following lines looks wrong to me, as if > one were trying to match pre-processor directives that were set in by > one character: Perhaps it is because checkpatch.pl is supposed to check *patches*, which are typically indented by one character (+- )? Rogan ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Why these dot chars in scripts/checkpatch.pl? 2008-04-28 20:47 ` Rogan Dawes @ 2008-04-28 20:51 ` Paul Jackson 2008-04-28 22:10 ` Jan Engelhardt 1 sibling, 0 replies; 7+ messages in thread From: Paul Jackson @ 2008-04-28 20:51 UTC (permalink / raw) To: Rogan Dawes; +Cc: apw, linux-kernel Rogan wrote: > Perhaps it is because checkpatch.pl is supposed to check *patches*, > which are typically indented by one character (+- )? You're a genius. It's an honor to be of the same species. -- I won't rest till it's the best ... Programmer, Linux Scalability Paul Jackson <pj@sgi.com> 1.940.382.4214 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re:+patch Why these dot chars in scripts/checkpatch.pl? 2008-04-28 20:47 ` Rogan Dawes 2008-04-28 20:51 ` Paul Jackson @ 2008-04-28 22:10 ` Jan Engelhardt 2008-04-28 23:06 ` +patch " Andy Whitcroft 1 sibling, 1 reply; 7+ messages in thread From: Jan Engelhardt @ 2008-04-28 22:10 UTC (permalink / raw) To: Rogan Dawes; +Cc: Paul Jackson, Andy Whitcroft, linux-kernel On Monday 2008-04-28 22:47, Rogan Dawes wrote: > Paul Jackson wrote: >> Andy, >> >> Perhaps I'm loosing my magic regex pixie dust, but the dot '.' char >> in the pattern "/^.#" in the following lines looks wrong to me, as if >> one were trying to match pre-processor directives that were set in by >> one character: > > Perhaps it is because checkpatch.pl is supposed to check *patches*, which are > typically indented by one character (+- )? Even so, the regexes are not entirely accurate. Patch below. === commit e08a94e334d67ac5f2437c8aba4c6ffbb058d7db Author: Jan Engelhardt <jengelh@medozas.de> Date: Tue Apr 29 00:06:42 2008 +0200 checkpatch: fix recognition of preprocessor directives Signed-off-by: Jan Engelhardt <jengelh@medozas.de> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 58a9494..22df611 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -355,12 +355,12 @@ sub sanitise_line { } # The pathname on a #include may be surrounded by '<' and '>'. - if ($res =~ /^.#\s*include\s+\<(.*)\>/) { + if ($res =~ /^.\s*#\s*include\s+\<(.*)\>/) { my $clean = 'X' x length($1); $res =~ s@\<.*\>@<$clean>@; # The whole of a #error is a string. - } elsif ($res =~ /^.#\s*(?:error|warning)\s+(.*)\b/) { + } elsif ($res =~ /^.\s*#\s*(?:error|warning)\s+(.*)\b/) { my $clean = 'X' x length($1); $res =~ s@(#\s*(?:error|warning)\s+).*@$1$clean@; } @@ -1194,7 +1194,7 @@ sub process { # if/while/etc brace do not go on next line, unless defining a do while loop, # or if that brace on the next line is for something else - if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.#/) { + if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*#/) { my $pre_ctx = "$1$2"; my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); @@ -1877,7 +1877,7 @@ sub process { } # warn about #if 0 - if ($line =~ /^.#\s*if\s+0\b/) { + if ($line =~ /^.\s*#\s*if\s+0\b/) { CHK("if this code is redundant consider removing it\n" . $herecurr); } @@ -1891,14 +1891,14 @@ sub process { } # warn about #ifdefs in C files -# if ($line =~ /^.#\s*if(|n)def/ && ($realfile =~ /\.c$/)) { +# if ($line =~ /^.\s*#\s*if(|n)def/ && ($realfile =~ /\.c$/)) { # print "#ifdef in C files should be avoided\n"; # print "$herecurr"; # $clean = 0; # } # warn about spacing in #ifdefs - if ($line =~ /^.#\s*(ifdef|ifndef|elif)\s\s+/) { + if ($line =~ /^.\s*#\s*(ifdef|ifndef|elif)\s\s+/) { ERROR("exactly one space required after that #$1\n" . $herecurr); } @@ -1972,7 +1972,7 @@ sub process { # use of NR_CPUS is usually wrong # ignore definitions of NR_CPUS and usage to define arrays as likely right if ($line =~ /\bNR_CPUS\b/ && - $line !~ /^.#\s*define\s+NR_CPUS\s+/ && + $line !~ /^.\s*#\s*define\s+NR_CPUS\s+/ && $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/) { WARN("usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr); ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: +patch Why these dot chars in scripts/checkpatch.pl? 2008-04-28 22:10 ` Jan Engelhardt @ 2008-04-28 23:06 ` Andy Whitcroft 2008-04-29 9:51 ` Segher Boessenkool 0 siblings, 1 reply; 7+ messages in thread From: Andy Whitcroft @ 2008-04-28 23:06 UTC (permalink / raw) To: Jan Engelhardt; +Cc: Rogan Dawes, Paul Jackson, linux-kernel On Tue, Apr 29, 2008 at 12:10:03AM +0200, Jan Engelhardt wrote: > > On Monday 2008-04-28 22:47, Rogan Dawes wrote: > > Paul Jackson wrote: > >> Andy, > >> > >> Perhaps I'm loosing my magic regex pixie dust, but the dot '.' char > >> in the pattern "/^.#" in the following lines looks wrong to me, as if > >> one were trying to match pre-processor directives that were set in by > >> one character: > > > > Perhaps it is because checkpatch.pl is supposed to check *patches*, which are > > typically indented by one character (+- )? > > Even so, the regexes are not entirely accurate. > Patch below. Yeah I was under the missaprehension that whitespace was allowed after the # but not before. That seems to be flawed. Thanks for the patch. "Preprocessing directives are lines in your program that start with `#'. Whitespace is allowed before and after the `#'." > === > commit e08a94e334d67ac5f2437c8aba4c6ffbb058d7db > Author: Jan Engelhardt <jengelh@medozas.de> > Date: Tue Apr 29 00:06:42 2008 +0200 > > checkpatch: fix recognition of preprocessor directives > > Signed-off-by: Jan Engelhardt <jengelh@medozas.de> > > diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl > index 58a9494..22df611 100755 > --- a/scripts/checkpatch.pl > +++ b/scripts/checkpatch.pl > @@ -355,12 +355,12 @@ sub sanitise_line { > } > > # The pathname on a #include may be surrounded by '<' and '>'. > - if ($res =~ /^.#\s*include\s+\<(.*)\>/) { > + if ($res =~ /^.\s*#\s*include\s+\<(.*)\>/) { > my $clean = 'X' x length($1); > $res =~ s@\<.*\>@<$clean>@; > > # The whole of a #error is a string. > - } elsif ($res =~ /^.#\s*(?:error|warning)\s+(.*)\b/) { > + } elsif ($res =~ /^.\s*#\s*(?:error|warning)\s+(.*)\b/) { > my $clean = 'X' x length($1); > $res =~ s@(#\s*(?:error|warning)\s+).*@$1$clean@; > } > @@ -1194,7 +1194,7 @@ sub process { > > # if/while/etc brace do not go on next line, unless defining a do while loop, > # or if that brace on the next line is for something else > - if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.#/) { > + if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*#/) { > my $pre_ctx = "$1$2"; > > my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); > @@ -1877,7 +1877,7 @@ sub process { > } > > # warn about #if 0 > - if ($line =~ /^.#\s*if\s+0\b/) { > + if ($line =~ /^.\s*#\s*if\s+0\b/) { > CHK("if this code is redundant consider removing it\n" . > $herecurr); > } > @@ -1891,14 +1891,14 @@ sub process { > } > > # warn about #ifdefs in C files > -# if ($line =~ /^.#\s*if(|n)def/ && ($realfile =~ /\.c$/)) { > +# if ($line =~ /^.\s*#\s*if(|n)def/ && ($realfile =~ /\.c$/)) { > # print "#ifdef in C files should be avoided\n"; > # print "$herecurr"; > # $clean = 0; > # } > > # warn about spacing in #ifdefs > - if ($line =~ /^.#\s*(ifdef|ifndef|elif)\s\s+/) { > + if ($line =~ /^.\s*#\s*(ifdef|ifndef|elif)\s\s+/) { > ERROR("exactly one space required after that #$1\n" . $herecurr); > } > > @@ -1972,7 +1972,7 @@ sub process { > # use of NR_CPUS is usually wrong > # ignore definitions of NR_CPUS and usage to define arrays as likely right > if ($line =~ /\bNR_CPUS\b/ && > - $line !~ /^.#\s*define\s+NR_CPUS\s+/ && > + $line !~ /^.\s*#\s*define\s+NR_CPUS\s+/ && > $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/) > { > WARN("usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr); ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: +patch Why these dot chars in scripts/checkpatch.pl? 2008-04-28 23:06 ` +patch " Andy Whitcroft @ 2008-04-29 9:51 ` Segher Boessenkool 0 siblings, 0 replies; 7+ messages in thread From: Segher Boessenkool @ 2008-04-29 9:51 UTC (permalink / raw) To: Andy Whitcroft; +Cc: Paul Jackson, Rogan Dawes, Jan Engelhardt, linux-kernel > Yeah I was under the missaprehension that whitespace was allowed after > the # but not before. That seems to be flawed. It is true for K&R C (so with -traditional cpp mode), but indeed false for ISO C. Segher ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Why these dot chars in scripts/checkpatch.pl? 2008-04-28 20:31 Why these dot chars in scripts/checkpatch.pl? Paul Jackson 2008-04-28 20:47 ` Rogan Dawes @ 2008-04-28 23:02 ` Andy Whitcroft 1 sibling, 0 replies; 7+ messages in thread From: Andy Whitcroft @ 2008-04-28 23:02 UTC (permalink / raw) To: Paul Jackson; +Cc: linux-kernel On Mon, Apr 28, 2008 at 03:31:22PM -0500, Paul Jackson wrote: > Andy, > > Perhaps I'm loosing my magic regex pixie dust, but the dot '.' char > in the pattern "/^.#" in the following lines looks wrong to me, as if > one were trying to match pre-processor directives that were set in by > one character: This is because we always are dealing with diff lines, not real lines. So there is always a ' ', '+', or '-' in character 0 of the line (within a diff hunk). In some tests we may be looking at either context ' ' or new lines '+' and so its handy to use '.' over '[ \+]', and I have maintained that model throughout the other tests. > The command: > > grep '^[^#].*\/\^\.#' scripts/checkpatch.pl > > displays: > > if ($res =~ /^.#\s*include\s+\<(.*)\>/) { > } elsif ($res =~ /^.#\s*(?:error|warning)\s+(.*)\b/) { > if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.#/) { > if ($line =~ /^.#\s*if\s+0\b/) { > if ($line =~ /^.#\s*(ifdef|ifndef|elif)\s\s+/) { > $line !~ /^.#\s*if\b.*\bNR_CPUS\b/ && > $line !~ /^.#\s*define\b.*\bNR_CPUS\b/ && > -apw ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-04-29 9:52 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-04-28 20:31 Why these dot chars in scripts/checkpatch.pl? Paul Jackson 2008-04-28 20:47 ` Rogan Dawes 2008-04-28 20:51 ` Paul Jackson 2008-04-28 22:10 ` Jan Engelhardt 2008-04-28 23:06 ` +patch " Andy Whitcroft 2008-04-29 9:51 ` Segher Boessenkool 2008-04-28 23:02 ` Andy Whitcroft
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox