Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 295205
b: refs/heads/master
c: d1fe9c0
h: refs/heads/master
i:
  295203: 721cd24
v: v3
  • Loading branch information
Joe Perches authored and Linus Torvalds committed Mar 23, 2012
1 parent 5d0a861 commit c63461a
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6061d949dd984c762ee272a88e77699fa675d1c8
refs/heads/master: d1fe9c099cecc6e49324355f1b15573e9dbbe0f9
94 changes: 84 additions & 10 deletions trunk/scripts/checkpatch.pl
Original file line number Diff line number Diff line change
Expand Up @@ -330,10 +330,15 @@ sub build_types {
}
build_types();

our $match_balanced_parentheses = qr/(\((?:[^\(\)]+|(-1))*\))/;

our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
our $LvalOrFunc = qr{($Lval)\s*($match_balanced_parentheses{0,1})\s*};

# Using $balanced_parens, $LvalOrFunc, or $FuncArg
# requires at least perl version v5.10.0
# Any use must be runtime checked with $^V

our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
our $LvalOrFunc = qr{($Lval)\s*($balanced_parens{0,1})\s*};
our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};

sub deparenthesize {
Expand Down Expand Up @@ -1330,6 +1335,36 @@ sub check_absolute_file {
}
}

sub pos_last_openparen {
my ($line) = @_;

my $pos = 0;

my $opens = $line =~ tr/\(/\(/;
my $closes = $line =~ tr/\)/\)/;

my $last_openparen = 0;

if (($opens == 0) || ($closes >= $opens)) {
return -1;
}

my $len = length($line);

for ($pos = 0; $pos < $len; $pos++) {
my $string = substr($line, $pos);
if ($string =~ /^($FuncArg|$balanced_parens)/) {
$pos += length($1) - 1;
} elsif (substr($line, $pos, 1) eq '(') {
$last_openparen = $pos;
} elsif (index($string, '(') == -1) {
last;
}
}

return $last_openparen + 1;
}

sub process {
my $filename = shift;

Expand Down Expand Up @@ -1783,6 +1818,37 @@ sub process {
"please, no space before tabs\n" . $herevet);
}

# check for && or || at the start of a line
if ($rawline =~ /^\+\s*(&&|\|\|)/) {
CHK("LOGICAL_CONTINUATIONS",
"Logical continuations should be on the previous line\n" . $hereprev);
}

# check multi-line statement indentation matches previous line
if ($^V && $^V ge 5.10.0 &&
$prevline =~ /^\+(\t*)(if \(|$Ident\().*(\&\&|\|\||,)\s*$/) {
$prevline =~ /^\+(\t*)(.*)$/;
my $oldindent = $1;
my $rest = $2;

my $pos = pos_last_openparen($rest);
if ($pos >= 0) {
$line =~ /^\+([ \t]*)/;
my $newindent = $1;

my $goodtabindent = $oldindent .
"\t" x ($pos / 8) .
" " x ($pos % 8);
my $goodspaceindent = $oldindent . " " x $pos;

if ($newindent ne $goodtabindent &&
$newindent ne $goodspaceindent) {
CHK("PARENTHESIS_ALIGNMENT",
"Alignment should match open parenthesis\n" . $hereprev);
}
}
}

# check for spaces at the beginning of a line.
# Exceptions:
# 1) within comments
Expand Down Expand Up @@ -3142,12 +3208,13 @@ sub process {
}

# Check for misused memsets
if (defined $stat &&
if ($^V && $^V ge 5.10.0 &&
defined $stat &&
$stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {

my $ms_addr = $2;
my $ms_val = $8;
my $ms_size = $14;
my $ms_val = $7;
my $ms_size = $12;

if ($ms_size =~ /^(0x|)0$/i) {
ERROR("MEMSET",
Expand All @@ -3159,17 +3226,18 @@ sub process {
}

# typecasts on min/max could be min_t/max_t
if (defined $stat &&
if ($^V && $^V ge 5.10.0 &&
defined $stat &&
$stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
if (defined $2 || defined $8) {
if (defined $2 || defined $7) {
my $call = $1;
my $cast1 = deparenthesize($2);
my $arg1 = $3;
my $cast2 = deparenthesize($8);
my $arg2 = $9;
my $cast2 = deparenthesize($7);
my $arg2 = $8;
my $cast;

if ($cast1 ne "" && $cast2 ne "") {
if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
$cast = "$cast1 or $cast2";
} elsif ($cast1 ne "") {
$cast = $cast1;
Expand Down Expand Up @@ -3391,6 +3459,12 @@ sub process {
}

if ($quiet == 0) {

if ($^V lt 5.10.0) {
print("NOTE: perl $^V is not modern enough to detect all possible issues.\n");
print("An upgrade to at least perl v5.10.0 is suggested.\n\n");
}

# If there were whitespace errors which cleanpatch can fix
# then suggest that.
if ($rpt_cleaners) {
Expand Down

0 comments on commit c63461a

Please sign in to comment.