You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
3.9 KiB
224 lines
3.9 KiB
#!/usr/bin/perl -w
|
|
|
|
# Simple Source metrics for C++
|
|
# Taj Sun Apr 26 03:31:00 EST 1998
|
|
# $Id$
|
|
|
|
use strict;
|
|
|
|
our $bigblank = 0;
|
|
our $bigcommt = 0;
|
|
our $bigstrcount = 0;
|
|
our $bigstrsize = 0;
|
|
our $bigtotal = 0;
|
|
our $numfiles = 0;
|
|
|
|
our $blocklen = 0;
|
|
our $numblocks = 0;
|
|
our $blockdepth = 0;
|
|
our $blockstart = 0;
|
|
our $blockmin = -1;
|
|
our $blockmax = 0;
|
|
our @blenlist = ();
|
|
our @extensions = ( ".cpp", ".cc", ".C", ".c", ".h", ".tcc" );
|
|
|
|
sub processFile
|
|
{
|
|
our ( $file ) = @_;
|
|
our $blank = 0;
|
|
our $comment = 0;
|
|
our $total = 0;
|
|
our $incomment = 0;
|
|
our $strcount = 0;
|
|
our $strsize = 0;
|
|
|
|
open( SOURCE, "$file" ) ||
|
|
die "cxxmetric.pl: Couldn't read from $file.\n";
|
|
|
|
while( <SOURCE> ) {
|
|
$total++;
|
|
|
|
if ( /^\s*$/ ) {
|
|
$blank++;
|
|
next;
|
|
}
|
|
|
|
if ( m#^\s*//# ) {
|
|
$comment++;
|
|
next;
|
|
}
|
|
|
|
if ( /{/ ) {
|
|
# block start
|
|
$blockdepth += s/{/{/g;
|
|
|
|
$blockstart = $. if $blockdepth == 1;
|
|
}
|
|
|
|
if ( /}/ ) {
|
|
# block end
|
|
|
|
$blockdepth -= s/}/}/g;
|
|
|
|
if( $blockdepth == 0 ) {
|
|
my $thisblocklen = $. - $blockstart;
|
|
push @blenlist, $thisblocklen;
|
|
|
|
$blocklen += $thisblocklen;
|
|
$numblocks++;
|
|
|
|
if( $blockmax < $thisblocklen ) {
|
|
$blockmax = $thisblocklen;
|
|
}
|
|
|
|
if ( $blockmin == -1
|
|
|| $blockmin > $thisblocklen ) {
|
|
$blockmin = $thisblocklen;
|
|
}
|
|
}
|
|
}
|
|
|
|
my $start = 0;
|
|
my $stop = 0;
|
|
|
|
if ( m#/\*# ) {
|
|
$start = 1;
|
|
}
|
|
|
|
if( m#\*/# ) {
|
|
$stop = 1;
|
|
}
|
|
|
|
if( $start ) {
|
|
$incomment = 1 unless $stop;
|
|
$comment++;
|
|
}
|
|
elsif ( $stop ) {
|
|
$comment++;
|
|
$incomment = 0;
|
|
}
|
|
elsif ( $incomment ) {
|
|
$comment++;
|
|
}
|
|
else {
|
|
my $line = $_;
|
|
countStrings( $line );
|
|
}
|
|
}
|
|
|
|
our $code = $total - ($comment + $blank );
|
|
$bigtotal += $total;
|
|
$bigcommt += $comment;
|
|
$bigblank += $blank;
|
|
$bigstrcount += $strcount;
|
|
$bigstrsize += $strsize;
|
|
|
|
our $stravglen = $strcount ? ($strsize / $strcount) : 0;
|
|
|
|
write;
|
|
}
|
|
|
|
sub buildFileList {
|
|
my ( $dir ) = @_;
|
|
my @fileList = glob( "$dir/*" );
|
|
my @cxxList;
|
|
|
|
foreach my $file (@fileList) {
|
|
|
|
if( -d $file ) {
|
|
push @cxxList, buildFileList( $file );
|
|
}
|
|
else {
|
|
foreach my $extension (@extensions) {
|
|
if( substr( $file, length( $file ) - length( $extension ) ) eq $extension ) {
|
|
push @cxxList, $file;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return @cxxList;
|
|
}
|
|
|
|
sub countStrings
|
|
{
|
|
my $line = shift;
|
|
|
|
foreach my $string ( split( /("[^"]*)\"/, $line ) ) {
|
|
next unless $string =~ /^\"/;
|
|
|
|
our $strcount++;
|
|
our $strsize += length( $string ) - 1;
|
|
}
|
|
}
|
|
|
|
sub pct
|
|
{
|
|
my( $top, $bottom ) = @_;
|
|
|
|
return 0 if $bottom == 0;
|
|
|
|
return int(( $top * 100 ) / $bottom);
|
|
}
|
|
|
|
our @files;
|
|
|
|
if( @ARGV == 0 ) {
|
|
@files = buildFileList(".");
|
|
}
|
|
else {
|
|
@files = @ARGV;
|
|
}
|
|
|
|
foreach my $file ( @files ) {
|
|
processFile( $file );
|
|
++$numfiles;
|
|
}
|
|
|
|
our $total = $bigtotal;
|
|
our $comment = $bigcommt;
|
|
our $blank = $bigblank;
|
|
our $code = $bigtotal - ($bigcommt + $bigblank );
|
|
our $file = "Total";
|
|
|
|
print "\n";
|
|
write;
|
|
|
|
print "\nPercentage Code:\t" , pct( $code, $total ),"%\n";
|
|
print "Percentage Comment:\t" , pct( $comment, $total ),"%\n";
|
|
print "Percentage Blank:\t" , pct( $blank, $total ),"%\n";
|
|
print "Percentage Cmt/Code:\t" , pct( $comment, $code ),"%\n";
|
|
print "Average Code/File:\t" , int($code/$numfiles)," lines\n"
|
|
unless $numfiles == 0;
|
|
|
|
if ( $numblocks > 0 ) {
|
|
my $avg = int( $blocklen / $numblocks );
|
|
@blenlist = sort @blenlist;
|
|
my $median = $blenlist[ int( $numblocks / 2 )];
|
|
print<<EOF;
|
|
|
|
Blocks:\t$numblocks
|
|
\tLengths (lines):\tmin: $blockmin\tmax: $blockmax\tmed: $median\taverage: $avg
|
|
EOF
|
|
}
|
|
|
|
our $bigstravglen = $bigstrcount ? int($bigstrsize / $bigstrcount) : 0;
|
|
|
|
print<<EOF;
|
|
Strings:\t$bigstrcount
|
|
\tSize (bytes):\ttotal: $bigstrsize\taverage: $bigstravglen
|
|
EOF
|
|
|
|
exit;
|
|
|
|
format STDOUT_TOP =
|
|
Lines Code Comment Blank Strs AvgLen File
|
|
------ ------- -------- ------ ------ ------ ------
|
|
|
|
.
|
|
|
|
format STDOUT =
|
|
@###### @###### @###### @###### @###### @###### @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
$total, $code, $comment, $blank, our $strcount, our $stravglen, $file
|
|
.
|