Skip to content

Commit 5cdb153

Browse files
authored
Merge pull request #14 from compnerd/merge-2020-01-03
2020/01/03 Merge
2 parents bfa95d5 + c742776 commit 5cdb153

File tree

12 files changed

+3574
-3575
lines changed

12 files changed

+3574
-3575
lines changed

.github/FUNDING.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
github: [jgm]

CMakeLists.txt

100755100644
Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.0)
22
project(cmark VERSION 0.29.0)
33

44
include("FindAsan.cmake")
5+
include(GNUInstallDirs)
56

67
if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
78
message(FATAL_ERROR "Do not build in-source.\nPlease remove CMakeCache.txt and the CMakeFiles/ directory.\nThen: mkdir build ; cd build ; cmake .. ; make")
@@ -12,18 +13,59 @@ option(CMARK_STATIC "Build static libcmark library" ON)
1213
option(CMARK_SHARED "Build shared libcmark library" ON)
1314
option(CMARK_LIB_FUZZER "Build libFuzzer fuzzing harness" OFF)
1415

16+
if(NOT MSVC)
17+
set(CMAKE_C_STANDARD 99)
18+
set(CMAKE_C_STANDARD_REQUIRED YES)
19+
set(CMAKE_C_EXTENSIONS NO)
20+
endif()
21+
22+
# -fvisibility=hidden
23+
set(CMAKE_C_VISIBILITY_PRESET hidden)
24+
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
25+
26+
set(CMAKE_INCLUDE_CURRENT_DIR ON)
27+
1528
# The Linux modules distributed with CMake add "-rdynamic" to the build flags
1629
# which is incompatible with static linking under certain configurations.
1730
# Unsetting CMAKE_SHARED_LIBRARY_LINK_C_FLAGS ensures this does not happen.
1831
if(CMARK_STATIC AND "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
1932
SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)
2033
endif()
2134

35+
# Compiler flags
36+
if(MSVC)
37+
# Force to always compile with W4
38+
add_compile_options($<$<COMPILE_LANGUAGE:C>:/W4>)
39+
add_compile_options($<$<COMPILE_LANGUAGE:C>:/wd4706>)
40+
add_compile_options($<$<COMPILE_LANGUAGE:C>:/TP>)
41+
add_compile_options($<$<COMPILE_LANGUAGE:C>:/D_CRT_SECURE_NO_WARNINGS>)
42+
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES Clang)
43+
add_compile_options($<$<COMPILE_LANGUAGE:C>:-Wall>)
44+
add_compile_options($<$<COMPILE_LANGUAGE:C>:-Wextra>)
45+
add_compile_options($<$<COMPILE_LANGUAGE:C>:-pedantic>)
46+
endif()
47+
48+
# Check integrity of node structure when compiled as debug
49+
add_compile_options($<$<CONFIG:Debug>:-DCMARK_DEBUG_NODES>)
50+
51+
add_compile_options($<$<AND:$<CONFIG:PROFILE>,$<COMPILE_LANGUAGE:C>>:-pg>)
52+
53+
if(CMAKE_BUILD_TYPE STREQUAL Ubsan)
54+
add_compile_options($<$<COMPILE_LANGUAGE:C>:-fsanitize=undefined>)
55+
endif()
56+
if(CMARK_LIB_FUZZER)
57+
add_compile_options($<$<COMPILE_LANGUAGE:C>:-fsanitize-coverage=trace-pc-guard>)
58+
endif()
59+
2260
add_subdirectory(src)
2361
if(CMARK_TESTS AND (CMARK_SHARED OR CMARK_STATIC))
2462
add_subdirectory(api_test)
2563
endif()
26-
add_subdirectory(man)
64+
# TODO(compnerd) should this be enabled for MinGW, which sets CMAKE_SYSTEM_NAME
65+
# to Windows, but defines `MINGW`.
66+
if(NOT CMAKE_SYSTEM_NAME STREQUAL Windows)
67+
add_subdirectory(man)
68+
endif()
2769
if(CMARK_TESTS)
2870
enable_testing()
2971
add_subdirectory(test testdir)

