commit - 98121e1244b72c0f73e2561a90223620bc925278
commit + 8c1b0837f83e214cf4d8a02eb548a8061eaa0d0f
blob - 4f7fffa7a4dd7b311bd2586f3bbcf861af32c28a
blob + a02188b1818b4cd797962b7d3d6dafcbf3aab4f9
--- parser.c
+++ parser.c
#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
#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
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);
return;
if (tab->fd == -1) {
- if (!tab->buffer.page.free(&tab->buffer.page))
+ if (!parser_free(tab))
die();
} else {
fmt_scaled(tab->bytes, buf);
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))
{
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);
}
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);
}
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;