diff options
Diffstat (limited to 'src/blocks.c')
-rw-r--r-- | src/blocks.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/blocks.c b/src/blocks.c index 7613c82..e8c9e94 100644 --- a/src/blocks.c +++ b/src/blocks.c @@ -252,12 +252,13 @@ static node_block* add_child(node_block* parent, return child; } + // Free a node_block list and any children. void cmark_free_nodes(node_block *e) { node_block * next; + node_block * tmp; while (e != NULL) { - next = e->next; free_inlines(e->inline_content); strbuf_free(&e->string_content); if (e->tag == BLOCK_FENCED_CODE) { @@ -265,7 +266,17 @@ void cmark_free_nodes(node_block *e) } else if (e->tag == BLOCK_DOCUMENT) { reference_map_free(e->as.document.refmap); } - cmark_free_nodes(e->children); + tmp = e->children; + if (tmp) { + // Find last child + while (tmp->next) { + tmp = tmp->next; + } + // Splice children into list + tmp->next = e->next; + e->next = e->children; + } + next = e->next; free(e); e = next; } |