Index: third_party/lcov/contrib/galaxy/conglomerate_functions.pl |
=================================================================== |
--- third_party/lcov/contrib/galaxy/conglomerate_functions.pl (revision 0) |
+++ third_party/lcov/contrib/galaxy/conglomerate_functions.pl (revision 0) |
@@ -0,0 +1,195 @@ |
+#! /usr/bin/perl -w |
+ |
+# Takes a set of ps images (belonging to one file) and produces a |
+# conglomerate picture of that file: static functions in the middle, |
+# others around it. Each one gets a box about its area. |
+ |
+use strict; |
+ |
+my $SCRUNCH = $ARGV [0]; |
+my $BOXSCRUNCH = $ARGV [1]; |
+my $Tmp; |
+my $DEBUG = 1; |
+ |
+shift @ARGV; # skip SCRUNCH and BOXSCRUNCH |
+shift @ARGV; |
+ |
+ |
+DecorateFuncs (@ARGV); |
+ |
+ |
+#TMPFILE=`mktemp ${TMPDIR:-/tmp}/$$.XXXXXX` |
+ |
+# Arrange. |
+my $ArgList = ""; |
+ |
+foreach $Tmp (@ARGV) { |
+ $ArgList .= "'$Tmp' "; |
+} |
+ |
+my @Arranged = `../draw_arrangement $SCRUNCH 0 360 0 $ArgList`; |
+ |
+my $CFile = $ARGV [0]; |
+$CFile =~ s/\.c\..*$/.c/; |
+if ($DEBUG) { print ("% Conglomeration of $CFile\n"); } |
+ |
+print "gsave angle rotate\n"; |
+ |
+# Now output the file, except last line. |
+my $LastLine = pop (@Arranged); |
+my $Fill = Box_2 ($LastLine,$CFile); |
+print $Fill; |
+# Draw box with file name |
+my @Output = Box ('normal', 'Helvetica-Bold', 32, $CFile, $LastLine); |
+splice(@Output, $#Output, 0, "grestore\n"); |
+#print @Output; |
+ |
+print (@Arranged); |
+#add a duplicate box to test if this works |
+print @Output; |
+ |
+ |
+sub ParseBound |
+{ |
+ my $BBoxLine = shift; |
+ |
+ $BBoxLine =~ /(-?[\d.]+)\s+(-?[\d.]+)\s+(-?[\d.]+)\s+(-?[\d.]+)/; |
+ |
+ # XMin, YMin, XMax, YMax |
+ return ($1 * $BOXSCRUNCH, $2 * $BOXSCRUNCH, |
+ $3 * $BOXSCRUNCH, $4 * $BOXSCRUNCH); |
+} |
+ |
+ |
+ |
+# Box (type, font, fontsize, Label, BBoxLine) |
+sub Box |
+{ |
+ my $Type = shift; |
+ my $Font = shift; |
+ my $Fontsize = shift; |
+ my $Label = shift; |
+ my $BBoxLine = shift; |
+ my @Output = (); |
+ |
+ # print (STDERR "Box ('$Type', '$Font', '$Fontsize', '$Label', '$BBoxLine')\n"); |
+ push (@Output, "% start of box\n"); |
+ |
+ push (@Output, "D5\n") if ($Type eq "dashed"); |
+ |
+ # print (STDERR "BBoxLine: '$BBoxLine'\n"); |
+ # print (STDERR "Parsed: '" . join ("' '", ParseBound ($BBoxLine)) . "\n"); |
+ my ($XMin, $YMin, $XMax, $YMax) = ParseBound ($BBoxLine); |
+ |
+ my $LeftSpaced = $XMin + 6; |
+ my $BottomSpaced = $YMin + 6; |
+ |
+ # Put black box around it |
+ push (@Output, ( |
+ "($Label) $LeftSpaced $BottomSpaced $Fontsize /$Font\n", |
+ "$YMin $XMin $YMax $XMax U\n" |
+ ) |
+ ); |
+ |
+ push (@Output, "D\n") if ($Type eq "dashed"); |
+ # fill bounding box |
+ push (@Output, "% end of box\n"); |
+ |
+ # Output bounding box |
+ push (@Output, "% bound $XMin $YMin $XMax $YMax\n"); |
+ |
+ return @Output; |
+} |
+ |
+sub Box_2 |
+{ |
+ my $BBoxLine = shift; |
+ my $CFile = shift; |
+ my $CovFile = "./coverage.dat"; |
+ my ($XMin, $YMin, $XMax, $YMax) = ParseBound ($BBoxLine); |
+ my @output = `fgrep $CFile $CovFile`; |
+ chomp $output[0]; |
+ my ($junk, $Class, $per) = split /\t/, $output[0]; |
+ return "$XMin $YMin $XMax $YMax $Class\n"; |
+} |
+# Decorate (rgb-vals(1 string) filename) |
+sub Decorate |
+{ |
+ my $RGB = shift; |
+ my $Filename = shift; |
+ |
+ my @Input = ReadPS ($Filename); |
+ my $LastLine = pop (@Input); |
+ my @Output = (); |
+ |
+ # Color at the beginning. |
+ push (@Output, "C$RGB\n"); |
+ |
+ # Now output the file, except last line. |
+ push (@Output, @Input); |
+ |
+ # Draw dashed box with function name |
+ # FIXME Make bound cover the label as well! |
+ my $FuncName = $Filename; |
+ $FuncName =~ s/^[^.]+\.c\.(.+?)\..*$/$1/; |
+ |
+ push (@Output, Box ('dashed', 'Helvetica', 24, $FuncName, $LastLine)); |
+ |
+ # Slap over the top. |
+ WritePS ($Filename, @Output); |
+} |
+ |
+ |
+ |
+# Add colored boxes around functions |
+sub DecorateFuncs |
+{ |
+ my $FName = ""; |
+ my $FType = ""; |
+ |
+ foreach $FName (@ARGV) |
+ { |
+ $FName =~ /\+([A-Z]+)\+/; |
+ $FType = $1; |
+ |
+ if ($FType eq 'STATIC') { |
+ Decorate ("2", $FName); # Light green. |
+ } |
+ elsif ($FType eq 'INDIRECT') { |
+ Decorate ("3", $FName); # Green. |
+ } |
+ elsif ($FType eq 'EXPORTED') { |
+ Decorate ("4", $FName); # Red. |
+ } |
+ elsif ($FType eq 'NORMAL') { |
+ Decorate ("5", $FName); # Blue. |
+ } |
+ else { |
+ die ("Unknown extension $FName"); |
+ } |
+ } |
+} |
+ |
+ |
+sub ReadPS |
+{ |
+ my $Filename = shift; |
+ my @Contents = (); |
+ |
+ open (INFILE, "$Filename") or die ("Could not read $Filename: $!"); |
+ @Contents = <INFILE>; |
+ close (INFILE); |
+ |
+ return @Contents; |
+} |
+ |
+sub WritePS |
+{ |
+ my $Filename = shift; |
+ |
+ open (OUTFILE, ">$Filename") |
+ or die ("Could not write $Filename: $!"); |
+ print (OUTFILE @_); |
+ close (OUTFILE); |
+} |
+ |
Property changes on: third_party/lcov/contrib/galaxy/conglomerate_functions.pl |
___________________________________________________________________ |
Name: svn:executable |
+ * |