commit - 4b4957102a5af07c2ee89babbc50e646362e7af9
commit + d54dd8160b88709f3d243e1410a781e5de7fc187
blob - 372529021fd1833629b45acdab87efb6e8a76704
blob + 139362e34af8b6febd80d92fbf8f87003c580b23
--- include/parser.h
+++ include/parser.h
void parser_init(struct tab *, parserfn);
int parser_parse(struct tab *, const char *, size_t);
int parser_free(struct tab *);
-int parser_serialize(struct tab *, struct evbuffer *);
+int parser_serialize(struct tab *, printfn, void *);
int parser_append(struct parser*, const char*, size_t);
int parser_set_buf(struct parser*, const char*, size_t);
blob - 35d62cdf65eb32eb35a51fc8c3c7316463038e83
blob + a8675f3269afa1e8fa7a1e9cacee89e03d32d3be
--- include/telescope.h
+++ include/telescope.h
struct parser;
-typedef int (*parsechunkfn)(struct parser*, const char*, size_t);
-typedef int (*parserfreefn)(struct parser*);
-typedef int (*parserserial)(struct parser*, struct evbuffer *);
+typedef int (*printfn)(void *, const char *, ...);
+
+typedef int (*parsechunkfn)(struct parser *, const char *, size_t);
+typedef int (*parserfreefn)(struct parser *);
+typedef int (*parserserial)(struct parser *, printfn, void *);
typedef void (imsg_handlerfn)(struct imsg*, size_t);
blob - af63f272dbff95b1eb34769bfc0ca457370f9508
blob + fbc78d9feb5e311652163ccfd93a1bb426d87511
--- mcache.c
+++ mcache.c
char url[];
};
+static int
+mcache_printf(void *d, const char *fmt, ...)
+{
+ struct evbuffer *evb = d;
+ int r;
+ va_list ap;
+
+ va_start(ap, fmt);
+ r = evbuffer_add_vprintf(evb, fmt, ap);
+ va_end(ap);
+
+ return r;
+}
+
static void
mcache_free_entry(const char *url)
{
if ((e->evb = evbuffer_new()) == NULL)
goto err;
- if (!parser_serialize(tab, e->evb))
+ if (!parser_serialize(tab, mcache_printf, e->evb))
goto err;
/* free any previously cached copies of this page */
blob - a44cdba406d715fdfc5e068f0848918ce48fb8d7
blob + e2aa82aa307850add21cdc70450324b93777be7b
--- parser/parser.c
+++ parser/parser.c
}
int
-parser_serialize(struct tab *tab, struct evbuffer *evb)
+parser_serialize(struct tab *tab, printfn fn, void *d)
{
struct line *line;
const char *text;
int r;
if (tab->buffer.page.serialize != NULL)
- return tab->buffer.page.serialize(&tab->buffer.page, evb);
+ return tab->buffer.page.serialize(&tab->buffer.page, fn, d);
/* a default implementation good enough for plain text */
TAILQ_FOREACH(line, &tab->buffer.page.head, lines) {
if ((text = line->line) == NULL)
text = "";
- r = evbuffer_add_printf(evb, "%s\n", text);
+ r = fn(d, "%s\n", text);
if (r == -1)
return 0;
}
blob - e23b368b5089ed079d433d6d5f8803e3f2480373
blob + a9f97874bf34707b96d70a37912a5a89b453e31c
--- parser/parser_gemtext.c
+++ parser/parser_gemtext.c
static int gemtext_parse(struct parser *, const char *, size_t);
static int gemtext_foreach_line(struct parser *, const char *, size_t);
static int gemtext_free(struct parser *);
-static int gemtext_serialize(struct parser *, struct evbuffer *);
+static int gemtext_serialize(struct parser *, printfn, void *);
static int parse_text(struct parser*, enum line_type, const char*, size_t);
static int parse_link(struct parser*, enum line_type, const char*, size_t);
};
static int
-gemtext_serialize(struct parser *p, struct evbuffer *evb)
+gemtext_serialize(struct parser *p, printfn fn, void *d)
{
struct line *line;
const char *text;
case LINE_PRE_START:
case LINE_PRE_CONTENT:
case LINE_PRE_END:
- r = evbuffer_add_printf(evb, "%s%s\n",
- gemtext_prefixes[line->type], text);
+ r = fn(d, "%s%s\n", gemtext_prefixes[line->type],
+ text);
break;
case LINE_LINK:
- r = evbuffer_add_printf(evb, "=> %s %s\n",
- alt, text);
+ r = fn(d, "=> %s %s\n", alt, text);
break;
default:
blob - 27a3142a5eb4ef23844d4074b1022269612c4ffa
blob + 82f869d83bbba4bf267ab4c1867896e3e8565810
--- parser/parser_gophermap.c
+++ parser/parser_gophermap.c
#include "parser.h"
#include "utils.h"
-#define evap evbuffer_add_printf
-
struct gm_selector {
char type;
const char *ds;
static int gm_parse(struct parser *, const char *, size_t);
static int gm_foreach_line(struct parser *, const char *, size_t);
static int gm_free(struct parser *);
-static int gm_serialize(struct parser *, struct evbuffer *);
+static int gm_serialize(struct parser *, printfn, void *);
void
gophermap_initparser(struct parser *p)
}
static int
-serialize_link(struct line *line, const char *text, struct evbuffer *evb)
+serialize_link(struct line *line, const char *text, printfn fn, void *d)
{
size_t portlen = 0;
int type;
return -1;
if (!has_prefix(uri, "gopher://"))
- return evap(evb, "h%s\tURL:%s\terror.host\t1\n",
+ return fn(d, "h%s\tURL:%s\terror.host\t1\n",
text, line->alt);
uri += 9; /* skip gopher:// */
} else
path = gopher_skip_selector(path, &type);
- return evap(evb, "%c%s\t%s\t%.*s\t%.*s\n", type, text,
+ return fn(d, "%c%s\t%s\t%.*s\t%.*s\n", type, text,
path, (int)(endhost - uri), uri, (int)portlen, port);
}
static int
-gm_serialize(struct parser *p, struct evbuffer *evb)
+gm_serialize(struct parser *p, printfn fn, void *d)
{
struct line *line;
const char *text;
switch (line->type) {
case LINE_LINK:
- r = serialize_link(line, text, evb);
+ r = serialize_link(line, text, fn, d);
break;
case LINE_TEXT:
- r = evap(evb, "i%s\t\terror.host\t1\n",
- text);
+ r = fn(d, "i%s\t\terror.host\t1\n", text);
break;
case LINE_QUOTE:
- r = evap(evb, "3%s\t\terror.host\t1\n",
- text);
+ r = fn(d, "3%s\t\terror.host\t1\n", text);
break;
default: