]> granicus.if.org Git - graphviz/commitdiff
Add agcopyattr to libgraph; use in utils.c (and dotsplines.c, to be committed
authorerg <devnull@localhost>
Tue, 14 Jun 2005 16:03:17 +0000 (16:03 +0000)
committererg <devnull@localhost>
Tue, 14 Jun 2005 16:03:17 +0000 (16:03 +0000)
later).
Expose agstrdup and agstrfree in graph.h; remove raw declarations from emit.c

lib/common/emit.c
lib/common/utils.c
lib/graph/attribs.c
lib/graph/graph.h
lib/graph/libgraph.h

index 1ae457d4746d6a6c6c97e6bedd67abe5ff64f677..eab23b82ec1b08e9db7d56eea7dd85a93d364c39 100644 (file)
@@ -1292,10 +1292,6 @@ void emit_graph(GVJ_t * job, graph_t * g)
 }
 
 /* support for stderr_once */
-/* #include "libgraph.h"               to get agstrdup, agstrfree */
-extern char *agstrdup(char *);
-extern void agstrfree(char *);
-
 static void free_string_entry(Dict_t * dict, char *key, Dtdisc_t * disc)
 {
     agstrfree(key);
index 794a78101afadd5bc319df105785fccbbdb1592a..ae67a9b7ce4e739d3a83f797b50b93b5ef4e45ca 100644 (file)
@@ -1483,17 +1483,9 @@ static Dtdisc_t mapDisc = {
  */
 static edge_t *cloneEdge(edge_t * e, node_t * ct, node_t * ch)
 {
-    extern Agdict_t *agdictof(void *);
-    Agdict_t *d = agdictof(e);
-    Agsym_t **list = d->list;
-    Agsym_t *sym;
     graph_t *g = ct->graph;
     edge_t *ce = agedge(g, ct, ch);
-
-    while ((sym = *list++)) {
-       if (sym->index == 0) continue;
-       agxset(ce, sym->index, agxget(e, sym->index));
-    }
+    agcopyattr(e, ce);
 
     return ce;
 }
index a7b5b8b265a38a16712e7734ae52dc6c70d33f4c..18910260ada4d4e420a6541e23aea5638882070a 100644 (file)
@@ -326,3 +326,28 @@ int agxset(void *obj, int index, char *buf)
     } else
        return -1;
 }
+
+/* agcopyattr:
+ * Assumes attributes have already been declared.
+ * Do not copy key attribute for edges, as this must be distinct.
+ * Returns non-zero on failure or if objects have different type.
+ */
+int agcopyattr(void *oldobj, void *newobj)
+{
+    Agdict_t *d = agdictof(oldobj);
+    Agsym_t **list = d->list;
+    Agsym_t *sym;
+    Agsym_t *newsym;
+    int r = 0;
+    int isEdge = (TAG_OF(oldobj) == TAG_EDGE);
+
+    if (TAG_OF(oldobj) != TAG_OF(newobj)) return 1;
+    while (!r && (sym = *list++)) {
+       if (isEdge && sym->index == KEYX) continue;
+        newsym = agfindattr(newobj,sym->name);
+       if (!newsym) return 1;
+       r = agxset(newobj, newsym->index, agxget(oldobj, sym->index));
+    }
+    return r;
+}
+
index 31de58417602c588ae204ac2ec517813e4c94889..b323ba49e6257be78cd90a2986e2aa6c697c751f 100644 (file)
@@ -183,6 +183,7 @@ extern "C" {
     extern Agsym_t *agnodeattr(Agraph_t *, char *, char *);
     extern Agsym_t *agedgeattr(Agraph_t *, char *, char *);
     extern Agsym_t *agfindattr(void *, char *);
+    extern int      agcopyattr(void *, void *);
 
     typedef enum { AGWARN, AGERR, AGMAX, AGPREV } agerrlevel_t;
     extern agerrlevel_t agerrno;
@@ -192,6 +193,9 @@ extern "C" {
     extern void agerrorf(char *fmt, ...);
     extern void agwarningf(char *fmt, ...);
 
+    extern char *agstrdup(char *);
+    extern void agstrfree(char *);
+
     typedef enum { AGNODE = 1, AGEDGE, AGGRAPH } agobjkind_t;
 #define agobjkind(p)           ((agobjkind_t)(((Agraph_t*)(p))->tag))
 
index c0924c5fe18cb5cc6ce17def33d57e9c84f8b682..a40d2785d64fde67a59c79aa87c738765126c495 100644 (file)
@@ -160,9 +160,7 @@ extern "C" {
     int agparse(void);
     void agpopproto(Agraph_t *);
     void agpushproto(Agraph_t *);
-    char *agstrdup(char *);
     char *agstrdup_html(char *s);
-    void agstrfree(char *);
     int agtoken(char *);
     void agwredge(Agraph_t *, FILE *, Agedge_t *, int);
     void agwrnode(Agraph_t *, FILE *, Agnode_t *, int, int);