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) {
2019-02-18Match Tag in RustJune McEnroe 2019-02-18Match sh functions as TagJune McEnroe 2019-02-18Match Sh and Ss as Tag in mdocJune McEnroe 2019-02-18Match statics and typedefs as TagJune McEnroe 2019-02-18Clean up htmlHeaderJune McEnroe 2019-02-18Remove hi line numberingJune McEnroe Tags are much better for referring to specific parts of a file and line numbering is better done by a post-processing tool such as cat -n or producing a two-column HTML <table>. 2019-02-18Add Tag class to hiJune McEnroe 2019-02-17Generate HTML with hi -n -f html -o anchorJune McEnroe Running hi twice to insert stuff between the head and the content is a bit of a hack but oh well. 2019-02-17Add hi -f html -o anchor for line number linksJune McEnroe 2019-02-17Simplify temp trap in upJune McEnroe 2019-02-17Add line numbers to hiJune McEnroe Renames previous -n option to -m to stay consistent with cat -n. Prefixing lines with line numbers affects where the first tab indent ends up relative to the text above it. Not sure if it's worth fixing somehow. 2019-02-17Always split spans after newlinesJune McEnroe Simplifies ANSI and IRC output code, and prepares for line numbered output. 2019-02-15Color format specifiers light cyan in vimJune McEnroe 2019-02-15Highlight Interp as yellowJune McEnroe 2019-02-15Highlight strings in sh command substitutionsJune McEnroe 2019-02-15Add nmap gpJune McEnroe 2019-02-14Avoid newline when copying URL to pasteboardJune McEnroe 2019-02-13Add forgotten "sixth" book of H2G2June McEnroe