]> granicus.if.org Git - graphviz/commitdiff
add setv, getv and iterators for node/edge attributes of graph
authorellson <devnull@localhost>
Tue, 18 Oct 2005 18:57:05 +0000 (18:57 +0000)
committerellson <devnull@localhost>
Tue, 18 Oct 2005 18:57:05 +0000 (18:57 +0000)
tclpkg/gv/gv.cpp
tclpkg/gv/gv.i

index fccbe780d4dba531f7b78ae979a40b42acaa51b1..975650b3035ff2b84344e8ddedb9eb527510a730 100644 (file)
@@ -14,6 +14,7 @@
 *              AT&T Research, Florham Park NJ             *
 **********************************************************/
 
+#include <string.h>
 #include "gvc.h"
 
 GVC_t *gvc;
@@ -120,6 +121,26 @@ char *getv(Agraph_t *g, Agsym_t *a)
        return "";
     return val;
 }
+char *getv(Agraph_t *g, char *gne, Agsym_t *a)
+{
+    char *val;
+    int len;
+
+    if (!g || !gne || !gne[0] || !a)
+       return NULL;
+    len = strlen(gne);
+    if (strncmp(gne,"graph",len) == 0)
+        val = agxget(g, a->index);
+    else if (strncmp(gne,"node",len) == 0)
+        val = agxget(g->proto->n, a->index);
+    else if (strncmp(gne,"edge",len) == 0)
+        val = agxget(g->proto->e, a->index);
+    else
+        return NULL;
+    if (!val)
+       return "";
+    return val;
+}
 char *getv(Agraph_t *g, char *attr)
 {
     Agsym_t *a;
@@ -135,6 +156,39 @@ char *getv(Agraph_t *g, char *attr)
        return "";
     return val;
 }
+char *getv(Agraph_t *g, char *gne, char *attr)
+{
+    Agsym_t *a;
+    char *val;
+    int len;
+
+    if (!g || !gne || !gne[0] || !attr)
+       return NULL;
+    len = strlen(gne);
+    if (strncmp(gne,"graph",len) == 0) {
+        a = agfindattr(g->root, attr);
+        if (!a)
+           return "";
+        val = agxget(g, a->index);
+    }
+    else if (strncmp(gne,"node",len) == 0) {
+        a = agfindattr(g->proto->n, attr);
+        if (!a)
+           return "";
+        val = agxget(g->proto->n, a->index);
+    }
+    else if (strncmp(gne,"edge",len) == 0) {
+        a = agfindattr(g->proto->e, attr);
+        if (!a)
+           return "";
+        val = agxget(g->proto->e, a->index);
+    }
+    else
+        return NULL;
+    if (!val)
+       return "";
+    return val;
+}
 char *setv(Agraph_t *g, Agsym_t *a, char *val)
 {
     if (!g || !a || !val)
@@ -142,6 +196,23 @@ char *setv(Agraph_t *g, Agsym_t *a, char *val)
     agxset(g, a->index, val);
     return val;
 }
+char *setv(Agraph_t *g, char *gne, Agsym_t *a, char *val)
+{
+    int len;
+
+    if (!g || !gne || !gne[0] || !a || !val)
+       return NULL;
+    len = strlen(gne);
+    if (strncmp(gne,"graph",len) == 0)
+        agxset(g, a->index, val);
+    else if (strncmp(gne,"node",len) == 0)
+        agxset(g->proto->n, a->index, val);
+    else if (strncmp(gne,"edge",len) == 0)
+        agxset(g->proto->e, a->index, val);
+    else
+        return NULL;
+    return val;
+}
 char *setv(Agraph_t *g, char *attr, char *val)
 {
     Agsym_t *a;
@@ -154,6 +225,36 @@ char *setv(Agraph_t *g, char *attr, char *val)
     agxset(g, a->index, val);
     return val;
 }
+char *setv(Agraph_t *g, char *gne, char *attr, char *val)
+{
+    Agsym_t *a;
+    int len;
+
+    if (!g || !gne || !gne[0] || !attr || !val)
+       return NULL;
+    len = strlen(gne);
+    if (strncmp(gne,"graph",len) == 0) {
+        a = agfindattr(g->root, attr);
+        if (!a)
+           a = agraphattr(g->root, attr, "");
+        agxset(g, a->index, val);
+    }
+    else if (strncmp(gne,"node",len) == 0) {
+        a = agfindattr(g->proto->n, attr);
+        if (!a)
+           a = agnodeattr(g->root, attr, "");
+        val = agxget(g->proto->n, a->index);
+    }
+    else if (strncmp(gne,"edge",len) == 0) {
+        a = agfindattr(g->proto->e, attr);
+        if (!a)
+           a = agedgeattr(g->root, attr, "");
+        val = agxget(g->proto->e, a->index);
+    }
+    else
+        return NULL;
+    return val;
+}
 //-------------------------------------------------
 char *getv(Agnode_t *n, Agsym_t *a)
 {
@@ -224,7 +325,7 @@ char *getv(Agedge_t *e, char *attr)
 
     if (!e || !attr)
        return NULL;
-    g = e->head->graph->root;
+    g = e->tail->graph;
     a = agfindattr(g->proto->e, attr);
     if (!a)
        return "";
@@ -247,7 +348,7 @@ char *setv(Agedge_t *e, char *attr, char *val)
 
     if (!e || !attr || !val)
        return NULL;
-    g = e->head->graph->root;
+    g = e->tail->graph;
     a = agfindattr(g->proto->e, attr);
     if (!a)
         a = agnodeattr(g, attr, "");
@@ -694,6 +795,69 @@ Agsym_t *nextattr(Agraph_t *g, Agsym_t *a)
         return NULL;
     return g->univ->globattr->list[i];
 }
