forked from GitHub/gf-core
handle nonExist in parse the tree visualization and reclaim memory
This commit is contained in:
@@ -12,6 +12,7 @@ PgfLinearizationGraphvizOutput::PgfLinearizationGraphvizOutput()
|
|||||||
internals = NULL;
|
internals = NULL;
|
||||||
leaves.n_nodes = 0;
|
leaves.n_nodes = 0;
|
||||||
leaves.nodes = NULL;
|
leaves.nodes = NULL;
|
||||||
|
nonexist = false;
|
||||||
|
|
||||||
meta = (PgfText*) malloc(sizeof(PgfText)+2);
|
meta = (PgfText*) malloc(sizeof(PgfText)+2);
|
||||||
meta->text[0] = '?';
|
meta->text[0] = '?';
|
||||||
@@ -20,6 +21,20 @@ PgfLinearizationGraphvizOutput::PgfLinearizationGraphvizOutput()
|
|||||||
|
|
||||||
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);
|
free(meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,6 +100,7 @@ void PgfLinearizationGraphvizOutput::end_phrase(PgfText *cat, int fid, PgfText *
|
|||||||
|
|
||||||
void PgfLinearizationGraphvizOutput::symbol_ne()
|
void PgfLinearizationGraphvizOutput::symbol_ne()
|
||||||
{
|
{
|
||||||
|
nonexist = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PgfLinearizationGraphvizOutput::symbol_bind()
|
void PgfLinearizationGraphvizOutput::symbol_bind()
|
||||||
@@ -174,6 +190,9 @@ void PgfLinearizationGraphvizOutput::generate_graphviz_level(PgfPrinter *printer
|
|||||||
|
|
||||||
PgfText *PgfLinearizationGraphvizOutput::generate_graphviz(PgfGraphvizOptions* opts)
|
PgfText *PgfLinearizationGraphvizOutput::generate_graphviz(PgfGraphvizOptions* opts)
|
||||||
{
|
{
|
||||||
|
if (nonexist)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
PgfPrinter printer(NULL, 0, NULL);
|
PgfPrinter printer(NULL, 0, NULL);
|
||||||
|
|
||||||
printer.puts("graph {\n");
|
printer.puts("graph {\n");
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ class PGF_INTERNAL_DECL PgfLinearizationGraphvizOutput : public PgfLinearization
|
|||||||
|
|
||||||
PgfText *meta;
|
PgfText *meta;
|
||||||
|
|
||||||
|
bool nonexist;
|
||||||
|
|
||||||
void generate_graphviz_level(PgfPrinter *printer, PgfGraphvizOptions* opts, ParseLevel *level);
|
void generate_graphviz_level(PgfPrinter *printer, PgfGraphvizOptions* opts, ParseLevel *level);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -1179,7 +1179,9 @@ graphvizParseTree c opts e =
|
|||||||
withForeignPtr marshaller $ \m ->
|
withForeignPtr marshaller $ \m ->
|
||||||
withGraphvizOptions opts $ \c_opts ->
|
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 ->
|
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 :: [Concr] -> GraphvizOptions -> Expr -> String
|
||||||
graphvizWordAlignment cs opts e = error "TODO: graphvizWordAlignment"
|
graphvizWordAlignment cs opts e = error "TODO: graphvizWordAlignment"
|
||||||
|
|||||||
Reference in New Issue
Block a user