|
Packit Service |
c5cf8c |
#!/usr/bin/env perl
|
|
Packit Service |
c5cf8c |
#
|
|
Packit Service |
c5cf8c |
# sm2dot
|
|
Packit Service |
c5cf8c |
#
|
|
Packit Service |
c5cf8c |
# Converts a state machine description file to a file readable by dot. dot is
|
|
Packit Service |
c5cf8c |
# a program which creates printable directed graphs from a directed graph
|
|
Packit Service |
c5cf8c |
# description.
|
|
Packit Service |
c5cf8c |
#
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
use strict;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my ($filename);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if ($#ARGV >= 0)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
$filename = $ARGV[0];
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
else
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
$filename = "&STDIN";
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (!open(FILE, "<$filename"))
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
print STDERR "\nERROR: unable to open $filename\n\n";
|
|
Packit Service |
c5cf8c |
exit(1);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my (@sm, $sm);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
@sm = <FILE>;
|
|
Packit Service |
c5cf8c |
$sm = "\n" . join("", @sm) . "\n";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my($re_keyword, $re_str, $re_params, $re);
|
|
Packit Service |
c5cf8c |
$re_keyword = "Graph|State|Event|State_Change|Change_State|" .
|
|
Packit Service |
c5cf8c |
"Action|Invoke_Action";
|
|
Packit Service |
c5cf8c |
$re_str = "\\s*\\[[^\]]*\\]\\s*";
|
|
Packit Service |
c5cf8c |
$re_params = "((${re_str})?,)*(($re_str))";
|
|
Packit Service |
c5cf8c |
$re = "(^|\\n)\\s*($re_keyword)\\s*\\(?$re_params\\)?";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my($keyword, @params_tmp, $graph_name, $graph_params,
|
|
Packit Service |
c5cf8c |
%nodes, @node_names, @edges, $cur_node, $tmp);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
$graph_name = "My Graph";
|
|
Packit Service |
c5cf8c |
$graph_params = "";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
while (($tmp, $keyword, @params_tmp) = ($sm =~ /$re/))
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
my ($i, @params);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
for ($i = 1; $i <= $#params_tmp; $i += 2)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
if (defined($params_tmp[$i]))
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
$params_tmp[$i] =~ s/^\s*\[\s*//;
|
|
Packit Service |
c5cf8c |
$params_tmp[$i] =~ s/\s*\]\s*//;
|
|
Packit Service |
c5cf8c |
$params_tmp[$i] =~ s/\s+/ /g;
|
|
Packit Service |
c5cf8c |
$params[$#params+1] = $params_tmp[$i];
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if ($keyword eq "State_Change" || $keyword eq "Change_State"
|
|
Packit Service |
c5cf8c |
|| $keyword eq "Invoke_Action")
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
my($attrs);
|
|
Packit Service |
c5cf8c |
$edges[$#edges+1] = join("\0", $cur_node, $params[0],
|
|
Packit Service |
c5cf8c |
defined($params[1]) ? $params[1] : "");
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
elsif ($keyword eq "Event")
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
# this isn't being used at the moment...
|
|
Packit Service |
c5cf8c |
# $cur_event = $params[0];
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
elsif ($keyword eq "State" || $keyword eq "Action")
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
$cur_node = $params[0];
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my($opt_attrs, @attrs);
|
|
Packit Service |
c5cf8c |
$opt_attrs = defined($params[1]) ? $params[1] : "";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (!defined($nodes{$cur_node}))
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
# print STDERR "OPT_ATTRS = \"$opt_attrs\"\n";
|
|
Packit Service |
c5cf8c |
if (!($opt_attrs =~ /shape\s*=/))
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
$attrs[$#attrs+1] = ($keyword eq "State")
|
|
Packit Service |
c5cf8c |
? "shape=ellipse" : "shape=box";
|
|
Packit Service |
c5cf8c |
# print STDERR "SETTING SHAPE = \"$attrs[$#attrs]\"\n";
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if ($opt_attrs ne "")
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
$attrs[$#attrs+1] = $opt_attrs;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
$nodes{$cur_node} = join(",", @attrs);
|
|
Packit Service |
c5cf8c |
$node_names[$#node_names+1] = $cur_node;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
else
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
print STDERR "Warning state $cur_node defined multiple times\n";
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
elsif ($keyword eq "Graph")
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
$graph_name = $params[0] if defined($params[0]);
|
|
Packit Service |
c5cf8c |
$graph_params = $params[1] if defined($params[1]);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# print STDERR "DECL - $keyword", join("|","", @params, ""),"\n";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
$sm = $';
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
close(FILE);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my($edge, $from_node, $to_node, $error);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
$error = 0;
|
|
Packit Service |
c5cf8c |
foreach $edge (@edges)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
($from_node, $to_node) = split("\0", $edge);
|
|
Packit Service |
c5cf8c |
if (!defined($nodes{$from_node}))
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
print STDERR "Unable to find from node \"$from_node\"\n";
|
|
Packit Service |
c5cf8c |
$error = 1;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (!defined($nodes{$to_node}))
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
print STDERR "Unable to find to node \"$to_node\"\n";
|
|
Packit Service |
c5cf8c |
$error = 1;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
exit(1) if ($error != 0);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
print "digraph \"$graph_name\" {\n";
|
|
Packit Service |
c5cf8c |
print "graph [$graph_params];\n" if $graph_params ne "";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my($node,$attrs);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
foreach $node (@node_names)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
print "\"$node\"";
|
|
Packit Service |
c5cf8c |
print (($nodes{$node} ne "") ? " [$nodes{$node}];\n" : ";\n");
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my($edge, $from_node, $to_node, $attrs);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
foreach $edge (@edges)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
($from_node, $to_node, $attrs) = split("\0", $edge);
|
|
Packit Service |
c5cf8c |
print "\"$from_node\" -> \"$to_node\"";
|
|
Packit Service |
c5cf8c |
print (($attrs ne "") ? " [$attrs];\n" : ";\n");
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
print "}\n";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
exit(0);
|