md4c

C Markdown parser. Fast. SAX-like interface. Compliant to CommonMark specification.
git clone https://noulin.net/git/md4c.git
Log | Files | Refs | README | LICENSE

commit c63909df8e97a5d5d29917e2ed1e1616ec0f2f61
parent 3c28a8b8dbe7315c46c83c13d2618ba1f3d35a4a
Author: Martin Mitas <mity@morous.org>
Date:   Wed,  4 Jan 2017 15:04:09 +0100

When splitting emphasis opener mark, we have to retain 'dummy' marks available for more splitting in the future (issue #15).

Diffstat:
Mmd4c/md4c.c | 52+++++++++++++++++++++++++++++-----------------------
Mtest/coverage.txt | 7+++++++
2 files changed, 36 insertions(+), 23 deletions(-)

diff --git a/md4c/md4c.c b/md4c/md4c.c @@ -2357,25 +2357,6 @@ md_rollback(MD_CTX* ctx, int opener_index, int closer_index, int how) } } -/* Split a longer mark into two. The new mark takes the given count of characters. - * May only be called if a dummy 'D' mark follows. - */ -static int -md_split_mark(MD_CTX* ctx, int mark_index, SZ n) -{ - MD_MARK* mark = &ctx->marks[mark_index]; - MD_MARK* dummy = &ctx->marks[mark_index + 1]; - - MD_ASSERT(mark->end - mark->beg > n); - MD_ASSERT(dummy->ch == 'D'); - - memcpy(dummy, mark, sizeof(MD_MARK)); - mark->end -= n; - dummy->beg = mark->end; - - return mark_index + 1; -} - static void md_build_mark_char_map(MD_CTX* ctx) { @@ -3133,6 +3114,27 @@ md_analyze_table_cell_boundary(MD_CTX* ctx, int mark_index) ctx->n_table_cell_boundaries++; } +/* Split a longer mark into two. The new mark takes the given count of + * characters. May only be called if an adequate number of dummy 'D' marks + * follows. + */ +static int +md_split_simple_pairing_mark(MD_CTX* ctx, int mark_index, SZ n) +{ + MD_MARK* mark = &ctx->marks[mark_index]; + int new_mark_index = mark_index + (mark->end - mark->beg - 1); + MD_MARK* dummy = &ctx->marks[new_mark_index]; + + MD_ASSERT(mark->end - mark->beg > n); + MD_ASSERT(dummy->ch == 'D'); + + memcpy(dummy, mark, sizeof(MD_MARK)); + mark->end -= n; + dummy->beg = mark->end; + + return new_mark_index; +} + static void md_analyze_simple_pairing_mark(MD_CTX* ctx, MD_MARKCHAIN* chain, int mark_index, int apply_rule_of_three) @@ -3159,10 +3161,10 @@ md_analyze_simple_pairing_mark(MD_CTX* ctx, MD_MARKCHAIN* chain, int mark_index, } if(opener_size > closer_size) { - opener_index = md_split_mark(ctx, opener_index, closer_size); + opener_index = md_split_simple_pairing_mark(ctx, opener_index, closer_size); md_mark_chain_append(ctx, chain, opener_index); } else if(opener_size < closer_size) { - md_split_mark(ctx, mark_index, closer_size - opener_size); + md_split_simple_pairing_mark(ctx, mark_index, closer_size - opener_size); } md_rollback(ctx, opener_index, mark_index, MD_ROLLBACK_CROSSING); @@ -3221,10 +3223,12 @@ md_analyze_permissive_url_autolink(MD_CTX* ctx, int mark_index) /* Ok. Lets call it auto-link. Adapt opener and create closer to zero * length so all the contents becomes the link text. */ - closer_index = md_split_mark(ctx, mark_index, 0); + closer_index = mark_index + 1; closer = &ctx->marks[closer_index]; + MD_ASSERT(closer->ch == 'D'); opener->end = opener->beg; + closer->ch = opener->ch; closer->beg = off; closer->end = off; md_resolve_range(ctx, NULL, mark_index, closer_index); @@ -3284,11 +3288,13 @@ md_analyze_permissive_email_autolink(MD_CTX* ctx, int mark_index) /* Ok. Lets call it auto-link. Adapt opener and create closer to zero * length so all the contents becomes the link text. */ - closer_index = md_split_mark(ctx, mark_index, 0); + closer_index = mark_index + 1; closer = &ctx->marks[closer_index]; + MD_ASSERT(closer->ch == 'D'); opener->beg = beg; opener->end = beg; + closer->ch = opener->ch; closer->beg = end; closer->end = end; md_resolve_range(ctx, NULL, mark_index, closer_index); diff --git a/test/coverage.txt b/test/coverage.txt @@ -86,6 +86,13 @@ x [link](/url "foo &ndash; bar") x <p>x <a href="/url" title="foo – bar">link</a> x</p> ```````````````````````````````` +### [Issue 15](https://github.com/mity/md4c/issues/15) +```````````````````````````````` example +***b* c* +. +<p>*<em><em>b</em> c</em></p> +```````````````````````````````` + ## Code coverage