commit - 288b931b133c51a6eccdbc4a25baf2aaf65273d1
commit + 0110411e1e32fa44d6e086f652dac916fc8707cf
blob - 139362e34af8b6febd80d92fbf8f87003c580b23
blob + d78c06a5d79487bdde5bcf29258b85c61328dd2f
--- include/parser.h
+++ include/parser.h
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
#include "compat.h"
#include <limits.h>
+#include <stdio.h> /* XXX: for parsers.h */
#include "cmd.h"
#include "phos.h"
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
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)
{
return;
npages--;
- tot -= EVBUFFER_LENGTH(e->evb);
+ tot -= e->buflen;
- evbuffer_free(e->evb);
+ free(e->buf);
free(e);
}
unsigned int slot;
size_t l, len;
const char *url;
+ FILE *fp;
url = tab->hist_cur->h;
l = strlen(url);
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);
ohash_insert(&h, slot, e);
npages++;
- tot += EVBUFFER_LENGTH(e->evb);
+ tot += e->buflen;
if (!evtimer_pending(&timerev, NULL))
evtimer_add(&timerev, &tv);
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;
}
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
}
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
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);
};
static int
-gemtext_serialize(struct parser *p, printfn fn, void *d)
+gemtext_serialize(struct parser *p, FILE *fp)
{
struct line *line;
const char *text;
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
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)
}
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;
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:// */
} 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;
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
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);