summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-06-24 13:36:24 -0400
committerJune McEnroe <june@causal.agency>2020-06-24 13:36:24 -0400
commit94fb9798c5476a9a3111f3982f357920b18c2fd0 (patch)
tree7f115ff5bd80a4190081fe02df80f209b950ad27
parentColor mentions up to first ": " rather than just ":" (diff)
downloadcatgirl-94fb9798c5476a9a3111f3982f357920b18c2fd0.tar.gz
catgirl-94fb9798c5476a9a3111f3982f357920b18c2fd0.zip
Bump ParamCap to 254
Apparently IRCds have decided that the 15-parameter limit doesn't matter
anymore. 254 is the maximum number of single-byte parameters (following
a single-byte command) which fit in a 512-byte CR-LF-terminated line.
When everyone decides that the 512-byte line length limit doesn't matter
either, I will delete my software and people can use some JavaScript
garbage instead.

This makes struct Message 2080 bytes, but there's only ever one or two
of them around at once. Avoid passing it by value to handle.
-rw-r--r--chat.c2
-rw-r--r--chat.h4
-rw-r--r--command.c6
-rw-r--r--handle.c16
-rw-r--r--irc.c3
5 files changed, 15 insertions, 16 deletions
diff --git a/chat.c b/chat.c
index 913ce78..962de28 100644
--- a/chat.c
+++ b/chat.c
@@ -337,7 +337,7 @@ int main(int argc, char *argv[]) {
 		.cmd = "QUIT",
 		.params[0] = self.quit,
 	};
-	handle(msg);
+	handle(&msg);
 
 	ircClose();
 	logClose();
diff --git a/chat.h b/chat.h
index 817c381..bb5bec8 100644
--- a/chat.h
+++ b/chat.h
@@ -155,7 +155,7 @@ enum Tag {
 	TagCap,
 };
 
-enum { ParamCap = 15 };
+enum { ParamCap = 254 };
 struct Message {
 	char *tags[TagCap];
 	char *nick;
@@ -204,7 +204,7 @@ extern struct Replies {
 	uint whois;
 } replies;
 
-void handle(struct Message msg);
+void handle(struct Message *msg);
 void command(uint id, char *input);
 const char *commandIsPrivmsg(uint id, const char *input);
 const char *commandIsNotice(uint id, const char *input);
diff --git a/command.c b/command.c
index 90732f3..ac83f3f 100644
--- a/command.c
+++ b/command.c
@@ -61,7 +61,7 @@ static void echoMessage(char *cmd, uint id, char *params) {
 		.params[0] = idNames[id],
 		.params[1] = params,
 	};
-	handle(msg);
+	handle(&msg);
 }
 
 static void splitMessage(char *cmd, uint id, char *params) {
@@ -213,9 +213,7 @@ static void channelListMode(uint id, char pm, char l, const char *params) {
 	for (const char *ch = params; *ch; ++ch) {
 		if (*ch == ' ') count++;
 	}
-	char modes[ParamCap - 2 + 1] = {
-		l, l, l, l, l, l, l, l, l, l, l, l, l, '\0'
-	};
+	char modes[13 + 1] = { l, l, l, l, l, l, l, l, l, l, l, l, l, '\0' };
 	ircFormat("MODE %s %c%.*s %s\r\n", idNames[id], pm, count, modes, params);
 }
 
diff --git a/handle.c b/handle.c
index 422cd76..4383cb0 100644
--- a/handle.c
+++ b/handle.c
@@ -1228,17 +1228,17 @@ static int compar(const void *cmd, const void *_handler) {
 	return strcmp(cmd, handler->cmd);
 }
 
-void handle(struct Message msg) {
-	if (!msg.cmd) return;
-	if (msg.tags[TagPos]) {
-		self.pos = strtoull(msg.tags[TagPos], NULL, 10);
+void handle(struct Message *msg) {
+	if (!msg->cmd) return;
+	if (msg->tags[TagPos]) {
+		self.pos = strtoull(msg->tags[TagPos], NULL, 10);
 	}
 	const struct Handler *handler = bsearch(
-		msg.cmd, Handlers, ARRAY_LEN(Handlers), sizeof(*handler), compar
+		msg->cmd, Handlers, ARRAY_LEN(Handlers), sizeof(*handler), compar
 	);
 	if (handler) {
-		handler->fn(&msg);
-	} else if (strcmp(msg.cmd, "400") >= 0 && strcmp(msg.cmd, "599") <= 0) {
-		handleErrorGeneric(&msg);
+		handler->fn(msg);
+	} else if (strcmp(msg->cmd, "400") >= 0 && strcmp(msg->cmd, "599") <= 0) {
+		handleErrorGeneric(msg);
 	}
 }
diff --git a/irc.c b/irc.c
index 5743d1e..dce1358 100644
--- a/irc.c
+++ b/irc.c
@@ -279,7 +279,8 @@ void ircRecv(void) {
 		if (!crlf) break;
 		*crlf = '\0';
 		debug(">>", line);
-		handle(parse(line));
+		struct Message msg = parse(line);
+		handle(&msg);
 		line = crlf + 2;
 	}