mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-12-16 11:24:24 -05:00
118 lines
2.8 KiB
C
118 lines
2.8 KiB
C
|
/* parsing_functions.c - Functions for parsing markdown and
|
||
|
* freeing element lists. */
|
||
|
|
||
|
/* These yy_* functions come from markdown_parser.c which is
|
||
|
* generated from markdown_parser.leg
|
||
|
* */
|
||
|
typedef int (*yyrule)();
|
||
|
|
||
|
extern int yyparse();
|
||
|
extern int yyparsefrom(yyrule);
|
||
|
extern int yy_References();
|
||
|
extern int yy_Notes();
|
||
|
extern int yy_Doc();
|
||
|
|
||
|
#include "utility_functions.h"
|
||
|
#include "parsing_functions.h"
|
||
|
#include "markdown_peg.h"
|
||
|
|
||
|
static void free_element_contents(element elt);
|
||
|
|
||
|
/* free_element_list - free list of elements recursively */
|
||
|
void free_element_list(element * elt) {
|
||
|
element * next = NULL;
|
||
|
while (elt != NULL) {
|
||
|
next = elt->next;
|
||
|
free_element_contents(*elt);
|
||
|
if (elt->children != NULL) {
|
||
|
free_element_list(elt->children);
|
||
|
elt->children = NULL;
|
||
|
}
|
||
|
free(elt);
|
||
|
elt = next;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* free_element_contents - free element contents depending on type */
|
||
|
static void free_element_contents(element elt) {
|
||
|
switch (elt.key) {
|
||
|
case STR:
|
||
|
case SPACE:
|
||
|
case RAW:
|
||
|
case HTMLBLOCK:
|
||
|
case HTML:
|
||
|
case VERBATIM:
|
||
|
case CODE:
|
||
|
case NOTE:
|
||
|
free(elt.contents.str);
|
||
|
elt.contents.str = NULL;
|
||
|
break;
|
||
|
case LINK:
|
||
|
case IMAGE:
|
||
|
case REFERENCE:
|
||
|
free(elt.contents.link->url);
|
||
|
elt.contents.link->url = NULL;
|
||
|
free(elt.contents.link->title);
|
||
|
elt.contents.link->title = NULL;
|
||
|
free_element_list(elt.contents.link->label);
|
||
|
free(elt.contents.link);
|
||
|
elt.contents.link = NULL;
|
||
|
break;
|
||
|
default:
|
||
|
;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* free_element - free element and contents */
|
||
|
void free_element(element *elt) {
|
||
|
free_element_contents(*elt);
|
||
|
free(elt);
|
||
|
}
|
||
|
|
||
|
element * parse_references(char *string, int extensions) {
|
||
|
|
||
|
char *oldcharbuf;
|
||
|
syntax_extensions = extensions;
|
||
|
|
||
|
oldcharbuf = charbuf;
|
||
|
charbuf = string;
|
||
|
yyparsefrom(yy_References); /* first pass, just to collect references */
|
||
|
charbuf = oldcharbuf;
|
||
|
|
||
|
return references;
|
||
|
}
|
||
|
|
||
|
element * parse_notes(char *string, int extensions, element *reference_list) {
|
||
|
|
||
|
char *oldcharbuf;
|
||
|
notes = NULL;
|
||
|
syntax_extensions = extensions;
|
||
|
|
||
|
if (extension(EXT_NOTES)) {
|
||
|
references = reference_list;
|
||
|
oldcharbuf = charbuf;
|
||
|
charbuf = string;
|
||
|
yyparsefrom(yy_Notes); /* second pass for notes */
|
||
|
charbuf = oldcharbuf;
|
||
|
}
|
||
|
|
||
|
return notes;
|
||
|
}
|
||
|
|
||
|
element * parse_markdown(char *string, int extensions, element *reference_list, element *note_list) {
|
||
|
|
||
|
char *oldcharbuf;
|
||
|
syntax_extensions = extensions;
|
||
|
references = reference_list;
|
||
|
notes = note_list;
|
||
|
|
||
|
oldcharbuf = charbuf;
|
||
|
charbuf = string;
|
||
|
|
||
|
yyparsefrom(yy_Doc);
|
||
|
|
||
|
charbuf = oldcharbuf; /* restore charbuf to original value */
|
||
|
return parse_result;
|
||
|
|
||
|
}
|