1 #include <stdlib.h>
2 #include <assert.h>
3 
4 #include "cmark-gfm.h"
5 #include "syntax_extension.h"
6 #include "buffer.h"
7 
8 extern cmark_mem CMARK_DEFAULT_MEM_ALLOCATOR;
9 
10 static cmark_mem *_mem = &CMARK_DEFAULT_MEM_ALLOCATOR;
11 
cmark_syntax_extension_free(cmark_mem * mem,cmark_syntax_extension * extension)12 void cmark_syntax_extension_free(cmark_mem *mem, cmark_syntax_extension *extension) {
13   if (extension->free_function && extension->priv) {
14     extension->free_function(mem, extension->priv);
15   }
16 
17   cmark_llist_free(mem, extension->special_inline_chars);
18   mem->free(extension->name);
19   mem->free(extension);
20 }
21 
cmark_syntax_extension_new(const char * name)22 cmark_syntax_extension *cmark_syntax_extension_new(const char *name) {
23   cmark_syntax_extension *res = (cmark_syntax_extension *) _mem->calloc(1, sizeof(cmark_syntax_extension));
24   res->name = (char *) _mem->calloc(1, sizeof(char) * (strlen(name)) + 1);
25   strcpy(res->name, name);
26   return res;
27 }
28 
cmark_syntax_extension_add_node(int is_inline)29 cmark_node_type cmark_syntax_extension_add_node(int is_inline) {
30   cmark_node_type *ref = !is_inline ? &CMARK_NODE_LAST_BLOCK : &CMARK_NODE_LAST_INLINE;
31 
32   if ((*ref & CMARK_NODE_VALUE_MASK) == CMARK_NODE_VALUE_MASK) {
33     assert(false);
34     return (cmark_node_type) 0;
35   }
36 
37   return *ref = (cmark_node_type) ((int) *ref + 1);
38 }
39 
cmark_syntax_extension_set_emphasis(cmark_syntax_extension * extension,int emphasis)40 void cmark_syntax_extension_set_emphasis(cmark_syntax_extension *extension,
41                                          int emphasis) {
42   extension->emphasis = emphasis == 1;
43 }
44 
cmark_syntax_extension_set_open_block_func(cmark_syntax_extension * extension,cmark_open_block_func func)45 void cmark_syntax_extension_set_open_block_func(cmark_syntax_extension *extension,
46                                                 cmark_open_block_func func) {
47   extension->try_opening_block = func;
48 }
49 
cmark_syntax_extension_set_match_block_func(cmark_syntax_extension * extension,cmark_match_block_func func)50 void cmark_syntax_extension_set_match_block_func(cmark_syntax_extension *extension,
51                                                  cmark_match_block_func func) {
52   extension->last_block_matches = func;
53 }
54 
cmark_syntax_extension_set_match_inline_func(cmark_syntax_extension * extension,cmark_match_inline_func func)55 void cmark_syntax_extension_set_match_inline_func(cmark_syntax_extension *extension,
56                                                   cmark_match_inline_func func) {
57   extension->match_inline = func;
58 }
59 
cmark_syntax_extension_set_inline_from_delim_func(cmark_syntax_extension * extension,cmark_inline_from_delim_func func)60 void cmark_syntax_extension_set_inline_from_delim_func(cmark_syntax_extension *extension,
61                                                        cmark_inline_from_delim_func func) {
62   extension->insert_inline_from_delim = func;
63 }
64 
cmark_syntax_extension_set_special_inline_chars(cmark_syntax_extension * extension,cmark_llist * special_chars)65 void cmark_syntax_extension_set_special_inline_chars(cmark_syntax_extension *extension,
66                                                      cmark_llist *special_chars) {
67   extension->special_inline_chars = special_chars;
68 }
69 
cmark_syntax_extension_set_get_type_string_func(cmark_syntax_extension * extension,cmark_get_type_string_func func)70 void cmark_syntax_extension_set_get_type_string_func(cmark_syntax_extension *extension,
71                                                      cmark_get_type_string_func func) {
72   extension->get_type_string_func = func;
73 }
74 
cmark_syntax_extension_set_can_contain_func(cmark_syntax_extension * extension,cmark_can_contain_func func)75 void cmark_syntax_extension_set_can_contain_func(cmark_syntax_extension *extension,
76                                                  cmark_can_contain_func func) {
77   extension->can_contain_func = func;
78 }
79 
cmark_syntax_extension_set_contains_inlines_func(cmark_syntax_extension * extension,cmark_contains_inlines_func func)80 void cmark_syntax_extension_set_contains_inlines_func(cmark_syntax_extension *extension,
81                                                       cmark_contains_inlines_func func) {
82   extension->contains_inlines_func = func;
83 }
84 
cmark_syntax_extension_set_commonmark_render_func(cmark_syntax_extension * extension,cmark_common_render_func func)85 void cmark_syntax_extension_set_commonmark_render_func(cmark_syntax_extension *extension,
86                                                        cmark_common_render_func func) {
87   extension->commonmark_render_func = func;
88 }
89 
cmark_syntax_extension_set_plaintext_render_func(cmark_syntax_extension * extension,cmark_common_render_func func)90 void cmark_syntax_extension_set_plaintext_render_func(cmark_syntax_extension *extension,
91                                                       cmark_common_render_func func) {
92   extension->plaintext_render_func = func;
93 }
94 
cmark_syntax_extension_set_latex_render_func(cmark_syntax_extension * extension,cmark_common_render_func func)95 void cmark_syntax_extension_set_latex_render_func(cmark_syntax_extension *extension,
96                                                   cmark_common_render_func func) {
97   extension->latex_render_func = func;
98 }
99 
cmark_syntax_extension_set_xml_attr_func(cmark_syntax_extension * extension,cmark_xml_attr_func func)100 void cmark_syntax_extension_set_xml_attr_func(cmark_syntax_extension *extension,
101                                               cmark_xml_attr_func func) {
102   extension->xml_attr_func = func;
103 }
104 
cmark_syntax_extension_set_man_render_func(cmark_syntax_extension * extension,cmark_common_render_func func)105 void cmark_syntax_extension_set_man_render_func(cmark_syntax_extension *extension,
106                                                 cmark_common_render_func func) {
107   extension->man_render_func = func;
108 }
109 
cmark_syntax_extension_set_html_render_func(cmark_syntax_extension * extension,cmark_html_render_func func)110 void cmark_syntax_extension_set_html_render_func(cmark_syntax_extension *extension,
111                                                  cmark_html_render_func func) {
112   extension->html_render_func = func;
113 }
114 
cmark_syntax_extension_set_html_filter_func(cmark_syntax_extension * extension,cmark_html_filter_func func)115 void cmark_syntax_extension_set_html_filter_func(cmark_syntax_extension *extension,
116                                                  cmark_html_filter_func func) {
117   extension->html_filter_func = func;
118 }
119 
cmark_syntax_extension_set_postprocess_func(cmark_syntax_extension * extension,cmark_postprocess_func func)120 void cmark_syntax_extension_set_postprocess_func(cmark_syntax_extension *extension,
121                                                  cmark_postprocess_func func) {
122   extension->postprocess_func = func;
123 }
124 
cmark_syntax_extension_set_private(cmark_syntax_extension * extension,void * priv,cmark_free_func free_func)125 void cmark_syntax_extension_set_private(cmark_syntax_extension *extension,
126                                         void *priv,
127                                         cmark_free_func free_func) {
128   extension->priv = priv;
129   extension->free_function = free_func;
130 }
131 
cmark_syntax_extension_get_private(cmark_syntax_extension * extension)132 void *cmark_syntax_extension_get_private(cmark_syntax_extension *extension) {
133     return extension->priv;
134 }
135 
cmark_syntax_extension_set_opaque_alloc_func(cmark_syntax_extension * extension,cmark_opaque_alloc_func func)136 void cmark_syntax_extension_set_opaque_alloc_func(cmark_syntax_extension *extension,
137                                                   cmark_opaque_alloc_func func) {
138   extension->opaque_alloc_func = func;
139 }
140 
cmark_syntax_extension_set_opaque_free_func(cmark_syntax_extension * extension,cmark_opaque_free_func func)141 void cmark_syntax_extension_set_opaque_free_func(cmark_syntax_extension *extension,
142                                                  cmark_opaque_free_func func) {
143   extension->opaque_free_func = func;
144 }
145 
cmark_syntax_extension_set_commonmark_escape_func(cmark_syntax_extension * extension,cmark_commonmark_escape_func func)146 void cmark_syntax_extension_set_commonmark_escape_func(cmark_syntax_extension *extension,
147                                                        cmark_commonmark_escape_func func) {
148   extension->commonmark_escape_func = func;
149 }
150