commit 0110411e1e32fa44d6e086f652dac916fc8707cf from: Omar Polo date: Wed Apr 13 16:51:01 2022 UTC partial revert of "abstract over evbuffers" partial revert of commit d54dd8160b88709f3d243e1410a781e5de7fc187. We don't really need an abstraction over "printf-like" things. I can just use plain old FILEs. open_memstream (which conforms to POSIX.1) is what I should have used from the beginning in my mcache implementation. 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 +#include /* 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);