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.
225 lines
4.8 KiB
225 lines
4.8 KiB
# Script to check hashtable sizes.
|
|
# Copyright 2002 Nikolas Zimmermann <wildfox@kde.org>
|
|
|
|
my $input = shift;
|
|
my $calcMode = 0;
|
|
|
|
# Check incoming arguments
|
|
if(length($input) > 0) {
|
|
$calcMode = $input;
|
|
} else {
|
|
print "Usage:\n";
|
|
print "perl check_hashtablesize.pl [0/1/2]\n\n";
|
|
print "Show...\n";
|
|
print "0) all hashtables of prototype definitions\n";
|
|
print "1) all hashtables of non-prototype definitions\n";
|
|
print "2) all hashtables of svg*constructor definitions\n";
|
|
exit(-1);
|
|
}
|
|
|
|
# Test if a number is prime or not
|
|
sub calcPrime
|
|
{
|
|
my $start = shift;
|
|
my $dividecount = 0;
|
|
|
|
for(my $i = $start - 1; $i > 0; --$i)
|
|
{
|
|
my $result = $start / $i;
|
|
|
|
if($result == int($result)) {
|
|
$dividecount++;
|
|
}
|
|
}
|
|
|
|
if($dividecount == 1) {
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
# Find the next prime number
|
|
sub findNextPrime
|
|
{
|
|
my $start = shift;
|
|
my $i = $start + 1;
|
|
my $found = 0;
|
|
|
|
while($found == 0)
|
|
{
|
|
if(calcPrime($i)) {
|
|
$found = 1;
|
|
} else {
|
|
$i++;
|
|
}
|
|
}
|
|
|
|
return $i;
|
|
}
|
|
|
|
# Common routine for calculating hashtable sizes
|
|
sub calcSize
|
|
{
|
|
my $calc = shift;
|
|
my $save = shift;
|
|
my $minus = shift;
|
|
|
|
my @temp = split(/\n/, $calc);
|
|
|
|
foreach(@temp) {
|
|
my $process = $_;
|
|
$process =~ s/\s+/ /g;
|
|
|
|
my @line = split(/ /, $process);
|
|
my $class = substr($line[1], 0, index($line[1], ":") - $minus);
|
|
|
|
$$save{$class} = $line[2];
|
|
}
|
|
}
|
|
|
|
# Go to impl dir
|
|
chdir "../impl";
|
|
|
|
# Global counters
|
|
my %counterwork;
|
|
my %counter1;
|
|
my %counter2;
|
|
my %counter3;
|
|
|
|
# Read hashtable size
|
|
my $readSize1 = `find -type f | xargs grep -I DontDelete | grep -v KSVG:: | grep Function`;
|
|
my $readSize2 = `find -type f | xargs grep -I DontDelete | grep -v KSVG:: | grep -v Function`;
|
|
my $readSize3 = `find -type f | xargs grep -I DontDelete | grep KSVG::`;
|
|
|
|
my @result1 = split(/.\//, $readSize1);
|
|
my @result2 = split(/.\//, $readSize2);
|
|
my @result3 = split(/.\//, $readSize3);
|
|
|
|
# Calculate hashtable size
|
|
# calcSize1 = print out all prototype hashtables
|
|
# calcSize2 = print out all non-prototype hashtables
|
|
# calcSize3 = print out all svg*constructors hashtables
|
|
my $calcSize1 = `find -type f | xargs grep -I s_hashTable | grep \@begin | grep -v generateddata | grep -v Constructor | grep -v Impl:: | grep -v Bridge::`;
|
|
my $calcSize2 = `find -type f | xargs grep -I s_hashTable | grep \@begin | grep -v generateddata | grep -v Constructor | grep -v Proto::`;
|
|
my $calcSize3 = `find -type f | xargs grep -I s_hashTable | grep \@begin | grep -v generateddata | grep Constructor`;
|
|
|
|
# Bring in suitable form
|
|
calcSize($calcSize1, \%counter1, 5);
|
|
calcSize($calcSize2, \%counter2, 0);
|
|
calcSize($calcSize3, \%counter3, 11);
|
|
|
|
# Helper
|
|
my $lastclass = "";
|
|
|
|
print "Classname\t\t\t\t'H.S. File'\t\t'H.S. Calculated'\tIs 'H.S. File' prime?\tDo they differ?\n";
|
|
print "-------------------------------------------------------------------------------------------------------------------------------\n";
|
|
|
|
my @useresult;
|
|
if($calcMode == 0) {
|
|
@useresult = @result1;
|
|
} elsif($calcMode == 1) {
|
|
@useresult = @result2;
|
|
} else {
|
|
@useresult = @result3;
|
|
}
|
|
|
|
foreach(@useresult) {
|
|
my $line = $_;
|
|
$line =~ s/\s+/ /g;
|
|
|
|
if($line ne "") {
|
|
my @middle = split(/ /, $line);
|
|
my $class = substr($middle[2], 0, index($middle[2], ":"));
|
|
|
|
# Special case for lists and svg*constructors
|
|
if($class eq "SVGListDefs" || $calcMode == 2)
|
|
{
|
|
my $temp = $middle[0];
|
|
|
|
if($calcMode != 2) {
|
|
$temp =~ s/.cc://;
|
|
$class = $temp;
|
|
} else {
|
|
$temp =~ s/.cc//;
|
|
$class = substr($temp, 0, index($temp, ":"));
|
|
}
|
|
}
|
|
|
|
if($class eq $lastclass) {
|
|
$counterwork{$class}++;
|
|
}
|
|
else {
|
|
$counterwork{$class} = 1;
|
|
|
|
if($lastclass ne "") {
|
|
my $len = length($lastclass);
|
|
|
|
my $string = $lastclass;
|
|
|
|
# Ugly hack with those numbers, anyone
|
|
# got a better idea?
|
|
if($len < 11) {
|
|
$string .= "\t\t\t\t\t";
|
|
} elsif($len < 16) {
|
|
$string .= "\t\t\t\t";
|
|
} elsif($len < 24) {
|
|
$string .= "\t\t\t";
|
|
} elsif($len < 32) {
|
|
$string .= "\t\t";
|
|
} else {
|
|
$string .= "\t";
|
|
}
|
|
|
|
my $combine;
|
|
|
|
if($calcMode == 0) {
|
|
$combine = $counter1{$lastclass};
|
|
} elsif($calcMode == 1) {
|
|
$combine = $counter2{$lastclass};
|
|
} else {
|
|
$combine = $counter3{$lastclass};
|
|
}
|
|
|
|
if($combine eq 0 || $combine eq "") {
|
|
$combine = "-";
|
|
}
|
|
|
|
$string .= $combine;
|
|
$string .= "\t\t\t";
|
|
|
|
# Find next prime
|
|
my $next = findNextPrime($counterwork{$lastclass});
|
|
|
|
$string .= $next;
|
|
$string .= "\t\t\t";
|
|
|
|
# Is 'H.S. File' a prime?
|
|
my $calc = calcPrime($combine);
|
|
if($calc == 0) {
|
|
$string .= "NO!";
|
|
} else {
|
|
$string .= "Yes";
|
|
}
|
|
|
|
$string .= "\t\t\t";
|
|
|
|
if($combine != $next) {
|
|
$string .= "YES!";
|
|
} else {
|
|
$string .= "No";
|
|
}
|
|
|
|
$string .= "\n";
|
|
|
|
print $string;
|
|
}
|
|
}
|
|
|
|
$lastclass = $class;
|
|
}
|
|
}
|
|
|
|
# Go back! :)
|
|
chdir "../scripts";
|