aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2011-04-22 22:58:17 +0200
committerDaniel Stenberg <daniel@haxx.se>2011-04-27 09:09:35 +0200
commit7ddcc8fea4d292f453b33ea2561f26c70ef156ce (patch)
tree2606cf7d0cd7f87c3c25a0ab7723000f6564fea8
parent068d656c6db63a27967d3d2b13a0a801662ff174 (diff)
checksrc: scan many files, more checks
It now scans multiple files and outputs an error+warning count summary at the end in case at least one was detected. -D can be used to specify in which dir the files are located The script now scans for conditions that starts with a space for if/while/for lines.
-rwxr-xr-xlib/checksrc.pl195
1 files changed, 120 insertions, 75 deletions
diff --git a/lib/checksrc.pl b/lib/checksrc.pl
index c2b8d6583..aa06e84c5 100755
--- a/lib/checksrc.pl
+++ b/lib/checksrc.pl
@@ -1,12 +1,33 @@
#!/usr/bin/perl
-
-my $file=$ARGV[0];
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
my $max_column = 79;
my $indent = 2;
my $warnings;
my $errors;
+my $file;
+my $dir=".";
sub checkwarn {
my ($num, $col, $file, $line, $msg, $error) = @_;
@@ -30,103 +51,127 @@ sub checkwarn {
}
}
+$file = shift @ARGV;
+
+if($file =~ /-D(.*)/) {
+ $dir = $1;
+ $file = shift @ARGV;
+}
+
if(!$file) {
- print "checksrc.pl <single C or H file>\n";
+ print "checksrc.pl [option] <file1> [file2] ...\n";
+ print " Options:\n";
+ print " -D[DIR] Directory to prepend file names\n";
exit;
}
+do {
+ scanfile("$dir/$file");
-my $line = 1;
-open(R, "<$file") || die;
+ $file = shift @ARGV;
-my $copyright=0;
+} while($file);
-while(<R>) {
- chomp;
- my $l = $_;
- my $column = 0;
- # check for a copyright statement
- if(!$copyright && ($l =~ /copyright .* \d\d\d\d/i)) {
- $copyright=1;
- }
+sub scanfile {
+ my ($file) = @_;
- # detect long lines
- if(length($l) > $max_column) {
- checkwarn($line, length($l), $file, $l, "Longer than $max_column columns");
- }
- # detect TAB characters
- if($l =~ /^(.*)\t/) {
- checkwarn($line, length($1), $file, $l, "Contains TAB character", 1);
- }
- # detect trailing white space
- if($l =~ /^(\S+)[ \t]+\z/) {
- checkwarn($line, length($1), $file, $l, "Trailing whitespace");
- }
+ my $line = 1;
+ my $prevl;
+ my $l;
+ open(R, "<$file") || die "failed to open $file";
+
+ my $copyright=0;
- # detect return statements with parenthesis
- # doesn't really work unless we filter off typecasts
- #if($l =~ /(.*)return \(/) {
- # checkwarn($line, length($1)+6, $file, $l, "return with paretheses");
- #}
+ while(<R>) {
+ chomp;
+ my $l = $_;
+ my $column = 0;
- # check spaces after for/if/while
- if($l =~ /^(.*)(for|if|while) \(/) {
- if($1 =~ / *\#/) {
- # this is a #if, treat it differently
+ # check for a copyright statement
+ if(!$copyright && ($l =~ /copyright .* \d\d\d\d/i)) {
+ $copyright=1;
}
- else {
- checkwarn($line, length($1)+length($2), $file, $l,
- "$2 with space");
+
+ # detect long lines
+ if(length($l) > $max_column) {
+ checkwarn($line, length($l), $file, $l, "Longer than $max_column columns");
+ }
+ # detect TAB characters
+ if($l =~ /^(.*)\t/) {
+ checkwarn($line, length($1), $file, $l, "Contains TAB character", 1);
+ }
+ # detect trailing white space
+ if($l =~ /^(\S+)[ \t]+\z/) {
+ checkwarn($line, length($1), $file, $l, "Trailing whitespace");
+ }
+
+ # check spaces after for/if/while
+ if($l =~ /^(.*)(for|if|while) \(/) {
+ if($1 =~ / *\#/) {
+ # this is a #if, treat it differently
+ }
+ else {
+ checkwarn($line, length($1)+length($2), $file, $l,
+ "$2 with space");
+ }
+ }
+
+ # check spaces after open paren after for/if/while
+ if($l =~ /^(.*)(for|if|while)\( /) {
+ if($1 =~ / *\#/) {
+ # this is a #if, treat it differently
+ }
+ else {
+ checkwarn($line, length($1)+length($2)+1, $file, $l,
+ "$2 with space first in condition");
+ }
}
- }
- # check for "} else"
- if($l =~ /^(.*)\} else/) {
- checkwarn($line, length($1), $file, $l, "else after closing brace on same line");
- }
- # check for open brace first on line but not first column
- # only alert if previous line ended with a close paren and wasn't a cpp
- # line
- if((($prevl =~ /\)\z/) && ($prevl !~ /^ *#/)) && ($l =~ /^( +)\{/)) {
- checkwarn($line, length($1), $file, $l, "badly placed open brace");
- }
- # if the previous line starts with if/while/for AND ends with an open
- # brace, check that this line is indented $indent more steps, if not
- # a cpp line
- if($prevl =~ /^( *)(if|while|for)\(.*\{\z/) {
- my $first = length($1);
-
- # this line has some character besides spaces
- if(($l !~ /^ *#/) && ($l =~ /^( *)[^ ]/)) {
- my $second = length($1);
- my $expect = $first+$indent;
- if($expect != $second) {
- my $diff = $second - $first;
- checkwarn($line, length($1), $file, $l,
- "not indented $indent steps, uses $diff)");
+ # check for "} else"
+ if($l =~ /^(.*)\} else/) {
+ checkwarn($line, length($1), $file, $l, "else after closing brace on same line");
+ }
+ # check for open brace first on line but not first column
+ # only alert if previous line ended with a close paren and wasn't a cpp
+ # line
+ if((($prevl =~ /\)\z/) && ($prevl !~ /^ *#/)) && ($l =~ /^( +)\{/)) {
+ checkwarn($line, length($1), $file, $l, "badly placed open brace");
+ }
+ # if the previous line starts with if/while/for AND ends with an open
+ # brace, check that this line is indented $indent more steps, if not
+ # a cpp line
+ if($prevl =~ /^( *)(if|while|for)\(.*\{\z/) {
+ my $first = length($1);
+
+ # this line has some character besides spaces
+ if(($l !~ /^ *#/) && ($l =~ /^( *)[^ ]/)) {
+ my $second = length($1);
+ my $expect = $first+$indent;
+ if($expect != $second) {
+ my $diff = $second - $first;
+ checkwarn($line, length($1), $file, $l,
+ "not indented $indent steps, uses $diff)");
+
+ }
}
}
+
+ $line++;
+ $prevl = $l;
}
- # check for // letters, but skip them if a double quote or asterisk was
- # on the same line to avoid strings and comments. Not reliable.
- #if($l =~ /^([^\"*]*)\/\//) {
- # checkwarn($line, length($1), $file, $l, "non-C89 compliant comment",
- # 1);
- #}
+ if(!$copyright) {
+ checkwarn(1, 0, $file, "", "Missing copyright statement", 1);
+ }
- $line++;
- $prevl = $l;
-}
+ close(R);
-if(!$copyright) {
- checkwarn(1, 0, $file, "", "Missing copyright statement", 1);
}
-close(R);
if($errors || $warnings) {
+ printf "checksrc: %d errors and %d warnings\n", $errors, $warnings;
exit 5; # return failure
}