]> granicus.if.org Git - graphviz/commitdiff
-Ttk plugin fixes
authorellson <devnull@localhost>
Sun, 27 Apr 2008 21:48:34 +0000 (21:48 +0000)
committerellson <devnull@localhost>
Sun, 27 Apr 2008 21:48:34 +0000 (21:48 +0000)
gv_tcl binding fixes

lib/gvc/gvdevice.c
plugin/core/gvrender_core_svg.c
plugin/core/gvrender_core_tk.c
tclpkg/gv/gv.cpp

index 0c4058afe1d3c961ccd9b2fc7694ba076b748a6e..ac0448b5474fa44119e4d4bd720a75ed95504a1b 100644 (file)
@@ -61,8 +61,9 @@ size_t gvdevice_write (GVJ_t * job, const unsigned char *s, unsigned int len)
 #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");
@@ -71,6 +72,7 @@ size_t gvdevice_write (GVJ_t * job, const unsigned char *s, unsigned int len)
        }
        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
index 7c57ff67a72b3844b15f93753586b4f9cc592737..544def77a0025fbe0b3c4473044ee32eebbc65b2 100644 (file)
@@ -47,7 +47,7 @@ extern char *xml_string(char *str);
 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";
 
@@ -98,7 +98,7 @@ static void svg_grstyle(GVJ_t * job, int filled)
     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);
     }
index d14e3952d2ca632be7acfb9c9652b88f2ff9110a..898689c284f0b8da82f657b5c751797298dc4432 100644 (file)
 #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)
@@ -61,7 +57,7 @@ static void tkgen_print_color(GVJ_t * job, gvcolor_t color)
     }
 }
 
-static void tkgen_print_tags(GVJ_t *job, int tag)
+static void tkgen_print_tags(GVJ_t *job)
 {
     char *ObjType;
     unsigned int ObjId;
@@ -69,59 +65,47 @@ static void tkgen_print_tags(GVJ_t *job, int tag)
 
     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)
 {
@@ -159,31 +143,33 @@ static void tkgen_textpara(GVJ_t * job, pointf p, textpara_t * para)
 {
     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)
@@ -191,17 +177,17 @@ 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 */
@@ -210,15 +196,13 @@ static void tkgen_ellipse(GVJ_t * job, pointf * A, int filled)
         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
@@ -227,48 +211,66 @@ tkgen_bezier(GVJ_t * job, pointf * A, int n, int arrow_at_start,
 {
     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 = {
index e43d31f8f1fa87ca9335b3f67020c30945f30a14..da22a57ed20c078502b9588e7188d3441bae12b2 100644 (file)
 #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);
 }
 
@@ -68,8 +75,10 @@ Agraph_t *read(char *filename)
     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;
@@ -78,7 +87,8 @@ Agraph_t *read(char *filename)
 //-------------------------------------------------
 Agraph_t *graph(Agraph_t *g, char *name)
 {
-    if (!gvc) gv_init();
+    if (!gvc)
+        gv_init();
     return agsubg(g, name);
 }
 
@@ -86,7 +96,7 @@ Agnode_t *node(Agraph_t *g, char *name)
 {
     // creating a protonode is not permitted
     if (!gvc || (name[0] == '\001' && strcmp (name, "\001proto") == 0))
-       return NULL;
+        return NULL;
     return agnode(g, name);
 }
 
@@ -96,7 +106,7 @@ Agedge_t *edge(Agnode_t *t, Agnode_t *h)
     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);
 }
 
@@ -125,18 +135,18 @@ static char* myagxget(void *obj, Agsym_t *a)
     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;
 }
@@ -149,7 +159,7 @@ char *getv(Agraph_t *g, char *attr)
     Agsym_t *a;
 
     if (!g || !attr)
-       return NULL;
+        return NULL;
     a = agfindattr(g->root, attr);
     return myagxget(g, a);
 }
@@ -159,20 +169,20 @@ static void myagxset(void *obj, Agsym_t *a, char *val)
     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;
 }
@@ -181,10 +191,10 @@ char *setv(Agraph_t *g, char *attr, char *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;
 }
@@ -199,7 +209,7 @@ char *getv(Agnode_t *n, char *attr)
     Agsym_t *a;
 
     if (!n || !attr)
-       return NULL;
+        return NULL;
     g = n->graph->root;
     a = agfindattr(g->proto->n, attr);
     return myagxget(n, a);
@@ -207,7 +217,7 @@ char *getv(Agnode_t *n, char *attr)
 char *setv(Agnode_t *n, Agsym_t *a, char *val)
 {
     if (!n || !a || !val)
-       return NULL;
+        return NULL;
     myagxset(n, a, val);
     return val;
 }
@@ -217,11 +227,11 @@ char *setv(Agnode_t *n, char *attr, char *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;
 }
@@ -236,7 +246,7 @@ char *getv(Agedge_t *e, char *attr)
     Agsym_t *a;
 
     if (!e || !attr)
-       return NULL;
+        return NULL;
     g = e->tail->graph;
     a = agfindattr(g->proto->e, attr);
     return myagxget(e, a);
@@ -244,7 +254,7 @@ char *getv(Agedge_t *e, char *attr)
 char *setv(Agedge_t *e, Agsym_t *a, char *val)
 {
     if (!e || !a || !val)
-       return NULL;
+        return NULL;
     myagxset(e, a, val);
     return val;
 }