+Agsym_t *firstattr(Agraph_t *g, char *gne)
+{
+    int len;
+
+    if (!g || !gne || !gne[0])
+       return NULL;
+    g = g->root;
+    len = strlen(gne);
+    if (strncmp(gne,"graph",len) == 0) {
+        if (dtsize(g->univ->globattr->dict) == 0)
+           return NULL;
+        return g->univ->globattr->list[0];
+    }
+    else if (strncmp(gne,"node",len) == 0) {
+        if (dtsize(g->univ->nodeattr->dict) == 0)
+           return NULL;
+        return g->univ->nodeattr->list[0];
+    }
+    else if (strncmp(gne,"edge",len) == 0) {
+        if (dtsize(g->univ->edgeattr->dict) == 0)
+           return NULL;
+        return g->univ->edgeattr->list[0];
+    }
+    return NULL;
+}
+
+Agsym_t *nextattr(Agraph_t *g, char *gne, Agsym_t *a)
+{
+    int i, len;
+
+    if (!g || !gne || !gne[0] || !a)
+        return NULL;
+    g = g->root;
+    len = strlen(gne);
+    if (strncmp(gne,"graph",len) == 0) {
+        for (i = 0; i < dtsize(g->univ->globattr->dict); i++)
+           if (a == g->univ->globattr->list[i])
+               break;
+        i++;
+        if (i > dtsize(g->univ->globattr->dict))
+            return NULL;
+        return g->univ->globattr->list[i];
+    }
+    else if (strncmp(gne,"node",len) == 0) {
+        for (i = 0; i < dtsize(g->univ->nodeattr->dict); i++)
+           if (a == g->univ->nodeattr->list[i])
+               break;
+        i++;
+        if (i > dtsize(g->univ->nodeattr->dict))
+            return NULL;
+        return g->univ->nodeattr->list[i];
+    }
+    else if (strncmp(gne,"edge",len) == 0) {
+        for (i = 0; i < dtsize(g->univ->edgeattr->dict); i++)
+           if (a == g->univ->edgeattr->list[i])
+               break;
+        i++;
+        if (i > dtsize(g->univ->edgeattr->dict))
+            return NULL;
+        return g->univ->edgeattr->list[i];
+    }
+    return NULL;
+}
 
 Agsym_t *firstattr(Agnode_t *n)
 {
index d951808f36a3fb16e90a1bb2a9801e009ad15e2e..995e9215ae5dc91b15fa33b4298a9bcda5321dd6 100644 (file)
@@ -41,18 +41,22 @@ extern Agedge_t *edge(Agraph_t *g, char *tname, char *hname);/* add edge between
 
 /* set/get attribute of graph/node/edge */
 extern char *setv(Agraph_t *g, char *attr, char *val);
+extern char *setv(Agraph_t *g, char *gne, char *att, char *val);
 extern char *setv(Agnode_t *n, char *attr, char *val);
 extern char *setv(Agedge_t *e, char *attr, char *val);
 
 extern char *setv(Agraph_t *g, Agsym_t *a, char *val);
+extern char *setv(Agraph_t *g, char *gne, Agsym_t *a, char *val);
 extern char *setv(Agnode_t *n, Agsym_t *a, char *val);
 extern char *setv(Agedge_t *e, Agsym_t *a, char *val);
 
 extern char *getv(Agraph_t *g, char *attr);
+extern char *getv(Agraph_t *g, char *gne, char *attr);
 extern char *getv(Agnode_t *n, char *attr);
 extern char *getv(Agedge_t *e, char *attr);
 
 extern char *getv(Agraph_t *g, Agsym_t *a);
+extern char *getv(Agraph_t *g, char *gne, Agsym_t *a);
 extern char *getv(Agnode_t *n, Agsym_t *a);
 extern char *getv(Agedge_t *e, Agsym_t *a);
 
@@ -121,7 +125,9 @@ extern Agnode_t *firstnode(Agedge_t *e);
 extern Agnode_t *nextnode(Agedge_t *e, Agnode_t *n);
 
 extern Agsym_t *firstattr(Agraph_t *g);
+extern Agsym_t *firstattr(Agraph_t *g, char *gne);
 extern Agsym_t *nextattr(Agraph_t *g, Agsym_t *a);
+extern Agsym_t *nextattr(Agraph_t *g, char *gne, Agsym_t *a);
 
 extern Agsym_t *firstattr(Agnode_t *n);
 extern Agsym_t *nextattr(Agnode_t *n, Agsym_t *a);