Home | History | Annotate | Download | only in galaxy
      1 #! /usr/bin/perl -w
      2 
      3 # Takes a set of ps images (belonging to one file) and produces a
      4 # conglomerate picture of that file: static functions in the middle,
      5 # others around it.  Each one gets a box about its area.
      6 
      7 use strict;
      8 
      9 my $SCRUNCH = $ARGV [0];
     10 my $BOXSCRUNCH = $ARGV [1];
     11 my $Tmp;
     12 my $DEBUG = 1;
     13 
     14 shift @ARGV; # skip SCRUNCH and BOXSCRUNCH
     15 shift @ARGV;
     16 
     17 
     18 DecorateFuncs (@ARGV);
     19 
     20 
     21 #TMPFILE=`mktemp ${TMPDIR:-/tmp}/$$.XXXXXX`
     22 
     23 # Arrange.
     24 my $ArgList = "";
     25 
     26 foreach $Tmp (@ARGV) {
     27 	$ArgList .= "'$Tmp' ";
     28 }
     29 
     30 my @Arranged = `../draw_arrangement $SCRUNCH 0 360 0 $ArgList`;
     31 
     32 my $CFile = $ARGV [0];
     33 $CFile =~ s/\.c\..*$/.c/;
     34 if ($DEBUG) { print ("% Conglomeration of $CFile\n"); }
     35 
     36 print "gsave angle rotate\n";
     37 
     38 # Now output the file, except last line.
     39 my $LastLine = pop (@Arranged);
     40 my $Fill = Box_2 ($LastLine,$CFile);
     41 print $Fill;
     42 # Draw box with file name
     43 my @Output = Box ('normal', 'Helvetica-Bold', 32, $CFile, $LastLine);
     44 splice(@Output, $#Output, 0, "grestore\n");
     45 #print @Output;
     46 
     47 print (@Arranged);
     48 #add a duplicate box to test if this works
     49 print @Output;
     50 
     51 
     52 sub ParseBound
     53 {
     54 	my $BBoxLine = shift;
     55 
     56 	$BBoxLine =~ /(-?[\d.]+)\s+(-?[\d.]+)\s+(-?[\d.]+)\s+(-?[\d.]+)/;
     57 
     58 	# XMin, YMin, XMax, YMax
     59 	return ($1 * $BOXSCRUNCH, $2 * $BOXSCRUNCH,
     60 		$3 * $BOXSCRUNCH, $4 * $BOXSCRUNCH);
     61 }
     62 
     63 
     64 
     65 # Box (type, font, fontsize, Label, BBoxLine)
     66 sub Box
     67 {
     68 	my $Type     = shift;
     69 	my $Font     = shift;
     70 	my $Fontsize = shift;
     71 	my $Label    = shift;
     72 	my $BBoxLine = shift;
     73         my @Output   = ();
     74 
     75 	#        print (STDERR "Box ('$Type', '$Font', '$Fontsize', '$Label', '$BBoxLine')\n");
     76 	push (@Output, "% start of box\n");
     77 
     78 	push (@Output, "D5\n") if ($Type eq "dashed");
     79 
     80 	#	print (STDERR "BBoxLine: '$BBoxLine'\n");
     81 	#	print (STDERR "Parsed: '" . join ("' '", ParseBound ($BBoxLine)) . "\n");
     82 	my ($XMin, $YMin, $XMax, $YMax) = ParseBound ($BBoxLine);
     83 
     84 	my $LeftSpaced   = $XMin + 6;
     85 	my $BottomSpaced = $YMin + 6;
     86 
     87 	# Put black box around it
     88 	push (@Output, (
     89                         "($Label) $LeftSpaced $BottomSpaced $Fontsize /$Font\n",
     90                         "$YMin $XMin $YMax $XMax U\n"
     91 		       )
     92 	     );
     93 
     94 	push (@Output, "D\n") if ($Type eq "dashed");
     95 	# fill bounding box
     96 	push (@Output, "% end of box\n");
     97 
     98 	# Output bounding box
     99 	push (@Output, "% bound $XMin $YMin $XMax $YMax\n");
    100 
    101         return @Output;
    102 }
    103 
    104 sub Box_2
    105 {
    106 	my $BBoxLine = shift;
    107 	my $CFile = shift;
    108 	my $CovFile = "./coverage.dat";
    109 	my ($XMin, $YMin, $XMax, $YMax) = ParseBound ($BBoxLine);
    110 	my @output = `fgrep $CFile $CovFile`;
    111 	chomp $output[0];
    112 	my ($junk, $Class, $per) = split /\t/, $output[0];
    113 	return "$XMin $YMin $XMax $YMax $Class\n";
    114 }
    115 # Decorate (rgb-vals(1 string) filename)
    116 sub Decorate
    117 {
    118 	my $RGB      = shift;
    119         my $Filename = shift;
    120 
    121         my @Input    = ReadPS ($Filename);
    122         my $LastLine = pop (@Input);
    123 	my @Output   = ();
    124 
    125 	# Color at the beginning.
    126 	push (@Output, "C$RGB\n");
    127 
    128 	# Now output the file, except last line.
    129         push (@Output, @Input);
    130 
    131 	# Draw dashed box with function name
    132 	# FIXME Make bound cover the label as well!
    133 	my $FuncName = $Filename;
    134 	$FuncName =~ s/^[^.]+\.c\.(.+?)\..*$/$1/;
    135 
    136 	push (@Output, Box ('dashed', 'Helvetica', 24, $FuncName, $LastLine));
    137 
    138 	# Slap over the top.
    139         WritePS ($Filename, @Output);
    140 }
    141 
    142 
    143 
    144 # Add colored boxes around functions
    145 sub DecorateFuncs
    146 {
    147 	my $FName = "";
    148         my $FType = "";
    149 
    150 	foreach $FName (@ARGV)
    151 	{
    152 		$FName =~ /\+([A-Z]+)\+/;
    153 		$FType = $1;
    154 
    155 		if ($FType eq 'STATIC') {
    156 			Decorate ("2", $FName); # Light green.
    157  		}
    158  		elsif ($FType eq 'INDIRECT') {
    159 			Decorate ("3", $FName); # Green.
    160  		}
    161  		elsif ($FType eq 'EXPORTED') {
    162 			Decorate ("4", $FName); # Red.
    163  		}
    164  		elsif ($FType eq 'NORMAL') {
    165 			Decorate ("5", $FName); # Blue.
    166 		}
    167 		else {
    168 			die ("Unknown extension $FName");
    169 		}
    170 	}
    171 }
    172 
    173 
    174 sub ReadPS
    175 {
    176 	my $Filename = shift;
    177         my @Contents = ();
    178 
    179 	open (INFILE, "$Filename") or die ("Could not read $Filename: $!");
    180 	@Contents = <INFILE>;
    181 	close (INFILE);
    182 
    183 	return @Contents;
    184 }
    185 
    186 sub WritePS
    187 {
    188 	my $Filename = shift;
    189 
    190 	open (OUTFILE, ">$Filename")
    191 		or die ("Could not write $Filename: $!");
    192 	print (OUTFILE @_);
    193         close (OUTFILE);
    194 }
    195 
    196