commonmarker 0.0.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of commonmarker might be problematic. Click here for more details.

Files changed (291) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +8 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +119 -0
  5. data/Rakefile +39 -0
  6. data/bin/commonmarker +41 -0
  7. data/commonmarker.gemspec +30 -0
  8. data/ext/commonmarker/cmark/CMakeLists.txt +25 -0
  9. data/ext/commonmarker/cmark/COPYING +192 -0
  10. data/ext/commonmarker/cmark/FindAsan.cmake +74 -0
  11. data/ext/commonmarker/cmark/Makefile +170 -0
  12. data/ext/commonmarker/cmark/Makefile.nmake +36 -0
  13. data/ext/commonmarker/cmark/README.md +169 -0
  14. data/ext/commonmarker/cmark/api_test/CMakeLists.txt +25 -0
  15. data/ext/commonmarker/cmark/api_test/cplusplus.cpp +15 -0
  16. data/ext/commonmarker/cmark/api_test/cplusplus.h +17 -0
  17. data/ext/commonmarker/cmark/api_test/harness.c +102 -0
  18. data/ext/commonmarker/cmark/api_test/harness.h +42 -0
  19. data/ext/commonmarker/cmark/api_test/main.c +700 -0
  20. data/ext/commonmarker/cmark/appveyor.yml +15 -0
  21. data/ext/commonmarker/cmark/bench/statistics.py +595 -0
  22. data/ext/commonmarker/cmark/bench/stats.py +19 -0
  23. data/ext/commonmarker/cmark/benchmarks.md +33 -0
  24. data/ext/commonmarker/cmark/build/CMakeCache.txt +362 -0
  25. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CMakeCCompiler.cmake +63 -0
  26. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CMakeCXXCompiler.cmake +64 -0
  27. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CMakeDetermineCompilerABI_C.bin +0 -0
  28. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CMakeDetermineCompilerABI_CXX.bin +0 -0
  29. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CMakeSystem.cmake +15 -0
  30. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CompilerIdC/CMakeCCompilerId.c +499 -0
  31. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CompilerIdC/a.out +0 -0
  32. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CompilerIdCXX/CMakeCXXCompilerId.cpp +489 -0
  33. data/ext/commonmarker/cmark/build/CMakeFiles/3.2.2/CompilerIdCXX/a.out +0 -0
  34. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  35. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeError.log +30 -0
  36. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeOutput.log +598 -0
  37. data/ext/commonmarker/cmark/build/CMakeFiles/Makefile.cmake +77 -0
  38. data/ext/commonmarker/cmark/build/CMakeFiles/Makefile2 +268 -0
  39. data/ext/commonmarker/cmark/build/CMakeFiles/TargetDirectories.txt +4 -0
  40. data/ext/commonmarker/cmark/build/CMakeFiles/cmake.check_cache +1 -0
  41. data/ext/commonmarker/cmark/build/CMakeFiles/feature_tests.bin +0 -0
  42. data/ext/commonmarker/cmark/build/CMakeFiles/feature_tests.c +34 -0
  43. data/ext/commonmarker/cmark/build/CMakeFiles/feature_tests.cxx +405 -0
  44. data/ext/commonmarker/cmark/build/CMakeFiles/progress.marks +1 -0
  45. data/ext/commonmarker/cmark/build/CTestTestfile.cmake +10 -0
  46. data/ext/commonmarker/cmark/build/Makefile +237 -0
  47. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  48. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/C.includecache +92 -0
  49. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/CXX.includecache +36 -0
  50. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/DependInfo.cmake +29 -0
  51. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/build.make +155 -0
  52. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/cmake_clean.cmake +12 -0
  53. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/cplusplus.cpp.o +0 -0
  54. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/depend.internal +25 -0
  55. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/depend.make +25 -0
  56. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/flags.make +13 -0
  57. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/harness.c.o +0 -0
  58. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/link.txt +1 -0
  59. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/main.c.o +0 -0
  60. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/progress.make +4 -0
  61. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/progress.marks +1 -0
  62. data/ext/commonmarker/cmark/build/api_test/Makefile +277 -0
  63. data/ext/commonmarker/cmark/build/api_test/api_test +0 -0
  64. data/ext/commonmarker/cmark/build/api_test/cmake_install.cmake +29 -0
  65. data/ext/commonmarker/cmark/build/cmake_install.cmake +48 -0
  66. data/ext/commonmarker/cmark/build/man/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  67. data/ext/commonmarker/cmark/build/man/CMakeFiles/progress.marks +1 -0
  68. data/ext/commonmarker/cmark/build/man/Makefile +181 -0
  69. data/ext/commonmarker/cmark/build/man/cmake_install.cmake +37 -0
  70. data/ext/commonmarker/cmark/build/src/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  71. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/C.includecache +422 -0
  72. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/DependInfo.cmake +39 -0
  73. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/blocks.c.o +0 -0
  74. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/buffer.c.o +0 -0
  75. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/build.make +544 -0
  76. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/cmake_clean.cmake +27 -0
  77. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/cmark.c.o +0 -0
  78. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/cmark_ctype.c.o +0 -0
  79. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/commonmark.c.o +0 -0
  80. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/depend.internal +177 -0
  81. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/depend.make +177 -0
  82. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/flags.make +8 -0
  83. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/houdini_href_e.c.o +0 -0
  84. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/houdini_html_e.c.o +0 -0
  85. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/houdini_html_u.c.o +0 -0
  86. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/html.c.o +0 -0
  87. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/inlines.c.o +0 -0
  88. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/iterator.c.o +0 -0
  89. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/link.txt +1 -0
  90. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/main.c.o +0 -0
  91. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/man.c.o +0 -0
  92. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/node.c.o +0 -0
  93. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/progress.make +19 -0
  94. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/references.c.o +0 -0
  95. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/scanners.c.o +0 -0
  96. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/utf8.c.o +0 -0
  97. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/xml.c.o +0 -0
  98. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/C.includecache +394 -0
  99. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/DependInfo.cmake +44 -0
  100. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/blocks.c.o +0 -0
  101. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/buffer.c.o +0 -0
  102. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/build.make +522 -0
  103. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/cmake_clean.cmake +27 -0
  104. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/cmark.c.o +0 -0
  105. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/cmark_ctype.c.o +0 -0
  106. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/commonmark.c.o +0 -0
  107. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/depend.internal +169 -0
  108. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/depend.make +169 -0
  109. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/flags.make +8 -0
  110. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/houdini_href_e.c.o +0 -0
  111. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/houdini_html_e.c.o +0 -0
  112. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/houdini_html_u.c.o +0 -0
  113. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/html.c.o +0 -0
  114. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/inlines.c.o +0 -0
  115. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/iterator.c.o +0 -0
  116. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/link.txt +1 -0
  117. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/man.c.o +0 -0
  118. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/node.c.o +0 -0
  119. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/progress.make +18 -0
  120. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/references.c.o +0 -0
  121. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/scanners.c.o +0 -0
  122. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/utf8.c.o +0 -0
  123. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/xml.c.o +0 -0
  124. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/C.includecache +394 -0
  125. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/DependInfo.cmake +38 -0
  126. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/blocks.c.o +0 -0
  127. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/buffer.c.o +0 -0
  128. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/build.make +519 -0
  129. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmake_clean.cmake +26 -0
  130. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmake_clean_target.cmake +3 -0
  131. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmark.c.o +0 -0
  132. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmark_ctype.c.o +0 -0
  133. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/commonmark.c.o +0 -0
  134. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/depend.internal +169 -0
  135. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/depend.make +169 -0
  136. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/flags.make +8 -0
  137. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_href_e.c.o +0 -0
  138. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_html_e.c.o +0 -0
  139. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_html_u.c.o +0 -0
  140. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/html.c.o +0 -0
  141. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/inlines.c.o +0 -0
  142. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/iterator.c.o +0 -0
  143. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/link.txt +2 -0
  144. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/man.c.o +0 -0
  145. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/node.c.o +0 -0
  146. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/progress.make +18 -0
  147. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/references.c.o +0 -0
  148. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/scanners.c.o +0 -0
  149. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/utf8.c.o +0 -0
  150. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/xml.c.o +0 -0
  151. data/ext/commonmarker/cmark/build/src/CMakeFiles/progress.marks +1 -0
  152. data/ext/commonmarker/cmark/build/src/Makefile +814 -0
  153. data/ext/commonmarker/cmark/build/src/cmake_install.cmake +69 -0
  154. data/ext/commonmarker/cmark/build/src/cmark +0 -0
  155. data/ext/commonmarker/cmark/build/src/cmark_export.h +41 -0
  156. data/ext/commonmarker/cmark/build/src/cmark_version.h +7 -0
  157. data/ext/commonmarker/cmark/build/src/config.h +23 -0
  158. data/ext/commonmarker/cmark/build/src/libcmark.0.19.0.dylib +0 -0
  159. data/ext/commonmarker/cmark/build/src/libcmark.a +0 -0
  160. data/ext/commonmarker/cmark/build/src/libcmark.dylib +0 -0
  161. data/ext/commonmarker/cmark/build/src/libcmark.pc +10 -0
  162. data/ext/commonmarker/cmark/build/testdir/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  163. data/ext/commonmarker/cmark/build/testdir/CMakeFiles/progress.marks +1 -0
  164. data/ext/commonmarker/cmark/build/testdir/CTestTestfile.cmake +12 -0
  165. data/ext/commonmarker/cmark/build/testdir/Makefile +181 -0
  166. data/ext/commonmarker/cmark/build/testdir/cmake_install.cmake +29 -0
  167. data/ext/commonmarker/cmark/changelog.txt +153 -0
  168. data/ext/commonmarker/cmark/data/CaseFolding-3.2.0.txt +912 -0
  169. data/ext/commonmarker/cmark/man/CMakeLists.txt +8 -0
  170. data/ext/commonmarker/cmark/man/make_man_page.py +131 -0
  171. data/ext/commonmarker/cmark/man/man1/cmark.1 +54 -0
  172. data/ext/commonmarker/cmark/man/man3/cmark.3 +583 -0
  173. data/ext/commonmarker/cmark/nmake.bat +1 -0
  174. data/ext/commonmarker/cmark/src/CMakeLists.txt +166 -0
  175. data/ext/commonmarker/cmark/src/bench.h +27 -0
  176. data/ext/commonmarker/cmark/src/blocks.c +887 -0
  177. data/ext/commonmarker/cmark/src/buffer.c +381 -0
  178. data/ext/commonmarker/cmark/src/buffer.h +113 -0
  179. data/ext/commonmarker/cmark/src/case_fold_switch.inc +2637 -0
  180. data/ext/commonmarker/cmark/src/chunk.h +110 -0
  181. data/ext/commonmarker/cmark/src/cmark.c +24 -0
  182. data/ext/commonmarker/cmark/src/cmark.h +565 -0
  183. data/ext/commonmarker/cmark/src/cmark_ctype.c +53 -0
  184. data/ext/commonmarker/cmark/src/cmark_ctype.h +24 -0
  185. data/ext/commonmarker/cmark/src/cmark_version.h.in +7 -0
  186. data/ext/commonmarker/cmark/src/commonmark.c +607 -0
  187. data/ext/commonmarker/cmark/src/config.h.in +23 -0
  188. data/ext/commonmarker/cmark/src/debug.h +36 -0
  189. data/ext/commonmarker/cmark/src/houdini.h +52 -0
  190. data/ext/commonmarker/cmark/src/houdini_href_e.c +107 -0
  191. data/ext/commonmarker/cmark/src/houdini_html_e.c +81 -0
  192. data/ext/commonmarker/cmark/src/houdini_html_u.c +116 -0
  193. data/ext/commonmarker/cmark/src/html.c +322 -0
  194. data/ext/commonmarker/cmark/src/html_unescape.gperf +2130 -0
  195. data/ext/commonmarker/cmark/src/html_unescape.h +13375 -0
  196. data/ext/commonmarker/cmark/src/inlines.c +1147 -0
  197. data/ext/commonmarker/cmark/src/inlines.h +19 -0
  198. data/ext/commonmarker/cmark/src/iterator.c +148 -0
  199. data/ext/commonmarker/cmark/src/iterator.h +25 -0
  200. data/ext/commonmarker/cmark/src/libcmark.pc.in +10 -0
  201. data/ext/commonmarker/cmark/src/main.c +191 -0
  202. data/ext/commonmarker/cmark/src/man.c +287 -0
  203. data/ext/commonmarker/cmark/src/node.c +873 -0
  204. data/ext/commonmarker/cmark/src/node.h +82 -0
  205. data/ext/commonmarker/cmark/src/parser.h +29 -0
  206. data/ext/commonmarker/cmark/src/references.c +154 -0
  207. data/ext/commonmarker/cmark/src/references.h +37 -0
  208. data/ext/commonmarker/cmark/src/scanners.c +15291 -0
  209. data/ext/commonmarker/cmark/src/scanners.h +41 -0
  210. data/ext/commonmarker/cmark/src/scanners.re +247 -0
  211. data/ext/commonmarker/cmark/src/utf8.c +452 -0
  212. data/ext/commonmarker/cmark/src/utf8.h +22 -0
  213. data/ext/commonmarker/cmark/src/xml.c +170 -0
  214. data/ext/commonmarker/cmark/test/CMakeLists.txt +53 -0
  215. data/ext/commonmarker/cmark/test/afl_dictionary/asterisk +1 -0
  216. data/ext/commonmarker/cmark/test/afl_dictionary/attr_generic +1 -0
  217. data/ext/commonmarker/cmark/test/afl_dictionary/attr_href +1 -0
  218. data/ext/commonmarker/cmark/test/afl_dictionary/attr_xml_lang +1 -0
  219. data/ext/commonmarker/cmark/test/afl_dictionary/attr_xmlns +1 -0
  220. data/ext/commonmarker/cmark/test/afl_dictionary/backslash +1 -0
  221. data/ext/commonmarker/cmark/test/afl_dictionary/backtick +1 -0
  222. data/ext/commonmarker/cmark/test/afl_dictionary/colon +1 -0
  223. data/ext/commonmarker/cmark/test/afl_dictionary/dashes +1 -0
  224. data/ext/commonmarker/cmark/test/afl_dictionary/double_quote +1 -0
  225. data/ext/commonmarker/cmark/test/afl_dictionary/entity_builtin +1 -0
  226. data/ext/commonmarker/cmark/test/afl_dictionary/entity_decimal +1 -0
  227. data/ext/commonmarker/cmark/test/afl_dictionary/entity_external +1 -0
  228. data/ext/commonmarker/cmark/test/afl_dictionary/entity_hex +1 -0
  229. data/ext/commonmarker/cmark/test/afl_dictionary/equals +1 -0
  230. data/ext/commonmarker/cmark/test/afl_dictionary/exclamation +1 -0
  231. data/ext/commonmarker/cmark/test/afl_dictionary/greater_than +1 -0
  232. data/ext/commonmarker/cmark/test/afl_dictionary/hash +1 -0
  233. data/ext/commonmarker/cmark/test/afl_dictionary/hyphen +0 -0
  234. data/ext/commonmarker/cmark/test/afl_dictionary/indent +1 -0
  235. data/ext/commonmarker/cmark/test/afl_dictionary/left_bracket +1 -0
  236. data/ext/commonmarker/cmark/test/afl_dictionary/left_paren +1 -0
  237. data/ext/commonmarker/cmark/test/afl_dictionary/less_than +1 -0
  238. data/ext/commonmarker/cmark/test/afl_dictionary/plus +1 -0
  239. data/ext/commonmarker/cmark/test/afl_dictionary/right_bracket +1 -0
  240. data/ext/commonmarker/cmark/test/afl_dictionary/right_paren +1 -0
  241. data/ext/commonmarker/cmark/test/afl_dictionary/single_quote +1 -0
  242. data/ext/commonmarker/cmark/test/afl_dictionary/string_any +1 -0
  243. data/ext/commonmarker/cmark/test/afl_dictionary/string_brackets +1 -0
  244. data/ext/commonmarker/cmark/test/afl_dictionary/string_cdata +1 -0
  245. data/ext/commonmarker/cmark/test/afl_dictionary/string_dashes +1 -0
  246. data/ext/commonmarker/cmark/test/afl_dictionary/string_empty_dblquotes +1 -0
  247. data/ext/commonmarker/cmark/test/afl_dictionary/string_empty_quotes +1 -0
  248. data/ext/commonmarker/cmark/test/afl_dictionary/string_idrefs +1 -0
  249. data/ext/commonmarker/cmark/test/afl_dictionary/string_parentheses +1 -0
  250. data/ext/commonmarker/cmark/test/afl_dictionary/string_pcdata +1 -0
  251. data/ext/commonmarker/cmark/test/afl_dictionary/tag_cdata +1 -0
  252. data/ext/commonmarker/cmark/test/afl_dictionary/tag_close +1 -0
  253. data/ext/commonmarker/cmark/test/afl_dictionary/tag_doctype +1 -0
  254. data/ext/commonmarker/cmark/test/afl_dictionary/tag_element +1 -0
  255. data/ext/commonmarker/cmark/test/afl_dictionary/tag_entity +1 -0
  256. data/ext/commonmarker/cmark/test/afl_dictionary/tag_notation +1 -0
  257. data/ext/commonmarker/cmark/test/afl_dictionary/tag_open +1 -0
  258. data/ext/commonmarker/cmark/test/afl_dictionary/tag_open_close +1 -0
  259. data/ext/commonmarker/cmark/test/afl_dictionary/tag_open_exclamation +1 -0
  260. data/ext/commonmarker/cmark/test/afl_dictionary/tag_open_q +1 -0
  261. data/ext/commonmarker/cmark/test/afl_dictionary/tag_sq2_close +1 -0
  262. data/ext/commonmarker/cmark/test/afl_dictionary/tag_xml_q +1 -0
  263. data/ext/commonmarker/cmark/test/afl_dictionary/underscore +1 -0
  264. data/ext/commonmarker/cmark/test/afl_test_cases/test.md +36 -0
  265. data/ext/commonmarker/cmark/test/cmark.py +40 -0
  266. data/ext/commonmarker/cmark/test/normalize.py +179 -0
  267. data/ext/commonmarker/cmark/test/pathological_tests.py +63 -0
  268. data/ext/commonmarker/cmark/test/roundtrip.sh +2 -0
  269. data/ext/commonmarker/cmark/test/smart_punct.txt +96 -0
  270. data/ext/commonmarker/cmark/test/spec.txt +7505 -0
  271. data/ext/commonmarker/cmark/test/spec_tests.py +139 -0
  272. data/ext/commonmarker/cmark/toolchain-mingw32.cmake +17 -0
  273. data/ext/commonmarker/cmark/tools/mkcasefold.pl +22 -0
  274. data/ext/commonmarker/cmark/wrappers/wrapper.lua +239 -0
  275. data/ext/commonmarker/cmark/wrappers/wrapper.py +37 -0
  276. data/ext/commonmarker/cmark/wrappers/wrapper.rb +15 -0
  277. data/ext/commonmarker/cmark/wrappers/wrapper.rkt +190 -0
  278. data/ext/commonmarker/commonmarker.c +165 -0
  279. data/ext/commonmarker/commonmarker.h +11 -0
  280. data/ext/commonmarker/extconf.rb +18 -0
  281. data/lib/commonmarker/config.rb +20 -0
  282. data/lib/commonmarker/version.rb +3 -0
  283. data/lib/commonmarker.rb +588 -0
  284. data/test/benchmark.rb +30 -0
  285. data/test/spec_tests.json +4074 -0
  286. data/test/test_basics.rb +44 -0
  287. data/test/test_helper.rb +5 -0
  288. data/test/test_maliciousness.rb +9 -0
  289. data/test/test_pathological_inputs.rb +52 -0
  290. data/test/test_spec.rb +20 -0
  291. metadata +399 -0
