$ tclsh
% package require Tcldot
1.8.10
% dotstring "digraph g0 { subgraph g1 { } subgraph g2 { } }"
graph0
% graph0 listsubgraphs
graph0 graph1 graph2
% graph1 listsubgraphs
graph0 graph1 graph2
% graph1 addnode
node0
% graph1 addnode
node1
% graph1 addedge node0 node1 attr 1
Segmentation fault (core dumped)
"graph0 listsubgraphs" should be "graph1 graph2" and
"graph1 listsubgraphs" should be null.
Adding an edge with attributes to a subgraph should not
cause segmentation fault.
--- graphviz-1.8.10/tcldot/tcldot.c~ Thu Aug 1 09:19:11 2002
+++ graphviz-1.8.10/tcldot/tcldot.c Fri Jan 24 12:11:55 2003
@@ -596,6 +596,7 @@
Tcl_CreateObjCommand(interp, interp->result,
edgecmd, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); #endif /* TCLOBJ */
+ g = g->root;
for (i = 4; i < argc; i++) {
if (!(a = agfindattr(g->proto->e, argv[i])))
a = agedgeattr(g, argv[i], "");
@@ -782,8 +783,8 @@
} else if ((c == 'l') && (strncmp(argv[1], "listsubgraphs", length) == 0)) {
if (g->meta_node) {
- for (n = agfstnode(g->meta_node->graph); n; n = agnxtnode(g->meta_node->graph, n)) {
- sg = agusergraph(n);
+ for (e = agfstout(g->meta_node->graph, g->meta_node); e; e = agnxtout(g->meta_node->graph, e)) {
+ sg = agusergraph(e->head);
tclhandleString(graphTblPtr, buf, sg->handle);
Tcl_AppendElement(interp, buf);
}
@@ -956,7 +957,6 @@
return TCL_OK;
} else if ((c == 's') && (strncmp(argv[1], "setattributes", length) == 0)) {
- g = g->root;
if (argc == 3) {
if (Tcl_SplitList(interp, argv[2], &argc2, (CONST84 char***) &argv2) != TCL_OK)
return TCL_ERROR;
@@ -968,8 +968,8 @@
return TCL_ERROR;
}
for (i = 0; i < argc2; i++) {
- if (!(a = agfindattr(g, argv2[i])))
- a = agraphattr(g, argv2[i], "");
+ if (!(a = agfindattr(g->root, argv2[i])))
+ a = agraphattr(g->root, argv2[i], "");
agxset(g, a->index, argv2[++i]);
}
Tcl_Free((char *)argv2);
@@ -982,12 +982,12 @@
return TCL_ERROR;
}
for (i = 2; i < argc; i++) {
- if (!(a = agfindattr(g, argv[i])))
- a = agraphattr(g, argv[i], "");
+ if (!(a = agfindattr(g->root, argv[i])))
+ a = agraphattr(g->root, argv[i], "");
agxset(g, a->index, argv[++i]);
}
}
- reset_layout(g);
+ reset_layout(g->root);
return TCL_OK;
} else if ((c == 's') && (strncmp(argv[1], "setedgeattributes", length) == 0)) {