#!/usr/bin/perl
#massage calltree output for dot to generate neat graphs

use Getopt::Std;
getopts("s:c:l"); 

%edges = (); 
%hide = (); 

sub edge ($$) { 
	my ($base, $sym) = (@_); 

	if (!defined($edges{"$base,$sym"})) { 
		$edges{"$base,$sym"} = 1;
	}
}	

sub dumpedges () { 
	foreach (keys %edges) { 
		my ($a,$b) = /([^,]+),(.*)/; 
		next if defined($hide{$a}) || defined($hide{$b}); 
		print "$a -- $b;\n"; 
	} 
} 

while (<>) { 
	if (/:/) { 
		$indent = 0;
		my ($b) = /([^:]+):/;
		@base = ($b);
		@cur = ($b); 
	} else { 
		my ($space,$sym) = /(\s*)(.*):?/;
		$i = length($space);
		if ($i > $indent) { 
			$base[$i] = $cur[$indent]; 
		}

		if ($sym =~ /EXTERNAL ROUTINE/) { 
			$hide{$cur[$indent]} = 1; 
		} else { 
			edge($base[$i], $sym); 
		}

		$indent = $i; 
		$cur[$i] = $sym; 
	} 
} 

print "graph program {\n";
if (defined($opt_s)) { 
	print "size=\"$opt_s\";\n";
}
if (defined($opt_l)) { 
	print "orientation=landscape;"; 
} 
if (defined($opt_c)) {
	print "$opt_c;\n";
}
print "edge [dir=forward len=3]\n"; 

dumpedges; 

print "}\n"; 



	
