From: ellson Date: Tue, 29 Aug 2006 20:01:23 +0000 (+0000) Subject: merge strdup_and_subst_*() into strdup_and_subst_obj() X-Git-Tag: LAST_LIBGRAPH~32^2~5926 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e62bb366d2c31834a70454363608502330bb4a5f;p=graphviz merge strdup_and_subst_*() into strdup_and_subst_obj() --- diff --git a/lib/common/emit.c b/lib/common/emit.c index 9ee5bbdb7..bbfbc2e3d 100644 --- a/lib/common/emit.c +++ b/lib/common/emit.c @@ -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) { diff --git a/lib/common/htmltable.c b/lib/common/htmltable.c index 9e620929d..f04a1b732 100644 --- a/lib/common/htmltable.c +++ b/lib/common/htmltable.c @@ -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; diff --git a/lib/common/input.c b/lib/common/input.c index 97bc0c5c6..2ee60b5e3 100644 --- a/lib/common/input.c +++ b/lib/common/input.c @@ -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), diff --git a/lib/common/labels.c b/lib/common/labels.c index 375bb5e6c..09c4dd152 100644 --- a/lib/common/labels.c +++ b/lib/common/labels.c @@ -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; diff --git a/lib/common/render.h b/lib/common/render.h index 4b61d246b..d285ed1cd 100644 --- a/lib/common/render.h +++ b/lib/common/render.h @@ -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 *); diff --git a/lib/common/utils.c b/lib/common/utils.c index 500cb6cfa..e4fce06f4 100644 --- a/lib/common/utils.c +++ b/lib/common/utils.c @@ -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, diff --git a/lib/gvc/gvevent.c b/lib/gvc/gvevent.c index a397e10ae..4cd4e2d3d 100644 --- a/lib/gvc/gvevent.c +++ b/lib/gvc/gvevent.c @@ -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; } }