@@ -0,0 +1,873 @@
1
+ #include <stdlib.h>
2
+ #include <string.h>
3
+
4
+ #include "config.h"
5
+ #include "node.h"
6
+
7
+ static void
8
+ S_node_unlink(cmark_node *node);
9
+
10
+ static inline bool
11
+ S_is_block(cmark_node *node)
12
+ {
13
+ if (node == NULL) {
14
+ return false;
15
+ }
16
+ return node->type >= CMARK_NODE_FIRST_BLOCK
17
+ && node->type <= CMARK_NODE_LAST_BLOCK;
18
+ }
19
+
20
+ static inline bool
21
+ S_is_inline(cmark_node *node)
22
+ {
23
+ if (node == NULL) {
24
+ return false;
25
+ }
26
+ return node->type >= CMARK_NODE_FIRST_INLINE
27
+ && node->type <= CMARK_NODE_LAST_INLINE;
28
+ }
29
+
30
+ static bool
31
+ S_can_contain(cmark_node *node, cmark_node *child)
32
+ {
33
+ cmark_node *cur;
34
+
35
+ if (node == NULL || child == NULL) {
36
+ return false;
37
+ }
38
+
39
+ // Verify that child is not an ancestor of node or equal to node.
40
+ cur = node;
41
+ do {
42
+ if (cur == child) {
43
+ return false;
44
+ }
45
+ cur = cur->parent;
46
+ } while (cur != NULL);
47
+
48
+ if (child->type == CMARK_NODE_DOCUMENT) {
49
+ return false;
50
+ }
51
+
52
+ switch (node->type) {
53
+ case CMARK_NODE_DOCUMENT:
54
+ case CMARK_NODE_BLOCK_QUOTE:
55
+ case CMARK_NODE_ITEM:
56
+ return S_is_block(child)
57
+ && child->type != CMARK_NODE_ITEM;
58
+
59
+ case CMARK_NODE_LIST:
60
+ return child->type == CMARK_NODE_ITEM;
61
+
62
+ case CMARK_NODE_PARAGRAPH:
63
+ case CMARK_NODE_HEADER:
64
+ case CMARK_NODE_EMPH:
65
+ case CMARK_NODE_STRONG:
66
+ case CMARK_NODE_LINK:
67
+ case CMARK_NODE_IMAGE:
68
+ return S_is_inline(child);
69
+
70
+ default:
71
+ break;
72
+ }
73
+
74
+ return false;
75
+ }
76
+
77
+ cmark_node*
78
+ cmark_node_new(cmark_node_type type)
79
+ {
80
+ cmark_node *node = (cmark_node *)calloc(1, sizeof(*node));
81
+ node->type = type;
82
+
83
+ switch (node->type) {
84
+ case CMARK_NODE_HEADER:
85
+ node->as.header.level = 1;
86
+ break;
87
+
88
+ case CMARK_NODE_LIST: {
89
+ cmark_list *list = &node->as.list;
90
+ list->list_type = CMARK_BULLET_LIST;
91
+ list->start = 1;
92
+ list->tight = false;
93
+ break;
94
+ }
95
+
96
+ default:
97
+ break;
98
+ }
99
+
100
+ return node;
101
+ }
102
+
103
+ // Free a cmark_node list and any children.
104
+ static
105
+ void S_free_nodes(cmark_node *e)
106
+ {
107
+ cmark_node *next;
108
+ while (e != NULL) {
109
+ if (S_is_block(e)) {
110
+ cmark_strbuf_free(&e->string_content);
111
+ }
112
+ switch (e->type) {
113
+ case NODE_CODE_BLOCK:
114
+ cmark_chunk_free(&e->as.code.info);
115
+ cmark_chunk_free(&e->as.code.literal);
116
+ break;
117
+ case NODE_TEXT:
118
+ case NODE_INLINE_HTML:
119
+ case NODE_CODE:
120
+ case NODE_HTML:
121
+ cmark_chunk_free(&e->as.literal);
122
+ break;
123
+ case NODE_LINK:
124
+ case NODE_IMAGE:
125
+ if (e->as.link.url) {
126
+ free(e->as.link.url);
127
+ }
128
+ if (e->as.link.title) {
129
+ free(e->as.link.title);
130
+ }
131
+ break;
132
+ default:
133
+ break;
134
+ }
135
+ if (e->last_child) {
136
+ // Splice children into list
137
+ e->last_child->next = e->next;
138
+ e->next = e->first_child;
139
+ }
140
+ next = e->next;
141
+ free(e);
142
+ e = next;
143
+ }
144
+ }
145
+
146
+ void
147
+ cmark_node_free(cmark_node *node)
148
+ {
149
+ S_node_unlink(node);
150
+ node->next = NULL;
151
+ S_free_nodes(node);
152
+ }
153
+
154
+ cmark_node_type
155
+ cmark_node_get_type(cmark_node *node)
156
+ {
157
+ if (node == NULL) {
158
+ return CMARK_NODE_NONE;
159
+ } else {
160
+ return node->type;
161
+ }
162
+ }
163
+
164
+ const char*
165
+ cmark_node_get_type_string(cmark_node *node)
166
+ {
167
+ if (node == NULL) {
168
+ return "NONE";
169
+ }
170
+
171
+ switch (node->type) {
172
+ case CMARK_NODE_NONE:
173
+ return "none";
174
+ case CMARK_NODE_DOCUMENT:
175
+ return "document";
176
+ case CMARK_NODE_BLOCK_QUOTE:
177
+ return "block_quote";
178
+ case CMARK_NODE_LIST:
179
+ return "list";
180
+ case CMARK_NODE_ITEM:
181
+ return "item";
182
+ case CMARK_NODE_CODE_BLOCK:
183
+ return "code_block";
184
+ case CMARK_NODE_HTML:
185
+ return "html";
186
+ case CMARK_NODE_PARAGRAPH:
187
+ return "paragraph";
188
+ case CMARK_NODE_HEADER:
189
+ return "header";
190
+ case CMARK_NODE_HRULE:
191
+ return "hrule";
192
+ case CMARK_NODE_TEXT:
193
+ return "text";
194
+ case CMARK_NODE_SOFTBREAK:
195
+ return "softbreak";
196
+ case CMARK_NODE_LINEBREAK:
197
+ return "linebreak";
198
+ case CMARK_NODE_CODE:
199
+ return "code";
200
+ case CMARK_NODE_INLINE_HTML:
201
+ return "inline_html";
202
+ case CMARK_NODE_EMPH:
203
+ return "emph";
204
+ case CMARK_NODE_STRONG:
205
+ return "strong";
206
+ case CMARK_NODE_LINK:
207
+ return "link";
208
+ case CMARK_NODE_IMAGE:
209
+ return "image";
210
+ }
211
+
212
+ return "<unknown>";
213
+ }
214
+
215
+ cmark_node*
216
+ cmark_node_next(cmark_node *node)
217
+ {
218
+ if (node == NULL) {
219
+ return NULL;
220
+ } else {
221
+ return node->next;
222
+ }
223
+ }
224
+
225
+ cmark_node*
226
+ cmark_node_previous(cmark_node *node)
227
+ {
228
+ if (node == NULL) {
229
+ return NULL;
230
+ } else {
231
+ return node->prev;
232
+ }
233
+ }
234
+
235
+ cmark_node*
236
+ cmark_node_parent(cmark_node *node)
237
+ {
238
+ if (node == NULL) {
239
+ return NULL;
240
+ } else {
241
+ return node->parent;
242
+ }
243
+ }
244
+
245
+ cmark_node*
246
+ cmark_node_first_child(cmark_node *node)
247
+ {
248
+ if (node == NULL) {
249
+ return NULL;
250
+ } else {
251
+ return node->first_child;
252
+ }
253
+ }
254
+
255
+ cmark_node*
256
+ cmark_node_last_child(cmark_node *node)
257
+ {
258
+ if (node == NULL) {
259
+ return NULL;
260
+ } else {
261
+ return node->last_child;
262
+ }
263
+ }
264
+
265
+ void*
266
+ cmark_node_get_user_data(cmark_node *node)
267
+ {
268
+ if (node == NULL) {
269
+ return NULL;
270
+ } else {
271
+ return node->user_data;
272
+ }
273
+ }
274
+
275
+ int
276
+ cmark_node_set_user_data(cmark_node *node, void *user_data)
277
+ {
278
+ if (node == NULL) {
279
+ return 0;
280
+ }
281
+ node->user_data = user_data;
282
+ return 1;
283
+ }
284
+
285
+ static char*
286
+ S_strdup(const char *str)
287
+ {
288
+ size_t size = strlen(str) + 1;
289
+ char *dup = (char *)malloc(size);
290
+ memcpy(dup, str, size);
291
+ return dup;
292
+ }
293
+
294
+ const char*
295
+ cmark_node_get_literal(cmark_node *node)
296
+ {
297
+ if (node == NULL) {
298
+ return NULL;
299
+ }
300
+
301
+ switch (node->type) {
302
+ case NODE_HTML:
303
+ case NODE_TEXT:
304
+ case NODE_INLINE_HTML:
305
+ case NODE_CODE:
306
+ return cmark_chunk_to_cstr(&node->as.literal);
307
+
308
+ case NODE_CODE_BLOCK:
309
+ return cmark_chunk_to_cstr(&node->as.code.literal);
310
+
311
+ default:
312
+ break;
313
+ }
314
+
315
+ return NULL;
316
+ }
317
+
318
+ int
319
+ cmark_node_set_literal(cmark_node *node, const char *content)
320
+ {
321
+ if (node == NULL) {
322
+ return 0;
323
+ }
324
+
325
+ switch (node->type) {
326
+ case NODE_HTML:
327
+ case NODE_TEXT:
328
+ case NODE_INLINE_HTML:
329
+ case NODE_CODE:
330
+ cmark_chunk_set_cstr(&node->as.literal, content);
331
+ return 1;
332
+
333
+ case NODE_CODE_BLOCK:
334
+ cmark_chunk_set_cstr(&node->as.code.literal, content);
335
+ return 1;
336
+
337
+ default:
338
+ break;
339
+ }
340
+
341
+ return 0;
342
+ }
343
+
344
+ int
345
+ cmark_node_get_header_level(cmark_node *node)
346
+ {
347
+ if (node == NULL) {
348
+ return 0;
349
+ }
350
+
351
+ switch (node->type) {
352
+ case CMARK_NODE_HEADER:
353
+ return node->as.header.level;
354
+
355
+ default:
356
+ break;
357
+ }
358
+
359
+ return 0;
360
+ }
361
+
362
+ int
363
+ cmark_node_set_header_level(cmark_node *node, int level)
364
+ {
365
+ if (node == NULL || level < 1 || level > 6) {
366
+ return 0;
367
+ }
368
+
369
+ switch (node->type) {
370
+ case CMARK_NODE_HEADER:
371
+ node->as.header.level = level;
372
+ return 1;
373
+
374
+ default:
375
+ break;
376
+ }
377
+
378
+ return 0;
379
+ }
380
+
381
+ cmark_list_type
382
+ cmark_node_get_list_type(cmark_node *node)
383
+ {
384
+ if (node == NULL) {
385
+ return CMARK_NO_LIST;
386
+ }
387
+
388
+ if (node->type == CMARK_NODE_LIST) {
389
+ return node->as.list.list_type;
390
+ } else {
391
+ return CMARK_NO_LIST;
392
+ }
393
+ }
394
+
395
+ int
396
+ cmark_node_set_list_type(cmark_node *node, cmark_list_type type)
397
+ {
398
+ if (!(type == CMARK_BULLET_LIST || type == CMARK_ORDERED_LIST)) {
399
+ return 0;
400
+ }
401
+
402
+ if (node == NULL) {
403
+ return 0;
404
+ }
405
+
406
+ if (node->type == CMARK_NODE_LIST) {
407
+ node->as.list.list_type = type;
408
+ return 1;
409
+ } else {
410
+ return 0;
411
+ }
412
+ }
413
+
414
+ cmark_delim_type
415
+ cmark_node_get_list_delim(cmark_node *node)
416
+ {
417
+ if (node == NULL) {
418
+ return CMARK_NO_DELIM;
419
+ }
420
+
421
+ if (node->type == CMARK_NODE_LIST) {
422
+ return node->as.list.delimiter;
423
+ } else {
424
+ return CMARK_NO_DELIM;
425
+ }
426
+ }
427
+
428
+ int
429
+ cmark_node_set_list_delim(cmark_node *node, cmark_delim_type delim)
430
+ {
431
+ if (!(delim == CMARK_PERIOD_DELIM || delim == CMARK_PAREN_DELIM)) {
432
+ return 0;
433
+ }
434
+
435
+ if (node == NULL) {
436
+ return 0;
437
+ }
438
+
439
+ if (node->type == CMARK_NODE_LIST) {
440
+ node->as.list.delimiter = delim;
441
+ return 1;
442
+ } else {
443
+ return 0;
444
+ }
445
+ }
446
+
447
+ int
448
+ cmark_node_get_list_start(cmark_node *node)
449
+ {
450
+ if (node == NULL) {
451
+ return 0;
452
+ }
453
+
454
+ if (node->type == CMARK_NODE_LIST) {
455
+ return node->as.list.start;
456
+ } else {
457
+ return 0;
458
+ }
459
+ }
460
+
461
+ int
462
+ cmark_node_set_list_start(cmark_node *node, int start)
463
+ {
464
+ if (node == NULL || start < 0) {
465
+ return 0;
466
+ }
467
+
468
+ if (node->type == CMARK_NODE_LIST) {
469
+ node->as.list.start = start;
470
+ return 1;
471
+ } else {
472
+ return 0;
473
+ }
474
+ }
475
+
476
+ int
477
+ cmark_node_get_list_tight(cmark_node *node)
478
+ {
479
+ if (node == NULL) {
480
+ return 0;
481
+ }
482
+
483
+ if (node->type == CMARK_NODE_LIST) {
484
+ return node->as.list.tight;
485
+ } else {
486
+ return 0;
487
+ }
488
+ }
489
+
490
+ int
491
+ cmark_node_set_list_tight(cmark_node *node, int tight)
492
+ {
493
+ if (node == NULL) {
494
+ return 0;
495
+ }
496
+
497
+ if (node->type == CMARK_NODE_LIST) {
498
+ node->as.list.tight = tight;
499
+ return 1;
500
+ } else {
501
+ return 0;
502
+ }
503
+ }
504
+
505
+ const char*
506
+ cmark_node_get_fence_info(cmark_node *node)
507
+ {
508
+ if (node == NULL) {
509
+ return NULL;
510
+ }
511
+
512
+ if (node->type == NODE_CODE_BLOCK) {
513
+ return cmark_chunk_to_cstr(&node->as.code.info);
514
+ } else {
515
+ return NULL;
516
+ }
517
+ }
518
+
519
+ int
520
+ cmark_node_set_fence_info(cmark_node *node, const char *info)
521
+ {
522
+ if (node == NULL) {
523
+ return 0;
524
+ }
525
+
526
+ if (node->type == NODE_CODE_BLOCK) {
527
+ cmark_chunk_set_cstr(&node->as.code.info, info);
528
+ return 1;
529
+ } else {
530
+ return 0;
531
+ }
532
+ }
533
+
534
+ const char*
535
+ cmark_node_get_url(cmark_node *node)
536
+ {
537
+ if (node == NULL) {
538
+ return NULL;
539
+ }
540
+
541
+ switch (node->type) {
542
+ case NODE_LINK:
543
+ case NODE_IMAGE:
544
+ return (char *)node->as.link.url;
545
+ default:
546
+ break;
547
+ }
548
+
549
+ return NULL;
550
+ }
551
+
552
+ int
553
+ cmark_node_set_url(cmark_node *node, const char *url)
554
+ {
555
+ if (node == NULL) {
556
+ return 0;
557
+ }
558
+
559
+ switch (node->type) {
560
+ case NODE_LINK:
561
+ case NODE_IMAGE:
562
+ free(node->as.link.url);
563
+ node->as.link.url = (unsigned char *)S_strdup(url);
564
+ return 1;
565
+ default:
566
+ break;
567
+ }
568
+
569
+ return 0;
570
+ }
571
+
572
+ const char*
573
+ cmark_node_get_title(cmark_node *node)
574
+ {
575
+ if (node == NULL) {
576
+ return NULL;
577
+ }
578
+
579
+ switch (node->type) {
580
+ case NODE_LINK:
581
+ case NODE_IMAGE:
582
+ return (char *)node->as.link.title;
583
+ default:
584
+ break;
585
+ }
586
+
587
+ return NULL;
588
+ }
589
+
590
+ int
591
+ cmark_node_set_title(cmark_node *node, const char *title)
592
+ {
593
+ if (node == NULL) {
594
+ return 0;
595
+ }
596
+
597
+ switch (node->type) {
598
+ case NODE_LINK:
599
+ case NODE_IMAGE:
600
+ free(node->as.link.title);
601
+ node->as.link.title = (unsigned char *)S_strdup(title);
602
+ return 1;
603
+ default:
604
+ break;
605
+ }
606
+
607
+ return 0;
608
+ }
609
+
610
+ int
611
+ cmark_node_get_start_line(cmark_node *node)
612
+ {
613
+ if (node == NULL) {
614
+ return 0;
615
+ }
616
+ return node->start_line;
617
+ }
618
+
619
+ int
620
+ cmark_node_get_start_column(cmark_node *node)
621
+ {
622
+ if (node == NULL) {
623
+ return 0;
624
+ }
625
+ return node->start_column;
626
+ }
627
+
628
+ int
629
+ cmark_node_get_end_line(cmark_node *node)
630
+ {
631
+ if (node == NULL) {
632
+ return 0;
633
+ }
634
+ return node->end_line;
635
+ }
636
+
637
+ int
638
+ cmark_node_get_end_column(cmark_node *node)
639
+ {
640
+ if (node == NULL) {
641
+ return 0;
642
+ }
643
+ return node->end_column;
644
+ }
645
+
646
+ // Unlink a node without adjusting its next, prev, and parent pointers.
647
+ static void
648
+ S_node_unlink(cmark_node *node)
649
+ {
650
+ if (node == NULL) {
651
+ return;
652
+ }
653
+
654
+ if (node->prev) {
655
+ node->prev->next = node->next;
656
+ }
657
+ if (node->next) {
658
+ node->next->prev = node->prev;
659
+ }
660
+
661
+ // Adjust first_child and last_child of parent.
662
+ cmark_node *parent = node->parent;
663
+ if (parent) {
664
+ if (parent->first_child == node) {
665
+ parent->first_child = node->next;
666
+ }
667
+ if (parent->last_child == node) {
668
+ parent->last_child = node->prev;
669
+ }
670
+ }
671
+ }
672
+
673
+ void
674
+ cmark_node_unlink(cmark_node *node)
675
+ {
676
+ S_node_unlink(node);
677
+
678
+ node->next = NULL;
679
+ node->prev = NULL;
680
+ node->parent = NULL;
681
+
682
+ }
683
+
684
+ int
685
+ cmark_node_insert_before(cmark_node *node, cmark_node *sibling)
686
+ {
687
+ if (node == NULL || sibling == NULL) {
688
+ return 0;
689
+ }
690
+
691
+ if (!node->parent || !S_can_contain(node->parent, sibling)) {
692
+ return 0;
693
+ }
694
+
695
+ S_node_unlink(sibling);
696
+
697
+ cmark_node *old_prev = node->prev;
698
+
699
+ // Insert 'sibling' between 'old_prev' and 'node'.
700
+ if (old_prev) {
701
+ old_prev->next = sibling;
702
+ }
703
+ sibling->prev = old_prev;
704
+ sibling->next = node;
705
+ node->prev = sibling;
706
+
707
+ // Set new parent.
708
+ cmark_node *parent = node->parent;
709
+ sibling->parent = parent;
710
+
711
+ // Adjust first_child of parent if inserted as first child.
712
+ if (parent && !old_prev) {
713
+ parent->first_child = sibling;
714
+ }
715
+
716
+ return 1;
717
+ }
718
+
719
+ int
720
+ cmark_node_insert_after(cmark_node *node, cmark_node *sibling)
721
+ {
722
+ if (node == NULL || sibling == NULL) {
723
+ return 0;
724
+ }
725
+
726
+ if (!node->parent || !S_can_contain(node->parent, sibling)) {
727
+ return 0;
728
+ }
729
+
730
+ S_node_unlink(sibling);
731
+
732
+ cmark_node *old_next = node->next;
733
+
734
+ // Insert 'sibling' between 'node' and 'old_next'.
735
+ if (old_next) {
736
+ old_next->prev = sibling;
737
+ }
738
+ sibling->next = old_next;
739
+ sibling->prev = node;
740
+ node->next = sibling;
741
+
742
+ // Set new parent.
743
+ cmark_node *parent = node->parent;
744
+ sibling->parent = parent;
745
+
746
+ // Adjust last_child of parent if inserted as last child.
747
+ if (parent && !old_next) {
748
+ parent->last_child = sibling;
749
+ }
750
+
751
+ return 1;
752
+ }
753
+
754
+ int
755
+ cmark_node_prepend_child(cmark_node *node, cmark_node *child)
756
+ {
757
+ if (!S_can_contain(node, child)) {
758
+ return 0;
759
+ }
760
+
761
+ S_node_unlink(child);
762
+
763
+ cmark_node *old_first_child = node->first_child;
764
+
765
+ child->next = old_first_child;
766
+ child->prev = NULL;
767
+ child->parent = node;
768
+ node->first_child = child;
769
+
770
+ if (old_first_child) {
771
+ old_first_child->prev = child;
772
+ } else {
773
+ // Also set last_child if node previously had no children.
774
+ node->last_child = child;
775
+ }
776
+
777
+ return 1;
778
+ }
779
+
780
+ int
781
+ cmark_node_append_child(cmark_node *node, cmark_node *child)
782
+ {
783
+ if (!S_can_contain(node, child)) {
784
+ return 0;
785
+ }
786
+
787
+ S_node_unlink(child);
788
+
789
+ cmark_node *old_last_child = node->last_child;
790
+
791
+ child->next = NULL;
792
+ child->prev = old_last_child;
793
+ child->parent = node;
794
+ node->last_child = child;
795
+
796
+ if (old_last_child) {
797
+ old_last_child->next = child;
798
+ } else {
799
+ // Also set first_child if node previously had no children.
800
+ node->first_child = child;
801
+ }
802
+
803
+ return 1;
804
+ }
805
+
806
+ static void
807
+ S_print_error(FILE *out, cmark_node *node, const char *elem)
808
+ {
809
+ if (out == NULL) {
810
+ return;
811
+ }
812
+ fprintf(out, "Invalid '%s' in node type %s at %d:%d\n", elem,
813
+ cmark_node_get_type_string(node), node->start_line,
814
+ node->start_column);
815
+ }
816
+
817
+ int
818
+ cmark_node_check(cmark_node *node, FILE *out)
819
+ {
820
+ cmark_node *cur;
821
+ int errors = 0;
822
+
823
+ if (!node) {
824
+ return 0;
825
+ }
826
+
827
+ cur = node;
828
+ while (true) {
829
+ if (cur->first_child) {
830
+ if (cur->first_child->prev != NULL) {
831
+ S_print_error(out, cur->first_child, "prev");
832
+ cur->first_child->prev = NULL;
833
+ ++errors;
834
+ }
835
+ if (cur->first_child->parent != cur) {
836
+ S_print_error(out, cur->first_child, "parent");
837
+ cur->first_child->parent = cur;
838
+ ++errors;
839
+ }
840
+ cur = cur->first_child;
841
+ continue;
842
+ }
843
+
844
+ next_sibling:
845
+ if (cur == node) {
846
+ break;
847
+ }
848
+ if (cur->next) {
849
+ if (cur->next->prev != cur) {
850
+ S_print_error(out, cur->next, "prev");
851
+ cur->next->prev = cur;
852
+ ++errors;
853
+ }
854
+ if (cur->next->parent != cur->parent) {
855
+ S_print_error(out, cur->next, "parent");
856
+ cur->next->parent = cur->parent;
857
+ ++errors;
858
+ }
859
+ cur = cur->next;
860
+ continue;
861
+ }
862
+
863
+ if (cur->parent->last_child != cur) {
864
+ S_print_error(out, cur->parent, "last_child");
865
+ cur->parent->last_child = cur;
866
+ ++errors;
867
+ }
868
+ cur = cur->parent;
869
+ goto next_sibling;
870
+ }
871
+
872
+ return errors;
873
+ }