jgm / peg-markdown
- Source
- Commits
- Network (2)
- Issues (0)
- Downloads (12)
- Wiki (1)
- Graphs
-
Tree:
6afc066
peg-markdown / parsing_functions.c
| bea5f65c » | jgm | 2008-06-12 | 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 | } | ||||
