From 579c1d8c1f9a6b5bfc16d9f0b02dbab2e0acb0ed Mon Sep 17 00:00:00 2001 From: "Rafael G. Martins" Date: Wed, 4 Nov 2015 03:30:58 -0200 Subject: content-parser: random parser fixes --- src/content-parser.c | 18 ++++++++++++++++++ tests/check_content_parser.c | 34 ++++++++++++++++++++++++++++++---- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/content-parser.c b/src/content-parser.c index 59e337e..f5450d6 100644 --- a/src/content-parser.c +++ b/src/content-parser.c @@ -405,6 +405,8 @@ blogc_content_parse(const char *src, size_t *end_excerpt) size_t eend = 0; size_t real_end = 0; + bool no_jump = false; + unsigned int header_level = 0; char *prefix = NULL; size_t prefix_len = 0; @@ -616,6 +618,11 @@ blogc_content_parse(const char *src, size_t *end_excerpt) prefix = NULL; b_slist_free_full(lines, free); lines = NULL; + if (is_last) { + free(tmp); + tmp = NULL; + goto para; + } } free(tmp); tmp = NULL; @@ -677,6 +684,8 @@ blogc_content_parse(const char *src, size_t *end_excerpt) lines = NULL; free(tmp); tmp = NULL; + if (is_last) + goto para; break; } free(tmp); @@ -836,6 +845,8 @@ hr: break; } state = CONTENT_PARAGRAPH; + if (is_last) + goto para; break; case CONTENT_ORDERED_LIST_SPACE: @@ -947,8 +958,15 @@ hr: break; case CONTENT_PARAGRAPH_END: + no_jump = true; para: if (c == '\n' || c == '\r' || is_last) { + if (!no_jump && is_last) { + if (c == '\n' || c == '\r') + end = src_len - 1; + else + end = src_len; + } tmp = b_strndup(src + start, end - start); parsed = blogc_content_parse_inline(tmp); b_string_append_printf(rv, "

%s

%s", parsed, diff --git a/tests/check_content_parser.c b/tests/check_content_parser.c index 994e900..dc3485e 100644 --- a/tests/check_content_parser.c +++ b/tests/check_content_parser.c @@ -1135,6 +1135,14 @@ test_content_parse_invalid_blockquote(void **state) "> bola\n" "> foo

\n"); free(html); + html = blogc_content_parse( + "> asd\n" + "> bola", NULL); + assert_non_null(html); + assert_string_equal(html, + "

> asd\n" + "> bola

\n"); + free(html); } @@ -1151,6 +1159,16 @@ test_content_parse_invalid_code(void **state) " bola\n" " foo

\n"); free(html); + html = blogc_content_parse( + " asd\n" + " bola\n" + " foo", NULL); + assert_non_null(html); + assert_string_equal(html, + "

asd\n" + " bola\n" + " foo

\n"); + free(html); } @@ -1196,7 +1214,8 @@ test_content_parse_invalid_unordered_list(void **state) assert_non_null(html); assert_string_equal(html, "

asd\n" - "1. qwe

\n"); + "1. qwe" + "

\n"); free(html); html = blogc_content_parse( "* asd\n" @@ -1204,7 +1223,8 @@ test_content_parse_invalid_unordered_list(void **state) assert_non_null(html); assert_string_equal(html, "

asd\n" - "1. qwe

\n"); + "1. qwe" + "

\n"); free(html); html = blogc_content_parse( "chunda\n" @@ -1250,7 +1270,8 @@ test_content_parse_invalid_ordered_list(void **state) assert_non_null(html); assert_string_equal(html, "

1. asd\n" - " qwe

\n"); + " qwe" + "

\n"); free(html); html = blogc_content_parse( "1. asd\n" @@ -1258,7 +1279,8 @@ test_content_parse_invalid_ordered_list(void **state) assert_non_null(html); assert_string_equal(html, "

1. asd\n" - " qwe

\n"); + " qwe" + "

\n"); free(html); html = blogc_content_parse( "chunda\n" @@ -1303,6 +1325,10 @@ test_content_parse_invalid_ordered_list(void **state) assert_non_null(html); assert_string_equal(html, "

1.

\n"); free(html); + html = blogc_content_parse("1 ", NULL); + assert_non_null(html); + assert_string_equal(html, "

1

\n"); + free(html); } -- cgit v1.2.3-18-g5258