api_test/CMakeLists.txt

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,8 @@ add_executable(api_test
44
harness.h
55
main.c
66
)
7-
include_directories(
8-
${PROJECT_SOURCE_DIR}/src
9-
${PROJECT_BINARY_DIR}/src
10-
)
117
if(CMARK_SHARED)
128
target_link_libraries(api_test libcmark)
139
else()
1410
target_link_libraries(api_test libcmark_static)
1511
endif()
16-
17-
# Compiler flags
18-
if(MSVC)
19-
# Force to always compile with W4
20-
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
21-
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
22-
else()
23-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
24-
endif()
25-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4706 /D_CRT_SECURE_NO_WARNINGS")
26-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /TP")
27-
elseif(CMAKE_COMPILER_IS_GNUCC OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
28-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -std=c99 -pedantic")
29-
endif()

api_test/main.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -837,11 +837,11 @@ static void numeric_entities(test_batch_runner *runner) {
837837
"Valid numeric entity 0x10FFFF");
838838
test_md_to_html(runner, "&#x110000;", "<p>" UTF8_REPL "</p>\n",
839839
"Invalid numeric entity 0x110000");
840-
test_md_to_html(runner, "&#x80000000;", "<p>" UTF8_REPL "</p>\n",
840+
test_md_to_html(runner, "&#x80000000;", "<p>&amp;#x80000000;</p>\n",
841841
"Invalid numeric entity 0x80000000");
842-
test_md_to_html(runner, "&#xFFFFFFFF;", "<p>" UTF8_REPL "</p>\n",
842+
test_md_to_html(runner, "&#xFFFFFFFF;", "<p>&amp;#xFFFFFFFF;</p>\n",
843843
"Invalid numeric entity 0xFFFFFFFF");
844-
test_md_to_html(runner, "&#99999999;", "<p>" UTF8_REPL "</p>\n",
844+
test_md_to_html(runner, "&#99999999;", "<p>&amp;#99999999;</p>\n",
845845
"Invalid numeric entity 99999999");
846846

847847
test_md_to_html(runner, "&#;", "<p>&amp;#;</p>\n",

man/CMakeLists.txt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
1-
if (NOT MSVC)
2-
3-
include(GNUInstallDirs)
4-
5-
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/man1/cmark.1
6-
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
7-
8-
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/man3/cmark.3
9-
DESTINATION ${CMAKE_INSTALL_MANDIR}/man3)
10-
endif(NOT MSVC)
1+
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/man1/cmark.1
2+
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
3+
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/man3/cmark.3
4+
DESTINATION ${CMAKE_INSTALL_MANDIR}/man3)

src/CMakeLists.txt

Lines changed: 24 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ if(${CMAKE_VERSION} VERSION_GREATER "3.3")
22
cmake_policy(SET CMP0063 NEW)
33
endif()
44

5-
include(GNUInstallDirs)
6-
75
set(LIBRARY "libcmark")
86
set(STATICLIBRARY "libcmark_static")
97
set(HEADERS
@@ -48,8 +46,6 @@ set(LIBRARY_SOURCES
4846
set(PROGRAM "cmark")
4947
set(PROGRAM_SOURCES main.c)
5048

51-
include_directories(. ${CMAKE_CURRENT_BINARY_DIR})
52-
5349
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmark_version.h.in
5450
${CMAKE_CURRENT_BINARY_DIR}/cmark_version.h)
5551

@@ -66,30 +62,20 @@ elseif (CMARK_SHARED)
6662
target_link_libraries(${PROGRAM} ${LIBRARY})
6763
endif()
6864

69-
# Check integrity of node structure when compiled as debug:
70-
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DCMARK_DEBUG_NODES")
71-
set(CMAKE_LINKER_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG}")
72-
73-
set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE} -pg")
74-
set(CMAKE_LINKER_PROFILE "${CMAKE_LINKER_FLAGS_RELEASE} -pg")
75-
76-
# -fvisibility=hidden
77-
set(CMAKE_C_VISIBILITY_PRESET hidden)
78-
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
79-
8065
if (CMARK_SHARED)
8166
add_library(${LIBRARY} SHARED ${LIBRARY_SOURCES})
82-
# Include minor version and patch level in soname for now.
8367
set_target_properties(${LIBRARY} PROPERTIES
68+
MACOSX_RPATH TRUE
8469
OUTPUT_NAME "cmark"
70+
# Avoid name clash between PROGRAM and LIBRARY pdb files.
71+
PDB_NAME cmark_dll
72+
# Include minor version and patch level in soname for now.
8573
SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}
8674
VERSION ${PROJECT_VERSION})
87-
88-
set_property(TARGET ${LIBRARY}
89-
APPEND PROPERTY MACOSX_RPATH true)
90-
91-
# Avoid name clash between PROGRAM and LIBRARY pdb files.
92-
set_target_properties(${LIBRARY} PROPERTIES PDB_NAME cmark_dll)
75+
target_include_directories(${LIBRARY} INTERFACE
76+
$<INSTALL_INTERFACE:include>
77+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
78+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)
9379

9480
generate_export_header(${LIBRARY}
9581
BASE_NAME ${PROJECT_NAME})
@@ -101,17 +87,13 @@ if (CMARK_STATIC)
10187
add_library(${STATICLIBRARY} STATIC ${LIBRARY_SOURCES})
10288
set_target_properties(${STATICLIBRARY} PROPERTIES
10389
COMPILE_FLAGS -DCMARK_STATIC_DEFINE
104-
POSITION_INDEPENDENT_CODE ON)
105-
106-
if (MSVC)
107-
set_target_properties(${STATICLIBRARY} PROPERTIES
108-
OUTPUT_NAME "cmark_static"
109-
VERSION ${PROJECT_VERSION})
110-
else()
111-
set_target_properties(${STATICLIBRARY} PROPERTIES
112-
OUTPUT_NAME "cmark"
113-
VERSION ${PROJECT_VERSION})
114-
endif(MSVC)
90+
OUTPUT_NAME "cmark$<$<BOOL:MSVC>:_static>"
91+
POSITION_INDEPENDENT_CODE ON
92+
VERSION ${PROJECT_VERSION})
93+
target_include_directories(${STATICLIBRARY} INTERFACE
94+
$<INSTALL_INTERFACE:include>
95+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
96+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)
11597

11698
if (NOT CMARK_SHARED)
11799
generate_export_header(${STATICLIBRARY}
@@ -154,6 +136,10 @@ if(CMARK_SHARED OR CMARK_STATIC)
154136
)
155137

156138
install(EXPORT cmark DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake)
139+
140+
configure_file(cmarkConfig.cmake.in
141+
${CMAKE_CURRENT_BINARY_DIR}/cmarkConfig.cmake)
142+
export(TARGETS ${CMARK_INSTALL} FILE cmarkTargets.cmake)
157143
endif()
158144

159145
export(TARGETS ${PROGRAM} ${LIBRARY} ${STATICLIBRARY}
@@ -162,8 +148,6 @@ export(TARGETS ${PROGRAM} ${LIBRARY} ${STATICLIBRARY}
162148
# Feature tests
163149
include(CheckIncludeFile)
164150
include(CheckCSourceCompiles)
165-
include(CheckCSourceRuns)
166-
include(CheckSymbolExists)
167151
CHECK_INCLUDE_FILE(stdbool.h HAVE_STDBOOL_H)
168152
CHECK_C_SOURCE_COMPILES(
169153
"int main() { __builtin_expect(0,0); return 0; }"
@@ -177,35 +161,12 @@ CONFIGURE_FILE(
177161
${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
178162
${CMAKE_CURRENT_BINARY_DIR}/config.h)
179163

180-
# Always compile with warnings
181-
if(MSVC)
182-
# Force to always compile with W4
183-
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
184-
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
185-
else()
186-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
187-
endif()
188-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4706 /D_CRT_SECURE_NO_WARNINGS")
189-
elseif(CMAKE_COMPILER_IS_GNUCC OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
190-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -std=c99 -pedantic")
191-
endif()
192-
193-
# Compile as C++ under MSVC older than 12.0
194-
if(MSVC AND MSVC_VERSION LESS 1800)
195-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /TP")
196-
endif()
197-
198-
if(CMAKE_BUILD_TYPE STREQUAL "Ubsan")
199-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined")
200-
endif()
201-
202164
if(CMARK_LIB_FUZZER)
203-
set(FUZZ_HARNESS "cmark-fuzz")
204-
add_executable(${FUZZ_HARNESS} ../test/cmark-fuzz.c ${LIBRARY_SOURCES})
205-
target_link_libraries(${FUZZ_HARNESS} "${CMAKE_LIB_FUZZER_PATH}")
206-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-coverage=trace-pc-guard")
165+
add_executable(cmark-fuzz ../test/cmark-fuzz.c ${LIBRARY_SOURCES})
166+
target_link_libraries(cmark-fuzz "${CMAKE_LIB_FUZZER_PATH}")
207167

208168
# cmark is written in C but the libFuzzer runtime is written in C++ which
209-
# needs to link against the C++ runtime. Explicitly link it into cmark-fuzz
210-
set_target_properties(${FUZZ_HARNESS} PROPERTIES LINK_FLAGS "-lstdc++")
169+
# needs to link against the C++ runtime.
170+
set_target_properties(cmark-fuzz PROPERTIES
171+
LINKER_LANGUAGE CXX)
211172
endif()

src/cmarkConfig.cmake.in

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
set(HAVE_LIBCMARK_STATIC @CMARK_STATIC@)
2+
set(HAVE_LIBCMARK_SHARED @CMARK_SHARED@)
3+
4+
if((HAVE_LIBCMARK_STATIC AND NOT TARGET libcmark_static) OR
5+
(HAVE_LIBCMARK_SHARED AND NOT TARGET libcmark))
6+
include(cmarkTargets.cmake)
7+
endif()

src/commonmark.c

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
182182
char *emph_delim;
183183
bool first_in_list_item;
184184
bufsize_t marker_width;
185+
bool has_nonspace;
185186
bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options) &&
186187
!(CMARK_OPT_HARDBREAKS & options);
187188

@@ -214,8 +215,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
214215
break;
215216

216217
case CMARK_NODE_LIST:
217-
if (!entering && node->next && (node->next->type == CMARK_NODE_CODE_BLOCK ||
218-
node->next->type == CMARK_NODE_LIST)) {
218+
if (!entering && node->next && (node->next->type == CMARK_NODE_LIST)) {
219219
// this ensures that a following indented code block or list will be
220220
// inteprereted correctly.
221221
CR();
@@ -276,6 +276,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
276276
break;
277277

278278
case CMARK_NODE_CODE_BLOCK:
279+
279280
first_in_list_item = node->prev == NULL && node->parent &&
280281
node->parent->type == CMARK_NODE_ITEM;
281282

@@ -287,34 +288,23 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
287288
fencechar[0] = strchr(info, '`') == NULL ? '`' : '~';
288289
code = cmark_node_get_literal(node);
289290
code_len = strlen(code);
290-
// use indented form if no info, and code doesn't
291-
// begin or end with a blank line, and code isn't
292-
// first thing in a list item
293-
if (info_len == 0 && (code_len > 2 && !cmark_isspace(code[0]) &&
294-
!(cmark_isspace(code[code_len - 1]) &&
295-
cmark_isspace(code[code_len - 2]))) &&
296-
!first_in_list_item) {
297-
LIT(" ");
298-
cmark_strbuf_puts(renderer->prefix, " ");
299-
OUT(cmark_node_get_literal(node), false, LITERAL);
300-
cmark_strbuf_truncate(renderer->prefix, renderer->prefix->size - 4);
301-
} else {
302-
numticks = longest_backtick_sequence(code) + 1;
303-
if (numticks < 3) {
304-
numticks = 3;
305-
}
306-
for (i = 0; i < numticks; i++) {
307-
LIT(fencechar);
308-
}
309-
LIT(" ");
310-
OUT(info, false, LITERAL);
311-
CR();
312-
OUT(cmark_node_get_literal(node), false, LITERAL);
313-
CR();
314-
for (i = 0; i < numticks; i++) {
315-
LIT(fencechar);
316-
}
291+
292+
numticks = longest_backtick_sequence(code) + 1;
293+
if (numticks < 3) {
294+
numticks = 3;
317295
}
296+
for (i = 0; i < numticks; i++) {
297+
LIT(fencechar);
298+
}
299+
LIT(" ");
300+
OUT(info, false, LITERAL);
301+
CR();
302+
OUT(cmark_node_get_literal(node), false, LITERAL);
303+
CR();
304+
for (i = 0; i < numticks; i++) {
305+
LIT(fencechar);
306+
}
307+
318308
BLANKLINE();
319309
break;
320310

@@ -371,9 +361,16 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
371361
code = cmark_node_get_literal(node);
372362
code_len = strlen(code);
373363
numticks = shortest_unused_backtick_sequence(code);
364+
has_nonspace = false;
365+
for (i=0; i < code_len; i++) {
366+
if (code[i] != ' ') {
367+
has_nonspace = true;
368+
break;
369+
}
370+
}
374371
extra_spaces = code_len == 0 ||
375372
code[0] == '`' || code[code_len - 1] == '`' ||
376-
code[0] == ' ' || code[code_len - 1] == ' ';
373+
(has_nonspace && code[0] == ' ' && code[code_len - 1] == ' ');
377374
for (i = 0; i < numticks; i++) {
378375
LIT("`");
379376
}

0 commit comments

Comments
 (0)