* AT&T Research, Florham Park NJ *
**********************************************************/
+#include <string.h>
#include "gvc.h"
GVC_t *gvc;
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;
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)
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;
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)
{
if (!e || !attr)
return NULL;
- g = e->head->graph->root;
+ g = e->tail->graph;
a = agfindattr(g->proto->e, attr);
if (!a)
return "";
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, "");
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)
{
/* 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);
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);