commit - 6cd6a9e148ca4bc65bebc03b562c9310dfc073e8
commit + a5845bb51f3d8897129c98344197970f402ec5be
blob - bc1cc431b22f066b13292a7cfc924a67f756826a
blob + 7b62291030830c86c81005aa062efe21bc7ddf73
--- gemtext.c
+++ gemtext.c
#include <stdlib.h>
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 parse_text(struct parser*, enum line_type, const char*, size_t);
static int
gemtext_parse(struct parser *p, const char *buf, size_t size)
{
- const char *b, *e;
- enum line_type t;
- size_t len, l;
+ return parser_foreach_line(p, buf, size, gemtext_foreach_line);
+}
- if (p->len == 0) {
- b = buf;
- len = size;
- } else {
- if (!parser_append(p, buf, size))
- return 0;
- b = p->buf;
- len = p->len;
- }
+static int
+gemtext_foreach_line(struct parser *p, const char *line, size_t linelen)
+{
+ enum line_type t;
- while (len > 0) {
- if ((e = memmem((char*)b, len, "\n", 1)) == NULL)
- break;
- l = e - b;
- t = detect_line_type(b, l, p->flags);
- if (t == LINE_PRE_START)
- p->flags = 1;
- if (t == LINE_PRE_END)
- p->flags = 0;
- if (!parsers[t](p, t, b, l))
- return 0;
-
- len -= l;
- b += l;
-
- if (len > 0) {
- /* skip \n */
- len--;
- b++;
- }
- }
-
- return parser_set_buf(p, b, len);
+ t = detect_line_type(line, linelen, p->flags);
+ if (t == LINE_PRE_START)
+ p->flags = 1;
+ if (t == LINE_PRE_END)
+ p->flags = 0;
+ return parsers[t](p, t, line, linelen);
}
static int
blob - ade9c602f3c464de381fafd846a050bb67e1e8b7
blob + e000a06edf698c34c0f6e2d5139a551c9af038b8
--- parser.c
+++ parser.c
p->len = len;
return 1;
}
+
+int
+parser_foreach_line(struct parser *p, const char *buf, size_t size,
+ parsechunkfn fn)
+{
+ const char *b, *e;
+ size_t l, len;
+
+ if (p->len == 0) {
+ b = buf;
+ len = size;
+ } else {
+ if (!parser_append(p, buf, size))
+ return 0;
+ b = p->buf;
+ len = p->len;
+ }
+
+ while (len > 0) {
+ if ((e = memmem((char*)b, len, "\n", 1)) == NULL)
+ break;
+ l = e - b;
+
+ if (!fn(p, b, l))
+ return 0;
+
+ len -= l;
+ b += l;
+
+ if (len > 0) {
+ /* skip \n */
+ len--;
+ b++;
+ }
+ }
+
+ return parser_set_buf(p, b, len);
+}
blob - 35a320a2ef7ff31b886ac7b7a4d9b1a163367be3
blob + 2fca8a23aff5a367b4058ead948eed9814202332
--- telescope.h
+++ telescope.h
/* parser.c */
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);
/* sandbox.c */
void sandbox_network_process(void);
blob - f1f9fe48240cb6fdb0269f94d6f97223aa7d9af4
blob + dd41f6e9abcb5c556e9c67aa3f9139967df4ace8
--- textplain.c
+++ textplain.c
#include <string.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 inline int
static int
textplain_parse(struct parser *p, const char *buf, size_t size)
{
- const char *b, *e;
- size_t len, l;
- int r;
+ return parser_foreach_line(p, buf, size, textplain_foreach_line);
+}
- if (p->len == 0) {
- b = buf;
- len = size;
- } else {
- if (!parser_append(p, buf, size))
- return 0;
- b = p->buf;
- len = p->len;
- }
-
- while (len > 0) {
- if ((e = memmem((char*)b, len, "\n", 1)) == NULL)
- break;
- l = e - b;
-
- r = emit_line(p, LINE_PRE_CONTENT, b, l);
- if (!r)
- return 0;
-
- len -= l;
- b += l;
-
- if (len > 0) {
- /* skip \n */
- len--;
- b++;
- }
- }
-
- return parser_set_buf(p, b, len);
+static int
+textplain_foreach_line(struct parser *p, const char *line, size_t linelen)
+{
+ return emit_line(p, LINE_PRE_CONTENT, line, linelen);
}
static int