Commit Diff


commit - 288b931b133c51a6eccdbc4a25baf2aaf65273d1
commit + 0110411e1e32fa44d6e086f652dac916fc8707cf
blob - 139362e34af8b6febd80d92fbf8f87003c580b23
blob + d78c06a5d79487bdde5bcf29258b85c61328dd2f
--- 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 *, printfn, void *);
+int	 parser_serialize(struct tab *, FILE *);
 
 int	 parser_append(struct parser*, const char*, size_t);
 int	 parser_set_buf(struct parser*, const char*, size_t);
blob - 899095748a8c6c35c1cae68b7e59082e7640ab9a
blob + 6a667eb7b16f9dad1e16d5bf2c992fa983d7a215
--- include/telescope.h
+++ include/telescope.h
@@ -20,6 +20,7 @@
 #include "compat.h"
 
 #include <limits.h>
+#include <stdio.h>		/* XXX: for parsers.h */
 
 #include "cmd.h"
 #include "phos.h"
@@ -146,7 +147,7 @@ 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 int	(*parserserial)(struct parser *, FILE *);
 
 typedef void (imsg_handlerfn)(struct imsg*, size_t);
 
blob - fbc78d9feb5e311652163ccfd93a1bb426d87511
blob + 15ad787db716874d579217b8bfb8b4c61a5a9890
--- mcache.c
+++ mcache.c
@@ -36,24 +36,11 @@ struct mcache_entry {
 	time_t		 ts;
 	parserfn	 parser;
 	int		 trust;
-	struct evbuffer	*evb;
+	char		*buf;
+	size_t		 buflen;
 	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)
 {
@@ -65,9 +52,9 @@ mcache_free_entry(const char *url)
 		return;
 
 	npages--;
-	tot -= EVBUFFER_LENGTH(e->evb);
+	tot -= e->buflen;
 
-	evbuffer_free(e->evb);
+	free(e->buf);
 	free(e);
 }
 
@@ -110,6 +97,7 @@ mcache_tab(struct tab *tab)
 	unsigned int		 slot;
 	size_t			 l, len;
 	const char		*url;
+	FILE			*fp;
 
 	url = tab->hist_cur->h;
 	l = strlen(url);
@@ -122,12 +110,14 @@ mcache_tab(struct tab *tab)
 	e->trust = tab->trust;
 	memcpy(e->url, url, l);
 
-	if ((e->evb = evbuffer_new()) == NULL)
+	if ((fp = open_memstream(&e->buf, &e->buflen)) == NULL)
 		goto err;
 
-	if (!parser_serialize(tab, mcache_printf, e->evb))
+	if (!parser_serialize(tab, fp))
 		goto err;
 
+	fclose(fp);
+
 	/* free any previously cached copies of this page */
 	mcache_free_entry(url);
 
@@ -135,7 +125,7 @@ mcache_tab(struct tab *tab)
 	ohash_insert(&h, slot, e);
 
 	npages++;
-	tot += EVBUFFER_LENGTH(e->evb);
+	tot += e->buflen;
 
 	if (!evtimer_pending(&timerev, NULL))
 		evtimer_add(&timerev, &tv);
@@ -143,8 +133,10 @@ mcache_tab(struct tab *tab)
 	return 0;
 
 err:
-	if (e->evb != NULL)
-		evbuffer_free(e->evb);
+	if (fp != NULL)
+		fclose(fp);
+	if (e->buf != NULL)
+		free(e->buf);
 	free(e);
 	return -1;
 }
@@ -160,7 +152,7 @@ mcache_lookup(const char *url, struct tab *tab)
 		return 0;
 
 	parser_init(tab, e->parser);
-	if (!parser_parse(tab, EVBUFFER_DATA(e->evb), EVBUFFER_LENGTH(e->evb)))
+	if (!parser_parse(tab, e->buf, e->buflen))
 		goto err;
 	if (!parser_free(tab))
 		goto err;
blob - e2aa82aa307850add21cdc70450324b93777be7b
blob + 45201b7cab3fcfecf1c0847838242ecdac11e89e
--- parser/parser.c
+++ parser/parser.c
@@ -65,21 +65,21 @@ parser_free(struct tab *tab)
 }
 
 int
