static int liststk_sz, liststk_cnt;
static void free_attr (Dt_t*d, gmlattr* p, Dtdisc_t* ds); /* forward decl */
+static char* sortToStr (int sort); /* forward decl */
static void
free_node (Dt_t*d, gmlnode* p, Dtdisc_t* ds)
{
if (!p) return;
- dtclose (p->attrlist);
+ if (p->attrlist) dtclose (p->attrlist);
free (p);
}
free_edge (Dt_t*d, gmledge* p, Dtdisc_t* ds)
{
if (!p) return;
- dtclose (p->attrlist);
+ if (p->attrlist) dtclose (p->attrlist);
free (p);
}
gmlattr* gp = NEW(gmlattr);
assert (name || sort);
+ if (!name)
+ name = strdup (sortToStr (sort));
gp->sort = sort;
gp->kind = kind;
gp->name = name;
YYABORT;
}
}
+ | ID INTEGER {/* FIX */}
| alistitem { dtinsert (G->attrlist, $1); }
;
| OUTLINEWIDTH INTEGER { $$ = mkAttr (0, OUTLINEWIDTH, INTEGER, $2, 0); }
| WIDTH INTEGER { $$ = mkAttr (0, OUTLINEWIDTH, INTEGER, $2, 0); }
| STYLE STRING { $$ = mkAttr (0, STYLE, STRING, $2, 0); }
+ | STYLE attrlist { $$ = mkAttr (0, STYLE, LIST, 0, $2); }
| LINE attrlist { $$ = mkAttr (0, LINE, LIST, 0, $2); }
| POINT attrlist { $$ = mkAttr (0, POINT, LIST, 0, $2); }
| TEXT STRING { $$ = mkAttr (0, TEXT, STRING, $2, 0); }
free_attr (Dt_t*d, gmlattr* p, Dtdisc_t* ds)
{
if (!p) return;
- if (p->kind == LIST)
+ if ((p->kind == LIST) && p->u.lp)
dtclose (p->u.lp);
else
free (p->u.value);
gmlattr* ap;
agxbput (xb, "[ ");
- for (ap = dtfirst(alist); ap; ap = dtnext (alist, ap)) {
+ if (alist) for (ap = dtfirst(alist); ap; ap = dtnext (alist, ap)) {
deparseAttr (ap, xb);
agxbputc (xb, ' ');
}
gmlattr* ap;
int cnt = 0;
+ if (!alist)
+ return;
+
for (ap = dtfirst(alist); ap; ap = dtnext (alist, ap)) {
if (ap->sort == TEXT) {
agsafeset (np, "label", ap->u.value, "");
char* y = "0";
int cnt = 0;
+ if (!alist)
+ return;
+
for (ap = dtfirst(alist); ap; ap = dtnext (alist, ap)) {
if (ap->sort == TEXT) {
agsafeset (ep, "label", ap->u.value, "");
return g;
}
+static char*
+sortToStr (int sort)
+{
+ char* s;
+
+ switch (sort) {
+ case GRAPH :
+ s = "graph"; break;
+ case NODE :
+ s = "node"; break;
+ case EDGE :
+ s = "edge"; break;
+ case DIRECTED :
+ s = "directed"; break;
+ case ID :
+ s = "id"; break;
+ case SOURCE :
+ s = "source"; break;
+ case TARGET :
+ s = "target"; break;
+ case XVAL :
+ s = "xval"; break;
+ case YVAL :
+ s = "yval"; break;
+ case WVAL :
+ s = "wval"; break;
+ case HVAL :
+ s = "hval"; break;
+ case LABEL :
+ s = "label"; break;
+ case GRAPHICS :
+ s = "graphics"; break;
+ case LABELGRAPHICS :
+ s = "labelGraphics"; break;
+ case TYPE :
+ s = "type"; break;
+ case FILL :
+ s = "fill"; break;
+ case OUTLINE :
+ s = "outline"; break;
+ case OUTLINESTYLE :
+ s = "outlineStyle"; break;
+ case OUTLINEWIDTH :
+ s = "outlineWidth"; break;
+ case WIDTH :
+ s = "width"; break;
+ case STYLE :
+ s = "style"; break;
+ case LINE :
+ s = "line"; break;
+ case POINT :
+ s = "point"; break;
+ case TEXT :
+ s = "text"; break;
+ case FONTSIZE :
+ s = "fontSize"; break;
+ case FONTNAME :
+ s = "fontName"; break;
+ case COLOR :
+ s = "color"; break;
+ case INTEGER :
+ s = "integer"; break;
+ case REAL :
+ s = "real"; break;
+ case STRING :
+ s = "string"; break;
+ case NAME :
+ s = "name"; break;
+ case LIST :
+ s = "list"; break;
+ case '[' :
+ s = "["; break;
+ case ']' :
+ s = "]"; break;
+ default :
+ s = NULL;break;
+ }
+
+ return s;
+}
+
+#if 0
+int gmllex ()
+{
+ int tok = _gmllex();
+ char* s = sortToStr (tok);
+
+ if (s)
+ fprintf (stderr, "token = %s\n", s);
+ else
+ fprintf (stderr, "token = <%d>\n", tok);
+ return tok;
+}
+#endif
+