commonmarker 0.9.1 → 0.9.2

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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/Rakefile +9 -9
  4. data/ext/commonmarker/cmark/api_test/main.c +5 -0
  5. data/ext/commonmarker/cmark/build/CMakeCache.txt +459 -0
  6. data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CMakeCCompiler.cmake +67 -0
  7. data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CMakeCXXCompiler.cmake +68 -0
  8. data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CMakeDetermineCompilerABI_C.bin +0 -0
  9. data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CMakeDetermineCompilerABI_CXX.bin +0 -0
  10. data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CMakeSystem.cmake +15 -0
  11. data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CompilerIdC/CMakeCCompilerId.c +544 -0
  12. data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CompilerIdC/a.out +0 -0
  13. data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CompilerIdCXX/CMakeCXXCompilerId.cpp +533 -0
  14. data/ext/commonmarker/cmark/build/CMakeFiles/3.5.2/CompilerIdCXX/a.out +0 -0
  15. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  16. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeError.log +14 -0
  17. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeOutput.log +562 -0
  18. data/ext/commonmarker/cmark/build/CMakeFiles/Makefile.cmake +150 -0
  19. data/ext/commonmarker/cmark/build/CMakeFiles/Makefile2 +295 -0
  20. data/ext/commonmarker/cmark/build/CMakeFiles/TargetDirectories.txt +39 -0
  21. data/ext/commonmarker/cmark/build/CMakeFiles/cmake.check_cache +1 -0
  22. data/ext/commonmarker/cmark/build/CMakeFiles/feature_tests.bin +0 -0
  23. data/ext/commonmarker/cmark/build/CMakeFiles/feature_tests.c +34 -0
  24. data/ext/commonmarker/cmark/build/CMakeFiles/feature_tests.cxx +405 -0
  25. data/ext/commonmarker/cmark/build/CMakeFiles/progress.marks +1 -0
  26. data/ext/commonmarker/cmark/build/CTestTestfile.cmake +10 -0
  27. data/ext/commonmarker/cmark/build/Makefile +250 -0
  28. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  29. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/DependInfo.cmake +35 -0
  30. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/build.make +168 -0
  31. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/cmake_clean.cmake +12 -0
  32. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/depend.make +2 -0
  33. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/flags.make +17 -0
  34. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/link.txt +1 -0
  35. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/progress.make +5 -0
  36. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/progress.marks +1 -0
  37. data/ext/commonmarker/cmark/build/api_test/Makefile +300 -0
  38. data/ext/commonmarker/cmark/build/api_test/cmake_install.cmake +29 -0
  39. data/ext/commonmarker/cmark/build/cmake_install.cmake +48 -0
  40. data/ext/commonmarker/cmark/build/man/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  41. data/ext/commonmarker/cmark/build/man/CMakeFiles/progress.marks +1 -0
  42. data/ext/commonmarker/cmark/build/man/Makefile +194 -0
  43. data/ext/commonmarker/cmark/build/man/cmake_install.cmake +37 -0
  44. data/ext/commonmarker/cmark/build/src/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  45. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/DependInfo.cmake +41 -0
  46. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/build.make +626 -0
  47. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/cmake_clean.cmake +29 -0
  48. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/depend.make +2 -0
  49. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/flags.make +10 -0
  50. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/link.txt +1 -0
  51. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/progress.make +22 -0
  52. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/DependInfo.cmake +46 -0
  53. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/build.make +603 -0
  54. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/cmake_clean.cmake +29 -0
  55. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/depend.make +2 -0
  56. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/flags.make +10 -0
  57. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/link.txt +1 -0
  58. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/progress.make +21 -0
  59. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/C.includecache +468 -0
  60. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/DependInfo.cmake +40 -0
  61. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/blocks.c.o +0 -0
  62. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/buffer.c.o +0 -0
  63. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/build.make +600 -0
  64. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmake_clean.cmake +28 -0
  65. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmake_clean_target.cmake +3 -0
  66. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmark.c.o +0 -0
  67. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/cmark_ctype.c.o +0 -0
  68. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/commonmark.c.o +0 -0
  69. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/depend.internal +211 -0
  70. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/depend.make +211 -0
  71. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/flags.make +10 -0
  72. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_href_e.c.o +0 -0
  73. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_html_e.c.o +0 -0
  74. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_html_u.c.o +0 -0
  75. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/html.c.o +0 -0
  76. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/inlines.c.o +0 -0
  77. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/iterator.c.o +0 -0
  78. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/latex.c.o +0 -0
  79. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/link.txt +2 -0
  80. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/man.c.o +0 -0
  81. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/node.c.o +0 -0
  82. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/progress.make +21 -0
  83. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/references.c.o +0 -0
  84. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/render.c.o +0 -0
  85. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/scanners.c.o +0 -0
  86. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/utf8.c.o +0 -0
  87. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/xml.c.o +0 -0
  88. data/ext/commonmarker/cmark/build/src/CMakeFiles/progress.marks +1 -0
  89. data/ext/commonmarker/cmark/build/src/Makefile +956 -0
  90. data/ext/commonmarker/cmark/build/src/cmake_install.cmake +77 -0
  91. data/ext/commonmarker/cmark/build/src/cmark_export.h +41 -0
  92. data/ext/commonmarker/cmark/build/src/cmark_version.h +7 -0
  93. data/ext/commonmarker/cmark/build/src/config.h +84 -0
  94. data/ext/commonmarker/cmark/build/src/libcmark.a +0 -0
  95. data/ext/commonmarker/cmark/build/src/libcmark.pc +10 -0
  96. data/ext/commonmarker/cmark/build/testdir/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  97. data/ext/commonmarker/cmark/build/testdir/CMakeFiles/progress.marks +1 -0
  98. data/ext/commonmarker/cmark/build/testdir/CTestTestfile.cmake +14 -0
  99. data/ext/commonmarker/cmark/build/testdir/Makefile +194 -0
  100. data/ext/commonmarker/cmark/build/testdir/cmake_install.cmake +29 -0
  101. data/ext/commonmarker/cmark/man/man1/cmark.1 +11 -4
  102. data/ext/commonmarker/cmark/man/man3/cmark.3 +66 -11
  103. data/ext/commonmarker/cmark/src/blocks.c +232 -235
  104. data/ext/commonmarker/cmark/src/buffer.c +19 -56
  105. data/ext/commonmarker/cmark/src/buffer.h +7 -20
  106. data/ext/commonmarker/cmark/src/chunk.h +19 -19
  107. data/ext/commonmarker/cmark/src/cmark.c +14 -0
  108. data/ext/commonmarker/cmark/src/cmark.h +45 -6
  109. data/ext/commonmarker/cmark/src/cmark_ctype.c +2 -0
  110. data/ext/commonmarker/cmark/src/cmark_ctype.h +2 -0
  111. data/ext/commonmarker/cmark/src/commonmark.c +42 -29
  112. data/ext/commonmarker/cmark/src/config.h.in +8 -0
  113. data/ext/commonmarker/cmark/src/html.c +3 -1
  114. data/ext/commonmarker/cmark/src/inlines.c +111 -150
  115. data/ext/commonmarker/cmark/src/inlines.h +4 -4
  116. data/ext/commonmarker/cmark/src/iterator.c +6 -7
  117. data/ext/commonmarker/cmark/src/iterator.h +2 -0
  118. data/ext/commonmarker/cmark/src/latex.c +10 -8
  119. data/ext/commonmarker/cmark/src/main.c +6 -2
  120. data/ext/commonmarker/cmark/src/man.c +9 -5
  121. data/ext/commonmarker/cmark/src/node.c +38 -29
  122. data/ext/commonmarker/cmark/src/node.h +15 -11
  123. data/ext/commonmarker/cmark/src/parser.h +4 -2
  124. data/ext/commonmarker/cmark/src/references.c +23 -22
  125. data/ext/commonmarker/cmark/src/references.h +3 -1
  126. data/ext/commonmarker/cmark/src/render.c +9 -7
  127. data/ext/commonmarker/cmark/src/render.h +3 -1
  128. data/ext/commonmarker/cmark/src/scanners.c +30 -22
  129. data/ext/commonmarker/cmark/src/xml.c +1 -1
  130. data/ext/commonmarker/cmark/test/CMakeLists.txt +8 -8
  131. data/ext/commonmarker/cmark/test/cmark.py +34 -14
  132. data/ext/commonmarker/cmark/test/roundtrip_tests.py +47 -0
  133. data/ext/commonmarker/cmark/test/spec.txt +96 -6
  134. data/ext/commonmarker/cmark/test/spec_tests.py +5 -8
  135. data/ext/commonmarker/commonmarker.c +14 -8
  136. data/lib/commonmarker/config.rb +2 -2
  137. data/lib/commonmarker/renderer.rb +17 -7
  138. data/lib/commonmarker/renderer/html_renderer.rb +16 -21
  139. data/lib/commonmarker/version.rb +1 -1
  140. data/test/test_pathological_inputs.rb +11 -11
  141. metadata +99 -4
  142. data/ext/commonmarker/cmark/test/roundtrip.bat +0 -1
  143. data/ext/commonmarker/cmark/test/roundtrip.sh +0 -2
