diff options
Diffstat (limited to 'ksvg/scripts/check_hashtablesize.pl')
-rwxr-xr-x | ksvg/scripts/check_hashtablesize.pl | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/ksvg/scripts/check_hashtablesize.pl b/ksvg/scripts/check_hashtablesize.pl new file mode 100755 index 00000000..d22e3f30 --- /dev/null +++ b/ksvg/scripts/check_hashtablesize.pl @@ -0,0 +1,224 @@ +# Script to check hashtable sizes. +# Copyright 2002 Nikolas Zimmermann <[email protected]> + +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"; |