1 #include <stdint.h>
2 #include <stdlib.h>
3 #include <string.h>
4 
5 #include "config.h"
6 #include "cmark-gfm.h"
7 #include "syntax_extension.h"
8 #include "registry.h"
9 #include "plugin.h"
10 
11 extern cmark_mem CMARK_DEFAULT_MEM_ALLOCATOR;
12 
13 static cmark_llist *syntax_extensions = NULL;
14 
cmark_register_plugin(cmark_plugin_init_func reg_fn)15 void cmark_register_plugin(cmark_plugin_init_func reg_fn) {
16   cmark_plugin *plugin = cmark_plugin_new();
17 
18   if (!reg_fn(plugin)) {
19     cmark_plugin_free(plugin);
20     return;
21   }
22 
23   cmark_llist *syntax_extensions_list = cmark_plugin_steal_syntax_extensions(plugin),
24               *it;
25 
26   for (it = syntax_extensions_list; it; it = it->next) {
27     syntax_extensions = cmark_llist_append(&CMARK_DEFAULT_MEM_ALLOCATOR, syntax_extensions, it->data);
28   }
29 
30   cmark_llist_free(&CMARK_DEFAULT_MEM_ALLOCATOR, syntax_extensions_list);
31   cmark_plugin_free(plugin);
32 }
33 
cmark_release_plugins(void)34 void cmark_release_plugins(void) {
35   if (syntax_extensions) {
36     cmark_llist_free_full(
37         &CMARK_DEFAULT_MEM_ALLOCATOR,
38         syntax_extensions,
39         (cmark_free_func) cmark_syntax_extension_free);
40     syntax_extensions = NULL;
41   }
42 }
43 
cmark_list_syntax_extensions(cmark_mem * mem)44 cmark_llist *cmark_list_syntax_extensions(cmark_mem *mem) {
45   cmark_llist *it;
46   cmark_llist *res = NULL;
47 
48   for (it = syntax_extensions; it; it = it->next) {
49     res = cmark_llist_append(mem, res, it->data);
50   }
51   return res;
52 }
53 
cmark_find_syntax_extension(const char * name)54 cmark_syntax_extension *cmark_find_syntax_extension(const char *name) {
55   cmark_llist *tmp;
56 
57   for (tmp = syntax_extensions; tmp; tmp = tmp->next) {
58     cmark_syntax_extension *ext = (cmark_syntax_extension *) tmp->data;
59     if (!strcmp(ext->name, name))
60       return ext;
61   }
62   return NULL;
63 }
64