]> granicus.if.org Git - graphviz/commitdiff
Make sure all Agsym_t values are copied when cloning a dictionary;
authorEmden Gansner <erg@research.att.com>
Thu, 2 Aug 2012 18:28:22 +0000 (14:28 -0400)
committerEmden Gansner <erg@research.att.com>
Thu, 2 Aug 2012 18:28:22 +0000 (14:28 -0400)
fix use of fixed Agsym_t field. The current implementation was using
fixed for individual object attribute assignment, which is wrong. Individual
assignment should always dominate. The code now correctly fixes an
attribute value only for default or graph values, and only in the root graph.

lib/cgraph/attr.c
lib/cgraph/grammar.y

index 894002822a2c879f3aa21851b90dbcbf3533c6ef..3e22021965044d591d6da47b305650dc31794727 100644 (file)
@@ -95,6 +95,8 @@ static void agcopydict(Dict_t * src, Dict_t * dest, Agraph_t * g, int kind)
     for (sym = (Agsym_t *) dtfirst(src); sym;
         sym = (Agsym_t *) dtnext(src, sym)) {
        newsym = agnewsym(g, sym->name, sym->defval, sym->id, kind);
+       newsym->print = sym->print;
+       newsym->fixed = sym->fixed;
        dtinsert(dest, newsym);
     }
 }
index aa372a81438ba3a99e1a88c2a36e0b87c6d2da61..0bde9e07f74868e97d75590611d2c1c50e196ade 100644 (file)
@@ -281,13 +281,14 @@ static void bindattrs(int kind)
        }
 }
 
+/* attach node/edge specific attributes */
 static void applyattrs(void *obj)
 {
        item            *aptr;
 
        for (aptr = Attrlist.first; aptr; aptr = aptr->next) {
                if (aptr->tag == T_attr) {
-                       if (aptr->u.asym && !aptr->u.asym->fixed) {
+                       if (aptr->u.asym) {
                                agxset(obj,aptr->u.asym,aptr->str);
                        }
                }
@@ -306,6 +307,7 @@ static void nomacros(void)
 
 /* attrstmt:
  * First argument is always attrtype, so switch covers all cases.
+ * This function is used to handle default attribute value assignment.
  */
 static void attrstmt(int tkind, char *macroname)
 {
@@ -326,7 +328,8 @@ static void attrstmt(int tkind, char *macroname)
        }
        bindattrs(kind);        /* set up defaults for new attributes */
        for (aptr = Attrlist.first; aptr; aptr = aptr->next) {
-               sym = agattr(G,kind,aptr->u.asym->name,aptr->str);
+               if (!(aptr->u.asym->fixed) || (G->root != G))
+                       sym = agattr(G,kind,aptr->u.asym->name,aptr->str);
                if (G->root == G)
                        sym->print = TRUE;
        }
@@ -472,8 +475,7 @@ static void mkport(Agedge_t *e, char *name, char *val)
        if (val) {
                if ((attr = agattr(G,AGEDGE,name,NIL(char*))) == NILsym)
                        attr = agattr(G,AGEDGE,name,"");
-               if (!attr->fixed)
-                       agxset(e,attr,val);
+               agxset(e,attr,val);
        }
 }