VCG updates

This commit is contained in:
Marc Autret
2001-08-08 20:31:21 +00:00
parent 0eca3194d6
commit 600cad3b84
5 changed files with 107 additions and 56 deletions

View File

@@ -1,3 +1,22 @@
2001-08-08 Marc Autret <autret_m@epita.fr>
* src/vcg_default.h: Use NULL instead of 0 to initialize pointers.
* src/vcg.c (output_node): Fix.
* src/vcg.h: Cleanup.
* src/print_graph.c: Add comments.
(node_output_size): New global variable. Simplify the formatting of
the VCG graph output.
(print_actions): Unused code is now used. It notifies the final state
and no action states in the VCG graph. It also give the reduce actions.
The `shift and goto' edges are red and the `go to state' edges are
blue.
Get the current node name and node_obstack by argument.
(node_obstack): New variable.
(print_state): Manage node_obstack.
(print_core): Use node_obstack given by argument.
A node is not only computed here but in print_actions also.
(print_graph): CPP out useless code instead of commenting it.
2001-08-07 Pascal Bart <pascal.bart@epita.fr> 2001-08-07 Pascal Bart <pascal.bart@epita.fr>
* tests/atconfig.in (CPPFLAGS): Fix. * tests/atconfig.in (CPPFLAGS): Fix.

View File

