Commit Diff


commit - 4b4957102a5af07c2ee89babbc50e646362e7af9
commit + d54dd8160b88709f3d243e1410a781e5de7fc187
blob - 372529021fd1833629b45acdab87efb6e8a76704
blob + 139362e34af8b6febd80d92fbf8f87003c580b23
--- include/parser.h
+++ include/parser.h
@@ -24,7 +24,7 @@ typedef void (*parserfn)(struct parser *);
 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
@@ -142,9 +142,11 @@ struct vline {
 
 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
@@ -40,6 +40,20 @@ struct mcache_entry {
 	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)
 {
@@ -111,7 +125,7 @@ mcache_tab(struct tab *tab)
 	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
@@ -65,21 +65,21 @@ parser_free(struct tab *tab)
 }
 
 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
@@ -35,7 +35,7 @@
 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);
@@ -442,7 +442,7 @@ static const char *gemtext_prefixes[] = {
 };
 
 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;
@@ -466,13 +466,12 @@ gemtext_serialize(struct parser *p, struct evbuffer *e
 		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
@@ -23,8 +23,6 @@
 #include "parser.h"
 #include "utils.h"
 
-#define evap evbuffer_add_printf
-
 struct gm_selector {
 	char		 type;
 	const char	*ds;
@@ -38,7 +36,7 @@ static void	gm_parse_selector(char *, struct gm_select
 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)
@@ -224,7 +222,7 @@ gopher_skip_selector(const char *path, int *ret_type)
 }
 
 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;
@@ -234,7 +232,7 @@ serialize_link(struct line *line, const char *text, st
 		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:// */
@@ -264,12 +262,12 @@ serialize_link(struct line *line, const char *text, st
 	} 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;
@@ -281,17 +279,15 @@ gm_serialize(struct parser *p, struct evbuffer *evb)
 
 		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: