commit - 069c9a92f36df9d307d734ffa8903035c7181129
commit + fe84b7508f733106d346acf1b120951c78ad77a1
blob - fed5701db9d4d1231f26afdf5888b67adc3f501b
blob + af63f272dbff95b1eb34769bfc0ca457370f9508
--- mcache.c
+++ mcache.c
#include "parser.h"
#include "utils.h"
-static const char *gemtext_prefixes[] = {
- [LINE_TEXT] = "",
- [LINE_TITLE_1] = "# ",
- [LINE_TITLE_2] = "## ",
- [LINE_TITLE_3] = "### ",
- [LINE_ITEM] = "* ",
- [LINE_QUOTE] = "> ",
- [LINE_PRE_START] = "``` ",
- [LINE_PRE_CONTENT] = "",
- [LINE_PRE_END] = "```",
-};
-
static struct timeval tv = { 5 * 60, 0 };
static struct event timerev;
struct mcache_entry {
time_t ts;
- const char *parser_name;
+ parserfn parser;
int trust;
struct evbuffer *evb;
char url[];
mcache_tab(struct tab *tab)
{
struct mcache_entry *e;
- struct line *line;
unsigned int slot;
size_t l, len;
const char *url;
if ((e = calloc(1, len)) == NULL)
return -1;
e->ts = time(NULL);
- e->parser_name = tab->buffer.page.name;
+ e->parser = tab->buffer.page.init;
e->trust = tab->trust;
memcpy(e->url, url, l);
if ((e->evb = evbuffer_new()) == NULL)
goto err;
- TAILQ_FOREACH(line, &tab->buffer.page.head, lines) {
- const char *text, *alt;
- int r;
+ if (!parser_serialize(tab, e->evb))
+ goto err;
- if ((text = line->line) == NULL)
- text = "";
-
- if ((alt = line->alt) == NULL)
- alt = "";
-
- switch (line->type) {
- case LINE_TEXT:
- case LINE_TITLE_1:
- case LINE_TITLE_2:
- case LINE_TITLE_3:
- case LINE_ITEM:
- case LINE_QUOTE:
- case LINE_PRE_START:
- case LINE_PRE_CONTENT:
- case LINE_PRE_END:
- r = evbuffer_add_printf(e->evb, "%s%s\n",
- gemtext_prefixes[line->type], text);
- break;
-
- case LINE_LINK:
- r = evbuffer_add_printf(e->evb, "=> %s %s\n",
- alt, text);
- break;
-
- case LINE_PATCH:
- case LINE_PATCH_HDR:
- case LINE_PATCH_HUNK_HDR:
- case LINE_PATCH_ADD:
- case LINE_PATCH_DEL:
- /* TODO */
- r = -1;
- break;
-
- case LINE_COMPL:
- case LINE_COMPL_CURRENT:
- case LINE_HELP:
- case LINE_DOWNLOAD:
- case LINE_DOWNLOAD_DONE:
- case LINE_DOWNLOAD_INFO:
- case LINE_FRINGE:
- /* not reached */
- abort();
- }
-
- if (r == -1)
- goto err;
- }
-
/* free any previously cached copies of this page */
mcache_free_entry(url);
if ((e = ohash_find(&h, slot)) == NULL)
return 0;
- parser_init(tab, gemtext_initparser);
+ parser_init(tab, e->parser);
if (!parser_parse(tab, EVBUFFER_DATA(e->evb), EVBUFFER_LENGTH(e->evb)))
goto err;
if (!parser_free(tab))
goto err;
- tab->buffer.page.name = e->parser_name;
tab->trust = e->trust;
return 1;