@@ -36,6 +36,8 @@
static graph_t graph; static graph_t graph;
static unsigned node_output_size = 0;
/* Return an unambiguous printable representated, allocated in slot 0, /* Return an unambiguous printable representated, allocated in slot 0,
for NAME, suitable for C strings. */ for NAME, suitable for C strings. */
static char const * static char const *
@@ -46,7 +48,7 @@ quote (char const *name)
/* This part will construct the label of nodes. */ /* This part will construct the label of nodes. */
static void static void
print_core (int state) print_core (int state, struct obstack *node_obstack)
{ {
int i; int i;
int k; int k;
@@ -61,12 +63,10 @@ print_core (int state)
if (k == 0) if (k == 0)
return; return;
obstack_sgrow (&graph_obstack, "\t\tlabel:\t\"");
for (i = 0; i < k; i++) for (i = 0; i < k; i++)
{ {
if (i) if (i)
obstack_sgrow (&graph_obstack, "\\n"); obstack_sgrow (node_obstack, "\\n");
sp1 = sp = ritem + statep->items[i]; sp1 = sp = ritem + statep->items[i];
@@ -75,23 +75,23 @@ print_core (int state)
rule = -(*sp); rule = -(*sp);
obstack_fgrow1 (&graph_obstack, "%d: ", rule); obstack_fgrow1 (node_obstack, "%d: ", rule);
obstack_fgrow1 (&graph_obstack, " %s -> ", quote (tags[rlhs[rule]])); obstack_fgrow1 (node_obstack, " %s -> ", quote (tags[rlhs[rule]]));
for (sp = ritem + rrhs[rule]; sp < sp1; sp++) for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
obstack_fgrow1 (&graph_obstack, "%s ", quote (tags[*sp])); obstack_fgrow1 (node_obstack, "%s ", quote (tags[*sp]));
obstack_1grow (&graph_obstack, '.'); obstack_1grow (node_obstack, '.');
while (*sp > 0) while (*sp > 0)
obstack_fgrow1 (&graph_obstack, " %s", quote (tags[*sp++])); obstack_fgrow1 (node_obstack, " %s", quote (tags[*sp++]));
} }
obstack_sgrow (&graph_obstack, "\"\n");
} }
/* Output in graph_obstack edges specifications in incidence with current
node. */
static void static void
print_actions (int state, node_t *node) print_actions (int state, const char *node_name, struct obstack *node_obstack)
{ {
int i; int i;
int k; int k;
@@ -110,12 +110,10 @@ print_actions (int state, node_t *node)
if (!shiftp && !redp) if (!shiftp && !redp)
{ {
#if 0
if (final_state == state) if (final_state == state)
fprintf (f, " $default\taccept\n"); obstack_sgrow (node_obstack, "$default: accept");
else else
fprintf (f, " NO ACTIONS\n"); obstack_sgrow (node_obstack, "NO ACTIONS");
#endif
return; return;
} }
@@ -139,10 +137,11 @@ print_actions (int state, node_t *node)
if (state > state1) if (state > state1)
edge.type = back_edge; edge.type = back_edge;
open_edge (&edge, &graph_obstack); open_edge (&edge, &graph_obstack);
edge.sourcename = node->title; /* The edge source is the current node. */
edge.sourcename = node_name;
sprintf (buff, "%d", state1); sprintf (buff, "%d", state1);
edge.targetname = buff; edge.targetname = buff;
edge.color = (symbol == 0) ? blue : red; edge.color = (symbol == 0) ? red : blue;
/* FIXME: Be aware that quote uses static memory. The string /* FIXME: Be aware that quote uses static memory. The string
must be output immediately (which is the case here). */ must be output immediately (which is the case here). */
edge.label = tags[symbol] ? quote (tags[symbol]) : NULL; edge.label = tags[symbol] ? quote (tags[symbol]) : NULL;
@@ -168,13 +167,25 @@ print_actions (int state, node_t *node)
if (!errp->errs[j]) if (!errp->errs[j])
continue; continue;
symbol = errp->errs[j]; symbol = errp->errs[j];
/* If something has been added in the NODE_OBSTACK after
the declaration of the label, then we need a `\n'. */
if (obstack_object_size (node_obstack) > node_output_size)
obstack_sgrow (node_obstack, "\\n");
obstack_fgrow1 (node_obstack, _("%-4s\terror (nonassociative)"),
tags[symbol]);
} }
if (j > 0)
obstack_sgrow (node_obstack, "\\n");
} }
if (consistent[state] && redp) if (consistent[state] && redp)
{ {
rule = redp->rules[0]; rule = redp->rules[0];
symbol = rlhs[rule]; symbol = rlhs[rule];
if (obstack_object_size (node_obstack) > node_output_size)
obstack_sgrow (node_obstack, "\\n");
obstack_fgrow2 (node_obstack, _("$default\treduce using rule %d (%s)"),
rule, tags[symbol]);
} }
if (i < k) if (i < k)
@@ -188,7 +199,7 @@ print_actions (int state, node_t *node)
new_edge (&edge); new_edge (&edge);
open_edge (&edge, &graph_obstack); open_edge (&edge, &graph_obstack);
edge.sourcename = node->title; edge.sourcename = node_name;
sprintf (buff, "%d", state1); sprintf (buff, "%d", state1);
edge.targetname = buff; edge.targetname = buff;
edge.color = red; edge.color = red;
@@ -199,24 +210,46 @@ print_actions (int state, node_t *node)
} }
} }
/* Output in GRAPH_OBSTACK the current node specifications and edges
which go out from that node. */
static void static void
print_state (int state) print_state (int state)
{ {
static char name[10]; static char name[10];
struct obstack node_obstack;
node_t node; node_t node;
new_node (&node); obstack_init (&node_obstack);
open_node (&graph_obstack); new_node (&node); /* Set node attributs default value. */
sprintf (name, "%d", state); sprintf (name, "%d", state);
node.title = name; node.title = name; /* Give a name to the node. */
output_node (&node, &graph_obstack); open_node (&node_obstack);
/* Output a VCG formatted attributs list. */
output_node (&node, &node_obstack);
print_core (state); /* node label */ {
/* Here we begin to compute the node label. */
obstack_sgrow (&node_obstack, "\t\tlabel:\t\""); /* Open Label */
close_node (&graph_obstack); /* Keep the size of NODE_OBSTACK before computing the label. It is
useful to format the label. */
node_output_size = obstack_object_size (&node_obstack);
print_actions (state, &node); /* edges */ /* Compute the labels of nodes on the fly. */
print_core (state, &node_obstack);
/* Compute edges and additionnal parts of node label. */
print_actions (state, node.title, &node_obstack);
obstack_sgrow (&node_obstack, "\"\n"); /* Close Label. */
close_node (&node_obstack);
}
/* `obstack_cat' NODE_OBSTACK to GRAPH_OBSTACK. */
obstack_grow (&graph_obstack,
obstack_base (&node_obstack),
obstack_object_size (&node_obstack));
obstack_finish (&node_obstack);
} }
@@ -229,8 +262,10 @@ print_graph (void)
return; return;
new_graph (&graph); new_graph (&graph);
/* graph.smanhattan_edges = yes; #if 0
graph.manhattan_edges = yes; */ graph.smanhattan_edges = yes;
graph.manhattan_edges = yes;
#endif
graph.display_edge_labels = yes; graph.display_edge_labels = yes;
graph.layoutalgorithm = 0; graph.layoutalgorithm = 0;

View File

