wingraph to graphviz converter

Benjamin Larsson <[email protected]> Tue, 15 Nov 2005 16:43:37 +0100
Newsgroups gmane.comp.video.xine.codec.devel
Message-ID <[email protected]>
With the demoversion of idapro you can create graphs in various forms.
The output from the program
handling the graph generation could be better, the graphs are abit
cubic. The graphviz package
on other hand can do quite nice graphs so I wrote a converter. I also
made a filter function capable
of filtering out regular functions (printf etc) that would otherwise
pollute the graph. Syntax to use it:

perl gdl2dot.pl -f test.gdl with filter activated or
perl gdl2dot.pl -p test.gdl without

the output will be a test.gdl.dot file and a test.gdl.ps postscriptfile.

MvH
Benjamin Larsson
gdl2dot.pl (text/plain, 2.6 KB)
#!/usr/bin/perl

#Argument parser

if (@ARGV){
  print "@ARGV\n";
  if ($ARGV[0] eq "-f"){
    $FILE1 = $ARGV[1];
    $filter = 1;
  }
  if ($ARGV[0] eq "-p"){
    $FILE1 = $ARGV[1];
    $filter = 0;
  }
}
else{
  print "Usage:\n";
  print "./gdl2dot.pl [command] binary\n";
  print "-f input datafile use filter\n";
  print "-p input datafile don't use filter\n";
  exit;
}

# File IO

open(OUTFILE, ">".$FILE1.".dot") or die "File doesn't exist\n";
@indata = `cat $FILE1`;
$nods = 0;
$links= 0;
foreach $rad (@indata)
{
    if ($rad =~ m/node:/) {
        #print STDOUT "$rad";
        @tmpsplit=split / /,$rad;
        #print "$tmpsplit[5]\n";
        $nodnames[$nods]=$tmpsplit[5];
        $nods++;
    }
    if ($rad =~ m/edge:/) {
        @tmpsplit=split / /,$rad;

        $tmpsplit[3] =~ s/"//g;
        #print "$tmpsplit[3]\n";
        $linkfrom[$links] = $tmpsplit[3];
        $tmpsplit[5] =~ s/"//g;
        $linkto[$links] =$tmpsplit[5];
        $links++;
    }
}

print OUTFILE "digraph prof {\n";
for ($i=0 ; $i < $links ; $i++){
    if ($filter==1) {
        if (namecheck($nodnames[$linkto[$i]])) {
            print OUTFILE "\t$nodnames[$linkfrom[$i]] -> $nodnames[$linkto[$i]]\n";
        }
    } else {
        print OUTFILE "\t$nodnames[$linkfrom[$i]] -> $nodnames[$linkto[$i]]\n";
    }
}
print OUTFILE "}\n";
close OUTFILE;
print "$nods nods found and $links links.\n";
print "Generateing postscriptfile...\n";
$doit = `dot -Tps $FILE1.dot \> $FILE1.ps`;
print "Done!\n";

sub namecheck
{
    my $k;
    $result=1;
    #This might match on names that are not intended
    if ($_[0] =~ m/fprintf/) {$result = 0;}
    if ($_[0] =~ m/printf/) {$result = 0;}
    if ($_[0] =~ m/malloc/) {$result = 0;}
    if ($_[0] =~ m/calloc/) {$result = 0;}
    if ($_[0] =~ m/free/) {$result = 0;}
    if ($_[0] =~ m/memset/) {$result = 0;}
    if ($_[0] =~ m/memcpy/) {$result = 0;}
    if ($_[0] =~ m/memmove/) {$result = 0;}
    if ($_[0] =~ m/ceil/) {$result = 0;}
    if ($_[0] =~ m/floor/) {$result = 0;}
    if ($_[0] =~ m/sin/) {$result = 0;}
    if ($_[0] =~ m/cos/) {$result = 0;}
    if ($_[0] =~ m/pow/) {$result = 0;}
    if ($_[0] =~ m/exp/) {$result = 0;}
    if ($_[0] =~ m/log/) {$result = 0;}
    if ($_[0] =~ m/sqrt/) {$result = 0;}
    if ($_[0] =~ m/atan/) {$result = 0;}
    if ($_[0] =~ m/asin/) {$result = 0;}
    if ($_[0] =~ m/fopen/) {$result = 0;}
    if ($_[0] =~ m/fseek/) {$result = 0;}
    if ($_[0] =~ m/fread/) {$result = 0;}
    if ($_[0] =~ m/fclose/) {$result = 0;}
    if ($_[0] =~ m/fflush/) {$result = 0;}
    if ($_[0] =~ m/fwrite/) {$result = 0;}
    if ($_[0] =~ m/ferror/) {$result = 0;}
    if ($_[0] =~ m/__assert_fail/) {$result = 0;}
    $result;
}