summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-11-13 16:49:07 -0500
committerJune McEnroe <june@causal.agency>2019-11-13 16:49:07 -0500
commitdb3433432b4960da2c24a0a4be2336497c1c21fa (patch)
tree461d4f885c17b80b9801bd4b4cd16633ac7b6d72
parentFactor out wordcpy for filters (diff)
downloadpounce-db3433432b4960da2c24a0a4be2336497c1c21fa.tar.gz
pounce-db3433432b4960da2c24a0a4be2336497c1c21fa.zip
Refactor filterUserhostInNames
-rw-r--r--client.c49
1 files changed, 25 insertions, 24 deletions
diff --git a/client.c b/client.c
index 9ffa95f..0e94ad4 100644
--- a/client.c
+++ b/client.c
@@ -277,15 +277,30 @@ size_t clientDiff(const struct Client *client) {
 
 typedef const char *Filter(const char *line);
 
+static int strncmpn(const char *a, size_t alen, const char *b, size_t blen) {
+	return alen == blen
+		? memcmp(a, b, alen)
+		: alen - blen;
+}
+
+static size_t strlcpyn(char *dst, size_t cap, const char *src, size_t len) {
+	if (len < cap) {
+		memcpy(dst, src, len);
+		dst[len] = '\0';
+	} else {
+		memcpy(dst, src, cap - 1);
+		dst[cap - 1] = '\0';
+	}
+	return len;
+}
+
 static int wordcmp(const char *line, size_t i, const char *word) {
 	while (i--) {
 		line += strcspn(line, " ");
 		if (*line) line++;
 	}
 	size_t len = strcspn(line, " ");
-	return len == strlen(word)
-		? memcmp(line, word, len)
-		: len - strlen(word);
+	return strncmpn(line, len, word, strlen(word));
 }
 
 static size_t wordcpy(char *dst, size_t cap, const char *src, size_t count) {
@@ -294,14 +309,7 @@ static size_t wordcpy(char *dst, size_t cap, const char *src, size_t count) {
 		if (src[len] == ' ') len++;
 		len += strcspn(&src[len], " ");
 	}
-	if (len < cap) {
-		memcpy(dst, src, len);
-		dst[len] = '\0';
-	} else {
-		memcpy(dst, src, cap - 1);
-		dst[cap - 1] = '\0';
-	}
-	return len;
+	return strlcpyn(dst, cap, src, len);
 }
 
 static const char *filterAccountNotify(const char *line) {
@@ -331,23 +339,16 @@ static const char *filterInviteNotify(const char *line) {
 static const char *filterUserhostInNames(const char *line) {
 	if (wordcmp(line, 1, "353")) return line;
 	static char buf[512];
-	if (strlen(line) >= sizeof(buf)) return NULL;
-	size_t len = 0;
-	for (int i = 0; i < 5; ++i) {
-		len += strcspn(&line[len], " ");
-		if (line[len]) len++;
-	}
-	memcpy(buf, line, len);
+	size_t len = wordcpy(buf, sizeof(buf), line, 5);
+	if (len >= sizeof(buf)) return NULL;
 	line += len;
-	char *ptr = &buf[len];
 	while (*line) {
-		len = strcspn(line, "!");
-		memcpy(ptr, line, len);
-		ptr += len;
-		line += len;
+		size_t nick = strcspn(line, "!");
+		len += strlcpyn(&buf[len], sizeof(buf) - len, line, nick);
+		if (len >= sizeof(buf)) return NULL;
+		line += nick;
 		line += strcspn(line, " ");
 	}
-	*ptr = '\0';
 	return buf;
 }