From 7ddcc8fea4d292f453b33ea2561f26c70ef156ce Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Fri, 22 Apr 2011 22:58:17 +0200 Subject: 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. --- lib/checksrc.pl | 195 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 120 insertions(+), 75 deletions(-) (limited to 'lib/checksrc.pl') 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, , 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 \n"; + print "checksrc.pl [option] [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() { - 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() { + 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 } -- cgit v1.2.1