summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--command.c43
1 files changed, 40 insertions, 3 deletions
diff --git a/command.c b/command.c
index e06c2a0..9341310 100644
--- a/command.c
+++ b/command.c
@@ -14,6 +14,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
+#include <assert.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -52,12 +53,48 @@ static void echoMessage(char *cmd, uint id, char *params) {
 	handle(msg);
 }
 
+static void splitMessage(char *cmd, uint id, char *params) {
+	if (!params) return;
+	// FIXME: Get USERLEN, HOSTLEN from ISUPPORT and assume worst case if
+	// self.user and self.host are unset?
+	const char *nick = self.nick;
+	const char *user = (self.user ? self.user : "*");
+	const char *host = (self.host ? self.host : "*");
+	int overhead = snprintf(
+		NULL, 0, ":%s!%s@%s %s %s :\r\n",
+		nick, user, host, cmd, idNames[id]
+	);
+	assert(overhead > 0 && overhead < 512);
+	int chunk = 512 - overhead;
+	if (strlen(params) <= (size_t)chunk) {
+		echoMessage(cmd, id, params);
+		return;
+	}
+
+	while (*params) {
+		int len = 0;
+		for (int n = 0; len + n <= chunk; len += n) {
+			n = mblen(&params[len], 1 + strlen(&params[len]));
+			if (n < 0) {
+				n = 1;
+				mblen(NULL, 0);
+			}
+			if (!n) break;
+		}
+		char ch = params[len];
+		params[len] = '\0';
+		echoMessage(cmd, id, params);
+		params[len] = ch;
+		params += len;
+	}
+}
+
 static void commandPrivmsg(uint id, char *params) {
-	echoMessage("PRIVMSG", id, params);
+	splitMessage("PRIVMSG", id, params);
 }
 
 static void commandNotice(uint id, char *params) {
-	echoMessage("NOTICE", id, params);
+	splitMessage("NOTICE", id, params);
 }
 
 static void commandMe(uint id, char *params) {
@@ -68,7 +105,7 @@ static void commandMe(uint id, char *params) {
 
 static void commandMsg(uint id, char *params) {
 	id = idFor(strsep(&params, " "));
-	echoMessage("PRIVMSG", id, params);
+	splitMessage("PRIVMSG", id, params);
 }
 
 static void commandJoin(uint id, char *params) {
:37:21 +0000'>2021-01-20Add all target to git.causal.agency MakefileJune McEnroe 2021-01-20Remove Lua supportJune McEnroe Lua support is unused and the dlsym fwrite/write hacks horrify me. Clean it up. 2021-01-20Fix tests for diff spansJune McEnroe 2021-01-20Avoid matching ':' in make tagsJune McEnroe Otherwise a :: rule includes one of the ':'s in the tag name. 2021-01-19Prefer tag matches not preceded by [[:alnum:]]June McEnroe Otherwise the "id" in "void" matches for "void id". 2021-01-19Escape \ and / in mtags search patternsJune McEnroe 2021-01-20Use mtags in source-filterJune McEnroe 2021-01-19Add mtags to generate tags for make and mdocJune McEnroe 2021-01-19Map tags to IDs using only [[:alnum:]-._]June McEnroe 2021-01-19Don't use a pager if reading standard inputJune McEnroe 2021-01-19Support BSD make syntax and match *.amJune McEnroe These don't really go together, but... 2021-01-19Match tab following escaped newline in make assignmentsJune McEnroe Otherwise it ends up going into Shell state. 2021-01-18Allow matching lexers using first input lineJune McEnroe