@@ -254,11 +264,11 @@ char *setv(Agedge_t *e, char *attr, char *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;
 }
@@ -266,42 +276,42 @@ char *setv(Agedge_t *e, char *attr, char *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);
 }
 
@@ -310,42 +320,42 @@ Agsym_t *findattr(Agedge_t *e, char *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;
 }
 
@@ -368,25 +378,25 @@ Agedge_t *protoedge(Agraph_t *g)
 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;
 }
 
@@ -394,25 +404,25 @@ char *nameof(Agsym_t *a)
 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;
 }
 //-------------------------------------------------
@@ -423,16 +433,16 @@ Agraph_t *firstsubg(Agraph_t *g)
     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);
 }
 
@@ -443,20 +453,20 @@ Agraph_t *nextsubg(Agraph_t *g, Agraph_t *sg)
     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);
 }
 
@@ -467,16 +477,16 @@ Agraph_t *firstsupg(Agraph_t *g)
     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);
 }
 
@@ -487,20 +497,20 @@ Agraph_t *nextsupg(Agraph_t *g, Agraph_t *sg)
     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);
 }
 
@@ -509,10 +519,10 @@ Agedge_t *firstout(Agraph_t *g)
     Agnode_t *n;
 
     if (!g)
-       return NULL;
+        return NULL;
     n = agfstnode(g);
     if (!n)
-       return NULL;
+        return NULL;
     return agfstout(g, n);
 }
 
@@ -522,41 +532,41 @@ Agedge_t *nextout(Agraph_t *g, Agedge_t *e)
     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);
 }
 
@@ -565,10 +575,10 @@ Agnode_t *firsthead(Agnode_t *n)
     Agedge_t *e;
 
     if (!n)
-       return NULL;
+        return NULL;
     e = agfstout(n->graph, n);
     if (!e)
-       return NULL;
+        return NULL;
     return e->head;
 }
 
@@ -577,14 +587,14 @@ Agnode_t *nexthead(Agnode_t *n, Agnode_t *h)
     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;
 }
@@ -592,14 +602,14 @@ Agnode_t *nexthead(Agnode_t *n, Agnode_t *h)
 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); 
 } 
 
@@ -608,10 +618,10 @@ Agedge_t *firstin(Agraph_t *g)
     Agnode_t *n;
 
     if (!g)
-       return NULL;
+        return NULL;
     n = agfstnode(g);
     if (!n)
-       return NULL;
+        return NULL;
     return agfstin(g, n);
 }
 
@@ -621,27 +631,27 @@ Agedge_t *nextin(Agraph_t *g, Agedge_t *e)
     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);
 }
 
@@ -650,10 +660,10 @@ Agnode_t *firsttail(Agnode_t *n)
     Agedge_t *e;
 
     if (!n)
-       return NULL;
+        return NULL;
     e = agfstin(n->graph, n);
     if (!e)
-       return NULL;
+        return NULL;
     return e->tail;
 }
 
@@ -662,14 +672,14 @@ Agnode_t *nexttail(Agnode_t *n, Agnode_t *t)
     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;
 }
@@ -677,38 +687,38 @@ Agnode_t *nexttail(Agnode_t *n, Agnode_t *t)
 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];
 }
 
@@ -720,8 +730,8 @@ Agsym_t *nextattr(Agraph_t *g, Agsym_t *a)
         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;
@@ -733,10 +743,10 @@ Agsym_t *firstattr(Agnode_t *n)
     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];
 }
 
@@ -749,8 +759,8 @@ Agsym_t *nextattr(Agnode_t *n, Agsym_t *a)
         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;
@@ -762,10 +772,10 @@ Agsym_t *firstattr(Agedge_t *e)
     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];
 }
 
@@ -778,8 +788,8 @@ Agsym_t *nextattr(Agedge_t *e, Agsym_t *a)
         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;
@@ -790,17 +800,19 @@ bool rm(Agraph_t *g)
 {
     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;
@@ -808,19 +820,23 @@ bool rm(Agraph_t *g)
 
 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;
 }
@@ -829,6 +845,8 @@ bool layout(Agraph_t *g, char *engine)
 {
     int err;
 
+    if (!g)
+        return false;
     err = gvFreeLayout(gvc, g);  /* ignore errors */
     err = gvLayout(gvc, g, engine);
     return (! err);
@@ -837,6 +855,8 @@ bool layout(Agraph_t *g, char *engine)
 // annotate the graph with layout information
 bool render(Agraph_t *g)
 {
+    if (!g)
+        return false;
     attach_attrs(g);
     return true;
 }
@@ -846,6 +866,8 @@ bool render(Agraph_t *g, char *format, char *filename)
 {
     int err;
 
+    if (!g)
+        return false;
     err = gvRenderFilename(gvc, g, format, filename);
     return (! err);
 }
@@ -855,6 +877,8 @@ bool render(Agraph_t *g, char *format)
 {
     int err;
 
+    if (!g)
+        return false;
     err = gvRender(gvc, g, format, stdout);
     return (! err);
 }
@@ -864,21 +888,25 @@ bool render(Agraph_t *g, char *format, FILE *f)
 {
     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;
 }
 
@@ -886,6 +914,8 @@ bool write(Agraph_t *g, FILE *f)
 {
     int err;
 
+    if (!g)
+        return false;
     err = agwrite(g, f);
     return (! err);
 }
@@ -895,8 +925,11 @@ bool write(Agraph_t *g, char *filename)
     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);