@@ -67,6 +67,11 @@ Graphviz::Graphviz(int yInvert, int nop)
6767{
6868 Y_invert = yInvert > 0 ? yInvert : origYInvert;
6969 Nop = nop > 0 ? nop : origNop;
70+
71+ lastErrorStr[0 ] = ' \0 ' ;
72+ agseterr (AGERR);
73+ agseterrf (vizErrorf);
74+ agreadline (1 );
7075}
7176
7277Graphviz::~Graphviz ()
@@ -86,127 +91,84 @@ void Graphviz::createFile(const char *path, const char *data)
8691 path, data);
8792}
8893
89- const char *Graphviz::lastResult ()
90- {
91- return m_result.c_str ();
92- }
93-
9494const char *Graphviz::layout (const char *src, const char *format, const char *engine)
9595{
96- lastErrorStr[0 ] = ' \0 ' ;
97- m_result = " " ;
98-
99- // const auto demand_loading = false;
100- // auto gvc = std::make_shared<GVC::GVContext>(lt_preloaded_symbols, demand_loading);
101- // auto g = std::make_shared<CGraph::AGraph>(dot);
102- // const auto layout = GVC::GVLayout(gvc, g, engine);
103- // const auto result = layout.render(format);
104- // m_result = result.string_view();
105-
106- // return m_result.c_str();
96+ layout_result = " " ;
10797
10898 GVC_t *gvc = gvContextPlugins (lt_preloaded_symbols, true );
10999
110- agseterr (AGERR);
111- agseterrf (vizErrorf);
112-
113- agreadline (1 );
114-
115- Agraph_t *graph;
116- char *data = NULL ;
117- unsigned int length;
118- while ((graph = agmemread (src)))
100+ Agraph_t *graph = agmemread (src);
101+ if (graph)
119102 {
120- if (data == NULL )
121- {
122- gvLayout (gvc, graph, engine);
123- gvRenderData (gvc, graph, format, &data, &length);
124- gvFreeLayout (gvc, graph);
125- }
126-
103+ char *data = NULL ;
104+ unsigned int length;
105+
106+ gvLayout (gvc, graph, engine);
107+ gvRenderData (gvc, graph, format, &data, &length);
108+ layout_result = data;
109+ gvFreeRenderData (data);
110+ gvFreeLayout (gvc, graph);
127111 agclose (graph);
128-
129- src = " " ;
130112 }
131- m_result = data;
132- gvFreeRenderData (data);
133113
134114 gvFinalize (gvc);
135115 gvFreeContext (gvc);
136116
137- return m_result. c_str () ;
117+ return layout_result ;
138118}
139119
140120bool Graphviz::acyclic (const char *src, bool doWrite, bool verbose)
141121{
142- lastErrorStr[0 ] = ' \0 ' ;
143- acyclic_outFile_buff = " " ;
144- acyclic_outFile = acyclic_outFile_buff.c_str ();
122+ acyclic_outFile = " " ;
145123 acyclic_num_rev = 0 ;
146124 bool retVal = false ;
147- Agraph_t *g = agmemread (src);
148- if (g)
125+
126+ Agraph_t *graph = agmemread (src);
127+ if (graph)
149128 {
150- FILE * outFile = fopen ( " tmp.dot " , " w " ) ;
129+ TempFileBuffer outFile;
151130 graphviz_acyclic_options_t opts = {outFile, doWrite, verbose};
152- retVal = graphviz_acyclic (g, &opts, &acyclic_num_rev);
153- fclose (outFile);
154- std::ifstream file (" tmp.dot" );
155- std::string graph_str ((std::istreambuf_iterator<char >(file)), std::istreambuf_iterator<char >());
156- remove (" tmp.dot" );
157- acyclic_outFile_buff = graph_str;
158- acyclic_outFile = acyclic_outFile_buff.c_str ();
131+ retVal = graphviz_acyclic (graph, &opts, &acyclic_num_rev);
132+ acyclic_outFile = outFile;
133+ agclose (graph);
159134 }
160135 return retVal;
161136}
162137
163138void Graphviz::tred (const char *src, bool verbose, bool printRemovedEdges)
164139{
165- lastErrorStr[0 ] = ' \0 ' ;
166- tred_out_buff = " " ;
167- tred_out = tred_out_buff.c_str ();
168- tred_err_buff = " " ;
169- tred_err = tred_err_buff.c_str ();
170- Agraph_t *g = agmemread (src);
171- if (g)
140+ tred_out = " " ;
141+ tred_err = " " ;
142+
143+ Agraph_t *graph = agmemread (src);
144+ if (graph)
172145 {
173- FILE *outFile = fopen (" tmp.dot" , " w" );
174- FILE *errFile = fopen (" tmp_err.dot" , " w" );
175- graphviz_tred_options_t opts = {verbose, printRemovedEdges, outFile, errFile};
176- graphviz_tred (g, &opts);
177- fclose (outFile);
178- std::ifstream file (" tmp.dot" );
179- std::string outFile_str ((std::istreambuf_iterator<char >(file)), std::istreambuf_iterator<char >());
180- remove (" tmp.dot" );
181- tred_out_buff = outFile_str;
182- tred_out = tred_out_buff.c_str ();
183- std::ifstream file_err (" tmp_err.dot" );
184- std::string errFile_str ((std::istreambuf_iterator<char >(file_err)), std::istreambuf_iterator<char >());
185- remove (" tmp_err.dot" );
186- tred_err_buff = errFile_str;
187- tred_err = tred_err_buff.c_str ();
146+ TempFileBuffer out;
147+ TempFileBuffer err;
148+ graphviz_tred_options_t opts = {verbose, printRemovedEdges, out, err};
149+ graphviz_tred (graph, &opts);
150+ tred_out = out;
151+ tred_err = err;
152+ agclose (graph);
188153 }
189154}
190155
191156const char *Graphviz::unflatten (const char *src, int maxMinlen, bool do_fans, int chainLimit)
192157{
193- lastErrorStr[ 0 ] = ' \0 ' ;
194- m_result = " " ;
195- Agraph_t *g = agmemread (src);
196- if (g )
158+ unflatten_out = " " ;
159+
160+ Agraph_t *graph = agmemread (src);
161+ if (graph )
197162 {
198163 graphviz_unflatten_options_t opts = {do_fans, maxMinlen, chainLimit};
199- graphviz_unflatten (g, &opts);
200-
201- FILE *fp = fopen (" tmp.dot" , " w" );
202- agwrite (g, fp);
203- fclose (fp);
204- std::ifstream file (" tmp.dot" );
205- std::string graph_str ((std::istreambuf_iterator<char >(file)), std::istreambuf_iterator<char >());
206- remove (" tmp.dot" );
207- m_result = graph_str;
164+ graphviz_unflatten (graph, &opts);
165+
166+ TempFileBuffer tempFile;
167+ agwrite (graph, tempFile);
168+ unflatten_out = tempFile;
169+ agclose (graph);
208170 }
209- return m_result. c_str () ;
171+ return unflatten_out ;
210172}
211173
212174// Include JS Glue ---
0 commit comments