]> granicus.if.org Git - curl/commitdiff
checksrc: scan many files, more checks
authorDaniel Stenberg <daniel@haxx.se>
Fri, 22 Apr 2011 20:58:17 +0000 (22:58 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 27 Apr 2011 07:09:35 +0000 (09:09 +0200)
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.

lib/checksrc.pl

index c2b8d6583c620037daf464f6ce0fb0c7aa76cc1f..aa06e84c5dd0517be36fdae572b633a2344e8009 100755 (executable)
@@ -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
 }