mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-02 14:16:16 -04:00
adding pegmarkdown support library.
git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-gxs-b1@5953 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
4413536926
commit
3be22536df
107 changed files with 20038 additions and 0 deletions
117
supportlibs/pegmarkdown/parsing_functions.c
Normal file
117
supportlibs/pegmarkdown/parsing_functions.c
Normal file
|
@ -0,0 +1,117 @@
|
|||
/* 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;
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue