]> granicus.if.org Git - graphviz/commitdiff
At present, cgraph uses a separate refstr cache for each graph. This means that in
authorEmden Gansner <erg@research.att.com>
Wed, 12 Oct 2011 14:43:25 +0000 (10:43 -0400)
committerEmden Gansner <erg@research.att.com>
Wed, 12 Oct 2011 14:43:25 +0000 (10:43 -0400)
agcopyattr(), new strings are generated but the html bit may be lost. This fix
makes sure the bit is transferred.

lib/cgraph/attr.c
lib/cgraph/cghdr.h
lib/cgraph/refstr.c

index 93d7acc9d18b160bf49c9b2e605f4aeeadbee4f7..67a41c87239a8e01a8105d2ec9e4b9ca16f23eb7 100644 (file)
@@ -532,6 +532,8 @@ int agcopyattr(void *oldobj, void *newobj)
     Agraph_t *g;
     Agsym_t *sym;
     Agsym_t *newsym;
+    char* val;
+    char* nval;
     int r = 1;
 
     g = agraphof(oldobj);
@@ -542,7 +544,16 @@ int agcopyattr(void *oldobj, void *newobj)
        newsym = agattrsym(newobj, sym->name);
        if (!newsym)
            return 1;
-       r = agxset(newobj, newsym, agxget(oldobj, sym));
+       val = agxget(oldobj, sym);
+       r = agxset(newobj, newsym, val);
+       /* FIX(?): Each graph has its own string cache, so a whole new refstr is possibly
+        * allocated. If the original was an html string, make sure the new one is as well.
+        * If cgraph goes to single string table, this can be removed.
+        */
+       if (aghtmlstr (val)) {
+           nval = agxget (newobj, newsym);
+           agmarkhtmlstr (nval);
+       }
     }
     return r;
 }
index b275bbd653125f91f44c61bad94d9ac48876ae00..1a784a9771a2c547e9360181d538bdddff8a11eb 100644 (file)
@@ -107,6 +107,9 @@ extern Agcbdisc_t AgAttrdisc;
 Agraph_t *agopen1(Agraph_t * g);
 void agstrclose(Agraph_t * g);
 
+       /* ref string management */
+void agmarkhtmlstr(char *s);
+
        /* object set management */
 Agnode_t *agfindnode_by_id(Agraph_t * g, unsigned long id);
 Dtcompar_f agdictorder(Agraph_t *, Dict_t *, Dtcompar_f);
index 88ef912abdf7f902b0c5b4fb601f4a843133cff2..ae7c2ce1e15ce2bd60f0be8fccb7051e3c70a0d9 100644 (file)
@@ -185,6 +185,16 @@ int aghtmlstr(char *s)
     return (key->refcnt & HTML_BIT);
 }
 
+void agmarkhtmlstr(char *s)
+{
+    refstr_t *key;
+
+    if (s == NULL)
+       return;
+    key = (refstr_t *) (s - offsetof(refstr_t, store[0]));
+    key->refcnt |= HTML_BIT;
+}
+
 #ifdef DEBUG
 static int refstrprint(Dict_t * dict, void *ptr, void *user)
 {