@@ -545,7 +545,7 @@ output_node (node_t *node, struct obstack *os)
if (node->shrink != N_SHRINK) if (node->shrink != N_SHRINK)
obstack_fgrow1 (os, "\t\tshrink:\t%d\n", node->shrink); obstack_fgrow1 (os, "\t\tshrink:\t%d\n", node->shrink);
if (node->stretch != N_STRETCH) if (node->stretch != N_STRETCH)
obstack_fgrow1 (os, "\t\tshrink:\t%d\n", node->shrink); obstack_fgrow1 (os, "\t\tstretch:\t%d\n", node->stretch);
if (node->folding != N_FOLDING) if (node->folding != N_FOLDING)
obstack_fgrow1 (os, "\t\tfolding:\t%d\n", node->folding); obstack_fgrow1 (os, "\t\tfolding:\t%d\n", node->folding);
@@ -580,7 +580,8 @@ output_node (node_t *node, struct obstack *os)
void void
output_edge (edge_t *edge, struct obstack *os) output_edge (edge_t *edge, struct obstack *os)
{ {
/* FIXME: SOURCENAME and TARGETNAME are mandatory
so it has to be fatal not to give these informations. */
if (edge->sourcename != E_SOURCENAME) if (edge->sourcename != E_SOURCENAME)
obstack_fgrow1 (os, "\t\tsourcename:\t\"%s\"\n", edge->sourcename); obstack_fgrow1 (os, "\t\tsourcename:\t\"%s\"\n", edge->sourcename);
if (edge->targetname != E_TARGETNAME) if (edge->targetname != E_TARGETNAME)

View File

@@ -439,10 +439,6 @@ struct edge_s
*/ */
typedef struct edge_s edge_t; typedef struct edge_s edge_t;
/***************************************************************.
**
****************************************************************/
/*--------------------------------------------------------. /*--------------------------------------------------------.
| Graph attributs list. Structure that describes a graph. | | Graph attributs list. Structure that describes a graph. |
`--------------------------------------------------------*/ `--------------------------------------------------------*/

View File

@@ -22,11 +22,11 @@
# define VCG_DEFAULTS_H_ # define VCG_DEFAULTS_H_
/* Graph defaults. */ /* Graph defaults. */
# define G_TITLE 0 # define G_TITLE NULL
# define G_LABEL 0 # define G_LABEL NULL
# define G_INFOS1 0 # define G_INFOS1 NULL
# define G_INFOS2 0 # define G_INFOS2 NULL
# define G_INFOS3 0 # define G_INFOS3 NULL
# define G_COLOR white # define G_COLOR white
# define G_TEXTCOLOR black # define G_TEXTCOLOR black
@@ -63,7 +63,7 @@
# define G_HIDDEN -1 /* No default value. */ # define G_HIDDEN -1 /* No default value. */
# define G_CLASSNAME 0 /* No class name association */ # define G_CLASSNAME NULL /* No class name association */
# define G_LAYOUTALGORITHM normal # define G_LAYOUTALGORITHM normal
# define G_LAYOUT_DOWNFACTOR 1 # define G_LAYOUT_DOWNFACTOR 1
# define G_LAYOUT_UPFACTOR 1 # define G_LAYOUT_UPFACTOR 1
@@ -106,12 +106,12 @@
# define G_RMAX 100 # define G_RMAX 100
# define G_SMAX 100 # define G_SMAX 100
# define G_NODE_LIST 0 # define G_NODE_LIST NULL
# define G_EDGE_LIST 0 # define G_EDGE_LIST NULL
/* Nodes defaults. */ /* Nodes defaults. */
# define N_TITLE 0 # define N_TITLE NULL
# define N_LABEL 0 # define N_LABEL NULL
# define N_LOCX -1 /* Default unspcified */ # define N_LOCX -1 /* Default unspcified */
# define N_LOCY -1 /* Default unspcified */ # define N_LOCY -1 /* Default unspcified */
@@ -135,18 +135,18 @@
# define N_TEXTCOLOR black # define N_TEXTCOLOR black
# define N_BORDERCOLOR N_TEXTCOLOR # define N_BORDERCOLOR N_TEXTCOLOR
# define N_INFOS1 0 # define N_INFOS1 NULL
# define N_INFOS2 0 # define N_INFOS2 NULL
# define N_INFOS3 0 # define N_INFOS3 NULL
# define N_NEXT 0 # define N_NEXT NULL
/* Edge defaults. */ /* Edge defaults. */
# define E_EDGE_TYPE normal_edge # define E_EDGE_TYPE normal_edge
# define E_SOURCENAME 0 /* Mandatory. */ # define E_SOURCENAME NULL /* Mandatory. */
# define E_TARGETNAME 0 /* Mandatory. */ # define E_TARGETNAME NULL /* Mandatory. */
# define E_LABEL 0 # define E_LABEL NULL
# define E_LINESTYLE continuous # define E_LINESTYLE continuous
# define E_THICKNESS 2 # define E_THICKNESS 2
@@ -170,6 +170,6 @@
# define E_HORIZONTAL_ORDER -1 # define E_HORIZONTAL_ORDER -1
# define E_NEXT 0 # define E_NEXT NULL
#endif /* not VCG_DEFAULTS_H_ */ #endif /* not VCG_DEFAULTS_H_ */