commit d54dd8160b88709f3d243e1410a781e5de7fc187 from: Omar Polo date: Wed Apr 13 15:44:56 2022 UTC parser/serialize: abstract over evbuffers the serialize "method" will soon be used in other context where using evbuffers would be awkward. Introduce a small abstraction over it: a printfn (print function) fprintf-like. commit - 4b4957102a5af07c2ee89babbc50e646362e7af9 commit + d54dd8160b88709f3d243e1410a781e5de7fc187 blob - 372529021fd1833629b45acdab87efb6e8a76704 blob + 139362e34af8b6febd80d92fbf8f87003c580b23 --- 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 *, struct evbuffer *); +int parser_serialize(struct tab *, printfn, void *); int parser_append(struct parser*, const char*, size_t); int parser_set_buf(struct parser*, const char*, size_t); blob - 35d62cdf65eb32eb35a51fc8c3c7316463038e83 blob + a8675f3269afa1e8fa7a1e9cacee89e03d32d3be --- include/telescope.h +++ include/telescope.h @@ -142,9 +142,11 @@ struct vline { struct parser; -typedef int (*parsechunkfn)(struct parser*, const char*, size_t); -typedef int (*parserfreefn)(struct parser*); -typedef int (*parserserial)(struct parser*, struct evbuffer *); +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 void (imsg_handlerfn)(struct imsg*, size_t); blob - af63f272dbff95b1eb34769bfc0ca457370f9508 blob + fbc78d9feb5e311652163ccfd93a1bb426d87511 --- mcache.c +++ mcache.c @@ -40,6 +40,20 @@ struct mcache_entry { 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) { @@ -111,7 +125,7 @@ mcache_tab(struct tab *tab) if ((e->evb = evbuffer_new()) == NULL) goto err; - if (!parser_serialize(tab, e->evb)) + if (!parser_serialize(tab, mcache_printf, e->evb)) goto err; /* free any previously cached copies of this page */ blob - a44cdba406d715fdfc5e068f0848918ce48fb8d7 blob + e2aa82aa307850add21cdc70450324b93777be7b --- parser/parser.c +++ parser/parser.c @@ -65,21 +65,21 @@ parser_free(struct tab *tab) } int -parser_serialize(struct tab *tab, struct evbuffer *evb) +parser_serialize(struct tab *tab, printfn fn, void *d) { struct line *line; const char *text; int r; if (tab->buffer.page.serialize != NULL) - return tab->buffer.page.serialize(&tab->buffer.page, evb); + return tab->buffer.page.serialize(&tab->buffer.page, fn, d); /* a default implementation good enough for plain text */ TAILQ_FOREACH(line, &tab->buffer.page.head, lines) { if ((text = line->line) == NULL) text = ""; - r = evbuffer_add_printf(evb, "%s\n", text); + r = fn(d, "%s\n", text); if (r == -1) return 0; } blob - e23b368b5089ed079d433d6d5f8803e3f2480373 blob + a9f97874bf34707b96d70a37912a5a89b453e31c --- 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 *, struct evbuffer *); +static int gemtext_serialize(struct parser *, printfn, void *); 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, struct evbuffer *evb) +gemtext_serialize(struct parser *p, printfn fn, void *d) { struct line *line; const char *text; @@ -466,13 +466,12 @@ gemtext_serialize(struct parser *p, struct evbuffer *e case LINE_PRE_START: case LINE_PRE_CONTENT: case LINE_PRE_END: - r = evbuffer_add_printf(evb, "%s%s\n", - gemtext_prefixes[line->type], text); + r = fn(d, "%s%s\n", gemtext_prefixes[line->type], + text); break; case LINE_LINK: - r = evbuffer_add_printf(evb, "=> %s %s\n", - alt, text); + r = fn(d, "=> %s %s\n", alt, text); break; default: blob - 27a3142a5eb4ef23844d4074b1022269612c4ffa blob + 82f869d83bbba4bf267ab4c1867896e3e8565810 --- parser/parser_gophermap.c +++ parser/parser_gophermap.c @@ -23,8 +23,6 @@ #include "parser.h" #include "utils.h" -#define evap evbuffer_add_printf - struct gm_selector { char type; const char *ds; @@ -38,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 *, struct evbuffer *); +static int gm_serialize(struct parser *, printfn, void *); void gophermap_initparser(struct parser *p) @@ -224,7 +222,7 @@ gopher_skip_selector(const char *path, int *ret_type) } static int -serialize_link(struct line *line, const char *text, struct evbuffer *evb) +serialize_link(struct line *line, const char *text, printfn fn, void *d) { size_t portlen = 0; int type; @@ -234,7 +232,7 @@ serialize_link(struct line *line, const char *text, st return -1; if (!has_prefix(uri, "gopher://")) - return evap(evb, "h%s\tURL:%s\terror.host\t1\n", + return fn(d, "h%s\tURL:%s\terror.host\t1\n", text, line->alt); uri += 9; /* skip gopher:// */ @@ -264,12 +262,12 @@ serialize_link(struct line *line, const char *text, st } else path = gopher_skip_selector(path, &type); - return evap(evb, "%c%s\t%s\t%.*s\t%.*s\n", type, text, + return fn(d, "%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, struct evbuffer *evb) +gm_serialize(struct parser *p, printfn fn, void *d) { struct line *line; const char *text; @@ -281,17 +279,15 @@ gm_serialize(struct parser *p, struct evbuffer *evb) switch (line->type) { case LINE_LINK: - r = serialize_link(line, text, evb); + r = serialize_link(line, text, fn, d); break; case LINE_TEXT: - r = evap(evb, "i%s\t\terror.host\t1\n", - text); + r = fn(d, "i%s\t\terror.host\t1\n", text); break; case LINE_QUOTE: - r = evap(evb, "3%s\t\terror.host\t1\n", - text); + r = fn(d, "3%s\t\terror.host\t1\n", text); break; default: