commit 8c1b0837f83e214cf4d8a02eb548a8061eaa0d0f from: Omar Polo date: Sun Jul 25 19:12:00 2021 UTC simplify parsers api; use domain name if no title commit - 98121e1244b72c0f73e2561a90223620bc925278 commit + 8c1b0837f83e214cf4d8a02eb548a8061eaa0d0f blob - 4f7fffa7a4dd7b311bd2586f3bbcf861af32c28a blob + a02188b1818b4cd797962b7d3d6dafcbf3aab4f9 --- parser.c +++ parser.c @@ -20,7 +20,34 @@ #include #include +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;