diff options
author | Nick Wellnhofer <wellnhofer@aevum.de> | 2014-11-17 21:41:10 +0100 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2014-11-17 21:43:47 -0800 |
commit | c38944d4565b6266b3ab1fd6fd576710fdec420b (patch) | |
tree | d1f4b71d29f028fa16808009c8083754a840ec3b /src/node.c | |
parent | 3554759dbe4a0cb937556226d621bb71efd188e7 (diff) |
Move cmark_free_nodes to node.c
Diffstat (limited to 'src/node.c')
-rw-r--r-- | src/node.c | 51 |
1 files changed, 51 insertions, 0 deletions
@@ -233,4 +233,55 @@ cmark_node_append_child(cmark_node *node, cmark_node *child) return 1; } +// Utility function used by cmark_free_nodes +static void splice_into_list(cmark_node* e, cmark_node* children) { + cmark_node * tmp; + if (children) { + tmp = children; + // Find last child + while (tmp->next) { + tmp = tmp->next; + } + // Splice children into list + tmp->next = e->next; + e->next = children; + } + return ; +} + +// Free a cmark_node list and any children. +void cmark_free_nodes(cmark_node *e) +{ + cmark_node *next; + while (e != NULL) { + strbuf_free(&e->string_content); + switch (e->type){ + case NODE_FENCED_CODE: + strbuf_free(&e->as.code.info); + break; + case NODE_STRING: + case NODE_INLINE_HTML: + case NODE_INLINE_CODE: + cmark_chunk_free(&e->as.literal); + break; + case NODE_LINK: + case NODE_IMAGE: + free(e->as.link.url); + free(e->as.link.title); + splice_into_list(e, e->as.link.label); + break; + default: + break; + } + if (e->last_child) { + // Splice children into list + e->last_child->next = e->next; + e->next = e->first_child; + } + next = e->next; + free(e); + e = next; + } +} + |