Commit Diff


commit - 98121e1244b72c0f73e2561a90223620bc925278
commit + 8c1b0837f83e214cf4d8a02eb548a8061eaa0d0f
blob - 4f7fffa7a4dd7b311bd2586f3bbcf861af32c28a
blob + a02188b1818b4cd797962b7d3d6dafcbf3aab4f9
--- parser.c
+++ parser.c
@@ -20,7 +20,34 @@
 #include <stdlib.h>
 #include <string.h>
 
+void
+parser_init(struct tab *tab, parserfn fn)
+{
+	fn(&tab->buffer.page);
+}
+
 int
+parser_parse(struct tab *tab, const char *chunk, size_t len)
+{
+	return tab->buffer.page.parse(&tab->buffer.page, chunk, len);
+}
+
+int
+parser_free(struct tab *tab)
+{
+	int r;
+
+	r = tab->buffer.page.free(&tab->buffer.page);
+
+	/* fallback to the host as title if nothing else */
+	if (*tab->buffer.page.title == '\0')
+		strlcpy(tab->buffer.page.title, tab->uri.host,
+		    sizeof(tab->buffer.page.title));
+
+	return r;
+}
+
+int
 parser_append(struct parser *p, const char *buf, size_t len)
 {
 	size_t newlen;
blob - b5e42ce1ddf4465a8052e9cc624ea371d0b092ff
blob + 3aae3f3c34946246c5fe41a78a95593868ae45c3
--- parser.h
+++ parser.h
@@ -19,7 +19,13 @@
 
 #include "telescope.h"
 
+typedef void (*parserfn)(struct parser *);
+
 /* parser.c */
+void	 parser_init(struct tab *, parserfn);
+int	 parser_parse(struct tab *, const char *, size_t);
+int	 parser_free(struct tab *);
+
 int	 parser_append(struct parser*, const char*, size_t);
 int	 parser_set_buf(struct parser*, const char*, size_t);
 int	 parser_foreach_line(struct parser*, const char*, size_t, parsechunkfn);
blob - 055cff3c8ba8ba82baab7436ea7a428f04ff0846
blob + f306afe0be611e79be075c677169b2d50d181fdc
--- telescope.c
+++ telescope.c
@@ -460,8 +460,7 @@ handle_imsg_buf(struct imsg *imsg, size_t datalen)
 
 	tab->bytes += datalen;
 	if (tab->fd == -1) {
-		if (!tab->buffer.page.parse(&tab->buffer.page,
-		    imsg->data, datalen))
+		if (!parser_parse(tab, imsg->data, datalen))
 			die();
 	} else {
 		write(tab->fd, imsg->data, datalen);
@@ -489,7 +488,7 @@ handle_imsg_eof(struct imsg *imsg, size_t datalen)
 		return;
 
 	if (tab->fd == -1) {
-		if (!tab->buffer.page.free(&tab->buffer.page))
+		if (!parser_free(tab))
 			die();
 	} else {
 		fmt_scaled(tab->bytes, buf);
@@ -565,7 +564,7 @@ static void
 load_page_from_str(struct tab *tab, const char *page)
 {
 	erase_buffer(&tab->buffer);
-	gemtext_initparser(&tab->buffer.page);
+	parser_init(tab, gemtext_initparser);
 	if (!tab->buffer.page.parse(&tab->buffer.page, page, strlen(page)))
 		die();
 	if (!tab->buffer.page.free(&tab->buffer.page))
@@ -579,7 +578,7 @@ load_about_url(struct tab *tab, const char *url)
 {
 	tab->trust = TS_VERIFIED;
 
-	gemtext_initparser(&tab->buffer.page);
+	parser_init(tab, gemtext_initparser);
 
 	ui_send_fs(IMSG_GET, tab->id,
 	    tab->hist_cur->h, strlen(tab->hist_cur->h)+1);
@@ -617,7 +616,7 @@ load_finger_url(struct tab *tab, const char *url)
 	}
 	strlcat(req.req, "\r\n", sizeof(req.req));
 
-	textplain_initparser(&tab->buffer.page);
+	parser_init(tab, textplain_initparser);
 	make_request(tab, &req, PROTO_FINGER, NULL);
 }
 
@@ -646,13 +645,13 @@ load_gopher_url(struct tab *tab, const char *url)
 	path = tab->uri.path;
 	if (!strcmp(path, "/") || *path == '\0') {
 		/* expect the top directory to be a gophermap */
-		gophermap_initparser(&tab->buffer.page);
+		parser_init(tab, gophermap_initparser);
 	} else if (has_prefix(path, "/1/")) {
 		/* gophermap menu/submenu */
-		gophermap_initparser(&tab->buffer.page);
+		parser_init(tab, gophermap_initparser);
 		path += 2;
 	} else if (has_prefix(path, "/0/")) {
-		textplain_initparser(&tab->buffer.page);
+		parser_init(tab, textplain_initparser);
 		path += 2;
 	} else {
 		return;