From 3c9bdf645958a1c5b71cc9b96a5b711cca14224f Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Thu, 13 Nov 2014 10:11:46 -0800 Subject: Moved cmark_free_inlines from inlines to ast. --- src/ast.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- src/ast.h | 3 +++ src/inlines.c | 53 ----------------------------------------------------- src/inlines.h | 2 -- 4 files changed, 55 insertions(+), 56 deletions(-) diff --git a/src/ast.c b/src/ast.c index 8ccf184..2a9ca8f 100644 --- a/src/ast.c +++ b/src/ast.c @@ -2,7 +2,6 @@ #include #include "buffer.h" #include "ast.h" -#include "inlines.h" #include "references.h" // Free a node_block list and any children. @@ -28,3 +27,55 @@ void cmark_free_blocks(node_block *e) } } +// Utility function used by free_inlines +static void splice_into_list(node_inl* e, node_inl* children) { + node_inl * 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 an inline list. Avoid recursion to prevent stack overflows +// on deeply nested structures. +extern void free_inlines(node_inl* e) +{ + node_inl * next; + + while (e != NULL) { + switch (e->tag){ + case INL_STRING: + case INL_RAW_HTML: + case INL_CODE: + chunk_free(&e->content.literal); + break; + case INL_LINEBREAK: + case INL_SOFTBREAK: + break; + case INL_LINK: + case INL_IMAGE: + free(e->content.linkable.url); + free(e->content.linkable.title); + splice_into_list(e, e->content.linkable.label); + break; + case INL_EMPH: + case INL_STRONG: + splice_into_list(e, e->content.inlines); + break; + default: + fprintf(stderr, "[WARN] (%s:%d) Unknown inline tag %d", + __FILE__, __LINE__, e->tag); + break; + } + next = e->next; + free(e); + e = next; + } +} diff --git a/src/ast.h b/src/ast.h index f8e0345..5c3d298 100644 --- a/src/ast.h +++ b/src/ast.h @@ -102,6 +102,7 @@ struct cmark_node_block { typedef struct cmark_node_block cmark_node_block; void cmark_free_blocks(cmark_node_block *e); +void cmark_free_inlines(cmark_node_inl *e); #ifndef CMARK_NO_SHORT_NAMES #define node_inl cmark_node_inl @@ -129,6 +130,8 @@ void cmark_free_blocks(cmark_node_block *e); #define BLOCK_SETEXT_HEADER CMARK_BLOCK_SETEXT_HEADER #define BLOCK_HRULE CMARK_BLOCK_HRULE #define BLOCK_REFERENCE_DEF CMARK_BLOCK_REFERENCE_DEF + #define free_inlines cmark_free_inlines + #define free_blocks cmark_free_blocks #endif #endif diff --git a/src/inlines.c b/src/inlines.c index 6a4e70c..a8756ff 100644 --- a/src/inlines.c +++ b/src/inlines.c @@ -111,59 +111,6 @@ inline static node_inl* make_simple(int t) #define make_emph(contents) make_inlines(INL_EMPH, contents) #define make_strong(contents) make_inlines(INL_STRONG, contents) -// Utility function used by free_inlines -static void splice_into_list(node_inl* e, node_inl* children) { - node_inl * 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 an inline list. Avoid recursion to prevent stack overflows -// on deeply nested structures. -extern void free_inlines(node_inl* e) -{ - node_inl * next; - - while (e != NULL) { - switch (e->tag){ - case INL_STRING: - case INL_RAW_HTML: - case INL_CODE: - chunk_free(&e->content.literal); - break; - case INL_LINEBREAK: - case INL_SOFTBREAK: - break; - case INL_LINK: - case INL_IMAGE: - free(e->content.linkable.url); - free(e->content.linkable.title); - splice_into_list(e, e->content.linkable.label); - break; - case INL_EMPH: - case INL_STRONG: - splice_into_list(e, e->content.inlines); - break; - default: - fprintf(stderr, "[WARN] (%s:%d) Unknown inline tag %d", - __FILE__, __LINE__, e->tag); - break; - } - next = e->next; - free(e); - e = next; - } -} - // Append inline list b to the end of inline list a. // Return pointer to head of new list. inline static node_inl* append_inlines(node_inl* a, node_inl* b) diff --git a/src/inlines.h b/src/inlines.h index 6b3d4d4..fa61c8a 100644 --- a/src/inlines.h +++ b/src/inlines.h @@ -6,7 +6,6 @@ unsigned char *cmark_clean_autolink(cmark_chunk *url, int is_email); unsigned char *cmark_clean_title(cmark_chunk *title); cmark_node_inl* cmark_parse_inlines(cmark_strbuf *input, cmark_reference_map *refmap); -void cmark_free_inlines(cmark_node_inl* e); int cmark_parse_reference_inline(cmark_strbuf *input, cmark_reference_map *refmap); @@ -15,7 +14,6 @@ int cmark_parse_reference_inline(cmark_strbuf *input, cmark_reference_map *refma #define clean_autolink cmark_clean_autolink #define clean_title cmark_clean_title #define parse_inlines cmark_parse_inlines - #define free_inlines cmark_free_inlines #define parse_reference_inline cmark_parse_reference_inline #endif -- cgit v1.2.3