diff --git a/src/runtime/c/pgf/graphviz.cxx b/src/runtime/c/pgf/graphviz.cxx index fc7e69a4c..4f0aa6e3e 100644 --- a/src/runtime/c/pgf/graphviz.cxx +++ b/src/runtime/c/pgf/graphviz.cxx @@ -12,6 +12,7 @@ PgfLinearizationGraphvizOutput::PgfLinearizationGraphvizOutput() internals = NULL; leaves.n_nodes = 0; leaves.nodes = NULL; + nonexist = false; meta = (PgfText*) malloc(sizeof(PgfText)+2); meta->text[0] = '?'; @@ -20,6 +21,20 @@ PgfLinearizationGraphvizOutput::PgfLinearizationGraphvizOutput() PgfLinearizationGraphvizOutput::~PgfLinearizationGraphvizOutput() { + for (size_t i = 0; i < n_internals; i++) { + ParseLevel *internal = internals[i]; + for (size_t j = 0; j < internal->n_nodes; j++) { + delete internal->nodes[j]; + } + delete(internal->nodes); + delete[] internal; + } + + for (size_t j = 0; j < leaves.n_nodes; j++) { + delete leaves.nodes[j]; + } + delete(leaves.nodes); + free(meta); } @@ -85,6 +100,7 @@ void PgfLinearizationGraphvizOutput::end_phrase(PgfText *cat, int fid, PgfText * void PgfLinearizationGraphvizOutput::symbol_ne() { + nonexist = true; } void PgfLinearizationGraphvizOutput::symbol_bind() @@ -174,6 +190,9 @@ void PgfLinearizationGraphvizOutput::generate_graphviz_level(PgfPrinter *printer PgfText *PgfLinearizationGraphvizOutput::generate_graphviz(PgfGraphvizOptions* opts) { + if (nonexist) + return NULL; + PgfPrinter printer(NULL, 0, NULL); printer.puts("graph {\n"); diff --git a/src/runtime/c/pgf/graphviz.h b/src/runtime/c/pgf/graphviz.h index 9d4430d24..425678298 100644 --- a/src/runtime/c/pgf/graphviz.h +++ b/src/runtime/c/pgf/graphviz.h @@ -28,6 +28,8 @@ class PGF_INTERNAL_DECL PgfLinearizationGraphvizOutput : public PgfLinearization PgfText *meta; + bool nonexist; + void generate_graphviz_level(PgfPrinter *printer, PgfGraphvizOptions* opts, ParseLevel *level); public: diff --git a/src/runtime/haskell/PGF2.hsc b/src/runtime/haskell/PGF2.hsc index 5d4fdd628..3b59e85d2 100644 --- a/src/runtime/haskell/PGF2.hsc +++ b/src/runtime/haskell/PGF2.hsc @@ -1179,7 +1179,9 @@ graphvizParseTree c opts e = withForeignPtr marshaller $ \m -> withGraphvizOptions opts $ \c_opts -> bracket (withPgfExn "graphvizParseTree" (pgf_graphviz_parse_tree (c_db c) c_revision c_e nullPtr m c_opts)) free $ \c_text -> - peekText c_text + if c_text == nullPtr + then return "" + else peekText c_text graphvizWordAlignment :: [Concr] -> GraphvizOptions -> Expr -> String graphvizWordAlignment cs opts e = error "TODO: graphvizWordAlignment"