Commit Diff


commit - 6cd6a9e148ca4bc65bebc03b562c9310dfc073e8
commit + a5845bb51f3d8897129c98344197970f402ec5be
blob - bc1cc431b22f066b13292a7cfc924a67f756826a
blob + 7b62291030830c86c81005aa062efe21bc7ddf73
--- gemtext.c
+++ gemtext.c
@@ -29,6 +29,7 @@
 #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);
@@ -337,43 +338,20 @@ detect_line_type(const char *buf, size_t len, int in_p
 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
@@ -59,3 +59,41 @@ parser_set_buf(struct parser *p, const char *buf, size
 	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
@@ -227,6 +227,7 @@ extern const char	*err_pages[70];
 /* 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
@@ -24,6 +24,7 @@
 #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
@@ -66,40 +67,13 @@ textplain_initparser(struct parser *p)
 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