diff options
Diffstat (limited to 'gfsm/gfsm/src/libgfsm/inc2dot.perl')
-rwxr-xr-x | gfsm/gfsm/src/libgfsm/inc2dot.perl | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/gfsm/gfsm/src/libgfsm/inc2dot.perl b/gfsm/gfsm/src/libgfsm/inc2dot.perl new file mode 100755 index 0000000..f406262 --- /dev/null +++ b/gfsm/gfsm/src/libgfsm/inc2dot.perl @@ -0,0 +1,48 @@ +#!/usr/bin/perl -w + +%inc = qw(); +%nod = qw(); +foreach $file (@ARGV) { + open(F,"<$file") or die("$0: open failed for '$file': $!"); + @incs = qw(); + while (<F>) { + chomp; + if ($_ =~ m/^\s*\#\s*include\s*[\<\"\']\s*(\S+)[\>\"\']/) { push(@incs,$1); } + } + close(F); + $inc{$file} = [@incs]; + @nod{$file,@incs} = undef; +} + +##-- subs +sub safestr { + my $str = shift; + $str =~ s/[\.\,\+\-\=]/_/g; + return $str; +} + +##-- write dot file +print + ("digraph include {\n", + " rankdir = LR;\n", + " rotate = 90;\n", + ); + +##-- all nodes +foreach $f (sort keys(%nod)) { + $f_str = safestr($f); + if (exists($inc{$f})) { $attrs = "[ label=\"$f\", shape=box ]"; } + else { $attrs = "[ label=\"$f\", shape=box, style=filled, fill=gray ]"; } + print " $f_str $attrs;\n"; + + ##-- arcs + if (defined($incs=$inc{$f})) { + foreach $i (@$incs) { + $i_str = safestr($i); + if (exists($inc{$i})) { $e_attrs = "[ color=black ]"; } + else { $e_attrs = "[ color=red, style=dashed ]" } + print "\t$f_str -> $i_str $e_attrs;\n" + } + } +} +print "}\n"; |