jgm / peg-markdown

An implementation of markdown in C, using a PEG grammar

This URL has Read+Write access

peg-markdown / parsing_functions.c
bea5f65c » jgm 2008-06-12 Removed c function definiti... 1 /* parsing_functions.c - Functions for parsing markdown and
2 * freeing element lists. */
3
4 int yyparse(void);
5
6 static void free_element_contents(element elt);
7
8 /* free_element_list - free list of elements recursively */
9 void free_element_list(element * elt) {
10 element * next = NULL;
11 while (elt != NULL) {
12 next = elt->next;
13 free_element_contents(*elt);
14 if (elt->children != NULL) {
15 free_element_list(elt->children);
16 elt->children = NULL;
17 }
18 free(elt);
19 elt = next;
20 }
21 }
22
23 /* free_element_contents - free element contents depending on type */
24 static void free_element_contents(element elt) {
25 switch (elt.key) {
26 case STR:
27 case SPACE:
28 case RAW:
29 case HTMLBLOCK:
30 case HTML:
31 case VERBATIM:
32 case CODE:
33 case NOTE:
34 free(elt.contents.str);
35 elt.contents.str = NULL;
36 break;
37 case LINK:
38 case IMAGE:
39 case REFERENCE:
40 free(elt.contents.link->url);
41 elt.contents.link->url = NULL;
42 free(elt.contents.link->title);
43 elt.contents.link->title = NULL;
44 free_element_list(elt.contents.link->label);
45 free(elt.contents.link);
46 elt.contents.link = NULL;
47 break;
48 default:
49 ;
50 }
51 }
52
53 /* free_element - free element and contents */
54 void free_element(element *elt) {
55 free_element_contents(*elt);
56 free(elt);
57 }
58
59 element * parse_references(char *string, int extensions) {
60
61 char *oldcharbuf;
62 syntax_extensions = extensions;
63
64 oldcharbuf = charbuf;
65 charbuf = string;
66 yyparsefrom(yy_References); /* first pass, just to collect references */
67 charbuf = oldcharbuf;
68
69 return references;
70 }
71
72 element * parse_notes(char *string, int extensions, element *reference_list) {
73
74 char *oldcharbuf;
75 notes = NULL;
76 syntax_extensions = extensions;
77
78 if (extension(EXT_NOTES)) {
79 references = reference_list;
80 oldcharbuf = charbuf;
81 charbuf = string;
82 yyparsefrom(yy_Notes); /* second pass for notes */
83 charbuf = oldcharbuf;
84 }
85
86 return notes;
87 }
88
89 element * parse_markdown(char *string, int extensions, element *reference_list, element *note_list) {
90
91 char *oldcharbuf;
92 syntax_extensions = extensions;
93 references = reference_list;
94 notes = note_list;
95
96 oldcharbuf = charbuf;
97 charbuf = string;
98
99 yyparsefrom(yy_Doc);
100
101 charbuf = oldcharbuf; /* restore charbuf to original value */
102 return parse_result;
103
104 }