-parser_serialize(struct tab *tab, printfn fn, void *d)
+parser_serialize(struct tab *tab, FILE *fp)
 {
 	struct line	*line;
 	const char	*text;
 	int		 r;
 
 	if (tab->buffer.page.serialize != NULL)
-		return tab->buffer.page.serialize(&tab->buffer.page, fn, d);
+		return tab->buffer.page.serialize(&tab->buffer.page, fp);
 
 	/* a default implementation good enough for plain text */
 	TAILQ_FOREACH(line, &tab->buffer.page.head, lines) {
 		if ((text = line->line) == NULL)
 			text = "";
 
-		r = fn(d, "%s\n", text);
+		r = fprintf(fp, "%s\n", text);
 		if (r == -1)
 			return 0;
 	}
blob - a9f97874bf34707b96d70a37912a5a89b453e31c
blob + 8166566d9575d140ce1a8e2279a105a10b57d0dd
--- 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 *, printfn, void *);
+static int	gemtext_serialize(struct parser *, FILE *);
 
 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, printfn fn, void *d)
+gemtext_serialize(struct parser *p, FILE *fp)
 {
 	struct line	*line;
 	const char	*text;
@@ -466,12 +466,12 @@ gemtext_serialize(struct parser *p, printfn fn, void *
 		case LINE_PRE_START:
 		case LINE_PRE_CONTENT:
 		case LINE_PRE_END:
-			r = fn(d, "%s%s\n", gemtext_prefixes[line->type],
+			r = fprintf(fp, "%s%s\n", gemtext_prefixes[line->type],
 			    text);
 			break;
 
 		case LINE_LINK:
-			r = fn(d, "=> %s %s\n", alt, text);
+			r = fprintf(fp, "=> %s %s\n", alt, text);
 			break;
 
 		default:
blob - 82f869d83bbba4bf267ab4c1867896e3e8565810
blob + fc8b504d4cc5d16e6d633cc0ff993a49ceb277ef
--- parser/parser_gophermap.c
+++ parser/parser_gophermap.c
@@ -36,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 *, printfn, void *);
+static int	gm_serialize(struct parser *, FILE *);
 
 void
 gophermap_initparser(struct parser *p)
@@ -222,7 +222,7 @@ gopher_skip_selector(const char *path, int *ret_type)
 }
 
 static int
-serialize_link(struct line *line, const char *text, printfn fn, void *d)
+serialize_link(struct line *line, const char *text, FILE *fp)
 {
 	size_t		 portlen = 0;
 	int		 type;
@@ -232,7 +232,7 @@ serialize_link(struct line *line, const char *text, pr
 		return -1;
 
 	if (!has_prefix(uri, "gopher://"))
-		return fn(d, "h%s\tURL:%s\terror.host\t1\n",
+		return fprintf(fp, "h%s\tURL:%s\terror.host\t1\n",
 		    text, line->alt);
 
 	uri += 9; /* skip gopher:// */
@@ -262,12 +262,12 @@ serialize_link(struct line *line, const char *text, pr
 	} else
 		path = gopher_skip_selector(path, &type);
 
-	return fn(d, "%c%s\t%s\t%.*s\t%.*s\n", type, text,
+	return fprintf(fp, "%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, printfn fn, void *d)
+gm_serialize(struct parser *p, FILE *fp)
 {
 	struct line	*line;
 	const char	*text;
@@ -279,15 +279,15 @@ gm_serialize(struct parser *p, printfn fn, void *d)
 
 		switch (line->type) {
 		case LINE_LINK:
-			r = serialize_link(line, text, fn, d);
+			r = serialize_link(line, text, fp);
 			break;
 
 		case LINE_TEXT:
-			r = fn(d, "i%s\t\terror.host\t1\n", text);
+			r = fprintf(fp, "i%s\t\terror.host\t1\n", text);
 			break;
 
 		case LINE_QUOTE:
-			r = fn(d, "3%s\t\terror.host\t1\n", text);
+			r = fprintf(fp, "3%s\t\terror.host\t1\n", text);
 			break;
 
 		default:
blob - e73a1f84635f5fd473bf049eab77975295efdacb
blob + a1810add970ff2ed7a711dd1d4b33eab2bf29231
--- telescope.c
+++ telescope.c
@@ -511,8 +511,7 @@ handle_imsg_file_opened(struct imsg *imsg, size_t data
 		int r;
 
 		if ((fp = fdopen(imsg->fd, "w")) != NULL) {
-			r = parser_serialize(current_tab, (printfn)fprintf,
-			    fp);
+			r = parser_serialize(current_tab, fp);
 			if (!r)
 				message("Failed to save the page.");
 			fclose(fp);