#endif
}
else if (job->output_data) {
- if (len > job->output_data_allocated - job->output_data_position) {
- job->output_data_allocated = (job->output_data_position + len + PAGE_ALIGN) & ~PAGE_ALIGN;
+ if (len > job->output_data_allocated - (job->output_data_position + 1)) {
+ /* ensure enough allocation for string = null terminator */
+ job->output_data_allocated = (job->output_data_position + len + 1 + PAGE_ALIGN) & ~PAGE_ALIGN;
job->output_data = realloc(job->output_data, job->output_data_allocated);
if (!job->output_data) {
fprintf(stderr, "failure realloc'ing for result string\n");
}
memcpy(job->output_data + job->output_data_position, s, len);
job->output_data_position += len;
+ job->output_data[job->output_data_position] = '\0'; /* keep null termnated */
return len;
}
else
extern char *xml_url_string(char *str);
/* SVG dash array */
-static char *sdarray = "5,2";
+static char *sdasharray = "5,2";
/* SVG dot array */
static char *sdotarray = "1,5";
if (obj->penwidth != PENWIDTH_NORMAL)
gvdevice_printf(job, ";stroke-width:%g", obj->penwidth);
if (obj->pen == PEN_DASHED) {
- gvdevice_printf(job, ";stroke-dasharray:%s", sdarray);
+ gvdevice_printf(job, ";stroke-dasharray:%s", sdasharray);
} else if (obj->pen == PEN_DOTTED) {
gvdevice_printf(job, ";stroke-dasharray:%s", sdotarray);
}
#include "graph.h"
#include "types.h" /* need the SVG font name schemes */
-/* highlight flag */
-#define HIGHLIGHT 1
-#define NOHIGHLIGHT 0
-
typedef enum { FORMAT_TK, } format_type;
static char *tkgen_string(char *s)
}
}
-static void tkgen_print_tags(GVJ_t *job, int tag)
+static void tkgen_print_tags(GVJ_t *job)
{
char *ObjType;
unsigned int ObjId;
switch (obj->emit_state) {
case EMIT_NDRAW:
- case EMIT_NLABEL:
ObjType = "node";
ObjId = obj->u.n->id;
break;
+ case EMIT_NLABEL:
+ ObjType = "node label";
+ ObjId = obj->u.n->id;
+ break;
case EMIT_EDRAW:
case EMIT_TDRAW:
case EMIT_HDRAW:
+ ObjType = "edge";
+ ObjId = obj->u.e->id;
+ break;
case EMIT_ELABEL:
case EMIT_TLABEL:
case EMIT_HLABEL:
- ObjType = "edge";
+ ObjType = "edge label";
ObjId = obj->u.e->id;
break;
case EMIT_GDRAW:
- case EMIT_GLABEL:
ObjType = "graph";
ObjId = -1; /* hack! */
break;
+ case EMIT_GLABEL:
+ ObjType = "graph label";
+ ObjId = -1; /* hack! */
+ break;
case EMIT_CDRAW:
- case EMIT_CLABEL:
ObjType = "cluster";
ObjId = obj->u.sg->meta_node->id;
break;
+ case EMIT_CLABEL:
+ ObjType = "cluster label";
+ ObjId = obj->u.sg->meta_node->id;
+ break;
default:
assert (0);
break;
}
- gvdevice_printf(job, " -tags {id%ld %s%s}", ObjId, ObjType, (tag?" highlight":""));
-}
-
-
-#if 0
-static void tkgen_grstyle(GVJ_t * job, int filled)
-{
- obj_state_t *obj = job->obj;
-
- gvdevice_fputs(job, " -fill ");
- if (filled)
- tkgen_print_color(job, obj->fillcolor);
- else
- gvdevice_fputs(job, "white");
- gvdevice_fputs(job, ";stroke:");
- tkgen_print_color(job, obj->pencolor);
- if (obj->penwidth != PENWIDTH_NORMAL)
- gvdevice_printf(job, ";stroke-width:%g", obj->penwidth);
- if (obj->pen == PEN_DASHED) {
- gvdevice_printf(job, ";stroke-dasharray:%s", sdarray);
- } else if (obj->pen == PEN_DOTTED) {
- gvdevice_printf(job, ";stroke-dasharray:%s", sdotarray);
- }
- gvdevice_fputs(job, ";\"");
+ gvdevice_printf(job, " -tags {id%ld %s}", ObjId, ObjType);
}
-#endif
static void tkgen_comment(GVJ_t * job, char *str)
{
{
obj_state_t *obj = job->obj;
- gvdevice_fputs(job, "$c create text ");
- p.y -= para->fontsize * 0.5; /* cl correction */
- gvdevice_printpointf(job, p);
- gvdevice_fputs(job, " -text {");
- gvdevice_fputs(job, para->str);
- gvdevice_fputs(job, "}");
- gvdevice_fputs(job, " -fill ");
- tkgen_print_color(job, obj->pencolor);
- gvdevice_fputs(job, " -font {");
- gvdevice_fputs(job, para->fontname);
- gvdevice_printf(job, " %g}", para->fontsize);
- switch (para->just) {
- case 'l':
- gvdevice_fputs(job, " -anchor w");
- break;
- case 'r':
- gvdevice_fputs(job, " -anchor e");
- break;
- default:
- case 'n':
- break;
+ if (obj->pen != PEN_NONE) {
+ gvdevice_fputs(job, "$c create text ");
+ p.y -= para->fontsize * 0.5; /* cl correction */
+ gvdevice_printpointf(job, p);
+ gvdevice_fputs(job, " -text {");
+ gvdevice_fputs(job, para->str);
+ gvdevice_fputs(job, "}");
+ gvdevice_fputs(job, " -fill ");
+ tkgen_print_color(job, obj->pencolor);
+ gvdevice_fputs(job, " -font {");
+ gvdevice_fputs(job, para->fontname);
+ gvdevice_printf(job, " %g}", para->fontsize);
+ switch (para->just) {
+ case 'l':
+ gvdevice_fputs(job, " -anchor w");
+ break;
+ case 'r':
+ gvdevice_fputs(job, " -anchor e");
+ break;
+ default:
+ case 'n':
+ break;
+ }
+ gvdevice_fputs(job, " -state disabled");
+ tkgen_print_tags(job);
+ gvdevice_fputs(job, "\n");
}
- gvdevice_fputs(job, " -state disabled");
- tkgen_print_tags(job, NOHIGHLIGHT);
- gvdevice_fputs(job, "\n");
}
static void tkgen_ellipse(GVJ_t * job, pointf * A, int filled)
obj_state_t *obj = job->obj;
pointf r;
-// if (cstk[SP].pen != P_NONE) {
- /* A[] contains 2 points: the center and top right corner. */
- r.x = A[1].x - A[0].x;
- r.y = A[1].y - A[0].y;
+ if (obj->pen != PEN_NONE) {
+ /* A[] contains 2 points: the center and top right corner. */
+ r.x = A[1].x - A[0].x;
+ r.y = A[1].y - A[0].y;
A[0].x -= r.x;
A[0].y -= r.y;
gvdevice_fputs(job, "$c create oval ");
gvdevice_printpointflist(job, A, 2);
gvdevice_fputs(job, " -fill ");
if (filled)
- tkgen_print_color(job, obj->fillcolor);
+ tkgen_print_color(job, obj->fillcolor);
else /* tk ovals default to no fill, some fill
is necessary else "canvas find overlapping" doesn't
work as expected, use white instead */
gvdevice_printnum(job, obj->penwidth);
gvdevice_fputs(job, " -outline ");
tkgen_print_color(job, obj->pencolor);
-#if 0
- if (cstk[SP].pen == P_DOTTED)
- tkgen_append_attribute("-dash", "2");
- if (cstk[SP].pen == P_DASHED)
- tkgen_append_attribute("-dash", "5");
-#endif
- tkgen_print_tags(job, HIGHLIGHT);
+ if (obj->pen == PEN_DASHED)
+ gvdevice_fputs(job, " -dash 5");
+ if (obj->pen == PEN_DOTTED)
+ gvdevice_fputs(job, " -dash 2");
+ tkgen_print_tags(job);
gvdevice_fputs(job, "\n");
-// }
+ }
}
static void
{
obj_state_t *obj = job->obj;
- gvdevice_fputs(job, "$c create line ");
- gvdevice_printpointflist(job, A, n);
- gvdevice_fputs(job, " -fill ");
- tkgen_print_color(job, obj->pencolor);
- gvdevice_fputs(job, " -width ");
- gvdevice_printnum(job, obj->penwidth);
- gvdevice_fputs(job, " -smooth bezier");
- gvdevice_fputs(job, " -state disabled");
- tkgen_print_tags(job, NOHIGHLIGHT);
- gvdevice_fputs(job, "\n");
+ if (obj->pen != PEN_NONE) {
+ gvdevice_fputs(job, "$c create line ");
+ gvdevice_printpointflist(job, A, n);
+ gvdevice_fputs(job, " -fill ");
+ tkgen_print_color(job, obj->pencolor);
+ gvdevice_fputs(job, " -width ");
+ gvdevice_printnum(job, obj->penwidth);
+ if (obj->pen == PEN_DASHED)
+ gvdevice_fputs(job, " -dash 5");
+ if (obj->pen == PEN_DOTTED)
+ gvdevice_fputs(job, " -dash 2");
+ gvdevice_fputs(job, " -smooth bezier");
+ gvdevice_fputs(job, " -state disabled");
+ tkgen_print_tags(job);
+ gvdevice_fputs(job, "\n");
+ }
}
static void tkgen_polygon(GVJ_t * job, pointf * A, int n, int filled)
{
obj_state_t *obj = job->obj;
- gvdevice_fputs(job, "$c create polygon ");
- gvdevice_printpointflist(job, A, n);
- if (filled) {
- gvdevice_fputs(job, " -fill ");
- tkgen_print_color(job, obj->fillcolor);
+ if (obj->pen != PEN_NONE) {
+ gvdevice_fputs(job, "$c create polygon ");
+ gvdevice_printpointflist(job, A, n);
+ if (filled) {
+ gvdevice_fputs(job, " -fill ");
+ tkgen_print_color(job, obj->fillcolor);
+ }
+ gvdevice_fputs(job, " -width ");
+ gvdevice_printnum(job, obj->penwidth);
+ gvdevice_fputs(job, " -outline ");
+ tkgen_print_color(job, obj->pencolor);
+ if (obj->pen == PEN_DASHED)
+ gvdevice_fputs(job, " -dash 5");
+ if (obj->pen == PEN_DOTTED)
+ gvdevice_fputs(job, " -dash 2");
+ gvdevice_fputs(job, " -state disabled");
+ tkgen_print_tags(job);
+ gvdevice_fputs(job, "\n");
}
- gvdevice_fputs(job, " -outline ");
- tkgen_print_color(job, obj->pencolor);
- gvdevice_fputs(job, " -width ");
- gvdevice_printnum(job, obj->penwidth);
- gvdevice_fputs(job, " -state disabled");
- tkgen_print_tags(job, NOHIGHLIGHT);
- gvdevice_fputs(job, "\n");
}
static void tkgen_polyline(GVJ_t * job, pointf * A, int n)
{
obj_state_t *obj = job->obj;
- gvdevice_fputs(job, "$c create line ");
- gvdevice_printpointflist(job, A, n);
- gvdevice_fputs(job, " -fill ");
- tkgen_print_color(job, obj->pencolor);
- gvdevice_fputs(job, " -state disabled");
- tkgen_print_tags(job, NOHIGHLIGHT);
- gvdevice_fputs(job, "\n");
+ if (obj->pen != PEN_NONE) {
+ gvdevice_fputs(job, "$c create line ");
+ gvdevice_printpointflist(job, A, n);
+ gvdevice_fputs(job, " -fill ");
+ tkgen_print_color(job, obj->pencolor);
+ if (obj->pen == PEN_DASHED)
+ gvdevice_fputs(job, " -dash 5");
+ if (obj->pen == PEN_DOTTED)
+ gvdevice_fputs(job, " -dash 2");
+ gvdevice_fputs(job, " -state disabled");
+ tkgen_print_tags(job);
+ gvdevice_fputs(job, "\n");
+ }
}
gvrender_engine_t tkgen_engine = {
#include "gvc.h"
extern void gv_binding_init(GVC_t *gvc);
+static char emptystring[] = {'\0'};
static GVC_t *gvc;
static void gv_init(void) {
- gvc = gvContext();
- gv_binding_init(gvc);
+ gvc = gvContext();
+ gv_binding_init(gvc);
}
Agraph_t *graph(char *name)
{
- if (!gvc) gv_init();
+ if (!gvc)
+ gv_init();
return agopen(name, AGRAPH);
}
Agraph_t *digraph(char *name)
{
- if (!gvc) gv_init();
+ if (!gvc)
+ gv_init();
return agopen(name, AGDIGRAPH);
}
Agraph_t *strictgraph(char *name)
{
- if (!gvc) gv_init();
+ if (!gvc)
+ gv_init();
return agopen(name, AGRAPHSTRICT);
}
Agraph_t *strictdigraph(char *name)
{
- if (!gvc) gv_init();
+ if (!gvc)
+ gv_init();
return agopen(name, AGDIGRAPHSTRICT);
}
Agraph_t *readstring(char *string)
{
- if (!gvc) gv_init();
+ if (!gvc)
+ gv_init();
return agmemread(string);
}
Agraph_t *read(FILE *f)
{
- if (!gvc) gv_init();
+ if (!gvc)
+ gv_init();
return agread(f);
}
Agraph_t *g;
f = fopen(filename, "r");
- if (!f) return NULL;
- if (!gvc) gv_init();
+ if (!f)
+ return NULL;
+ if (!gvc)
+ gv_init();
g = agread(f);
fclose(f);
return g;
//-------------------------------------------------
Agraph_t *graph(Agraph_t *g, char *name)
{
- if (!gvc) gv_init();
+ if (!gvc)
+ gv_init();
return agsubg(g, name);
}
{
// creating a protonode is not permitted
if (!gvc || (name[0] == '\001' && strcmp (name, "\001proto") == 0))
- return NULL;
+ return NULL;
return agnode(g, name);
}
if (!gvc || !t || !h
|| (t->name[0] == '\001' && strcmp (t->name, "\001proto") == 0)
|| (h->name[0] == '\001' && strcmp (h->name, "\001proto") == 0))
- return NULL;
+ return NULL;
return agedge(t->graph, t, h);
}
char *val, *hs;
if (!obj || !a)
- return "";
+ return emptystring;
val = agxget(obj, a->index);
if (!val)
- return "";
+ return emptystring;
if (a->name[0] == 'l' && strcmp(a->name, "label") == 0 && aghtmlstr(val)) {
- len = strlen(val);
- hs = (char*)malloc(len + 3);
- hs[0] = '<';
- strcpy(hs+1, val);
- hs[len+1] = '>';
- hs[len+2] = '\0';
- return hs;
+ len = strlen(val);
+ hs = (char*)malloc(len + 3);
+ hs[0] = '<';
+ strcpy(hs+1, val);
+ hs[len+1] = '>';
+ hs[len+2] = '\0';
+ return hs;
}
return val;
}
Agsym_t *a;
if (!g || !attr)
- return NULL;
+ return NULL;
a = agfindattr(g->root, attr);
return myagxget(g, a);
}
char *hs;
if (a->name[0] == 'l' && val[0] == '<' && strcmp(a->name, "label") == 0) {
- len = strlen(val);
- if (val[len-1] == '>') {
- hs = strdup(val+1);
- *(hs+len-2) = '\0';
- val = agstrdup_html(hs);
- free(hs);
- }
+ len = strlen(val);
+ if (val[len-1] == '>') {
+ hs = strdup(val+1);
+ *(hs+len-2) = '\0';
+ val = agstrdup_html(hs);
+ free(hs);
+ }
}
agxset(obj, a->index, val);
}
char *setv(Agraph_t *g, Agsym_t *a, char *val)
{
if (!g || !a || !val)
- return NULL;
+ return NULL;
myagxset(g, a, val);
return val;
}
Agsym_t *a;
if (!g || !attr || !val)
- return NULL;
+ return NULL;
a = agfindattr(g->root, attr);
if (!a)
- a = agraphattr(g->root, attr, "");
+ a = agraphattr(g->root, attr, emptystring);
myagxset(g, a, val);
return val;
}
Agsym_t *a;
if (!n || !attr)
- return NULL;
+ return NULL;
g = n->graph->root;
a = agfindattr(g->proto->n, attr);
return myagxget(n, a);
char *setv(Agnode_t *n, Agsym_t *a, char *val)
{
if (!n || !a || !val)
- return NULL;
+ return NULL;
myagxset(n, a, val);
return val;
}
Agsym_t *a;
if (!n || !attr || !val)
- return NULL;
+ return NULL;
g = n->graph->root;
a = agfindattr(g->proto->n, attr);
if (!a)
- a = agnodeattr(g, attr, "");
+ a = agnodeattr(g, attr, emptystring);
myagxset(n, a, val);
return val;
}
Agsym_t *a;
if (!e || !attr)
- return NULL;
+ return NULL;
g = e->tail->graph;
a = agfindattr(g->proto->e, attr);
return myagxget(e, a);
char *setv(Agedge_t *e, Agsym_t *a, char *val)
{
if (!e || !a || !val)
- return NULL;
+ return NULL;
myagxset(e, a, val);
return val;
}
Agsym_t *a;
if (!e || !attr || !val)
- return NULL;
+ return NULL;
g = e->tail->graph->root;
a = agfindattr(g->proto->e, attr);
if (!a)
- a = agedgeattr(g, attr, "");
+ a = agedgeattr(g, attr, emptystring);
myagxset(e, a, val);
return val;
}
Agraph_t *findsubg(Agraph_t *g, char *name)
{
if (!g || !name)
- return NULL;
+ return NULL;
return agfindsubg(g, name);
}
Agnode_t *findnode(Agraph_t *g, char *name)
{
if (!g || !name)
- return NULL;
+ return NULL;
return agfindnode(g, name);
}
Agedge_t *findedge(Agnode_t *t, Agnode_t *h)
{
if (!t || !h)
- return NULL;
+ return NULL;
return agfindedge(t->graph, t, h);
}
Agsym_t *findattr(Agraph_t *g, char *name)
{
if (!g || !name)
- return NULL;
+ return NULL;
return agfindattr(g, name);
}
Agsym_t *findattr(Agnode_t *n, char *name)
{
if (!n || !name)
- return NULL;
+ return NULL;
return agfindattr(n, name);
}
Agsym_t *findattr(Agedge_t *e, char *name)
{
if (!e || !name)
- return NULL;
+ return NULL;
return agfindattr(e, name);
}
Agnode_t *headof(Agedge_t *e)
{
if (!e)
- return NULL;
+ return NULL;
return e->head;
}
Agnode_t *tailof(Agedge_t *e)
{
if (!e)
- return NULL;
+ return NULL;
return e->tail;
}
Agraph_t *graphof(Agraph_t *g)
{
if (!g || g == g->root)
- return NULL;
+ return NULL;
return g->root;
}
Agraph_t *graphof(Agedge_t *e)
{
if (!e)
- return NULL;
+ return NULL;
return e->tail->graph;
}
Agraph_t *graphof(Agnode_t *n)
{
if (!n)
- return NULL;
+ return NULL;
return n->graph;
}
Agraph_t *rootof(Agraph_t *g)
{
if (!g)
- return NULL;
+ return NULL;
return g->root;
}
char *nameof(Agraph_t *g)
{
if (!g)
- return NULL;
+ return NULL;
return g->name;
}
char *nameof(Agnode_t *n)
{
if (!n)
- return NULL;
+ return NULL;
return n->name;
}
//char *nameof(Agedge_t *e)
//{
// if (!e)
-// return NULL;
+// return NULL;
// return e->name;
//}
char *nameof(Agsym_t *a)
{
if (!a)
- return NULL;
+ return NULL;
return a->name;
}
bool ok(Agraph_t *g)
{
if (!g)
- return false;
+ return false;
return true;
}
bool ok(Agnode_t *n)
{
if (!n)
- return false;
+ return false;
return true;
}
bool ok(Agedge_t *e)
{
if (!e)
- return false;
+ return false;
return true;
}
bool ok(Agsym_t *a)
{
if (!a)
- return false;
+ return false;
return true;
}
//-------------------------------------------------
Agedge_t *e;
if (!g)
- return NULL;
+ return NULL;
n = g->meta_node;
if (!n)
- return NULL;
+ return NULL;
mg = n->graph;
if (!mg)
- return NULL;
+ return NULL;
e = agfstout(mg, n);
if (!e)
- return NULL;
+ return NULL;
return agusergraph(e->head);
}
Agedge_t *e;
if (!g || !sg)
- return NULL;
+ return NULL;
ng = g->meta_node;
nsg = sg->meta_node;
if (!ng || !nsg)
- return NULL;
+ return NULL;
mg = ng->graph;
if (!mg)
- return NULL;
+ return NULL;
e = agfindedge(mg, ng, nsg);
if (!e)
- return NULL;
+ return NULL;
e = agnxtout(mg, e);
if (!e)
- return NULL;
+ return NULL;
return agusergraph(e->head);
}
Agedge_t *e;
if (!g)
- return NULL;
+ return NULL;
n = g->meta_node;
if (!n)
- return NULL;
+ return NULL;
mg = n->graph;
if (!mg)
- return NULL;
+ return NULL;
e = agfstin(mg, n);
if (!e)
- return NULL;
+ return NULL;
return agusergraph(e->tail);
}
Agedge_t *e;
if (!g || !sg)
- return NULL;
+ return NULL;
ng = g->meta_node;
nsg = sg->meta_node;
if (!ng || !nsg)
- return NULL;
+ return NULL;
mg = ng->graph;
if (!mg)
- return NULL;
+ return NULL;
e = agfindedge(mg, nsg, ng);
if (!e)
- return NULL;
+ return NULL;
e = agnxtin(mg, e);
if (!e)
- return NULL;
+ return NULL;
return agusergraph(e->tail);
}
Agnode_t *n;
if (!g)
- return NULL;
+ return NULL;
n = agfstnode(g);
if (!n)
- return NULL;
+ return NULL;
return agfstout(g, n);
}
Agedge_t *ne;
if (!g || !e)
- return NULL;
+ return NULL;
ne = agnxtout(g, e);
if (ne)
- return (ne);
+ return (ne);
n = agnxtnode(g, e->tail);
if (!n)
- return NULL;
+ return NULL;
return agfstout(g, n);
}
Agedge_t *firstedge(Agraph_t *g)
{
if (!g)
- return NULL;
+ return NULL;
return firstout(g);
}
Agedge_t *nextedge(Agraph_t *g, Agedge_t *e)
{
if (!g || !e)
- return NULL;
+ return NULL;
return nextout(g, e);
}
Agedge_t *firstout(Agnode_t *n)
{
if (!n)
- return NULL;
+ return NULL;
return agfstout(n->graph, n);
}
Agedge_t *nextout(Agnode_t *n, Agedge_t *e)
{
if (!n || !e)
- return NULL;
+ return NULL;
return agnxtout(n->graph, e);
}
Agedge_t *e;
if (!n)
- return NULL;
+ return NULL;
e = agfstout(n->graph, n);
if (!e)
- return NULL;
+ return NULL;
return e->head;
}
Agedge_t *e;
if (!n || !h)
- return NULL;
+ return NULL;
e = agfindedge(n->graph, n, h);
if (!e)
- return NULL;
+ return NULL;
do {
- e = agnxtout(n->graph, e);
- if (!e)
- return NULL;
+ e = agnxtout(n->graph, e);
+ if (!e)
+ return NULL;
} while (e->head == h);
return e->head;
}
Agedge_t *firstedge(Agnode_t *n)
{
if (!n)
- return NULL;
+ return NULL;
return agfstedge(n->graph, n);
}
Agedge_t *nextedge(Agnode_t *n, Agedge_t *e)
{
if (!n || !e)
- return NULL;
+ return NULL;
return agnxtedge(n->graph, e, n);
}
Agnode_t *n;
if (!g)
- return NULL;
+ return NULL;
n = agfstnode(g);
if (!n)
- return NULL;
+ return NULL;
return agfstin(g, n);
}
Agedge_t *ne;
if (!g || !e)
- return NULL;
+ return NULL;
ne = agnxtin(g, e);
if (ne)
- return (ne);
+ return (ne);
n = agnxtnode(g, e->head);
if (!n)
- return NULL;
+ return NULL;
return agfstin(g, n);
}
Agedge_t *firstin(Agnode_t *n)
{
if (!n)
- return NULL;
+ return NULL;
return agfstin(n->graph, n);
}
Agedge_t *nextin(Agnode_t *n, Agedge_t *e)
{
if (!n || !e)
- return NULL;
+ return NULL;
return agnxtin(n->graph, e);
}
Agedge_t *e;
if (!n)
- return NULL;
+ return NULL;
e = agfstin(n->graph, n);
if (!e)
- return NULL;
+ return NULL;
return e->tail;
}
Agedge_t *e;
if (!n || !t)
- return NULL;
+ return NULL;
e = agfindedge(n->graph, t, n);
if (!e)
- return NULL;
+ return NULL;
do {
- e = agnxtout(n->graph, e);
- if (!e)
- return NULL;
+ e = agnxtout(n->graph, e);
+ if (!e)
+ return NULL;
} while (e->tail == t);
return e->tail;
}
Agnode_t *firstnode(Agraph_t *g)
{
if (!g)
- return NULL;
+ return NULL;
return agfstnode(g);
}
Agnode_t *nextnode(Agraph_t *g, Agnode_t *n)
{
if (!g || !n)
- return NULL;
+ return NULL;
return agnxtnode(g, n);
}
Agnode_t *firstnode(Agedge_t *e)
{
if (!e)
- return NULL;
+ return NULL;
return e->tail;
}
Agnode_t *nextnode(Agedge_t *e, Agnode_t *n)
{
if (!e || n != e->tail)
- return NULL;
+ return NULL;
return e->head;
}
Agsym_t *firstattr(Agraph_t *g)
{
if (!g)
- return NULL;
+ return NULL;
g = g->root;
if (dtsize(g->univ->globattr->dict) == 0)
- return NULL;
+ return NULL;
return g->univ->globattr->list[0];
}
return NULL;
g = g->root;
for (i = 0; i < dtsize(g->univ->globattr->dict); i++)
- if (a == g->univ->globattr->list[i])
- break;
+ if (a == g->univ->globattr->list[i])
+ break;
i++;
if (i > dtsize(g->univ->globattr->dict))
return NULL;
Agraph_t *g;
if (!n)
- return NULL;
+ return NULL;
g = n->graph;
if (dtsize(g->univ->nodeattr->dict) == 0)
- return NULL;
+ return NULL;
return g->univ->nodeattr->list[0];
}
return NULL;
g = n->graph;
for (i = 0; i < dtsize(g->univ->nodeattr->dict); i++)
- if (a == g->univ->nodeattr->list[i])
- break;
+ if (a == g->univ->nodeattr->list[i])
+ break;
i++;
if (i > dtsize(g->univ->nodeattr->dict))
return NULL;
Agraph_t *g;
if (!e)
- return NULL;
+ return NULL;
g = e->tail->graph;
if (dtsize(g->univ->edgeattr->dict) == 0)
- return NULL;
+ return NULL;
return g->univ->edgeattr->list[0];
}
return NULL;
g = e->tail->graph;
for (i = 0; i < dtsize(g->univ->edgeattr->dict); i++)
- if (a == g->univ->edgeattr->list[i])
- break;
+ if (a == g->univ->edgeattr->list[i])
+ break;
i++;
if (i > dtsize(g->univ->edgeattr->dict))
return NULL;
{
Agedge_t *e;
+ if (!g)
+ return false;
if (g->meta_node) {
- for (e = agfstout(g->meta_node->graph, g->meta_node); e;
- e = agnxtout(g->meta_node->graph, e)) {
- rm(agusergraph(e->head));
+ for (e = agfstout(g->meta_node->graph, g->meta_node); e;
+ e = agnxtout(g->meta_node->graph, e)) {
+ rm(agusergraph(e->head));
}
if (g == g->root) {
agclose(g);
} else {
agdelete(g->meta_node->graph, g->meta_node);
}
- return true;
+ return true;
}
fprintf(stderr, "subgraph has no meta_node\n");
return false;
bool rm(Agnode_t *n)
{
+ if (!n)
+ return false;
// removal of the protonode is not permitted
if (n->name[0] == '\001' && strcmp (n->name, "\001proto") ==0)
- return false;
+ return false;
agdelete(n->graph, n);
return true;
}
bool rm(Agedge_t *e)
{
+ if (!e)
+ return false;
// removal of the protoedge is not permitted
if ((e->head->name[0] == '\001' && strcmp (e->head->name, "\001proto") == 0)
|| (e->tail->name[0] == '\001' && strcmp (e->tail->name, "\001proto") == 0))
- return false;
+ return false;
agdelete(e->head->graph->root, e);
return true;
}
{
int err;
+ if (!g)
+ return false;
err = gvFreeLayout(gvc, g); /* ignore errors */
err = gvLayout(gvc, g, engine);
return (! err);
// annotate the graph with layout information
bool render(Agraph_t *g)
{
+ if (!g)
+ return false;
attach_attrs(g);
return true;
}
{
int err;
+ if (!g)
+ return false;
err = gvRenderFilename(gvc, g, format, filename);
return (! err);
}
{
int err;
+ if (!g)
+ return false;
err = gvRender(gvc, g, format, stdout);
return (! err);
}
{
int err;
+ if (!g)
+ return false;
err = gvRender(gvc, g, format, f);
return (! err);
}
-// render to a data string
+ // render to a data string
char* renderdata(Agraph_t *g, char *format)
{
int err;
char *data;
- unsigned int length;
-
+ unsigned int length;
+
+ if (!g)
+ return NULL;
err = gvRenderData(gvc, g, format, &data, &length);
- if (err) return NULL;
- data = (char*)realloc(data, length + 1);
- if (data) data[length] = '\0';
+ if (err)
+ return NULL;
+ data = (char*)realloc(data, length + 1);
return data;
}
{
int err;
+ if (!g)
+ return false;
err = agwrite(g, f);
return (! err);
}
FILE *f;
int err;
+ if (!g)
+ return false;
f = fopen(filename, "w");
- if (!f) return false;
+ if (!f)
+ return false;
err = agwrite(g, f);
fclose(f);
return (! err);