From 009c3847f004fda437dd5376a9452973b1cb913e Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Sat, 10 Jan 2015 16:10:35 +0100 Subject: Rework iterators * Advance to the next node when calling 'cmark_iter_next', not when calling 'cmark_iter_get_node'. * Add 'cmark_iter_get_event_type' accessor. * Allow deletion of nodes after an 'EXIT' event, or an 'ENTER' event for leaf nodes. --- api_test/main.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'api_test') diff --git a/api_test/main.c b/api_test/main.c index d2e41d3..af40a9f 100644 --- a/api_test/main.c +++ b/api_test/main.c @@ -319,6 +319,46 @@ iterator(test_batch_runner *runner) { cmark_node_free(doc); } +static void +iterator_delete(test_batch_runner *runner) { + static const char md[] = + "a *b* c\n" + "\n" + "* item1\n" + "* item2\n" + "\n" + "a `b` c\n" + "\n" + "* item1\n" + "* item2\n"; + cmark_node *doc = cmark_parse_document(md, sizeof(md) - 1); + cmark_iter *iter = cmark_iter_new(doc); + cmark_event_type ev_type; + + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cmark_node *node = cmark_iter_get_node(iter); + // Delete list, emph, and code nodes. + if ((ev_type == CMARK_EVENT_EXIT && + node->type == CMARK_NODE_LIST) || + (ev_type == CMARK_EVENT_EXIT && + node->type == CMARK_NODE_EMPH) || + (ev_type == CMARK_EVENT_ENTER && + node->type == CMARK_NODE_CODE)) { + cmark_node_free(node); + } + } + + char *html = cmark_render_html(doc, CMARK_OPT_DEFAULT); + static const char expected[] = + "

a c

\n" + "

a c

\n"; + STR_EQ(runner, html, expected, "iterate and delete nodes"); + + free(html); + cmark_iter_free(iter); + cmark_node_free(doc); +} + static void create_tree(test_batch_runner *runner) { @@ -630,6 +670,7 @@ int main() { accessors(runner); node_check(runner); iterator(runner); + iterator_delete(runner); create_tree(runner); hierarchy(runner); parser(runner); -- cgit v1.2.3