Blame doc/mpich/sm2dot

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);