From: erg Date: Fri, 25 Aug 2006 22:32:50 +0000 (+0000) Subject: Implement gvRender to make a NULL stream mean no output; X-Git-Tag: LAST_LIBGRAPH~32^2~5934 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=860c67339c5a456e749e00746d44a62d86b4745c;p=graphviz Implement gvRender to make a NULL stream mean no output; change dot and xdot renderers to respect this meaning; fix some finalization in gvRender. --- diff --git a/lib/common/emit.c b/lib/common/emit.c index dee3464ed..3dcc38cdc 100644 --- a/lib/common/emit.c +++ b/lib/common/emit.c @@ -486,18 +486,18 @@ static void init_job_flags(GVJ_t * job, graph_t * g) { switch (job->output_lang) { case GVRENDER_PLUGIN: - job->flags = chkOrder(g) | job->render.features->flags; + job->flags |= chkOrder(g) | job->render.features->flags; break; case VTX: /* output sorted, i.e. all nodes then all edges */ - job->flags = EMIT_SORTED; + job->flags |= EMIT_SORTED; break; case DIA: /* output in preorder traversal of the graph */ - job->flags = EMIT_PREORDER; + job->flags |= EMIT_PREORDER; break; default: - job->flags = chkOrder(g); + job->flags |= chkOrder(g); break; } } diff --git a/lib/gvc/gvc.c b/lib/gvc/gvc.c index 37b3df92e..d464e0028 100644 --- a/lib/gvc/gvc.c +++ b/lib/gvc/gvc.c @@ -95,7 +95,6 @@ int gvRender(GVC_t *gvc, graph_t *g, char *format, FILE *out) /* create a job for the required format */ rc = gvjobs_output_langname(gvc, format); job = gvc->job; - firstjob = gvc->active_jobs; if (rc == NO_SUPPORT) { agerr (AGERR, "Renderer type: \"%s\" not recognized. Use one of:%s\n", format, gvplugin_list(gvc, API_render, format)); @@ -108,9 +107,14 @@ int gvRender(GVC_t *gvc, graph_t *g, char *format, FILE *out) return -1; } job->output_file = out; + if (out == NULL) + job->flags |= OUTPUT_NOT_REQUIRED; gvRenderJobs(gvc, g); - if (firstjob) + firstjob = gvc->active_jobs; + if (firstjob) { + gvrender_end_job(firstjob); gvdevice_finalize(firstjob); + } gvjobs_delete(gvc); return 0; @@ -120,13 +124,14 @@ int gvRender(GVC_t *gvc, graph_t *g, char *format, FILE *out) int gvRenderFilename(GVC_t *gvc, graph_t *g, char *format, char *filename) { int rc; - GVJ_t *job = gvc->job; - GVJ_t *firstjob = gvc->active_jobs; + GVJ_t *job; + GVJ_t *firstjob; g = g->root; /* create a job for the required format */ rc = gvjobs_output_langname(gvc, format); + job = gvc->job; if (rc == NO_SUPPORT) { agerr(AGERR, "Renderer type: \"%s\" not recognized. Use one of:%s\n", format, gvplugin_list(gvc, API_render, format)); return -1; @@ -139,8 +144,11 @@ int gvRenderFilename(GVC_t *gvc, graph_t *g, char *format, char *filename) } gvjobs_output_filename(gvc, filename); gvRenderJobs(gvc, g); - if (firstjob) + firstjob = gvc->active_jobs; + if (firstjob) { + gvrender_end_job(firstjob); gvdevice_finalize(firstjob); + } gvjobs_delete(gvc); return 0; diff --git a/lib/gvc/gvcjob.h b/lib/gvc/gvcjob.h index 2748c0765..eb872ec2f 100644 --- a/lib/gvc/gvcjob.h +++ b/lib/gvc/gvcjob.h @@ -63,6 +63,7 @@ extern "C" { #define GVRENDER_DOES_TARGETS (1<<20) #define GVRENDER_DOES_Z (1<<21) #define LAYOUT_NOT_REQUIRED (1<<22) +#define OUTPUT_NOT_REQUIRED (1<<23) typedef struct { int flags; diff --git a/lib/gvc/gvjobs.c b/lib/gvc/gvjobs.c index 5d19bdff2..1922d177d 100644 --- a/lib/gvc/gvjobs.c +++ b/lib/gvc/gvjobs.c @@ -154,4 +154,5 @@ void gvjobs_delete(GVC_t * gvc) } gvc->jobs = gvc->job = gvc->active_jobs = output_filename_job = output_langname_job = NULL; + gvc->common.viewNum = 0; } diff --git a/plugin/core/gvrender_core_dot.c b/plugin/core/gvrender_core_dot.c index 478398d29..c36930a04 100644 --- a/plugin/core/gvrender_core_dot.c +++ b/plugin/core/gvrender_core_dot.c @@ -158,11 +158,13 @@ static void dot_end_graph(GVJ_t *job) break; case FORMAT_DOT: case FORMAT_CANON: - agwrite(g, job->output_file); + if (!(job->flags & OUTPUT_NOT_REQUIRED)) + agwrite(g, job->output_file); break; case FORMAT_XDOT: extend_attrs(job, g, xbufs); - agwrite(g, job->output_file); + if (!(job->flags & OUTPUT_NOT_REQUIRED)) + agwrite(g, job->output_file); break; } }