summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--buf.c8
-rw-r--r--buf.h3
-rw-r--r--doc.c5
-rw-r--r--doc.h2
-rw-r--r--net.c4
-rw-r--r--parse.c11
6 files changed, 17 insertions, 16 deletions
diff --git a/buf.c b/buf.c
index fb3af82..5575bbd 100644
--- a/buf.c
+++ b/buf.c
@@ -25,10 +25,10 @@ void buf_grow(buf_t *b, size_t n) {
 	}
 }
 
-void buf_cat(buf_t *b, const char *src, size_t n) {
-	buf_grow(b, n);
-	memcpy(&b->buf[b->sz], src, n);
-	b->sz += n;
+void buf_cat(buf_t *b, strv_t s) {
+	buf_grow(b, s.n);
+	memcpy(&b->buf[b->sz], s.s, s.n);
+	b->sz += s.n;
 }
 
 void buf_catc(buf_t *b, char c) {
diff --git a/buf.h b/buf.h
index 59c521b..e7fb6b7 100644
--- a/buf.h
+++ b/buf.h
@@ -2,6 +2,7 @@
 #define BUF_H
 
 #include <stddef.h>
+#include "strv.h"
 
 typedef struct buf {
 	size_t sz, cap;
@@ -12,7 +13,7 @@ void buf_init(buf_t *, size_t);
 void buf_grow(buf_t *, size_t);
 void buf_free(buf_t *);
 
-void buf_cat(buf_t *b, const char *src, size_t n);
+void buf_cat(buf_t *b, strv_t s);
 void buf_catc(buf_t *b, char c);
 
 #endif
diff --git a/doc.c b/doc.c
index d43ff30..aa18369 100644
--- a/doc.c
+++ b/doc.c
@@ -51,8 +51,9 @@ void doc_add_text(struct doc *d, strv_t s) {
 	dl->len += s.n;
 }
 
-unsigned short doc_add_link(struct doc *d, const char *url) {
-	buf_cat(&d->lnk, url, strlen(url) + 1);
+unsigned short doc_add_link(struct doc *d, strv_t url) {
+	buf_cat(&d->lnk, url);
+	buf_catc(&d->lnk, 0);
 	return d->linkc++;
 }
 
diff --git a/doc.h b/doc.h
index a0b1031..2a9fe58 100644
--- a/doc.h
+++ b/doc.h
@@ -40,6 +40,6 @@ int doc_line_next(struct doc *d, size_t *ofs);
 const char *doc_get_link(struct doc *d, unsigned short lnk);
 
 void doc_set_link(struct doc *d, unsigned short lnk);
-unsigned short doc_add_link(struct doc *d, const char *url);
+unsigned short doc_add_link(struct doc *d, strv_t url);
 
 #endif
diff --git a/net.c b/net.c
index b3f0655..0d6604e 100644
--- a/net.c
+++ b/net.c
@@ -132,7 +132,7 @@ static int fetch_file(const struct addr *adr, struct buf *buf, enum doc_type *do
 	buf_init(buf, 1024);
 	char b[256];
 	while (fgets(b, sizeof b, f)) {
-		buf_cat(buf, b, strlen(b));
+		buf_cat(buf, strv(b));
 	}
 	buf_catc(buf, 0);
 	fclose(f);
@@ -184,7 +184,7 @@ static int fetch_gopher(const struct addr *adr, struct buf *buf, enum doc_type *
 			return -1;
 		}
 		if (!n) break;
-		buf_cat(buf, inbuf, n);
+		buf_cat(buf, (strv_t) { inbuf, n });
 	}
 	close(s);
 	return 0;
diff --git a/parse.c b/parse.c
index b62ea8a..df416ac 100644
--- a/parse.c
+++ b/parse.c
@@ -10,16 +10,16 @@ int isurlch(char c) {
 }
 
 void parse_plain_url(struct doc *d, struct doc_line *l, size_t i) {
-	char url[l->len + 1];
 	size_t start = i - 1;
 	while (start > 0 && isalpha(l->txt[start])) start--;
 	if (!isalpha(l->txt[start])) start++;
 	size_t end = i + 3;
 	while (end < l->len && isurlch(l->txt[end])) end++;
 	if (end == i + 3) return;
-	size_t urln = end - start;
-	memcpy(url, &l->txt[start], urln);
-	url[urln] = 0;
+	strv_t url = {
+		&l->txt[start],
+		end - start
+	};
 	l->link = doc_add_link(d, url);
 }
 
@@ -75,8 +75,7 @@ int parse_gophermap_line(struct doc *d, strv_t ln) {
 		if (urln < sizeof url) url[urln++] = '/';
 		if (urln < sizeof url) url[urln++] = bits.item_type;
 		urln = scatss(url, urln, sizeof url, bits.sel);
-		url[urln] = 0;
-		doc_set_link(d, doc_add_link(d, url));
+		doc_set_link(d, doc_add_link(d, (strv_t) { url, urln }));
 	case 'i':
 		doc_add_text(d, bits.dstr);
 		doc_new_line(d);