]> granicus.if.org Git - graphviz/commitdiff
merge strdup_and_subst_*() into strdup_and_subst_obj()
authorellson <devnull@localhost>
Tue, 29 Aug 2006 20:01:23 +0000 (20:01 +0000)
committerellson <devnull@localhost>
Tue, 29 Aug 2006 20:01:23 +0000 (20:01 +0000)
lib/common/emit.c
lib/common/htmltable.c
lib/common/input.c
lib/common/labels.c
lib/common/render.h
lib/common/utils.c
lib/gvc/gvevent.c

index 9ee5bbdb74e76f8cac36ea102a384c56f732cf2e..bbfbc2e3dd69a51ccab93043548f5b5a8c604488 100644 (file)
@@ -91,36 +91,12 @@ static void doHTMLdata(htmldata_t * dp, point p, void *obj)
 {
     char *url = NULL, *target = NULL, *title = NULL;
     pointf p1, p2;
-    int havetitle = 0;
 
-    if ((url = dp->href) && url[0]) {
-        switch (agobjkind(obj)) {
-        case AGGRAPH:
-            url = strdup_and_subst_graph(url, (graph_t *) obj);
-            break;
-        case AGNODE:
-            url = strdup_and_subst_node(url, (node_t *) obj);
-            break;
-        case AGEDGE:
-            url = strdup_and_subst_edge(url, (edge_t *) obj);
-            break;
-        }
-    }
+    if ((url = dp->href) && url[0])
+        url = strdup_and_subst_obj(url, obj);
     target = dp->target;
-    if ((title = dp->title) && title[0]) {
-        havetitle++;
-        switch (agobjkind(obj)) {
-        case AGGRAPH:
-            title = strdup_and_subst_graph(title, (graph_t *) obj);
-            break;
-        case AGNODE:
-            title = strdup_and_subst_node(title, (node_t *) obj);
-            break;
-        case AGEDGE:
-            title = strdup_and_subst_edge(title, (edge_t *) obj);
-            break;
-        }
-    }
+    if ((title = dp->title) && title[0])
+       title = strdup_and_subst_obj(title, obj);
     if (url || title) {
         p1.x = p.x + dp->box.LL.x;
         p1.y = p.y + dp->box.LL.y;
@@ -1000,11 +976,11 @@ static void emit_begin_node(GVJ_t * job, node_t * n)
     }
     if ((flags & GVRENDER_DOES_MAPS)
         && (((s = agget(n, "href")) && s[0]) || ((s = agget(n, "URL")) && s[0]))) {
-        obj->url = strdup_and_subst_node(s, n);
+        obj->url = strdup_and_subst_obj(s, (void*)n);
     }
     if (flags & GVRENDER_DOES_TOOLTIPS) {
         if ((s = agget(n, "tooltip")) && s[0]) {
-            obj->tooltip = strdup_and_subst_node(s, n);
+            obj->tooltip = strdup_and_subst_obj(s, (void*)n);
             obj->explicit_tooltip = true;
         }
         else {
@@ -1012,7 +988,7 @@ static void emit_begin_node(GVJ_t * job, node_t * n)
         }
     }
     if ((flags & GVRENDER_DOES_TARGETS) && ((s = agget(n, "target")) && s[0])) {
-        obj->target = strdup_and_subst_node(s, n);
+        obj->target = strdup_and_subst_obj(s, (void*)n);
     }
     if ((flags & (GVRENDER_DOES_MAPS | GVRENDER_DOES_TOOLTIPS))
            && (obj->url || obj->explicit_tooltip)) {
@@ -1572,45 +1548,45 @@ static void emit_begin_edge(GVJ_t * job, edge_t * e)
 
     if (flags & GVRENDER_DOES_MAPS) {
         if (((s = agget(e, "href")) && s[0]) || ((s = agget(e, "URL")) && s[0]))
-            obj->url = strdup_and_subst_edge(s, e);
+            obj->url = strdup_and_subst_obj(s, (void*)e);
        if (((s = agget(e, "tailhref")) && s[0]) || ((s = agget(e, "tailURL")) && s[0]))
-            obj->tailurl = strdup_and_subst_edge(s, e);
+            obj->tailurl = strdup_and_subst_obj(s, (void*)e);
        else if (obj->url)
            obj->tailurl = strdup(obj->url);
        if (((s = agget(e, "headhref")) && s[0]) || ((s = agget(e, "headURL")) && s[0]))
-            obj->headurl = strdup_and_subst_edge(s, e);
+            obj->headurl = strdup_and_subst_obj(s, (void*)e);
        else if (obj->url)
            obj->headurl = strdup(obj->url);
     } 
 
     if (flags & GVRENDER_DOES_TARGETS) {
         if ((s = agget(e, "target")) && s[0])
-            obj->target = strdup_and_subst_edge(s, e);
+            obj->target = strdup_and_subst_obj(s, (void*)e);
         if ((s = agget(e, "tailtarget")) && s[0])
-            obj->tailtarget = strdup_and_subst_edge(s, e);
+            obj->tailtarget = strdup_and_subst_obj(s, (void*)e);
        else if (obj->target)
            obj->tailtarget = strdup(obj->target);
         if ((s = agget(e, "headtarget")) && s[0])
-            obj->headtarget = strdup_and_subst_edge(s, e);
+            obj->headtarget = strdup_and_subst_obj(s, (void*)e);
        else if (obj->target)
            obj->headtarget = strdup(obj->target);
     } 
 
     if (flags & GVRENDER_DOES_TOOLTIPS) {
         if ((s = agget(e, "tooltip")) && s[0]) {
-            obj->tooltip = strdup_and_subst_edge(s, e);
+            obj->tooltip = strdup_and_subst_obj(s, (void*)e);
            obj->explicit_tooltip = true;
        }
        else if (obj->label)
            obj->tooltip = strdup(obj->label);
         if ((s = agget(e, "tailtooltip")) && s[0]) {
-            obj->tailtooltip = strdup_and_subst_edge(s, e);
+            obj->tailtooltip = strdup_and_subst_obj(s, (void*)e);
            obj->explicit_tailtooltip = true;
        }
        else if (obj->taillabel)
            obj->tailtooltip = strdup(obj->taillabel);
         if ((s = agget(e, "headtooltip")) && s[0]) {
-            obj->headtooltip = strdup_and_subst_edge(s, e);
+            obj->headtooltip = strdup_and_subst_obj(s, (void*)e);
            obj->explicit_headtooltip = true;
        }
        else if (obj->headlabel)
@@ -2105,11 +2081,11 @@ static void emit_begin_graph(GVJ_t * job, graph_t * g)
     if ((flags & GVRENDER_DOES_MAPS)
         && (((s = agget(g, "href")) && s[0])
             || ((s = agget(g, "URL")) && s[0]))) {
-        obj->url = strdup_and_subst_graph(s, g);
+        obj->url = strdup_and_subst_obj(s, (void*)g);
     }
     if (flags & GVRENDER_DOES_TOOLTIPS) {
         if ((s = agget(g, "tooltip")) && s[0]) {
-            obj->tooltip = strdup_and_subst_graph(s, g);
+            obj->tooltip = strdup_and_subst_obj(s, (void*)g);
             obj->explicit_tooltip = true;
         }
         else if (obj->url && obj->label) {
@@ -2117,7 +2093,7 @@ static void emit_begin_graph(GVJ_t * job, graph_t * g)
         }
     }
     if ((flags & GVRENDER_DOES_TARGETS) && ((s = agget(g, "target")) && s[0])) {
-        obj->target = strdup_and_subst_graph(s, g);
+        obj->target = strdup_and_subst_obj(s, (void*)g);
     }
 
 #ifdef WITH_CODEGENS
@@ -2282,14 +2258,14 @@ static void emit_begin_cluster(GVJ_t * job, Agraph_t * sg)
     }
     if ((flags & GVRENDER_DOES_MAPS)
         && (((s = agget(sg, "href")) && s[0]) || ((s = agget(sg, "URL")) && s[0])))
-        obj->url = strdup_and_subst_graph(s, sg);
+        obj->url = strdup_and_subst_obj(s, (void*)sg);
 
     if ((flags & GVRENDER_DOES_TARGETS) && ((s = agget(sg, "target")) && s[0]))
-        obj->target = strdup_and_subst_graph(s, sg);
+        obj->target = strdup_and_subst_obj(s, (void*)sg);
 
     if (flags & GVRENDER_DOES_TOOLTIPS) {
         if ((s = agget(sg, "tooltip")) && s[0]) {
-            obj->tooltip = strdup_and_subst_graph(s, sg);
+            obj->tooltip = strdup_and_subst_obj(s, (void*)sg);
             obj->explicit_tooltip = true;
         }
         else if (obj->label) {
index 9e620929de11ac3959b2c564c60598dd2350d32b..f04a1b73240f476d2fc37218f598c7910160cec6 100644 (file)
@@ -631,24 +631,6 @@ int html_path(node_t * n, port* p, int side, box * rv, int *k)
     return 0;
 }
 
-static char*
-substrGFn (char* s, htmlenv_t* env)
-{
-    return strdup_and_subst_graph(s, (Agraph_t *) (env->obj));
-}
-
-static char*
-substrNFn (char* s, htmlenv_t* env)
-{
-    return strdup_and_subst_node(s, (Agnode_t *) (env->obj));
-}
-
-static char*
-substrEFn (char* s, htmlenv_t* env)
-{
-    return strdup_and_subst_edge(s, (Agedge_t *) (env->obj));
-}
-
 static int 
 size_html_txt(graph_t *g, htmltxt_t* ftxt, htmlenv_t* env)
 {
@@ -658,25 +640,10 @@ size_html_txt(graph_t *g, htmltxt_t* ftxt, htmlenv_t* env)
     int i, j, w = 0, width = 0;
     char *fname;
     textpara_t lp;
-    char* (*substrFn) (char*, htmlenv_t* env);
-
-    switch (agobjkind(env->obj)) {
-    case AGGRAPH:
-       substrFn = substrGFn;
-       break;
-    case AGNODE:
-       substrFn = substrNFn;
-       break;
-    case AGEDGE:
-       substrFn = substrEFn;
-       break;
-    default:
-       substrFn = NULL;
-    }
 
     for (i = 0; i < ftxt->nparas; i++) {
        for (j = 0; j < ftxt->paras[i].nitems; j++) {
-           lp.str = substrFn (ftxt->paras[i].items[j].str, env);
+           lp.str = strdup_and_subst_obj (ftxt->paras[i].items[j].str, env->obj);
            if (ftxt->paras[i].items[j].font) {
                if (ftxt->paras[i].items[j].font->size > 0)
                    fsize = ftxt->paras[i].items[j].font->size;
index 97bc0c5c66418aa78c2cfb885219c95f040f1d6d..2ee60b5e3e4d00b67f6540aa6370ecaeeea61b78 100644 (file)
@@ -752,7 +752,7 @@ void do_graph_label(graph_t * sg)
        pointf dimen;
 
        GD_has_labels(sg->root) |= GRAPH_LABEL;
-       GD_label(sg) = make_label(sg->root, html, strdup_and_subst_graph(p, sg),
+       GD_label(sg) = make_label(sg->root, html, strdup_and_subst_obj(p, (void*)sg),
                                  late_double(sg,
                                              agfindattr(sg, "fontsize"),
                                              DEFAULT_FONTSIZE, MIN_FONTSIZE),
index 375bb5e6ca13da9cfbf0c807f75ae04858ddd43d..09c4dd15264be8c7e370bfddface22251c434afe 100644 (file)
@@ -231,63 +231,37 @@ void emit_label(GVJ_t * job, emit_state_t emit_state, textlabel_t * lp)
     obj->emit_state = old_emit_state;
 }
 
-
-char *strdup_and_subst_graph(char *str, Agraph_t * g)
+char *strdup_and_subst_obj(char *str, void *obj)
 {
     char c, *s, *p, *t, *newstr;
-    char *g_str = NULL;
-    int g_len = 0, newlen = 0;
-
-    /* two passes over str.
-     *
-     * first pass prepares substitution strings and computes 
-     * total length for newstring required from malloc.
-     */
-    for (s = str; (c = *s++);) {
-       if (c == '\\') {
-           switch (c = *s++) {
-           case 'G':
-               if (!g_str) {
-                   g_str = g->name;
-                   g_len = strlen(g_str);
-               }
-               newlen += g_len;
-               break;
-           default:
-               newlen += 2;
-           }
-       } else {
-           newlen++;
-       }
-    }
-    /* allocate new string */
-    newstr = gmalloc(newlen + 1);
-
-    /* second pass over str assembles new string */
-    for (s = str, p = newstr; (c = *s++);) {
-       if (c == '\\') {
-           switch (c = *s++) {
-           case 'G':
-               for (t = g_str; (*p = *t++); p++);
-               break;
+    char *g_str = "\\G", *n_str = "\\N", *e_str = "\\E", *h_str = "\\H", *t_str = "\\T";
+    int g_len = 2, n_len = 2, e_len = 2, h_len = 2, t_len = 2, newlen = 0;
 
-           default:
-               *p++ = '\\';
-               *p++ = c;
-           }
-       } else {
-           *p++ = c;
-       }
+    switch (agobjkind(obj)) {
+       case AGGRAPH:
+           g_str = ((graph_t *)obj)->name;
+           g_len = strlen(g_str);
+           break;
+       case AGNODE:
+           g_str = ((node_t *)obj)->graph->name;
+           g_len = strlen(g_str);
+           n_str = ((node_t *)obj)->name;
+           n_len = strlen(n_str);
+           break;
+       case AGEDGE:
+           g_str = ((edge_t *)obj)->tail->graph->root->name;
+           g_len = strlen(g_str);
+           t_str = ((edge_t *)obj)->tail->name;
+           t_len = strlen(t_str);
+           h_str = ((edge_t *)obj)->head->name;
+           h_len = strlen(h_str);
+           if (((edge_t *)obj)->tail->graph->root->kind & AGFLAG_DIRECTED)
+               e_str = "->";
+           else
+               e_str = "--";
+           e_len = t_len + 2 + h_len;
+           break;
     }
-    *p++ = '\0';
-    return newstr;
-}
-
-char *strdup_and_subst_node(char *str, Agnode_t * n)
-{
-    char c, *s, *p, *t, *newstr;
-    char *g_str = NULL, *n_str = NULL;
-    int g_len = 0, n_len = 0, newlen = 0;
 
     /* two passes over str.
      *
@@ -298,103 +272,20 @@ char *strdup_and_subst_node(char *str, Agnode_t * n)
        if (c == '\\') {
            switch (c = *s++) {
            case 'G':
-               if (!g_str) {
-                   g_str = n->graph->name;
-                   g_len = strlen(g_str);
-               }
                newlen += g_len;
                break;
            case 'N':
-               if (!n_str) {
-                   n_str = n->name;
-                   n_len = strlen(n_str);
-               }
                newlen += n_len;
                break;
-           default:
-               newlen += 2;
-           }
-       } else {
-           newlen++;
-       }
-    }
-    /* allocate new string */
-    newstr = gmalloc(newlen + 1);
-
-    /* second pass over str assembles new string */
-    for (s = str, p = newstr; (c = *s++);) {
-       if (c == '\\') {
-           switch (c = *s++) {
-           case 'G':
-               for (t = g_str; (*p = *t++); p++);
-               break;
-
-           case 'N':
-               for (t = n_str; (*p = *t++); p++);
-               break;
-           default:
-               *p++ = '\\';
-               *p++ = c;
-           }
-       } else {
-           *p++ = c;
-       }
-    }
-    *p++ = '\0';
-    return newstr;
-}
-
-char *strdup_and_subst_edge(char *str, Agedge_t * e)
-{
-    char c, *s, *p, *t, *newstr;
-    char *g_str = NULL, *e_str = NULL, *h_str = NULL, *t_str = NULL;
-    int g_len = 0, e_len = 0, h_len = 0, t_len = 0, newlen = 0;
-
-    /* two passes over str.
-     *
-     * first pass prepares substitution strings and computes 
-     * total length for newstring required from malloc.
-     */
-    for (s = str; (c = *s++);) {
-       if (c == '\\') {
-           switch (c = *s++) {
-           case 'G':
-               if (!g_str) {
-                   g_str = e->tail->graph->root->name;
-                   g_len = strlen(g_str);
-               }
-               newlen += g_len;
-               break;
            case 'E':
-               if (!e_str) {
-                   t_str = e->tail->name;
-                   t_len = strlen(t_str);
-                   h_str = e->head->name;
-                   h_len = strlen(h_str);
-                   if (e->tail->graph->root->kind & AGFLAG_DIRECTED)
-                       e_str = "->";
-                   else
-                       e_str = "--";
-                   e_len = t_len + 2 + h_len;
-               }
                newlen += e_len;
                break;
            case 'H':
-               if (!h_str) {
-                   h_str = e->head->name;
-                   h_len = strlen(h_str);
-               }
                newlen += h_len;
                break;
            case 'T':
-               if (!t_str) {
-                   t_str = e->tail->name;
-                   t_len = strlen(t_str);
-               }
                newlen += t_len;
                break;
-           default:
-               newlen += 2;
            }
        } else {
            newlen++;
@@ -410,20 +301,20 @@ char *strdup_and_subst_edge(char *str, Agedge_t * e)
            case 'G':
                for (t = g_str; (*p = *t++); p++);
                break;
+           case 'N':
+               for (t = n_str; (*p = *t++); p++);
+               break;
            case 'E':
                for (t = t_str; (*p = *t++); p++);
                for (t = e_str; (*p = *t++); p++);
                for (t = h_str; (*p = *t++); p++);
                break;
-           case 'H':
-               for (t = h_str; (*p = *t++); p++);
-               break;
            case 'T':
                for (t = t_str; (*p = *t++); p++);
                break;
-           default:
-               *p++ = '\\';
-               *p++ = c;
+           case 'H':
+               for (t = h_str; (*p = *t++); p++);
+               break;
            }
        } else {
            *p++ = c;
index 4b61d246bf9b66345e9d20db8c40ca776693df75..d285ed1cd403a6d457a83aaea7faa9ae6ab7244e 100644 (file)
@@ -114,9 +114,7 @@ extern "C" {
                           Agsym_t * (*fun) (Agraph_t *, char *, char *));
     extern int gvRenderJobs (GVC_t * gvc, graph_t * g);
     extern bool isPolygon(node_t *);
-    extern char *strdup_and_subst_graph(char *str, Agraph_t * g);
-    extern char *strdup_and_subst_node(char *str, Agnode_t * n);
-    extern char *strdup_and_subst_edge(char *str, Agedge_t * e);
+    extern char *strdup_and_subst_obj(char *str, void *obj);
     extern char *xml_string(char *s);
     extern void makeSelfEdge(path *, edge_t **, int, int, int, int,
                             splineInfo *);
index 500cb6cfa69ef97ad11d426c73f376ac302c05c4..e4fce06f48851536c9413cada8553ba89b8064dd 100644 (file)
@@ -621,7 +621,7 @@ void common_init_node(node_t * n)
     if (html)
        str = strdup(str);
     else
-       str = strdup_and_subst_node(str, n);
+       str = strdup_and_subst_obj(str, (void*)n);
     ND_label(n) = make_label(sg->root, html, str,
                late_double(n, N_fontsize, DEFAULT_FONTSIZE, MIN_FONTSIZE),
                late_nnstring(n, N_fontname, DEFAULT_FONTNAME),
@@ -727,7 +727,7 @@ int common_init_edge(edge_t * e)
        if (html)
            s = strdup(s);
        else
-           s = strdup_and_subst_edge(s, e);
+           s = strdup_and_subst_obj(s, (void*)e);
        initFontEdgeAttr(e, &fi);
        ED_label(e) = make_label(sg->root, html, s,
                                fi.fontsize, fi.fontname, fi.fontcolor);
@@ -747,7 +747,7 @@ int common_init_edge(edge_t * e)
        if (html)
            s = strdup(s);
        else
-           s = strdup_and_subst_edge(s, e);
+           s = strdup_and_subst_obj(s, (void*)e);
        initFontLabelEdgeAttr(e, &fi, &lfi);
        ED_head_label(e) = make_label(sg->root, html, s,
                                lfi.fontsize, lfi.fontname, lfi.fontcolor);
@@ -762,7 +762,7 @@ int common_init_edge(edge_t * e)
        if (html)
            s = strdup(s);
        else
-           s = strdup_and_subst_edge(s, e);
+           s = strdup_and_subst_obj(s, (void*)e);
        if (!lfi.fontname)
            initFontLabelEdgeAttr(e, &fi, &lfi);
        ED_tail_label(e) = make_label(sg->root, html, s,
index a397e10ae51d8fe631eede1f1aacec831accb820..4cd4e2d3d942086bece37463dd51d4f24fd43c53 100644 (file)
@@ -25,9 +25,7 @@
 #include "gvcint.h"
 #include "gvcproc.h"
 
-extern char *strdup_and_subst_graph(char *str, Agraph_t * g);
-extern char *strdup_and_subst_edge(char *str, Agedge_t * e);
-extern char *strdup_and_subst_node(char *str, Agnode_t * n);
+extern char *strdup_and_subst_obj(char *str, void * n);
 extern void emit_graph(GVJ_t * job, graph_t * g);
 extern bool overlap_edge(edge_t *e, boxf b);
 extern bool overlap_node(node_t *n, boxf b);
@@ -84,7 +82,7 @@ static void gv_graph_state(GVJ_t *job, graph_t *g)
     if (!a)
        a = agfindattr(g->root, s_URL);
     if (a)
-       job->selected_href = strdup_and_subst_graph(agxget(g, a->index), g);
+       job->selected_href = strdup_and_subst_obj(agxget(g, a->index), (void*)g);
 }
 
 static void gv_node_state(GVJ_t *job, node_t *n)
@@ -113,7 +111,7 @@ static void gv_node_state(GVJ_t *job, node_t *n)
     if (!a)
         a = agfindattr(n->graph->proto->n, s_URL);
     if (a)
-       job->selected_href = strdup_and_subst_node(agxget(n, a->index), n);
+       job->selected_href = strdup_and_subst_obj(agxget(n, a->index), (void*)n);
 }
 
 static void gv_edge_state(GVJ_t *job, edge_t *e)
@@ -168,7 +166,7 @@ static void gv_edge_state(GVJ_t *job, edge_t *e)
     if (!a)
        a = agfindattr(e->head->graph->proto->e, s_URL);
     if (a)
-       job->selected_href = strdup_and_subst_edge(agxget(e, a->index), e);
+       job->selected_href = strdup_and_subst_obj(agxget(e, a->index), (void*)e);
 }
 
 static void gvevent_refresh(GVJ_t * job)
@@ -266,21 +264,21 @@ static void gvevent_enter_obj(GVJ_t * job)
            GD_gui_state(g) |= GUI_STATE_ACTIVE;
            a = agfindattr(g->root, s_tooltip);
            if (a)
-               job->active_tooltip = strdup_and_subst_graph(agxget(g, a->index), g);
+               job->active_tooltip = strdup_and_subst_obj(agxget(g, a->index), obj);
            break;
         case AGNODE:
            n = (node_t*)obj;
            ND_gui_state(n) |= GUI_STATE_ACTIVE;
            a = agfindattr(n->graph->proto->n, s_tooltip);
            if (a)
-               job->active_tooltip = strdup_and_subst_node(agxget(n, a->index), n);
+               job->active_tooltip = strdup_and_subst_obj(agxget(n, a->index), obj);
            break;
         case AGEDGE:
            e = (edge_t*)obj;
            ED_gui_state(e) |= GUI_STATE_ACTIVE;
            a = agfindattr(e->head->graph->proto->e, s_tooltip);
            if (a)
-               job->active_tooltip = strdup_and_subst_edge(agxget(e, a->index), e);
+               job->active_tooltip = strdup_and_subst_obj(agxget(e, a->index), obj);
            break;
         }
     }