@@ -5,13 +5,13 @@
5
5
  extern "C" {
6
6
  #endif
7
7
 
8
- cmark_chunk cmark_clean_url(cmark_chunk *url);
9
- cmark_chunk cmark_clean_title(cmark_chunk *title);
8
+ cmark_chunk cmark_clean_url(cmark_mem *mem, cmark_chunk *url);
9
+ cmark_chunk cmark_clean_title(cmark_mem *mem, cmark_chunk *title);
10
10
 
11
- void cmark_parse_inlines(cmark_node *parent, cmark_reference_map *refmap,
11
+ void cmark_parse_inlines(cmark_mem *mem, cmark_node *parent, cmark_reference_map *refmap,
12
12
  int options);
13
13
 
14
- bufsize_t cmark_parse_reference_inline(cmark_strbuf *input,
14
+ bufsize_t cmark_parse_reference_inline(cmark_mem *mem, cmark_strbuf *input,
15
15
  cmark_reference_map *refmap);
16
16
 
17
17
  #ifdef __cplusplus
@@ -16,10 +16,9 @@ cmark_iter *cmark_iter_new(cmark_node *root) {
16
16
  if (root == NULL) {
17
17
  return NULL;
18
18
  }
19
- cmark_iter *iter = (cmark_iter *)malloc(sizeof(cmark_iter));
20
- if (iter == NULL) {
21
- return NULL;
22
- }
19
+ cmark_mem *mem = root->content.mem;
20
+ cmark_iter *iter = (cmark_iter *)mem->calloc(1, sizeof(cmark_iter));
21
+ iter->mem = mem;
23
22
  iter->root = root;
24
23
  iter->cur.ev_type = CMARK_EVENT_NONE;
25
24
  iter->cur.node = NULL;
@@ -28,7 +27,7 @@ cmark_iter *cmark_iter_new(cmark_node *root) {
28
27
  return iter;
29
28
  }
30
29
 
31
- void cmark_iter_free(cmark_iter *iter) { free(iter); }
30
+ void cmark_iter_free(cmark_iter *iter) { iter->mem->free(iter); }
32
31
 
33
32
  static bool S_is_leaf(cmark_node *node) {
34
33
  return ((1 << node->type) & S_leaf_mask) != 0;
@@ -93,7 +92,7 @@ void cmark_consolidate_text_nodes(cmark_node *root) {
93
92
  return;
94
93
  }
95
94
  cmark_iter *iter = cmark_iter_new(root);
96
- cmark_strbuf buf = GH_BUF_INIT;
95
+ cmark_strbuf buf = CMARK_BUF_INIT(iter->mem);
97
96
  cmark_event_type ev_type;
98
97
  cmark_node *cur, *tmp, *next;
99
98
 
@@ -111,7 +110,7 @@ void cmark_consolidate_text_nodes(cmark_node *root) {
111
110
  cmark_node_free(tmp);
112
111
  tmp = next;
113
112
  }
114
- cmark_chunk_free(&cur->as.literal);
113
+ cmark_chunk_free(iter->mem, &cur->as.literal);
115
114
  cur->as.literal = cmark_chunk_buf_detach(&buf);
116
115
  }
117
116
  }
@@ -6,6 +6,7 @@ extern "C" {
6
6
  #endif
7
7
 
8
8
  #include "cmark.h"
9
+ #include "memory.h"
9
10
 
10
11
  typedef struct {
11
12
  cmark_event_type ev_type;
@@ -13,6 +14,7 @@ typedef struct {
13
14
  } cmark_iter_state;
14
15
 
15
16
  struct cmark_iter {
17
+ cmark_mem *mem;
16
18
  cmark_node *root;
17
19
  cmark_iter_state cur;
18
20
  cmark_iter_state next;
@@ -2,7 +2,6 @@
2
2
  #include <stdio.h>
3
3
  #include <string.h>
4
4
  #include <assert.h>
5
- #include <ctype.h>
6
5
 
7
6
  #include "config.h"
8
7
  #include "cmark.h"
@@ -12,7 +11,6 @@
12
11
  #include "scanners.h"
13
12
  #include "render.h"
14
13
 
15
- #define safe_strlen(s) cmark_strbuf_safe_strlen(s)
16
14
  #define OUT(s, wrap, escaping) renderer->out(renderer, s, wrap, escaping)
17
15
  #define LIT(s) renderer->out(renderer, s, false, LITERAL)
18
16
  #define CR() renderer->cr(renderer)
@@ -20,7 +18,7 @@
20
18
  #define LIST_NUMBER_STRING_SIZE 20
21
19
 
22
20
  static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_escaping escape,
23
- int32_t c, unsigned char nextc) {
21
+ int32_t c, unsigned char nextc) {
24
22
  if (escape == LITERAL) {
25
23
  cmark_render_code_point(renderer, c);
26
24
  return;
@@ -169,13 +167,13 @@ static link_type get_link_type(cmark_node *node) {
169
167
  return INTERNAL_LINK;
170
168
  }
171
169
 
172
- url_len = safe_strlen(url);
170
+ url_len = strlen(url);
173
171
  if (url_len == 0 || scan_scheme(&url_chunk, 0) == 0) {
174
172
  return NO_LINK;
175
173
  }
176
174
 
177
175
  const char *title = cmark_node_get_title(node);
178
- title_len = safe_strlen(title);
176
+ title_len = strlen(title);
179
177
  // if it has a title, we can't treat it as an autolink:
180
178
  if (title_len == 0) {
181
179
 
@@ -223,6 +221,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
223
221
  cmark_list_type list_type;
224
222
  const char *roman_numerals[] = {"", "i", "ii", "iii", "iv", "v",
225
223
  "vi", "vii", "viii", "ix", "x"};
224
+ bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options);
226
225
 
227
226
  // avoid warning about unused parameter:
228
227
  (void)(options);
@@ -334,7 +333,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
334
333
  break;
335
334
 
336
335
  case CMARK_NODE_TEXT:
337
- OUT(cmark_node_get_literal(node), true, NORMAL);
336
+ OUT(cmark_node_get_literal(node), allow_wrap, NORMAL);
338
337
  break;
339
338
 
340
339
  case CMARK_NODE_LINEBREAK:
@@ -343,10 +342,13 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
343
342
  break;
344
343
 
345
344
  case CMARK_NODE_SOFTBREAK:
346
- if (renderer->width == 0) {
345
+ if (options & CMARK_OPT_HARDBREAKS) {
346
+ LIT("\\\\");
347
+ CR();
348
+ } else if (renderer->width == 0 && !(CMARK_OPT_NOBREAKS & options)) {
347
349
  CR();
348
350
  } else {
349
- OUT(" ", true, NORMAL);
351
+ OUT(" ", allow_wrap, NORMAL);
350
352
  }
351
353
  break;
352
354
 
@@ -3,6 +3,7 @@
3
3
  #include <string.h>
4
4
  #include <errno.h>
5
5
  #include "config.h"
6
+ #include "memory.h"
6
7
  #include "cmark.h"
7
8
 
8
9
  #if defined(_WIN32) && !defined(__CYGWIN__)
@@ -27,6 +28,7 @@ void print_usage() {
27
28
  printf(" --width WIDTH Specify wrap width (default 0 = nowrap)\n");
28
29
  printf(" --sourcepos Include source position attribute\n");
29
30
  printf(" --hardbreaks Treat newlines as hard line breaks\n");
31
+ printf(" --nobreaks Render soft line breaks as spaces\n");
30
32
  printf(" --safe Suppress raw HTML and dangerous URLs\n");
31
33
  printf(" --smart Use smart punctuation\n");
32
34
  printf(" --normalize Consolidate adjacent text nodes\n");
@@ -79,17 +81,19 @@ int main(int argc, char *argv[]) {
79
81
  _setmode(_fileno(stdout), _O_BINARY);
80
82
  #endif
81
83
 
82
- files = (int *)malloc(argc * sizeof(*files));
84
+ files = (int *)calloc(argc, sizeof(*files));
83
85
 
84
86
  for (i = 1; i < argc; i++) {
85
87
  if (strcmp(argv[i], "--version") == 0) {
86
88
  printf("cmark %s", CMARK_VERSION_STRING);
87
- printf(" - CommonMark converter\n(C) 2014, 2015 John MacFarlane\n");
89
+ printf(" - CommonMark converter\n(C) 2014-2016 John MacFarlane\n");
88
90
  exit(0);
89
91
  } else if (strcmp(argv[i], "--sourcepos") == 0) {
90
92
  options |= CMARK_OPT_SOURCEPOS;
91
93
  } else if (strcmp(argv[i], "--hardbreaks") == 0) {
92
94
  options |= CMARK_OPT_HARDBREAKS;
95
+ } else if (strcmp(argv[i], "--nobreaks") == 0) {
96
+ options |= CMARK_OPT_NOBREAKS;
93
97
  } else if (strcmp(argv[i], "--smart") == 0) {
94
98
  options |= CMARK_OPT_SMART;
95
99
  } else if (strcmp(argv[i], "--safe") == 0) {
@@ -75,6 +75,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
75
75
  cmark_node *tmp;
76
76
  int list_number;
77
77
  bool entering = (ev_type == CMARK_EVENT_ENTER);
78
+ bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options);
78
79
 
79
80
  // avoid unused parameter error:
80
81
  (void)(options);
@@ -173,7 +174,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
173
174
  break;
174
175
 
175
176
  case CMARK_NODE_TEXT:
176
- OUT(cmark_node_get_literal(node), true, NORMAL);
177
+ OUT(cmark_node_get_literal(node), allow_wrap, NORMAL);
177
178
  break;
178
179
 
179
180
  case CMARK_NODE_LINEBREAK:
@@ -182,16 +183,19 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
182
183
  break;
183
184
 
184
185
  case CMARK_NODE_SOFTBREAK:
185
- if (renderer->width == 0) {
186
+ if (options & CMARK_OPT_HARDBREAKS) {
187
+ LIT(".PD 0\n.P\n.PD");
188
+ CR();
189
+ } else if (renderer->width == 0 && !(CMARK_OPT_NOBREAKS & options)) {
186
190
  CR();
187
191
  } else {
188
- OUT(" ", true, LITERAL);
192
+ OUT(" ", allow_wrap, LITERAL);
189
193
  }
190
194
  break;
191
195
 
192
196
  case CMARK_NODE_CODE:
193
197
  LIT("\\f[C]");
194
- OUT(cmark_node_get_literal(node), true, NORMAL);
198
+ OUT(cmark_node_get_literal(node), allow_wrap, NORMAL);
195
199
  LIT("\\f[]");
196
200
  break;
197
201
 
@@ -222,7 +226,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
222
226
  case CMARK_NODE_LINK:
223
227
  if (!entering) {
224
228
  LIT(" (");
225
- OUT(cmark_node_get_url(node), true, URL);
229
+ OUT(cmark_node_get_url(node), allow_wrap, URL);
226
230
  LIT(")");
227
231
  }
228
232
  break;
@@ -6,6 +6,8 @@
6
6
 
7
7
  static void S_node_unlink(cmark_node *node);
8
8
 
9
+ #define NODE_MEM(node) cmark_node_mem(node)
10
+
9
11
  static CMARK_INLINE bool S_is_block(cmark_node *node) {
10
12
  if (node == NULL) {
11
13
  return false;
@@ -28,6 +30,9 @@ static bool S_can_contain(cmark_node *node, cmark_node *child) {
28
30
  if (node == NULL || child == NULL) {
29
31
  return false;
30
32
  }
33
+ if (NODE_MEM(node) != NODE_MEM(child)) {
34
+ return 0;
35
+ }
31
36
 
32
37
  // Verify that child is not an ancestor of node or equal to node.
33
38
  cur = node;
@@ -70,9 +75,10 @@ static bool S_can_contain(cmark_node *node, cmark_node *child) {
70
75
  return false;
71
76
  }
72
77
 
73
- cmark_node *cmark_node_new(cmark_node_type type) {
74
- cmark_node *node = (cmark_node *)calloc(1, sizeof(*node));
75
- node->type = type;
78
+ cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem) {
79
+ cmark_node *node = (cmark_node *)mem->calloc(1, sizeof(*node));
80
+ cmark_strbuf_init(mem, &node->content, 0);
81
+ node->type = (uint16_t)type;
76
82
 
77
83
  switch (node->type) {
78
84
  case CMARK_NODE_HEADING:
@@ -94,33 +100,36 @@ cmark_node *cmark_node_new(cmark_node_type type) {
94
100
  return node;
95
101
  }
96
102
 
103
+ cmark_node *cmark_node_new(cmark_node_type type) {
104
+ extern cmark_mem DEFAULT_MEM_ALLOCATOR;
105
+ return cmark_node_new_with_mem(type, &DEFAULT_MEM_ALLOCATOR);
106
+ }
107
+
97
108
  // Free a cmark_node list and any children.
98
109
  static void S_free_nodes(cmark_node *e) {
99
110
  cmark_node *next;
100
111
  while (e != NULL) {
101
- if (S_is_block(e)) {
102
- cmark_strbuf_free(&e->string_content);
103
- }
112
+ cmark_strbuf_free(&e->content);
104
113
  switch (e->type) {
105
114
  case CMARK_NODE_CODE_BLOCK:
106
- cmark_chunk_free(&e->as.code.info);
107
- cmark_chunk_free(&e->as.code.literal);
115
+ cmark_chunk_free(NODE_MEM(e), &e->as.code.info);
116
+ cmark_chunk_free(NODE_MEM(e), &e->as.code.literal);
108
117
  break;
109
118
  case CMARK_NODE_TEXT:
110
119
  case CMARK_NODE_HTML_INLINE:
111
120
  case CMARK_NODE_CODE:
112
121
  case CMARK_NODE_HTML_BLOCK:
113
- cmark_chunk_free(&e->as.literal);
122
+ cmark_chunk_free(NODE_MEM(e), &e->as.literal);
114
123
  break;
115
124
  case CMARK_NODE_LINK:
116
125
  case CMARK_NODE_IMAGE:
117
- cmark_chunk_free(&e->as.link.url);
118
- cmark_chunk_free(&e->as.link.title);
126
+ cmark_chunk_free(NODE_MEM(e), &e->as.link.url);
127
+ cmark_chunk_free(NODE_MEM(e), &e->as.link.title);
119
128
  break;
120
129
  case CMARK_NODE_CUSTOM_BLOCK:
121
130
  case CMARK_NODE_CUSTOM_INLINE:
122
- cmark_chunk_free(&e->as.custom.on_enter);
123
- cmark_chunk_free(&e->as.custom.on_exit);
131
+ cmark_chunk_free(NODE_MEM(e), &e->as.custom.on_enter);
132
+ cmark_chunk_free(NODE_MEM(e), &e->as.custom.on_exit);
124
133
  break;
125
134
  default:
126
135
  break;
@@ -131,7 +140,7 @@ static void S_free_nodes(cmark_node *e) {
131
140
  e->next = e->first_child;
132
141
  }
133
142
  next = e->next;
134
- free(e);
143
+ NODE_MEM(e)->free(e);
135
144
  e = next;
136
145
  }
137
146
  }
@@ -146,7 +155,7 @@ cmark_node_type cmark_node_get_type(cmark_node *node) {
146
155
  if (node == NULL) {
147
156
  return CMARK_NODE_NONE;
148
157
  } else {
149
- return node->type;
158
+ return (cmark_node_type)node->type;
150
159
  }
151
160
  }
152
161
 
@@ -269,10 +278,10 @@ const char *cmark_node_get_literal(cmark_node *node) {
269
278
  case CMARK_NODE_TEXT:
270
279
  case CMARK_NODE_HTML_INLINE:
271
280
  case CMARK_NODE_CODE:
272
- return cmark_chunk_to_cstr(&node->as.literal);
281
+ return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.literal);
273
282
 
274
283
  case CMARK_NODE_CODE_BLOCK:
275
- return cmark_chunk_to_cstr(&node->as.code.literal);
284
+ return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.code.literal);
276
285
 
277
286
  default:
278
287
  break;
@@ -291,11 +300,11 @@ int cmark_node_set_literal(cmark_node *node, const char *content) {
291
300
  case CMARK_NODE_TEXT:
292
301
  case CMARK_NODE_HTML_INLINE:
293
302
  case CMARK_NODE_CODE:
294
- cmark_chunk_set_cstr(&node->as.literal, content);
303
+ cmark_chunk_set_cstr(NODE_MEM(node), &node->as.literal, content);
295
304
  return 1;
296
305
 
297
306
  case CMARK_NODE_CODE_BLOCK:
298
- cmark_chunk_set_cstr(&node->as.code.literal, content);
307
+ cmark_chunk_set_cstr(NODE_MEM(node), &node->as.code.literal, content);
299
308
  return 1;
300
309
 
301
310
  default:
@@ -452,7 +461,7 @@ const char *cmark_node_get_fence_info(cmark_node *node) {
452
461
  }
453
462
 
454
463
  if (node->type == CMARK_NODE_CODE_BLOCK) {
455
- return cmark_chunk_to_cstr(&node->as.code.info);
464
+ return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.code.info);
456
465
  } else {
457
466
  return NULL;
458
467
  }
@@ -464,7 +473,7 @@ int cmark_node_set_fence_info(cmark_node *node, const char *info) {
464
473
  }
465
474
 
466
475
  if (node->type == CMARK_NODE_CODE_BLOCK) {
467
- cmark_chunk_set_cstr(&node->as.code.info, info);
476
+ cmark_chunk_set_cstr(NODE_MEM(node), &node->as.code.info, info);
468
477
  return 1;
469
478
  } else {
470
479
  return 0;
@@ -479,7 +488,7 @@ const char *cmark_node_get_url(cmark_node *node) {
479
488
  switch (node->type) {
480
489
  case CMARK_NODE_LINK:
481
490
  case CMARK_NODE_IMAGE:
482
- return cmark_chunk_to_cstr(&node->as.link.url);
491
+ return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.link.url);
483
492
  default:
484
493
  break;
485
494
  }
@@ -495,7 +504,7 @@ int cmark_node_set_url(cmark_node *node, const char *url) {
495
504
  switch (node->type) {
496
505
  case CMARK_NODE_LINK:
497
506
  case CMARK_NODE_IMAGE:
498
- cmark_chunk_set_cstr(&node->as.link.url, url);
507
+ cmark_chunk_set_cstr(NODE_MEM(node), &node->as.link.url, url);
499
508
  return 1;
500
509
  default:
501
510
  break;
@@ -512,7 +521,7 @@ const char *cmark_node_get_title(cmark_node *node) {
512
521
  switch (node->type) {
513
522
  case CMARK_NODE_LINK:
514
523
  case CMARK_NODE_IMAGE:
515
- return cmark_chunk_to_cstr(&node->as.link.title);
524
+ return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.link.title);
516
525
  default:
517
526
  break;
518
527
  }
@@ -528,7 +537,7 @@ int cmark_node_set_title(cmark_node *node, const char *title) {
528
537
  switch (node->type) {
529
538
  case CMARK_NODE_LINK:
530
539
  case CMARK_NODE_IMAGE:
531
- cmark_chunk_set_cstr(&node->as.link.title, title);
540
+ cmark_chunk_set_cstr(NODE_MEM(node), &node->as.link.title, title);
532
541
  return 1;
533
542
  default:
534
543
  break;
@@ -545,7 +554,7 @@ const char *cmark_node_get_on_enter(cmark_node *node) {
545
554
  switch (node->type) {
546
555
  case CMARK_NODE_CUSTOM_INLINE:
547
556
  case CMARK_NODE_CUSTOM_BLOCK:
548
- return cmark_chunk_to_cstr(&node->as.custom.on_enter);
557
+ return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.custom.on_enter);
549
558
  default:
550
559
  break;
551
560
  }
@@ -561,7 +570,7 @@ int cmark_node_set_on_enter(cmark_node *node, const char *on_enter) {
561
570
  switch (node->type) {
562
571
  case CMARK_NODE_CUSTOM_INLINE:
563
572
  case CMARK_NODE_CUSTOM_BLOCK:
564
- cmark_chunk_set_cstr(&node->as.custom.on_enter, on_enter);
573
+ cmark_chunk_set_cstr(NODE_MEM(node), &node->as.custom.on_enter, on_enter);
565
574
  return 1;
566
575
  default:
567
576
  break;
@@ -578,7 +587,7 @@ const char *cmark_node_get_on_exit(cmark_node *node) {
578
587
  switch (node->type) {
579
588
  case CMARK_NODE_CUSTOM_INLINE:
580
589
  case CMARK_NODE_CUSTOM_BLOCK:
581
- return cmark_chunk_to_cstr(&node->as.custom.on_exit);
590
+ return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.custom.on_exit);
582
591
  default:
583
592
  break;
584
593
  }
@@ -594,7 +603,7 @@ int cmark_node_set_on_exit(cmark_node *node, const char *on_exit) {
594
603
  switch (node->type) {
595
604
  case CMARK_NODE_CUSTOM_INLINE:
596
605
  case CMARK_NODE_CUSTOM_BLOCK:
597
- cmark_chunk_set_cstr(&node->as.custom.on_exit, on_exit);
606
+ cmark_chunk_set_cstr(NODE_MEM(node), &node->as.custom.on_exit, on_exit);
598
607
  return 1;
599
608
  default:
600
609
  break;
@@ -25,11 +25,10 @@ typedef struct {
25
25
  typedef struct {
26
26
  cmark_chunk info;
27
27
  cmark_chunk literal;
28
- int fence_length;
29
- /* fence_offset must be 0-3, so we can use int8_t */
30
- int8_t fence_offset;
28
+ uint8_t fence_length;
29
+ uint8_t fence_offset;
31
30
  unsigned char fence_char;
32
- bool fenced;
31
+ int8_t fenced;
33
32
  } cmark_code;
34
33
 
35
34
  typedef struct {
@@ -47,7 +46,14 @@ typedef struct {
47
46
  cmark_chunk on_exit;
48
47
  } cmark_custom;
49
48
 
49
+ enum cmark_node__internal_flags {
50
+ CMARK_NODE__OPEN = (1 << 0),
51
+ CMARK_NODE__LAST_LINE_BLANK = (1 << 1),
52
+ };
53
+
50
54
  struct cmark_node {
55
+ cmark_strbuf content;
56
+
51
57
  struct cmark_node *next;
52
58
  struct cmark_node *prev;
53
59
  struct cmark_node *parent;
@@ -60,13 +66,8 @@ struct cmark_node {
60
66
  int start_column;
61
67
  int end_line;
62
68
  int end_column;
63
-
64
- cmark_node_type type;
65
-
66
- bool open;
67
- bool last_line_blank;
68
-
69
- cmark_strbuf string_content;
69
+ uint16_t type;
70
+ uint16_t flags;
70
71
 
71
72
  union {
72
73
  cmark_chunk literal;
@@ -79,6 +80,9 @@ struct cmark_node {
79
80
  } as;
80
81
  };
81
82
 
83
+ static CMARK_INLINE cmark_mem *cmark_node_mem(cmark_node *node) {
84
+ return node->content.mem;
85
+ }
82
86
  CMARK_EXPORT int cmark_node_check(cmark_node *node, FILE *out);
83
87
 
84
88
  #ifdef __cplusplus