commit - ef1a5eb9f7f71d8d27af99f0766c5d5d9dba62f2
commit + 0fe9ac228cc8e9b9115a6b613ddbb87589335180
blob - 792a676e94ed7fc9dbe717a6bbc97d808856896f
blob + 4e45c652434cb4ffda798cc764d23dcb0fc2bf1d
--- parser.c
+++ parser.c
int
parser_parse(struct tab *tab, const char *chunk, size_t len)
{
- return tab->buffer.page.parse(&tab->buffer.page, chunk, len);
+ struct parser *p = &tab->buffer.page;
+
+ if (p->parse)
+ return p->parse(p, chunk, len);
+ return parser_foreach_line(p, chunk, len, p->parseline);
}
int
int
parser_free(struct tab *tab)
{
- int r;
- char *tilde, *slash;
+ struct parser *p = &tab->buffer.page;
+ int r = 1;
+ char *tilde, *slash;
- r = tab->buffer.page.free(&tab->buffer.page);
+ if (p->free) {
+ r = p->free(p);
+ } else if (p->len != 0) {
+ if (p->parse)
+ r = p->parse(p, p->buf, p->len);
+ else
+ r = parser_foreach_line(p, p->buf, p->len,
+ p->parseline);
+ }
- if (*tab->buffer.page.title != '\0')
+ if (*p->title != '\0')
return r;
/*
* page title, using the full domain name as fallback.
*/
if ((tilde = strstr(hist_cur(tab->hist), "/~")) != NULL) {
- strlcpy(tab->buffer.page.title, tilde+1,
- sizeof(tab->buffer.page.title));
+ strlcpy(p->title, tilde+1, sizeof(p->title));
- if ((slash = strchr(tab->buffer.page.title, '/')) != NULL)
+ if ((slash = strchr(p->title, '/')) != NULL)
*slash = '\0';
} else
- strlcpy(tab->buffer.page.title, tab->iri.iri_host,
- sizeof(tab->buffer.page.title));
+ strlcpy(p->title, tab->iri.iri_host, sizeof(p->title));
return r;
}
blob - b0d9ca3a298cb4d901692cd4e411de3f15072874
blob + bbec8913bcd5b600485f55b4caa29c553af7d851
--- parser_gemtext.c
+++ parser_gemtext.c
static int parse_pre_end(struct parser*, enum line_type, const char*, size_t);
static void search_title(struct parser*, enum line_type);
-typedef int (parselinefn)(struct parser*, enum line_type, const char*, size_t);
+typedef int (plinefn)(struct parser*, enum line_type, const char*, size_t);
-static parselinefn *parsers[] = {
+static plinefn *parsers[] = {
[LINE_TEXT] = parse_text,
[LINE_LINK] = parse_link,
[LINE_TITLE_1] = parse_title,
blob - ba333328471a966bb716d45587b30befead9bf0d
blob + 6e951cadd8be59d8108eb6c9052b287e250ad451
--- parser_gophermap.c
+++ parser_gophermap.c
static void gm_parse_selector(char *, struct gm_selector *);
-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_parse_line(struct parser *, const char *, size_t);
static int gm_serialize(struct parser *, FILE *);
void
memset(p, 0, sizeof(*p));
p->name = "gophermap";
- p->parse = &gm_parse;
- p->free = &gm_free;
+ p->parseline = &gm_parse_line;
p->serialize = &gm_serialize;
TAILQ_INIT(&p->head);
}
static int
-gm_parse(struct parser *p, const char *buf, size_t size)
-{
- return parser_foreach_line(p, buf, size, gm_foreach_line);
-}
-
-static int
selector2uri(struct gm_selector *s, char *buf, size_t len)
{
int r;
}
static int
-gm_foreach_line(struct parser *p, const char *line, size_t linelen)
+gm_parse_line(struct parser *p, const char *line, size_t linelen)
{
char buf[LINE_MAX] = {0};
struct gm_selector s = {0};
return 1;
}
-static int
-gm_free(struct parser *p)
-{
- /* flush the buffer */
- if (p->len != 0)
- gm_foreach_line(p, p->buf, p->len);
-
- free(p->buf);
-
- return 1;
-}
-
static inline const char *
gopher_skip_selector(const char *path, int *ret_type)
{
blob - 3f37bb628759061e405c7e346dc716cbb568629f
blob + 509eb9750e8073134721617555126699eb403f64
--- parser_textpatch.c
+++ parser_textpatch.c
#include "parser.h"
#include "utils.h"
-static int tpatch_parse(struct parser *, const char *, size_t);
static int tpatch_emit_line(struct parser *, const char *, size_t);
-static int tpatch_foreach_line(struct parser *, const char *, size_t);
-static int tpatch_free(struct parser *);
+static int tpatch_parse_line(struct parser *, const char *, size_t);
void
textpatch_initparser(struct parser *p)
memset(p, 0, sizeof(*p));
p->name = "text/x-patch";
- p->parse = &tpatch_parse;
- p->free = &tpatch_free;
+ p->parseline = &tpatch_parse_line;
p->flags = PARSER_IN_PATCH_HDR;
}
static int
-tpatch_parse(struct parser *p, const char *buf, size_t size)
-{
- return parser_foreach_line(p, buf, size, tpatch_foreach_line);
-}
-
-static int
tpatch_emit_line(struct parser *p, const char *line, size_t linelen)
{
struct line *l;
}
static int
-tpatch_foreach_line(struct parser *p, const char *line, size_t linelen)
+tpatch_parse_line(struct parser *p, const char *line, size_t linelen)
{
return tpatch_emit_line(p, line, linelen);
}
-
-static int
-tpatch_free(struct parser *p)
-{
- if (p->len != 0)
- return tpatch_emit_line(p, p->buf, p->len);
- return 1;
-}
blob - 5c873c362908fb136108098ac6e44f0796a1da91
blob + 5158068417703854a2dd0fd02b72d9aa20717937
--- parser_textplain.c
+++ parser_textplain.c
#include "parser.h"
-static int textplain_parse(struct parser*, const char*, size_t);
-static int textplain_foreach_line(struct parser*, const char*, size_t);
-static int textplain_free(struct parser*);
+static int textplain_parse_line(struct parser*, const char*, size_t);
static inline int
emit_line(struct parser *p, const char *line, size_t len)
memset(p, 0, sizeof(*p));
p->name = "text/plain";
- p->parse = &textplain_parse;
- p->free = &textplain_free;
+ p->parseline = &textplain_parse_line;
TAILQ_INIT(&p->head);
}
static int
-textplain_parse(struct parser *p, const char *buf, size_t size)
+textplain_parse_line(struct parser *p, const char *line, size_t linelen)
{
- return parser_foreach_line(p, buf, size, textplain_foreach_line);
-}
-
-static int
-textplain_foreach_line(struct parser *p, const char *line, size_t linelen)
-{
return emit_line(p, line, linelen);
}
-
-static int
-textplain_free(struct parser *p)
-{
- if (p->len != 0)
- return emit_line(p, p->buf, p->len);
- return 1;
-}
blob - 0f01b1ef285be3e0ee68e7890b1ba4fcc4f923ed
blob + a099c7f70b13aef4d6ea62cf11276bf5f31af07d
--- telescope.h
+++ telescope.h
typedef void (*parserinit)(struct parser *);
typedef int (*parsechunkfn)(struct parser *, const char *, size_t);
+typedef int (*parselinefn)(struct parser *, const char *, size_t);
typedef int (*parserfreefn)(struct parser *);
typedef int (*parserserial)(struct parser *, FILE *);
int flags;
parserinit init;
parsechunkfn parse;
+ parselinefn parseline;
parserfreefn free;
parserserial serialize;